2019-09-19 15:16:32 +00:00
#!/bin/sh
2022-05-24 11:48:28 +00:00
#############################################################################################################################################
2022-07-31 10:48:46 +00:00
# /volume1/homes/user/script/update_blocklist.sh #
2022-05-24 11:48:28 +00:00
# #
# Script import IP's from blocklist.de #
# https://www.synology-forum.de/showthread.html?103687-Freigabe-Blockierliste-automatisch-updaten&p=837478&viewfull=1#post837478 #
# version 0.1 by Ruedi61, 15.11.2016 / DSM 6.0.3 #
# version 0.2 by AndiHeitzer, 18.09.2019 / DSM 6.2.1 > add further Vars for DB #
# version 0.3 by geimist, 28.09.2019 / DSM 6.2.1 > add stats / loglevel / speed improvement / delete expired IPs #
# version 0.4 by geimist, 24.05.2022 / DSM 7.1 > speed improvement over 5x #
# (for 10000 IPs only 107 seconds are needed instead of 658 seconds) #
# #
#############################################################################################################################################
2019-09-18 22:18:56 +00:00
2019-09-20 21:00:26 +00:00
# Deny=1 > Blacklist / Deny=0 > Whitelist
2019-09-28 11:40:39 +00:00
Deny = 1
2019-09-19 15:16:32 +00:00
# Download from www.blocklist.de | Select Typ: {all} {ssh} {mail} {apache} {imap} {ftp} {sip} {bots} {strongips} {ircbot} {bruteforcelogin}
2019-09-28 11:40:39 +00:00
BLOCKLIST_TYP = "all"
2019-09-19 15:16:32 +00:00
# Delete IP after x Day's OR use 0 for permanent block
2022-05-24 11:48:28 +00:00
DELETE_IP_AFTER = "5"
2019-09-19 15:16:32 +00:00
# Loglevel 1: Show Stats at the bottom / Loglevel 2: Show all / Loglevel 0: disable
2019-09-28 11:40:39 +00:00
LOGLEVEL = 1
2019-09-29 10:51:35 +00:00
# 0=Single Host / 1=? / 2=IP-Range (META must be set) / 3=subnetmask (META must be set)
TYPE = 0
# e.g. subnetmask / upper IP-Range
META = ''
2019-09-20 21:00:26 +00:00
2022-05-24 11:48:28 +00:00
#############################################################################################################################################
2019-09-20 16:07:09 +00:00
# Do NOT change after here!
2019-09-19 15:16:32 +00:00
2019-09-20 21:00:26 +00:00
# SQL Create-Statement for restore:
2022-05-24 11:48:28 +00:00
# 'CREATE TABLE AutoBlockIP(IP varchar(50) PRIMARY KEY,RecordTime date NOT NULL,ExpireTime date NOT NULL,Deny boolean NOT NULL,IPStd varchr(50) NOT NULL,Type INTEGER,Meta varchar(256))'
2019-09-19 15:22:55 +00:00
if [ $( whoami) != "root" ] ; then
echo "WARNING: this script must run from root!" >& 2
exit 1
fi
2019-09-28 11:40:39 +00:00
2022-05-24 11:48:28 +00:00
progressbar( ) {
# https://blog.cscholz.io/bash-progress-or-spinner/
# Um die Progressbar darzustellen, muss ein Zähler (_start) und der Maximalwert (_end) definiert werden.
# _start=0
# _end=$(wc -l $1)
#######################################
# Display a progress bar
# Arguments:
# $1 Current loop number
# $2 max. no of loops (1005)
# Returns:
# None
#######################################
# Process data
let _progress = ( ${ 1 } *100/${ 2 } *100) /100
let _done = ( ${ _progress } *4) /10
let _left = 40-$_done
# Build progressbar string lengths
_fill = $( printf " % ${ _done } s " )
_empty = $( printf " % ${ _left } s " )
printf " \rProgress : [ ${ _fill // /# } ${ _empty // /- } ] ${ _progress } %% ( $1 / $2 ) "
}
2019-09-28 11:40:39 +00:00
sec_to_time( ) {
local seconds = $1
local sign = ""
if [ [ ${ seconds : 0 : 1 } = = "-" ] ] ; then
seconds = ${ seconds : 1 }
sign = "-"
fi
local hours = $(( seconds / 3600 ))
local minutes = $(( ( seconds % 3600 ) / 60 ))
seconds = $(( seconds % 60 ))
printf "%s%02d:%02d:%02d" " $sign " $hours $minutes $seconds
}
2022-05-24 11:48:28 +00:00
# create temporary working directory & prepare variables
# ---------------------------------------------------------------------
work_tmp = $( mktemp -d -t tmp.XXXXXXXXXX)
trap 'rm -rf "$work_tmp"; exit' EXIT
before_list = " ${ work_tmp } /before.txt "
online_list = " ${ work_tmp } /online_list.txt "
blocklist_list = " ${ work_tmp } /blocklist.txt "
sql_statement = " ${ work_tmp } /insert_statement.sql "
countadded = 0
db_path = "/etc/synoautoblock.db"
UNIXTIME = $( date +%s)
UNIXTIME_DELETE_IP = $( date -d " + $DELETE_IP_AFTER days " +%s)
[ ! -f " $db_path " ] && sqlite3 " $db_path " 'CREATE TABLE AutoBlockIP(IP varchar(50) PRIMARY KEY,RecordTime date NOT NULL,ExpireTime date NOT NULL,Deny boolean NOT NULL,IPStd varchr(50) NOT NULL,Type INTEGER,Meta varchar(256))'
2019-09-28 11:40:39 +00:00
# count blocked IPs before:
2022-05-24 11:48:28 +00:00
countbefore = $( sqlite3 " $db_path " "SELECT count(IP) FROM AutoBlockIP WHERE Deny='1' " )
2019-09-29 13:03:18 +00:00
# delete IP if expired:
2022-05-24 11:48:28 +00:00
CountExpiredIP = $( sqlite3 " $db_path " " SELECT count(IP) FROM AutoBlockIP WHERE ExpireTime <= $UNIXTIME AND Deny='1' " )
sqlite3 " $db_path " " DELETE FROM AutoBlockIP WHERE ExpireTime <= $UNIXTIME AND Deny='1' "
2019-09-20 16:07:09 +00:00
# current IP-list:
2022-05-24 11:48:28 +00:00
sqlite3 -header -csv " $db_path " "select IP FROM AutoBlockIP WHERE Deny='1' ORDER BY 'IP' ASC;" | sed -e '1d' | sort > " $before_list "
2019-09-20 16:07:09 +00:00
# load online IP-list:
2022-05-24 11:48:28 +00:00
wget -q --timeout= 30 --tries= 2 -nv -O - " https://lists.blocklist.de/lists/ ${ BLOCKLIST_TYP } .txt " | sort | uniq > " $online_list "
if [ $( stat -c %s " $online_list " ) -eq 0 ] || [ ! -f " $online_list " ] ; then
echo -n "WARNING: The server blocklist.de is not available! Use alternative list -> "
wget -q --timeout= 30 --tries= 2 -nv -O - " https://mariushosting.com/wp-content/uploads/ $( date +%Y/%m) /deny-ip-list.txt " | sort | uniq > " $online_list "
if echo " $wgetlog " | grep -q "failed" ; then
echo "failed!"
exit 1
else
echo "OK"
fi
fi
# filter diffs - only diffs from left to right:
diff " $before_list " " $online_list " | grep '^>' | sed -e 's/> //' > " $blocklist_list "
2019-09-29 13:03:18 +00:00
# count of diffs:
2022-05-24 11:48:28 +00:00
countofdiffs = $( cat " $blocklist_list " | grep -Eo " ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} $" | wc -l)
2019-09-29 13:03:18 +00:00
echo " $countofdiffs IPs must be importet "
2022-05-24 11:48:28 +00:00
# progressbar:
progress_start = 0
progress_end = $countofdiffs
2022-05-25 09:17:13 +00:00
# beginn sql statement:
# ggf. "INSERT OR REPLACE INTO ..." https://www.sqlite.org/lang_insert.html
2022-05-24 11:48:28 +00:00
echo "INSERT OR IGNORE INTO AutoBlockIP ('IP', 'RecordTime', 'ExpireTime', 'Deny', 'IPStd', 'Type', 'Meta') VALUES " > " $sql_statement "
while read BLOCKED_IP ; do
# Check if IP valid
VALID_IPv4 = $( echo " $BLOCKED_IP " | grep -Eo " ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} $" | wc -l)
if [ [ " $VALID_IPv4 " -eq 1 ] ] ; then
# Convert IPv4 to IPv6 :)
IPv4 = $( echo $BLOCKED_IP | sed 's/\./ /g' )
IPv6 = $( printf "0000:0000:0000:0000:0000:FFFF:%02X%02X:%02X%02X" $IPv4 )
echo " (' $BLOCKED_IP ',' $UNIXTIME ',' $UNIXTIME_DELETE_IP ',' $Deny ',' $IPv6 ',' $TYPE ',' $META '), " >> " $sql_statement "
countadded = $(( $countadded + 1 ))
if [ [ $LOGLEVEL -eq 2 ] ] ; then
echo " IP added to Database! --> $BLOCKED_IP "
elif [ [ $LOGLEVEL -eq 1 ] ] ; then
# progressbar:
let progress_start = progress_start+1
progressbar ${ progress_start } ${ progress_end }
fi
fi
done < " $blocklist_list "
if [ " $countofdiffs " -ge 1 ] ; then
last_entry = $( cat " $sql_statement " | tail -n1)
sed -i " s/ $last_entry / ${ last_entry %, } ;/g " " $sql_statement "
printf "\n\nwrite DB ...\n"
sqlite3 " $db_path " < " $sql_statement "
fi
2019-09-18 22:18:56 +00:00
2019-09-24 15:45:32 +00:00
# stats …
2019-09-19 15:16:32 +00:00
if [ [ $LOGLEVEL -eq 1 ] ] || [ [ $LOGLEVEL -eq 2 ] ] ; then
2019-09-28 11:40:39 +00:00
echo -e; echo -e;
2022-05-24 11:48:28 +00:00
echo "stats:--------------------------------"
2019-09-29 13:03:18 +00:00
echo " duration of the process: $( sec_to_time $( expr $( date +%s) -${ UNIXTIME } ) ) "
2022-05-24 11:48:28 +00:00
echo " count of IPs in list: $( cat " $online_list " | grep -Eo " ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} $" | wc -l) "
2019-09-29 13:03:18 +00:00
echo " count of diffs: $countofdiffs "
2019-09-19 15:16:32 +00:00
echo " added IPs: $countadded "
2019-09-28 11:40:39 +00:00
echo " expired IPs (deleted): $CountExpiredIP (set expiry time: $DELETE_IP_AFTER days) "
2022-05-24 11:48:28 +00:00
echo " blocked IPs: before: $countbefore / current: $( sqlite3 " $db_path " "SELECT count(IP) FROM AutoBlockIP WHERE Deny='1' " ) "
2019-09-20 16:07:09 +00:00
fi
2019-09-19 15:16:32 +00:00
2019-09-24 15:45:32 +00:00
2019-09-20 21:00:26 +00:00
exit 0