]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
* src/openvz_conf.c src/openvz_conf.h src/openvz_driver.c: new
authorDaniel Veillard <veillard@redhat.com>
Thu, 10 Jul 2008 07:52:14 +0000 (07:52 +0000)
committerDaniel Veillard <veillard@redhat.com>
Thu, 10 Jul 2008 07:52:14 +0000 (07:52 +0000)
  patch from Evgeniy Sokolov adding OpenVZ autostart get and set support
Daniel

ChangeLog
src/openvz_conf.c
src/openvz_conf.h
src/openvz_driver.c

index 3dda22c5b08fe9816b4cc42176e2bf51cdf62a18..6d78ada4e5e6327c4a556b25ac66c26bbd12f0da 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Jul 10 09:50:39 CEST 2008 Daniel Veillard <veillard@redhat.com>
+
+       * src/openvz_conf.c src/openvz_conf.h src/openvz_driver.c: new
+         patch from Evgeniy Sokolov adding OpenVZ autostart get and set support
+
 Wed Jul  9 13:53:25 CEST 2008 Daniel Veillard <veillard@redhat.com>
 
        * src/openvz_conf.c src/openvz_conf.h src/openvz_driver.c: applied
index 32d7258bc7e010dc8e956193e24f15a7db4c57e2..b8096be4379246a8a2accbb7e8a7f174df5736d0 100644 (file)
@@ -603,6 +603,63 @@ error:
     return NULL;
 }
 
+/*
+* Read parameter from container config
+* sample: 133, "OSTEMPLATE", value, 1024
+* return: -1 - error
+*         0 - don't found
+*          1 - OK
+*/
+int
+openvzReadConfigParam(int vpsid ,const char * param, char *value, int maxlen)
+{
+    char conf_file[PATH_MAX] ;
+    char line[PATH_MAX] ;
+    int ret, found = 0;
+    char * conf_dir;
+    int fd ;
+    char * sf, * token;
+    char *saveptr = NULL;
+
+        
+    conf_dir = openvzLocateConfDir();
+    if (conf_dir == NULL)
+        return -1;
+
+    if (snprintf(conf_file, PATH_MAX,"%s/%d.conf",conf_dir,vpsid) >= PATH_MAX) 
+        return -1;
+
+    VIR_FREE(conf_dir);
+
+    value[0] = 0;
+
+    fd = open(conf_file, O_RDONLY);
+    if (fd == -1) 
+        return -1;
+
+    while(1) {
+        ret = openvz_readline(fd, line, sizeof(line));
+        if(ret <= 0)
+            break;
+        saveptr = NULL;
+        if (STREQLEN(line, param, strlen(param))) { 
+            sf = line;
+            sf += strlen(param);
+            if (sf[0] == '=' && (token = strtok_r(sf,"\"\t=\n", &saveptr)) != NULL) {
+                strncpy(value, token, maxlen) ;
+                value[maxlen-1] = '\0';
+                found = 1;
+            }
+       }
+    }
+    close(fd);
+
+    if (ret == 0 && found)
+        ret = 1;
+
+    return ret ;
+}
+
 static char
 *openvzLocateConfDir(void)
 {
@@ -680,6 +737,8 @@ openvzGetVPSUUID(int vpsid, char *uuidstr)
             break;
         }
     }
+    close(fd);
+
     return 0;
 }
 
index 772782fcc27aa31c5b6d2a29dbf498698971abf6..9d6aa057847236e26e7682591edf395ad216b60d 100644 (file)
@@ -112,6 +112,7 @@ openvzIsActiveVM(struct openvz_vm *vm)
 
 void error (virConnectPtr conn, virErrorNumber code, const char *fmt, ...);
 int openvz_readline(int fd, char *ptr, int maxlen);
+int openvzReadConfigParam(int vpsid ,const char * param, char *value, int maxlen);
 struct openvz_vm *openvzFindVMByID(const struct openvz_driver *driver, int id);
 struct openvz_vm *openvzFindVMByUUID(const struct openvz_driver *driver,
                                             const unsigned char *uuid);
index fcc9d8c129814d014e12fce1291133f798a5be89..27e4fdcd1b8bac590b08282b34c6608f967d2263 100644 (file)
@@ -547,6 +547,54 @@ bail_out5:
     return ret;
 }
 
+static int
+openvzDomainSetAutostart(virDomainPtr dom, int autostart)
+{
+    virConnectPtr conn= dom->conn;
+    struct openvz_driver *driver = (struct openvz_driver *) conn->privateData;
+    struct openvz_vm *vm = openvzFindVMByUUID(driver, dom->uuid);
+    const char *prog[] = { VZCTL, "set", vm->vmdef->name, 
+                           "--onboot", autostart ? "yes" : "no", 
+                           "--save", NULL };
+
+    if (!vm) {
+        error(conn, VIR_ERR_INVALID_DOMAIN, _("no domain with matching uuid"));
+        return -1;
+    }
+
+    if (virRun(conn, (char **)prog, NULL) < 0) {
+        error(conn, VIR_ERR_INTERNAL_ERROR, _("Could not exec %s"), VZCTL);
+        return -1;
+    }
+
+    return 0;
+}
+
+static int
+openvzDomainGetAutostart(virDomainPtr dom, int *autostart)
+{
+    virConnectPtr conn= dom->conn;
+    struct openvz_driver *driver = (struct openvz_driver *) conn->privateData;
+    struct openvz_vm *vm = openvzFindVMByUUID(driver, dom->uuid);
+    char value[1024];
+
+    if (!vm) {
+        error(conn, VIR_ERR_INVALID_DOMAIN, _("no domain with matching uuid"));
+        return -1;
+    }
+
+    if (openvzReadConfigParam(vm->vpsid , "ONBOOT", value, sizeof(value)) < 0) {
+        error(conn, VIR_ERR_INTERNAL_ERROR, _("Cound not read container config"));
+        return -1;
+    }
+
+    *autostart = 0;
+    if (STREQ(value,"yes"))
+        *autostart = 1; 
+
+    return 0;
+}
+
 static const char *openvzProbe(void)
 {
 #ifdef __linux__
@@ -748,8 +796,8 @@ static virDriver openvzDriver = {
     openvzDomainUndefine, /* domainUndefine */
     NULL, /* domainAttachDevice */
     NULL, /* domainDetachDevice */
-    NULL, /* domainGetAutostart */
-    NULL, /* domainSetAutostart */
+    openvzDomainGetAutostart, /* domainGetAutostart */
+    openvzDomainSetAutostart, /* domainSetAutostart */
     NULL, /* domainGetSchedulerType */
     NULL, /* domainGetSchedulerParameters */
     NULL, /* domainSetSchedulerParameters */