Created
May 14, 2026 06:58
-
-
Save tuna2134/9cb23057f6ac63918cbb2fa620a691be to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| set -euo pipefail | |
| usage() { | |
| cat <<EOF | |
| Usage: | |
| $0 ASN [options] | |
| Arguments: | |
| ASN Target ASN (e.g. AS15169) | |
| Options: | |
| --start-rule N Starting rule number (default: 1) | |
| --name NAME Prefix-list base name | |
| -h, --help Show this help | |
| Examples: | |
| $0 AS15169 | |
| $0 AS15169 --start-rule 100 | |
| $0 AS15169 --start-rule 100 --name google | |
| Output examples: | |
| set policy prefix-list google-v4 rule 100 action permit | |
| set policy prefix-list google-v4 rule 100 prefix 8.8.8.0/24 | |
| set policy prefix-list6 google-v6 rule 100 action permit | |
| set policy prefix-list6 google-v6 rule 100 prefix 2001:4860::/32 | |
| Requirements: | |
| - bgpq4 | |
| - jq | |
| EOF | |
| } | |
| if [[ $# -lt 1 ]]; then | |
| usage | |
| exit 1 | |
| fi | |
| ASN="" | |
| START_RULE=1 | |
| BASE_NAME="" | |
| while [[ $# -gt 0 ]]; do | |
| case "$1" in | |
| --start-rule) | |
| START_RULE="${2:-}" | |
| shift 2 | |
| ;; | |
| --name) | |
| BASE_NAME="${2:-}" | |
| shift 2 | |
| ;; | |
| -h|--help) | |
| usage | |
| exit 0 | |
| ;; | |
| --*) | |
| echo "Error: Unknown option: $1" >&2 | |
| echo >&2 | |
| usage | |
| exit 1 | |
| ;; | |
| *) | |
| if [[ -z "$ASN" ]]; then | |
| ASN="$1" | |
| else | |
| echo "Error: Multiple ASN arguments specified" >&2 | |
| exit 1 | |
| fi | |
| shift | |
| ;; | |
| esac | |
| done | |
| if [[ -z "$ASN" ]]; then | |
| echo "Error: ASN is required" >&2 | |
| echo >&2 | |
| usage | |
| exit 1 | |
| fi | |
| command -v bgpq4 >/dev/null 2>&1 || { | |
| echo "Error: bgpq4 not found" >&2 | |
| exit 1 | |
| } | |
| command -v jq >/dev/null 2>&1 || { | |
| echo "Error: jq not found" >&2 | |
| exit 1 | |
| } | |
| if [[ -z "$BASE_NAME" ]]; then | |
| BASE_NAME="$(echo "${ASN}" | tr '[:upper:]' '[:lower:]')" | |
| fi | |
| LIST_V4="${BASE_NAME}-v4" | |
| LIST_V6="${BASE_NAME}-v6" | |
| TMP_V4="$(mktemp)" | |
| TMP_V6="$(mktemp)" | |
| cleanup() { | |
| rm -f "$TMP_V4" "$TMP_V6" | |
| } | |
| trap cleanup EXIT | |
| bgpq4 -4 -j "${ASN}" > "$TMP_V4" | |
| bgpq4 -6 -j "${ASN}" > "$TMP_V6" | |
| jq -r \ | |
| --arg name "$LIST_V4" \ | |
| --argjson start "$START_RULE" ' | |
| .NN | |
| | to_entries[] | |
| | ($start + .key) as $rule | |
| | "set policy prefix-list \($name) rule \($rule) action permit\n" + | |
| "set policy prefix-list \($name) rule \($rule) prefix \(.value.prefix)" | |
| ' "$TMP_V4" | |
| jq -r \ | |
| --arg name "$LIST_V6" \ | |
| --argjson start "$START_RULE" ' | |
| .NN | |
| | to_entries[] | |
| | ($start + .key) as $rule | |
| | "set policy prefix-list6 \($name) rule \($rule) action permit\n" + | |
| "set policy prefix-list6 \($name) rule \($rule) prefix \(.value.prefix)" | |
| ' "$TMP_V6" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment