machinectl.c revision 4afd3348c7506dd1d36305b7bcb9feb8952b9d6b
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering This file is part of systemd.
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering Copyright 2013 Lennart Poettering
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering systemd is free software; you can redistribute it and/or modify it
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering under the terms of the GNU Lesser General Public License as published by
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering (at your option) any later version.
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering systemd is distributed in the hope that it will be useful, but
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering Lesser General Public License for more details.
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering You should have received a copy of the GNU Lesser General Public License
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic bool arg_all = false;
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersenstatic bool arg_full = false;
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersenstatic bool arg_no_pager = false;
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersenstatic bool arg_legend = true;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic bool arg_read_only = false;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic bool arg_mkdir = false;
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersenstatic bool arg_quiet = false;
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersenstatic bool arg_ask_password = true;
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersenstatic bool arg_force = false;
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersenstatic ImportVerify arg_verify = IMPORT_VERIFY_SIGNATURE;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic void pager_open_if_enabled(void) {
5b30bef856e89a571df57b7b953e9a1409d9acedLennart Poetteringstatic void polkit_agent_open_if_enabled(void) {
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen /* Open the polkit agent as a child process if necessary */
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic OutputFlags get_output_flags(void) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering (!on_tty() || pager_have()) * OUTPUT_FULL_WIDTH |
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersentypedef struct MachineInfo {
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poetteringstatic int compare_machine_info(const void *a, const void *b) {
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering const MachineInfo *x = a, *y = b;
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poetteringstatic int list_machines(int argc, char *argv[], void *userdata) {
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering size_t max_name = strlen("MACHINE"), max_class = strlen("CLASS"), max_service = strlen("SERVICE");
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering _cleanup_free_ MachineInfo *machines = NULL;
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering const char *name, *class, *service, *object;
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering size_t n_machines = 0, n_allocated = 0, j;
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering "org.freedesktop.machine1",
5b30bef856e89a571df57b7b953e9a1409d9acedLennart Poettering "org.freedesktop.machine1.Manager",
5b30bef856e89a571df57b7b953e9a1409d9acedLennart Poettering "ListMachines",
9d12709626bccc0cae677a7035f62efe6aabb4abLennart Poettering log_error("Could not get machines: %s", bus_error_message(&error, -r));
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering r = sd_bus_message_enter_container(reply, 'a', "(ssso)");
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering while ((r = sd_bus_message_read(reply, "(ssso)", &name, &class, &service, &object)) > 0) {
aa1936ea1a89c2bb968ba33e3274898a4eeae771Lennart Poettering if (!GREEDY_REALLOC(machines, n_allocated, n_machines + 1))
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering r = sd_bus_message_exit_container(reply);
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering qsort_safe(machines, n_machines, sizeof(MachineInfo), compare_machine_info);
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering for (j = 0; j < n_machines; j++)
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering printf("\n%zu machines listed.\n", n_machines);
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poetteringtypedef struct ImageInfo {
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poetteringstatic int compare_image_info(const void *a, const void *b) {
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering const ImageInfo *x = a, *y = b;
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poetteringstatic int list_images(int argc, char *argv[], void *userdata) {
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering size_t max_name = strlen("NAME"), max_type = strlen("TYPE"), max_size = strlen("USAGE"), max_crtime = strlen("CREATED"), max_mtime = strlen("MODIFIED");
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering "org.freedesktop.machine1",
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering "org.freedesktop.machine1.Manager",
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering log_error("Could not get images: %s", bus_error_message(&error, -r));
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ssbttto)");
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering while ((r = sd_bus_message_read(reply, "(ssbttto)", &name, &type, &read_only, &crtime, &mtime, &size, &object)) > 0) {
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering char buf[MAX(FORMAT_TIMESTAMP_MAX, FORMAT_BYTES_MAX)];
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering if (!GREEDY_REALLOC(images, n_allocated, n_images + 1))
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering l = strlen(strna(format_timestamp(buf, sizeof(buf), crtime)));
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering l = strlen(strna(format_timestamp(buf, sizeof(buf), mtime)));
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering l = strlen(strna(format_bytes(buf, sizeof(buf), size)));
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering r = sd_bus_message_exit_container(reply);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering qsort_safe(images, n_images, sizeof(ImageInfo), compare_image_info);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering printf("%-*s %-*s %-3s %-*s %-*s %-*s\n",
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering for (j = 0; j < n_images; j++) {
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering char crtime_buf[FORMAT_TIMESTAMP_MAX], mtime_buf[FORMAT_TIMESTAMP_MAX], size_buf[FORMAT_BYTES_MAX];
717603e391b52983ca1fd218e7333a1b9dfc5c05Lennart Poettering printf("%-*s %-*s %s%-3s%s %-*s %-*s %-*s\n",
89f7c8465cd1ab37347dd0c15920bce31e8225dfLennart Poettering images[j].read_only ? ansi_highlight_red() : "", yes_no(images[j].read_only), images[j].read_only ? ansi_normal() : "",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering (int) max_size, strna(format_bytes(size_buf, sizeof(size_buf), images[j].size)),
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering (int) max_crtime, strna(format_timestamp(crtime_buf, sizeof(crtime_buf), images[j].crtime)),
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering (int) max_mtime, strna(format_timestamp(mtime_buf, sizeof(mtime_buf), images[j].mtime)));
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sieversstatic int show_unit_cgroup(sd_bus *bus, const char *unit, pid_t leader) {
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering if (arg_transport == BUS_TRANSPORT_REMOTE)
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "ControlGroup",
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers log_error("Failed to query ControlGroup: %s", bus_error_message(&error, -r));
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering if (cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, cgroup) != 0 && leader <= 0)
27e72d6b22890ba4a8cbc05c49667cd1cccf1461Simon Peeters show_cgroup_and_extra(SYSTEMD_CGROUP_CONTROLLER, cgroup, "\t\t ", c, false, &leader, leader > 0, get_output_flags());
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poetteringstatic int print_addresses(sd_bus *bus, const char *name, int ifi, const char *prefix, const char *prefix2) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "org.freedesktop.machine1",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "org.freedesktop.machine1.Manager",
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers "GetMachineAddresses",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering r = sd_bus_message_enter_container(reply, 'a', "(iay)");
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering while ((r = sd_bus_message_enter_container(reply, 'r', "iay")) > 0) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering const void *a;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering char buffer[MAX(INET6_ADDRSTRLEN, INET_ADDRSTRLEN)];
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen r = sd_bus_message_read_array(reply, 'y', &a, &sz);
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen fputs(inet_ntop(family, a, buffer, sizeof(buffer)), stdout);
5b30bef856e89a571df57b7b953e9a1409d9acedLennart Poettering r = sd_bus_message_exit_container(reply);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering r = sd_bus_message_exit_container(reply);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic int print_os_release(sd_bus *bus, const char *name, const char *prefix) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen "org.freedesktop.machine1",
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen "org.freedesktop.machine1.Manager",
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen "GetMachineOSRelease",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering r = sd_bus_message_enter_container(reply, 'a', "{ss}");
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering while ((r = sd_bus_message_read(reply, "{ss}", &k, &v)) > 0) {
1dba654b27918c22e413ac5b3c19301f1ff86ad2Lennart Poettering r = sd_bus_message_exit_container(reply);
1dba654b27918c22e413ac5b3c19301f1ff86ad2Lennart Poetteringstatic void machine_status_info_clear(MachineStatusInfo *info) {
3d94f76c99da13e5603831d0b278f8c8c21bcb02Lennart Poetteringstatic void print_machine_status_info(sd_bus *bus, MachineStatusInfo *i) {
a4475f577bd0daf762d6c3b4e58bc484e0cb74afLennart Poettering char since1[FORMAT_TIMESTAMP_RELATIVE_MAX], *s1;
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering if (!sd_id128_equal(i->id, SD_ID128_NULL))
f69157a66ffe413b4cf8bd79057487fc8921e78bThomas Hindoe Paaboel Andersen printf("(" SD_ID128_FORMAT_STR ")\n", SD_ID128_FORMAT_VAL(i->id));
878cd7e95ca303f9851d227a22d2022bd49944b0Lennart Poettering s1 = format_timestamp_relative(since1, sizeof(since1), i->timestamp.realtime);
bc9fd78c7bfc39881e19457e476393635f8b0442Lennart Poettering s2 = format_timestamp(since2, sizeof(since2), i->timestamp.realtime);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering printf("\t Leader: %u", (unsigned) i->leader);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering } else if (i->class)
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering printf("\t Root: %s\n", i->root_directory);
fbadf04511389c4a0687ba5e9baf0ecebdbb07f1Lennart Poettering for (c = 0; c < i->n_netif; c++) {
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering "\t Address: ",
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering print_os_release(bus, i->name, "\t OS: ");
6261f11fc3d0a8b63c5afa5313d96607a008b54eLennart Poettering show_unit_cgroup(bus, i->unit, i->leader);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering if (arg_transport == BUS_TRANSPORT_LOCAL)
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering get_output_flags() | OUTPUT_BEGIN_NEWLINE,
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringstatic int map_netif(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) {
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering const void *v;
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering assert_cc(sizeof(int32_t) == sizeof(int));
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering r = sd_bus_message_read_array(m, SD_BUS_TYPE_INT32, &v, &l);
5b30bef856e89a571df57b7b953e9a1409d9acedLennart Poetteringstatic int show_machine_info(const char *verb, sd_bus *bus, const char *path, bool *new_line) {
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering static const struct bus_properties_map map[] = {
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering { "Name", "s", NULL, offsetof(MachineStatusInfo, name) },
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering { "Class", "s", NULL, offsetof(MachineStatusInfo, class) },
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering { "Service", "s", NULL, offsetof(MachineStatusInfo, service) },
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering { "Unit", "s", NULL, offsetof(MachineStatusInfo, unit) },
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering { "RootDirectory", "s", NULL, offsetof(MachineStatusInfo, root_directory) },
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering { "Leader", "u", NULL, offsetof(MachineStatusInfo, leader) },
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering { "Timestamp", "t", NULL, offsetof(MachineStatusInfo, timestamp.realtime) },
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering { "TimestampMonotonic", "t", NULL, offsetof(MachineStatusInfo, timestamp.monotonic) },
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering { "Id", "ay", bus_map_id128, offsetof(MachineStatusInfo, id) },
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering { "NetworkInterfaces", "ai", map_netif, 0 },
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering _cleanup_(machine_status_info_clear) MachineStatusInfo info = {};
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering "org.freedesktop.machine1",
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering return log_error_errno(r, "Could not get properties: %m");
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringstatic int show_machine_properties(sd_bus *bus, const char *path, bool *new_line) {
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering r = bus_print_all_properties(bus, "org.freedesktop.machine1", path, arg_property, arg_all);
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering log_error_errno(r, "Could not get properties: %m");
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringstatic int show_machine(int argc, char *argv[], void *userdata) {
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering /* If no argument is specified, inspect the manager
04d39279245834494baccfdb9349db8bf80abd13Lennart Poettering r = show_machine_properties(bus, "/org/freedesktop/machine1", &new_line);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "org.freedesktop.machine1",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "org.freedesktop.machine1.Manager",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering log_error("Could not get path to machine: %s", bus_error_message(&error, -r));
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering r = sd_bus_message_read(reply, "o", &path);
1dba654b27918c22e413ac5b3c19301f1ff86ad2Lennart Poettering r = show_machine_properties(bus, path, &new_line);
923d8fd381bced1c2d90ca53d18629d61a0f454aLennart Poettering r = show_machine_info(argv[0], bus, path, &new_line);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic void image_status_info_clear(ImageStatusInfo *info) {
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poetteringstatic void print_image_status_info(sd_bus *bus, ImageStatusInfo *i) {
eb9da376d76b48585b3b63b4f91903b54f7abd36Lennart Poettering char ts_relative[FORMAT_TIMESTAMP_RELATIVE_MAX], *s1;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering char ts_absolute[FORMAT_TIMESTAMP_MAX], *s2;
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering char bs_exclusive[FORMAT_BYTES_MAX], *s4;
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering i->read_only ? ansi_highlight_red() : "",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering s1 = format_timestamp_relative(ts_relative, sizeof(ts_relative), i->crtime);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering s2 = format_timestamp(ts_absolute, sizeof(ts_absolute), i->crtime);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering s1 = format_timestamp_relative(ts_relative, sizeof(ts_relative), i->mtime);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering s2 = format_timestamp(ts_absolute, sizeof(ts_absolute), i->mtime);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering s3 = format_bytes(bs, sizeof(bs), i->usage);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering s4 = i->usage_exclusive != i->usage ? format_bytes(bs_exclusive, sizeof(bs_exclusive), i->usage_exclusive) : NULL;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering printf("\t Usage: %s (exclusive: %s)\n", s3, s4);
e56056e93d33619a3acf13e483900b4f8938228fThomas Hindoe Paaboel Andersen printf("\t Usage: %s\n", s3);
e56056e93d33619a3acf13e483900b4f8938228fThomas Hindoe Paaboel Andersen s3 = format_bytes(bs, sizeof(bs), i->limit);
e56056e93d33619a3acf13e483900b4f8938228fThomas Hindoe Paaboel Andersen s4 = i->limit_exclusive != i->limit ? format_bytes(bs_exclusive, sizeof(bs_exclusive), i->limit_exclusive) : NULL;
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering printf("\t Limit: %s (exclusive: %s)\n", s3, s4);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic int show_image_info(sd_bus *bus, const char *path, bool *new_line) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering static const struct bus_properties_map map[] = {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "Name", "s", NULL, offsetof(ImageStatusInfo, name) },
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "Path", "s", NULL, offsetof(ImageStatusInfo, path) },
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "Type", "s", NULL, offsetof(ImageStatusInfo, type) },
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "ReadOnly", "b", NULL, offsetof(ImageStatusInfo, read_only) },
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering { "CreationTimestamp", "t", NULL, offsetof(ImageStatusInfo, crtime) },
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering { "ModificationTimestamp", "t", NULL, offsetof(ImageStatusInfo, mtime) },
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering { "Usage", "t", NULL, offsetof(ImageStatusInfo, usage) },
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering { "Limit", "t", NULL, offsetof(ImageStatusInfo, limit) },
a7893c6b28772edbc7e1fea3c209caa54d465648Lennart Poettering { "UsageExclusive", "t", NULL, offsetof(ImageStatusInfo, usage_exclusive) },
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering { "LimitExclusive", "t", NULL, offsetof(ImageStatusInfo, limit_exclusive) },
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering _cleanup_(image_status_info_clear) ImageStatusInfo info = {};
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "org.freedesktop.machine1",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering return log_error_errno(r, "Could not get properties: %m");
04d39279245834494baccfdb9349db8bf80abd13Lennart Poetteringstatic void pool_status_info_clear(PoolStatusInfo *info) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic void print_pool_status_info(sd_bus *bus, PoolStatusInfo *i) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering s = format_bytes(bs, sizeof(bs), i->usage);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering s = format_bytes(bs, sizeof(bs), i->limit);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering static const struct bus_properties_map map[] = {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "PoolPath", "s", NULL, offsetof(PoolStatusInfo, path) },
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "PoolUsage", "t", NULL, offsetof(PoolStatusInfo, usage) },
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering { "PoolLimit", "t", NULL, offsetof(PoolStatusInfo, limit) },
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering _cleanup_(pool_status_info_clear) PoolStatusInfo info = {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering "org.freedesktop.machine1",
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering return log_error_errno(r, "Could not get properties: %m");
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic int show_image_properties(sd_bus *bus, const char *path, bool *new_line) {
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering r = bus_print_all_properties(bus, "org.freedesktop.machine1", path, arg_property, arg_all);
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poettering log_error_errno(r, "Could not get properties: %m");
1ee306e1248866617c96ed9f4263f375588ad838Lennart Poetteringstatic int show_image(int argc, char *argv[], void *userdata) {
a1da85830bfaa77b9eb9c54693e5573559c97e50Tom Gundersen _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
if (properties)
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
&reply,
return bus_log_parse_error(r);
if (properties)
if (!arg_kill_who)
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
bool copy_from;
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
assert(m);
if (*forward) {
static int process_forward(sd_event *event, PTYForward **forward, int master, PTYForwardFlags flags, const char *name) {
char last_char = 0;
bool machine_died;
int ret = 0, r;
if (machine_died)
return ret;
return -EINVAL;
return -EOPNOTSUPP;
"path='/org/freedesktop/machine1',",
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
&reply,
return bus_log_parse_error(r);
return -EOPNOTSUPP;
return log_oom();
if (arg_uid)
else if (machine) {
const char *at;
if (at) {
"path='/org/freedesktop/machine1',",
bus,
"/org/freedesktop/machine1",
return bus_log_create_error(r);
return bus_log_create_error(r);
return bus_log_create_error(r);
return bus_log_create_error(r);
return bus_log_parse_error(r);
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
return -EINVAL;
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
return -EINVAL;
return log_oom();
return log_oom();
const char *object;
r = sd_bus_call_method(
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&error,
&reply,
return bus_log_parse_error(r);
return log_oom();
int carries_install_info = 0;
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
method);
return bus_log_create_error(r);
return bus_log_create_error(r);
return bus_log_create_error(r);
r = sd_bus_message_close_container(m);
return bus_log_create_error(r);
return bus_log_create_error(r);
return bus_log_parse_error(r);
r = sd_bus_call_method(
bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
&error,
NULL,
NULL);
unsigned priority;
assert(m);
assert(m);
static int transfer_signal_handler(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
assert(s);
if (!arg_quiet)
log_info("Continuing download in the background. Use \"machinectl cancel-transfer %" PRIu32 "\" to abort transfer.", PTR_TO_UINT32(userdata));
assert(m);
r = sd_bus_add_match(
bus,
"path='/org/freedesktop/import1'",
r = sd_bus_add_match(
bus,
return bus_log_parse_error(r);
if (!arg_quiet)
else if (path)
if (!local) {
return -EINVAL;
return log_oom();
return -EINVAL;
if (path) {
if (fd < 0)
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
else if (path)
if (!local) {
return -EINVAL;
return log_oom();
return -EINVAL;
if (path) {
if (fd < 0)
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
static void determine_compression_from_filename(const char *p) {
if (arg_format)
return -EINVAL;
if (path) {
if (fd < 0)
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
return -EINVAL;
if (path) {
if (fd < 0)
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
return -EINVAL;
local = l;
if (local) {
return log_oom();
return -EINVAL;
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
return -EINVAL;
local = l;
if (local) {
return log_oom();
return -EINVAL;
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
return bus_log_create_error(r);
return -EINVAL;
if (tag) {
tag++;
return -EINVAL;
return -EINVAL;
if (local)
local++;
if (local) {
return -EINVAL;
bus,
"/org/freedesktop/import1",
return bus_log_create_error(r);
tag,
return bus_log_create_error(r);
typedef struct TransferInfo {
const char *type;
const char *remote;
const char *local;
double progress;
} TransferInfo;
static int compare_transfer_info(const void *a, const void *b) {
const TransferInfo *x = a, *y = b;
double progress;
r = sd_bus_call_method(
bus,
"/org/freedesktop/import1",
&error,
&reply,
NULL);
return bus_log_parse_error(r);
while ((r = sd_bus_message_read(reply, "(usssdo)", &id, &type, &remote, &local, &progress, &object)) > 0) {
size_t l;
return log_oom();
if (l > max_type)
max_type = l;
if (l > max_remote)
max_remote = l;
if (l > max_local)
max_local = l;
n_transfers ++;
return bus_log_parse_error(r);
return bus_log_parse_error(r);
if (arg_legend)
for (j = 0; j < n_transfers; j++)
if (arg_legend)
r = sd_bus_call_method(
bus,
"/org/freedesktop/import1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
r = sd_bus_call_method(
bus,
"/org/freedesktop/machine1",
&error,
NULL,
" show [NAME...] Show properties of one or more VMs/containers\n"
" terminate NAME... Terminate one or more VMs/containers\n"
case ARG_VERSION:
return version();
return log_oom();
arg_all = true;
arg_all = true;
arg_full = true;
return -EINVAL;
if (arg_output < 0) {
return -EINVAL;
case ARG_NO_PAGER:
arg_no_pager = true;
case ARG_NO_LEGEND:
arg_legend = false;
case ARG_KILL_WHO:
if (arg_signal < 0) {
return -EINVAL;
case ARG_NO_ASK_PASSWORD:
arg_ask_password = false;
case ARG_READ_ONLY:
arg_read_only = true;
case ARG_MKDIR:
arg_mkdir = true;
arg_quiet = true;
case ARG_VERIFY:
if (arg_verify < 0) {
return -EINVAL;
case ARG_FORCE:
arg_force = true;
case ARG_DKR_INDEX_URL:
return -EINVAL;
case ARG_FORMAT:
return -EINVAL;
case ARG_UID:
case ARG_SETENV:
return -EINVAL;
return log_oom();
return -EINVAL;
log_open();
goto finish;
goto finish;
pager_close();