diff options
Diffstat (limited to 'clients/cloud-setup/nmcs-provider.c')
| -rw-r--r-- | clients/cloud-setup/nmcs-provider.c | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/clients/cloud-setup/nmcs-provider.c b/clients/cloud-setup/nmcs-provider.c new file mode 100644 index 00000000..1f1b6e60 --- /dev/null +++ b/clients/cloud-setup/nmcs-provider.c @@ -0,0 +1,245 @@ +// SPDX-License-Identifier: LGPL-2.1+ + +#include "nm-default.h" + +#include "nmcs-provider.h" + +#include "nm-cloud-setup-utils.h" + +/*****************************************************************************/ + +NM_GOBJECT_PROPERTIES_DEFINE_BASE ( + PROP_HTTP_CLIENT, +); + +typedef struct _NMCSProviderPrivate { + NMHttpClient *http_client; +} NMCSProviderPrivate; + +G_DEFINE_TYPE (NMCSProvider, nmcs_provider, G_TYPE_OBJECT); + +#define NMCS_PROVIDER_GET_PRIVATE(self) _NM_GET_PRIVATE_PTR(self, NMCSProvider, NMCS_IS_PROVIDER) + +/*****************************************************************************/ + +const char * +nmcs_provider_get_name (NMCSProvider *self) +{ + NMCSProviderClass *klass; + + g_return_val_if_fail (NMCS_IS_PROVIDER (self), NULL); + + klass = NMCS_PROVIDER_GET_CLASS (self); + nm_assert (klass->_name); + return klass->_name; +} + +/*****************************************************************************/ + +NMHttpClient * +nmcs_provider_get_http_client (NMCSProvider *self) +{ + g_return_val_if_fail (NMCS_IS_PROVIDER (self), NULL); + + return NMCS_PROVIDER_GET_PRIVATE (self)->http_client; +} + +GMainContext * +nmcs_provider_get_main_context (NMCSProvider *self) +{ + g_return_val_if_fail (NMCS_IS_PROVIDER (self), NULL); + + return nm_http_client_get_main_context (NMCS_PROVIDER_GET_PRIVATE (self)->http_client); +} + +/*****************************************************************************/ + +void +nmcs_provider_detect (NMCSProvider *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + gs_unref_object GTask *task = NULL; + const char *env; + + g_return_if_fail (NMCS_IS_PROVIDER (self)); + g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable)); + + task = nm_g_task_new (self, cancellable, nmcs_provider_detect, callback, user_data); + + nmcs_wait_for_objects_register (task); + + env = g_getenv (NMCS_PROVIDER_GET_CLASS (self)->_env_provider_enabled); + if (!_nm_utils_ascii_str_to_bool (env, FALSE)) { + g_task_return_error (task, + nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN, + "provider is disabled")); + return; + } + + NMCS_PROVIDER_GET_CLASS (self)->detect (self, + g_steal_pointer (&task)); +} + +gboolean +nmcs_provider_detect_finish (NMCSProvider *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (NMCS_IS_PROVIDER (self), FALSE); + g_return_val_if_fail (nm_g_task_is_valid (result, self, nmcs_provider_detect), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +/*****************************************************************************/ + +NMCSProviderGetConfigIfaceData * +nmcs_provider_get_config_iface_data_new (gboolean was_requested) +{ + NMCSProviderGetConfigIfaceData *iface_data; + + iface_data = g_slice_new (NMCSProviderGetConfigIfaceData); + *iface_data = (NMCSProviderGetConfigIfaceData) { + .iface_idx = -1, + .was_requested = was_requested, + }; + return iface_data; +} + +static void +_iface_data_free (gpointer data) +{ + NMCSProviderGetConfigIfaceData *iface_data = data; + + g_free (iface_data->ipv4s_arr); + + nm_g_slice_free (iface_data); +} + +static void +_get_config_data_free (gpointer data) +{ + NMCSProviderGetConfigTaskData *get_config_data = data; + + if (get_config_data->extra_destroy) + get_config_data->extra_destroy (get_config_data->extra_data); + + nm_clear_pointer (&get_config_data->result_dict, g_hash_table_unref); + + nm_g_slice_free (get_config_data); +} + +void +nmcs_provider_get_config (NMCSProvider *self, + gboolean any, + const char *const*hwaddrs, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + NMCSProviderGetConfigTaskData *get_config_data; + + g_return_if_fail (NMCS_IS_PROVIDER (self)); + g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable)); + + get_config_data = g_slice_new (NMCSProviderGetConfigTaskData); + *get_config_data = (NMCSProviderGetConfigTaskData) { + .task = nm_g_task_new (self, cancellable, nmcs_provider_get_config, callback, user_data), + .any = any, + .result_dict = g_hash_table_new_full (nm_str_hash, + g_str_equal, + g_free, + _iface_data_free), + }; + + g_task_set_task_data (get_config_data->task, get_config_data, _get_config_data_free); + + nmcs_wait_for_objects_register (get_config_data->task); + + for (; hwaddrs && hwaddrs[0]; hwaddrs++) { + g_hash_table_insert (get_config_data->result_dict, + g_strdup (hwaddrs[0]), + nmcs_provider_get_config_iface_data_new (TRUE)); + } + + _LOGD ("get-config: starting"); + + NMCS_PROVIDER_GET_CLASS (self)->get_config (self, get_config_data); +} + +GHashTable * +nmcs_provider_get_config_finish (NMCSProvider *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (NMCS_IS_PROVIDER (self), FALSE); + g_return_val_if_fail (nm_g_task_is_valid (result, self, nmcs_provider_get_config), FALSE); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +/*****************************************************************************/ + +static void +set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + NMCSProviderPrivate *priv = NMCS_PROVIDER_GET_PRIVATE (object); + + switch (prop_id) { + case PROP_HTTP_CLIENT: + priv->http_client = g_value_dup_object (value); + g_return_if_fail (NM_IS_HTTP_CLIENT (priv->http_client)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/*****************************************************************************/ + +static void +nmcs_provider_init (NMCSProvider *self) +{ + NMCSProviderPrivate *priv; + + priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NMCS_TYPE_PROVIDER, NMCSProviderPrivate); + + self->_priv = priv; +} + +static void +dispose (GObject *object) +{ + NMCSProvider *self = NMCS_PROVIDER (object); + NMCSProviderPrivate *priv = NMCS_PROVIDER_GET_PRIVATE (self); + + g_clear_object (&priv->http_client); + + G_OBJECT_CLASS (nmcs_provider_parent_class)->dispose (object); +} + +static void +nmcs_provider_class_init (NMCSProviderClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (object_class, sizeof (NMCSProviderPrivate)); + + object_class->set_property = set_property; + object_class->dispose = dispose; + + obj_properties[PROP_HTTP_CLIENT] = + g_param_spec_object (NMCS_PROVIDER_HTTP_CLIENT, "", "", + NM_TYPE_HTTP_CLIENT, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties); +} |