summary refs log tree commit diff
path: root/src/nm-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nm-manager.c')
-rw-r--r--src/nm-manager.c519
1 files changed, 244 insertions, 275 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c
index dc394a49..289a91d6 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -154,7 +154,6 @@ enum {
 	INTERNAL_DEVICE_REMOVED,
 	STATE_CHANGED,
 	CHECK_PERMISSIONS,
-	USER_PERMISSIONS_CHANGED,
 	ACTIVE_CONNECTION_ADDED,
 	ACTIVE_CONNECTION_REMOVED,
 	CONFIGURE_QUIT,
@@ -164,8 +163,7 @@ enum {
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
-enum {
-	PROP_0,
+NM_GOBJECT_PROPERTIES_DEFINE (NMManager,
 	PROP_VERSION,
 	PROP_STATE,
 	PROP_STATE_FILE,
@@ -190,9 +188,7 @@ enum {
 	/* Not exported */
 	PROP_HOSTNAME,
 	PROP_SLEEPING,
-
-	LAST_PROP
-};
+);
 
 NM_DEFINE_SINGLETON_INSTANCE (NMManager);
 
@@ -287,7 +283,7 @@ _active_connection_cleanup (gpointer user_data)
 		iter = iter->next;
 		if (nm_active_connection_get_state (ac) == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) {
 			if (active_connection_remove (self, ac))
-				g_object_notify (G_OBJECT (self), NM_MANAGER_ACTIVE_CONNECTIONS);
+				_notify (self, PROP_ACTIVE_CONNECTIONS);
 		}
 	}
 	g_object_thaw_notify (G_OBJECT (self));
@@ -359,7 +355,7 @@ active_connection_add (NMManager *self, NMActiveConnection *active)
 
 	/* Only notify D-Bus if the active connection is actually exported */
 	if (nm_exported_object_is_exported (NM_EXPORTED_OBJECT (active)))
-		g_object_notify (G_OBJECT (self), NM_MANAGER_ACTIVE_CONNECTIONS);
+		_notify (self, PROP_ACTIVE_CONNECTIONS);
 }
 
 const GSList *
@@ -458,7 +454,7 @@ _config_changed_cb (NMConfig *config, NMConfigData *config_data, NMConfigChangeF
 	              NULL);
 
 	if (NM_FLAGS_HAS (changes, NM_CONFIG_CHANGE_GLOBAL_DNS_CONFIG))
-		g_object_notify (G_OBJECT (self), NM_MANAGER_GLOBAL_DNS_CONFIGURATION);
+		_notify (self, PROP_GLOBAL_DNS_CONFIGURATION);
 }
 
 /************************************************************************/
@@ -622,7 +618,7 @@ set_state (NMManager *self, NMState state)
 
 	_LOGI (LOGD_CORE, "NetworkManager state is now %s", _nm_state_to_string (state));
 
-	g_object_notify (G_OBJECT (self), NM_MANAGER_STATE);
+	_notify (self, PROP_STATE);
 	g_signal_emit (self, signals[STATE_CHANGED], 0, priv->state);
 }
 
@@ -641,7 +637,7 @@ checked_connectivity (GObject *object, GAsyncResult *result, gpointer user_data)
 		else if (   connectivity == NM_CONNECTIVITY_PORTAL
 		         || connectivity == NM_CONNECTIVITY_LIMITED)
 			set_state (manager, NM_STATE_CONNECTED_SITE);
-		g_object_notify (G_OBJECT (manager), NM_MANAGER_CONNECTIVITY);
+		_notify (manager, PROP_CONNECTIVITY);
 	}
 
 	g_object_unref (manager);
@@ -710,7 +706,7 @@ nm_manager_update_metered (NMManager *self)
 	if (value != priv->metered) {
 		priv->metered = value;
 		_LOGD (LOGD_CORE, "new metered value: %d", (int) priv->metered);
-		g_object_notify (G_OBJECT (self), NM_MANAGER_METERED);
+		_notify (self, PROP_METERED);
 	}
 }
 
