Re: PATCH: Add stub mode



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).

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]