Mercurial > hg > Applications > virsh-wrapper
annotate ie-virsh.c @ 9:ea51e779b381
error message
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 13 Nov 2012 16:35:34 +0900 |
parents | bff4054ed58f |
children | 422041acef4c |
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" |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
31 #define define_command "define" |
9 | 32 #define undefine_command "undefine" |
4
349bbbd3fbd5
added dumpxml command
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
33 #define dumpxml_command "dumpxml" |
1 | 34 |
9 | 35 static char bad_name[] = "Bad vmname. Try students/e11/e115711/01 or teachers/kono/02\n"; |
36 | |
1 | 37 #define VMNAME_MAX (512) |
38 | |
39 typedef struct vmlist { | |
40 char name[VMNAME_MAX]; | |
41 struct vmlist *next; | |
42 } VMLIST, *VMLISTPTR; | |
43 | |
44 #define NEW(type) ((type*)malloc(sizeof(type))) | |
45 | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 /* Define global variables */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 |
1 | 48 VMLISTPTR |
49 get_vmlist(regex_t *list_pattern) | |
50 { | |
51 VMLISTPTR list = NEW(VMLIST); | |
52 VMLISTPTR p = list ; | |
53 p->name[0] = 0; | |
54 p->next = 0; | |
55 FILE *fp = popen(list_command,"r"); | |
56 while(fgets(p->name,VMNAME_MAX,fp)!=NULL) { | |
57 if (regexec(list_pattern, p->name, (size_t) 0, NULL, 0)) continue; | |
58 p->next = NEW(VMLIST); | |
59 p = p->next; | |
60 } | |
61 p->name[0] = 0; | |
62 pclose(fp); | |
63 return list; | |
64 } | |
65 | |
66 void | |
67 print_vmlist(VMLISTPTR list) | |
68 { | |
69 for(;list && list->name[0]; list=list->next) { | |
70 fprintf(stdout, " %s\n",list->name); | |
71 } | |
72 } | |
73 | |
74 int | |
75 check_vmlist_name(VMLISTPTR list, char *arg) | |
76 { | |
77 for(;list && list->name[0]; list=list->next) { | |
5 | 78 if (strstr(list->name,arg)!=0) return 1; |
1 | 79 } |
80 return 0; | |
81 } | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
82 |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
83 int |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
84 check_name(const char *p) |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
85 { |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
86 if (!p) return 1; |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
87 for(;*p;p++) { |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
88 char c = *p; |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
89 if (c<=' ') return 1; |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
90 if (('a'<=c && c<='z') || |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
91 ('0'<=c && c<='9') || |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
92 ('/'==c ) || |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
93 ('-'==c )) continue; |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
94 return 1; |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
95 } |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
96 return 0; |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
97 } |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
98 |
3 | 99 void |
100 usage() | |
101 { | |
9 | 102 printf("Usage: COMMAND [define|list|start|destroy|xmldump|undefine] [vm-name]\n"); |
103 printf(" vm-name should be students/e11/e115711/01 or teachers/kono/02\n"); | |
3 | 104 } |
105 | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
106 /* main(int argc, char **argv) - main process loop */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
107 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
108 int main(int argc, char **argv) |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
109 { |
1 | 110 int gid; |
111 int uid; | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
112 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
113 /* Set euid and egid to actual user */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
114 |
1 | 115 char *name = getlogin(); |
116 uid = getuid(); | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
117 gid = getgid(); |
1 | 118 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
|
119 setegid(getgid()); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
120 seteuid(getuid()); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
121 |
1 | 122 regex_t *pattern = NEW(regex_t); |
2 | 123 if (regcomp(pattern, name, 0) != 0) { |
1 | 124 exit(0); |
125 } | |
126 | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
127 /* Confirm user is in GROUP(999) group */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
128 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129 /* |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 if ( gid != 999 ) { |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131 printf("User Not Authorized! Exiting...\n"); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132 exit(1); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133 } |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134 */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
136 /* Set uid, gid, euid and egid to root */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137 |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 setegid(0); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 seteuid(0); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 setgid(0); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141 setuid(0); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
142 |
7 | 143 |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
144 if (argc>=3) { |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
145 if ( strncmp(argv[1], "define", 6) == 0 ) { |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
146 if (regexec(pattern, argv[2], (size_t) 0, NULL, 0)) { |
9 | 147 fprintf(stderr, bad_name); |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
148 exit(0); |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
149 } |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
150 if (check_name(argv[2])) { |
9 | 151 fprintf(stderr, bad_name); |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
152 exit(0); |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
153 } |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
154 char exec[1024]; |
7 | 155 strncpy(exec, "/usr/local/bin/newvm.py -c /etc/libvirt/qemu/fedora16.xml -n ",900); |
156 strncat(exec, argv[2],1000); | |
157 fprintf(stdout, "excuting %s\n",exec ); | |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
158 system(exec); |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
159 } |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
160 } |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
161 |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
162 |
1 | 163 VMLISTPTR vmlist = get_vmlist(pattern); |
164 | |
7 | 165 char name_xml[1024]; |
166 name_xml[0] = 0; | |
5 | 167 if (argc>=3) { |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
168 if ( strncmp(argv[1], "define", 6) == 0 ) { |
7 | 169 strncpy(name_xml,argv[2],900); |
170 strncat(name_xml,".xml",1000); | |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
171 } else if (check_vmlist_name(vmlist, argv[2])==0) { |
9 | 172 fprintf(stderr, bad_name); |
1 | 173 print_vmlist(vmlist); |
174 exit(0); | |
175 } | |
3 | 176 } else if (argc<2) { |
5 | 177 print_vmlist(vmlist); |
3 | 178 usage(); |
179 exit(0); | |
1 | 180 } |
181 | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
182 /* Check argv for proper arguments and run |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
183 * the corresponding script, if invoked. |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
184 */ |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
185 |
3 | 186 if ( argv[1]==0 || strncmp(argv[1], "list", 4) == 0 ) { |
1 | 187 print_vmlist(vmlist); |
188 } else if ( strncmp(argv[1], "start", 5) == 0 ) { | |
189 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
|
190 perror("Execl:"); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
191 } |
5 | 192 } else if ( strncmp(argv[1], "destroy", 4) == 0 ) { |
1 | 193 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
|
194 perror("Execl:"); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
195 } |
4
349bbbd3fbd5
added dumpxml command
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
196 } 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
|
197 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
|
198 perror("Execl:"); |
349bbbd3fbd5
added dumpxml command
Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
199 } |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
200 } else if ( strncmp(argv[1], "define", 6) == 0 ) { |
7 | 201 chdir("/etc/libvirt/qemu"); |
202 if (execl(command, command, define_command, name_xml, NULL) < 0) { | |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
203 perror("Execl:"); |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
5
diff
changeset
|
204 } |
9 | 205 } else if ( strncmp(argv[1], "undefine", 8) == 0 ) { |
206 chdir("/etc/libvirt/qemu"); | |
207 if (execl(command, command, undefine_command, argv[2], NULL) < 0) { | |
208 perror("Execl:"); | |
209 } | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
210 } else { |
3 | 211 usage(); |
212 exit(1); | |
0
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
213 } |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
214 exit(0); |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
215 } |
7785dd06c62f
Virsh Wrapper initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
216 |
1 | 217 /* end */ |