@@ -756,7 +752,7 @@ manager_device_state_changed (NMDevice *device,
 	case NM_DEVICE_STATE_DISCONNECTED:
 	case NM_DEVICE_STATE_PREPARE:
 	case NM_DEVICE_STATE_FAILED:
-		g_object_notify (G_OBJECT (self), NM_MANAGER_ACTIVE_CONNECTIONS);
+		_notify (self, PROP_ACTIVE_CONNECTIONS);
 		break;
 	default:
 		break;
@@ -801,7 +797,7 @@ check_if_startup_complete (NMManager *self)
 	_LOGI (LOGD_CORE, "startup complete");
 
 	priv->startup = FALSE;
-	g_object_notify (G_OBJECT (self), "startup");
+	_notify (self, PROP_STARTUP);
 
 	/* We don't have to watch notify::has-pending-action any more. */
 	for (iter = priv->devices; iter; iter = iter->next) {
@@ -873,12 +869,13 @@ remove_device (NMManager *self,
 	priv->devices = g_slist_remove (priv->devices, device);
 
 	if (nm_device_is_real (device)) {
-		g_signal_emit (self, signals[DEVICE_REMOVED], 0, device);
-		g_object_notify (G_OBJECT (self), NM_MANAGER_DEVICES);
 		nm_device_removed (device);
+
+		g_signal_emit (self, signals[DEVICE_REMOVED], 0, device);
+		_notify (self, PROP_DEVICES);
 	}
 	g_signal_emit (self, signals[INTERNAL_DEVICE_REMOVED], 0, device);
-	g_object_notify (G_OBJECT (self), NM_MANAGER_ALL_DEVICES);
+	_notify (self, PROP_ALL_DEVICES);
 
 	nm_exported_object_clear_and_unexport (&device);
 
@@ -1234,7 +1231,7 @@ system_hostname_changed_cb (NMSettings *settings,
 
 	g_free (priv->hostname);
 	priv->hostname = hostname;
-	g_object_notify (G_OBJECT (self), NM_MANAGER_HOSTNAME);
+	_notify (self, PROP_HOSTNAME);
 
 	nm_dhcp_manager_set_default_hostname (nm_dhcp_manager_get (), priv->hostname);
 }
@@ -1798,7 +1795,7 @@ device_realized (NMDevice *device,
 {
 	/* Emit D-Bus signals */
 	g_signal_emit (self, signals[DEVICE_ADDED], 0, device);
-	g_object_notify (G_OBJECT (self), NM_MANAGER_DEVICES);
+	_notify (self, PROP_DEVICES);
 }
 
 static void
@@ -1930,7 +1927,7 @@ add_device (NMManager *self, NMDevice *device, GError **error)
 
 	nm_settings_device_added (priv->settings, device);
 	g_signal_emit (self, signals[INTERNAL_DEVICE_ADDED], 0, device);
-	g_object_notify (G_OBJECT (self), NM_MANAGER_ALL_DEVICES);
+	_notify (self, PROP_ALL_DEVICES);
 
 	for (iter = priv->devices; iter; iter = iter->next) {
 		NMDevice *d = iter->data;
@@ -2009,7 +2006,6 @@ platform_link_added (NMManager *self,
 {
 	NMDeviceFactory *factory;
 	NMDevice *device = NULL;
-	GError *error = NULL;
 	gboolean nm_plugin_missing = FALSE;
 	GSList *iter;
 
@@ -2022,6 +2018,7 @@ platform_link_added (NMManager *self,
 	for (iter = NM_MANAGER_GET_PRIVATE (self)->devices; iter; iter = iter->next) {
 		NMDevice *candidate = iter->data;
 		gboolean compatible = TRUE;
+		gs_free_error GError *error = NULL;
 
 		if (strcmp (nm_device_get_iface (candidate), plink->name))
 			continue;
@@ -2039,7 +2036,6 @@ platform_link_added (NMManager *self,
 
 		_LOGD (LOGD_DEVICE, "(%s): failed to realize from plink: '%s'",
 		       plink->name, error->message);
-		g_clear_error (&error);
 
 		/* Try next unrealized device */
 	}
@@ -2048,13 +2044,13 @@ platform_link_added (NMManager *self,
 	factory = nm_device_factory_manager_find_factory_for_link_type (plink->type);
 	if (factory) {
 		gboolean ignore = FALSE;
+		gs_free_error GError *error = NULL;
 
 		device = nm_device_factory_create_device (factory, plink->name, plink, NULL, &ignore, &error);
 		if (!device) {
 			if (!ignore) {
 				_LOGW (LOGD_HW, "%s: factory failed to create device: %s",
 				       plink->name, error->message);
-				g_clear_error (&error);
 			}
 			return;
 		}
@@ -2078,6 +2074,8 @@ platform_link_added (NMManager *self,
 	}
 
 	if (device) {
+		gs_free_error GError *error = NULL;
+
 		if (nm_plugin_missing)
 			nm_device_set_nm_plugin_missing (device, TRUE);
 		if (nm_device_realize_start (device, plink, NULL, &error)) {
@@ -2086,7 +2084,6 @@ platform_link_added (NMManager *self,
 		} else {
 			_LOGW (LOGD_DEVICE, "%s: failed to realize device: %s",
 			       plink->name, error->message);
-			g_clear_error (&error);
 		}
 		g_object_unref (device);
 	}
@@ -2389,9 +2386,8 @@ find_master (NMManager *self,
 		master_connection = nm_device_get_settings_connection (master_device);
 		if (master_connection && !is_compatible_with_slave (NM_CONNECTION (master_connection), connection)) {
 			g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_DEPENDENCY_FAILED,
-			             "The active connection on %s is not a valid master for '%s'",
-			             nm_device_get_iface (master_device),
-			             nm_connection_get_id (connection));
+			             "The active connection on %s is not compatible",
+			             nm_device_get_iface (master_device));
 			return FALSE;
 		}
 	} else {
@@ -2486,8 +2482,7 @@ ensure_master_active_connection (NMManager *self,
 		g_assert (!master_connection || master_connection == device_connection);
 		if (device_connection && !is_compatible_with_slave (NM_CONNECTION (device_connection), connection)) {
 			g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_DEPENDENCY_FAILED,
-			             "The active connection on %s is not a valid master for '%s'",
-			             nm_device_get_iface (master_device),
+			             "The active connection %s is not compatible",
 			             nm_connection_get_id (connection));
 			return NULL;
 		}
@@ -2526,8 +2521,6 @@ ensure_master_active_connection (NMManager *self,
 					                                            master_device,
 					                                            subject,
 					                                            error);
-					if (!master_ac)
-						g_prefix_error (error, "%s", "Master device activation failed: ");
 					g_slist_free (connections);
 					return master_ac;
 				}
@@ -2537,8 +2530,7 @@ ensure_master_active_connection (NMManager *self,
 			g_set_error (error,
 			             NM_MANAGER_ERROR,
 			             NM_MANAGER_ERROR_UNKNOWN_CONNECTION,
-			             "No compatible connection found for master device %s.",
-			             nm_device_get_iface (master_device));
+			             "No compatible connection found.");
 			return NULL;
 		}
 
@@ -2546,8 +2538,7 @@ ensure_master_active_connection (NMManager *self,
 		g_set_error (error,
 		             NM_MANAGER_ERROR,
 		             NM_MANAGER_ERROR_DEPENDENCY_FAILED,
-		             "Master device %s unmanaged or not available for activation",
-		             nm_device_get_iface (master_device));
+		             "Device unmanaged or not available for activation");
 	} else if (master_connection) {
 		gboolean found_device = FALSE;
 
@@ -2576,16 +2567,13 @@ ensure_master_active_connection (NMManager *self,
 			                                            candidate,
 			                                            subject,
 			                                            error);
-			if (!master_ac)
-				g_prefix_error (error, "%s", "Master device activation failed: ");
 			return master_ac;
 		}
 
 		g_set_error (error,
 		             NM_MANAGER_ERROR,
 		             NM_MANAGER_ERROR_UNKNOWN_DEVICE,
-		             "No compatible disconnected device found for master connection %s.",
-		             nm_settings_connection_get_uuid (master_connection));
+		             "No device available");
 	} else
 		g_assert_not_reached ();
 
@@ -2716,19 +2704,12 @@ autoconnect_slaves (NMManager *self,
 static gboolean
 _internal_activate_vpn (NMManager *self, NMActiveConnection *active, GError **error)
 {
-	gboolean success;
-
 	g_assert (NM_IS_VPN_CONNECTION (active));
 
 	nm_exported_object_export (NM_EXPORTED_OBJECT (active));
-	success = nm_vpn_manager_activate_connection (NM_MANAGER_GET_PRIVATE (self)->vpn_manager,
-	                                              NM_VPN_CONNECTION (active),
-	                                              error);
-	if (success)
-		g_object_notify (G_OBJECT (self), NM_MANAGER_ACTIVE_CONNECTIONS);
-	else
-		nm_exported_object_unexport (NM_EXPORTED_OBJECT (active));
-	return success;
+	return nm_vpn_manager_activate_connection (NM_MANAGER_GET_PRIVATE (self)->vpn_manager,
+	                                           NM_VPN_CONNECTION (active),
+	                                           error);
 }
 
 /* Traverse the device to disconnected state. This means that the device is ready
@@ -2890,8 +2871,11 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError *
 	/* Try to find the master connection/device if the connection has a dependency */
 	if (!find_master (self, applied, device,
 	                  &master_connection, &master_device, &master_ac,
-	                  error))
+	                  error)) {
+		g_prefix_error (error, "Can not find a master for %s: ",
+		                nm_settings_connection_get_id (connection));
 		return FALSE;
+	}
 
 	/* Ensure there's a master active connection the new connection we're
 	 * activating can depend on.
@@ -2910,8 +2894,10 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError *
 
 		/* Ensure eg bond slave and the candidate master is a bond master */
 		if (master_connection && !is_compatible_with_slave (NM_CONNECTION (master_connection), applied)) {
-			g_set_error_literal (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_DEPENDENCY_FAILED,
-			                     "The master connection was not compatible");
+			g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_DEPENDENCY_FAILED,
+			             "The master connection '%s' is not compatible with '%s'",
+			             nm_settings_connection_get_id (master_connection),
+			             nm_settings_connection_get_id (connection));
 			return FALSE;
 		}
 
@@ -2924,8 +2910,13 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError *
 			                                             master_device,
 			                                             error);
 			if (!master_ac) {
-				if (error)
-					g_assert (*error);
+				if (master_device) {
+					g_prefix_error (error, "Master device '%s' can't be activated: ",
+					                nm_device_get_ip_iface (device));
+				} else {
+					g_prefix_error (error, "Master connection '%s' can't be activated: ",
+					                nm_settings_connection_get_id (connection));
+				}
 				return FALSE;
 			}
 		}
@@ -2951,7 +2942,6 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError *
 
 	/* Export the new ActiveConnection to clients and start it on the device */
 	nm_exported_object_export (NM_EXPORTED_OBJECT (active));
-	g_object_notify (G_OBJECT (self), NM_MANAGER_ACTIVE_CONNECTIONS);
 	nm_device_queue_activation (device, NM_ACT_REQUEST (active));
 	return TRUE;
 }
@@ -3423,7 +3413,7 @@ impl_manager_activate_connection (NMManager *self,
 		device = nm_manager_get_device_by_path (self, device_path);
 		if (!device) {
 			error = g_error_new (NM_MANAGER_ERROR, NM_MANAGER_ERROR_UNKNOWN_DEVICE,
-			                     "Cannot activate unknown device %s", device_path);
+			                     "Can not activate an unknown device '%s'", device_path);
 			goto error;
 		}
 
@@ -3522,6 +3512,7 @@ activation_add_done (NMSettings *settings,
 	                            FALSE,
 	                            nm_active_connection_get_subject (active),
 	                            error->message);
+	g_object_unref (active);
 	g_clear_error (&local);
 }
 
