summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2024-01-25 16:47:31 +0100
committerDavid Lamparter <equinox@opensourcerouting.org>2024-01-27 19:01:19 +0100
commita97d0c5875a562a16a9e3cbae03e615c16e47c87 (patch)
tree0e2290137a99141de9f3eb683c8f7b3fe13687d6
parent0f79e6b876ef99b5be722a2038f519fbbf3a4a67 (diff)
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 <equinox@opensourcerouting.org>
-rw-r--r--configure.ac5
-rw-r--r--debian/frr.postinst2
-rw-r--r--lib/libfrr.c4
-rw-r--r--lib/libfrr.h1
-rw-r--r--tests/topotests/kinds.yaml1
-rw-r--r--tests/topotests/lib/topogen.py1
6 files changed, 14 insertions, 0 deletions
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",
]