]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
hostnamed: expose ChassisAssetTag in dbus/varlink
authorJelle van der Waa <jvanderwaa@redhat.com>
Wed, 12 Feb 2025 20:13:04 +0000 (21:13 +0100)
committerJelle van der Waa <jvanderwaa@redhat.com>
Wed, 26 Feb 2025 10:29:25 +0000 (11:29 +0100)
Expose /sys/class/dmi/id/chassis_asset_tag in varlink/dbus commonly used
by companies to track inventory such as laptops.

On desktops and other products the `chassis_asset_tag` can contain
rubbish similar to product_name/product_vendor.

Closes: #36442
hwdb.d/20-dmi-id.hwdb
man/org.freedesktop.hostname1.xml
rules.d/60-dmi-id.rules
src/hostname/hostnamectl.c
src/hostname/hostnamed.c
src/shared/varlink-io.systemd.Hostname.c

index 905d6923bb8f680d64713d0e7392902ebe7ec6ad..e324d89c5ba9a007bdae8800438abdb02e2c7d7c 100644 (file)
@@ -23,6 +23,16 @@ dmi:*:pnTobefilledbyO.E.M.:*
 dmi:*:pnToBeFilledByO.E.M.:*
     ID_PRODUCT_NAME_IS_RUBBISH=1
 
+dmi:*:catDefaultstring:*
+dmi:*:catDefault string:*
+dmi:*:catN/A:*
+dmi:*:catO.E.M.:*
+dmi:*:catOEM:*
+dmi:*:catTobefilledbyO.E.M.:*
+dmi:*:catToBeFilledByO.E.M.:*
+dmi:*:catTo Be Filled By O.E.M.:*
+    ID_CHASSIS_ASSET_TAG_IS_RUBBISH=1
+
 # Fix "Lenovo" capitalization in /sys/class/dmi/id/sys_vendor
 dmi:bvnLENOVO*
     ID_SYSFS_ATTRIBUTE_MODEL=product_version
index e6eac251808a23d1f95ddfb1c24fddcd1cb78879..ee34bf441c2417aeacf41787c7e6a109068c7094 100644 (file)
@@ -101,6 +101,8 @@ node /org/freedesktop/hostname1 {
       readonly ay BootID = [...];
       @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
       readonly u VSockCID = ...;
+      @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+      readonly s ChassisAssetTag = '...';
   };
   interface org.freedesktop.DBus.Peer { ... };
   interface org.freedesktop.DBus.Introspectable { ... };
