1
+ #! /bin/sh
2
+ # shellcheck disable=SC1090,SC2154
3
+
4
+ # geoip-shell-lib-lookup
5
+
6
+ # Copyright: antonk ([email protected] )
7
+ # github.com/friendly-bits
8
+
9
+
10
+ lookup () {
11
+ finalize_lookup () {
12
+ rm -rf " $dumped_ipsets_file "
13
+ die " $@ "
14
+ }
15
+
16
+ dump_ipsets () {
17
+ for ipset in $1 ; do
18
+ case " $ipset " in * [A-Z][A-Z]_${2} _* |* allow_in_${2} |* allow_out_${2} |* allow_${2} * |block_${2} * )
19
+ print_ipset_elements " $ipset " " $1 "
20
+ esac
21
+ done > " $3 " || { echolog -err " Failed to get ipset elements for ipsets '$1 '." ; return 1; }
22
+ }
23
+
24
+ lookup_ips () {
25
+ if [ -n " $1 " ]; then
26
+ for ip in $1 ; do
27
+ case " $3 " in
28
+ 4) case " $ip " in * :* ) continue ; esac ;;
29
+ 6) case " $ip " in * .* ) continue ; esac
30
+ esac
31
+ printf ' %s\n' " $ip "
32
+ done | grepcidr -f " $4 "
33
+ elif [ -n " $2 " ]; then
34
+ eval " regex=\"\$ {ipv${3} _regex}\" "
35
+ sed " s/$blanks /\n/g" < " $2 " | grep -E " $regex " | grepcidr -f " $4 "
36
+ fi
37
+ }
38
+
39
+ # checks
40
+ checkutil grepcidr || die " grepcidr not found. Install it using your distribution's package manager."
41
+ [ -z " $1 " ] && [ -z " $2 " ] && die " Specify file with '-F <file>' or input IP addresses with '-I <\" IPs\" >'."
42
+ [ -n " $1 " ] && [ -n " $2 " ] && die " Use either '-F <file>' or '-I <\" IPs\" >' but not both."
43
+ [ -z " $2 " ] || [ -s " $2 " ] || die " File '$2 ' is not found or empty."
44
+
45
+ lookup_families=
46
+ if [ -n " $1 " ]; then
47
+ for ip in $1 ; do
48
+ case " $ip " in
49
+ * :* ) add2list lookup_families 6 ;;
50
+ * .* ) add2list lookup_families 4 ;;
51
+ * ) echolog -nolog -err " Invalid ip: '$ip '${_nl} "
52
+ esac
53
+ done
54
+ elif [ -n " $2 " ]; then
55
+ for f in 4 6; do
56
+ eval " regex=\"\$ {ipv${3} _regex}\" "
57
+ grep -E " $regex " " $2 " && add2list lookup_families " $f "
58
+ done
59
+ fi
60
+
61
+ # variables
62
+ dumped_ipsets_file=/tmp/geoip-shell-lookup.tmp
63
+ ips_found=
64
+
65
+ # get ipset list
66
+ ipsets=" $( get_ipsets | grep -v ' _dhcp_' ) "
67
+ [ -n " $ipsets " ] || die " No active IP sets found"
68
+
69
+ # lookup
70
+ if [ -z " $verb_mode " ]; then
71
+ printf ' %s\n\n' " Matching IP's in all loaded IP sets:"
72
+ for f in $lookup_families ; do
73
+ dump_ipsets " $ipsets " " $f " " $dumped_ipsets_file " || finalize_lookup 1
74
+ lookup_ips " $1 " " $2 " " $f " " $dumped_ipsets_file " && ips_found=1
75
+ done
76
+ [ -z " $ips_found " ] && { printf ' %s\n' " ${red} None${n_c} " ; finalize_lookup 2; }
77
+ else
78
+ printf ' %s\n\n' " Matching IP's:"
79
+ for f in $lookup_families ; do
80
+ for ipset in $ipsets ; do
81
+ case " $ipset " in
82
+ * [A-Z][A-Z]_${f} _* |* allow_in_${f} |* allow_out_${f} |* allow_${f} * |block_${f} * ) ;;
83
+ * ) continue
84
+ esac
85
+ dump_ipsets " $ipset " " $f " " $dumped_ipsets_file " || finalize_lookup 1
86
+ ips=" $( lookup_ips " $1 " " $2 " " $f " " $dumped_ipsets_file " ) " || continue
87
+ printf ' %s\n%s\n\n' " IP set '$ipset ':" " $ips "
88
+ ips_found=1
89
+ done
90
+ done
91
+ [ -z " $ips_found " ] && { printf ' %s\n' " ${red} No matching IP's found in all loaded IP sets.${n_c} " ; finalize_lookup 2; }
92
+ fi
93
+
94
+ finalize_lookup 0
95
+ }
96
+
97
+ :
0 commit comments