74 lines
1.5 KiB
Bash
Executable File
74 lines
1.5 KiB
Bash
Executable File
#!/bin/bash -e
|
|
|
|
# Free IP Geolocation by DB-IP: https://db-ip.com/db/download/ip-to-country-lite
|
|
|
|
VAR_D="/usr/local/psa/var/modules/firewall/geoip/`basename "$0"`.d"
|
|
|
|
die()
|
|
{
|
|
echo "`basename "$0"`: $*" >&2
|
|
exit 1
|
|
}
|
|
|
|
load_settings()
|
|
{
|
|
[ ! -s "$VAR_D/settings.sh" ] || . "$VAR_D/settings.sh"
|
|
}
|
|
|
|
save_settings()
|
|
{
|
|
cat > "./settings.sh" <<-EOT
|
|
: \${DOWNLOAD_TIMEOUT:=$DOWNLOAD_TIMEOUT}
|
|
EOT
|
|
}
|
|
|
|
exists()
|
|
{
|
|
[ -s "$VAR_D/db.sqlite3" ]
|
|
}
|
|
|
|
fetch()
|
|
{
|
|
load_settings
|
|
|
|
rm -rf "$VAR_D".*
|
|
mkdir -p "`dirname "$VAR_D"`"
|
|
|
|
local tgt_d=
|
|
tgt_d="`mktemp -d "$VAR_D.XXXXXX"`"
|
|
chmod 700 "$tgt_d"
|
|
cd "$tgt_d"
|
|
|
|
local url="https://download.db-ip.com/free/dbip-country-lite-`date -d 'now - 1 day' --utc +%Y-%m`.csv.gz"
|
|
date --utc --rfc-3339=seconds > updated-at
|
|
save_settings
|
|
curl ${DOWNLOAD_TIMEOUT:+-m "$DOWNLOAD_TIMEOUT"} -fsSL "$url" | gzip -cd > dbip.csv
|
|
sqlite3 db.sqlite3 <<-EOT
|
|
CREATE TABLE ips (ip_from TEXT, ip_to TEXT, country_iso_code TEXT);
|
|
CREATE INDEX ips_code ON ips (country_iso_code);
|
|
.mode csv
|
|
.import dbip.csv ips
|
|
EOT
|
|
[ "`sqlite3 db.sqlite3 'SELECT count(*) FROM ips;'`" -gt 0 ] || die "Downloaded DB is empty"
|
|
rm -f dbip.csv
|
|
|
|
rm -rf "$VAR_D"
|
|
mv -fT "$tgt_d" "$VAR_D"
|
|
}
|
|
|
|
list()
|
|
{
|
|
local country="$1"
|
|
[ -n "$country" ] || die "--list requires a single 2-letter ISO country code argument"
|
|
|
|
sqlite3 "$VAR_D/db.sqlite3" \
|
|
"SELECT ip_from || '-' || ip_to FROM ips WHERE country_iso_code = '$country';"
|
|
}
|
|
|
|
case "$1" in
|
|
--exists) exists ;;
|
|
--fetch) fetch ;;
|
|
--list) list "$2" ;;
|
|
*) die "Unknown command: '$1'" ;;
|
|
esac
|