summary refs log tree commit diff
path: root/src/nm-initrd-generator/nm-initrd-generator.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nm-initrd-generator/nm-initrd-generator.c')
-rw-r--r--src/nm-initrd-generator/nm-initrd-generator.c176
1 files changed, 111 insertions, 65 deletions
diff --git a/src/nm-initrd-generator/nm-initrd-generator.c b/src/nm-initrd-generator/nm-initrd-generator.c
index 981cb14b..09f8baf2 100644
--- a/src/nm-initrd-generator/nm-initrd-generator.c
+++ b/src/nm-initrd-generator/nm-initrd-generator.c
@@ -26,6 +26,18 @@
 /*****************************************************************************/
 
 static void
+add_keyfile_comment(GKeyFile *keyfile, char *reason)
+{
+    gs_free char *comment = NULL;
+
+    comment = g_strdup_printf(" Created by nm-initrd-generator%s%s%s",
+                              reason ? " (" : "",
+                              reason ? reason : "",
+                              reason ? ")" : "");
+    g_key_file_set_comment(keyfile, NULL, NULL, comment, NULL);
+}
+
+static void
 output_conn(gpointer key, gpointer value, gpointer user_data)
 {
     const char                     *basename        = key;
@@ -48,9 +60,12 @@ output_conn(gpointer key, gpointer value, gpointer user_data)
         goto err_out;
 
     file = nm_keyfile_write(connection, NM_KEYFILE_HANDLER_FLAGS_NONE, NULL, NULL, &error);
-    if (file == NULL)
+    if (!file)
         goto err_out;
 
+    if (connections_dir)
+        add_keyfile_comment(file, NULL);
+
     data = g_key_file_to_data(file, &len, &error);
     if (!data)
         goto err_out;
@@ -88,55 +103,57 @@ main(int argc, char *argv[])
     gboolean           dump_to_stdout      = FALSE;
     gs_strfreev char **remaining           = NULL;
     GOptionEntry       option_entries[]    = {
-        {"connections-dir",
-         'c',
-         0,
-         G_OPTION_ARG_FILENAME,
-         &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,
-         G_OPTION_ARG_FILENAME,
-         &initrd_dir,
-         "Output initrd data directory",
-         DEFAULT_INITRD_DATA_DIR},
-        {"sysfs-dir",
-         'd',
-         0,
-         G_OPTION_ARG_FILENAME,
-         &sysfs_dir,
-         "The sysfs mount point",
-         DEFAULT_SYSFS_DIR},
-        {"run-config-dir",
-         'r',
-         0,
-         G_OPTION_ARG_FILENAME,
-         &run_config_dir,
-         "Output config directory",
-         DEFAULT_RUN_CONFIG_DIR},
-        {"stdout",
-         's',
-         0,
-         G_OPTION_ARG_NONE,
-         &dump_to_stdout,
-         "Dump connections to standard output",
-         NULL},
-        {G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, NULL},
-        {NULL}};
+                 {"connections-dir",
+                  'c',
+                  0,
+                  G_OPTION_ARG_FILENAME,
+                  &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,
+                  G_OPTION_ARG_FILENAME,
+                  &initrd_dir,
+                  "Output initrd data directory",
+                  DEFAULT_INITRD_DATA_DIR},
+                 {"sysfs-dir",
+                  'd',
+                  0,
+                  G_OPTION_ARG_FILENAME,
+                  &sysfs_dir,
+                  "The sysfs mount point",
+                  DEFAULT_SYSFS_DIR},
+                 {"run-config-dir",
+                  'r',
+                  0,
+                  G_OPTION_ARG_FILENAME,
+                  &run_config_dir,
+                  "Output config directory",
+                  DEFAULT_RUN_CONFIG_DIR},
+                 {"stdout",
+                  's',
+                  0,
+                  G_OPTION_ARG_NONE,
+                  &dump_to_stdout,
+                  "Dump connections to standard output",
+                  NULL},
+                 {G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, NULL},
+                 {NULL}};
     nm_auto_free_option_context GOptionContext *option_context = NULL;
     gs_free_error GError                       *error          = NULL;
     gs_free char                               *hostname       = NULL;
     int                                         errsv;
     gint64                                      carrier_timeout_sec = 0;
+    gs_unref_array GArray                      *confs               = NULL;
+    guint                                       i;
 
     option_context = g_option_context_new(
         "-- [ip=...] [rd.route=...] [bridge=...] [bond=...] [team=...] [vlan=...] "
@@ -178,15 +195,57 @@ main(int argc, char *argv[])
                                            &hostname,
                                            &carrier_timeout_sec);
 
