diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-03-31 18:15:59 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-03-31 18:16:02 +0200 |
commit | a7edaadd78271e1c35ff9032f068cb08de645437 (patch) | |
tree | 24e18127aab17c7c2b05dca7b0845f03e6ad7acf /src/journal | |
parent | 98178d3947d951ca001eaf400b5f362f458dceb5 (diff) |
journal-gatewayd: query PID 1 for virtalization
Since journal-gatewayd is now running unprivileged, and detecting
virtalization requires privileges, query PID1 via D-Bus for the used
virtualization.
This is also the first time we use libsystemd-bus for more than just
testing.
https://bugs.freedesktop.org/show_bug.cgi?id=62173
Diffstat (limited to 'src/journal')
-rw-r--r-- | src/journal/journal-gatewayd.c | 56 |
1 files changed, 52 insertions, 4 deletions
diff --git a/src/journal/journal-gatewayd.c b/src/journal/journal-gatewayd.c index 8161b7e56b..133d0ae478 100644 --- a/src/journal/journal-gatewayd.c +++ b/src/journal/journal-gatewayd.c @@ -31,9 +31,11 @@ #include "util.h" #include "sd-journal.h" #include "sd-daemon.h" +#include "sd-bus.h" +#include "bus-message.h" +#include "bus-internal.h" #include "logs-show.h" #include "microhttpd-util.h" -#include "virt.h" #include "build.h" #include "fileio.h" @@ -740,6 +742,52 @@ static int request_handler_file( return ret; } +static int get_virtualization(char **v) { + _cleanup_bus_message_unref_ sd_bus_message *m = NULL, *reply = NULL; + _cleanup_bus_unref_ sd_bus *bus = NULL; + const char *t; + char *b; + int r; + + r = sd_bus_open_system(&bus); + if (r < 0) + return r; + + r = sd_bus_message_new_method_call( + bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.DBus.Properties", + "Get", + &m); + if (r < 0) + return r; + + r = sd_bus_message_append(m, "ss", "org.freedesktop.systemd1.Manager", "Virtualization"); + if (r < 0) + return r; + + r = sd_bus_send_with_reply_and_block(bus, m, 0, NULL, &reply); + if (r < 0) + return r; + + r = sd_bus_message_read(reply, "v", "s", &t); + if (r < 0) + return r; + + if (isempty(t)) { + *v = NULL; + return 0; + } + + b = strdup(t); + if (!b) + return -ENOMEM; + + *v = b; + return 1; +} + static int request_handler_machine( struct MHD_Connection *connection, void *connection_cls) { @@ -751,7 +799,7 @@ static int request_handler_machine( uint64_t cutoff_from, cutoff_to, usage; char *json; sd_id128_t mid, bid; - const char *v = "bare"; + _cleanup_free_ char *v = NULL; assert(connection); assert(m); @@ -782,7 +830,7 @@ static int request_handler_machine( parse_env_file("/etc/os-release", NEWLINE, "PRETTY_NAME", &os_name, NULL); - detect_virtualization(&v); + get_virtualization(&v); r = asprintf(&json, "{ \"machine_id\" : \"" SD_ID128_FORMAT_STR "\"," @@ -797,7 +845,7 @@ static int request_handler_machine( SD_ID128_FORMAT_VAL(bid), hostname_cleanup(hostname), os_name ? os_name : "Linux", - v, + v ? v : "bare", (unsigned long long) usage, (unsigned long long) cutoff_from, (unsigned long long) cutoff_to); |