Skip to content

Instantly share code, notes, and snippets.

@tuna2134
Created May 14, 2026 06:58
Show Gist options
  • Select an option

  • Save tuna2134/9cb23057f6ac63918cbb2fa620a691be to your computer and use it in GitHub Desktop.

Select an option

Save tuna2134/9cb23057f6ac63918cbb2fa620a691be to your computer and use it in GitHub Desktop.
#!/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