summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/build-debian-package.sh43
-rw-r--r--tools/etc/frr/daemons2
-rw-r--r--tools/frrcommon.sh.in25
-rw-r--r--tools/frrinit.sh.in2
-rwxr-xr-xtools/tarsource.sh331
-rw-r--r--tools/watchfrr.sh.in2
6 files changed, 368 insertions, 37 deletions
diff --git a/tools/build-debian-package.sh b/tools/build-debian-package.sh
index 73231f0aec..d21f468bf5 100755
--- a/tools/build-debian-package.sh
+++ b/tools/build-debian-package.sh
@@ -2,39 +2,26 @@
#
# Written by Daniil Baturin, 2018
# This file is public domain
+set -e
-git diff-index --quiet HEAD || echo "Warning: git working directory is not clean!"
-
-# Set the defaults
-if [ "$EXTRA_VERSION" = "" ]; then
- EXTRA_VERSION="-MyDebPkgVersion"
-fi
+cd "`dirname $0`"
+cd ..
-if [ "$WANT_SNMP" = "" ]; then
- WANT_SNMP=0
+if [ "`id -u`" = 0 ]; then
+ echo "Running as root - installing dependencies"
+ apt-get install fakeroot debhelper devscripts
+ mk-build-deps --install debian/control
+ exit 0
fi
-if [ "$WANT_CUMULUS_MODE" = "" ]; then
- WANT_CUMULUS_MODE=0
-fi
+git diff-index --quiet HEAD || echo "Warning: git working directory is not clean!"
echo "Preparing the build"
-./bootstrap.sh
-./configure --with-pkg-extra-version=$EXTRA_VERSION
-make dist
-
-echo "Preparing Debian source package"
-mv debianpkg debian
-make -f debian/rules backports
-
-echo "Unpacking the source to frrpkg/"
-mkdir frrpkg
-cd frrpkg
-tar xf ../frr_*.orig.tar.gz
-cd frr*
-. /etc/os-release
-tar xf ../../frr_*${ID}${VERSION_ID}*.debian.tar.xz
+tools/tarsource.sh -V
echo "Building the Debian package"
-debuild --no-lintian --set-envvar=WANT_SNMP=$WANT_SNMP --set-envvar=WANT_CUMULUS_MODE=$WANT_CUMULUS_MODE -b -uc -us
-
+if test $# -eq 0; then
+ dpkg-buildpackage -b -uc -us
+else
+ dpkg-buildpackage "$@"
+fi
diff --git a/tools/etc/frr/daemons b/tools/etc/frr/daemons
index 2d56fe1b98..0fca541137 100644
--- a/tools/etc/frr/daemons
+++ b/tools/etc/frr/daemons
@@ -55,7 +55,7 @@ bfdd_options=" -A 127.0.0.1"
fabricd_options="-A 127.0.0.1"
# The list of daemons to watch is automatically generated by the init script.
-watchfrr_options="-r '/usr/lib/frr/watchfrr.sh restart %s' -s '/usr/lib/frr/watchfrr.sh start %s' -k '/usr/lib/frr/watchfrr.sh stop %s'"
+#watchfrr_options=""
# for debugging purposes, you can specify a "wrap" command to start instead
# of starting the daemon directly, e.g. to use valgrind on ospfd:
diff --git a/tools/frrcommon.sh.in b/tools/frrcommon.sh.in
index fa2fdc94b2..76a0d617ba 100644
--- a/tools/frrcommon.sh.in
+++ b/tools/frrcommon.sh.in
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
#
# This is a "library" of sorts for use by the other FRR shell scripts. It
# has most of the daemon start/stop logic, but expects the following shell
@@ -67,9 +67,9 @@ vtysh_b () {
daemon_inst() {
# note this sets global variables ($dmninst, $daemon, $inst)
dmninst="$1"
- daemon="${dmninst%:*}"
+ daemon="${dmninst%-*}"
inst=""
- [ "$daemon" != "$dmninst" ] && inst="${dmninst#*:}"
+ [ "$daemon" != "$dmninst" ] && inst="${dmninst#*-}"
}
daemon_list() {
@@ -85,13 +85,19 @@ daemon_list() {
eval inst=\$${daemon}_instances
[ "$daemon" = zebra -o "$daemon" = staticd ] && cfg=yes
if [ -n "$cfg" -a "$cfg" != "no" -a "$cfg" != "0" ]; then
+ if ! daemon_prep "$daemon" "$inst"; then
+ continue
+ fi
debug "$daemon enabled"
enabled="$enabled $daemon"
if [ -n "$inst" ]; then
debug "$daemon multi-instance $inst"
+ oldifs="${IFS}"
+ IFS="${IFS},"
for i in $inst; do
- enabled="$enabled $daemon:$inst"
+ enabled="$enabled $daemon-$i"
done
+ IFS="${oldifs}"
fi
else
debug "$daemon disabled"
@@ -116,7 +122,7 @@ daemon_prep() {
inst="$2"
[ "$daemon" = "watchfrr" ] && return 0
[ -x "$D_PATH/$daemon" ] || {
- log_failure_msg "cannot start $daemon${inst:+ (instance $inst)}: daemon binary not installed\n"
+ log_failure_msg "cannot start $daemon${inst:+ (instance $inst)}: daemon binary not installed"
return 1
}
[ -r "$C_PATH/frr.conf" ] && return 0
@@ -276,7 +282,7 @@ load_old_config() {
}
[ -r "$C_PATH/daemons" ] || {
- log_failure_msg "cannot run $@: $C_PATH/daemons does not exist\n"
+ log_failure_msg "cannot run $@: $C_PATH/daemons does not exist"
exit 1
}
. "$C_PATH/daemons"
@@ -285,6 +291,13 @@ load_old_config "$C_PATH/daemons.conf"
load_old_config "/etc/default/frr"
load_old_config "/etc/sysconfig/frr"
+if declare -p watchfrr_options | grep -q '^declare \-a'; then
+ log_warning_msg "watchfrr_options contains a bash array value." \
+ "The configured value is intentionally ignored since it is likely wrong." \
+ "Please remove or fix the setting."
+ unset watchfrr_options
+fi
+
#
# other defaults and dispatch
#
diff --git a/tools/frrinit.sh.in b/tools/frrinit.sh.in
index 3dddf5bd44..0f5ed85864 100644
--- a/tools/frrinit.sh.in
+++ b/tools/frrinit.sh.in
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
#
### BEGIN INIT INFO
# Provides: frr
diff --git a/tools/tarsource.sh b/tools/tarsource.sh
new file mode 100755
index 0000000000..eee2a9739b
--- /dev/null
+++ b/tools/tarsource.sh
@@ -0,0 +1,331 @@
+#!/bin/bash
+# 2018 by David Lamparter, placed in the Public Domain
+
+help() {
+ cat <<EOF
+FRR tarball/dsc helper, intended to run from a git checkout
+
+Usage:
+ ./tarsource.sh [-dDn] [-i GITPATH] [-o OUTDIR] [-S KEYID]
+ [-C COMMIT] [-e EXTRAVERSION] [-z gz|xz]
+
+options:
+ -i GITPATH path to git working tree or bare repository.
+ - default: parent directory containing this script
+ -o OUTDIR path to place the generated output files in.
+ - default: current directory
+ -C COMMIT build tarball for specified git commit
+ - default: current HEAD
+ -e EXTRAVERSION override automatic package extraversion
+ - default "-YYYYMMDD-NN-gGGGGGGGGGGGG", but the script
+ autodetects if a release tag is checked out
+ -z gz|xz compression format to use
+ - default: xz
+ -S KEYID sign the output with gpg key
+ -d use dirty git tree with local changes
+ -D generate Debian .dsc and .debian.tar.xz too
+ (note: output files are moved to parent directory)
+ -l remove Debian auto-build changelog entry
+ (always done for releases)
+ -V write version information to config.version and exit
+ -n allow executing from non-git source (NOT RECOMMENDED)
+ -h show this help text
+
+Note(1) that this script tries very hard to generate a deterministic,
+reproducible tarball by eliminating timestamps and similar things. However,
+since the tarball includes autoconf/automake files, the versions of these
+tools need to be _exactly_ identical to get the same tarball.
+
+Note(2) the debian ".orig" tarball is always identical to the "plain" tarball
+generated without the -D option.
+
+Note(3) if you want the tool to identify github PRs, you need to edit your
+.git/config to fetch PRs from github like this:
+
+ [remote "origin"]
+ url = git@github.com:frrouting/frr.git
+ fetch = +refs/heads/*:refs/remotes/origin/*
+ADD: fetch = +refs/pull/*/head:refs/remotes/origin/pull/*
+EOF
+}
+
+set -e
+
+options=`getopt -o 'hi:o:C:S:e:z:DdnlV' -l help -- "$@"`
+debian=false
+dirty=false
+nongit=false
+zip=xz
+adjchangelog=false
+writeversion=false
+extraset=false
+set - $options
+while test $# -gt 0; do
+ arg="$1"; shift; optarg=$1
+ case "$arg" in
+ -h|--help) help; exit 0;;
+ -d) dirty=true;;
+ -D) debian=true;;
+ -n) nongit=true;;
+ -i) eval src=$optarg; shift;;
+ -C) eval commit=$optarg; shift;;
+ -o) eval outdir=$optarg; shift;;
+ -e) eval extraver=$optarg; extraset=true; shift;;
+ -z) eval zip=$optarg; shift;;
+ -S) eval keyid=$optarg; shift;;
+ -l) adjchangelog=true;;
+ -V) writeversion=true;;
+ --) break;;
+ *) echo something went wrong with getopt >&2
+ exit 1
+ ;;
+ esac
+done
+
+cwd="`pwd`"
+outdir="${outdir:-$cwd}"
+
+if test -e "$outdir" -a \! -d "$outdir"; then
+ echo "output $outdir must be a directory" >&2
+ exit 1
+elif test \! -d "$outdir"; then
+ mkdir -p "$outdir"
+fi
+
+cd "$outdir"
+outdir="`pwd`"
+cd "$cwd"
+cd "`dirname $0`/.."
+selfdir="`pwd`"
+src="${src:-$selfdir}"
+
+if $writeversion; then
+ if $nongit; then
+ echo "The -V option cannot be used without a git tree" >&2
+ exit 1
+ fi
+ dirty=true
+fi
+
+case "$zip" in
+gz) ziptarget=dist-gzip; ziptool="gzip -n -9"; unzip="gzip -k -c";;
+xz) ziptarget=dist-xz; ziptool="xz -z -e"; unzip="xz -d -k -c";;
+*) echo "unknown compression format $zip" >&2
+ exit 1
+esac
+
+# always overwrite file ownership in tars
+taropt="--owner=root --group=root"
+
+onexit() {
+ rv="$?"
+ set +e
+ test -n "$tmpdir" -a -d "$tmpdir" && rm -rf "$tmpdir"
+
+ if test "$rv" -ne 0; then
+ echo -e "\n\033[31;1mfailed\n" >&2
+ if test "$dirty" = true; then
+ echo please try running the script without the -d option.>&2
+ fi
+ fi
+ exit $rv
+}
+trap onexit EXIT
+tmpdir="`mktemp -d -t frrtar.XXXXXX`"
+
+if test -e "$src/.git"; then
+ commit="`git -C \"$src\" rev-parse \"${commit:-HEAD}\"`"
+
+ if $dirty; then
+ cd "$src"
+ echo -e "\033[31;1mgit: using dirty worktree in $src\033[m" >&2
+ else
+ echo -e "\033[33;1mgit: preparing a clean clone of $src\033[m"
+ branch="${tmpdir##*/}"
+ cd "$tmpdir"
+
+ git -C "$src" branch "$branch" "$commit"
+ git clone --single-branch -s -b "$branch" "$src" source
+ git -C "$src" branch -D "$branch"
+ cd source
+ fi
+
+ # if we're creating a tarball from git, force the timestamps inside
+ # the tar to match the commit date - this makes the tarball itself
+ # reproducible
+ gitts="`TZ=UTC git show -s --format=%cd --date=local $commit`"
+ gitts="`TZ=UTC date -d "$gitts" '+%Y-%m-%dT%H:%M:%SZ'`"
+ taropt="--mtime=$gitts $taropt"
+
+ # check if we're on a release tag
+ gittag="`git -C \"$src\" describe --tags --match 'frr-*' --first-parent --long $commit`"
+ gittag="${gittag%-g*}"
+ gittag="${gittag%-*}"
+
+ # if there have been changes to packaging or tests, it's still the
+ # same release
+ changes="`git diff --name-only "$gittag" $commit | \
+ egrep -v '\.git|^m4/|^config|^README|^alpine/|^debian/|^pkgsrc/|^ports/|^redhat/|^snapcraft/|^solaris/|^tests/|^tools/|^gdb/|^docker/|^\.' | \
+ wc -l`"
+ if test "$changes" -eq 0; then
+ adjchangelog=true
+ echo "detected release build for tag $gittag" >&2
+ $extraset || extraver=""
+ elif ! $adjchangelog; then
+ gitdate="`TZ=UTC date -d "$gitts" '+%Y%m%d'`"
+ gitrev="`git rev-parse --short $commit`"
+ dayseq="`git rev-list --since \"${gitts%T*} 00:00:00 +0000\" $commit | wc -l`"
+ dayseq="`printf '%02d' $(( $dayseq - 1 ))`"
+
+ $extraset || extraver="-$gitdate-$dayseq-g$gitrev"
+
+ git -C "$src" remote -v | grep fetch | sed -e 's% (fetch)$%%' \
+ | egrep -i '\b(git@github\.com:frrouting/frr\.git|https://github\.com/FRRouting/frr\.git)$' \
+ | while read remote; do
+ remote="${remote%% *}"
+
+ git -C "$src" var -l | egrep "^remote.$remote.fetch=" \
+ | while read fetch; do
+ fetch="${fetch#*=}"
+ from="${fetch%:*}"
+ to="${fetch#*:}"
+ if test "$from" = "+refs/pull/*/head"; then
+ name="`git -C \"$src\" name-rev --name-only --refs \"$to\" $commit`"
+ test "$name" = "undefined" && continue
+ realname="${name%~*}"
+ realname="${realname%%^*}"
+ realname="${realname%%@*}"
+ if test "$realname" = "$name"; then
+ echo "${name##*/}" > "$tmpdir/.gitpr"
+ break
+ fi
+ fi
+ done || true
+ test -n "$gitpr" && break
+ done || true
+ test $extraset = false -a -f "$tmpdir/.gitpr" && extraver="-PR`cat \"$tmpdir/.gitpr\"`$extraver"
+ fi
+
+ debsrc="git ls-files debian/"
+else
+ if $nongit; then
+ echo -e "\033[31;1mWARNING: this script should be executed from a git tree\033[m" >&2
+ else
+ echo -e "\033[31;1mERROR: this script should be executed from a git tree\033[m" >&2
+ exit 1
+ fi
+ debsrc="echo debian"
+fi
+
+if $writeversion; then
+ pkgver="`egrep ^AC_INIT configure.ac`"
+ pkgver="${pkgver#*,}"
+ pkgver="${pkgver%,*}"
+ pkgver="`echo $pkgver`" # strip whitespace
+ pkgver="${pkgver#[}"
+ pkgver="${pkgver%]}"
+
+ echo -e "\033[32;1mwriting version ID \033[36;1mfrr-$pkgver$extraver\033[m"
+
+ cat > config.version <<EOF
+# config.version override by tarsource.sh
+EXTRAVERSION="$extraver"
+DIST_PACKAGE_VERSION="$pkgver$extraver"
+gitts="$gitts"
+taropt="$taropt"
+EOF
+ sed -e "s%@VERSION@%$pkgver$extraver%" \
+ < changelog-auto.in \
+ > changelog-auto
+ exit 0
+fi
+
+echo -e "\033[33;1mpreparing source tree\033[m"
+
+# config.version will also overwrite gitts and taropt when tarsource.sh
+# was used to write the config.version file before - but configure will
+# overwrite config.version down below!
+if test -f config.version; then
+ # never executed for clean git build
+ . ./config.version
+ if $nongit; then
+ $extraset || extraver="$EXTRAVERSION"
+ fi
+fi
+if test \! -f configure; then
+ # always executed for clean git build
+ ./bootstrap.sh
+fi
+if test "$EXTRAVERSION" != "$extraver" -o \! -f config.status; then
+ # always executed for clean git build
+ # options don't matter really - we just want to make a dist tarball
+ ./configure --with-pkg-extra-version=$extraver
+fi
+
+. ./config.version
+PACKAGE_VERSION="$DIST_PACKAGE_VERSION"
+
+echo -e "\033[33;1mpacking up \033[36;1mfrr-$PACKAGE_VERSION\033[m"
+
+make GZIP_ENV="-n9" am__tar="tar -chof - $taropt \"\$\$tardir\"" $ziptarget
+mv frr-${PACKAGE_VERSION}.tar.$zip "$outdir" || true
+lsfiles="frr-${PACKAGE_VERSION}.tar.$zip"
+
+if $debian; then
+ mkdir -p "$tmpdir/debian/source"
+ cat debian/changelog > "$tmpdir/debian/changelog"
+ if $adjchangelog; then
+ if grep -q 'autoconf changelog entry' debian/changelog; then
+ tail -n +9 debian/changelog > "$tmpdir/debian/changelog"
+ fi
+ fi
+ echo '3.0 (quilt)' > "$tmpdir/debian/source/format"
+ DEBVER="`dpkg-parsechangelog -l\"$tmpdir/debian/changelog\" -SVersion`"
+
+ eval $debsrc | tar -cho $taropt \
+ --exclude-vcs --exclude debian/source/format \
+ --exclude debian/changelog \
+ --exclude debian/changelog-auto \
+ --exclude debian/changelog-auto.in \
+ --exclude debian/subdir.am \
+ -T - -f ../frr_${DEBVER}.debian.tar
+ # add specially prepared files from above
+ tar -uf ../frr_${DEBVER}.debian.tar $taropt -C "$tmpdir" debian/source/format debian/changelog
+
+ test -f ../frr_${DEBVER}.debian.tar.$zip && rm -f ../frr_${DEBVER}.debian.tar.$zip
+ $ziptool ../frr_${DEBVER}.debian.tar
+
+ # pack up debian files proper
+ ln -s "$outdir/frr-${PACKAGE_VERSION}.tar.$zip" ../frr_${PACKAGE_VERSION}.orig.tar.$zip
+ dpkg-source -l"$tmpdir/debian/changelog" \
+ --format='3.0 (custom)' --target-format='3.0 (quilt)' \
+ -b . frr_${PACKAGE_VERSION}.orig.tar.$zip frr_${DEBVER}.debian.tar.$zip
+
+ mv ../frr_${DEBVER}.dsc "$outdir" || true
+ mv ../frr_${DEBVER}.debian.tar.$zip "$outdir" || true
+ if test -h ../frr_${PACKAGE_VERSION}.orig.tar.$zip; then
+ rm ../frr_${PACKAGE_VERSION}.orig.tar.$zip || true
+ fi
+ ln -s frr-${PACKAGE_VERSION}.tar.$zip "$outdir/frr_${PACKAGE_VERSION}.orig.tar.$zip" || true
+
+ cd "$outdir"
+ test -n "$keyid" && debsign -k "$keyid" "frr_${DEBVER}.dsc"
+
+ lsfiles="$lsfiles \
+ frr_${DEBVER}.dsc \
+ frr_${DEBVER}.debian.tar.$zip \
+ frr_${PACKAGE_VERSION}.orig.tar.$zip"
+fi
+
+cd "$outdir"
+if test -n "$keyid"; then
+ $unzip frr-${PACKAGE_VERSION}.tar.$zip > frr-${PACKAGE_VERSION}.tar
+ test -f frr-${PACKAGE_VERSION}.tar.asc && rm frr-${PACKAGE_VERSION}.tar.asc
+ if gpg -a --detach-sign -u "$keyid" frr-${PACKAGE_VERSION}.tar; then
+ lsfiles="$lsfiles frr-${PACKAGE_VERSION}.tar.asc"
+ fi
+ rm frr-${PACKAGE_VERSION}.tar
+fi
+
+echo -e "\n\033[32;1mdone: \033[36;1mfrr-$PACKAGE_VERSION\033[m\n"
+ls -l $lsfiles
diff --git a/tools/watchfrr.sh.in b/tools/watchfrr.sh.in
index 3051d91044..712f962a0a 100644
--- a/tools/watchfrr.sh.in
+++ b/tools/watchfrr.sh.in
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
#
# This is NOT the init script! This is the watchfrr start/stop/restart
# command handler, passed to watchfrr with the -s/-r/-k commands. It is used