Skip to content

Commit 75e1e61

Browse files
committed
add lib-lookup
1 parent 460efe0 commit 75e1e61

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed

lib/geoip-shell-lib-lookup.sh

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
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

Comments
 (0)