hostnamed: expose ChassisAssetTag in dbus/varlink
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
This commit is contained in:
@@ -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) },
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user