summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2017-10-21 16:05:19 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2017-10-21 16:05:19 +0200
commit5e01d85ddee16e8606a3289f78aa53d2ba7fb2f8 (patch)
tree2eba266e9e797c2f806603b6e552c58e4bf8076f
parent341bbc16d742036c52aae3276aed0645952b0b90 (diff)
downloadNetworkManager-5e01d85ddee16e8606a3289f78aa53d2ba7fb2f8.tar.gz
wip: libnm: add checkpoint supportbg/cli-checkpoint
-rw-r--r--Makefile.am2
-rw-r--r--introspection/org.freedesktop.NetworkManager.xml2
-rw-r--r--libnm-core/nm-dbus-interface.h1
-rw-r--r--libnm/libnm.ver4
-rw-r--r--libnm/nm-checkpoint.c212
-rw-r--r--libnm/nm-checkpoint.h62
-rw-r--r--libnm/nm-manager.c86
-rw-r--r--libnm/nm-manager.h25
-rw-r--r--libnm/nm-types.h1
9 files changed, 394 insertions, 1 deletions
diff --git a/Makefile.am b/Makefile.am
index ed455746f5..f055aebeca 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -717,6 +717,7 @@ libnm_lib_h_pub_real = \
libnm/NetworkManager.h \
libnm/nm-access-point.h \
libnm/nm-active-connection.h \
+ libnm/nm-checkpoint.h \
libnm/nm-client.h \
libnm/nm-device-adsl.h \
libnm/nm-device-bond.h \
@@ -769,6 +770,7 @@ libnm_lib_h_priv = \
libnm_lib_c_real = \
libnm/nm-access-point.c \
libnm/nm-active-connection.c \
+ libnm/nm-checkpoint.c \
libnm/nm-client.c \
libnm/nm-dbus-helpers.c \
libnm/nm-device-adsl.c \
diff --git a/introspection/org.freedesktop.NetworkManager.xml b/introspection/org.freedesktop.NetworkManager.xml
index 0b5d4d230a..408d30e292 100644
--- a/introspection/org.freedesktop.NetworkManager.xml
+++ b/introspection/org.freedesktop.NetworkManager.xml
@@ -269,7 +269,7 @@
-->
<property name="AllDevices" type="ao" access="read"/>
- <!--
+ <!--
Checkpoints:
The list of active checkpoints.
diff --git a/libnm-core/nm-dbus-interface.h b/libnm-core/nm-dbus-interface.h
index 8b92dbe7e6..ab23af7079 100644
--- a/libnm-core/nm-dbus-interface.h
+++ b/libnm-core/nm-dbus-interface.h
@@ -73,6 +73,7 @@
#define NM_DBUS_INTERFACE_DEVICE_GRE NM_DBUS_INTERFACE_DEVICE ".Gre"
#define NM_DBUS_INTERFACE_DEVICE_IP_TUNNEL NM_DBUS_INTERFACE_DEVICE ".IPTunnel"
#define NM_DBUS_INTERFACE_DEVICE_STATISTICS NM_DBUS_INTERFACE_DEVICE ".Statistics"
+#define NM_DBUS_INTERFACE_CHECKPOINT NM_DBUS_PATH "/Checkpoint"
#define NM_DBUS_INTERFACE_SETTINGS "org.freedesktop.NetworkManager.Settings"
#define NM_DBUS_PATH_SETTINGS "/org/freedesktop/NetworkManager/Settings"
diff --git a/libnm/libnm.ver b/libnm/libnm.ver
index 0fd28beecd..1894a12cf8 100644
--- a/libnm/libnm.ver
+++ b/libnm/libnm.ver
@@ -1182,6 +1182,10 @@ libnm_1_10_0 {
global:
nm_activation_state_flags_get_type;
nm_active_connection_get_state_flags;
+ nm_checkpoint_get_type;
+ nm_checkpoint_get_created;
+ nm_checkpoint_get_devices;
+ nm_checkpoint_get_rollback_timeout;
nm_client_connectivity_check_get_available;
nm_client_connectivity_check_get_enabled;
nm_client_connectivity_check_set_enabled;
diff --git a/libnm/nm-checkpoint.c b/libnm/nm-checkpoint.c
new file mode 100644
index 0000000000..23a51d776a
--- /dev/null
+++ b/libnm/nm-checkpoint.c
@@ -0,0 +1,212 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 2017 Red Hat, Inc.
+ */
+
+#include "nm-default.h"
+
+#include "nm-checkpoint.h"
+#include "nm-core-internal.h"
+#include "nm-dbus-interface.h"
+#include "nm-device.h"
+#include "nm-object-private.h"
+
+G_DEFINE_TYPE (NMCheckpoint, nm_checkpoint, NM_TYPE_OBJECT)
+
+#define NM_CHECKPOINT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CHECKPOINT, NMCheckpointPrivate))
+
+typedef struct {
+ GPtrArray *devices;
+ gint64 created;
+ guint32 rollback_timeout;
+} NMCheckpointPrivate;
+
+enum {
+ PROP_0,
+ PROP_DEVICES,
+ PROP_CREATED,
+ PROP_ROLLBACK_TIMEOUT,
+
+ LAST_PROP
+};
+
+/**
+ * nm_checkpoint_get_devices:
+ * @checkpoint: a #NMCheckpoint
+ *
+ * The devices that are part of this checkpoint.
+ *
+ * Returns: the devices list.
+ *
+ * Since: 1.10
+ **/
+const GPtrArray *
+nm_checkpoint_get_devices (NMCheckpoint *checkpoint)
+{
+ g_return_val_if_fail (NM_IS_CHECKPOINT (checkpoint), 0);
+
+ return NM_CHECKPOINT_GET_PRIVATE (checkpoint)->devices;
+}
+
+/**
+ * nm_checkpoint_get_created:
+ * @checkpoint: a #NMCheckpoint
+ *
+ * Gets the the timestamp (in CLOCK_BOOTTIME milliseconds)
+ * of checkpoint creation.
+ *
+ * Returns: the timestamp of checkpoint creation.
+ *
+ * Since: 1.10
+ **/
+gint64
+nm_checkpoint_get_created (NMCheckpoint *checkpoint)
+{
+ g_return_val_if_fail (NM_IS_CHECKPOINT (checkpoint), 0);
+
+ return NM_CHECKPOINT_GET_PRIVATE (checkpoint)->created;
+}
+
+/**
+ * nm_checkpoint_get_rollback timeout:
+ * @checkpoint: a #NMCheckpoint
+ *
+ * Gets the the timeout in seconds for automatic rollback.
+ *
+ * Returns: the rollback timeout.
+ *
+ * Since: 1.10
+ **/
+guint32
+nm_checkpoint_get_rollback_timeout (NMCheckpoint *checkpoint)
+{
+ g_return_val_if_fail (NM_IS_CHECKPOINT (checkpoint), 0);
+
+ return NM_CHECKPOINT_GET_PRIVATE (checkpoint)->rollback_timeout;
+}
+
+/*****************************************************************************/
+
+static void
+nm_checkpoint_init (NMCheckpoint *checkpoint)
+{
+}
+
+static void
+finalize (GObject *object)
+{
+ NMCheckpointPrivate *priv = NM_CHECKPOINT_GET_PRIVATE (object);
+
+ g_ptr_array_unref (priv->devices);
+
+ G_OBJECT_CLASS (nm_checkpoint_parent_class)->finalize (object);
+}
+
+static void
+get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NMCheckpoint *checkpoint = NM_CHECKPOINT (object);
+ NMCheckpointPrivate *priv = NM_CHECKPOINT_GET_PRIVATE (checkpoint);
+
+ switch (prop_id) {
+ case PROP_DEVICES:
+ g_value_take_boxed (value, _nm_utils_copy_object_array (priv->devices));
+ break;
+ case PROP_CREATED:
+ g_value_set_int64 (value, priv->created);
+ break;
+ case PROP_ROLLBACK_TIMEOUT:
+ g_value_set_flags (value, priv->rollback_timeout);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+init_dbus (NMObject *object)
+{
+ NMCheckpointPrivate *priv = NM_CHECKPOINT_GET_PRIVATE (object);
+ const NMPropertiesInfo property_info[] = {
+ { NM_CHECKPOINT_DEVICES, &priv->devices, NULL, NM_TYPE_DEVICE, "device" },
+ { NM_CHECKPOINT_CREATED, &priv->created },
+ { NM_CHECKPOINT_ROLLBACK_TIMEOUT, &priv->rollback_timeout },
+ { NULL },
+ };
+
+ NM_OBJECT_CLASS (nm_checkpoint_parent_class)->init_dbus (object);
+
+ _nm_object_register_properties (object,
+ NM_DBUS_INTERFACE_CHECKPOINT,
+ property_info);
+}
+
+
+static void
+nm_checkpoint_class_init (NMCheckpointClass *checkpoint_class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (checkpoint_class);
+ NMObjectClass *nm_object_class = NM_OBJECT_CLASS (checkpoint_class);
+
+ g_type_class_add_private (checkpoint_class, sizeof (NMCheckpointPrivate));
+
+ object_class->get_property = get_property;
+ object_class->finalize = finalize;
+
+ nm_object_class->init_dbus = init_dbus;
+
+ /**
+ * NMCheckpoint:devices:
+ *
+ * The devices.
+ *
+ * Since: 1.10
+ **/
+ g_object_class_install_property
+ (object_class, PROP_DEVICES,
+ g_param_spec_boxed (NM_CHECKPOINT_DEVICES, "", "",
+ G_TYPE_PTR_ARRAY,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMCheckpoint:created:
+ *
+ * The timestamp (in CLOCK_BOOTTIME milliseconds) of checkpoint creation.
+ *
+ * Since: 1.10
+ **/
+ g_object_class_install_property
+ (object_class, PROP_CREATED,
+ g_param_spec_int64 (NM_CHECKPOINT_CREATED, "", "",
+ G_MININT64, G_MAXINT64, 0,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMCheckpoint:rollback-timeout:
+ *
+ * Timeout in seconds for automatic rollback, or zero.
+ *
+ * Since: 1.10
+ **/
+ g_object_class_install_property
+ (object_class, PROP_ROLLBACK_TIMEOUT,
+ g_param_spec_uint (NM_CHECKPOINT_ROLLBACK_TIMEOUT, "", "",
+ 0, G_MAXUINT32, 0,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+}
diff --git a/libnm/nm-checkpoint.h b/libnm/nm-checkpoint.h
new file mode 100644
index 0000000000..71ecce7c0a
--- /dev/null
+++ b/libnm/nm-checkpoint.h
@@ -0,0 +1,62 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 2017 Red Hat, Inc.
+ */
+
+#ifndef __NM_CHECKPOINT_H__
+#define __NM_CHECKPOINT_H__
+
+#if !defined (__NETWORKMANAGER_H_INSIDE__) && !defined (NETWORKMANAGER_COMPILATION)
+#error "Only <NetworkManager.h> can be included directly."
+#endif
+
+#include "nm-object.h"
+
+G_BEGIN_DECLS
+
+#define NM_TYPE_CHECKPOINT (nm_checkpoint_get_type ())
+#define NM_CHECKPOINT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CHECKPOINT, NMCheckpoint))
+#define NM_CHECKPOINT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_CHECKPOINT, NMCheckpointClass))
+#define NM_IS_CHECKPOINT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_CHECKPOINT))
+#define NM_IS_CHECKPOINT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_CHECKPOINT))
+#define NM_CHECKPOINT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_CHECKPOINT, NMCheckpointClass))
+
+#define NM_CHECKPOINT_DEVICES "devices"
+#define NM_CHECKPOINT_CREATED "created"
+#define NM_CHECKPOINT_ROLLBACK_TIMEOUT "rollback-timeout"
+
+/**
+ * NMCheckpoint:
+ */
+struct _NMCheckpoint {
+ NMObject parent;
+};
+
+typedef struct {
+ NMObjectClass parent;
+
+ /*< private >*/
+ gpointer padding[4];
+} NMCheckpointClass;
+
+GType nm_checkpoint_get_type (void);
+
+NM_AVAILABLE_IN_1_10
+const GPtrArray *nm_checkpoint_get_devices (NMCheckpoint *checkpoint);
+NM_AVAILABLE_IN_1_10
+gint64 nm_checkpoint_get_created (NMCheckpoint *checkpoint);
+NM_AVAILABLE_IN_1_10
+guint32 nm_checkpoint_get_rollback_timeout (NMCheckpoint *checkpoint);
+
+G_END_DECLS
+
+#endif /* __NM_CHECKPOINT_H__ */
diff --git a/libnm/nm-manager.c b/libnm/nm-manager.c
index e664b71072..6f2b549891 100644
--- a/libnm/nm-manager.c
+++ b/libnm/nm-manager.c
@@ -61,6 +61,7 @@ typedef struct {
GPtrArray *devices;
GPtrArray *all_devices;
GPtrArray *active_connections;
+ GPtrArray *checkpoints;
NMConnectivityState connectivity;
NMActiveConnection *primary_connection;
NMActiveConnection *activating_connection;
@@ -107,6 +108,7 @@ enum {
PROP_PRIMARY_CONNECTION,
PROP_ACTIVATING_CONNECTION,
PROP_DEVICES,
+ PROP_CHECKPOINTS,
PROP_METERED,
PROP_ALL_DEVICES,
@@ -120,6 +122,8 @@ enum {
ANY_DEVICE_REMOVED,
ACTIVE_CONNECTION_ADDED,
ACTIVE_CONNECTION_REMOVED,
+ CHECKPOINT_ADDED,
+ CHECKPOINT_REMOVED,
PERMISSION_CHANGED,
LAST_SIGNAL
@@ -189,6 +193,7 @@ init_dbus (NMObject *object)
{ NM_MANAGER_PRIMARY_CONNECTION, &priv->primary_connection, NULL, NM_TYPE_ACTIVE_CONNECTION },
{ NM_MANAGER_ACTIVATING_CONNECTION, &priv->activating_connection, NULL, NM_TYPE_ACTIVE_CONNECTION },
{ NM_MANAGER_DEVICES, &priv->devices, NULL, NM_TYPE_DEVICE, "device" },
+ { NM_MANAGER_CHECKPOINTS, &priv->checkpoints, NULL, NM_TYPE_DEVICE, "checkpoint" },
{ NM_MANAGER_METERED, &priv->metered },
{ NM_MANAGER_ALL_DEVICES, &priv->all_devices, NULL, NM_TYPE_DEVICE, "any-device" },
{ NULL },
@@ -1208,6 +1213,61 @@ free_active_connections (NMManager *manager)
/*****************************************************************************/
+const GPtrArray *
+nm_manager_get_checkpoints (NMManager *manager)
+{
+ g_return_val_if_fail (NM_IS_MANAGER (manager), NULL);
+
+ return NM_MANAGER_GET_PRIVATE (manager)->checkpoints;
+}
+
+NMCheckpoint *
+nm_manager_checkpoint_create (NMManager *manager,
+ const GPtrArray *devices,
+ guint32 rollback_timeout,
+ NMCheckpointCreateFlags flags,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const char *path;
+ gboolean ret;
+ char *checkpoint_path;
+
+ g_return_val_if_fail (NM_IS_MANAGER (manager), FALSE);
+
+ ret = nmdbus_manager_call_checkpoint_create_sync (NM_MANAGER_GET_PRIVATE (manager)->proxy,
+ devices,
+ rollback_timeout,
+ flags,
+ &checkpoint_path,
+ cancellable,
+ error);
+ if (error && *error)
+ g_dbus_error_strip_remote_error (*error);
+ return ret;
+ return NULL;
+}
+
+gboolean
+nm_manager_checkpoint_destroy (NMManager *manager,
+ NMCheckpoint *checkpoint,
+ GCancellable *cancellable,
+ GError **error)
+{
+ return FALSE;
+}
+
+GHashTable *
+nm_manager_checkpoint_rollback (NMManager *manager,
+ NMCheckpoint *checkpoint,
+ GCancellable *cancellable,
+ GError **error)
+{
+ return NULL;
+}
+
+/*****************************************************************************/
+
static void
constructed (GObject *object)
{
@@ -1472,6 +1532,9 @@ get_property (GObject *object,
case PROP_DEVICES:
g_value_take_boxed (value, _nm_utils_copy_object_array (nm_manager_get_devices (self)));
break;
+ case PROP_CHECKPOINTS:
+ g_value_take_boxed (value, _nm_utils_copy_object_array (nm_manager_get_checkpoints (self)));
+ break;
case PROP_METERED:
g_value_set_uint (value, priv->metered);
break;
@@ -1612,6 +1675,12 @@ nm_manager_class_init (NMManagerClass *manager_class)
G_TYPE_PTR_ARRAY,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property
+ (object_class, PROP_CHECKPOINTS,
+ g_param_spec_boxed (NM_MANAGER_CHECKPOINTS, "", "",
+ G_TYPE_PTR_ARRAY,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
/**
* NMManager:metered:
*
@@ -1683,6 +1752,23 @@ nm_manager_class_init (NMManagerClass *manager_class)
NULL, NULL, NULL,
G_TYPE_NONE, 1,
G_TYPE_OBJECT);
+ signals[CHECKPOINT_ADDED] =
+ g_signal_new ("checkpoint-added",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, /* FIXME */
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 1,
+ G_TYPE_OBJECT);
+ signals[CHECKPOINT_REMOVED] =
+ g_signal_new ("checkpoint-removed",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, /* FIXME */
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 1,
+ G_TYPE_OBJECT);
+
signals[PERMISSION_CHANGED] =
g_signal_new ("permission-changed",
G_OBJECT_CLASS_TYPE (object_class),
diff --git a/libnm/nm-manager.h b/libnm/nm-manager.h
index 209a99a00c..948d3cfc25 100644
--- a/libnm/nm-manager.h
+++ b/libnm/nm-manager.h
@@ -51,6 +51,7 @@ G_BEGIN_DECLS
#define NM_MANAGER_PRIMARY_CONNECTION "primary-connection"
#define NM_MANAGER_ACTIVATING_CONNECTION "activating-connection"
#define NM_MANAGER_DEVICES "devices"
+#define NM_MANAGER_CHECKPOINTS "checkpoints"
#define NM_MANAGER_METERED "metered"
#define NM_MANAGER_ALL_DEVICES "all-devices"
@@ -76,6 +77,8 @@ typedef struct {
/* nm-manager.h is internal API. We can add more slots without breaking ABI. */
} NMManagerClass;
+typedef struct _NMCheckpoint NMCheckpoint;
+
GType nm_manager_get_type (void);
const char *nm_manager_get_version (NMManager *manager);
@@ -184,6 +187,28 @@ gboolean nm_manager_deactivate_connection_finish (NMManager *manager,
GAsyncResult *result,
GError **error);
+const GPtrArray *nm_manager_get_checkpoints (NMManager *manager);
+
+NM_AVAILABLE_IN_1_10
+const GPtrArray *nm_manager_get_checkpoints (NMManager *manager);
+NM_AVAILABLE_IN_1_10
+NMCheckpoint *nm_manager_checkpoint_create (NMManager *manager,
+ const GPtrArray *devices,
+ guint32 rollback_timeout,
+ NMCheckpointCreateFlags flags,
+ GCancellable *cancellable,
+ GError **error);
+NM_AVAILABLE_IN_1_10
+gboolean nm_manager_checkpoint_destroy (NMManager *manager,
+ NMCheckpoint *checkpoint,
+ GCancellable *cancellable,
+ GError **error);
+NM_AVAILABLE_IN_1_10
+GHashTable *nm_manager_checkpoint_rollback (NMManager *manager,
+ NMCheckpoint *checkpoint,
+ GCancellable *cancellable,
+ GError **error);
+
G_END_DECLS
#endif /* __NM_MANAGER_H__ */
diff --git a/libnm/nm-types.h b/libnm/nm-types.h
index 1e06d15feb..f8917ef7a9 100644
--- a/libnm/nm-types.h
+++ b/libnm/nm-types.h
@@ -28,6 +28,7 @@
typedef struct _NMAccessPoint NMAccessPoint;
typedef struct _NMActiveConnection NMActiveConnection;
+typedef struct _NMCheckpoint NMCheckpoint;
typedef struct _NMClient NMClient;
typedef struct _NMDevice NMDevice;
typedef struct _NMDeviceAdsl NMDeviceAdsl;