@@ -182,6 +184,8 @@ node /org/freedesktop/hostname1 {
 
     <variablelist class="dbus-property" generated="True" extra-ref="VSockCID"/>
 
+    <variablelist class="dbus-property" generated="True" extra-ref="ChassisAssetTag"/>
+
     <!--End of Autogenerated section-->
 
     <para>Whenever the hostname or other metadata is changed via the daemon,
@@ -301,6 +305,9 @@ node /org/freedesktop/hostname1 {
     an unsigned 64bit value, in µs since the UNIX epoch, UTC. If not known
     <constant>UNIT64_MAX</constant>.</para>
 
+    <para><varname>ChassisAssetTag</varname> exposes an unique identifier of the system chassis. If this
+    information is not known this property is set to an empty string.</para>
+
     <refsect2>
       <title>Methods</title>
 
@@ -453,6 +460,7 @@ node /org/freedesktop/hostname1 {
       <varname>FirmwareDate</varname> were added in version 253.</para>
       <para><varname>MachineID</varname>, <varname>BootID</varname> and
       <varname>VSockCID</varname> were added in version 256.</para>
+      <para><varname>ChassisAssetTag</varname> was added in version 258.</para>
     </refsect2>
   </refsect1>
 
index 6c61ea24ab707da07a74fb7b6e2eb5fdecea82a8..b112bd7880c9cbb4d98489461121e627bcfd3605 100644 (file)
@@ -11,4 +11,8 @@ ENV{ID_SYSFS_ATTRIBUTE_MODEL}=="product_version", ENV{ID_MODEL}="$attr{product_v
 ENV{ID_VENDOR}=="", ENV{ID_VENDOR}="$attr{board_vendor}"
 ENV{ID_MODEL}=="", ENV{ID_MODEL}="$attr{board_name}"
 
+# chassis asset tag
+ENV{MODALIAS}!="", ATTR{chassis_asset_tag}!="", IMPORT{builtin}="hwdb '$attr{modalias}cat$attr{chassis_asset_tag}:'"
+ENV{ID_CHASSIS_ASSET_TAG_IS_RUBBISH}!="1", ENV{ID_CHASSIS_ASSET_TAG}="$attr{chassis_asset_tag}"
+
 LABEL="dmi_end"
index 2d1334f654c12ae6582352dbb9cfaeb0dbe16fa4..c57d821fce2812bb86ce844bfebed965f009a3db 100644 (file)
@@ -44,6 +44,7 @@ typedef struct StatusInfo {
         const char *pretty_hostname;
         const char *icon_name;
         const char *chassis;
+        const char *chassis_asset_tag;
         const char *deployment;
         const char *location;
         const char *kernel_name;
@@ -164,6 +165,14 @@ static int print_status_info(StatusInfo *i) {
                         return table_log_add_error(r);
         }
 
+        if (!isempty(i->chassis_asset_tag)) {
+                r = table_add_many(table,
+                                   TABLE_FIELD, "Chassis Asset Tag",
+                                   TABLE_STRING, i->chassis_asset_tag);
+                if (r < 0)
+                        return table_log_add_error(r);
+        }
+
         if (!isempty(i->deployment)) {
                 r = table_add_many(table,
                                    TABLE_FIELD, "Deployment",
@@ -373,6 +382,7 @@ static int show_all_names(sd_bus *bus) {
                 { "PrettyHostname",            "s",  NULL,          offsetof(StatusInfo, pretty_hostname)  },
                 { "IconName",                  "s",  NULL,          offsetof(StatusInfo, icon_name)        },
                 { "Chassis",                   "s",  NULL,          offsetof(StatusInfo, chassis)          },
+                { "ChassisAssetTag",           "s",  NULL,          offsetof(StatusInfo, chassis_asset_tag)},
                 { "Deployment",                "s",  NULL,          offsetof(StatusInfo, deployment)       },
                 { "Location",                  "s",  NULL,          offsetof(StatusInfo, location)         },
                 { "KernelName",                "s",  NULL,          offsetof(StatusInfo, kernel_name)      },
index a4549da8268a22237156187c1f78dfb6dce4c2c7..1dd4faa7f0b90eabd2a52214f83c765e382bcea7 100644 (file)
@@ -320,6 +320,10 @@ static int get_dmi_properties(Context *c, const char * const * keys, char **ret)
         return r;
 }
 
+static int get_chassis_asset_tag(Context *c, char **ret) {
+        return get_dmi_property(c, "ID_CHASSIS_ASSET_TAG", ret);
+}
+
 static int get_hardware_vendor(Context *c, char **ret) {
         return get_dmi_properties(c, STRV_MAKE_CONST("ID_VENDOR_FROM_DATABASE", "ID_VENDOR"), ret);
 }
@@ -881,6 +885,24 @@ static int property_get_firmware_date(
 
         return sd_bus_message_append(reply, "t", firmware_date);
 }
+
+static int property_get_chassis_asset_tag(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        _cleanup_free_ char *chassis_asset_tag = NULL;
+        Context *c = ASSERT_PTR(userdata);
+
+        (void) get_chassis_asset_tag(c, &chassis_asset_tag);
+
+        return sd_bus_message_append(reply, "s", chassis_asset_tag);
+}
+
 static int property_get_hostname(
                 sd_bus *bus,
                 const char *path,
@@ -1461,7 +1483,7 @@ static int method_get_hardware_serial(sd_bus_message *m, void *userdata, sd_bus_
 static int build_describe_response(Context *c, bool privileged, sd_json_variant **ret) {
         _cleanup_free_ char *hn = NULL, *dhn = NULL, *in = NULL,
                 *chassis = NULL, *vendor = NULL, *model = NULL, *serial = NULL, *firmware_version = NULL,
-                *firmware_vendor = NULL;
+                *firmware_vendor = NULL, *chassis_asset_tag = NULL;
         _cleanup_strv_free_ char **os_release_pairs = NULL, **machine_info_pairs = NULL;
         usec_t firmware_date = USEC_INFINITY, eol = USEC_INFINITY;
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL;
@@ -1512,6 +1534,7 @@ static int build_describe_response(Context *c, bool privileged, sd_json_variant
         (void) get_firmware_version(c, &firmware_version);
         (void) get_firmware_vendor(c, &firmware_vendor);
         (void) get_firmware_date(c, &firmware_date);
+        (void) get_chassis_asset_tag(c, &chassis_asset_tag);
 
         if (c->data[PROP_OS_SUPPORT_END])
                 (void) os_release_support_ended(c->data[PROP_OS_SUPPORT_END], /* quiet= */ false, &eol);
@@ -1538,6 +1561,7 @@ static int build_describe_response(Context *c, bool privileged, sd_json_variant
                         SD_JSON_BUILD_PAIR("HostnameSource", SD_JSON_BUILD_STRING(hostname_source_to_string(c->hostname_source))),
                         SD_JSON_BUILD_PAIR("IconName", SD_JSON_BUILD_STRING(in ?: c->data[PROP_ICON_NAME])),
                         SD_JSON_BUILD_PAIR("Chassis", SD_JSON_BUILD_STRING(chassis)),
+                        SD_JSON_BUILD_PAIR_STRING("ChassisAssetTag", chassis_asset_tag),
                         SD_JSON_BUILD_PAIR("Deployment", SD_JSON_BUILD_STRING(c->data[PROP_DEPLOYMENT])),
                         SD_JSON_BUILD_PAIR("Location", SD_JSON_BUILD_STRING(c->data[PROP_LOCATION])),
                         SD_JSON_BUILD_PAIR("KernelName", SD_JSON_BUILD_STRING(u.sysname)),
@@ -1627,6 +1651,7 @@ static const sd_bus_vtable hostname_vtable[] = {
         SD_BUS_PROPERTY("MachineID", "ay", property_get_machine_id, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("BootID", "ay", property_get_boot_id, 0, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("VSockCID", "u", property_get_vsock_cid, 0, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("ChassisAssetTag", "s", property_get_chassis_asset_tag, 0, SD_BUS_VTABLE_PROPERTY_CONST),
 
         SD_BUS_METHOD_WITH_ARGS("SetHostname",
                                 SD_BUS_ARGS("s", hostname, "b", interactive),
index c9aadd28e987af5da10d35fbb065d0d539f9a6b2..1430d86bebb2d47de2b4654d075297d194b0c0d9 100644 (file)
@@ -33,7 +33,9 @@ static SD_VARLINK_DEFINE_METHOD(
                 SD_VARLINK_DEFINE_OUTPUT(MachineID, SD_VARLINK_STRING, 0),
                 SD_VARLINK_DEFINE_OUTPUT(BootID, SD_VARLINK_STRING, 0),
                 SD_VARLINK_DEFINE_OUTPUT(ProductUUID, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
-                SD_VARLINK_DEFINE_OUTPUT(VSockCID, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
+                SD_VARLINK_DEFINE_OUTPUT(VSockCID, SD_VARLINK_INT, SD_VARLINK_NULLABLE),
+                SD_VARLINK_FIELD_COMMENT("An unique identifier of the system chassis."),
+                SD_VARLINK_DEFINE_OUTPUT(ChassisAssetTag, SD_VARLINK_STRING, SD_VARLINK_NULLABLE));
 
 SD_VARLINK_DEFINE_INTERFACE(
                 io_systemd_Hostname,