diff --git a/lib/libfrr.c b/lib/libfrr.c index 64f8be2ca6..de83e14f0e 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -34,6 +34,7 @@ DEFINE_HOOK(frr_late_init, (struct thread_master *tm), (tm)) const char frr_sysconfdir[] = SYSCONFDIR; const char frr_vtydir[] = DAEMON_VTY_DIR; +const char frr_moduledir[] = MODULE_PATH; char config_default[256]; static char pidfile_default[256]; @@ -61,7 +62,8 @@ static void opt_extend(const struct optspec *os) } -#define OPTION_VTYSOCK 1000 +#define OPTION_VTYSOCK 1000 +#define OPTION_MODULEDIR 1002 static const struct option lo_always[] = { { "help", no_argument, NULL, 'h' }, @@ -69,6 +71,7 @@ static const struct option lo_always[] = { { "daemon", no_argument, NULL, 'd' }, { "module", no_argument, NULL, 'M' }, { "vty_socket", required_argument, NULL, OPTION_VTYSOCK }, + { "moduledir", required_argument, NULL, OPTION_MODULEDIR }, { NULL } }; static const struct optspec os_always = { @@ -77,7 +80,8 @@ static const struct optspec os_always = { " -v, --version Print program version\n" " -d, --daemon Runs in daemon mode\n" " -M, --module Load specified module\n" - " --vty_socket Override vty socket path\n", + " --vty_socket Override vty socket path\n" + " --moduledir Override modules directory\n", lo_always }; @@ -193,6 +197,7 @@ struct option_chain { struct option_chain *next; const char *arg; }; + static struct option_chain *modules = NULL, **modnext = &modules; static int errors = 0; @@ -277,6 +282,14 @@ static int frr_opt(int opt) } di->vty_sock_path = optarg; break; + case OPTION_MODULEDIR: + if (di->module_path) { + fprintf(stderr, "----moduledir option specified more than once!\n"); + errors++; + break; + } + di->module_path = optarg; + break; case 'u': if (di->flags & FRR_NO_PRIVSEP) return 1; @@ -319,6 +332,8 @@ struct thread_master *frr_init(void) struct option_chain *oc; struct frrmod_runtime *module; char moderr[256]; + const char *dir; + dir = di->module_path ? di->module_path : frr_moduledir; srandom(time(NULL)); @@ -331,7 +346,7 @@ struct thread_master *frr_init(void) frrmod_init(di->module); while (modules) { modules = (oc = modules)->next; - module = frrmod_load(oc->arg, moderr, sizeof(moderr)); + module = frrmod_load(oc->arg, dir, moderr, sizeof(moderr)); if (!module) { fprintf(stderr, "%s\n", moderr); exit(1); diff --git a/lib/libfrr.h b/lib/libfrr.h index a40fc34892..0cc7ad564b 100644 --- a/lib/libfrr.h +++ b/lib/libfrr.h @@ -52,6 +52,7 @@ struct frr_daemon_info { const char *config_file; const char *pid_file; const char *vty_path; + const char *module_path; const char *proghelp; void (*printhelp)(FILE *target); @@ -107,5 +108,6 @@ extern void frr_run(struct thread_master *master); extern char config_default[256]; extern const char frr_sysconfdir[]; extern const char frr_vtydir[]; +extern const char frr_moduledir[]; #endif /* _ZEBRA_FRR_H */ diff --git a/lib/module.c b/lib/module.c index 4ebe3c0da2..c7dd5538cd 100644 --- a/lib/module.c +++ b/lib/module.c @@ -69,7 +69,7 @@ void frrmod_init(struct frrmod_runtime *modinfo) } struct frrmod_runtime *frrmod_load(const char *spec, - char *err, size_t err_len) + const char *dir, char *err, size_t err_len) { void *handle = NULL; char name[PATH_MAX], fullpath[PATH_MAX], *args; @@ -84,12 +84,12 @@ struct frrmod_runtime *frrmod_load(const char *spec, if (!strchr(name, '/')) { if (!handle && execname) { snprintf(fullpath, sizeof(fullpath), "%s/%s_%s.so", - MODULE_PATH, execname, name); + dir, execname, name); handle = dlopen(fullpath, RTLD_NOW | RTLD_GLOBAL); } if (!handle) { snprintf(fullpath, sizeof(fullpath), "%s/%s.so", - MODULE_PATH, name); + dir, name); handle = dlopen(fullpath, RTLD_NOW | RTLD_GLOBAL); } } diff --git a/lib/module.h b/lib/module.h index cb66e60976..01819f91e1 100644 --- a/lib/module.h +++ b/lib/module.h @@ -95,7 +95,7 @@ extern struct frrmod_runtime *frrmod_list; extern void frrmod_init(struct frrmod_runtime *modinfo); extern struct frrmod_runtime *frrmod_load(const char *spec, - char *err, size_t err_len); + const char *dir, char *err, size_t err_len); #if 0 /* not implemented yet */ extern void frrmod_unload(struct frrmod_runtime *module); diff --git a/snapcraft/README.snap_build.md b/snapcraft/README.snap_build.md index c4db51bd6a..e1f2ce82da 100644 --- a/snapcraft/README.snap_build.md +++ b/snapcraft/README.snap_build.md @@ -47,8 +47,10 @@ Installing the snap Connect the priviledged `network-control` plug to the snap: - snap connect frr:network-control ubuntu-core:network-control + snap connect frr:network-control core:network-control +See README.usage.md for more details on setting up and using the snap + DONE. The Snap will be auto-started and running. diff --git a/snapcraft/README.usage.md b/snapcraft/README.usage.md index c678c8805c..537147303a 100644 --- a/snapcraft/README.usage.md +++ b/snapcraft/README.usage.md @@ -30,6 +30,8 @@ Commands defined by this snap options - `frr.readme`: Returns this document `cat README_usage.md` +- `frr.set`: + Allows to enable `FPM` module. See FPM section below and for debugging defined at this time (May get removed later - do not depend on them). These are mainly intended to debug the Snap @@ -86,6 +88,20 @@ are named `eth0`, `eth1` and `eth2`, then the additional lines in These settings require either a reboot or a manual configuration with `sysctl` as well. +FPM Module +---------- +The `frr.set` allows to turn FPM module on or off. + + frr.set fpm {disable|protobuf|netlink} + + Disables FPM or enables FPM with selected mode + +By default, the FPM module is disabled, but installed with netlink and +protobuf support. To enable the FPM module, use the `frr.set fpm protobuf` +or `frr.set fpm netlink` command. The command will only enable the mode +for the next restart of zebra. Please reboot or restart zebra after +changing the mode to become effective. + FAQ --- - frr.vtysh displays `--MORE--` on long output. How to suppress this? diff --git a/snapcraft/defaults/nhrpd.conf.default b/snapcraft/defaults/nhrpd.conf.default new file mode 100644 index 0000000000..e69de29bb2 diff --git a/snapcraft/scripts/Makefile b/snapcraft/scripts/Makefile index 00984c2afa..2a60d4d652 100644 --- a/snapcraft/scripts/Makefile +++ b/snapcraft/scripts/Makefile @@ -11,4 +11,5 @@ install: install -D -m 0755 isisd-service $(DESTDIR)/bin/ install -D -m 0755 pimd-service $(DESTDIR)/bin/ install -D -m 0755 ldpd-service $(DESTDIR)/bin/ - + install -D -m 0755 nhrpd-service $(DESTDIR)/bin/ + install -D -m 0755 set-options $(DESTDIR)/bin/ diff --git a/snapcraft/scripts/nhrpd-service b/snapcraft/scripts/nhrpd-service new file mode 100644 index 0000000000..a3ba5e3fe9 --- /dev/null +++ b/snapcraft/scripts/nhrpd-service @@ -0,0 +1,12 @@ +#!/bin/sh + +set -e -x + +if ! [ -e $SNAP_DATA/nhrpd.conf ]; then + cp $SNAP/etc/frr/nhrpd.conf.default $SNAP_DATA/nhrpd.conf +fi +exec $SNAP/sbin/nhrpd \ + -f $SNAP_DATA/nhrpd.conf \ + --pid_file $SNAP_DATA/nhrpd.pid \ + --socket $SNAP_DATA/zsock \ + --vty_socket $SNAP_DATA diff --git a/snapcraft/scripts/set-options b/snapcraft/scripts/set-options new file mode 100755 index 0000000000..e76e321ef8 --- /dev/null +++ b/snapcraft/scripts/set-options @@ -0,0 +1,40 @@ +#!/bin/sh + +set -e + +case $1 in + fpm) + case $2 in + disable) + rm -f $SNAP_DATA/fpm.conf + echo "FPM module disabled. Please restart FRR" + ;; + protobuf) + echo "-M fpm:protobuf" > $SNAP_DATA/fpm.conf + echo "FPM enabled and set to protobuf mode. Please restart FRR" + ;; + netlink) + echo "-M fpm:netlink" > $SNAP_DATA/fpm.conf + echo "FPM enabled and set to netlink mode. Please restart FRR" + ;; + *) + echo "Usage:" + echo " ${SNAP_NAME}.set fpm {disable|protobuf|netlink}" + echo "" + echo " Disables FPM module or enables it with specified mode" + echo " Mode will be saved for next restart of zebra, but zebra" + echo " is not automatically restarted" + exit 1 + ;; + esac + ;; + *) + echo "Usage:" + echo " ${SNAP_NAME}.set fpm {disable|protobuf|netlink}" + echo "" + echo " Disables FPM or enables FPM with selected mode" + exit 1 + ;; +esac + +exit 0 diff --git a/snapcraft/scripts/zebra-service b/snapcraft/scripts/zebra-service index 9119a4055d..2ee131f9e5 100644 --- a/snapcraft/scripts/zebra-service +++ b/snapcraft/scripts/zebra-service @@ -8,9 +8,13 @@ fi if ! [ -e $SNAP_DATA/vtysh.conf ]; then cp $SNAP/etc/frr/vtysh.conf.default $SNAP_DATA/vtysh.conf fi +EXTRA_OPTIONS="" +if [ -e $SNAP_DATA/fpm.conf ]; then + EXTRA_OPTIONS="`cat $SNAP_DATA/fpm.conf`" +fi exec $SNAP/sbin/zebra \ -f $SNAP_DATA/zebra.conf \ --pid_file $SNAP_DATA/zebra.pid \ --socket $SNAP_DATA/zsock \ - --vty_socket $SNAP_DATA - + --vty_socket $SNAP_DATA \ + --moduledir $SNAP/lib/frr/modules $EXTRA_OPTIONS diff --git a/snapcraft/snapcraft.yaml.in b/snapcraft/snapcraft.yaml.in index a20a1d0392..b5fb24a361 100644 --- a/snapcraft/snapcraft.yaml.in +++ b/snapcraft/snapcraft.yaml.in @@ -83,6 +83,15 @@ apps: - network - network-bind - network-control + nhrpd: + command: bin/nhrpd-service + daemon: simple + plugs: + - network + - network-bind + - network-control + set: + command: bin/set-options zebra-debug: command: sbin/zebra -f $SNAP_DATA/zebra.conf --pid_file $SNAP_DATA/zebra.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA plugs: @@ -132,12 +141,18 @@ apps: - network-bind - network-control ldpd-debug: - command: sbin/ldpd -f $SNAP_DATA/pimd.conf --pid_file $SNAP_DATA/pimd.pid --socket $SNAP_DATA/zsock --ctl_socket $SNAP_DATA --vty_socket $SNAP_DATA + command: sbin/ldpd -f $SNAP_DATA/ldpd.conf --pid_file $SNAP_DATA/ldpd.pid --socket $SNAP_DATA/zsock --ctl_socket $SNAP_DATA --vty_socket $SNAP_DATA plugs: - network - network-bind - network-control - + nhrpd-debug: + command: sbin/nhrpd -f $SNAP_DATA/nhrpd.conf --pid_file $SNAP_DATA/nhrpd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA + plugs: + - network + - network-bind + - network-control + parts: frr: build-packages: @@ -148,7 +163,6 @@ parts: - gawk - libreadline-dev - texinfo - - dejagnu - libncurses5-dev - texlive-latex-base - texlive-generic-recommended @@ -161,6 +175,11 @@ parts: - chrpath - pkg-config - libjson-c-dev + - libc-ares-dev + - bison + - flex + - python3-dev + - protobuf-c-compiler stage-packages: - coreutils - iproute2 @@ -192,6 +211,8 @@ parts: - --enable-group=root - --enable-pimd - --enable-ldpd + - --enable-fpm + - --enable-protobuf - --enable-configfile-mask=0640 - --enable-logfile-mask=0640 - --localstatedir=/var/run @@ -212,6 +233,7 @@ parts: ripd.conf.default: etc/frr/ripd.conf.default ripngd.conf.default: etc/frr/ripngd.conf.default ldpd.conf.default: etc/frr/ldpd.conf.default + nhrpd.conf.default: etc/frr/nhrpd.conf.default vtysh.conf.default: etc/frr/vtysh.conf.default frr-scripts: plugin: make