mirror of
				https://codeberg.org/1414codeforge/ubgpsuite.git
				synced 2025-06-05 21:29:11 +02:00 
			
		
		
		
	[tools/bgpscanner] Add backwards compatible bgpscanner wrapper
This commit is contained in:
		
							
								
								
									
										326
									
								
								tools/bgpscanner/bgpscanner
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										326
									
								
								tools/bgpscanner/bgpscanner
									
									
									
									
									
										Executable file
									
								
							| @@ -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 | ||||||
							
								
								
									
										484
									
								
								tools/bgpscanner/bgpscanner.1.in
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										484
									
								
								tools/bgpscanner/bgpscanner.1.in
									
									
									
									
									
										Executable file
									
								
							| @@ -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 . | ||||||
		Reference in New Issue
	
	Block a user