Skip to content

Commit

Permalink
net-misc/frr: new package
Browse files Browse the repository at this point in the history
The FRRouting Protocol Suite, fork of quagga

Signed-off-by: Sergey Popov <[email protected]>
  • Loading branch information
Pinkbyte committed Dec 4, 2020
1 parent b83cc68 commit 6e52817
Show file tree
Hide file tree
Showing 6 changed files with 520 additions and 0 deletions.
1 change: 1 addition & 0 deletions net-misc/frr/Manifest
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DIST frr-7.5.tar.gz 6730659 BLAKE2B 12c915e7564b8f0157b20b0714b1efd8c2ad0c51dbaeb1eb3ef2d5ea50406c297d7f4bd854d9246b515d42f3fa326b2b3c7a30d83f35b64c374947b26709f6fe SHA512 d0d3c0bc0d30e2ebb93e20906768a996d21db23b23118c8e3c50d238e7bfdee7a789b4a90c9d7dbdc842d857f60bd44f0922b01b0c2c8b289ac860f008a430a9
22 changes: 22 additions & 0 deletions net-misc/frr/files/frr-7.5-ipctl-forwarding.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
Fix for missing definitions on some Hardened configurations
Gentoo bug: https://bugs.gentoo.org/show_bug.cgi?id=437292

diff -Naur quagga-0.99.16.orig/zebra/ipforward_sysctl.c quagga-0.99.16/zebra/ipforward_sysctl.c
--- quagga-0.99.16.orig/zebra/ipforward_sysctl.c 2010-03-11 12:11:32.000000000 -0500
+++ quagga-0.99.16/zebra/ipforward_sysctl.c 2010-03-11 12:11:39.000000000 -0500
@@ -31,6 +31,15 @@

#define MIB_SIZ 4

+/* Fix for recent (2.6.14) kernel headers */
+#ifndef IPCTL_FORWARDING
+ #define IPCTL_FORWARDING NET_IPV4_FORWARD
+#endif
+
+#ifndef IP6CTL_FORWARDING
+ #define IP6CTL_FORWARDING NET_IPV6_FORWARDING
+#endif
+
extern struct zebra_privs_t zserv_privs;

/* IPv4 forwarding control MIB. */
300 changes: 300 additions & 0 deletions net-misc/frr/files/frr-openrc-v1
Original file line number Diff line number Diff line change
@@ -0,0 +1,300 @@
#!/sbin/openrc-run
#
# FRR OpenRC init script.
#
# Copyright (C) 2020 Rafael F. Zalamena
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; only version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

description="FRR initialization script."

# FRR variables.
frr_dir="/usr/lib/frr"
frr_state_dir="/run/frr"
config_file="/etc/frr/frr.conf"
daemon_file="/etc/frr/daemons"
daemon_db="/run/frrdb"
vty_config_file="/etc/frr/vtysh.conf"
frr_reload="$frr_dir/frr-reload.py"
frr_reload_log="$frr_state_dir/reload.log"

# Don't change profile here, use $daemon_file. This is the default.
frr_profile="traditional"

# watchfrr variables.
watchfrr_daemons=''
watchfrr_pidfile="$frr_state_dir/watchfrr.pid"

#
# Helpers.
#
_check_daemon_binary() {
local daemon=$1

[ -x "$frr_dir/$daemon" ] && return 0

eerror "No binary found for $daemon in $frr_dir"
return 1
}

_load_daemon_list() {
# Load FRR daemons configuration file.
while read line <&3 ; do
case $line in
""|"#"*)
# Skip empty/commented lines.
continue
;;

*d=*|*_instances=*|*_options=*|*_wrap=*)
# Load daemon options.
eval "$line"
;;

MAX_FDS=*|frr_profile=*|vtysh_enable=*)
# Load misc configuration.
eval "$line"
;;
esac
done 3< $daemon_file

# `zebra` and `staticd` are mandatory.
_check_daemon_binary 'zebra' || return 1
_check_daemon_binary 'staticd' || return 1
watchfrr_daemons='zebra staticd'

# Create the watchfrr command line.
for daemon in \
babeld bfdd bgpd eigrpd fabricd isisd ldpd nhrpd ospfd ospf6d pbrd \
pimd ripd ripngd sharpd vrrpd \
; do
# Trick to read variable name with variable.
cdaemon=$(eval echo \$$daemon)
cdaemon_instances=$(eval echo \$${daemon}_instances)

# Add daemon to command line if specified.
if [ ! -z $cdaemon ] && [ $cdaemon = 'yes' ]; then
_check_daemon_binary $daemon || return 1

# Multi instance daemon handling.
if [ ! -z $cdaemon_instances ]; then
for instance in $(echo $cdaemon_instances | tr ',' ' '); do
watchfrr_daemons="$watchfrr_daemons $daemon-$instance"
done
fi

# Single instance daemon handling.
watchfrr_daemons="$watchfrr_daemons $daemon"
continue
fi
done
}

