From a97d0c5875a562a16a9e3cbae03e615c16e47c87 Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Thu, 25 Jan 2024 16:47:31 +0100 Subject: [PATCH] lib: set up `frr_libstatedir` This needs to be used for persistent state, which currently is misplaced into `/var/run` / `/run` where it gets deleted across reboots. Signed-off-by: David Lamparter --- configure.ac | 5 +++++ debian/frr.postinst | 2 ++ lib/libfrr.c | 4 ++++ lib/libfrr.h | 1 + tests/topotests/kinds.yaml | 1 + tests/topotests/lib/topogen.py | 1 + 6 files changed, 14 insertions(+) diff --git a/configure.ac b/configure.ac index 2d21abb6ef..dd143d0fb4 100644 --- a/configure.ac +++ b/configure.ac @@ -91,6 +91,8 @@ if $path_warn_banner; then AC_MSG_WARN([^]) fi +frr_libstatedir="\${localstatedir}/lib/frr" + dnl ----------------------------------- dnl Get hostname and other information. dnl ----------------------------------- @@ -2718,6 +2720,7 @@ AX_RECURSIVE_EVAL([$frr_sysconfdir], [CFG_SYSCONF]) AX_RECURSIVE_EVAL([$sbindir], [CFG_SBIN]) AX_RECURSIVE_EVAL([$bindir], [CFG_BIN]) AX_RECURSIVE_EVAL([$frr_runstatedir], [CFG_STATE]) +AX_RECURSIVE_EVAL([$frr_libstatedir], [CFG_LIBSTATE]) AX_RECURSIVE_EVAL([$moduledir], [CFG_MODULE]) AX_RECURSIVE_EVAL([$yangmodelsdir], [CFG_YANGMODELS]) AX_RECURSIVE_EVAL([$scriptdir], [CFG_SCRIPT]) @@ -2726,6 +2729,7 @@ AC_SUBST([CFG_SYSCONF]) AC_SUBST([CFG_SBIN]) AC_SUBST([CFG_BIN]) AC_SUBST([CFG_STATE]) +dnl AC_SUBST([CFG_LIBSTATE]) -- not currently used AC_SUBST([CFG_MODULE]) AC_SUBST([CFG_SCRIPT]) AC_SUBST([CFG_YANGMODELS]) @@ -2733,6 +2737,7 @@ AC_DEFINE_UNQUOTED([VTYSH_BIN_PATH], ["$vtysh_bin"], [path to vtysh binary]) AC_DEFINE_UNQUOTED([MODULE_PATH], ["$CFG_MODULE"], [path to modules]) AC_DEFINE_UNQUOTED([SCRIPT_PATH], ["$CFG_SCRIPT"], [path to scripts]) AC_DEFINE_UNQUOTED([FRR_RUNSTATE_PATH], ["$CFG_STATE"], [/run/frr equivalent]) +AC_DEFINE_UNQUOTED([FRR_LIBSTATE_PATH], ["$CFG_LIBSTATE"], [/var/lib/frr equivalent]) AC_DEFINE_UNQUOTED([YANG_MODELS_PATH], ["$CFG_YANGMODELS"], [path to YANG data models]) AC_DEFINE_UNQUOTED([WATCHFRR_SH_PATH], ["${CFG_SBIN%/}/watchfrr.sh"], [path to watchfrr.sh]) diff --git a/debian/frr.postinst b/debian/frr.postinst index eb9ec67dd9..9c9b4a821c 100644 --- a/debian/frr.postinst +++ b/debian/frr.postinst @@ -17,8 +17,10 @@ adduser \ usermod -a -G frrvty frr mkdir -m 0755 -p /var/log/frr +mkdir -m 0700 -p /var/lib/frr mkdir -p /etc/frr +chown frr: /var/lib/frr # only change ownership of files when they were previously owned by root or # quagga; this is to ensure we don't trample over some custom user setup. diff --git a/lib/libfrr.c b/lib/libfrr.c index 8f655eab0d..85a906a7bc 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -46,6 +46,7 @@ DEFINE_KOOH(frr_fini, (), ()); const char frr_sysconfdir[] = SYSCONFDIR; char frr_runstatedir[256] = FRR_RUNSTATE_PATH; +char frr_libstatedir[256] = FRR_LIBSTATE_PATH; #ifdef HAVE_SQLITE3 const char frr_dbdir[] = DAEMON_DB_DIR; #endif @@ -497,6 +498,8 @@ static int frr_opt(int opt) snprintf(frr_runstatedir, sizeof(frr_runstatedir), FRR_RUNSTATE_PATH "/%s", di->pathspace); + snprintf(frr_libstatedir, sizeof(frr_libstatedir), + FRR_LIBSTATE_PATH "/%s", di->pathspace); snprintf(pidfile_default, sizeof(pidfile_default), "%s/%s.pid", frr_runstatedir, di->name); if (!di->zpathspace) @@ -754,6 +757,7 @@ struct event_loop *frr_init(void) /* don't mkdir these as root... */ if (!(di->flags & FRR_NO_PRIVSEP)) { + frr_mkdir(frr_libstatedir, false); if (!di->pid_file || !di->vty_path) frr_mkdir(frr_runstatedir, false); if (di->pid_file) diff --git a/lib/libfrr.h b/lib/libfrr.h index c981c297d1..189abf0aec 100644 --- a/lib/libfrr.h +++ b/lib/libfrr.h @@ -174,6 +174,7 @@ extern char config_default[512]; extern char frr_zclientpath[512]; extern const char frr_sysconfdir[]; extern char frr_runstatedir[256]; +extern char frr_libstatedir[256]; extern const char frr_moduledir[]; extern const char frr_scriptdir[]; diff --git a/tests/topotests/kinds.yaml b/tests/topotests/kinds.yaml index 127790ed07..5f4b61d4b7 100644 --- a/tests/topotests/kinds.yaml +++ b/tests/topotests/kinds.yaml @@ -12,6 +12,7 @@ kinds: - "./%NAME%:/etc/frr" - "%RUNDIR%/var.log.frr:/var/log/frr" - "%RUNDIR%/var.run.frr:/var/run/frr" + - "%RUNDIR%/var.lib.frr:/var/lib/frr" cap-add: - SYS_ADMIN - AUDIT_WRITE diff --git a/tests/topotests/lib/topogen.py b/tests/topotests/lib/topogen.py index 7b06f3d127..155d2d0986 100644 --- a/tests/topotests/lib/topogen.py +++ b/tests/topotests/lib/topogen.py @@ -719,6 +719,7 @@ class TopoRouter(TopoGear): "/etc/frr", "/etc/snmp", "/var/run/frr", + "/var/lib/frr", "/var/log", ] -- 2.39.5