diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2017-10-21 16:05:14 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2017-11-09 10:12:15 +0100 |
commit | dece9f9ddaf9f73c5f6b62ccde6b42d39e20cc0a (patch) | |
tree | fcaf64544f8f828a269fb72a5fa46a865afb3718 | |
parent | a034a917e68c615a4b5b2002a87ae0f35d6599bf (diff) | |
download | NetworkManager-dece9f9ddaf9f73c5f6b62ccde6b42d39e20cc0a.tar.gz |
core: export checkpoint list over D-Bus
-rw-r--r-- | introspection/org.freedesktop.NetworkManager.xml | 7 | ||||
-rw-r--r-- | src/nm-checkpoint-manager.c | 44 | ||||
-rw-r--r-- | src/nm-checkpoint-manager.h | 4 | ||||
-rw-r--r-- | src/nm-manager.c | 16 | ||||
-rw-r--r-- | src/nm-manager.h | 1 |
5 files changed, 68 insertions, 4 deletions
diff --git a/introspection/org.freedesktop.NetworkManager.xml b/introspection/org.freedesktop.NetworkManager.xml index dceea7f21f..26a618c1bf 100644 --- a/introspection/org.freedesktop.NetworkManager.xml +++ b/introspection/org.freedesktop.NetworkManager.xml @@ -270,6 +270,13 @@ <property name="AllDevices" type="ao" access="read"/> <!-- + Checkpoints: + + The list of active checkpoints. + --> + <property name="Checkpoints" type="ao" access="read"/> + + <!-- NetworkingEnabled: Indicates if overall networking is currently enabled or not. See the diff --git a/src/nm-checkpoint-manager.c b/src/nm-checkpoint-manager.c index 92872c45f9..a205854be4 100644 --- a/src/nm-checkpoint-manager.c +++ b/src/nm-checkpoint-manager.c @@ -35,6 +35,7 @@ struct _NMCheckpointManager { NMManager *_manager; + GParamSpec *property_spec; GHashTable *checkpoints; CList list; guint rollback_timeout_id; @@ -66,6 +67,12 @@ typedef struct { static void update_rollback_timeout (NMCheckpointManager *self); static void +notify_checkpoints (NMCheckpointManager *self) { + g_object_notify_by_pspec ((GObject *) GET_MANAGER (self), + self->property_spec); +} + +static void item_destroy (gpointer data) { CheckpointItem *item = data; @@ -83,6 +90,7 @@ rollback_timeout_cb (NMCheckpointManager *self) GVariant *result; gint64 ts, now; const char *path; + gboolean removed = FALSE; now = nm_utils_get_monotonic_timestamp_ms (); @@ -95,12 +103,16 @@ rollback_timeout_cb (NMCheckpointManager *self) path = nm_exported_object_get_path (NM_EXPORTED_OBJECT (item->checkpoint)); if (!g_hash_table_remove (self->checkpoints, path)) nm_assert_not_reached(); + removed = TRUE; } } self->rollback_timeout_id = 0; update_rollback_timeout (self); + if (removed) + notify_checkpoints (self); + return G_SOURCE_REMOVE; } @@ -230,6 +242,7 @@ nm_checkpoint_manager_create (NMCheckpointManager *self, item)) g_return_val_if_reached (NULL); + notify_checkpoints (self); update_rollback_timeout (self); return checkpoint; @@ -242,6 +255,7 @@ nm_checkpoint_manager_destroy_all (NMCheckpointManager *self, g_return_val_if_fail (self, FALSE); g_hash_table_remove_all (self->checkpoints); + notify_checkpoints (self); return TRUE; } @@ -259,7 +273,9 @@ nm_checkpoint_manager_destroy (NMCheckpointManager *self, if (!nm_streq (checkpoint_path, "/")) { ret = g_hash_table_remove (self->checkpoints, checkpoint_path); - if (!ret) { + if (ret) { + notify_checkpoints (self); + } else { g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_INVALID_ARGUMENTS, @@ -292,14 +308,37 @@ nm_checkpoint_manager_rollback (NMCheckpointManager *self, *results = nm_checkpoint_rollback (item->checkpoint); g_hash_table_remove (self->checkpoints, checkpoint_path); + notify_checkpoints (self); return TRUE; } +char ** +nm_checkpoint_manager_get_checkpoint_paths (NMCheckpointManager *self) +{ + CheckpointItem *item; + char **strv; + guint num, i = 0; + + num = g_hash_table_size (self->checkpoints); + if (!num) { + nm_assert (c_list_is_empty (&self->list)); + return NULL; + } + + strv = g_new (char *, num + 1); + c_list_for_each_entry (item, &self->list, list) + strv[i++] = g_strdup (nm_exported_object_get_path (NM_EXPORTED_OBJECT (item->checkpoint))); + nm_assert (i == num); + strv[i] = NULL; + + return strv; +} + /*****************************************************************************/ NMCheckpointManager * -nm_checkpoint_manager_new (NMManager *manager) +nm_checkpoint_manager_new (NMManager *manager, GParamSpec *spec) { NMCheckpointManager *self; @@ -316,6 +355,7 @@ nm_checkpoint_manager_new (NMManager *manager) self->_manager = manager; self->checkpoints = g_hash_table_new_full (nm_str_hash, g_str_equal, NULL, item_destroy); + self->property_spec = spec; c_list_init (&self->list); return self; diff --git a/src/nm-checkpoint-manager.h b/src/nm-checkpoint-manager.h index 30e490417e..4ff75303ed 100644 --- a/src/nm-checkpoint-manager.h +++ b/src/nm-checkpoint-manager.h @@ -27,7 +27,7 @@ typedef struct _NMCheckpointManager NMCheckpointManager; -NMCheckpointManager *nm_checkpoint_manager_new (NMManager *manager); +NMCheckpointManager *nm_checkpoint_manager_new (NMManager *manager, GParamSpec *spec); void nm_checkpoint_manager_unref (NMCheckpointManager *self); NMCheckpoint *nm_checkpoint_manager_create (NMCheckpointManager *self, @@ -47,4 +47,6 @@ gboolean nm_checkpoint_manager_rollback (NMCheckpointManager *self, GVariant **results, GError **error); +char **nm_checkpoint_manager_get_checkpoint_paths (NMCheckpointManager *self); + #endif /* __NM_CHECKPOINT_MANAGER_H__ */ diff --git a/src/nm-manager.c b/src/nm-manager.c index 2766e86aed..5e6dedcf82 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -220,6 +220,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMManager, PROP_METERED, PROP_GLOBAL_DNS_CONFIGURATION, PROP_ALL_DEVICES, + PROP_CHECKPOINTS, /* Not exported */ PROP_SLEEPING, @@ -5709,7 +5710,7 @@ _checkpoint_mgr_get (NMManager *self, gboolean create_as_needed) NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); if (G_UNLIKELY (!priv->checkpoint_mgr) && create_as_needed) - priv->checkpoint_mgr = nm_checkpoint_manager_new (self); + priv->checkpoint_mgr = nm_checkpoint_manager_new (self, obj_properties[PROP_CHECKPOINTS]); return priv->checkpoint_mgr; } @@ -6251,6 +6252,7 @@ get_property (GObject *object, guint prop_id, const NMGlobalDnsConfig *dns_config; const char *type; NMConnectivity *connectivity; + char **strv; switch (prop_id) { case PROP_VERSION: @@ -6337,6 +6339,12 @@ get_property (GObject *object, guint prop_id, case PROP_ALL_DEVICES: nm_utils_g_value_set_object_path_array (value, priv->devices, NULL, NULL); break; + case PROP_CHECKPOINTS: + strv = NULL; + if (priv->checkpoint_mgr) + strv = nm_checkpoint_manager_get_checkpoint_paths (priv->checkpoint_mgr); + g_value_take_boxed (value, strv); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -6691,6 +6699,12 @@ nm_manager_class_init (NMManagerClass *manager_class) G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + obj_properties[PROP_CHECKPOINTS] = + g_param_spec_boxed (NM_MANAGER_CHECKPOINTS, "", "", + G_TYPE_STRV, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties); /* signals */ diff --git a/src/nm-manager.h b/src/nm-manager.h index 418c5ea972..b4ec7b2688 100644 --- a/src/nm-manager.h +++ b/src/nm-manager.h @@ -54,6 +54,7 @@ #define NM_MANAGER_METERED "metered" #define NM_MANAGER_GLOBAL_DNS_CONFIGURATION "global-dns-configuration" #define NM_MANAGER_ALL_DEVICES "all-devices" +#define NM_MANAGER_CHECKPOINTS "checkpoints" /* Not exported */ #define NM_MANAGER_SLEEPING "sleeping" |