@@ -3712,7 +3703,7 @@ nm_manager_deactivate_connection (NMManager *manager,
 	}
 
 	if (success)
-		g_object_notify (G_OBJECT (manager), NM_MANAGER_ACTIVE_CONNECTIONS);
+		_notify (manager, PROP_ACTIVE_CONNECTIONS);
 
 	return success;
 }
@@ -3903,8 +3894,13 @@ do_sleep_wake (NMManager *self, gboolean sleeping_changed)
 			NMDevice *device = NM_DEVICE (iter->data);
 			guint i;
 
-			if (nm_device_is_software (device))
+			if (nm_device_is_software (device)) {
+				/* We do not manage/unmanage software devices but
+				 * their dhcp leases could have gone stale so we need
+				 * to renew them */
+				nm_device_update_dynamic_ip_setup (device);
 				continue;
+			}
 
 			/* enable/disable wireless devices since that we don't respond
 			 * to killswitch changes during sleep.
@@ -3949,7 +3945,7 @@ _internal_sleep (NMManager *self, gboolean do_sleep)
 
 	do_sleep_wake (self, TRUE);
 
-	g_object_notify (G_OBJECT (self), NM_MANAGER_SLEEPING);
+	_notify (self, PROP_SLEEPING);
 }
 
 #if 0
@@ -4065,18 +4061,19 @@ static void
 _internal_enable (NMManager *self, gboolean enable)
 {
 	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
-	GError *err = NULL;
+	GError *error = NULL;
 
 	/* Update "NetworkingEnabled" key in state file */
 	if (priv->state_file) {
 		if (!write_value_to_state_file (priv->state_file,
 		                                "main", "NetworkingEnabled",
 		                                G_TYPE_BOOLEAN, (gpointer) &enable,
-		                                &err)) {
+		                                &error)) {
 			/* Not a hard error */
 			_LOGW (LOGD_SUSPEND, "writing to state file %s failed: %s",
 			       priv->state_file,
-			       err->message);
+			       error->message);
+			g_clear_error (&error);
 		}
 	}
 
