From 3ab11ecc7ba6de37393d334bf9f6cbc88a3eeec1 Mon Sep 17 00:00:00 2001 From: Martin Winter Date: Thu, 26 Jan 2017 04:23:43 +0700 Subject: [PATCH] snapcraft: Add snapcraft build and definition files Signed-off-by: Martin Winter --- Makefile.am | 4 +- configure.ac | 3 + snapcraft/.gitignore | 6 + snapcraft/Makefile.am | 11 ++ snapcraft/README.snap_build.md | 93 ++++++++++ snapcraft/README.usage.md | 77 ++++++++ snapcraft/defaults/bgpd.conf.default | 0 snapcraft/defaults/isisd.conf.default | 0 snapcraft/defaults/ldpd.conf.default | 0 snapcraft/defaults/ospf6d.conf.default | 0 snapcraft/defaults/ospfd.conf.default | 0 snapcraft/defaults/pimd.conf.default | 0 snapcraft/defaults/ripd.conf.default | 0 snapcraft/defaults/ripngd.conf.default | 0 snapcraft/defaults/vtysh.conf.default | 1 + snapcraft/defaults/zebra.conf.default | 0 snapcraft/helpers/Makefile | 7 + snapcraft/scripts/Makefile | 14 ++ snapcraft/scripts/bgpd-service | 13 ++ snapcraft/scripts/isisd-service | 13 ++ snapcraft/scripts/ldpd-service | 14 ++ snapcraft/scripts/ospf6d-service | 13 ++ snapcraft/scripts/ospfd-service | 13 ++ snapcraft/scripts/pimd-service | 13 ++ snapcraft/scripts/ripd-service | 13 ++ snapcraft/scripts/ripngd-service | 13 ++ snapcraft/scripts/zebra-service | 16 ++ snapcraft/setup/gui/icon.png | Bin 0 -> 21830 bytes snapcraft/snapcraft.yaml.in | 235 +++++++++++++++++++++++++ 29 files changed, 570 insertions(+), 2 deletions(-) create mode 100644 snapcraft/.gitignore create mode 100644 snapcraft/Makefile.am create mode 100644 snapcraft/README.snap_build.md create mode 100644 snapcraft/README.usage.md create mode 100644 snapcraft/defaults/bgpd.conf.default create mode 100644 snapcraft/defaults/isisd.conf.default create mode 100644 snapcraft/defaults/ldpd.conf.default create mode 100644 snapcraft/defaults/ospf6d.conf.default create mode 100644 snapcraft/defaults/ospfd.conf.default create mode 100644 snapcraft/defaults/pimd.conf.default create mode 100644 snapcraft/defaults/ripd.conf.default create mode 100644 snapcraft/defaults/ripngd.conf.default create mode 100644 snapcraft/defaults/vtysh.conf.default create mode 100644 snapcraft/defaults/zebra.conf.default create mode 100644 snapcraft/helpers/Makefile create mode 100644 snapcraft/scripts/Makefile create mode 100644 snapcraft/scripts/bgpd-service create mode 100644 snapcraft/scripts/isisd-service create mode 100644 snapcraft/scripts/ldpd-service create mode 100644 snapcraft/scripts/ospf6d-service create mode 100644 snapcraft/scripts/ospfd-service create mode 100644 snapcraft/scripts/pimd-service create mode 100644 snapcraft/scripts/ripd-service create mode 100644 snapcraft/scripts/ripngd-service create mode 100644 snapcraft/scripts/zebra-service create mode 100644 snapcraft/setup/gui/icon.png create mode 100644 snapcraft/snapcraft.yaml.in diff --git a/Makefile.am b/Makefile.am index d9b57a5eae..63dedeac06 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3,11 +3,11 @@ SUBDIRS = lib qpb fpm @ZEBRA@ @LIBRFP@ @RFPTEST@ \ @BGPD@ @RIPD@ @RIPNGD@ @OSPFD@ @OSPF6D@ @LDPD@ \ @ISISD@ @PIMD@ @WATCHFRR@ @VTYSH@ @OSPFCLIENT@ @DOC@ m4 @pkgsrcdir@ \ - redhat @SOLARIS@ tests tools cumulus + redhat @SOLARIS@ tests tools cumulus snapcraft DIST_SUBDIRS = lib qpb fpm zebra bgpd ripd ripngd ospfd ospf6d ldpd \ isisd watchfrr vtysh ospfclient doc m4 pkgsrc redhat tests \ - solaris pimd @LIBRFP@ @RFPTEST@ tools cumulus + solaris pimd @LIBRFP@ @RFPTEST@ tools cumulus snapcraft EXTRA_DIST = aclocal.m4 SERVICES REPORTING-BUGS \ update-autotools \ diff --git a/configure.ac b/configure.ac index 14f6292da5..da22962577 100755 --- a/configure.ac +++ b/configure.ac @@ -483,6 +483,7 @@ dnl ----------------------------------- if test "x${EXTRAVERSION}" != "x" ; then VERSION="${VERSION}${EXTRAVERSION}" PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}" + AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"]) PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}" fi @@ -1617,6 +1618,8 @@ AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile pkgsrc/Makefile fpm/Makefile redhat/frr.spec + snapcraft/Makefile + snapcraft/snapcraft.yaml lib/version.h doc/defines.texi doc/bgpd.8 diff --git a/snapcraft/.gitignore b/snapcraft/.gitignore new file mode 100644 index 0000000000..e050ff0c8d --- /dev/null +++ b/snapcraft/.gitignore @@ -0,0 +1,6 @@ +snapcraft.yaml +parts +prime +stage +quagga*.snap +!*/Makefile diff --git a/snapcraft/Makefile.am b/snapcraft/Makefile.am new file mode 100644 index 0000000000..15813be72f --- /dev/null +++ b/snapcraft/Makefile.am @@ -0,0 +1,11 @@ +EXTRA_DIST = snapcraft.yaml \ + scripts/Makefile scripts/zebra-service scripts/bgpd-service \ + scripts/isisd-service scripts/ripd-service scripts/ripngd-service \ + scripts/ospf6d-service scripts/ospfd-service \ + scripts/isisd-service scripts/pimd-service \ + scripts/ldpd-service \ + defaults/bgpd.conf.default defaults/isisd.conf.default \ + defaults/ospf6d.conf.default defaults/ospfd.conf.default \ + defaults/pimd.conf.default defaults/zebra.conf.default \ + defaults/ripd.conf.default defaults/ripngd.conf.default \ + defaults/ldpd.conf.default defaults/vtysh.conf.default diff --git a/snapcraft/README.snap_build.md b/snapcraft/README.snap_build.md new file mode 100644 index 0000000000..341b210f71 --- /dev/null +++ b/snapcraft/README.snap_build.md @@ -0,0 +1,93 @@ +Building your own FreeRangeRouting Snap +======================================== +(Tested on Ubuntu 16.04 with Snap Version 2, does not work on Ubuntu 15.x +which uses earlier versions of snaps) + +1. Install snapcraft: + + sudo apt-get install snapcraft + +2. Checkout FreeRangeRouting under a **unpriviledged** user account + + git clone https://github.com/freerangerouting/frr.git + cd frr + +3. Run Bootstrap and make distribution tar.gz + + ./bootstrap.sh + ./configure --with-pkg-extra-version=-MySnapVersion + make dist + + Note: configure parameters are not important for the Snap building, + except the `with-pkg-extra-version` if you want to give the Snap + a specific name to mark your own unoffical build + + This will build `frr-something.tar.gz` - the distribution tar and + the snapcraft/snapcraft.yaml with the matching version number + +4. Create snap + + cd snapcraft + snapcraft + + You should now end up with `frr_something.snap` + +Installing the snap +=================== +(This can be done on a different system) + +1. Install snapd + + sudo apt-get install snapd + +2. Install self-built frr snap. (`--force-dangerous` is required to + install a unsigned self-built snap) + + snap install --force-dangerous ./frr*.snap + + Connect the priviledged `network-control` plug to the snap: + + snap connect frr:network-control ubuntu-core:network-control + +DONE. + +The Snap will be auto-started and running. + +Operations +========== + +### FreeRangeRouting Daemons +At this time, all FreeRangeRouting daemons are auto-started. + +A daemon can be stopped/started with (ie ospf6d) + + systemctl stop snap.frr.ospf6d.service + systemctl start snap.frr.ospf6d.service + +or disabled/enabled with + + systemctl disable snap.frr.ospf6d.service + systemctl enable snap.frr.ospf6d.service + +### FreeRangeRouting Commands +All the commands are prefixed with frr. + + frr.vtysh -> vtysh + frr.version -> Just gives version output (zebra --version) + frr.readme -> Returns simple README with hints on using FRR + + frr.bgpd-debug -> Directly start each daemon (without service) + frr.isisd-debug + frr.ospf6d-debug + frr.ospfd-debug + frr.pimd-debug + frr.ripd-debug + frr.ripngd-debug + frr.ldp-debug + frr.zebra-debug + +vtysh can be accessed as frr.vtysh (Make sure you have /snap/bin in your +path). If access as `vtysh` instead of `frr.vtysh` is needed, a symlink +can be created: + + sudo ln -s /snap/bin/frr.vtysh /usr/local/bin/vtysh diff --git a/snapcraft/README.usage.md b/snapcraft/README.usage.md new file mode 100644 index 0000000000..2d2b32b6b7 --- /dev/null +++ b/snapcraft/README.usage.md @@ -0,0 +1,77 @@ +Using the FreeRangeRouting Snap +=============================== + +After installing the Snap, the priviledged plug need to be connected: + + snap connect frr:network-control ubuntu-core:network-control + +Enabling/Disabling FreeRangeRouting Daemons +------------------------------------------- + +By default (at this time), all FreeRangeRouting daemons will be enabled +on installation. If you want to disable a specific daemon, then use +the systemctl commands + +ie for `ospf6d` (OSPFv3): + + systemctl disable snap.frr.ospf6d.service + systemctl enable snap.frr.ospf6d.service + +The daemons are: `ripd`, `ripngd`, `ospfd`, `ospf6d`, `isisd`, `bgpd`, +`pimd`, `zebra` + +Commands defined by this snap +----------------------------- + +- `frr.vtysh`: + FreeRangeRouting VTY Shell (configuration tool) +- `frr.version`: + Returns output of `zebra --version` to display version and configured + options +- `frr.readme`: + Returns this document `cat README_usage.md` + +and for debugging defined at this time (May get removed later - do not +depend on them). These are mainly intended to debug the Snap + +- `frr.zebra-debug`: + Starts zebra daemon in foreground +- `frr.ripd-debug`: + Starts ripd daemon in foreground +- `frr.ripngd-debug`: + Starts ripng daemon in foreground +- `frr.ospfd-debug`: + Starts ospfd daemon in foreground +- `frr.ospf6d-debug`: + Starts ospf6d daemon in foreground +- `frr.isisd-debug`: + Starts isisd daemon in foreground +- `frr.bgpd-debug`: + Starts bgpd daemon in foreground +- `frr.pimd-debug`: + Starts pimd daemon in foreground +- `frr.ldpd-debug`: + Starts ldpd daemon in foreground + +FAQ +--- +- frr.vtysh displays `--MORE--` on long output. How to suppress this? + - Define `VTYSH_PAGER` to `cat` (default is `more`). (Ie add + `export VTYSH_PAGER=cat` to the end of your `.profile`) + +Sourcecode available +==================== + +The source for this SNAP is available as part of the FreeRangeRouting +Source Code Distribution. + + https://github.com/freerangerouting/frr.git + +Instructions for rebuilding the snap are in `README.snap_build.md` + +Feedback welcome +================ + +Please send Feedback about this snap to Martin Winter at +`mwinter@opensourcerouting.org` + diff --git a/snapcraft/defaults/bgpd.conf.default b/snapcraft/defaults/bgpd.conf.default new file mode 100644 index 0000000000..e69de29bb2 diff --git a/snapcraft/defaults/isisd.conf.default b/snapcraft/defaults/isisd.conf.default new file mode 100644 index 0000000000..e69de29bb2 diff --git a/snapcraft/defaults/ldpd.conf.default b/snapcraft/defaults/ldpd.conf.default new file mode 100644 index 0000000000..e69de29bb2 diff --git a/snapcraft/defaults/ospf6d.conf.default b/snapcraft/defaults/ospf6d.conf.default new file mode 100644 index 0000000000..e69de29bb2 diff --git a/snapcraft/defaults/ospfd.conf.default b/snapcraft/defaults/ospfd.conf.default new file mode 100644 index 0000000000..e69de29bb2 diff --git a/snapcraft/defaults/pimd.conf.default b/snapcraft/defaults/pimd.conf.default new file mode 100644 index 0000000000..e69de29bb2 diff --git a/snapcraft/defaults/ripd.conf.default b/snapcraft/defaults/ripd.conf.default new file mode 100644 index 0000000000..e69de29bb2 diff --git a/snapcraft/defaults/ripngd.conf.default b/snapcraft/defaults/ripngd.conf.default new file mode 100644 index 0000000000..e69de29bb2 diff --git a/snapcraft/defaults/vtysh.conf.default b/snapcraft/defaults/vtysh.conf.default new file mode 100644 index 0000000000..5c15e6bc4a --- /dev/null +++ b/snapcraft/defaults/vtysh.conf.default @@ -0,0 +1 @@ +no service integrated-vtysh-config diff --git a/snapcraft/defaults/zebra.conf.default b/snapcraft/defaults/zebra.conf.default new file mode 100644 index 0000000000..e69de29bb2 diff --git a/snapcraft/helpers/Makefile b/snapcraft/helpers/Makefile new file mode 100644 index 0000000000..c44bee7b4e --- /dev/null +++ b/snapcraft/helpers/Makefile @@ -0,0 +1,7 @@ +all: + +install: + install -D -m 0755 $(DESTDIR)/usr/bin/telnet.netkit $(DESTDIR)/bin/telnet + install -D -m 0755 $(DESTDIR)/usr/bin/traceroute.db $(DESTDIR)/bin/traceroute + install -D -m 0755 $(DESTDIR)/usr/bin/traceroute6.db $(DESTDIR)/bin/traceroute6 + diff --git a/snapcraft/scripts/Makefile b/snapcraft/scripts/Makefile new file mode 100644 index 0000000000..00984c2afa --- /dev/null +++ b/snapcraft/scripts/Makefile @@ -0,0 +1,14 @@ +all: + +install: + mkdir -p $(DESTDIR)/bin + install -D -m 0755 zebra-service $(DESTDIR)/bin/ + install -D -m 0755 bgpd-service $(DESTDIR)/bin/ + install -D -m 0755 ospfd-service $(DESTDIR)/bin/ + install -D -m 0755 ospf6d-service $(DESTDIR)/bin/ + install -D -m 0755 ripd-service $(DESTDIR)/bin/ + install -D -m 0755 ripngd-service $(DESTDIR)/bin/ + install -D -m 0755 isisd-service $(DESTDIR)/bin/ + install -D -m 0755 pimd-service $(DESTDIR)/bin/ + install -D -m 0755 ldpd-service $(DESTDIR)/bin/ + diff --git a/snapcraft/scripts/bgpd-service b/snapcraft/scripts/bgpd-service new file mode 100644 index 0000000000..4072031eda --- /dev/null +++ b/snapcraft/scripts/bgpd-service @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e -x + +if ! [ -e $SNAP_DATA/bgpd.conf ]; then + cp $SNAP/etc/frr/bgpd.conf.default $SNAP_DATA/bgpd.conf +fi +exec $SNAP/sbin/bgpd \ + -f $SNAP_DATA/bgpd.conf \ + --pid_file $SNAP_DATA/bgpd.pid \ + --socket $SNAP_DATA/zsock \ + --vty_socket $SNAP_DATA + diff --git a/snapcraft/scripts/isisd-service b/snapcraft/scripts/isisd-service new file mode 100644 index 0000000000..aef92e997a --- /dev/null +++ b/snapcraft/scripts/isisd-service @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e -x + +if ! [ -e $SNAP_DATA/isisd.conf ]; then + cp $SNAP/etc/frr/isisd.conf.default $SNAP_DATA/isisd.conf +fi +exec $SNAP/sbin/isisd \ + -f $SNAP_DATA/isisd.conf \ + --pid_file $SNAP_DATA/isisd.pid \ + --socket $SNAP_DATA/zsock \ + --vty_socket $SNAP_DATA + diff --git a/snapcraft/scripts/ldpd-service b/snapcraft/scripts/ldpd-service new file mode 100644 index 0000000000..4c4a8ebae7 --- /dev/null +++ b/snapcraft/scripts/ldpd-service @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e -x + +if ! [ -e $SNAP_DATA/ldpd.conf ]; then + cp $SNAP/etc/frr/ldpd.conf.default $SNAP_DATA/ldpd.conf +fi +exec $SNAP/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 + diff --git a/snapcraft/scripts/ospf6d-service b/snapcraft/scripts/ospf6d-service new file mode 100644 index 0000000000..4dc3cb0849 --- /dev/null +++ b/snapcraft/scripts/ospf6d-service @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e -x + +if ! [ -e $SNAP_DATA/ospf6d.conf ]; then + cp $SNAP/etc/frr/ospf6d.conf.default $SNAP_DATA/ospf6d.conf +fi +exec $SNAP/sbin/ospf6d \ + -f $SNAP_DATA/ospf6d.conf \ + --pid_file $SNAP_DATA/ospf6d.pid \ + --socket $SNAP_DATA/zsock \ + --vty_socket $SNAP_DATA + diff --git a/snapcraft/scripts/ospfd-service b/snapcraft/scripts/ospfd-service new file mode 100644 index 0000000000..7cac34b510 --- /dev/null +++ b/snapcraft/scripts/ospfd-service @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e -x + +if ! [ -e $SNAP_DATA/ospfd.conf ]; then + cp $SNAP/etc/frr/ospfd.conf.default $SNAP_DATA/ospfd.conf +fi +exec $SNAP/sbin/ospfd \ + -f $SNAP_DATA/ospfd.conf \ + --pid_file $SNAP_DATA/ospfd.pid \ + --socket $SNAP_DATA/zsock \ + --vty_socket $SNAP_DATA + diff --git a/snapcraft/scripts/pimd-service b/snapcraft/scripts/pimd-service new file mode 100644 index 0000000000..3ddd394ee0 --- /dev/null +++ b/snapcraft/scripts/pimd-service @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e -x + +if ! [ -e $SNAP_DATA/pimd.conf ]; then + cp $SNAP/etc/frr/pimd.conf.default $SNAP_DATA/pimd.conf +fi +exec $SNAP/sbin/pimd \ + -f $SNAP_DATA/pimd.conf \ + --pid_file $SNAP_DATA/pimd.pid \ + --socket $SNAP_DATA/zsock \ + --vty_socket $SNAP_DATA + diff --git a/snapcraft/scripts/ripd-service b/snapcraft/scripts/ripd-service new file mode 100644 index 0000000000..f9959be4cb --- /dev/null +++ b/snapcraft/scripts/ripd-service @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e -x + +if ! [ -e $SNAP_DATA/ripd.conf ]; then + cp $SNAP/etc/frr/ripd.conf.default $SNAP_DATA/ripd.conf +fi +exec $SNAP/sbin/ripd \ + -f $SNAP_DATA/ripd.conf \ + --pid_file $SNAP_DATA/ripd.pid \ + --socket $SNAP_DATA/zsock \ + --vty_socket $SNAP_DATA + diff --git a/snapcraft/scripts/ripngd-service b/snapcraft/scripts/ripngd-service new file mode 100644 index 0000000000..bd06e6bae5 --- /dev/null +++ b/snapcraft/scripts/ripngd-service @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e -x + +if ! [ -e $SNAP_DATA/ripngd.conf ]; then + cp $SNAP/etc/frr/ripngd.conf.default $SNAP_DATA/ripngd.conf +fi +exec $SNAP/sbin/ripngd \ + -f $SNAP_DATA/ripngd.conf \ + --pid_file $SNAP_DATA/ripngd.pid \ + --socket $SNAP_DATA/zsock \ + --vty_socket $SNAP_DATA + diff --git a/snapcraft/scripts/zebra-service b/snapcraft/scripts/zebra-service new file mode 100644 index 0000000000..9119a4055d --- /dev/null +++ b/snapcraft/scripts/zebra-service @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e -x + +if ! [ -e $SNAP_DATA/zebra.conf ]; then + cp $SNAP/etc/frr/zebra.conf.default $SNAP_DATA/zebra.conf +fi +if ! [ -e $SNAP_DATA/vtysh.conf ]; then + cp $SNAP/etc/frr/vtysh.conf.default $SNAP_DATA/vtysh.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 + diff --git a/snapcraft/setup/gui/icon.png b/snapcraft/setup/gui/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f68e6ddea002f7a3f87ae71742444603640fb4 GIT binary patch literal 21830 zcmc$lQ*`7_)b2Z&j&0kvHL-0clZkEHnmC!*$;7rb6Wg|Jo_^0dSLga$>$}KGI;pOz zf2C^I-p}*vNF@bH1Xx^H004j>EhVM`0Dysh1Oq?=LErS8%6kmQ!4qDs=DqQpv0 z_CGCc%m4sxlu-38`!zLm!AN_RB1|D-Ey?hxp&E5n-8MYjs$rmXQt^chX7R}~E%`n# zS7bRJ)Y?h&A4Ts#F5o+u@CpQy6h8?9(8PP?vA0oLHJtX3w3PSpAQB1X#W(ex4mT4j z)j_?7*D;obw0ioJFi1im=W@XF)!*3Gi$Jy37YmMy^bJN)Z8 zPDtUMbTq(2iHsuGQz zrgoU(9a~twkQg&v@6YvvwcfId+e}-LA~)$C)w&~vmYVMIuVrfuYucoZ{l7iOzs~xA zdk`t#mnZtVY#vD(8djli0yn>T&p4FA$-h~-vUuZT*UdaooTdLI<6d$#M{Ov=3b@jE zZd^7!PAL1UYPoH^-6!MwC&Tc!qsC####n<+#yB`x{Ewc}iTwbm0HMaJ&a!V4v%Fkv z1(>(8n$~vJ_)Wh2xqO`aC86ja!nn> zyR8a1pOIHoYX0c8TR)5k8G(Qv*c=7Inf{eWAD1=1C6i=3kvnkzMb zYG`15Mq63+7bL?mCfG5i4yZZZTf6$B3(32KN#l-1Hs89%-8SHDFLlMjzxw&kG%R$> z(0nhDA9`?C!>$#44%rH#p&r`1c8?0B_JIkiytP|z1Shh)8!jy~9sy74Q&eJnL|nLE z)m*rIhNNGZGiG-}+5krn8$3ERP}qQRkkWPr02s;s`vUVQ7IFgsgaOiGB5EFB7uisq zYC{hr;hTKau(Yt$;^KV<1W=CXvI~;)O;gv5^+^Gi7y!!?@n)L%?MW z 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 WztLIZ{|Nvck{Ril=r(9SNc=xHQvkjI literal 0 HcmV?d00001 diff --git a/snapcraft/snapcraft.yaml.in b/snapcraft/snapcraft.yaml.in new file mode 100644 index 0000000000..a703766f0b --- /dev/null +++ b/snapcraft/snapcraft.yaml.in @@ -0,0 +1,235 @@ +name: frr +version: @VERSION@ +summary: FreeRangeRouting BGP/OSPFv2/OSPFv3/ISIS/RIP/RIPng/PIM/LDP routing daemon +description: BGP/OSPFv2/OSPFv3/ISIS/RIP/RIPng/PIM routing daemon + FreeRangeRouting (FRR) is free software which manages TCP/IP based routing + protocols. It supports BGP4, BGP4+, OSPFv2, OSPFv3, IS-IS, RIPv1, RIPv2, + RIPng, PIM and LDP as well as the IPv6 versions of these. + FreeRangeRouting (frr) is a fork of Quagga. +confinement: strict +grade: devel + +apps: + vtysh: + command: bin/vtysh --vty_socket $SNAP_DATA --config_dir $SNAP_DATA + plugs: + - network + - network-bind + - network-control + version: + command: sbin/zebra --version + readme: + command: bin/cat $SNAP/doc/README.usage.md + zebra: + command: bin/zebra-service + daemon: simple + plugs: + - network + - network-bind + - network-control + bgpd: + command: bin/bgpd-service + daemon: simple + plugs: + - network + - network-bind + - network-control + ospfd: + command: bin/ospfd-service + daemon: simple + plugs: + - network + - network-bind + - network-control + ospf6d: + command: bin/ospf6d-service + daemon: simple + plugs: + - network + - network-bind + - network-control + isisd: + command: bin/isisd-service + daemon: simple + plugs: + - network + - network-bind + - network-control + ripd: + command: bin/ripd-service + daemon: simple + plugs: + - network + - network-bind + - network-control + ripngd: + command: bin/ripngd-service + daemon: simple + plugs: + - network + - network-bind + - network-control + pimd: + command: bin/pimd-service + daemon: simple + plugs: + - network + - network-bind + - network-control + ldpd: + command: bin/ldpd-service + daemon: simple + plugs: + - network + - network-bind + - network-control + 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 + - network-bind + - network-control + bgpd-debug: + command: sbin/bgpd -f $SNAP_DATA/bgpd.conf --pid_file $SNAP_DATA/bgpd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA + plugs: + - network + - network-bind + - network-control + ospfd-debug: + command: sbin/ospfd -f $SNAP_DATA/ospfd.conf --pid_file $SNAP_DATA/ospfd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA + plugs: + - network + - network-bind + - network-control + ospf6d-debug: + command: sbin/ospf6d -f $SNAP_DATA/ospf6d.conf --pid_file $SNAP_DATA/ospf6d.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA + plugs: + - network + - network-bind + - network-control + isisd-debug: + command: sbin/isisd -f $SNAP_DATA/isisd.conf --pid_file $SNAP_DATA/isisd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA + plugs: + - network + - network-bind + - network-control + ripd-debug: + command: sbin/ripd -f $SNAP_DATA/ripd.conf --pid_file $SNAP_DATA/ripd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA + plugs: + - network + - network-bind + - network-control + ripngd-debug: + command: sbin/ripngd -f $SNAP_DATA/ripngd.conf --pid_file $SNAP_DATA/ripngd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA + plugs: + - network + - network-bind + - network-control + pimd-debug: + command: sbin/pimd -f $SNAP_DATA/pimd.conf --pid_file $SNAP_DATA/pimd.pid --socket $SNAP_DATA/zsock --vty_socket $SNAP_DATA + plugs: + - network + - 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 + plugs: + - network + - network-bind + - network-control + +parts: + frr: + build-packages: + - autoconf + - automake + - libtool + - make + - gawk + - libreadline-dev + - texinfo + - dejagnu + - libncurses5-dev + - texlive-latex-base + - texlive-generic-recommended + - libcap-dev + - imagemagick + - ghostscript + - groff + - hardening-wrapper + - libpcre3-dev + - chrpath + - pkg-config + - libjson-c-dev + stage-packages: + - coreutils + - iproute2 + - logrotate + - libcap2 + - libc6 + - libtinfo5 + - libreadline6 + - libjson-c2 + plugin: autotools + source: ../frr-@PACKAGE_VERSION@.tar.gz + configflags: + - --with-cflags=-g + - --with-cflags=-O0 + - --with-cflags=-std=gnu99 + - --with-cflags=-fpie + - --with-cflags=-fno-omit-frame-pointer + - --with-cflags=-Wall + - --enable-vtysh + - --enable-isisd + - --enable-watchfrr + - --enable-ospfclient=yes + - --enable-ospfapi=yes + - --enable-multipath=64 + - --enable-rtadv + - --enable-irdp + - --enable-gcc-rdynamic + - --enable-user=root + - --enable-group=root + - --enable-pimd + - --enable-ldpd + - --enable-configfile-mask=0640 + - --enable-logfile-mask=0640 + - --localstatedir=/var/run + - --sbindir=/sbin + - --bindir=/bin + - --sysconfdir=/etc/frr + - --with-pkg-extra-version=@PACKAGE_EXTRAVERSION@ + frr-defaults: + plugin: dump + source: defaults + organize: + zebra.conf.default: etc/frr/zebra.conf.default + bgpd.conf.default: etc/frr/bgpd.conf.default + isisd.conf.default: etc/frr/isisd.conf.default + ospf6d.conf.default: etc/frr/ospf6d.conf.default + ospfd.conf.default: etc/frr/ospfd.conf.default + pimd.conf.default: etc/frr/pimd.conf.default + ripd.conf.default: etc/frr/ripd.conf.default + ripngd.conf.default: etc/frr/ripngd.conf.default + ldpd.conf.default: etc/frr/ldpd.conf.default + vtysh.conf.default: etc/frr/vtysh.conf.default + frr-scripts: + plugin: make + source: scripts + helpers: + stage-packages: + - telnet + - traceroute + plugin: make + source: helpers + prime: + - bin/telnet + - bin/traceroute + - bin/traceroute6 + docs: + plugin: dump + source: . + organize: + README.usage.md: doc/README.usage.md + README.snap_build.md: doc/README.snap_build.md +