]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
hostnamed: Expose dmi "Vendor" and "Model" fields 15531/head
authorFelipe Borges <felipeborges@gnome.org>
Fri, 27 Nov 2020 14:49:34 +0000 (15:49 +0100)
committerFelipe Borges <felipeborges@gnome.org>
Fri, 4 Dec 2020 10:22:49 +0000 (11:22 +0100)
See #15493

src/hostname/hostnamectl.c
src/hostname/hostnamed.c

index 0d39e9176f351b08778abf824f5fa59e94cf4f0b..6532a5ed8c1624332a799a9880d4864be192ee9e 100644 (file)
@@ -43,6 +43,8 @@ typedef struct StatusInfo {
         const char *virtualization;
         const char *architecture;
         const char *home_url;
+        const char *hardware_vendor;
+        const char *hardware_model;
 } StatusInfo;
 
 static void print_status_info(StatusInfo *i) {
@@ -107,6 +109,11 @@ static void print_status_info(StatusInfo *i) {
         if (!isempty(i->architecture))
                 printf("      Architecture: %s\n", i->architecture);
 
+        if (!isempty(i->hardware_vendor))
+                printf("   Hardware Vendor: %s\n", i->hardware_vendor);
+
+        if (!isempty(i->hardware_model))
+                printf("    Hardware Model: %s\n", i->hardware_model);
 }
 
 static int show_one_name(sd_bus *bus, const char* attr) {
@@ -150,6 +157,8 @@ static int show_all_names(sd_bus *bus, sd_bus_error *error) {
                 { "OperatingSystemPrettyName", "s", NULL, offsetof(StatusInfo, os_pretty_name)  },
                 { "OperatingSystemCPEName",    "s", NULL, offsetof(StatusInfo, os_cpe_name)     },
                 { "HomeURL",                   "s", NULL, offsetof(StatusInfo, home_url)        },
+                { "HardwareVendor",            "s", NULL, offsetof(StatusInfo, hardware_vendor) },
+                { "HardwareModel",             "s", NULL, offsetof(StatusInfo, hardware_model)  },
                 {}
         };
 
index a1794bdab1e36a9715dfec29b3b16063b1fc7c42..cb885313ea4210c914c89a8f019192b0a583db4c 100644 (file)
@@ -18,6 +18,7 @@
 #include "fileio.h"
 #include "hostname-util.h"
 #include "id128-util.h"
+#include "libudev.h"
 #include "main-func.h"
 #include "missing_capability.h"
 #include "nscd-flush.h"
@@ -25,6 +26,7 @@
 #include "os-util.h"
 #include "parse-util.h"
 #include "path-util.h"
+#include "sd-device.h"
 #include "selinux-util.h"
 #include "service-util.h"
 #include "signal-util.h"
@@ -47,6 +49,9 @@ enum {
         PROP_DEPLOYMENT,
         PROP_LOCATION,
 
+        PROP_HARDWARE_VENDOR,
+        PROP_HARDWARE_MODEL,
+
         /* Read from /etc/os-release (or /usr/lib/os-release) */
         PROP_OS_PRETTY_NAME,
         PROP_OS_CPE_NAME,
@@ -423,6 +428,54 @@ static int context_write_data_machine_info(Context *c) {
         return write_env_file_label("/etc/machine-info", l);
 }
 
+static int property_get_hardware_vendor(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+        _cleanup_(sd_device_unrefp) sd_device *device = NULL;
+        const char *hardware_vendor = NULL;
+        int r;
+
+        r = sd_device_new_from_syspath(&device, "/sys/class/dmi/id");
+        if (r < 0) {
+                log_warning_errno(r, "Failed to open /sys/class/dmi/id device, ignoring: %m");
+                return sd_bus_message_append(reply, "s", NULL);
+        }
+
+        if (sd_device_get_property_value(device, "ID_VENDOR_FROM_DATABASE", &hardware_vendor) < 0)
+                (void) sd_device_get_property_value(device, "ID_VENDOR", &hardware_vendor);
+
+        return sd_bus_message_append(reply, "s", hardware_vendor);
+}
+
+static int property_get_hardware_model(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+        _cleanup_(sd_device_unrefp) sd_device *device = NULL;
+        const char *hardware_model = NULL;
+        int r;
+
+        r = sd_device_new_from_syspath(&device, "/sys/class/dmi/id");
+        if (r < 0) {
+                log_warning_errno(r, "Failed to open /sys/class/dmi/id device, ignoring: %m");
+                return sd_bus_message_append(reply, "s", NULL);
+        }
+
+        if (sd_device_get_property_value(device, "ID_MODEL_FROM_DATABASE", &hardware_model) < 0)
+                (void) sd_device_get_property_value(device, "ID_MODEL", &hardware_model);
+
+        return sd_bus_message_append(reply, "s", hardware_model);
+}
+
 static int property_get_hostname(
                 sd_bus *bus,
                 const char *path,
@@ -860,6 +913,8 @@ static const sd_bus_vtable hostname_vtable[] = {
         SD_BUS_PROPERTY("OperatingSystemPrettyName", "s", property_get_os_release_field, offsetof(Context, data) + sizeof(char*) * PROP_OS_PRETTY_NAME, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("OperatingSystemCPEName", "s", property_get_os_release_field, offsetof(Context, data) + sizeof(char*) * PROP_OS_CPE_NAME, SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("HomeURL", "s", property_get_os_release_field, offsetof(Context, data) + sizeof(char*) * PROP_OS_HOME_URL, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("HardwareVendor", "s", property_get_hardware_vendor, 0, SD_BUS_VTABLE_PROPERTY_CONST),
+        SD_BUS_PROPERTY("HardwareModel", "s", property_get_hardware_model, 0, SD_BUS_VTABLE_PROPERTY_CONST),
 
         SD_BUS_METHOD_WITH_NAMES("SetHostname",
                                  "sb",