# HG changeset patch # User taiki # Date 1405284354 36000 # Node ID ca114837b2f49b80ff2decfc1678eb313e60ff47 add docker file diff -r 000000000000 -r ca114837b2f4 ie-docker.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ie-docker.c Sun Jul 13 10:45:54 2014 -1000 @@ -0,0 +1,214 @@ + + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +/* Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License */ + +#define command "/usr/bin/docker" +/* #define list_command "/usr/bin/virsh list --all" */ +#define process_command "/usr/bin/docker ps" +#define run_command "run" +#define stop_command "destroy" +#define define_command "define" +#define undefine_command "undefine" +#define dumpxml_command "dumpxml" +#define console_command "console" + +static char bad_name[] = "Bad process name. Try students/e11/e115711/01 or teachers/kono/02\n"; + +#define PSNAME_MAX (512) + +typedef struct processlist { + char name[PSNAME_MAX]; + struct pslist *next; +} PSLIST, *PSLISTPTR; + +#define NEW(type) ((type*)malloc(sizeof(type))) + +/* Define global variables */ + +PSLISTPTR +get_pslist(regex_t *list_pattern) +{ + PSLISTPTR list = NEW(PSLIST); + PSLISTPTR p = list ; + p->name[0] = 0; + p->next = 0; + FILE *fp = popen(list_command,"r"); + while(fgets(p->name,PSNAME_MAX,fp)!=NULL) { + if (regexec(list_pattern, p->name, (size_t) 0, NULL, 0)) continue; + p->next = NEW(PSLIST); + p = p->next; + } + p->name[0] = 0; + pclose(fp); + return list; +} + +void +print_pslist(PSLISTPTR list) +{ + for(;list && list->name[0]; list=list->next) { + fprintf(stdout, " %s\n",list->name); + } +} + +int +check_pslist_name(PSLISTPTR list, char *arg) +{ + for(;list && list->name[0]; list=list->next) { + if (strstr(list->name,arg)!=0) return 1; + } + return 0; +} + +int +check_name(const char *p) +{ + if (!p) return 1; + for(;*p;p++) { + char c = *p; + if (c<=' ') return 1; + if (('a'<=c && c<='z') || + ('0'<=c && c<='9') || + ('/'==c ) || + ('-'==c )) continue; + return 1; + printf("%c", c); + } + return 0; +} + +void +usage() +{ + printf("Usage: COMMAND [define|list|start|destroy|xmldump|undefine|console] [ps-name]\n"); + printf(" ps-name should be students/e11/e115711/01 or teachers/kono/02\n"); +} + +/* main(int argc, char **argv) - main process loop */ + +int main(int argc, char **argv) +{ + int gid; + int uid; + + /* Set euid and egid to actual user */ + + char *name = getlogin(); + uid = getuid(); + gid = getgid(); + printf("uid %d gid %d name %s\n", uid,gid,name); + setegid(getgid()); + seteuid(getuid()); + + regex_t *pattern = NEW(regex_t); + if (regcomp(pattern, name, 0) != 0) { + exit(0); + } + + /* Confirm user is in GROUP(999) group */ + + /* + if ( gid != 999 ) { + printf("User Not Authorized! Exiting...\n"); + exit(1); + } + */ + + /* Set uid, gid, euid and egid to root */ + + setegid(0); + seteuid(0); + setgid(0); + setuid(0); + + if (argc>=3) { + if ( strncmp(argv[1], "define", 6) == 0 ) { + if (regexec(pattern, argv[2], (size_t) 0, NULL, 0)) { + fprintf(stderr, bad_name); + exit(0); + } + if (check_name(argv[2])) { + fprintf(stderr, bad_name); + exit(0); + } + char exec[1024]; + // strncpy(exec, "/usr/local/bin/newps.py -c /etc/libvirt/qemu/fedora16.xml -n ",900); + strncpy(exec, "/usr/local/bin/newps.py -c /etc/libvirt/qemu/fedora19.xml -n ",900); + strncat(exec, argv[2],1000); + fprintf(stdout, "excuting %s\n",exec ); + system(exec); + } + } + + + PSLISTPTR pslist = get_pslist(pattern); + + char name_xml[1024]; + name_xml[0] = 0; + if (argc>=3) { + if ( strncmp(argv[1], "define", 6) == 0 ) { + strncpy(name_xml,argv[2],900); + strncat(name_xml,".xml",1000); + } else if (check_pslist_name(pslist, argv[2])==0) { + fprintf(stderr, bad_name); + print_pslist(pslist); + exit(0); + } + } else if (argc<2) { + print_pslist(pslist); + usage(); + exit(0); + } + + /* Check argv for proper arguments and run + * the corresponding script, if invoked. + */ + + if (argv[1]==0 || strncmp(argv[1], "list", 4) == 0 ) { + print_pslist(pslist); + } else if (strncmp(argv[1], start_command, 5) == 0) { + if (execl(command, command, start_command, argv[2], NULL) < 0) { + perror("Execl:"); + } + } else if ( strncmp(argv[1], stop_command, 4) == 0 ) { + if (execl(command, command, stop_command, argv[2], NULL) < 0) { + perror("Execl:"); + } + } else if ( strncmp(argv[1], dumpxml_command, 7) == 0 ) { + if (execl(command, command, dumpxml_command, argv[2], NULL) < 0) { + perror("Execl:"); + } + } else if ( strncmp(argv[1], console_command, 8) == 0 ) { + if (execl(command, command, console_command, argv[2], NULL) < 0) { + perror("Execl:"); + } + } else if (strncmp(argv[1], define_command, 6) == 0 ) { + chdir("/usr/local/etc/libvirt/qemu"); + if (execl(command, command, define_command, name_xml, NULL) < 0) { + perror("Execl:"); + } + } else if ( strncmp(argv[1], undefine_command, 8) == 0 ) { + chdir("/usr/local/etc/libvirt/qemu"); + if (execl(command, command, undefine_command, argv[2], NULL) < 0) { + perror("Execl:"); + } + } else { + usage(); + exit(1); + } + exit(0); +} + +/* end */