diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2017-10-21 16:05:19 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2017-10-21 16:05:19 +0200 |
commit | 5e01d85ddee16e8606a3289f78aa53d2ba7fb2f8 (patch) | |
tree | 2eba266e9e797c2f806603b6e552c58e4bf8076f | |
parent | 341bbc16d742036c52aae3276aed0645952b0b90 (diff) | |
download | NetworkManager-5e01d85ddee16e8606a3289f78aa53d2ba7fb2f8.tar.gz |
wip: libnm: add checkpoint supportbg/cli-checkpoint
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | introspection/org.freedesktop.NetworkManager.xml | 2 | ||||
-rw-r--r-- | libnm-core/nm-dbus-interface.h | 1 | ||||
-rw-r--r-- | libnm/libnm.ver | 4 | ||||
-rw-r--r-- | libnm/nm-checkpoint.c | 212 | ||||
-rw-r--r-- | libnm/nm-checkpoint.h | 62 | ||||
-rw-r--r-- | libnm/nm-manager.c | 86 | ||||
-rw-r--r-- | libnm/nm-manager.h | 25 | ||||
-rw-r--r-- | libnm/nm-types.h | 1 |
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; |