diff --git a/rules.d/50-udev-default.rules.in b/rules.d/50-udev-default.rules.in index 50ac005016c..b37e8bd3d50 100644 --- a/rules.d/50-udev-default.rules.in +++ b/rules.d/50-udev-default.rules.in @@ -106,18 +106,7 @@ KERNEL=="vhost-net", GROUP="kvm", MODE="{{DEV_KVM_MODE}}", OPTIONS+="static_node KERNEL=="udmabuf", GROUP="kvm" -SUBSYSTEM=="ptp", ATTR{clock_name}=="KVM virtual PTP", SYMLINK += "ptp_kvm" - -SUBSYSTEM=="ptp", ATTR{clock_name}=="hyperv", SYMLINK += "ptp_hyperv" - -SUBSYSTEM!="dmi", GOTO="dmi_end" -ENV{ID_SYS_VENDOR_IS_RUBBISH}!="1", ENV{ID_VENDOR}="$attr{sys_vendor}" -ENV{ID_SYSFS_ATTRIBUTE_MODEL}=="", ENV{ID_PRODUCT_NAME_IS_RUBBISH}!="1", ENV{ID_MODEL}="$attr{product_name}" -ENV{ID_SYSFS_ATTRIBUTE_MODEL}=="product_name", ENV{ID_MODEL}="$attr{product_name}" -ENV{ID_SYSFS_ATTRIBUTE_MODEL}=="product_version", ENV{ID_MODEL}="$attr{product_version}" -# fallback to board information -ENV{ID_VENDOR}=="", ENV{ID_VENDOR}="$attr{board_vendor}" -ENV{ID_MODEL}=="", ENV{ID_MODEL}="$attr{board_name}" -LABEL="dmi_end" +SUBSYSTEM=="ptp", ATTR{clock_name}=="KVM virtual PTP", SYMLINK+="ptp_kvm" +SUBSYSTEM=="ptp", ATTR{clock_name}=="hyperv", SYMLINK+="ptp_hyperv" LABEL="default_end" diff --git a/rules.d/60-dmi-id.rules b/rules.d/60-dmi-id.rules new file mode 100644 index 00000000000..6c61ea24ab7 --- /dev/null +++ b/rules.d/60-dmi-id.rules @@ -0,0 +1,14 @@ +# do not edit this file, it will be overwritten on update + +ACTION=="remove", GOTO="dmi_end" +SUBSYSTEM!="dmi", GOTO="dmi_end" + +ENV{ID_SYS_VENDOR_IS_RUBBISH}!="1", ENV{ID_VENDOR}="$attr{sys_vendor}" +ENV{ID_SYSFS_ATTRIBUTE_MODEL}=="", ENV{ID_PRODUCT_NAME_IS_RUBBISH}!="1", ENV{ID_MODEL}="$attr{product_name}" +ENV{ID_SYSFS_ATTRIBUTE_MODEL}=="product_name", ENV{ID_MODEL}="$attr{product_name}" +ENV{ID_SYSFS_ATTRIBUTE_MODEL}=="product_version", ENV{ID_MODEL}="$attr{product_version}" +# fallback to board information +ENV{ID_VENDOR}=="", ENV{ID_VENDOR}="$attr{board_vendor}" +ENV{ID_MODEL}=="", ENV{ID_MODEL}="$attr{board_name}" + +LABEL="dmi_end" diff --git a/rules.d/meson.build b/rules.d/meson.build index 7280f5b995d..20fca222da6 100644 --- a/rules.d/meson.build +++ b/rules.d/meson.build @@ -8,6 +8,7 @@ rules = [ [files('60-autosuspend.rules', '60-block.rules', '60-cdrom_id.rules', + '60-dmi-id.rules', '60-drm.rules', '60-evdev.rules', '60-fido-id.rules', diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c index 97b1c61748a..9ef45f8e75a 100644 --- a/src/hostname/hostnamed.c +++ b/src/hostname/hostnamed.c @@ -179,12 +179,34 @@ static void context_read_os_release(Context *c) { c->etc_os_release_stat = current_stat; } +static bool use_dmi_data(void) { + int r; + + r = getenv_bool("SYSTEMD_HOSTNAME_FORCE_DMI"); + if (r >= 0) { + log_debug("Honouring $SYSTEMD_HOSTNAME_FORCE_DMI override: %s", yes_no(r)); + return r; + } + if (r != -ENXIO) + log_debug_errno(r, "Failed to parse $SYSTEMD_HOSTNAME_FORCE_DMI, ignoring: %m"); + + if (detect_container() > 0) { + log_debug("Running in a container, not using DMI hardware data."); + return false; + } + + return true; +} + static int get_dmi_data(const char *database_key, const char *regular_key, char **ret) { _cleanup_(sd_device_unrefp) sd_device *device = NULL; _cleanup_free_ char *b = NULL; const char *s = NULL; int r; + if (!use_dmi_data()) + return -ENOENT; + r = sd_device_new_from_syspath(&device, "/sys/class/dmi/id"); if (r < 0) return log_debug_errno(r, "Failed to open /sys/class/dmi/id device, ignoring: %m"); @@ -223,6 +245,9 @@ static int get_hardware_firmware_data(const char *sysattr, char **ret) { assert(sysattr); + if (!use_dmi_data()) + return -ENOENT; + r = sd_device_new_from_syspath(&device, "/sys/class/dmi/id"); if (r < 0) return log_debug_errno(r, "Failed to open /sys/class/dmi/id device, ignoring: %m"); @@ -282,20 +307,20 @@ static int get_firmware_date(usec_t *ret) { return -EINVAL; unsigned m, d, y; - r = safe_atou(month, &m); + r = safe_atou_full(month, 10 | SAFE_ATO_REFUSE_PLUS_MINUS | SAFE_ATO_REFUSE_LEADING_WHITESPACE, &m); if (r < 0) return r; if (m < 1 || m > 12) return -EINVAL; m -= 1; - r = safe_atou(day, &d); + r = safe_atou_full(day, 10 | SAFE_ATO_REFUSE_PLUS_MINUS | SAFE_ATO_REFUSE_LEADING_WHITESPACE, &d); if (r < 0) return r; if (d < 1 || d > 31) return -EINVAL; - r = safe_atou(year, &y); + r = safe_atou_full(year, 10 | SAFE_ATO_REFUSE_PLUS_MINUS | SAFE_ATO_REFUSE_LEADING_WHITESPACE, &y); if (r < 0) return r; if (y < 1970 || y > (unsigned) INT_MAX) diff --git a/test/units/testsuite-71.sh b/test/units/testsuite-71.sh index 1c884324cbf..9d84dd89ed3 100755 --- a/test/units/testsuite-71.sh +++ b/test/units/testsuite-71.sh @@ -112,15 +112,16 @@ testcase_firmware_date() { cat >/run/systemd/system/systemd-hostnamed.service.d/override.conf </sys/class/dmi/id/uevent - echo '01/01/2000' >/sys/class/dmi/id/bios_date + echo '09/08/2000' >/sys/class/dmi/id/bios_date systemctl stop systemd-hostnamed - assert_in '2000-01-01' "$(hostnamectl)" + assert_in '2000-09-08' "$(hostnamectl)" echo '2022' >/sys/class/dmi/id/bios_date systemctl stop systemd-hostnamed