]> git.openstreetmap.org Git - nominatim.git/blob - utils/cron_banip.sh
f40a4227febc4855b64073ab903f7bd3b3fbf8b4
[nominatim.git] / utils / cron_banip.sh
1 #!/bin/bash -x
2 #
3 # Create or update the list of temporarily banned IPs.
4 #
5
6 BASEDIR="$( cd "$( dirname "$0" )" && cd .. && pwd )"
7 if [ "x$BASEDIR" == "x" ]; then
8     echo "Could not determine base dir."
9     exit -1
10 fi
11
12 BLOCKEDFILE=$BASEDIR/settings/ip_blocks
13 LOGFILE=$BASEDIR/log/ip_blocks.log
14
15 LONG_PERIOD='1 hour'
16 SHORT_PERIOD='10 min'
17 COOLOFF_PERIOD='1 hour'
18
19 REVLONG_LIMIT=20000
20 REVSHORT_LIMIT=6000
21 SRCHLONG_LIMIT=4000
22 SRCHSHORT_LIMIT='10 min'
23
24 PSQLCMD='psql -qtA -d nominatim'
25
26 # Blocking candidates
27 $PSQLCMD > $BLOCKEDFILE.newblocks << ENDOFQUERY
28 SELECT ipaddress FROM
29 ((SELECT ipaddress FROM
30   (SELECT ipaddress, count(*) FROM new_query_log
31    WHERE type = 'reverse' AND starttime > now() - interval '$LONG_PERIOD'
32    GROUP BY ipaddress)
33   as v
34   WHERE count > $REVLONG_LIMIT) 
35 UNION
36 (SELECT ipaddress FROM
37   (SELECT ipaddress, count(*) FROM new_query_log
38    WHERE type = 'reverse' AND starttime > now() - interval '$SHORT_PERIOD'
39    GROUP BY ipaddress)
40   as v
41   WHERE count > $REVSHORT_LIMIT) 
42 UNION
43 (SELECT ipaddress FROM
44   (SELECT ipaddress, count(*) FROM new_query_log
45    WHERE type = 'search' AND starttime > now() - interval '$LONG_PERIOD'
46    GROUP BY ipaddress)
47   as v
48   WHERE count > $SRCHLONG_LIMIT) 
49 UNION
50 (SELECT ipaddress FROM
51   (SELECT ipaddress, sum(endtime-starttime) as dur FROM new_query_log
52    WHERE type = 'search' AND starttime > now() - interval '$SHORT_PERIOD'
53    GROUP BY ipaddress)
54   as v
55   WHERE dur > '$SRCHSHORT_LIMIT')
56 ) as q ORDER BY ipaddress;
57 ENDOFQUERY
58
59 no_newblocks=`comm $BLOCKEDFILE.newblocks $BLOCKEDFILE -23 | wc -l`
60
61 if [ "x$no_newblocks" != "x0" ]; then
62     date +"%x %X Newly blocked IPs: `comm $BLOCKEDFILE.newblocks $BLOCKEDFILE -23 | tr '\n' ' '`" >> $LOGFILE
63 fi
64
65
66 # Deblockable candidates
67 blocked=`tr '\n' ',' < $BLOCKEDFILE | sed "s:[[:space:]]::g;s:,$::;s:,:'),(':g"`
68
69 if [ "x$blocked" == "x" ]; then
70   mv $BLOCKEDFILE.newblocks $BLOCKEDFILE 
71 else
72     $PSQLCMD > $BLOCKEDFILE.newlifted << ENDOFQUERY
73     VALUES ('$blocked')
74     EXCEPT
75     (SELECT DISTINCT ipaddress FROM new_query_log
76      WHERE starttime > now() - interval '$COOLOFF_PERIOD')
77 ENDOFQUERY
78
79     no_lifted=`cat $BLOCKEDFILE.newlifted | wc -w`
80
81     if [ "x$no_lifted" != "x0" ]; then
82         date +"%x %X Bans lifted: `tr '\n' ' ' < $BLOCKEDFILE.newlifted`" >> $LOGFILE
83     fi
84
85     # Write out new blocks
86     cat $BLOCKEDFILE.newblocks $BLOCKEDFILE | sort -u | comm - $BLOCKEDFILE.newlifted -23 > $BLOCKEDFILE.new
87     mv $BLOCKEDFILE.new $BLOCKEDFILE
88
89     rm $BLOCKEDFILE.newblocks $BLOCKEDFILE.newlifted
90 fi