diff --git a/src/nm-cloud-setup/main.c b/src/nm-cloud-setup/main.c index c7680860b..d2a5a1cf5 100644 --- a/src/nm-cloud-setup/main.c +++ b/src/nm-cloud-setup/main.c @@ -694,12 +694,11 @@ try_again: static NMConnection * _new_connection(void) { - NMConnection *connection = NULL; + NMConnection *connection; NMSetting *s_user; connection = nm_simple_connection_new(); - - s_user = nm_setting_user_new(); + s_user = nm_setting_user_new(); nm_connection_add_setting(connection, s_user); nm_setting_user_set_data(NM_SETTING_USER(s_user), "org.freedesktop.NetworkManager.origin", @@ -713,9 +712,13 @@ static gboolean _config_ethernet(SigTermData *sigterm_data, const NMCSProviderGetConfigIfaceData *config_data, NMClient *nmc, - const NMCSProviderGetConfigResult *result) + const NMCSProviderGetConfigResult *result, + gboolean allow_new_connections) { - gs_unref_object NMDevice *device = NULL; + gs_unref_object NMDevice *device = NULL; + gs_unref_object NMConnection *connection = NULL; + gs_unref_object NMActiveConnection *active_connection = NULL; + gs_free_error GError *error = NULL; device = nm_g_object_ref( _nmc_get_device_by_hwaddr(nmc, NM_TYPE_DEVICE_ETHERNET, config_data->hwaddr)); @@ -724,12 +727,52 @@ _config_ethernet(SigTermData *sigterm_data, return FALSE; } - return _config_existing(sigterm_data, - config_data, - nmc, - result, - NM_SETTING_WIRED_SETTING_NAME, - device); + if (allow_new_connections && nm_device_get_state(device) == NM_DEVICE_STATE_DISCONNECTED) { + connection = _new_connection(); + nm_connection_add_setting(connection, + g_object_new(NM_TYPE_SETTING_CONNECTION, + NM_SETTING_CONNECTION_TYPE, + NM_SETTING_WIRED_SETTING_NAME, + NULL)); + nm_connection_add_setting(connection, + g_object_new(NM_TYPE_SETTING_IP4_CONFIG, + NM_SETTING_IP_CONFIG_METHOD, + NM_SETTING_IP4_CONFIG_METHOD_MANUAL, + NULL)); + + nm_connection_add_setting(connection, + g_object_new(NM_TYPE_SETTING_WIRED, + NM_SETTING_WIRED_MAC_ADDRESS, + config_data->hwaddr, + NULL)); + + _nmc_mangle_connection(device, connection, result, config_data, NULL, NULL); + + active_connection = nmcs_add_and_activate(nmc, NULL, device, connection, &error); + if (!active_connection) { + if (!nm_utils_error_is_cancelled(error)) { + _LOGD("config device %s: failure to activate connection: %s", + nm_device_get_iface(NM_DEVICE(device)), + error->message); + } + return FALSE; + } + + _LOGD("config device %s: connection \"%s\" (%s) created", + nm_device_get_iface(NM_DEVICE(device)), + nm_active_connection_get_id(active_connection), + nm_active_connection_get_uuid(active_connection)); + + return TRUE; + + } else { + return _config_existing(sigterm_data, + config_data, + nmc, + result, + NM_SETTING_WIRED_SETTING_NAME, + device); + } } static gboolean @@ -910,7 +953,8 @@ _config_one(SigTermData *sigterm_data, _nm_utils_ascii_str_to_bool(g_getenv(NMCS_ENV_NM_CLOUD_SETUP_ALLOW_NEW_CONN), NMCS_IS_PROVIDER_OCI(provider)); - if (allow_new_connections && config_data->priv.oci.vlan_tag != 0) { + if (allow_new_connections && NMCS_IS_PROVIDER_OCI(provider) + && config_data->priv.oci.vlan_tag != 0) { if (config_data->priv.oci.parent_hwaddr == NULL) { _LOGW("config device %s: has vlan id %d but no parent device", config_data->hwaddr, @@ -935,7 +979,8 @@ _config_one(SigTermData *sigterm_data, config_data->hwaddr); } else { - any_changes = _config_ethernet(sigterm_data, config_data, nmc, result); + any_changes = + _config_ethernet(sigterm_data, config_data, nmc, result, allow_new_connections); } return any_changes; diff --git a/src/nm-cloud-setup/nm-cloud-setup-utils.c b/src/nm-cloud-setup/nm-cloud-setup-utils.c index a9a5ab8f7..3889cff29 100644 --- a/src/nm-cloud-setup/nm-cloud-setup-utils.c +++ b/src/nm-cloud-setup/nm-cloud-setup-utils.c @@ -649,7 +649,7 @@ nmcs_add_and_activate(NMClient *client, nm_client_add_and_activate_connection_async(client, connection, - NULL, + device, NULL, sigterm_cancellable, _nmcs_add_and_activate_cb,