From 605e975f53ed433718df5d101496474870d6439c Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 11 Feb 2023 18:29:32 +0000 Subject: [PATCH] networkd: Save configuration when the daemon exits Signed-off-by: Michael Tremer --- src/networkd/daemon.c | 31 +++++++++++++++++++++++++++++++ src/networkd/daemon.h | 2 ++ src/networkd/main.c | 1 + src/networkd/port.c | 10 ++++++++++ src/networkd/port.h | 2 ++ src/networkd/ports.c | 13 +++++++++++++ src/networkd/ports.h | 2 ++ src/networkd/zone.c | 10 ++++++++++ src/networkd/zone.h | 2 ++ src/networkd/zones.c | 13 +++++++++++++ src/networkd/zones.h | 2 ++ 11 files changed, 88 insertions(+) diff --git a/src/networkd/daemon.c b/src/networkd/daemon.c index 6a6def36..c67c7598 100644 --- a/src/networkd/daemon.c +++ b/src/networkd/daemon.c @@ -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 */ diff --git a/src/networkd/daemon.h b/src/networkd/daemon.h index 16945991..6f4c2174 100644 --- a/src/networkd/daemon.h +++ b/src/networkd/daemon.h @@ -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 */ diff --git a/src/networkd/main.c b/src/networkd/main.c index d3afc2aa..c8b9a791 100644 --- a/src/networkd/main.c +++ b/src/networkd/main.c @@ -29,6 +29,7 @@ #include "daemon.h" #include "logging.h" +#include "port.h" static int cap_acquire_setpcap(void) { cap_flag_value_t value; diff --git a/src/networkd/port.c b/src/networkd/port.c index 41b8b242..30bd98f5 100644 --- a/src/networkd/port.c +++ b/src/networkd/port.c @@ -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; } diff --git a/src/networkd/port.h b/src/networkd/port.h index 9881846d..88610467 100644 --- a/src/networkd/port.h +++ b/src/networkd/port.h @@ -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); diff --git a/src/networkd/ports.c b/src/networkd/ports.c index 35ed0481..a87ca033 100644 --- a/src/networkd/ports.c +++ b/src/networkd/ports.c @@ -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)); diff --git a/src/networkd/ports.h b/src/networkd/ports.h index f58c3a4b..40c9ae18 100644 --- a/src/networkd/ports.h +++ b/src/networkd/ports.h @@ -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); diff --git a/src/networkd/zone.c b/src/networkd/zone.c index 30f22d61..1e4abc33 100644 --- a/src/networkd/zone.c +++ b/src/networkd/zone.c @@ -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; } diff --git a/src/networkd/zone.h b/src/networkd/zone.h index 2748e6d1..088bb2f5 100644 --- a/src/networkd/zone.h +++ b/src/networkd/zone.h @@ -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); diff --git a/src/networkd/zones.c b/src/networkd/zones.c index 1b0ffdc8..ea0d8dec 100644 --- a/src/networkd/zones.c +++ b/src/networkd/zones.c @@ -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)); diff --git a/src/networkd/zones.h b/src/networkd/zones.h index dbf7ccda..c887bd02 100644 --- a/src/networkd/zones.h +++ b/src/networkd/zones.h @@ -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); -- 2.47.2