[libvirt] [PATCH] Add host UUID (to libvirt capabilities)

Daniel P. Berrange berrange at redhat.com
Mon May 24 13:06:11 UTC 2010


On Mon, May 24, 2010 at 08:55:33AM -0400, Stefan Berger wrote:
> Index: libvirt-acl/daemon/libvirtd.c
> ===================================================================
> --- libvirt-acl.orig/daemon/libvirtd.c
> +++ libvirt-acl/daemon/libvirtd.c
> @@ -2718,6 +2718,7 @@ remoteReadConfigFile (struct qemud_serve
>      char *unix_sock_rw_perms = NULL;
>      char *unix_sock_group = NULL;
>      char *buf = NULL;
> +    char *host_uuid = NULL;
>  
>  #if HAVE_POLKIT
>      /* Change the default back to no auth for non-root */
> @@ -2840,6 +2841,10 @@ remoteReadConfigFile (struct qemud_serve
>      GET_CONF_INT (conf, filename, max_requests);
>      GET_CONF_INT (conf, filename, max_client_requests);
>  
> +    GET_CONF_STR (conf, filename, host_uuid);
> +    virSetHostUUIDStr(host_uuid);
> +    VIR_FREE(host_uuid);
> +
>      virConfFree (conf);
>      return 0;
>  
> Index: libvirt-acl/src/util/uuid.h
> ===================================================================
> --- libvirt-acl.orig/src/util/uuid.h
> +++ libvirt-acl/src/util/uuid.h
> @@ -22,6 +22,10 @@
>  #ifndef __VIR_UUID_H__
>  # define __VIR_UUID_H__
>  
> +int virSetHostUUIDStr(const char *host_uuid);
> +int virGetHostUUID(unsigned char *host_uuid);
> +int virGetHostUUIDStr(char *host_uuid);
> +
>  int virUUIDGenerate(unsigned char *uuid);
>  
>  int virUUIDParse(const char *uuidstr,
> Index: libvirt-acl/src/util/uuid.c
> ===================================================================
> --- libvirt-acl.orig/src/util/uuid.c
> +++ libvirt-acl/src/util/uuid.c
> @@ -38,11 +38,14 @@
>  #include "util.h"
>  #include "virterror_internal.h"
>  #include "logging.h"
> +#include "memory.h"
>  
>  #ifndef ENODATA
>  # define ENODATA EIO
>  #endif
>  
> +static unsigned char host_uuid[VIR_UUID_BUFLEN];
> +
>  static int
>  virUUIDGenerateRandomBytes(unsigned char *buf,
>                             int buflen)
> @@ -208,3 +211,154 @@ void virUUIDFormat(const unsigned char *
>               uuid[12], uuid[13], uuid[14], uuid[15]);
>      uuidstr[VIR_UUID_STRING_BUFLEN-1] = '\0';
>  }
> +
> +
> +
> +/**
> + * isValidHostUUID
> + *
> + * @uuid: The UUID to test
> + *
> + * Do some basic tests to check whether the given UUID is
> + * valid as a host UUID.
> + * Basic tests:
> + *  - Not all of the digits may be equal
> + */
> +static int
> +isValidHostUUID(unsigned char *uuid)
> +{
> +    unsigned int i, ctr = 1;
> +    unsigned char c;
> +
> +    if (!uuid)
> +        return 0;
> +
> +    c = uuid[0];
> +
> +    for (i = 1; i < VIR_UUID_BUFLEN; i++)
> +        if (uuid[i] == c)
> +            ctr++;
> +
> +    return (ctr != VIR_UUID_BUFLEN);
> +}
> +
> +static int
> +getDMISystemUUID(char *uuid, int len)
> +{
> +    const char *dmidecodearg[] = { "dmidecode", "-s", "system-uuid", NULL };
> +    const char *const dmidecodeenv[] = { "LC_ALL=C", NULL };
> +    char *binary, *newline;
> +    int dmidecodestdout = -1;
> +    int ret = -1;
> +    pid_t child;
> +
> +    binary = virFindFileInPath(dmidecodearg[0]);
> +    if (binary == NULL || access(binary, X_OK) != 0) {
> +        VIR_FREE(binary);
> +        return -1;
> +    }
> +    dmidecodearg[0] = binary;
> +
> +    if (virExec(dmidecodearg, dmidecodeenv, NULL,
> +                &child, -1, &dmidecodestdout, NULL, VIR_EXEC_CLEAR_CAPS) < 0) {
> +        ret = -1;
> +        goto cleanup;
> +    }

I've just remembered that the DMIDecode data is available from sysfs so we 
can avoid needing to run dmidecode at all. Depending on kernel version it 
can be in either

   "/sys/devices/virtual/dmi/id"
   "/sys/class/dmi/id"

There's some code in src/.node_device/node_device_udev.c the udevGetDMIData()
method which already reads this. We can just do the same, and even make 
udevGetDMIData() call into virGetHostUUID() now

Regards,
Daniel
-- 
|: Red Hat, Engineering, London    -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org        -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list