From 4242f18fb2b9ba6d3b7ebc9f6aa9b59aff0274aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= Date: Thu, 10 Feb 2011 01:31:30 +0100 Subject: [PATCH] cli: don't poke NetworkManager D-Bus service names when it's not running When getting status of NetworkManager via 'nmcli nm ...' and NetworkManager is not running, do not call its D-Bus methods. It prevents NM to be implicitly executed when configured as D-Bus activated service. --- cli/src/network-manager.c | 113 ++++++++++++++++++++++++++++++-------- cli/src/nmcli.c | 8 +-- 2 files changed, 94 insertions(+), 27 deletions(-) diff --git a/cli/src/network-manager.c b/cli/src/network-manager.c index cd7201cc13..3ccdc993d7 100644 --- a/cli/src/network-manager.c +++ b/cli/src/network-manager.c @@ -14,7 +14,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * (C) Copyright 2010 Red Hat, Inc. + * (C) Copyright 2010 - 2011 Red Hat, Inc. */ #include @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -99,12 +100,60 @@ nm_state_to_string (NMState state) } } +/* Find out whether NetworkManager is running (via D-Bus NameHasOwner), assuring + * NetworkManager won't be autostart (by D-Bus) if not running. + * We can't use NMClient (nm_client_get_manager_running()) here because NMClient + * constructor calls GetPermissions of NM_DBUS_SERVICE, which would autostart + * NetworkManger if it is configured as D-Bus launchable service. */ +static gboolean +is_nm_running (NmCli *nmc) +{ + DBusGConnection *connection = NULL; + DBusGProxy *proxy = NULL; + GError *err = NULL; + gboolean has_owner = FALSE; + + connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &err); + if (!connection) { + g_string_printf (nmc->return_text, _("Error: Couldn't connect to system bus: %s"), err->message); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_clear_error (&err); + goto done; + } + + proxy = dbus_g_proxy_new_for_name (connection, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus"); + if (!proxy) { + g_string_printf (nmc->return_text, _("Error: Couldn't create D-Bus object proxy for org.freedesktop.DBus")); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + goto done; + } + + if (!org_freedesktop_DBus_name_has_owner (proxy, NM_DBUS_SERVICE, &has_owner, &err)) { + g_string_printf (nmc->return_text, _("Error: NameHasOwner request failed: %s"), + (err && err->message) ? err->message : _("(unknown)")); + nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_clear_error (&err); + goto done; + } + +done: + if (connection) + dbus_g_connection_unref (connection); + if (proxy) + g_object_unref (proxy); + + return has_owner; +} + static NMCResultCode show_nm_status (NmCli *nmc) { gboolean nm_running; - gboolean net_enabled; - NMState state; + NMState state = NM_STATE_UNKNOWN; + const char *net_enabled_str; const char *wireless_hw_enabled_str, *wireless_enabled_str; const char *wwan_hw_enabled_str, *wwan_enabled_str; const char *wimax_hw_enabled_str, *wimax_enabled_str; @@ -116,8 +165,6 @@ show_nm_status (NmCli *nmc) guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0; guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0; - g_return_val_if_fail (nmc->client != NULL, NMC_RESULT_ERROR_UNKNOWN); - if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0) fields_str = fields_common; else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) @@ -142,10 +189,11 @@ show_nm_status (NmCli *nmc) nmc->print_fields.header_name = _("NetworkManager status"); print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ - nm_running = nm_client_get_manager_running (nmc->client); - state = nm_client_get_state (nmc->client); - net_enabled = nm_client_networking_get_enabled (nmc->client); + nm_running = is_nm_running (nmc); if (nm_running) { + nmc->get_client (nmc); /* create NMClient */ + state = nm_client_get_state (nmc->client); + net_enabled_str = nm_client_networking_get_enabled (nmc->client) ? _("enabled") : _("disabled"); wireless_hw_enabled_str = nm_client_wireless_hardware_get_enabled (nmc->client) ? _("enabled") : _("disabled"); wireless_enabled_str = nm_client_wireless_get_enabled (nmc->client) ? _("enabled") : _("disabled"); wwan_hw_enabled_str = nm_client_wwan_hardware_get_enabled (nmc->client) ? _("enabled") : _("disabled"); @@ -153,12 +201,13 @@ show_nm_status (NmCli *nmc) wimax_hw_enabled_str = nm_client_wimax_hardware_get_enabled (nmc->client) ? _("enabled") : _("disabled"); wimax_enabled_str = nm_client_wimax_get_enabled (nmc->client) ? _("enabled") : _("disabled"); } else { - wireless_hw_enabled_str = wireless_enabled_str = wwan_hw_enabled_str = wwan_enabled_str = wimax_hw_enabled_str = wimax_enabled_str = _("unknown"); + net_enabled_str = wireless_hw_enabled_str = wireless_enabled_str = + wwan_hw_enabled_str = wwan_enabled_str = wimax_hw_enabled_str = wimax_enabled_str = _("unknown"); } nmc->allowed_fields[0].value = nm_running ? _("running") : _("not running"); nmc->allowed_fields[1].value = nm_state_to_string (state); - nmc->allowed_fields[2].value = net_enabled ? _("enabled") : _("disabled"); + nmc->allowed_fields[2].value = net_enabled_str; nmc->allowed_fields[3].value = wireless_hw_enabled_str; nmc->allowed_fields[4].value = wireless_enabled_str; nmc->allowed_fields[5].value = wwan_hw_enabled_str; @@ -222,10 +271,6 @@ do_network_manager (NmCli *nmc, int argc, char **argv) guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0; guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0; - /* create NMClient */ - if (!nmc->get_client (nmc)) - goto end; - if (argc == 0) { if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error)) goto opt_error; @@ -254,9 +299,14 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES; nmc->print_fields.header_name = _("Networking enabled"); print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ - nmc->allowed_fields[2].value = nm_client_networking_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + + if (is_nm_running (nmc)) { + nmc->get_client (nmc); /* create NMClient */ + nmc->allowed_fields[2].value = nm_client_networking_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + } else + nmc->allowed_fields[2].value = _("unknown"); nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag; - print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ + print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */ } else { if (!strcmp (*argv, "true")) enable_net = TRUE; @@ -267,6 +317,7 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; goto end; } + nmc->get_client (nmc); /* create NMClient */ nm_client_networking_set_enabled (nmc->client, enable_net); } } @@ -303,9 +354,14 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES; nmc->print_fields.header_name = _("WiFi enabled"); print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ - nmc->allowed_fields[4].value = nm_client_wireless_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + + if (is_nm_running (nmc)) { + nmc->get_client (nmc); /* create NMClient */ + nmc->allowed_fields[4].value = nm_client_wireless_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + } else + nmc->allowed_fields[4].value = _("unknown"); nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag; - print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ + print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */ } else { if (!strcmp (*argv, "on")) enable_wifi = TRUE; @@ -316,6 +372,7 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; goto end; } + nmc->get_client (nmc); /* create NMClient */ nm_client_wireless_set_enabled (nmc->client, enable_wifi); } } @@ -335,9 +392,14 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES; nmc->print_fields.header_name = _("WWAN enabled"); print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ - nmc->allowed_fields[6].value = nm_client_wwan_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + + if (is_nm_running (nmc)) { + nmc->get_client (nmc); /* create NMClient */ + nmc->allowed_fields[6].value = nm_client_wwan_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + } else + nmc->allowed_fields[6].value = _("unknown"); nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag; - print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ + print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */ } else { if (!strcmp (*argv, "on")) enable_wwan = TRUE; @@ -348,6 +410,7 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; goto end; } + nmc->get_client (nmc); /* create NMClient */ nm_client_wwan_set_enabled (nmc->client, enable_wwan); } } @@ -367,9 +430,14 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES; nmc->print_fields.header_name = _("WiMAX enabled"); print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ - nmc->allowed_fields[8].value = nm_client_wimax_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + + if (is_nm_running (nmc)) { + nmc->get_client (nmc); /* create NMClient */ + nmc->allowed_fields[8].value = nm_client_wimax_get_enabled (nmc->client) ? _("enabled") : _("disabled"); + } else + nmc->allowed_fields[8].value = _("unknown"); nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag; - print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */ + print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */ } else { if (!strcmp (*argv, "on")) enable_wimax = TRUE; @@ -380,6 +448,7 @@ do_network_manager (NmCli *nmc, int argc, char **argv) nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; goto end; } + nmc->get_client (nmc); /* create NMClient */ nm_client_wimax_set_enabled (nmc->client, enable_wimax); } } diff --git a/cli/src/nmcli.c b/cli/src/nmcli.c index d416952c6c..4a54802441 100644 --- a/cli/src/nmcli.c +++ b/cli/src/nmcli.c @@ -16,7 +16,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * (C) Copyright 2010 Red Hat, Inc. + * (C) Copyright 2010 - 2011 Red Hat, Inc. */ /* Generated configuration file */ @@ -30,8 +30,6 @@ #include #include -#include -#include #include #include #include @@ -256,8 +254,8 @@ nmc_get_client (NmCli *nmc) if (!nmc->client) { nmc->client = nm_client_new (); if (!nmc->client) { - g_string_printf (nmc->return_text, _("Error: Could not connect to NetworkManager.")); - nmc->return_value = NMC_RESULT_ERROR_UNKNOWN; + g_critical (_("Error: Could not create NMClient object.")); + exit (NMC_RESULT_ERROR_UNKNOWN); } }