Mercurial > hg > Applications > virsh-wrapper
annotate ie-virsh.c @ 5:9ecd833b9570
filtering worked.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 13 Nov 2012 07:59:17 +0900 |
parents | 349bbbd3fbd5 |
children | 25c14d1144a8 |
rev | line source |
---|---|
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 #include <stdlib.h> |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 #include <unistd.h> |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 #include <stdio.h> |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 #include <sys/types.h> |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 #include <unistd.h> |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 #include <signal.h> |
2 | 10 #include <string.h> |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 |
2 | 12 #include <sys/types.h> |
1 | 13 #include <regex.h> |
14 | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 /******************************************** |
2 | 16 * Virsh Wrapper - Secure Yourself * |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 * * |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 * 2007 - Mike Golvach - eggi@comcast.net * |
2 | 19 * 2012 - Shinji KONO kono@ie.u-rykyu.ac.jp * |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 * * |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 * Usage: COMMAND [start|stop] * |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 * * |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 ********************************************/ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 /* Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 |
2 | 27 #define command "/usr/bin/virsh" |
28 #define list_command "/usr/bin/virsh list --all" | |
29 #define start_command "start" | |
3 | 30 #define stop_command "destroy" |
4
349bbbd3fbd5
added dumpxml command
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
31 #define dumpxml_command "dumpxml" |
1 | 32 |
33 #define VMNAME_MAX (512) | |
34 | |
35 typedef struct vmlist { | |
36 char name[VMNAME_MAX]; | |
37 struct vmlist *next; | |
38 } VMLIST, *VMLISTPTR; | |
39 | |
40 #define NEW(type) ((type*)malloc(sizeof(type))) | |
41 | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 /* Define global variables */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 |
1 | 44 |
45 | |
46 VMLISTPTR | |
47 get_vmlist(regex_t *list_pattern) | |
48 { | |
49 VMLISTPTR list = NEW(VMLIST); | |
50 VMLISTPTR p = list ; | |
51 p->name[0] = 0; | |
52 p->next = 0; | |
53 FILE *fp = popen(list_command,"r"); | |
54 while(fgets(p->name,VMNAME_MAX,fp)!=NULL) { | |
55 if (regexec(list_pattern, p->name, (size_t) 0, NULL, 0)) continue; | |
56 p->next = NEW(VMLIST); | |
57 p = p->next; | |
58 } | |
59 p->name[0] = 0; | |
60 pclose(fp); | |
61 return list; | |
62 } | |
63 | |
64 void | |
65 print_vmlist(VMLISTPTR list) | |
66 { | |
67 for(;list && list->name[0]; list=list->next) { | |
68 fprintf(stdout, " %s\n",list->name); | |
69 } | |
70 } | |
71 | |
72 int | |
73 check_vmlist_name(VMLISTPTR list, char *arg) | |
74 { | |
75 for(;list && list->name[0]; list=list->next) { | |
5 | 76 if (strstr(list->name,arg)!=0) return 1; |
1 | 77 } |
78 return 0; | |
79 } | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 |
3 | 81 void |
82 usage() | |
83 { | |
5 | 84 printf("Usage: COMMAND [list|start|destroy|xmldump] [vm-name]\n"); |
3 | 85 } |
86 | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
87 /* main(int argc, char **argv) - main process loop */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 int main(int argc, char **argv) |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
90 { |
1 | 91 int gid; |
92 int uid; | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 /* Set euid and egid to actual user */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
95 |
1 | 96 char *name = getlogin(); |
97 uid = getuid(); | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
98 gid = getgid(); |
1 | 99 printf("uid %d gid %d name %s\n", uid,gid,name); |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
100 setegid(getgid()); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
101 seteuid(getuid()); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
102 |
1 | 103 regex_t *pattern = NEW(regex_t); |
2 | 104 if (regcomp(pattern, name, 0) != 0) { |
1 | 105 exit(0); |
106 } | |
107 | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
108 /* Confirm user is in GROUP(999) group */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
109 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
110 /* |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
111 if ( gid != 999 ) { |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
112 printf("User Not Authorized! Exiting...\n"); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
113 exit(1); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
114 } |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
115 */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
116 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
117 /* Set uid, gid, euid and egid to root */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
118 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
119 setegid(0); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
120 seteuid(0); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
121 setgid(0); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
122 setuid(0); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
123 |
1 | 124 VMLISTPTR vmlist = get_vmlist(pattern); |
125 | |
5 | 126 if (argc>=3) { |
127 if (check_vmlist_name(vmlist, argv[2])==0) { | |
1 | 128 fprintf(stderr, "bad vmname\n"); |
129 print_vmlist(vmlist); | |
130 exit(0); | |
131 } | |
3 | 132 } else if (argc<2) { |
5 | 133 print_vmlist(vmlist); |
3 | 134 usage(); |
135 exit(0); | |
1 | 136 } |
137 | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 /* Check argv for proper arguments and run |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 * the corresponding script, if invoked. |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141 |
3 | 142 if ( argv[1]==0 || strncmp(argv[1], "list", 4) == 0 ) { |
1 | 143 print_vmlist(vmlist); |
144 } else if ( strncmp(argv[1], "start", 5) == 0 ) { | |
145 if (execl(command, command, start_command, argv[2], NULL) < 0) { | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
146 perror("Execl:"); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
147 } |
5 | 148 } else if ( strncmp(argv[1], "destroy", 4) == 0 ) { |
1 | 149 if (execl(command, command, stop_command, argv[2], NULL) < 0) { |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
150 perror("Execl:"); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
151 } |
4
349bbbd3fbd5
added dumpxml command
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
152 } else if ( strncmp(argv[1], "dumpxml", 7) == 0 ) { |
349bbbd3fbd5
added dumpxml command
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
153 if (execl(command, command, dumpxml_command, argv[2], NULL) < 0) { |
349bbbd3fbd5
added dumpxml command
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
154 perror("Execl:"); |
349bbbd3fbd5
added dumpxml command
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
155 } |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
156 } else { |
3 | 157 usage(); |
158 exit(1); | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
159 } |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
160 exit(0); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
161 } |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
162 |
1 | 163 /* end */ |