Re: PATCH: Add stub mode
- From: Dan Williams <dcbw redhat com>
- To: Pavel Simerda <psimerda redhat com>
- Cc: networkmanager-list gnome org
- Subject: Re: PATCH: Add stub mode
- Date: Mon, 30 Jul 2012 17:38:32 -0500
On Thu, 2012-07-26 at 04:03 -0400, Pavel Simerda wrote:
> Hi,
>
> this was a case with many applications in the past. And it is probably
> going to return at any time.
>
> It would be fine to have some connectivity status override in NetworkManager.conf
> to be able to fake the connectivity status. It would also be nice to have an option
> *not* to automatically connect to any networks (perhaps we have this already, but
> I don't see it).
>
> These two could make any advanced user happy. For ordinary users, NetworkManager should
> be usable (and apps should be fixed for those who don't use NM).
I think there are cleaner solutions to this though, rather than an
override. We're talking about those and hopefully will have plans for
that soon, but I don't think we'll explicitly work around broken
applications or require explicit user intervention like this case. This
is open source; somebody needs to fix the apps, or things never get
fixed.
Dan
> Pavel
>
>
> ----- Original Message -----
> > From: "Dan Williams" <dcbw redhat com>
> > To: "Ross Vandegrift" <ross kallisti us>
> > Cc: networkmanager-list gnome org
> > Sent: Wednesday, July 25, 2012 1:00:24 AM
> > Subject: Re: PATCH: Add stub mode
> >
> > 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
> > > networkmanager-list gnome org
> > > https://mail.gnome.org/mailman/listinfo/networkmanager-list
> >
> >
> > _______________________________________________
> > networkmanager-list mailing list
> > networkmanager-list gnome org
> > https://mail.gnome.org/mailman/listinfo/networkmanager-list
> >
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]