#!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin # Data sources src_asnames="https://ftp.ripe.net/ripe/asnames/asn.txt" src_route4="https://ftp.ripe.net/ripe/dbase/split/ripe.db.route.gz" src_route6="https://ftp.ripe.net/ripe/dbase/split/ripe.db.route6.gz" # Local storage for downloads and results dir="/var/db/ripe" dest_asnames="$dir/asn.txt" dest_route4="$dir/ripe.db.route.gz" dest_route6="$dir/ripe.db.route6.gz" route4="${dest_route4%.gz}" route6="${dest_route6%.gz}" # Results prefix4="$dir/prefix4" prefix4_full="$prefix4.full" prefix6="$dir/prefix6" prefix6_full="$prefix6.full" updated="unknown" fetch_timeout="5" # seconds temp="$dir/tmp.$$" set -e LANG=C LC_ALL=C install -d "$dir" force=no [ "$1" = "-f" ] && force=yes trap 'rm -f "$temp" "$temp.2"' EXIT # args: url localfile update_file() { local check src dst src="$1" dst="$2" # Download it with time modification check unless forced mode. [ -e "$dst" ] || echo -n > "$dst" || return 1 [ "$force" = no ] && check='-i "$dst"' eval fetch --no-verify-peer -4aqT "$fetch_timeout" $check -o \"$temp\" \"$src\" || return 1 ! [ -s "$temp" ] && updated=no && return 0 # no updates [ $force = no ] && cmp -sz "$temp" "$dst" && updated=no && return 0 mv "$temp" "$dst" || return 1 updated=yes return 0 } # no args update_asnames() { update_file "$src_asnames" "$dest_asnames" [ "$updated" = no ] && exit 0 return 0 } # no args update_routes() { update_file "$src_route4" "$dest_route4" && \ gunzip < "$dest_route4" > "$temp" && mv "$temp" "$route4" # update_file "$src_route6" "$dest_route6" && \ # gunzip < "$dest_route6" > "$temp" && mv "$temp" "$route6" } # args: asnfile countryname routefile result_aggregated result_full # # 1. Filter asnfile by countryname. # 2. Filter routefile by filtered asnfile from above removing duplicates. filter_prefixes() { local aggregated full aggregated="$4" full="$5" awk -vlist="$1" -vcountry="$2" ' BEGIN { cmd = "cat " list while((cmd | getline) == 1) { if ($NF == country) { asn["AS" $1] = 1 } } } $1 == "route:" || $1 == "route6:" { prefix = $2 } $1 == "origin:" { if (asn[$2] == 1) { result[prefix] = 1 } } END { for(prefix in result) { print prefix } } ' "$3" > "$temp" [ -s "$temp" ] mv "$temp" "$full" iprange "$full" > "$temp" [ -s "$temp" ] mv "$temp" "$aggregated" } update_asnames update_routes filter_prefixes "$dest_asnames" RU "$route4" "$prefix4" "$prefix4_full"