@@ -4089,7 +4086,7 @@ _internal_enable (NMManager *self, gboolean enable)
 
 	do_sleep_wake (self, FALSE);
 
-	g_object_notify (G_OBJECT (self), NM_MANAGER_NETWORKING_ENABLED);
+	_notify (self, PROP_NETWORKING_ENABLED);
 }
 
 static void
@@ -4528,7 +4525,7 @@ connectivity_changed (NMConnectivity *connectivity,
 	       nm_connectivity_state_to_string (nm_connectivity_get_state (connectivity)));
 
 	nm_manager_update_state (self);
-	g_object_notify (G_OBJECT (self), NM_MANAGER_CONNECTIVITY);
+	_notify (self, PROP_CONNECTIVITY);
 }
 
 static void
@@ -4602,8 +4599,8 @@ policy_default_device_changed (GObject *object, GParamSpec *pspec, gpointer user
 			                  G_CALLBACK (connection_metered_changed), self);
 		}
 		_LOGD (LOGD_CORE, "PrimaryConnection now %s", ac ? nm_active_connection_get_settings_connection_id (ac) : "(none)");
-		g_object_notify (G_OBJECT (self), NM_MANAGER_PRIMARY_CONNECTION);
-		g_object_notify (G_OBJECT (self), NM_MANAGER_PRIMARY_CONNECTION_TYPE);
+		_notify (self, PROP_PRIMARY_CONNECTION);
+		_notify (self, PROP_PRIMARY_CONNECTION_TYPE);
 		nm_manager_update_metered (self);
 	}
 }