+    confs = g_array_new(FALSE, FALSE, sizeof(NMUtilsNamedValue));
+    g_array_set_clear_func(confs, (GDestroyNotify) nm_utils_named_value_clear_with_g_free);
+
+    {
+        nm_auto_unref_keyfile GKeyFile *keyfile = NULL;
+        NMUtilsNamedValue               v;
+
+        keyfile = g_key_file_new();
+        g_key_file_set_list_separator(keyfile, NM_CONFIG_KEYFILE_LIST_SEPARATOR);
+
+        g_key_file_set_value(keyfile,
+                             NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE "-15-carrier-timeout",
+                             NM_CONFIG_KEYFILE_KEY_MATCH_DEVICE,
+                             "*");
+        g_key_file_set_int64(keyfile,
+                             NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE "-15-carrier-timeout",
+                             NM_CONFIG_KEYFILE_KEY_DEVICE_CARRIER_WAIT_TIMEOUT,
+                             (carrier_timeout_sec != 0 ? carrier_timeout_sec : 10) * 1000);
+        if (carrier_timeout_sec == 0) {
+            g_key_file_set_value(keyfile,
+                                 NM_CONFIG_KEYFILE_GROUP_CONFIG,
+                                 NM_CONFIG_KEYFILE_KEY_CONFIG_ENABLE,
+                                 "env:initrd");
+        }
+
+        if (!dump_to_stdout) {
+            add_keyfile_comment(keyfile,
+                                carrier_timeout_sec == 0 ? "default initrd carrier timeout"
+                                                         : "from \"rd.net.timeout.carrier\"");
+        }
+
+        v = (NMUtilsNamedValue){
+            .name      = g_strdup_printf("%s/15-carrier-timeout.conf", run_config_dir),
+            .value_str = g_key_file_to_data(keyfile, NULL, NULL),
+        };
+        g_array_append_val(confs, v);
+    }
+
     if (dump_to_stdout) {
         nm_clear_g_free(&connections_dir);
         nm_clear_g_free(&initrd_dir);
         nm_clear_g_free(&run_config_dir);
         if (hostname)
             g_print("\n*** Hostname '%s' ***\n", hostname);
-        if (carrier_timeout_sec != 0)
-            g_print("\n*** Carrier Wait Timeout %" G_GINT64_FORMAT " sec ***\n",
-                    carrier_timeout_sec);
+
+        for (i = 0; i < confs->len; i++) {
+            NMUtilsNamedValue *v    = &g_array_index(confs, NMUtilsNamedValue, i);
+            gs_free char      *name = g_path_get_basename(v->name);
+
+            g_print("\n*** Configuration '%s' ***\n\n%s\n", name, v->value_str);
+        }
     } else {
         if (g_mkdir_with_parents(connections_dir, 0755) != 0) {
             errsv = errno;
@@ -216,25 +275,12 @@ main(int argc, char *argv[])
                 return 1;
             }
         }
-        if (carrier_timeout_sec != 0) {
-            nm_auto_unref_keyfile GKeyFile *keyfile  = NULL;
-            gs_free char                   *filename = NULL;
 
-            keyfile = g_key_file_new();
-            g_key_file_set_list_separator(keyfile, NM_CONFIG_KEYFILE_LIST_SEPARATOR);
-            filename = g_strdup_printf("%s/15-carrier-timeout.conf", run_config_dir);
+        for (i = 0; i < confs->len; i++) {
+            NMUtilsNamedValue *v = &g_array_index(confs, NMUtilsNamedValue, i);
 
-            g_key_file_set_value(keyfile,
-                                 NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE "-15-carrier-timeout",
-                                 NM_CONFIG_KEYFILE_KEY_MATCH_DEVICE,
-                                 "*");
-            g_key_file_set_int64(keyfile,
-                                 NM_CONFIG_KEYFILE_GROUPPREFIX_DEVICE "-15-carrier-timeout",
-                                 NM_CONFIG_KEYFILE_KEY_DEVICE_CARRIER_WAIT_TIMEOUT,
-                                 carrier_timeout_sec * 1000);
-
-            if (!g_key_file_save_to_file(keyfile, filename, &error)) {
-                _LOGW(LOGD_CORE, "%s: %s", filename, error->message);
+            if (!g_file_set_contents(v->name, v->value_str, strlen(v->value_str), &error)) {
+                _LOGW(LOGD_CORE, "%s: %s", v->name, error->message);
                 return 1;
             }
         }