summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2017-10-21 16:05:14 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2017-11-09 10:12:15 +0100
commitdece9f9ddaf9f73c5f6b62ccde6b42d39e20cc0a (patch)
treefcaf64544f8f828a269fb72a5fa46a865afb3718
parenta034a917e68c615a4b5b2002a87ae0f35d6599bf (diff)
downloadNetworkManager-dece9f9ddaf9f73c5f6b62ccde6b42d39e20cc0a.tar.gz
core: export checkpoint list over D-Bus
-rw-r--r--introspection/org.freedesktop.NetworkManager.xml7
-rw-r--r--src/nm-checkpoint-manager.c44
-rw-r--r--src/nm-checkpoint-manager.h4
-rw-r--r--src/nm-manager.c16
-rw-r--r--src/nm-manager.h1
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"