[tools/bgpscanner] Add backwards compatible bgpscanner wrapper
This commit is contained in:
parent
73691101ce
commit
81bfac05ae
|
@ -0,0 +1,326 @@
|
|||
#!/bin/sh
|
||||
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
#
|
||||
# Legacy Isolario bgpscanner compatible wrapper for ubgpsuite tools.
|
||||
# Emulates most of the classic bgpscanner CLI.
|
||||
#
|
||||
# Copyright The DoubleFourteen Code Forge (C) All Rights Reserved
|
||||
# Author: Lorenzo Cogotti
|
||||
|
||||
NAME=$(basename "$0")
|
||||
TGT=bgpgrep
|
||||
OPTS=""
|
||||
|
||||
PEERAS=""
|
||||
PEERASF=""
|
||||
PEERADDR=""
|
||||
PEERADDRF=""
|
||||
ATTRS=""
|
||||
COMMS=""
|
||||
NCOMMS=""
|
||||
EXACT=""
|
||||
EXACTF=""
|
||||
SUBNETS=""
|
||||
SUBNETSF=""
|
||||
SUPNETS=""
|
||||
SUPNETSF=""
|
||||
RELATED=""
|
||||
RELATEDF=""
|
||||
LOOPS="unspec"
|
||||
REXPS=""
|
||||
NREXPS=""
|
||||
DUMPBYTEC="no"
|
||||
OUTREDIR=""
|
||||
|
||||
die() {
|
||||
echo "$NAME: $*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
usage() {
|
||||
echo "$NAME: Legacy bgpscanner-compatible wrapper for ubgpsuite tools" >&2
|
||||
echo "Usage:" >&2
|
||||
echo " $NAME [-cdlL] [-mM COMMSTRING] [-pP PATHEXPR] [-i ADDR] [-I FILE] [-a AS] [-A FILE] [-e PREFIX] [-E FILE] [-t ATTR_CODE] [-T FILE] [-o FILE] [FILE...]" >&2
|
||||
echo " $NAME [-cdlL] [-mM COMMSTRING] [-pP PATHEXPR] [-i ADDR] [-I FILE] [-a AS] [-A FILE] [-s PREFIX] [-S FILE] [-t ATTR_CODE] [-T FILE] [-o FILE] [FILE...]" >&2
|
||||
echo " $NAME [-cdlL] [-mM COMMSTRING] [-pP PATHEXPR] [-i ADDR] [-I FILE] [-a AS] [-A FILE] [-u PREFIX] [-U FILE] [-t ATTR_CODE] [-T FILE] [-o FILE] [FILE...]" >&2
|
||||
echo " $NAME [-cdlL] [-mM COMMSTRING] [-pP PATHEXPR] [-i ADDR] [-I FILE] [-a AS] [-A FILE] [-r PREFIX] [-R FILE] [-t ATTR_CODE] [-T FILE] [-o FILE] [FILE...]" >&2
|
||||
echo >&2
|
||||
echo "Available options:" >&2
|
||||
echo " -a <peer AS>" >&2
|
||||
echo " Print only entries coming from the given peer AS" >&2
|
||||
echo " -A <file>" >&2
|
||||
echo " Print only entries coming from any peer AS listed in file" >&2
|
||||
# echo " -c" >&2
|
||||
# echo " Dump BGP messages in hexadecimal C array format" >&2
|
||||
echo " -d" >&2
|
||||
echo " Dump BGP filter bytecode to stderr (debug option)" >&2
|
||||
echo " -e <prefix>" >&2
|
||||
echo " Print only entries containing the exact prefix of interest" >&2
|
||||
echo " -E <file>" >&2
|
||||
echo " Print only entries containing exactly any prefix of interest listed in file" >&2
|
||||
echo " -f" >&2
|
||||
echo " Print every peer IP address in the RIB provided" >&2
|
||||
echo " -i <peer IP>"
|
||||
echo " Print only entries coming from a given peer IP address" >&2
|
||||
echo " -I <file>" >&2
|
||||
echo " Print only entries coming from any peer IP address listed in file" >&2
|
||||
echo " -l" >&2
|
||||
echo " Print only entries with loops in their AS PATH" >&2
|
||||
echo " -L" >&2
|
||||
echo " Print only entries without loops in their AS PATH" >&2
|
||||
echo " -o <file>" >&2
|
||||
echo " Redirect output to file (defaults to stdout)" >&2
|
||||
echo " -m <communities string>" >&2
|
||||
echo " Print only entries whose COMMUNITY attribute contains the given communities (in any order)" >&2
|
||||
echo " -M <communities string>" >&2
|
||||
echo " Print only entries whose COMMUNITY attribute does not contain the given communities (in any order)" >&2
|
||||
echo " -p <path expression>" >&2
|
||||
echo " Print only entries whose AS PATH matches the given expression" >&2
|
||||
echo " -P <path expression>" >&2
|
||||
echo " Print only entries whose AS PATH does not match the given expression" >&2
|
||||
echo " -r <prefix>" >&2
|
||||
echo " Print only entries containing subnets or supernets of the given prefix (including the prefix itself)" >&2
|
||||
echo " -R <file>" >&2
|
||||
echo " Print only entries containing subnets or supernets of any prefix listed in file (including the prefix itself)" >&2
|
||||
echo " -s <subnet>" >&2
|
||||
echo " Print only entries containing subnets of the given prefix" >&2
|
||||
echo " -S <file>" >&2
|
||||
echo " Print only entries containing subnets of any prefix listed in file" >&2
|
||||
echo " -t <attribute code>" >&2
|
||||
echo " Print only entries containing the given interesting attribute" >&2
|
||||
# echo " -T <file>" >&2
|
||||
# echo " Print only entries containing any of the interesting attributes listed in file" >&2
|
||||
echo " -u <prefix>"
|
||||
echo " Print only entries containing supernets of the given prefix (including the prefix itself)" >&2
|
||||
echo " -U <file>" >&2
|
||||
echo " Print only entries containing supernets of any prefix listed in file (including the prefix itself)" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
chkint() {
|
||||
case "$1" in
|
||||
''|*[!0-9]*) die "'$1': Non negative integer expected";;
|
||||
*) ;;
|
||||
esac
|
||||
}
|
||||
isip4() {
|
||||
for i in 1 2 3 4; do
|
||||
case $(echo "$1" | cut -d. -f"$i") in
|
||||
[0-9]|[0-9][0-9]|[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5]) ;;
|
||||
*) return 1;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
isip6() {
|
||||
test "$( \
|
||||
echo "$1" | \
|
||||
grep -Ec '^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$' \
|
||||
)" -eq 1
|
||||
}
|
||||
chkip() {
|
||||
isip4 "$1" || isip6 "$1" || die "'$1': Invalid IP address"
|
||||
}
|
||||
chkprefix() {
|
||||
case "$1" in
|
||||
*/*) chkint "${1#*/}" && chkip "${1%/*}";;
|
||||
*) chkip "$1";;
|
||||
esac
|
||||
}
|
||||
chknospc() {
|
||||
case "$1" in
|
||||
''|*[![:space:]]*) die "'$1': Invalid argument";;
|
||||
*) ;;
|
||||
esac
|
||||
}
|
||||
chkcomm() {
|
||||
case "$1" in
|
||||
''|*[![:space:][:alnum:]\:]*) die "'$1': Invalid COMMUNITY expression";;
|
||||
*) ;;
|
||||
esac
|
||||
}
|
||||
chkrexp() {
|
||||
case "$1" in
|
||||
''|*[![:digit:][:space:]^$\?\*]*) die "'$1': Invalid AS_PATH expression";;
|
||||
*) ;;
|
||||
esac
|
||||
}
|
||||
|
||||
templatef() {
|
||||
TPL=$(mktemp)
|
||||
[ $? -eq 0 ] || exit 1
|
||||
|
||||
sed -e 's/#.*$//g' "$1" | awk 'BEGIN {
|
||||
FPAT = "([^ ]*)|(\"[^\"]*\")"
|
||||
} {
|
||||
for (i=1; i<=NF; i++) { print $i }
|
||||
}' | while read -r TOK; do
|
||||
[ -z "$TOK" ] && continue
|
||||
|
||||
UNQL="${TOK%\"}"
|
||||
UNQR="${TOK#\"}"
|
||||
UNQ="${UNQL#\"}"
|
||||
[ "$UNQL" != "$UNQR" ] && die "'$TOK': Illegal misquoted or multiline token"
|
||||
|
||||
[ -n "$2" ] && "$2" "$UNQ"
|
||||
[ $? -ne 0 ] && exit 1
|
||||
|
||||
echo "$UNQ"
|
||||
done > "$TPL" || die "'$1': File conversion failed"
|
||||
|
||||
echo "$TPL"
|
||||
}
|
||||
|
||||
append() {
|
||||
echo "${1:+${1}${3:+ ${3}} }${2}"
|
||||
}
|
||||
|
||||
TERM=""
|
||||
EXPR=""
|
||||
|
||||
appendtermargs() {
|
||||
_T=$1; shift
|
||||
TERM="$_T ( $* )"
|
||||
}
|
||||
|
||||
appendtermfiles() {
|
||||
_T=$1; shift
|
||||
|
||||
for i in "$@"; do _L=$(append "$_L" "$_T $i" "-or"); done
|
||||
|
||||
[ -n "$TERM" ] && TERM="( $TERM -or $_L )" || TERM="$_L"
|
||||
}
|
||||
|
||||
pushterm() {
|
||||
if [ -n "$TERM" ]; then EXPR=$(append "$EXPR" "$TERM"); TERM=""; fi
|
||||
}
|
||||
|
||||
exprcompile() {
|
||||
[ -n "$PEERAS" ] || [ -n "$PEERADDR" ] && appendtermargs -peer $PEERAS $PEERADDR
|
||||
[ -n "$PEERASF" ] || [ -n "$PEERADDRF" ] && appendtermfiles -peer $PEERASF $PEERADDRF
|
||||
pushterm
|
||||
|
||||
for i in $ATTRS; do TERM=$(append "$TERM" "-attr $i" "-or"); done
|
||||
[ "$(echo "$ATTRS" | wc -w)" -gt 1 ] && TERM="( $TERM )"
|
||||
pushterm
|
||||
|
||||
[ -n "$NCOMMS" ] && TERM="-not -communities ( $NCOMMS )"
|
||||
[ -n "$COMMS" ] && TERM=$(append "$TERM" "-all-communities ( $COMMS )" "-or")
|
||||
[ -n "$NCOMMS" ] && [ -n "$COMMS" ] && TERM="( $TERM )"
|
||||
pushterm
|
||||
|
||||
[ -n "$EXACT" ] && appendtermargs -exact $EXACT
|
||||
[ -n "$EXACTF" ] && appendtermfiles -exact $EXACTF
|
||||
pushterm
|
||||
[ -n "$SUBNETS" ] && appendtermargs -subnet $SUBNETS
|
||||
[ -n "$SUBNETSF" ] && appendtermfiles -subnet $SUBNETSF
|
||||
pushterm
|
||||
[ -n "$SUPNETS" ] && appendtermargs -supernet $SUPNETS
|
||||
[ -n "$SUPNETSF" ] && appendtermfiles -supernet $SUPNETSF
|
||||
pushterm
|
||||
[ -n "$RELATED" ] && appendtermargs -related $RELATED
|
||||
[ -n "$RELATEDF" ] && appendtermfiles -related $RELATEDF
|
||||
pushterm
|
||||
|
||||
if [ "$LOOPS" != unspec ]; then
|
||||
[ "$LOOPS" = yes ] && TERM="-loops" || TERM="-not -loops"
|
||||
pushterm
|
||||
fi
|
||||
|
||||
[ -n "$REXPS" ] && TERM="-aspath \"$REXPS\""
|
||||
[ -n "$NREXPS" ] && TERM=$(append "$TERM" "-not -aspath \"$NREXPS\"" "-or")
|
||||
[ -n "$REXPS" ] && [ -n "$NREXPS" ] && TERM="( $TERM )"
|
||||
pushterm
|
||||
}
|
||||
|
||||
GOTEXACT=""; GOTRELATED=""; GOTSUBNETS=""; GOTSUPNETS=""
|
||||
while getopts "a:A:cde:E:fi:I:lLo:m:M:p:P:r:R:s:S:t:T:u:U:" o; do
|
||||
case $o in
|
||||
a) chkint "$OPTARG"
|
||||
PEERAS=$(append "$PEERAS" "$OPTARG")
|
||||
;;
|
||||
A) TPL=$(templatef "$OPTARG" chkint) || exit 1
|
||||
PEERASF=$(append "$PEERASF" "$TPL")
|
||||
;;
|
||||
c) die "Sorry, option -c is not supported yet!"
|
||||
;;
|
||||
d) DUMPBYTEC=yes
|
||||
;;
|
||||
e) chkprefix "$OPTARG"
|
||||
GOTEXACT=y; EXACT=$(append "$EXACT" "$OPTARG")
|
||||
;;
|
||||
E) TPL=$(templatef "$OPTARG" chkprefix) || exit 1
|
||||
GOTEXACT=y; EXACTF=$(append "$EXACTF" "$TPL")
|
||||
;;
|
||||
f) TGT=peerindex
|
||||
;;
|
||||
i) chkip "$OPTARG"
|
||||
PEERADDR=$(append "$PEERADDR" "$OPTARG")
|
||||
;;
|
||||
I) TPL=$(templatef "$OPTARG" chkip) || exit 1
|
||||
PEERADDRF=$(append "$PEERADDRF" "$TPL")
|
||||
;;
|
||||
l) LOOPS=yes
|
||||
;;
|
||||
L) LOOPS=no
|
||||
;;
|
||||
m) chkcomm "$OPTARG"
|
||||
COMMS=$(append "$COMMS" "$OPTARG")
|
||||
;;
|
||||
M) chkcomm "$OPTARG"
|
||||
NCOMMS=$(append "$NCOMMS" "$OPTARG")
|
||||
;;
|
||||
o) OUTREDIR="$OPTARG"
|
||||
;;
|
||||
p) chkrexp "$OPTARG"
|
||||
REXPS=$(append "$REXPS" "$(echo "$OPTARG" | tr "?" ".")" "|")
|
||||
;;
|
||||
P) chkrexp "$OPTARG"
|
||||
NREXPS=$(append "$NREXPS" "$(echo "$OPTARG" | tr "?" "." )" "|")
|
||||
;;
|
||||
r) chkprefix "$OPTARG"
|
||||
GOTRELATED=y; RELATED=$(append "$RELATED" "$OPTARG")
|
||||
;;
|
||||
R) TPL=$(templatef "$OPTARG" chkprefix) || exit 1
|
||||
GOTRELATED=y; RELATEDF=$(append "$RELATEDF" "$TPL")
|
||||
;;
|
||||
s) chkprefix "$OPTARG"
|
||||
GOTSUBNETS=y; SUBNETS=$(append "$SUBNETS" "$OPTARG")
|
||||
;;
|
||||
S) TPL=$(templatef "$OPTARG" chkprefix) || exit 1
|
||||
GOTSUBNETS=y; SUBNETSF=$(append "$SUBNETSF" "$TPL")
|
||||
;;
|
||||
t) chknospc "$OPTARG"
|
||||
ATTRS=$(append "$ATTRS" "$OPTARG")
|
||||
;;
|
||||
T) die "Sorry, option -T is not supported yet!"
|
||||
;;
|
||||
u) chkprefix "$OPTARG"
|
||||
GOTSUPNETS=y; SUPNETS=$(append "$SUPNETS" "$OPTARG")
|
||||
;;
|
||||
U) TPL=$(templatef "$OPTARG" chkprefix) || exit 1
|
||||
GOTSUPNETS=y; SUPNETSF=$(append "$SUPNETSF" "$TPL")
|
||||
;;
|
||||
?) usage
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
GOTNETS="${GOTSUBNETS}${GOTSUPNETS}${GOTEXACT}${GOTRELATED}"
|
||||
|
||||
shift $(( OPTIND-1 ))
|
||||
|
||||
exprcompile
|
||||
|
||||
[ -n "$EXPR" ] && [ "$TGT" != bgpgrep ] && die "Conflicting options"
|
||||
[ -n "$GOTNETS" ] && [ "$GOTNETS" != "y" ] && die "Conflicting options"
|
||||
|
||||
[ "$TGT" = bgpgrep ] && [ "$DUMPBYTEC" = yes ] && OPTS=$(append "$OPTS" --dump-bytecode)
|
||||
[ "$TGT" != bgpgrep ] && OPTS=-r
|
||||
|
||||
[ -n "$OUTREDIR" ] && OPTS=$(append "$OPTS" "-o $OUTREDIR")
|
||||
|
||||
CMD="echo"
|
||||
[ -n "$PRETEND" ] && [ "$PRETEND" = 1 ] || [ "$PRETEND" = y ] || [ "$PRETEND" = yes ] && CMD="echo"
|
||||
|
||||
"$CMD" "$TGT" $OPTS -- "$@" $EXPR
|
|
@ -0,0 +1,484 @@
|
|||
'\" et
|
||||
.TH BGPSCANNER 1 @VERSION@ BGPSCANNER "User Commands"
|
||||
.\"
|
||||
.SH NAME
|
||||
@UTILITY@
|
||||
\(em legacy wrapper script for backwards compatibility with Isolario
|
||||
.IR bgpscanner
|
||||
CLI
|
||||
.SH SYNOPSIS
|
||||
.LP
|
||||
.nf
|
||||
@UTILITY@ \fB[\fIOPTIONS\fB]\fR... \fB[\fIFILES\fB]\fR...
|
||||
.fi
|
||||
|
||||
.SH DESCRIPTION
|
||||
The legacy
|
||||
.IR @UTILITY@
|
||||
wrapper script is a drop in wrapper script to remap most invocations of the
|
||||
Isolario
|
||||
.IR bgpscanner
|
||||
CLI to any relevant
|
||||
.IR \[*m]bgpsuite
|
||||
utility.
|
||||
|
||||
The legacy
|
||||
.IR @UTILITY@
|
||||
wrapper may be used to ease transition phase to tools offered by the
|
||||
.IR "\[*m]bgpsuite" .
|
||||
A pretend mode is also available, to print the command that would need to
|
||||
be executed to perform the same operations as the provided
|
||||
.IR bgpscanner
|
||||
CLI invocation.
|
||||
This is especially useful to users familiar with the old
|
||||
.IR bgpscanner
|
||||
CLI to learn the new syntax.
|
||||
See the
|
||||
.IR "PRETEND MODE"
|
||||
section below for details.
|
||||
|
||||
Anyone unfamiliar with Isolario
|
||||
.IR bgpscanner
|
||||
and wishing to take advantage of the
|
||||
.IR "\[*m]bgpsuite"
|
||||
tools is probably reading the wrong man page.
|
||||
See
|
||||
.IR bgpgrep (1)
|
||||
and
|
||||
.IR peerindex (1)
|
||||
for equivalent and more advanced functionality.
|
||||
|
||||
For reference, Isolario
|
||||
.IR bgpscanner
|
||||
supports a more rudimentary filtering model compared to
|
||||
.IR bgpgrep (1).
|
||||
For every MRT dump in
|
||||
.IR FILES
|
||||
Isolario
|
||||
.IR bgpscanner
|
||||
reconstructs the original BGP message and applies the filtering rules specified by
|
||||
.IR OPTIONS
|
||||
(if any). Failing to meet such rules causes the BGP message to be dropped
|
||||
from output.
|
||||
The filtering process follows the sequence:
|
||||
.IP
|
||||
.PD 0
|
||||
.IP 1 5
|
||||
Filtering by peer (aka feeder in Isolario jargon), which may discard a message based on the announcing peer.
|
||||
.IP 2 5
|
||||
Filtering by attributes, which may discard a message based on the presence of specific attributes of interest.
|
||||
.IP 3 5
|
||||
Filtering by AS_PATH, which may discard a message based on the routes it contains.
|
||||
.IP 4 5
|
||||
Filtering by prefixes, which may discard a message based on the prefixes available in its NLRI and WITHDRAWN fields.
|
||||
.PD
|
||||
.PP
|
||||
Multiple criteria may be occur for each phase, resulting in implicitly
|
||||
.IR OR ing
|
||||
together multiple conditions.
|
||||
|
||||
.SH OPTIONS
|
||||
The following backwards compatibility options are supported:
|
||||
|
||||
.IP "\fB\-a \fI<peer AS>\fP" 10
|
||||
Print only entries coming from the given peer ASN.
|
||||
|
||||
.IP "\fB\-A \fI<file>\fP" 10
|
||||
Print only entries coming from any peer ASN listed in a template file, see
|
||||
.IR "FILTER TEMPLATE FILES"
|
||||
section below for details.
|
||||
|
||||
.IP "\fB\-d\fP" 10
|
||||
Dump BGP filter bytecode to stderr (debug option).
|
||||
|
||||
.IP "\fB\-e \fI<prefix>\fP" 10
|
||||
Print only entries containing the exact prefix of interest.
|
||||
.IP "\fB\-E \fI<file>\fP" 10
|
||||
Print only entries containing exactly any prefix of interest listed in file,
|
||||
see
|
||||
.IR "FILTER TEMPLATE FILES"
|
||||
section below for details.
|
||||
|
||||
.IP "\fB\-f\fP" 10
|
||||
Print every peer IP address inside RIBs provided as input files.
|
||||
|
||||
.IP "\fB\-i \fI<peer IP>\fP" 10
|
||||
Print only entries coming from a given peer IP address.
|
||||
|
||||
.IP "\fB\-I \fI<file>\fP" 10
|
||||
(The uppercase letter i.) Print only entries coming from any peer IP address listed in file,
|
||||
see
|
||||
.IR "FILTER TEMPLATE FILES"
|
||||
section below for details.
|
||||
|
||||
.IP "\fB\-l\fP" 10
|
||||
(The letter ell.) Print only entries with loops in their AS_PATH.
|
||||
|
||||
.IP "\fB\-L\fP" 10
|
||||
Opposite of
|
||||
.IR \-l ,
|
||||
print only entries without loops in their AS_PATH.
|
||||
|
||||
.IP "\fB\-o \fI<file>\fP" 10
|
||||
Redirect output to file (defaults to standard output).
|
||||
If option occurs multiple times, last one prevails.
|
||||
|
||||
.IP "\fB\-m \fI<communities string>\fP" 10
|
||||
Print only entries whose COMMUNITY attribute contains the given communities (in any order).
|
||||
Communities must be specified in canonical form and space separated, for example: `1234:567 8910:1112'.
|
||||
Well\-known communities can also be specified according to IANA (see
|
||||
.IR STANDARDS ),
|
||||
for example NO_EXPORT.
|
||||
|
||||
.IP "\fB\-M \fI<communities string>\fP" 10
|
||||
Opposite of
|
||||
.IR \-m ,
|
||||
only prints entries whose COMMUNITY attribute does
|
||||
.B not
|
||||
contain the given communities (in any order).
|
||||
|
||||
.IP "\fB\-p \fI<path expression>\fP" 10
|
||||
Print only entries whose AS_PATH matches the provided expression.
|
||||
This option accepts expressions in a syntax resembling a heavily simplified
|
||||
form of POSIX basic regular expressions.
|
||||
See section
|
||||
.IR "AS PATH MATCH EXPRESSIONS"
|
||||
for details.
|
||||
|
||||
.IP "\fB\-P \fI<path expression>\fP" 10
|
||||
Opposite of
|
||||
.IR \-p ,
|
||||
only prints entries whose AS_PATH does
|
||||
.B not
|
||||
match the provided expression.
|
||||
|
||||
.IP "\fB\-r \fI<prefix>\fP" 10
|
||||
Print only entries containing subnets or supernets of the given prefix (including the prefix itself).
|
||||
|
||||
.IP "\fB\-R \fI<file>\fP" 10
|
||||
Print only entries containing subnets or supernets of any prefix listed in file (including the prefix itself),
|
||||
see section
|
||||
.IR "FILTER TEMPLATE FILES"
|
||||
for details.
|
||||
|
||||
.IP "\fB\-s \fI<subnet>\fP" 10
|
||||
Print only entries containing subnets of the given prefix.
|
||||
|
||||
.IP "\fB\-S \fI<file>\fP" 10
|
||||
Print only entries containing subnets of any prefix listed in file,
|
||||
see section
|
||||
.IR "FILTER TEMPLATE FILES"
|
||||
for details.
|
||||
|
||||
.IP "\fB\-t \fI<attribute code>\fP" 10
|
||||
Print only entries containing the given interesting attribute.
|
||||
|
||||
.IP "\fB\-u \fI<prefix>\fP" 10
|
||||
Print only entries containing supernets of the given prefix
|
||||
(including the prefix itself).
|
||||
|
||||
.IP "\fB\-U \fI<file>\fP" 10
|
||||
Print only entries containing supernets of any prefix listed in file
|
||||
(including the prefix itself),
|
||||
see section
|
||||
.IR "FILTER TEMPLATE FILES"
|
||||
for details.
|
||||
|
||||
.SH OPERANDS
|
||||
The following operands are supported:
|
||||
.TP
|
||||
.B FILE
|
||||
A pathname of an input file. If no file operands are specified, the standard input is used.
|
||||
If a file is `-',
|
||||
.IR @UTILITY@
|
||||
shall read from the standard input at that point in the sequence.
|
||||
.B bgpscanner
|
||||
does not close and reopen standard input when it is referenced in this way, but accepts multiple occurrences of `-' as a file operand.
|
||||
See the
|
||||
.IR "INPUT FILES"
|
||||
section for details on the supported file formats.
|
||||
|
||||
.SH "AS PATH MATCH EXPRESSIONS"
|
||||
AS_PATH match expressions (accepted by
|
||||
.IR \-p
|
||||
and
|
||||
.IR \-P
|
||||
options) use a simplified format based on typical conventions estabilished by
|
||||
POSIX regular expressions. The most basic example is the position idependent AS_PATH matching,
|
||||
an expression such as:
|
||||
.nf
|
||||
\&
|
||||
.in +2m
|
||||
@UTILITY@\ \-p\ "1\ 2"
|
||||
.in
|
||||
\&
|
||||
.fi
|
||||
matches any message whose AS_PATH crosses link `AS1 AS2'. The `AS1 AS2' link may appear anywhere in
|
||||
AS_PATH. The expression can be arbitrarily complex, for example:
|
||||
.nf
|
||||
\&
|
||||
.in +2m
|
||||
@UTILITY@\ \-p\ "1\ 2\ 3\ 4\ 5\ 6\ 7\ 8"
|
||||
.in
|
||||
\&
|
||||
.fi
|
||||
matches any message with the corresponding ASN subsequence appearing anywhere in its AS_PATH.
|
||||
A `?' (question mark) may be placed anywhere in the expression to signal the fact that any ASN may
|
||||
appear in that position, for example:
|
||||
.nf
|
||||
\&
|
||||
.in +2m
|
||||
@UTILITY@\ \-p\ "1\ ?\ 3"
|
||||
.in
|
||||
\&
|
||||
.fi
|
||||
matches any message whose AS_PATH contains a subsequence of length 3, whose first ASN is AS1 and the last one is AS3.
|
||||
.P
|
||||
Matching expressions may be constrained to operate to the beginning or the end of the AS PATH.
|
||||
By prepending `^' (caret) to the expression, the following ASN are required to appear at the beginning of the path,
|
||||
for example:
|
||||
.nf
|
||||
\&
|
||||
.in +2m
|
||||
@UTILITY@\ \-p\ "^1\ 2"
|
||||
.in
|
||||
\&
|
||||
.fi
|
||||
matches any message whose AS_PATH starts with the link `AS1 AS2'.
|
||||
In a similar fashion, the expression may be forced to match at the end of the path by appending a `$' (dollar sign) at the end.
|
||||
.nf
|
||||
\&
|
||||
.in +2m
|
||||
@UTILITY@\ \-p\ "1\ 2$"
|
||||
.in
|
||||
\&
|
||||
.fi
|
||||
matches any message whose AS_PATH ends with the link `AS1 AS2'.
|
||||
A `?' may be used to match any ASN in the corresponding position, for example:
|
||||
.nf
|
||||
\&
|
||||
.in +2m
|
||||
@UTILITY@\ \-p\ "1\ ?$"
|
||||
.in
|
||||
\&
|
||||
.fi
|
||||
matches any message whose AS_PATH is ending with the second to last ASN being AS1.
|
||||
The `^' and `$' symbols may be used to create exact matches, such as:
|
||||
.nf
|
||||
\&
|
||||
.in +2m
|
||||
@UTILITY@\ \-p\ "^1\ 2\ 3\ 4$"
|
||||
.in
|
||||
\&
|
||||
.fi
|
||||
matches any message whose AS PATH is exactly `AS1 AS2 AS3 AS4'.
|
||||
.nf
|
||||
\&
|
||||
.in +2m
|
||||
@UTILITY@\ \-p\ "^1\ 2\ ?\ 4$"
|
||||
.in
|
||||
\&
|
||||
.fi
|
||||
matches any message whose AS_PATH starts with `AS1 AS2' and ends with AS4, but may have any ASN
|
||||
in the second to last position.
|
||||
A `*' (star) may be used to match zero or more ASN in the position.
|
||||
Note that if the intended usage is to match
|
||||
.B one
|
||||
or more ASN, then a `?' symbol
|
||||
should be used before the `*'. For example:
|
||||
.nf
|
||||
\&
|
||||
.in +2m
|
||||
@UTILITY@\ \-p\ "^1\ 2\ *\ 4$"
|
||||
.in
|
||||
\&
|
||||
.fi
|
||||
matches any message whose AS PATH starts with `AS1 AS2', then contains
|
||||
.B zero
|
||||
or more ASN and ends with AS4.
|
||||
.nf
|
||||
\&
|
||||
.in +2m
|
||||
@UTILITY@\ \-p\ "^1\ 2\ ?\ *\ 4$"
|
||||
.in
|
||||
\&
|
||||
.fi
|
||||
matches any message whose AS_PATH starts with `AS1 AS2', then contains
|
||||
.B one
|
||||
or more ASN and terminates with AS4.
|
||||
The metacharacters explained above may be mixed to create arbitrarily complex expressions.
|
||||
.P
|
||||
As a backwards compatibility note, please note that Isolario
|
||||
.IR bgpscanner
|
||||
AS_PATH expression syntax differs from
|
||||
.IR bgpgrep (1)'s
|
||||
in that a `?' character signifies "any ASN" rather than "match zero or one time"
|
||||
(see section
|
||||
.IR "AS_PATH REGULAR EXPRESSIONS"
|
||||
of
|
||||
.IR bgpgrep (1)
|
||||
documentation for details). There is no equivalent to
|
||||
.IR bgpgrep (1)'s
|
||||
`?' in Isolario
|
||||
.IR bgpscanner
|
||||
AS_PATH matching expressions.
|
||||
|
||||
.SH FILTER TEMPLATE FILES
|
||||
A number of options offer variants reading their arguments from a template file
|
||||
(for example the
|
||||
.IR \-e
|
||||
option allows an alternate
|
||||
.IR \-E
|
||||
variant to read each prefix directly from file). This provides means to create
|
||||
filter templates that may be further refined by additional inline options.
|
||||
Writing a template file may eliminate the burden of repeatedly typing prefixes that are known
|
||||
to be always relevant across multiple executions, leaving only prefixes that may genuinely
|
||||
change to be specified, for example:
|
||||
.nf
|
||||
\&
|
||||
.in +2m
|
||||
@UTILITY@\ \-E\ template.txt\ \-e\ "192.65.121.0/24"
|
||||
.in
|
||||
\&
|
||||
.fi
|
||||
Template file is expected to contain a space separated list of tokens in the same format as
|
||||
the ones expected by the non-template variant of the option. Note that newlines are considered
|
||||
spaces.
|
||||
Comments may be freely inserted in the file by prepending them with the `#' (hash) character, anything following
|
||||
`#' is ignored up to the next newline.
|
||||
Tokens containing spaces may be enclosed in `"' (quotes) to preserve them.
|
||||
Template files support the usual C-style character escape sequences.
|
||||
.P
|
||||
As an implementation note, the
|
||||
.IR @UTILITY@
|
||||
wrapper translates every historical Isolario
|
||||
.IR bgpscanner
|
||||
template file to an equivalent
|
||||
.IR bgpgrep (1)
|
||||
template inside a temporary file, that is later feed to
|
||||
.IR bgpgrep (1),
|
||||
an interested user may inspect the resulting file to learn about the differences
|
||||
in syntax.
|
||||
.P
|
||||
Also note that Isolario
|
||||
.IR bgpscanner
|
||||
used the `#' character to mark comments, while
|
||||
.IR bgpgrep (1)
|
||||
uses C and C++ style comments.
|
||||
|
||||
.SH "LINE ORIENTED OUTPUT"
|
||||
The
|
||||
.IR @UTILITY@
|
||||
wrapper output is identical to the output produced by
|
||||
.IR bgpgrep (1)
|
||||
and
|
||||
.IR peerindex (1),
|
||||
depending on the
|
||||
.IR OPTIONS
|
||||
specified.
|
||||
See
|
||||
.IR bgpgrep (1)
|
||||
and
|
||||
.IR peerindex (1)
|
||||
documentation for details.
|
||||
|
||||
.SH "PRETEND MODE"
|
||||
The
|
||||
.IR @UTILITY@
|
||||
wrapper may operate in pretend mode, whenever the
|
||||
.B PRETEND
|
||||
environment variable is set and equal to any of the values
|
||||
documented in the
|
||||
.IR "ENVIRONMENT VARIABLES"
|
||||
section.
|
||||
In pretend mode, the
|
||||
.IR @UTILITY@
|
||||
wrapper will not execute any command, instead it will print the command
|
||||
that would be executed. This may serve as a debug tool, or a learning tool
|
||||
to display how to perform a known Isolario
|
||||
.IR bgpscanner
|
||||
task using
|
||||
.IR \[*m]bgpsuite
|
||||
native tools.
|
||||
|
||||
.SH "ENVIRONMENT VARIABLES"
|
||||
The following environment variables affect the execution of the
|
||||
.IR @UTILITY@
|
||||
wrapper:
|
||||
|
||||
.IP "\fBPRETEND\fP" 10
|
||||
Determines whether pretend mode is enabled (see
|
||||
.IR "PRETEND MODE"
|
||||
for details).
|
||||
.IR "PRETEND MODE"
|
||||
is enabled whenever
|
||||
.B PRETEND
|
||||
is defined and its value is equal to 1, `y' or `yes` (in a case sensitive way).
|
||||
|
||||
.SH "EXIT STATUS"
|
||||
The
|
||||
.IR @UTILITY@
|
||||
wrapper has the same exit values as
|
||||
.IR bgpgrep (1)
|
||||
and
|
||||
.IR peerindex (1),
|
||||
see their respective documentation for details.
|
||||
|
||||
.SH STDIN
|
||||
The
|
||||
.IR @UTILITY@
|
||||
standard input usage is identical to
|
||||
.IR bgpgrep (1)
|
||||
and
|
||||
.IR peerindex (1).
|
||||
See their respective documentation for details.
|
||||
|
||||
.SH "INPUT FILES"
|
||||
The
|
||||
.IR @UTILITY@
|
||||
supports any input file supported by
|
||||
.IR bgpgrep (1)
|
||||
and
|
||||
.IR peerindex (1).
|
||||
See their respective documentation for details.
|
||||
|
||||
.SH STDOUT
|
||||
Unless redirected explicitly via
|
||||
.IR OPTIONS ,
|
||||
the standard output is used to print a human readable text
|
||||
representation of BGP message data, nothing else shall be written
|
||||
to the standard output.
|
||||
.IR @UTILITY@
|
||||
may detect and treat as error whenever the standard output is a regular file,
|
||||
and is the same file as any of the
|
||||
.IR FILES
|
||||
arguments.
|
||||
The default output format used by
|
||||
.IR @UTILITY@
|
||||
is documented in the
|
||||
.IR "LINE ORIENTED OUTPUT"
|
||||
section.
|
||||
|
||||
.SH STDERR
|
||||
The standard error is used only for diagnostic messages and error reporting.
|
||||
|
||||
.SH SEE ALSO
|
||||
.IR bgpgrep (1),
|
||||
.IR peerindex (1)
|
||||
|
||||
.SH STANDARDS
|
||||
The
|
||||
.IR @UTILITY@
|
||||
adheres to the same standards as
|
||||
.IR bgpgrep (1)
|
||||
and
|
||||
.IR peerindex (1)
|
||||
see their respective documentations for details.
|
||||
|
||||
.SH AUTHOR
|
||||
The
|
||||
.IR @UTILITY@
|
||||
wrapper script was written by
|
||||
.UR lcg@\:inventati.\:org
|
||||
Lorenzo Cogotti
|
||||
.UE .
|
Loading…
Reference in New Issue