@@ -4637,7 +4634,7 @@ policy_activating_device_changed (GObject *object, GParamSpec *pspec, gpointer u
 		g_clear_object (&priv->activating_connection);
 		priv->activating_connection = ac ? g_object_ref (ac) : NULL;
 		_LOGD (LOGD_CORE, "ActivatingConnection now %s", ac ? nm_active_connection_get_settings_connection_id (ac) : "(none)");
-		g_object_notify (G_OBJECT (self), NM_MANAGER_ACTIVATING_CONNECTION);
+		_notify (self, PROP_ACTIVATING_CONNECTION);
 	}
 }
 
@@ -5544,144 +5541,124 @@ nm_manager_class_init (NMManagerClass *manager_class)
 	object_class->dispose = dispose;
 
 	/* properties */
-	g_object_class_install_property
-		(object_class, PROP_VERSION,
-		 g_param_spec_string (NM_MANAGER_VERSION, "", "",
-		                      NULL,
-		                      G_PARAM_READABLE |
-		                      G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property (object_class,
-	                                 PROP_STATE_FILE,
-	                                 g_param_spec_string (NM_MANAGER_STATE_FILE, "", "",
-	                                                      NULL,
-	                                                      G_PARAM_WRITABLE |
-	                                                      G_PARAM_CONSTRUCT_ONLY |
-	                                                      G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_STATE,
-		 g_param_spec_uint (NM_MANAGER_STATE, "", "",
-		                    0, NM_STATE_DISCONNECTED, 0,
-		                    G_PARAM_READABLE |
-		                    G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_STARTUP,
-		 g_param_spec_boolean (NM_MANAGER_STARTUP, "", "",
-		                       TRUE,
-		                       G_PARAM_READABLE |
-		                       G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_NETWORKING_ENABLED,
-		 g_param_spec_boolean (NM_MANAGER_NETWORKING_ENABLED, "", "",
-		                       TRUE,
-		                       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
-		                       G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_WIRELESS_ENABLED,
-		 g_param_spec_boolean (NM_MANAGER_WIRELESS_ENABLED, "", "",
-		                       TRUE,
-		                       G_PARAM_READWRITE |
-		                       G_PARAM_CONSTRUCT |
-		                       G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_WIRELESS_HARDWARE_ENABLED,
-		 g_param_spec_boolean (NM_MANAGER_WIRELESS_HARDWARE_ENABLED, "", "",
-		                       TRUE,
-		                       G_PARAM_READABLE |
-		                       G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_WWAN_ENABLED,
-		 g_param_spec_boolean (NM_MANAGER_WWAN_ENABLED, "", "",
-		                       TRUE,
-		                       G_PARAM_READWRITE |
-		                       G_PARAM_CONSTRUCT |
-		                       G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_WWAN_HARDWARE_ENABLED,
-		 g_param_spec_boolean (NM_MANAGER_WWAN_HARDWARE_ENABLED, "", "",
-		                       TRUE,
-		                       G_PARAM_READABLE |
-		                       G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_WIMAX_ENABLED,
-		 g_param_spec_boolean (NM_MANAGER_WIMAX_ENABLED, "", "",
-		                       TRUE,
-		                       G_PARAM_READWRITE |
-		                       G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_WIMAX_HARDWARE_ENABLED,
-		 g_param_spec_boolean (NM_MANAGER_WIMAX_HARDWARE_ENABLED, "", "",
-		                       TRUE,
-		                       G_PARAM_READABLE |
-		                       G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_ACTIVE_CONNECTIONS,
-		 g_param_spec_boxed (NM_MANAGER_ACTIVE_CONNECTIONS, "", "",
-		                     G_TYPE_STRV,
-		                     G_PARAM_READABLE |
-		                     G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_CONNECTIVITY,
-		 g_param_spec_uint (NM_MANAGER_CONNECTIVITY, "", "",
-		                    NM_CONNECTIVITY_UNKNOWN, NM_CONNECTIVITY_FULL, NM_CONNECTIVITY_UNKNOWN,
-		                    G_PARAM_READABLE |
-		                    G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_PRIMARY_CONNECTION,
-		 g_param_spec_string (NM_MANAGER_PRIMARY_CONNECTION, "", "",
-		                      NULL,
-		                      G_PARAM_READABLE |
-		                      G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_PRIMARY_CONNECTION_TYPE,
-		 g_param_spec_string (NM_MANAGER_PRIMARY_CONNECTION_TYPE, "", "",
-		                      NULL,
-		                      G_PARAM_READABLE |
-		                      G_PARAM_STATIC_STRINGS));
-
-
-	g_object_class_install_property
-		(object_class, PROP_ACTIVATING_CONNECTION,
-		 g_param_spec_string (NM_MANAGER_ACTIVATING_CONNECTION, "", "",
-		                      NULL,
-		                      G_PARAM_READABLE |
-		                      G_PARAM_STATIC_STRINGS));
+	obj_properties[PROP_VERSION] =
+	    g_param_spec_string (NM_MANAGER_VERSION, "", "",
+	                         NULL,
+	                         G_PARAM_READABLE |
+	                         G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_STATE_FILE] =
+	    g_param_spec_string (NM_MANAGER_STATE_FILE, "", "",
+	                         NULL,
+	                         G_PARAM_WRITABLE |
+	                         G_PARAM_CONSTRUCT_ONLY |
+	                         G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_STATE] =
+	    g_param_spec_uint (NM_MANAGER_STATE, "", "",
+	                       0, NM_STATE_DISCONNECTED, 0,
+	                       G_PARAM_READABLE |
+	                       G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_STARTUP] =
+	    g_param_spec_boolean (NM_MANAGER_STARTUP, "", "",
+	                          TRUE,
+	                          G_PARAM_READABLE |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_NETWORKING_ENABLED] =
+	    g_param_spec_boolean (NM_MANAGER_NETWORKING_ENABLED, "", "",
+	                          TRUE,
+	                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_WIRELESS_ENABLED] =
+	    g_param_spec_boolean (NM_MANAGER_WIRELESS_ENABLED, "", "",
+	                          TRUE,
+	                          G_PARAM_READWRITE |
+	                          G_PARAM_CONSTRUCT |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_WIRELESS_HARDWARE_ENABLED] =
+	    g_param_spec_boolean (NM_MANAGER_WIRELESS_HARDWARE_ENABLED, "", "",
+	                          TRUE,
+	                          G_PARAM_READABLE |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_WWAN_ENABLED] =
+	    g_param_spec_boolean (NM_MANAGER_WWAN_ENABLED, "", "",
+	                          TRUE,
+	                          G_PARAM_READWRITE |
+	                          G_PARAM_CONSTRUCT |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_WWAN_HARDWARE_ENABLED] =
+	    g_param_spec_boolean (NM_MANAGER_WWAN_HARDWARE_ENABLED, "", "",
+	                          TRUE,
+	                          G_PARAM_READABLE |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_WIMAX_ENABLED] =
+	    g_param_spec_boolean (NM_MANAGER_WIMAX_ENABLED, "", "",
+	                          TRUE,
+	                          G_PARAM_READWRITE |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_WIMAX_HARDWARE_ENABLED] =
+	    g_param_spec_boolean (NM_MANAGER_WIMAX_HARDWARE_ENABLED, "", "",
+	                          TRUE,
+	                          G_PARAM_READABLE |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_ACTIVE_CONNECTIONS] =
+	    g_param_spec_boxed (NM_MANAGER_ACTIVE_CONNECTIONS, "", "",
+	                        G_TYPE_STRV,
+	                        G_PARAM_READABLE |
+	                        G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_CONNECTIVITY] =
+	    g_param_spec_uint (NM_MANAGER_CONNECTIVITY, "", "",
+	                       NM_CONNECTIVITY_UNKNOWN, NM_CONNECTIVITY_FULL, NM_CONNECTIVITY_UNKNOWN,
+	                       G_PARAM_READABLE |
+	                       G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_PRIMARY_CONNECTION] =
+	    g_param_spec_string (NM_MANAGER_PRIMARY_CONNECTION, "", "",
+	                         NULL,
+	                         G_PARAM_READABLE |
+	                         G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_PRIMARY_CONNECTION_TYPE] =
+	    g_param_spec_string (NM_MANAGER_PRIMARY_CONNECTION_TYPE, "", "",
+	                         NULL,
+	                         G_PARAM_READABLE |
+	                         G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_ACTIVATING_CONNECTION] =
+	    g_param_spec_string (NM_MANAGER_ACTIVATING_CONNECTION, "", "",
+	                         NULL,
+	                         G_PARAM_READABLE |
+	                         G_PARAM_STATIC_STRINGS);
 
 	/* Hostname is not exported over D-Bus */
-	g_object_class_install_property
-		(object_class, PROP_HOSTNAME,
-		 g_param_spec_string (NM_MANAGER_HOSTNAME, "", "",
-		                      NULL,
-		                      G_PARAM_READABLE |
-		                      G_PARAM_STATIC_STRINGS));
+	obj_properties[PROP_HOSTNAME] =
+	    g_param_spec_string (NM_MANAGER_HOSTNAME, "", "",
+	                         NULL,
+	                         G_PARAM_READABLE |
+	                         G_PARAM_STATIC_STRINGS);
 
 	/* Sleeping is not exported over D-Bus */
-	g_object_class_install_property
-		(object_class, PROP_SLEEPING,
-		 g_param_spec_boolean (NM_MANAGER_SLEEPING, "", "",
-		                       FALSE,
-		                       G_PARAM_READABLE |
-		                       G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_DEVICES,
-		 g_param_spec_boxed (NM_MANAGER_DEVICES, "", "",
-		                     G_TYPE_STRV,
-		                     G_PARAM_READABLE |
-		                     G_PARAM_STATIC_STRINGS));
+	obj_properties[PROP_SLEEPING] =
+	    g_param_spec_boolean (NM_MANAGER_SLEEPING, "", "",
+	                          FALSE,
+	                          G_PARAM_READABLE |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_DEVICES] =
+	    g_param_spec_boxed (NM_MANAGER_DEVICES, "", "",
+	                        G_TYPE_STRV,
+	                        G_PARAM_READABLE |
+	                        G_PARAM_STATIC_STRINGS);
 
 	/**
 	 * NMManager:metered:
@@ -5690,12 +5667,11 @@ nm_manager_class_init (NMManagerClass *manager_class)
 	 *
 	 * Since: 1.2
 	 **/
-	g_object_class_install_property
-		(object_class, PROP_METERED,
-		 g_param_spec_uint (NM_MANAGER_METERED, "", "",
-		                    0, G_MAXUINT32, NM_METERED_UNKNOWN,
-		                    G_PARAM_READABLE |
-		                    G_PARAM_STATIC_STRINGS));
+	obj_properties[PROP_METERED] =
+	    g_param_spec_uint (NM_MANAGER_METERED, "", "",
+	                       0, G_MAXUINT32, NM_METERED_UNKNOWN,
+	                       G_PARAM_READABLE |
+	                       G_PARAM_STATIC_STRINGS);
 
 	/**
 	 * NMManager:global-dns-configuration:
@@ -5704,13 +5680,12 @@ nm_manager_class_init (NMManagerClass *manager_class)
 	 *
 	 * Since: 1.2
 	 **/
-	g_object_class_install_property
-		(object_class, PROP_GLOBAL_DNS_CONFIGURATION,
-		 g_param_spec_variant (NM_MANAGER_GLOBAL_DNS_CONFIGURATION, "", "",
-		                       G_VARIANT_TYPE ("a{sv}"),
-		                       NULL,
-		                       G_PARAM_READWRITE |
-		                       G_PARAM_STATIC_STRINGS));
+	obj_properties[PROP_GLOBAL_DNS_CONFIGURATION] =
+	    g_param_spec_variant (NM_MANAGER_GLOBAL_DNS_CONFIGURATION, "", "",
+	                          G_VARIANT_TYPE ("a{sv}"),
+	                          NULL,
+	                          G_PARAM_READWRITE |
+	                          G_PARAM_STATIC_STRINGS);
 
 	/**
 	 * NMManager:all-devices:
@@ -5719,91 +5694,85 @@ nm_manager_class_init (NMManagerClass *manager_class)
 	 *
 	 * Since: 1.2
 	 **/
-	g_object_class_install_property
-		(object_class, PROP_ALL_DEVICES,
-		 g_param_spec_boxed (NM_MANAGER_ALL_DEVICES, "", "",
-		                     G_TYPE_STRV,
-		                     G_PARAM_READABLE |
-		                     G_PARAM_STATIC_STRINGS));
+	obj_properties[PROP_ALL_DEVICES] =
+	    g_param_spec_boxed (NM_MANAGER_ALL_DEVICES, "", "",
+	                        G_TYPE_STRV,
+	                        G_PARAM_READABLE |
+	                        G_PARAM_STATIC_STRINGS);
+
+	g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
 
 	/* signals */
 
 	/* D-Bus exported; emitted only for realized devices */
 	signals[DEVICE_ADDED] =
-		g_signal_new ("device-added",
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMManagerClass, device_added),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 1, NM_TYPE_DEVICE);
+	    g_signal_new (NM_MANAGER_DEVICE_ADDED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  G_STRUCT_OFFSET (NMManagerClass, device_added),
+	                  NULL, NULL, NULL,
+	                  G_TYPE_NONE, 1, NM_TYPE_DEVICE);
 
 	/* Emitted for both realized devices and placeholder devices */
 	signals[INTERNAL_DEVICE_ADDED] =
-		g_signal_new ("internal-device-added",
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST, 0,
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 1, G_TYPE_OBJECT);
+	    g_signal_new (NM_MANAGER_INTERNAL_DEVICE_ADDED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST, 0,
+	                  NULL, NULL, NULL,
+	                  G_TYPE_NONE, 1, G_TYPE_OBJECT);
 
 	/* D-Bus exported; emitted only for realized devices */
 	signals[DEVICE_REMOVED] =
-		g_signal_new ("device-removed",
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMManagerClass, device_removed),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 1, NM_TYPE_DEVICE);
+	    g_signal_new (NM_MANAGER_DEVICE_REMOVED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  G_STRUCT_OFFSET (NMManagerClass, device_removed),
+	                  NULL, NULL, NULL,
+	                  G_TYPE_NONE, 1, NM_TYPE_DEVICE);
 
 	/* Emitted for both realized devices and placeholder devices */
 	signals[INTERNAL_DEVICE_REMOVED] =
-		g_signal_new ("internal-device-removed",
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST, 0,
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 1, G_TYPE_OBJECT);
+	    g_signal_new (NM_MANAGER_INTERNAL_DEVICE_REMOVED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST, 0,
+	                  NULL, NULL, NULL,
+	                  G_TYPE_NONE, 1, G_TYPE_OBJECT);
 
 	signals[STATE_CHANGED] =
-		g_signal_new (NM_MANAGER_STATE_CHANGED,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMManagerClass, state_changed),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 1, G_TYPE_UINT);
+	    g_signal_new (NM_MANAGER_STATE_CHANGED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  G_STRUCT_OFFSET (NMManagerClass, state_changed),
+	                  NULL, NULL, NULL,
+	                  G_TYPE_NONE, 1, G_TYPE_UINT);
 
 	signals[CHECK_PERMISSIONS] =
-		g_signal_new ("check-permissions",
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              0, NULL, NULL, NULL,
-		              G_TYPE_NONE, 0);
-
-	signals[USER_PERMISSIONS_CHANGED] =
-		g_signal_new ("user-permissions-changed",
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              0, NULL, NULL, NULL,
-		              G_TYPE_NONE, 0);
+	    g_signal_new (NM_MANAGER_CHECK_PERMISSIONS,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 0);
 
 	signals[ACTIVE_CONNECTION_ADDED] =
-		g_signal_new (NM_MANAGER_ACTIVE_CONNECTION_ADDED,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              0, NULL, NULL, NULL,
-		              G_TYPE_NONE, 1, NM_TYPE_ACTIVE_CONNECTION);
+	    g_signal_new (NM_MANAGER_ACTIVE_CONNECTION_ADDED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 1, NM_TYPE_ACTIVE_CONNECTION);
 
 	signals[ACTIVE_CONNECTION_REMOVED] =
-		g_signal_new (NM_MANAGER_ACTIVE_CONNECTION_REMOVED,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              0, NULL, NULL, NULL,
-		              G_TYPE_NONE, 1, NM_TYPE_ACTIVE_CONNECTION);
+	    g_signal_new (NM_MANAGER_ACTIVE_CONNECTION_REMOVED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 1, NM_TYPE_ACTIVE_CONNECTION);
 
 	signals[CONFIGURE_QUIT] =
-		g_signal_new (NM_MANAGER_CONFIGURE_QUIT,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              0, NULL, NULL, NULL,
-		              G_TYPE_NONE, 0);
+	    g_signal_new (NM_MANAGER_CONFIGURE_QUIT,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 0);
 
 	nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (manager_class),
 	                                        NMDBUS_TYPE_MANAGER_SKELETON,