-
-
Notifications
You must be signed in to change notification settings - Fork 133
/
Copy pathprefix-intersect.sh
executable file
·79 lines (64 loc) · 2.17 KB
/
prefix-intersect.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/bin/bash
#
# Test overlapping IPv4 prefixes.
#
# DEPENDS :apt-get install sipcalc
# Prefix list file from https://bgp.he.net/AS1#_prefixes
PREFIX_LIST="$1"
Ip2dec()
{
local IPV4="$1"
local -i OCTET1 OCTET2 OCTET3 OCTET4
IFS="." read -r OCTET1 OCTET2 OCTET3 OCTET4 <<<"$IPV4"
echo "$(( (OCTET1 << 24) + (OCTET2 << 16) + (OCTET3 << 8) + OCTET4 ))"
}
declare -a PREFIXES PREFIXES_FROM PREFIXES_TO
declare -i FROM TO FROM2 TO2 INTERSECTIONS
set -e
test -r "$PREFIX_LIST"
INTERSECTIONS="0"
# Parse prefix list file
while read -r PREFIX; do
test -z "$PREFIX" && continue
test "${PREFIX:0:3}" == ROA && continue
test "${PREFIX:0:3}" == IRR && continue
PREFIXES+=( "$PREFIX" )
FROM_TO="$(sipcalc "$PREFIX" | sed -n -e 's|^Network range\s\+- \([0-9.]\+\) - \([0-9.]\+\)$|\1:\2|p')"
PREFIXES_FROM+=( "$(Ip2dec "${FROM_TO%:*}")" )
PREFIXES_TO+=( "$(Ip2dec "${FROM_TO#*:}")" )
done <"$PREFIX_LIST"
# Loop through prefixes
declare -i TOTAL="${#PREFIXES[*]}"
for NUMBER in $(seq 0 "$((TOTAL - 2))"); do
echo "Testing #${NUMBER} ${PREFIXES[$NUMBER]} ..." 1>&2
FROM="${PREFIXES_FROM[$NUMBER]}"
TO="${PREFIXES_TO[$NUMBER]}"
# Compare to other prefixes
for NUMBER2 in $(seq "$((NUMBER + 1))" "$((TOTAL - 1))"); do
# DBG echo " Comparing to #${NUMBER2} ${PREFIXES[$NUMBER2]} ..."
FROM2="${PREFIXES_FROM[$NUMBER2]}"
TO2="${PREFIXES_TO[$NUMBER2]}"
# 1..1
# 2......2
if [[ "$FROM2" -lt "$FROM" && "$TO2" -gt "$TO" ]]; then
INTERSECTIONS+="1"
echo "${PREFIXES[$NUMBER2]} covers ${PREFIXES[$NUMBER]}"
continue
fi
# 1.....1
# 2.....2
if [[ "$FROM2" -ge "$FROM" && "$FROM2" -le "$TO" ]]; then
INTERSECTIONS+="1"
echo "${PREFIXES[$NUMBER2]} starts within ${PREFIXES[$NUMBER]}"
continue
fi
# 1.....1
# 2.....2
if [[ "$TO2" -ge "$FROM" && "$TO2" -le "$TO" ]]; then
INTERSECTIONS+="1"
echo "${PREFIXES[$NUMBER2]} ends within ${PREFIXES[$NUMBER]}"
continue
fi
done
done
echo "Number of intersections: ${INTERSECTIONS}" 1>&2