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