diff --git a/daemon/libvirtd-config.c b/daemon/libvirtd-config.c index 7a448f988c157ebfc3afe8bcfd8dcdcc48edd81c..45280e9febd42e43baa61da145904c404ac83992 100644 --- a/daemon/libvirtd-config.c +++ b/daemon/libvirtd-config.c @@ -374,6 +374,7 @@ daemonConfigFree(struct daemonConfig *data) VIR_FREE(data->crl_file); VIR_FREE(data->host_uuid); + VIR_FREE(data->host_uuid_source); VIR_FREE(data->log_filters); VIR_FREE(data->log_outputs); @@ -463,6 +464,7 @@ daemonConfigLoadOptions(struct daemonConfig *data, GET_CONF_UINT(conf, filename, audit_logging); GET_CONF_STR(conf, filename, host_uuid); + GET_CONF_STR(conf, filename, host_uuid_source); GET_CONF_UINT(conf, filename, log_level); GET_CONF_STR(conf, filename, log_filters); diff --git a/daemon/libvirtd-config.h b/daemon/libvirtd-config.h index 3e1971d67f05a4f9a8c14e7315984ae229280d21..672e9ad5df76ad051b9d7fb316094d9335fb11c2 100644 --- a/daemon/libvirtd-config.h +++ b/daemon/libvirtd-config.h @@ -28,6 +28,7 @@ struct daemonConfig { char *host_uuid; + char *host_uuid_source; int listen_tls; int listen_tcp; diff --git a/daemon/libvirtd.aug b/daemon/libvirtd.aug index 4d40ee2239c8b0e6fcb373ef12a97ddbacc16748..7a81723d30d106283da112c3bfc5adb4cfb74316 100644 --- a/daemon/libvirtd.aug +++ b/daemon/libvirtd.aug @@ -86,6 +86,7 @@ module Libvirtd = | bool_entry "admin_keepalive_required" let misc_entry = str_entry "host_uuid" + | str_entry "host_uuid_source" (* Each enty in the config is one of the following three ... *) let entry = network_entry diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c index f5d1e2fcd292eabfae31be95415df2bdfbc7f684..f0fdaedb747257f6f6265b7be154bfe48ef20e14 100644 --- a/daemon/libvirtd.c +++ b/daemon/libvirtd.c @@ -1076,6 +1076,39 @@ static int migrateProfile(void) return ret; } +static int +daemonSetupHostUUID(const struct daemonConfig *config) +{ + static const char *machine_id = "/etc/machine-id"; + char buf[VIR_UUID_STRING_BUFLEN]; + const char *uuid; + + if (config->host_uuid) { + uuid = config->host_uuid; + } else if (!config->host_uuid_source || + STREQ(config->host_uuid_source, "smbios")) { + /* smbios UUID is fetched on demand in virGetHostUUID */ + return 0; + } else if (STREQ(config->host_uuid_source, "machine-id")) { + if (virFileReadBufQuiet(machine_id, buf, sizeof(buf)) < 0) { + VIR_ERROR(_("Can't read %s"), machine_id); + return -1; + } + + uuid = buf; + } else { + VIR_ERROR(_("invalid UUID source: %s"), config->host_uuid_source); + return -1; + } + + if (virSetHostUUIDStr(uuid)) { + VIR_ERROR(_("invalid host UUID: %s"), uuid); + return -1; + } + + return 0; +} + /* Print command-line usage. */ static void daemonUsage(const char *argv0, bool privileged) @@ -1295,9 +1328,8 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } - if (config->host_uuid && - virSetHostUUIDStr(config->host_uuid) < 0) { - VIR_ERROR(_("invalid host UUID: %s"), config->host_uuid); + if (daemonSetupHostUUID(config) < 0) { + VIR_ERROR(_("Can't setup host uuid")); exit(EXIT_FAILURE); } diff --git a/daemon/libvirtd.conf b/daemon/libvirtd.conf index d2c439c72256973d2190cc4bddabc3a660efe034..1c1fa7fe3aa79bc0dcf8684a7627eb6c333f22d2 100644 --- a/daemon/libvirtd.conf +++ b/daemon/libvirtd.conf @@ -410,10 +410,16 @@ ################################################################### # UUID of the host: -# Provide the UUID of the host here in case the command -# 'dmidecode -s system-uuid' does not provide a valid uuid. In case -# 'dmidecode' does not provide a valid UUID and none is provided here, a -# temporary UUID will be generated. +# Host UUID is read from one of the sources specified in host_uuid_source. +# +# - 'smbios': fetch the UUID from 'dmidecode -s system-uuid' +# - 'machine-id': fetch the UUID from /etc/machine-id +# +# The host_uuid_source default is 'smbios'. If 'dmidecode' does not provide +# a valid UUID a temporary UUID will be generated. +# +# Another option is to specify host UUID in host_uuid. +# # Keep the format of the example UUID below. UUID must not have all digits # be the same. @@ -421,6 +427,7 @@ # it with the output of the 'uuidgen' command and then # uncomment this entry #host_uuid = "00000000-0000-0000-0000-000000000000" +#host_uuid_source = "smbios" ################################################################### # Keepalive protocol: diff --git a/daemon/test_libvirtd.aug.in b/daemon/test_libvirtd.aug.in index b0cb7eb1492027b4369a90ed206bc4841064b05b..7a036034b64c98fa8f98c4735177e3450cd41010 100644 --- a/daemon/test_libvirtd.aug.in +++ b/daemon/test_libvirtd.aug.in @@ -55,6 +55,7 @@ module Test_libvirtd = { "audit_level" = "2" } { "audit_logging" = "1" } { "host_uuid" = "00000000-0000-0000-0000-000000000000" } + { "host_uuid_source" = "smbios" } { "keepalive_interval" = "5" } { "keepalive_count" = "5" } { "keepalive_required" = "1" }