changeset 0:ca114837b2f4

add docker file
author taiki
date Sun, 13 Jul 2014 10:45:54 -1000
parents
children 3e0e4fd65313
files ie-docker.c
diffstat 1 files changed, 214 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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 <stdlib.h>
+#include <unistd.h>
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <signal.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <regex.h>
+
+/* 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 */