mirror of
https://github.com/systemd/systemd.git
synced 2025-03-22 06:50:18 +03:00
Merge pull request #28080 from poettering/dmi-fixes
fix udev DMI rules – make sure hostnamectl shows correct hw info even after device trigger
This commit is contained in:
commit
4c834779cd
@ -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"
|
||||
|
14
rules.d/60-dmi-id.rules
Normal file
14
rules.d/60-dmi-id.rules
Normal file
@ -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"
|
@ -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',
|
||||
|
@ -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)
|
||||
|
@ -112,15 +112,16 @@ testcase_firmware_date() {
|
||||
cat >/run/systemd/system/systemd-hostnamed.service.d/override.conf <<EOF
|
||||
[Service]
|
||||
Environment="SYSTEMD_DEVICE_VERIFY_SYSFS=0"
|
||||
Environment="SYSTEMD_HOSTNAME_FORCE_DMI=1"
|
||||
EOF
|
||||
systemctl daemon-reload
|
||||
|
||||
mount -t tmpfs none /sys/class/dmi/id
|
||||
echo '1' >/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
|
||||
|
Loading…
x
Reference in New Issue
Block a user