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