From nobody Thu Oct 05 13:44:17 2023 X-Original-To: dev-commits-ports-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4S1Xpn4Sb5z4wkYL; Thu, 5 Oct 2023 13:44:17 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4S1Xpn4HkXz4LMG; Thu, 5 Oct 2023 13:44:17 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1696513457; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=21CwoDMSGg38kWsyTP6oymFA/PNr0Y3mqbtEBAqc4Y0=; b=K4z/Y/Md+g1zLXvZaz6X/dF5zMyc1WprWpUcRzurdsxo3k0zGSST3pHt9zE4qVzOy1e95H cgogdZlxi3AXvy8Sxde3XgepsjLreGSf4hHlDK9w7dz3dD1+cMUK+xfgqrwxnvgxEYj7sq X7FnB2Kx4b6ygACZ77/W/FCc59Oaz7HI3ztsErmAUjXYTwpCSUai4XAfKSPyVop/zpaWub 4fIyx/qjinHspTD0WHW5YtqzLeERv7901iuZKLjqgBFbNDL4HhGp9r8kxyF093pHZ1R3c/ JycsUpcFgH3UdaClpXJhEYtKjcLSj4tm1tZPqXicVVw/BvOjuFq1XnO3X1yblw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1696513457; a=rsa-sha256; cv=none; b=ToQGUAHKB2TglykKBbFHArahDWotuO0vNm4wJ8ZQR3B7MXcq632xYhGCs8CFMkUoKwOo9I GE8wbUQJIO7IjUe/EL7qvF05qnCyg581hjM8WtXhPiKnVtHuvinreMOcvyQ/4FTKV3VAiW QdiCSuMLSN6/pp5W2bM+phhgDKsC2eRqXluaqnlKzuTRX+asXPkPwkzVUFi8Rl2gQYGwrr 6SFcXKXYKckZNGxM003/XnQYhMMPolVonAsmNnx+8mQABTobnwqoG5HBvwdJvp7mDPVOvK aMC6LNjkMvJdKK0HSYfVo3Al2iPGmFq/oGJTaaz1dPsgOZFloXiNciv408xi5A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1696513457; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=21CwoDMSGg38kWsyTP6oymFA/PNr0Y3mqbtEBAqc4Y0=; b=epM/HCFuzEaBlkixqT10E5kCEO3xaQGs9jFXwkQTAlTphDX3eTXY2nVmvteJKOu/8KwJGu V++7B133jb8TXQwO30dsYqvx4ryzcvUNMia+/HdO+F3Ecu1O9OA6dF7ld14tuU6lBuaKB6 uGklGcxrZ12GUdh7u5w2lK43n1Bi7Lini6Mo8ZQySAc/pIA3eU6qCmJiQt4zv/KCv35/kt zapFun4ZjqGHqYK5C98O1gl50xUbf/ZJZoY4p+voWMjsm1U8g1qPfCAOZNk0KlLhB1jsLJ w2lIzETZ5wgL/gm65NnkjPC2qFvMJ+LskbSHqNLLgqPks4+3Vt4s45WG8ltikQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4S1Xpn3LWxz1MYB; Thu, 5 Oct 2023 13:44:17 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 395DiHr8028156; Thu, 5 Oct 2023 13:44:17 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 395DiHQM028153; Thu, 5 Oct 2023 13:44:17 GMT (envelope-from git) Date: Thu, 5 Oct 2023 13:44:17 GMT Message-Id: <202310051344.395DiHQM028153@gitrepo.freebsd.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org From: Olivier Cochard Subject: git: 182306a0d515 - main - net/frr9: New major version 9.0.1 of FRRouting List-Id: Commit messages for all branches of the ports repository List-Archive: https://lists.freebsd.org/archives/dev-commits-ports-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-ports-all@freebsd.org X-BeenThere: dev-commits-ports-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: olivier X-Git-Repository: ports X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 182306a0d5159992fd86da0181adfae92a0465b7 Auto-Submitted: auto-generated The branch main has been updated by olivier: URL: https://cgit.FreeBSD.org/ports/commit/?id=182306a0d5159992fd86da0181adfae92a0465b7 commit 182306a0d5159992fd86da0181adfae92a0465b7 Author: Olivier Cochard AuthorDate: 2023-10-05 12:51:49 +0000 Commit: Olivier Cochard CommitDate: 2023-10-05 13:43:21 +0000 net/frr9: New major version 9.0.1 of FRRouting ChangeLog: https://frrouting.org/release/9.0.1/ PR: 273790 Reported by: R. Christian McDonald Sponsored by: Rubicon Communications, LLC ("Netgate") Event: Oslo Hackathon at Modirum --- net/Makefile | 2 + net/frr9-pythontools/Makefile | 7 ++ net/frr9-pythontools/pkg-plist | 3 + net/frr9/Makefile | 147 +++++++++++++++++++++++ net/frr9/distinfo | 3 + net/frr9/files/frr.in | 168 ++++++++++++++++++++++++++ net/frr9/files/patch-Makefile.am | 11 ++ net/frr9/files/watchfrr.in | 30 +++++ net/frr9/pkg-descr | 3 + net/frr9/pkg-message | 17 +++ net/frr9/pkg-plist | 253 +++++++++++++++++++++++++++++++++++++++ 11 files changed, 644 insertions(+) diff --git a/net/Makefile b/net/Makefile index d9df2ddb2829..3ac14a0bed21 100644 --- a/net/Makefile +++ b/net/Makefile @@ -176,6 +176,8 @@ SUBDIR += frr7-pythontools SUBDIR += frr8 SUBDIR += frr8-pythontools + SUBDIR += frr9 + SUBDIR += frr9-pythontools SUBDIR += fspclient SUBDIR += fspd SUBDIR += fsplib diff --git a/net/frr9-pythontools/Makefile b/net/frr9-pythontools/Makefile new file mode 100644 index 000000000000..31791a6d2a3b --- /dev/null +++ b/net/frr9-pythontools/Makefile @@ -0,0 +1,7 @@ +COMMENT= Provide configuration reload functionality for FRR + +PYTHONTOOLS= yes + +MASTERDIR= ${.CURDIR}/../frr9 + +.include "${MASTERDIR}/Makefile" diff --git a/net/frr9-pythontools/pkg-plist b/net/frr9-pythontools/pkg-plist new file mode 100644 index 000000000000..1304b08bdb89 --- /dev/null +++ b/net/frr9-pythontools/pkg-plist @@ -0,0 +1,3 @@ +sbin/frr-reload.py +sbin/generate_support_bundle.py +%%ETCDIR%%/support_bundle_commands.conf diff --git a/net/frr9/Makefile b/net/frr9/Makefile new file mode 100644 index 000000000000..b65f8d16eb70 --- /dev/null +++ b/net/frr9/Makefile @@ -0,0 +1,147 @@ +PORTNAME= frr +PORTVERSION= 9.0.1 +DISTVERSIONPREFIX= frr- +CATEGORIES= net +.if defined(PYTHONTOOLS) +PKGNAMESUFFIX= 9-pythontools +.else +PKGNAMESUFFIX= 9 +.endif + +MAINTAINER= olivier@FreeBSD.org + +COMMENT?= IP routing protocol suite including BGP, IS-IS, OSPF, BABEL and RIP +WWW= https://frrouting.org/ + +LICENSE= GPLv2 +LICENSE_FILE= ${WRKSRC}/COPYING + +.if defined(PYTHONTOOLS) +RUN_DEPENDS= frr-reload:net/frr9 + +USES= python:run shebangfix + +post-patch: + @${REINPLACE_CMD} -e 's|/etc/frr|${ETCDIR}|g' \ + -e 's|/usr/bin|${PREFIX}/bin|g' \ + -e 's|/usr/local/bin/tail|${TAIL}|g' \ + ${WRKSRC}/tools/frr-reload.py + @${REINPLACE_CMD} -e 's|/etc/frr|${ETCDIR}|g' \ + ${WRKSRC}/tools/generate_support_bundle.py + +do-install: + ${MKDIR} ${STAGEDIR}${ETCDIR} + ${INSTALL_SCRIPT} ${WRKSRC}/tools/frr-reload.py ${STAGEDIR}/${PREFIX}/sbin/ + ${INSTALL_SCRIPT} ${WRKSRC}/tools/generate_support_bundle.py ${STAGEDIR}/${PREFIX}/sbin/ + ${INSTALL_DATA} ${WRKSRC}/tools/etc/frr/support_bundle_commands.conf ${STAGEDIR}${ETCDIR}/ +.else + +LIB_DEPENDS= libcares.so:dns/c-ares \ + libjson-c.so:devel/json-c \ + libpcre2-8.so:devel/pcre2 \ + libprotobuf-c.so:devel/protobuf-c \ + libyang.so.2:net/libyang2 + +USES= autoreconf bison compiler:c++11-lang gmake libtool makeinfo \ + pkgconfig python:build readline shebangfix + +BINARY_ALIAS= python=${PYTHON_VERSION} + +CONFLICTS= frr[78] openbgpd openospfd quagga zebra + +GNU_CONFIGURE= yes +INSTALL_TARGET= install-strip +USE_LDCONFIG= yes +.endif + +USE_GITHUB= yes +GH_ACCOUNT= FRRouting + +.if defined(PYTHONTOOLS) +NO_BUILD= yes +NO_ARCH= yes + +SHEBANG_FILES= tools/frr-reload.py \ + tools/generate_support_bundle.py +PLIST= ${.CURDIR}/pkg-plist +PKGMESSAGE= "" +.else +INFO= frr + +OPTIONS_DEFINE= BACKTRACE CONFIGROLLBACKS DATACENTER FPM LDPD MANPAGES \ + MULTIPATH PAM RPKI SHARPD SHELLACCESS SNMP TCMALLOC +OPTIONS_DEFAULT= BACKTRACE FPM MANPAGES RPKI +OPTIONS_SUB= yes + +BACKTRACE_DESC= Enable backtrace +CONFIGROLLBACKS_DESC= Enable configuration rollback support +DATACENTER_DESC= Use reduced BGP timers +FPM_DESC= Enable Forwarding Plane Manager support +LDPD_DESC= Build ldpd +MULTIPATH_DESC= Allow 64 multipath routes (16 default) +PAM_DESC= Use libpam for PAM support in vtysh +RPKI_DESC= Add BGP RPKI (RFC 6810) support +SHARPD_DESC= Build sharpd +SHELLACCESS_DESC= Allow users to access shell/telnet/ssh +SNMP_DESC= SNMP support +TCMALLOC_DESC= Use tcmalloc + +USERS= frr +GROUPS= frr frrvty + +CPPFLAGS+= -I${LOCALBASE}/include +LDFLAGS+= -L${LOCALBASE}/lib + +# PIMD and PBRD compile but doesn't work on FreeBSD +CONFIGURE_ARGS= --enable-user=frr \ + --enable-group=frr \ + --enable-vty-group=frrvty \ + --enable-vtysh \ + --disable-doc-html \ + --sysconfdir=${ETCDIR} \ + --localstatedir=/var/run/frr \ + --disable-nhrpd \ + --disable-pathd \ + --disable-ospfclient \ + --disable-pimd \ + --disable-pbrd \ + --with-vtysh-pager=cat + +BACKTRACE_LIB_DEPENDS= libunwind.so:devel/libunwind +BACKTRACE_CONFIGURE_ENABLE= backtrace +CONFIGROLLBACKS_LIB_DEPENDS= libsqlite3.so:databases/sqlite3 +CONFIGROLLBACKS_CONFIGURE_ENABLE= config-rollbacks +DATACENTER_CONFIGURE_ENABLE= datacenter +FPM_CONFIGURE_ENABLE= fpm +LDPD_CONFIGURE_ENABLE= ldpd +MANPAGES_BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}sphinx>=0,1:textproc/py-sphinx@${PY_FLAVOR} +MANPAGES_CONFIGURE_OFF= --disable-doc +MULTIPATH_CONFIGURE_ON= --enable-multipath=64 +PAM_CONFIGURE_WITH= libpam +RPKI_CONFIGURE_ENABLE= rpki +RPKI_LIB_DEPENDS= librtr.so:net-mgmt/rtrlib \ + libssh.so:security/libssh +SHARPD_CONFIGURE_ENABLE= sharpd +SHELLACCESS_CONFIGURE_ENABLE= shell-access +SNMP_CONFIGURE_ENABLE= snmp +SNMP_LIB_DEPENDS= libnetsnmp.so:net-mgmt/net-snmp +SNMP_USES= ssl +TCMALLOC_CONFIGURE_ENABLE= tcmalloc +TCMALLOC_LIB_DEPENDS= libtcmalloc.so:devel/google-perftools + +USE_RC_SUBR= frr watchfrr + +SHEBANG_FILES= yang/embedmodel.py + +post-patch: + @${REINPLACE_CMD} -e 's|/etc/frr|${ETCDIR}|g' \ + -e 's|/usr/lib/|${PREFIX}/lib/|g' \ + -e 's|frr-pythontools|frr9-pythontools|g' \ + ${WRKSRC}/tools/frr-reload + +post-install: + ${MKDIR} ${STAGEDIR}/var/run/frr + ${INSTALL_SCRIPT} ${WRKSRC}/tools/frr-reload ${STAGEDIR}${PREFIX}/sbin +.endif + +.include diff --git a/net/frr9/distinfo b/net/frr9/distinfo new file mode 100644 index 000000000000..3e9d8b1f7646 --- /dev/null +++ b/net/frr9/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1694701143 +SHA256 (FRRouting-frr-frr-9.0.1_GH0.tar.gz) = 3a371ece41cdf334b070811287f6733acabbadb442c8e693f8b66ec517592db7 +SIZE (FRRouting-frr-frr-9.0.1_GH0.tar.gz) = 10334150 diff --git a/net/frr9/files/frr.in b/net/frr9/files/frr.in new file mode 100644 index 000000000000..45de683c547b --- /dev/null +++ b/net/frr9/files/frr.in @@ -0,0 +1,168 @@ +#!/bin/sh + +# PROVIDE: frr dynamicrouting +# REQUIRE: netif routing +# KEYWORD: nojailvnet shutdown + +# Add the following line to /etc/rc.conf to enable frr: +# frr_enable="YES" +# +# You may also wish to use the following variables to fine-tune startup: +# Enable Integrated configuration mode (using the single configuration file +# frr.conf in place of one file for each dameon) +# frr_vtysh_boot="YES" +# Selecting limited set of daemons to run +# frr_daemons="zebra mgmtd babeld bfdd bgpd eigrpd fabricd isisd ospfd ospf6d ripd ripngd staticd" +# Global tuning +# frr_flags="" +# Per daemon tuning may be done with daemon_name_flags +# zebra_flags="-P 0" +# bgpd_flags="-nrP 0" and so on +# If you want to give the routing daemons a chance to catchup before +# continuing, set frr_wait_for to a "default" or certain prefix. +# frr_wait_for="default" +# Set the time limit for the wait. +# frr_wait_seconds="90" +# +# If the frr daemons require additional shared libraries to start, +# use the following variable to run ldconfig(8) in advance: +# frr_extralibs_path="/usr/local/lib ..." +# +# This RC script was adapted from the net/quagga port + +. /etc/rc.subr + +name=frr +rcvar=${name}_enable + +start_postcmd=start_postcmd +stop_postcmd="rm -f $pidfile" +configtest_cmd=check_config +extra_commands=configtest +command_args="-d" + +load_rc_config $name +: ${frr_enable:="NO"} +: ${frr_flags:=""} +: ${frr_daemons:="zebra mgmtd babeld bfdd bgpd eigrpd fabricd isisd ospfd ospf6d ripd ripngd staticd"} +: ${frr_vtysh_boot:="NO"} +: ${frr_wait_for:=""} +: ${frr_wait_seconds:="90"} + +check_config() +{ + echo "Checking $daemon.conf" + # pimd doesn't support -C + if [ "$daemon" = "pimd" ]; then + echo "Ignored" + else + $command $daemon_flags -C + result=$? + if [ "$result" -eq "0" ]; then + echo "OK" + else + echo "FAILED" + exit + fi + fi +} + +start_postcmd() +{ + local waited_for + waited_for=0 + # Wait only when last daemon has started. + if [ "${frr_daemons}" = "${frr_daemons% ${name}}" ]; then + return; + fi + if [ -n "${frr_wait_for}" ]; then + echo Waiting for ${frr_wait_for} route... + while [ ${waited_for} -lt ${frr_wait_seconds} ]; do + /sbin/route -n get ${frr_wait_for} >/dev/null 2>&1 && break; + waited_for=$((waited_for+1)) + sleep 1; + done + [ ${waited_for} -lt ${frr_wait_seconds} ] || echo Giving up... + fi +} + +do_cmd() +{ + local ret + ret=0 + frr_cmd=$1 + if checkyesno frr_vtysh_boot && ( [ ${frr_cmd} = "restart" ] || [ ${frr_cmd} = "start" ] ); then + echo "Checking intergrated config..." + daemon="vtysh" + daemon_flags="" + command=%%PREFIX%%/bin/${daemon} + if ! [ -f %%ETCDIR%%/vtysh.conf ]; then + touch %%ETCDIR%%/vtysh.conf + fi + check_config + fi + for daemon in ${frr_daemons}; do + command=%%PREFIX%%/sbin/${daemon} + pidfile=/var/run/frr/${daemon}.pid + if ! checkyesno frr_vtysh_boot; then + required_files=%%ETCDIR%%/${daemon}.conf + if [ ${frr_cmd} = "restart" ] || [ ${frr_cmd} = "start" ]; then + check_config + fi + if [ ${frr_cmd} = "start" ] && ! [ -f ${required_files} ]; then + continue + fi + fi + if [ ${frr_cmd} = "stop" ] && [ -z "$(check_process ${command})" ]; then + continue + fi + eval flags=\$\{${daemon}_flags:-\"${frr_flags}\"\} + name=${daemon} + _rc_restart_done=false + run_rc_command "$1" || ret=1 + done + if checkyesno frr_vtysh_boot && ( [ ${frr_cmd} = "restart" ] || [ ${frr_cmd} = "start" ] ); then + echo "Booting for integrated-vtysh-config..." + %%PREFIX%%/bin/vtysh -b + fi + return ${ret} +} + +frr_cmd=$1 + +case "$1" in + force*) + frr_cmd=${frr_cmd#force} + ;; + fast*) + frr_cmd=${frr_cmd#fast} + ;; +esac +shift + +if [ $# -ge 1 -a "$1" != "all" ]; then + frr_daemons="$*" +fi + +case "${frr_cmd}" in + start|quietstart) + if [ -n "${frr_extralibs_path}" ]; then + /sbin/ldconfig -m ${frr_extralibs_path} + fi + # Why should I need to add this check ? + checkyesno frr_enable && do_cmd "start" + ;; + stop) + frr_daemons=$(reverse_list ${frr_daemons}) + do_cmd "stop" + ;; + restart) + frr_daemons=$(reverse_list ${frr_daemons}) + do_cmd "stop" + frr_daemons=$(reverse_list ${frr_daemons}) + checkyesno frr_enable && do_cmd "start" + ;; + *) + do_cmd "${frr_cmd}" + ;; +esac diff --git a/net/frr9/files/patch-Makefile.am b/net/frr9/files/patch-Makefile.am new file mode 100644 index 000000000000..626f17a2d784 --- /dev/null +++ b/net/frr9/files/patch-Makefile.am @@ -0,0 +1,11 @@ +--- Makefile.am.orig 2021-11-08 12:44:24.000000000 +0900 ++++ Makefile.am 2021-12-23 09:23:13.400659000 +0900 +@@ -168,7 +168,7 @@ + include qpb/subdir.am + include fpm/subdir.am + include grpc/subdir.am +-include tools/subdir.am ++# include tools/subdir.am + + include bgpd/subdir.am + include bgpd/rfp-example/librfp/subdir.am diff --git a/net/frr9/files/watchfrr.in b/net/frr9/files/watchfrr.in new file mode 100644 index 000000000000..f3a36434e7f6 --- /dev/null +++ b/net/frr9/files/watchfrr.in @@ -0,0 +1,30 @@ +#!/bin/sh + +# PROVIDE: watchfrr +# REQUIRE: NETWORKING frr +# KEYWORD: nojailvtnet shutdown + +# Add the following line to /etc/rc.conf to enable watchfrr: +# watchfrr_enable="YES" +# +# You may also wish to use the following variables to fine-tune startup: +# watchfrr_flags +# Example of flags usage: +# watchfrr_flags=" -d -r /usr/sbin/servicebBfrrbBrestartbB%s -s /usr/sbin/servicebBfrrbBstartbB%s -k /usr/sbin/servicebBfrrbBstopbB%s -b bB -t 30 zebra ripd ripngd ospfd ospf6d bgpd isisd eigrpd babeld bfdd staticd" + +. /etc/rc.subr + +name=watchfrr +rcvar=${name}_enable + +load_rc_config $name + +stop_postcmd="rm -f $pidfile" + +watchfrr_enable=${watchfrr_enable:-"NO"} +watchfrr_flags=${watchfrr_flags:-"-d -r /usr/sbin/servicebBfrrbBrestartbB%s -s /usr/sbin/servicebBfrrbBstartbB%s -k /usr/sbin/servicebBfrrbBstopbB%s -b bB -t 30 zebra babeld bfdd bgpd eigrpd fabricd isisd ospfd ospf6d ripd ripngd staticd"} + +command=%%PREFIX%%/sbin/watchfrr +pidfile=/var/run/frr/watchfrr.pid + +run_rc_command "$1" diff --git a/net/frr9/pkg-descr b/net/frr9/pkg-descr new file mode 100644 index 000000000000..1e9960661fb1 --- /dev/null +++ b/net/frr9/pkg-descr @@ -0,0 +1,3 @@ +FRRouting (FRR) is an IP routing protocol suite for Linux and Unix platforms +which includes protocol daemons for BGP, IS-IS, OSPF and RIP. FRR has its roots +in the Quagga project. diff --git a/net/frr9/pkg-message b/net/frr9/pkg-message new file mode 100644 index 000000000000..9a172838d6e1 --- /dev/null +++ b/net/frr9/pkg-message @@ -0,0 +1,17 @@ +[ +{ type: install + message: <