diff --git a/net/frr8/Makefile b/net/frr8/Makefile index c26f3994931c..31489d751c72 100644 --- a/net/frr8/Makefile +++ b/net/frr8/Makefile @@ -1,147 +1,146 @@ PORTNAME= frr -PORTVERSION= 8.5.6 +PORTVERSION= 8.5.7 DISTVERSIONPREFIX= frr- -PORTREVISION= 1 CATEGORIES= net .if defined(PYTHONTOOLS) PKGNAMESUFFIX= 8-pythontools .else PKGNAMESUFFIX= 8 .endif MAINTAINER= olivier@FreeBSD.org COMMENT?= IP routing protocol suite including BGP, IS-IS, OSPF and RIP WWW= https://frrouting.org/ LICENSE= GPLv2 LICENSE_FILE= ${WRKSRC}/COPYING .if defined(PYTHONTOOLS) RUN_DEPENDS= frr-reload:net/frr8 USES= python:run shebangfix post-patch: @${REINPLACE_CMD} -e 's|/etc/frr|${ETCDIR}|g' \ -e 's|/usr/bin|${PREFIX}/bin|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 \ 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= frr9 frr10 openbgpd openospfd quagga zebra GNU_CONFIGURE= yes GNU_CONFIGURE_MANPREFIX= ${PREFIX}/share 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/frr|${PREFIX}/sbin|g' \ -e 's|frr-pythontools|frr8-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/frr8/distinfo b/net/frr8/distinfo index 1e3e1cc52f91..88e9e7fe240a 100644 --- a/net/frr8/distinfo +++ b/net/frr8/distinfo @@ -1,3 +1,3 @@ -TIMESTAMP = 1727185675 -SHA256 (FRRouting-frr-frr-8.5.6_GH0.tar.gz) = 5f3a32e66efdf2628548165d10327688847443c342788b31c4ea98368cfacbf8 -SIZE (FRRouting-frr-frr-8.5.6_GH0.tar.gz) = 10081875 +TIMESTAMP = 1736250092 +SHA256 (FRRouting-frr-frr-8.5.7_GH0.tar.gz) = 0981830040fb115aa0e3f2da4e6ba344c7752151cbcaecb2364b726c122ab934 +SIZE (FRRouting-frr-frr-8.5.7_GH0.tar.gz) = 10082850 diff --git a/net/frr8/files/frr.in b/net/frr8/files/frr.in index 222e56234729..fde3fe805f64 100644 --- a/net/frr8/files/frr.in +++ b/net/frr8/files/frr.in @@ -1,168 +1,244 @@ #!/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" -# + +# FRR's daemon management concept: +# - watchfrr is used to manage (start/monitor/restart) all frr deamons; +# - vtysh used to daemons boot startup configuration; +# There are a minimum of 3 daemons running: watchfrr, zebra + +# Startup details with watchfrr enabled (default): +# 1. "service frr start" calls "service frr start watchfrr" +# 2. watchfrr once started calls "service frr restart all" +# 3. "restart all" need to loop the list of $frr_daemons to start each +# of then +# 4. vtysh -b is executed to load boot startup configuration + +# Startup detail with watchfrr disabled (deprecated mode): +# 1. "service frr start" call "service frr start all" and need to loop $frr_daemons + +# To select a limited set of daemons to run, use the frr_daemons. +# Order matters: keep zebra first +# Example to start only staticd and bgpd: +# frr_daemons="zebra staticd bgpd" + # 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 babeld bfdd bgpd eigrpd fabricd isisd ospfd ospf6d ripd ripngd staticd" +# To disable integrated configuration mode, to use one configuration file per +# daemons. +# This mode is deprecated and not compatible with watchfrr +# frr_vtysh_boot="NO" +# watchfrr_enable="NO" + # Global tuning -# frr_flags="" -# Per daemon tuning may be done with daemon_name_flags +# frr_flags="--limit-fds 100000" (restricting fds for each daemons) +# frr_default_profile="datacenter" (default: traditional) +# 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 +# This RC script was adapted from: +# - FRR's tools/frrinit.sh.in (starting watchfrr) +# - FRR's tools/frrcommon.sh.in (starting frr daemons) +# - FRR's tools/etc/frr/daemons (default daemon flags) . /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_flags:="--limit-fds 100000"} +: ${watchfrr_enable:="YES"} : ${frr_daemons:="zebra babeld bfdd bgpd eigrpd fabricd isisd ospfd ospf6d ripd ripngd staticd"} -: ${frr_vtysh_boot:="NO"} +: ${watchfrr_flags:="-r /usr/sbin/servicebBfrrbBrestartbB%s -s /usr/sbin/servicebBfrrbBstartbB%s -k /usr/sbin/servicebBfrrbBstopbB%s -b bB -t 30"} +: ${frr_default_profile:="traditional"} +: ${frr_vtysh_boot:="YES"} : ${frr_wait_for:=""} : ${frr_wait_seconds:="90"} +# Default daemons'flag restrict binding vty's to localhost +: ${zebra_flags:="-A 127.0.0.1"} +: ${babeld_flags:="-A 127.0.0.1"} +: ${bgpd_flags:="-A 127.0.0.1"} +: ${eigrpd_flags:="-A 127.0.0.1"} +: ${fabricd_flags:="-A 127.0.0.1"} +: ${isisd_flags:="-A 127.0.0.1"} +: ${ospfd_flags:="-A 127.0.0.1"} +: ${ospf6d_flags:="-A ::1"} +: ${ripd_flags:="-A 127.0.0.1"} +: ${ripngd_flags:="-A ::1"} +: ${staticd_flags:="-A 127.0.0.1"} +frr_flags="${frr_flags} -F ${frr_default_profile}" -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() -{ +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() -{ +do_cmd() { + # Entering here, global var dmn contains the daemon name + # $1 the daemon name (must be uniq and cannot be all) local ret + local cmd + local dmn 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 + dmn=$1 + if [ -n "${dmn}" ] && [ "${dmn}" != "all" ]; then + command=%%PREFIX%%/sbin/${dmn} + pidfile=/var/run/frr/${dmn}.pid + eval flags=\$\{${dmn}_flags:-\"\"\} + flags="${flags} ${frr_flags}" + if [ "${dmn}" = "watchfrr" ]; then + # watchfrr is expecting all daemon names as flags + flags="${flags} ${watchfrr_daemons}" fi - check_config + name=${dmn} + _rc_restart_done=false + stop_postcmd="rm -f $pidfile" + run_rc_command "${frr_cmd}" || ret=1 + else + echo "Bug in do_cmd(): called without argument or with all" + ret=1 fi + return ${ret} +} + +vtysh_b () { + local ret + ret=0 + if checkyesno frr_vtysh_boot; then + %%PREFIX%%/bin/vtysh -b || ret=1 + fi + return ${ret} +} + +loop_do_cmd() { + local ret + local daemon + ret=0 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 + do_cmd ${daemon} || 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 + if ( [ ${frr_cmd} = "restart" ] || [ ${frr_cmd} = "start" ] ); then + vtysh_b || ret=1 fi return ${ret} } frr_cmd=$1 +# remove unsuported extra command +# Example: "service frr fast start" is replaced by "service frr start" + 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="$*" +# If daemon specified, replace the full list by its name +# or with watchfrr if not disabled +# Example: extract "bgpd" from a "service frr start bgpd" +if [ $# -ge 1 ]; then + if [ "$1" != "all" ]; then + frr_daemons=$1 + fi +else + if checkyesno watchfrr_enable; then + watchfrr_daemons=${frr_daemons} + frr_daemons=watchfrr + fi fi case "${frr_cmd}" in start|quietstart) - if [ -n "${frr_extralibs_path}" ]; then - /sbin/ldconfig -m ${frr_extralibs_path} + if checkyesno frr_enable; then + if [ -n "${frr_extralibs_path}" ]; then + /sbin/ldconfig -m ${frr_extralibs_path} + fi + if [ -x %%PREFIX%%/etc/rc.d/watchfrr ]; then + echo "WARNING: Old rc.d/watchfrr detected, this file must be deleted" + fi + if checkyesno frr_vtysh_boot; then + echo "Checking intergrated config..." + if ! [ -f %%ETCDIR%%/vtysh.conf ]; then + mkdir -p %%ETCDIR%% + echo "service integrated-vtysh-config" > %%ETCDIR%%/vtysh.conf + fi + if ! [ -f %%ETCDIR%%/frr.conf ]; then + echo "log syslog informational" > %%ETCDIR%%/frr.conf + fi + chown -R frr:frr %%ETCDIR%% + fi + loop_do_cmd 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" + if checkyesno frr_enable; then + # watchfrr do not stop all daemons, so need to stop it first + # then continuing with all others daemons + if [ "${frr_daemons}" = "watchfrr" ]; then + loop_do_cmd + frr_daemons=${watchfrr_daemons} + fi + frr_daemons=$(reverse_list ${frr_daemons}) + loop_do_cmd + fi ;; restart) - frr_daemons=$(reverse_list ${frr_daemons}) - do_cmd "stop" - frr_daemons=$(reverse_list ${frr_daemons}) - checkyesno frr_enable && do_cmd "start" + if checkyesno frr_enable; then + # watchfrr calls "service frr restart all" at startup + # to start all services + frr_daemons=$(reverse_list ${frr_daemons}) + frr_cmd=stop + loop_do_cmd + frr_daemons=$(reverse_list ${frr_daemons}) + frr_cmd=start + loop_do_cmd + fi + ;; + reload) + if ! [ -x %%PREFIX%%/sbin/frr-reload.py ]; then + echo "Please install frr-pythontools package. Required for reload" + exit 0 + fi + %%PREFIX%%/sbin/frr-reload.py --reload --confdir %%ETCDIR%% --rundir /var/run/frr %%ETCDIR%%/frr.conf ;; *) - do_cmd "${frr_cmd}" + loop_do_cmd ;; esac