On Thu, 2012-07-19 at 11:48 -0400, Ross Vandegrift wrote: > Hello all, > > My workstation's network setup is beyond the use-case that NM covers, > and so NM doesn't have any interfaces to manage. I'd disable it, but > an increasing number of apps refuse to do anything if NM doesn't report > that we're online. I couldn't find a central way to disable this, so I > implemented one.
Those apps are buggy if they refuse to do anything, but NetworkManager isn't actually running. What apps are these? Dan > Stub mode forces reporting that we have global connectivity. It must > be explicitly enabled by the user, and it doesn't interfere with any > device management. > > Patch below is against 0.9.5.95 (772d03fa). It works well enough to > get evolution, pidgin, iceweasel, etc to go ahead and do their jobs. > > Ross > > > man/NetworkManager.conf.5.in | 5 +++++ > src/main.c | 5 ++++- > src/nm-config.c | 21 ++++++++++++++++++--- > src/nm-config.h | 2 ++ > src/nm-manager.c | 18 ++++++++++++++++++ > src/nm-manager.h | 1 + > 6 files changed, 48 insertions(+), 4 deletions(-) > > diff --git a/man/NetworkManager.conf.5.in b/man/NetworkManager.conf.5.in > index 84b4d75..c53dc7d 100644 > --- a/man/NetworkManager.conf.5.in > +++ b/man/NetworkManager.conf.5.in > @@ -231,6 +231,11 @@ seconds. > .B response=\fI<response>\fP > If set controls what body content NetworkManager checks for when requesting > the > URI for connectivity checking. If missing, defaults to "NetworkManager is > online" > +.TP > +.B stub=\fI<true>\fP > +If set to true, NetworkManager will artificially force the network state to > +appear globally connected. Only useful on systems where connectivity is > managed > +by some other means, but which also require using apps that rely on > NetworkManager. > .SH "SEE ALSO" > .BR http://live.gnome.org/NetworkManager/SystemSettings > .sp > diff --git a/src/main.c b/src/main.c > index e8ff2e4..aa83fee 100644 > --- a/src/main.c > +++ b/src/main.c > @@ -357,6 +357,7 @@ main (int argc, char *argv[]) > char *connectivity_uri = NULL; > gint connectivity_interval = -1; > char *connectivity_response = NULL; > + gboolean connectivity_stub = FALSE; > gboolean wifi_enabled = TRUE, net_enabled = TRUE, wwan_enabled = TRUE, > wimax_enabled = TRUE; > gboolean success, show_version = FALSE; > NMPolicy *policy = NULL; > @@ -393,6 +394,7 @@ main (int argc, char *argv[]) > { "connectivity-uri", 0, 0, G_OPTION_ARG_STRING, > &connectivity_uri, "A http(s) address to check internet connectivity" }, > { "connectivity-interval", 0, 0, G_OPTION_ARG_INT, > &connectivity_interval, "the interval in seconds how often a connectivity > check will be done" }, > { "connectivity-response", 0, 0, G_OPTION_ARG_STRING, > &connectivity_response, "the expected start of the response" }, > + { "connectivity-stub", 0, 0, G_OPTION_ARG_NONE, > &connectivity_stub, _("Enable stub mode"), NULL }, > {NULL} > }; > > @@ -455,7 +457,7 @@ main (int argc, char *argv[]) > > /* Read the config file and CLI overrides */ > config = nm_config_new (config_path, plugins, log_level, log_domains, > - connectivity_uri, connectivity_interval, > connectivity_response, &error); > + connectivity_uri, connectivity_interval, > connectivity_response, connectivity_stub, &error); > if (config == NULL) { > fprintf (stderr, _("Failed to read configuration: (%d) %s\n"), > error ? error->code : -1, > @@ -593,6 +595,7 @@ main (int argc, char *argv[]) > nm_config_get_connectivity_uri (config), > nm_config_get_connectivity_interval (config), > nm_config_get_connectivity_response (config), > + nm_config_get_connectivity_stub (config), > &error); > if (manager == NULL) { > nm_log_err (LOGD_CORE, "failed to initialize the network > manager: %s", > diff --git a/src/nm-config.c b/src/nm-config.c > index f64b8bd..7476fca 100644 > --- a/src/nm-config.c > +++ b/src/nm-config.c > @@ -37,6 +37,7 @@ struct NMConfig { > char *connectivity_uri; > guint connectivity_interval; > char *connectivity_response; > + gboolean connectivity_stub; > }; > > /************************************************************************/ > @@ -124,6 +125,13 @@ nm_config_get_connectivity_response (NMConfig *config) > return config->connectivity_response; > } > > +const gboolean > +nm_config_get_connectivity_stub (NMConfig *config) > +{ > + g_return_val_if_fail (config != NULL, -1); > + > + return config->connectivity_stub; > +} > > /************************************************************************/ > > @@ -136,6 +144,7 @@ fill_from_file (NMConfig *config, > const char *cli_connectivity_uri, > const gint cli_connectivity_interval, > const char *cli_connectivity_response, > + const gboolean cli_connectivity_stub, > GError **error) > { > GKeyFile *kf; > @@ -191,6 +200,11 @@ fill_from_file (NMConfig *config, > else > config->connectivity_response = g_key_file_get_value > (kf, "connectivity", "response", NULL); > > + if (cli_connectivity_stub) > + config->connectivity_stub = cli_connectivity_stub; > + else > + config->connectivity_stub = g_key_file_get_boolean (kf, > "connectivity", "stub", NULL); > + > success = TRUE; > } > > @@ -206,6 +220,7 @@ nm_config_new (const char *cli_config_path, > const char *cli_connectivity_uri, > const gint cli_connectivity_interval, > const char *cli_connectivity_response, > + const gboolean cli_connectivity_stub, > GError **error) > { > NMConfig *config; > @@ -216,7 +231,7 @@ nm_config_new (const char *cli_config_path, > if (cli_config_path) { > /* Bad user-specific config file path is a hard error */ > if (!fill_from_file (config, cli_config_path, cli_plugins, > cli_log_level, cli_log_domains, > - cli_connectivity_uri, > cli_connectivity_interval, cli_connectivity_response, > + cli_connectivity_uri, > cli_connectivity_interval, cli_connectivity_response, cli_connectivity_stub, > error)) { > nm_config_free (config); > return NULL; > @@ -233,7 +248,7 @@ nm_config_new (const char *cli_config_path, > > /* Try deprecated nm-system-settings.conf first */ > if (fill_from_file (config, NM_OLD_SYSTEM_CONF_FILE, cli_plugins, > cli_log_level, cli_log_domains, > - cli_connectivity_uri, cli_connectivity_interval, > cli_connectivity_response, > + cli_connectivity_uri, cli_connectivity_interval, > cli_connectivity_response, cli_connectivity_stub, > &local)) > return config; > > @@ -247,7 +262,7 @@ nm_config_new (const char *cli_config_path, > > /* Try the standard config file location next */ > if (fill_from_file (config, NM_DEFAULT_SYSTEM_CONF_FILE, cli_plugins, > cli_log_level, cli_log_domains, > - cli_connectivity_uri, cli_connectivity_interval, > cli_connectivity_response, > + cli_connectivity_uri, cli_connectivity_interval, > cli_connectivity_response, cli_connectivity_stub, > &local)) > return config; > > diff --git a/src/nm-config.h b/src/nm-config.h > index 6c4206c..068af52 100644 > --- a/src/nm-config.h > +++ b/src/nm-config.h > @@ -41,6 +41,7 @@ NMConfig *nm_config_new (const char *cli_config_path, > const char *cli_connectivity_check_uri, > const gint connectivity_check_interval, > const char *cli_connectivity_check_response, > + const gboolean > cli_connectivity_stub, > GError **error); > > const char *nm_config_get_path (NMConfig *config); > @@ -52,6 +53,7 @@ const char *nm_config_get_log_domains (NMConfig *config); > const char *nm_config_get_connectivity_uri (NMConfig *config); > const guint nm_config_get_connectivity_interval (NMConfig *config); > const char *nm_config_get_connectivity_response (NMConfig *config); > +const gboolean nm_config_get_connectivity_stub (NMConfig *config); > > void nm_config_free (NMConfig *config); > > diff --git a/src/nm-manager.c b/src/nm-manager.c > index f2816cd..af097e5 100644 > --- a/src/nm-manager.c > +++ b/src/nm-manager.c > @@ -215,6 +215,7 @@ typedef struct { > char *hostname; > > RadioState radio_states[RFKILL_TYPE_MAX]; > + gboolean stub; > gboolean sleeping; > gboolean net_enabled; > > @@ -343,6 +344,16 @@ nm_manager_get_device_by_master (NMManager *manager, > const char *master, const c > } > > static gboolean > +manager_stub (NMManager *self) > +{ > + NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); > + > + if (priv->stub) > + return TRUE; > + return FALSE; > +} > + > +static gboolean > manager_sleeping (NMManager *self) > { > NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); > @@ -433,6 +444,10 @@ nm_manager_update_state (NMManager *manager) > > if (manager_sleeping (manager)) > new_state = NM_STATE_ASLEEP; > + else if (manager_stub (manager)) { > + nm_log_info (LOGD_CORE, "stub mode enabled, forcing state to > connected."); > + new_state = NM_STATE_CONNECTED_GLOBAL; > + } > else { > for (iter = priv->devices; iter; iter = iter->next) { > NMDevice *dev = NM_DEVICE (iter->data); > @@ -3862,6 +3877,7 @@ nm_manager_new (NMSettings *settings, > const gchar *connectivity_uri, > gint connectivity_interval, > const gchar *connectivity_response, > + gboolean connectivity_stub, > GError **error) > { > NMManagerPrivate *priv; > @@ -3884,6 +3900,8 @@ nm_manager_new (NMSettings *settings, > G_CALLBACK (connectivity_changed), singleton); > #endif > > + priv->stub = connectivity_stub; > + > bus = nm_dbus_manager_get_connection (priv->dbus_mgr); > g_assert (bus); > dbus_connection = dbus_g_connection_get_connection (bus); > diff --git a/src/nm-manager.h b/src/nm-manager.h > index 58ba460..6bcbc85 100644 > --- a/src/nm-manager.h > +++ b/src/nm-manager.h > @@ -89,6 +89,7 @@ NMManager *nm_manager_new (NMSettings *settings, > const gchar *connectivity_uri, > gint connectivity_interval, > const gchar *connectivity_response, > + gboolean connectivity_stub, > GError **error); > > NMManager *nm_manager_get (void); > > _______________________________________________ > networkmanager-list mailing list > [email protected] > https://mail.gnome.org/mailman/listinfo/networkmanager-list _______________________________________________ networkmanager-list mailing list [email protected] https://mail.gnome.org/mailman/listinfo/networkmanager-list
