initrd: don't add a connection if there's a connection dir with rd.neednet

Only create a default connection with rd.neednet if we're starting with
a totally blank slate. Otherwise it could be that the user already
included configuration in the initrd and merely wants us to activate it.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/999
This commit is contained in:
Lubomir Rintel 2021-11-02 15:27:17 +01:00
parent af1903fe3f
commit 79885656d3
5 changed files with 42 additions and 12 deletions

View file

@ -74,6 +74,21 @@
</listitem>
</varlistentry>
<varlistentry>
<term>
<group choice='plain'>
<arg choice='plain'><option>-p</option></arg>
<arg choice='plain'><option>--persistent-connections-dir</option></arg>
</group>
<arg choice='plain'><replaceable>path</replaceable></arg>
</term>
<listitem>
<para>Persistent connection directory. If it exists, rd.neednet will not
cause a default connection to be generated in absence of other options.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<group choice='plain'>

View file

@ -80,13 +80,14 @@ int
main(int argc, char *argv[])
{
GHashTable *connections;
gs_free char *connections_dir = NULL;
gs_free char *initrd_dir = NULL;
gs_free char *sysfs_dir = NULL;
gs_free char *run_config_dir = NULL;
gboolean dump_to_stdout = FALSE;
gs_strfreev char **remaining = NULL;
GOptionEntry option_entries[] = {
gs_free char *connections_dir = NULL;
gs_free char *etc_connections_dir = NULL;
gs_free char *initrd_dir = NULL;
gs_free char *sysfs_dir = NULL;
gs_free char *run_config_dir = NULL;
gboolean dump_to_stdout = FALSE;
gs_strfreev char **remaining = NULL;
GOptionEntry option_entries[] = {
{"connections-dir",
'c',
0,
@ -94,6 +95,13 @@ main(int argc, char *argv[])
&connections_dir,
"Output connection directory",
NM_KEYFILE_PATH_NAME_RUN},
{"persistent-connections-dir",
'p',
0,
G_OPTION_ARG_FILENAME,
&etc_connections_dir,
"Persistent connection directory",
NM_KEYFILE_PATH_NAME_ETC_DEFAULT},
{"initrd-data-dir",
'i',
0,
@ -153,6 +161,8 @@ main(int argc, char *argv[])
return 0;
}
if (!etc_connections_dir)
etc_connections_dir = g_strdup(NM_KEYFILE_PATH_NAME_ETC_DEFAULT);
if (!connections_dir)
connections_dir = g_strdup(NM_KEYFILE_PATH_NAME_RUN);
if (!sysfs_dir)
@ -162,7 +172,8 @@ main(int argc, char *argv[])
if (!run_config_dir)
run_config_dir = g_strdup(DEFAULT_RUN_CONFIG_DIR);
connections = nmi_cmdline_reader_parse(sysfs_dir,
connections = nmi_cmdline_reader_parse(etc_connections_dir,
sysfs_dir,
(const char *const *) remaining,
&hostname,
&carrier_timeout_sec);

View file

@ -38,7 +38,8 @@ nmi_ibft_update_connection_from_nic(NMConnection *connection, GHashTable *nic, G
NMConnection *nmi_dt_reader_parse(const char *sysfs_dir);
GHashTable *nmi_cmdline_reader_parse(const char *sysfs_dir,
GHashTable *nmi_cmdline_reader_parse(const char *etc_connections_dir,
const char *sysfs_dir,
const char *const *argv,
char **hostname,
gint64 *carrier_timeout_sec);

View file

@ -1316,7 +1316,8 @@ connection_set_needed_cb(gpointer key, gpointer value, gpointer user_data)
}
GHashTable *
nmi_cmdline_reader_parse(const char *sysfs_dir,
nmi_cmdline_reader_parse(const char *etc_connections_dir,
const char *sysfs_dir,
const char *const *argv,
char **hostname,
gint64 *carrier_timeout_sec)
@ -1512,7 +1513,8 @@ nmi_cmdline_reader_parse(const char *sysfs_dir,
}
if (neednet) {
if (g_hash_table_size(reader->hash) == 0) {
if (!(etc_connections_dir && g_file_test(etc_connections_dir, G_FILE_TEST_IS_DIR))
&& g_hash_table_size(reader->hash) == 0) {
/* Make sure there's some connection. */
reader_get_default_connection(reader);
}

View file

@ -29,7 +29,8 @@
gint64 *const _out_carrier_timeout_sec = (out_carrier_timeout_sec); \
GHashTable *_connections; \
\
_connections = nmi_cmdline_reader_parse(TEST_INITRD_DIR "/sysfs", \
_connections = nmi_cmdline_reader_parse(NULL, \
TEST_INITRD_DIR "/sysfs", \
_ARGV, \
_out_hostname, \
_out_carrier_timeout_sec); \