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];
}
-#define OPTION_VTYSOCK 1000
+#define OPTION_VTYSOCK 1000
+#define OPTION_MODULEDIR 1002
static const struct option lo_always[] = {
{ "help", no_argument, NULL, 'h' },
{ "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 = {
" -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
};
struct option_chain *next;
const char *arg;
};
+
static struct option_chain *modules = NULL, **modnext = &modules;
static int errors = 0;
}
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;
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));
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);
const char *config_file;
const char *pid_file;
const char *vty_path;
+ const char *module_path;
const char *proghelp;
void (*printhelp)(FILE *target);
extern char config_default[256];
extern const char frr_sysconfdir[];
extern const char frr_vtydir[];
+extern const char frr_moduledir[];
#endif /* _ZEBRA_FRR_H */
}
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;
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);
}
}
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);
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.
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
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?
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/
--- /dev/null
+#!/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
--- /dev/null
+#!/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
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
- 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:
- 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:
- gawk
- libreadline-dev
- texinfo
- - dejagnu
- libncurses5-dev
- texlive-latex-base
- texlive-generic-recommended
- chrpath
- pkg-config
- libjson-c-dev
+ - libc-ares-dev
+ - bison
+ - flex
+ - python3-dev
+ - protobuf-c-compiler
stage-packages:
- coreutils
- iproute2
- --enable-group=root
- --enable-pimd
- --enable-ldpd
+ - --enable-fpm
+ - --enable-protobuf
- --enable-configfile-mask=0640
- --enable-logfile-mask=0640
- --localstatedir=/var/run
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