]> git.ipfire.org Git - people/ms/network.git/commitdiff
networkd: Save configuration when the daemon exits
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 11 Feb 2023 18:29:32 +0000 (18:29 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 11 Feb 2023 18:29:32 +0000 (18:29 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/networkd/daemon.c
src/networkd/daemon.h
src/networkd/main.c
src/networkd/port.c
src/networkd/port.h
src/networkd/ports.c
src/networkd/ports.h
src/networkd/zone.c
src/networkd/zone.h
src/networkd/zones.c
src/networkd/zones.h

index 6a6def362f141a5150987eca5ee13696e9643382..c67c7598134ccbb9b776ce9ddeb2ce63dd5494b0 100644 (file)
@@ -409,6 +409,11 @@ int nw_daemon_run(nw_daemon* daemon) {
        // Let systemd know that we are shutting down
        sd_notify(0, "STOPPING=1\n" "STATUS=Shutting down...");
 
+       // Save the configuration
+       r = nw_daemon_save(daemon);
+       if (r)
+               goto ERROR;
+
        // Cleanup everything
        nw_daemon_cleanup(daemon);
 
@@ -431,6 +436,32 @@ int nw_daemon_reload(nw_daemon* daemon) {
        return 0;
 }
 
+/*
+       Saves the configuration to disk
+*/
+int nw_daemon_save(nw_daemon* daemon) {
+       int r;
+
+       DEBUG("Saving configuration...\n");
+
+       // Save settings
+       r = nw_config_write(daemon->config);
+       if (r)
+               return r;
+
+       // Save ports
+       r = nw_ports_save(daemon->ports);
+       if (r)
+               return r;
+
+       // Save zones
+       r = nw_zones_save(daemon->zones);
+       if (r)
+               return r;
+
+       return 0;
+}
+
 /*
        Netlink
 */
index 169459918ec2b56549e9506af1bf1cd65a941704..6f4c21747732219af2b7846bf1e14959ece7f5c3 100644 (file)
@@ -41,6 +41,8 @@ int nw_daemon_run(nw_daemon* daemon);
 
 int nw_daemon_reload(nw_daemon* daemon);
 
+int nw_daemon_save(nw_daemon* daemon);
+
 /*
        Netlink
 */
index d3afc2aa199d87e50b31ed097f2d23ced4e7f01b..c8b9a791bd9c5312b8dafa0ff78d64a8960ac5b1 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "daemon.h"
 #include "logging.h"
+#include "port.h"
 
 static int cap_acquire_setpcap(void) {
        cap_flag_value_t value;
index 41b8b2426bb79f310fb8fa56aa7258b06872b8a3..30bd98f50619d02b8e2fee29208282840ebad50a 100644 (file)
@@ -213,6 +213,16 @@ nw_port* nw_port_unref(nw_port* port) {
        return NULL;
 }
 
+int nw_port_save(nw_port* port) {
+       int r;
+
+       r = nw_config_write(port->config);
+       if (r)
+               return r;
+
+       return 0;
+}
+
 const char* nw_port_name(nw_port* port) {
        return port->name;
 }
index 9881846d002614455813a6d88f8f1f6ba23bf4d9..8861046782935957631fbd64751bd01f8bb88317 100644 (file)
@@ -38,6 +38,8 @@ int nw_port_create(nw_port** port, nw_daemon* daemon, const char* name);
 nw_port* nw_port_ref(nw_port* port);
 nw_port* nw_port_unref(nw_port* port);
 
+int nw_port_save(nw_port* port);
+
 const char* nw_port_name(nw_port* port);
 
 char* nw_port_bus_path(nw_port* port);
index 35ed04810f90c8d111d684e17a2ce12913760375..a87ca033c4958eb8f17220f279065a2dbe410441 100644 (file)
@@ -98,6 +98,19 @@ nw_ports* nw_ports_unref(nw_ports* ports) {
        return NULL;
 }
 
+int nw_ports_save(nw_ports* ports) {
+       struct nw_ports_entry* entry = NULL;
+       int r;
+
+       STAILQ_FOREACH(entry, &ports->entries, nodes) {
+               r = nw_port_save(entry->port);
+               if (r)
+                       return r;
+       }
+
+       return 0;
+}
+
 static int nw_ports_add_port(nw_ports* ports, nw_port* port) {
        // Allocate a new entry
        struct nw_ports_entry* entry = calloc(1, sizeof(*entry));
index f58c3a4babe31ac3329da37b3feae93ad8744900..40c9ae184c783031831c52259a4922ee854c49e4 100644 (file)
@@ -30,6 +30,8 @@ int nw_ports_create(nw_ports** ports, nw_daemon* daemon);
 nw_ports* nw_ports_ref(nw_ports* ports);
 nw_ports* nw_ports_unref(nw_ports* ports);
 
+int nw_ports_save(nw_ports* ports);
+
 int nw_ports_enumerate(nw_ports* ports);
 
 struct nw_port* nw_ports_get_by_name(nw_ports* ports, const char* name);
index 30f22d611a9a06a50ac14828bab26582cba2aae5..1e4abc33c13904aa4f7b7711112af801d7d3127c 100644 (file)
@@ -137,6 +137,16 @@ nw_zone* nw_zone_unref(nw_zone* zone) {
        return NULL;
 }
 
+int nw_zone_save(nw_zone* zone) {
+       int r;
+
+       r = nw_config_write(zone->config);
+       if (r)
+               return r;
+
+       return 0;
+}
+
 const char* nw_zone_name(nw_zone* zone) {
        return zone->name;
 }
index 2748e6d13b6e57ca81e5c40958d1852aa53d090e..088bb2f55faf054834124351d647429e4a878312 100644 (file)
@@ -35,6 +35,8 @@ int nw_zone_create(nw_zone** zone, nw_daemon* daemon, const char* name);
 nw_zone* nw_zone_ref(nw_zone* zone);
 nw_zone* nw_zone_unref(nw_zone* zone);
 
+int nw_zone_save(nw_zone* zone);
+
 const char* nw_zone_name(nw_zone* zone);
 
 char* nw_zone_bus_path(nw_zone* zone);
index 1b0ffdc84cabb640aee452eab97f620a7836bb2f..ea0d8dec74ed335aeb858fae971604ebefe80b71 100644 (file)
@@ -104,6 +104,19 @@ nw_zones* nw_zones_unref(nw_zones* zones) {
        return NULL;
 }
 
+int nw_zones_save(nw_zones* zones) {
+       struct nw_zones_entry* entry = NULL;
+       int r;
+
+       STAILQ_FOREACH(entry, &zones->entries, nodes) {
+               r = nw_zone_save(entry->zone);
+               if (r)
+                       return r;
+       }
+
+       return 0;
+}
+
 static int nw_zones_add_zone(nw_zones* zones, nw_zone* zone) {
        // Allocate a new entry
        struct nw_zones_entry* entry = calloc(1, sizeof(*entry));
index dbf7ccdac3809ce884d26f598679f632fc3d33eb..c887bd02d32c64f432d8b617d576395275161d2c 100644 (file)
@@ -30,6 +30,8 @@ int nw_zones_create(nw_zones** zones, nw_daemon* daemon);
 nw_zones* nw_zones_ref(nw_zones* zones);
 nw_zones* nw_zones_unref(nw_zones* zones);
 
+int nw_zones_save(nw_zones* zones);
+
 int nw_zones_enumerate(nw_zones* zones);
 
 size_t nw_zones_num(nw_zones* zones);