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