_frr_start() {
# Apply MAX_FDS configuration if set.
if [ ! -z $MAX_FDS ]; then
veinfo " Setting maximum file descriptors to ${MAX_FDS}"
ulimit -n $MAX_FDS >/dev/null 2>/dev/null
fi

# Save started daemons to state database.
rm -f -- $daemon_db
for daemon in $watchfrr_daemons; do
echo $daemon >> $daemon_db
veinfo " Starting $daemon..."
done

veinfo " Starting watchfrr..."

# Start watchfrr which will start all configured daemons.
eval $all_wrap $frr_dir/watchfrr -d -F $frr_profile $watchfrr_daemons

veinfo " Loading configuration..."

# After starting the daemons, lets load the configuration.
if [ $vtysh_enable = 'yes' ]; then
vtysh -b -n
else
veinfo " Configuration loading disabled (vtysh_enable=$vtysh_enable)"
fi
}

_get_pid() {
local daemon=$1
local pid_file="$frr_state_dir/$daemon.pid"

# Test for file existence.
if [ ! -r "$pid_file" ]; then
eerror "Failed to find or read $daemon pid file"
return 1
fi

# Get PID if any.
pid=$(cat $pid_file)
if [ -z $pid ]; then
eerror "$daemon PID file empty"
return 1
fi

return 0
}

_stop_daemon() {
local daemon=$1
local pid_file="$frr_state_dir/$daemon.pid"

# Get daemon pid.
_get_pid $daemon

# Ask daemon to quit.
kill -2 "$pid"

# Test if daemon is still running.
attempts=1200
while kill -0 "$pid" 2>/dev/null; do
sleep 0.5
[ $((attempts - 1)) -gt 0 ] || break
done

# Tell user about our situation.
if kill -0 "$pid" 2>/dev/null ; then
eerror "Failed to stop $daemon (PID=${pid})"
return 1
else
rm -f -- $pid_file
fi
}

_frr_stop() {
local failures=0

# Stop watchfrr first so it doesn't restart anyone.
veinfo " Stopping watchfrr..."
_stop_daemon watchfrr || failures=1

# Read started daemon database.
while read line <&3 ; do
case $line in
""|"#"*)
# Skip empty/commented lines.
continue
;;

*)
# Get daemon name.
veinfo " Stopping $line..."
_stop_daemon $line || failures=1
;;
esac
done 3< $daemon_db

# Remove daemon database file.
rm -f -- $daemon_db

return $failures
}

_check_watchfrr() {
_get_pid watchfrr || return 1
return 0
}

#
# Main.
#
depend() {
# We need root to write logs.
need localmount
# Optionally wait for network to start.
use net
# Expect /run to be ready.
after bootmisc
}

start_pre() {
# Check configuration file readability.
checkpath -f -m 0640 -o frr:frr $vty_config_file
checkpath -f -m 0640 -o frr:frr $daemon_file
checkpath -f -m 0640 -o frr:frr $config_file

# Check run state directory.
checkpath -d -o frr $frr_state_dir

# Load daemon list and peform checks.
_load_daemon_list
}

start() {
# Load daemon list.
_load_daemon_list

# Handle restarts.
if [ "$RC_CMD" = 'restart' ]; then
ebegin 'Reloading FRR configuration'
else
ebegin 'Starting FRR'
fi

# Start FRR.
_frr_start

# New daemons and watchfrr started, apply new configuration.
if [ "$RC_CMD" = 'restart' ]; then
"$frr_reload" --reload "$config_file" 2>/run/frr/reload.log
[ $? -ne 0 ] && ewarn " Failed to reload (check $frr_reload_log)"
# NOTE: we can't return bad status otherwise OpenRC will think we
# failed to start, lets print a helpful message instead.
fi

eend 0
}

stop() {
local failures=0

# Handle restarts.
if [ "$RC_CMD" = 'restart' ]; then
# Load daemon list.
_load_daemon_list

# We must restart 'watchfrr' in order to start new daemons.
veinfo " Stopping watchfrr..."
_stop_daemon watchfrr

# Stop daemons that are no longer in configuration file.
for daemon in $(ls -1 /run/frr/*.pid | cut -d '.' -f 1); do
# Filter daemon name.
daemon=$(basename "$daemon")

# Skip watchfrr.
[ "$daemon" = 'watchfrr' ] && continue

echo "$watchfrr_daemons" | grep "$daemon" >/dev/null
if [ $? -ne 0 ]; then
veinfo " Stopping $daemon..."
_stop_daemon $daemon
fi
done

return 0
fi

ebegin 'Stopping FRR'
_frr_stop || failures=1
eend $failures 'some daemons failed to stop'
}

status() {
_check_watchfrr || return 1
}
26 changes: 26 additions & 0 deletions net-misc/frr/files/frr.pam
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#%PAM-1.0
#

##### if running frr as root:
# Only allow root (and possibly wheel) to use this because enable access
# is unrestricted.
auth sufficient pam_rootok.so

# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid
###########################################################

# If using frr privileges and with a seperate group for vty access, then
# access can be controlled via the vty access group, and pam can simply
# check for valid user/password, eg:
#
# only allow local users.
#auth required pam_securetty.so
#auth include system-auth
#auth required pam_nologin.so
#account include system-auth
#password include system-auth
#session include system-auth
#session optional pam_console.so
Loading

0 comments on commit 6e52817

Please sign in to comment.