~swag/armagetronad/0.2.9-sty+ct+ap-fork

« back to all changes in this revision

Viewing changes to scripts/examples/flexban.sh

  • Committer: Manuel Moos
  • Date: 2011-09-16 12:03:14 UTC
  • mto: (563.24.231 armagetronad)
  • mto: This revision was merged to the branch mainline in revision 758.
  • Revision ID: z-man@users.sf.net-20110916120314-6ri1dtp4et3bsh75
Adding example script: flexible ban. Range bans, location based bans, whois lookup based bans.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/bin/bash
 
2
 
 
3
# This script can ban and kick players based on more flexible
 
4
# criteria than the game can. It reads ban rules from the configuration
 
5
# script flexban_cfg.sh, which really is just a shell script in which you can
 
6
# execute the following commands. All commands operate on the player that last
 
7
# entered the server. You can use all the usual bash flow control, for example
 
8
# grep_geoip Australia && ban 60 "No Aussies!"
 
9
# bans all australians, while
 
10
# grep_geoip Australia || ban 60 "Aussies only!"
 
11
# bans all but Australians, and
 
12
# grep_geoip Australia || grep_whois Bruce && ban 60 "Aussie Bruces only!"
 
13
# bans everyone not from australia with Bruce appearing in their whois entry.
 
14
# (Sorry for the silly examples.)
 
15
 
 
16
# greps geoip for pattern, returns true on match. All arguments are passed to grep.
 
17
function grep_geoip()
 
18
{
 
19
    test ${BANME} = true && return 1
 
20
 
 
21
    set_geoip
 
22
    echo ${GEOIP} | grep "$*" 2>&1 > /dev/null
 
23
}
 
24
 
 
25
# greps whois for pattern, returns true on match. All arguments are passed to grep.
 
26
function grep_whois()
 
27
{
 
28
    test ${BANME} = true && return 1
 
29
 
 
30
    set_whois
 
31
    echo ${WHOIS} | grep "$*" 2>&1 > /dev/null
 
32
}
 
33
 
 
34
# checks for IP ranges, returns true if the IP is in the range.
 
35
# Range syntax: base_ip/significant bits, i.e.
 
36
# 192.168.0.0/16
 
37
# matches all IPs of the form 192.168.x.x.
 
38
function check_range()
 
39
{
 
40
    if ! echo $1 | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\/[0-9]\+$" > /dev/null 2>&1; then
 
41
        echo "Not an IP range: $1" 1>&2
 
42
        return 1
 
43
    fi
 
44
 
 
45
    if ! echo ${IP} | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$" > /dev/null 2>&1; then
 
46
        echo "Internal error: Not a valid IP: ${IP}" 1>&2
 
47
        return 1
 
48
    fi
 
49
 
 
50
    check_range_core $(echo $IP | sed -e 's,\., ,g') $(echo $1 | sed -e 's,\., ,g' -e 's,/, ,')
 
51
}
 
52
 
 
53
# bans the player currently in investigation. Usage:
 
54
# ban <time> "<reason>"
 
55
function ban()
 
56
{
 
57
    test ${BANME} = true && return
 
58
 
 
59
    TIME=$1
 
60
    REASON=$2
 
61
    test -z "${TIME}" && TIME=60
 
62
    test -z "${REASON}" && REASON="Flexban rule match"
 
63
    echo BAN_IP ${IP} ${TIME} ${REASON}
 
64
    echo KICK ${PLAYER}  ${REASON}
 
65
 
 
66
    BANME=true
 
67
}
 
68
 
 
69
# whitelists the player currently in investigation; further ban commands are ignored.
 
70
function whitelist()
 
71
{
 
72
    # just set the flag that cancels all checks
 
73
    BANME=true
 
74
}
 
75
 
 
76
#############################################
 
77
 
78
# End of commands to use in the configuration
 
79
# script, the rest are for internal use only.
 
80
#
 
81
#############################################
 
82
 
 
83
# IP range check core, syntax
 
84
# check_range_core CHECK_IP1 CHECK_IP2 CHECK_IP3 CHECK_IP4 RANGE_IP1 RANGE_IP2 RANGE_IP3 RANGE_IP4 BITS
 
85
function check_range_core()
 
86
{
 
87
    IP_NUM=$(( $4 + 256*($3 + 256* ($2 + 256 * $1 ) ) ))
 
88
    CHECK_NUM=$(( $8 + 256*($7 + 256* ($6 + 256 * $5 ) ) ))
 
89
    RANGE=$(( (1 << $9) - 1 ))
 
90
    CHECK_NUM=$(( ${CHECK_NUM} & (~${RANGE}) ))
 
91
    UPPER_END=$(( ${CHECK_NUM} | ${RANGE} ))
 
92
    # echo ${CHECK_NUM} ${UPPER_END} ${RANGE} ${IP_NUM}
 
93
    test ${IP_NUM} -ge ${CHECK_NUM} && test ${IP_NUM} -lt ${UPPER_END}
 
94
}
 
95
 
 
96
# sets GEOIP to the output of geoiplookup
 
97
function set_geoip()
 
98
{
 
99
    test -z "${GEOIP}" && GEOIP=$(geoiplookup ${IP})
 
100
}
 
101
 
 
102
# sets WHOIS to the output of whois
 
103
function set_whois()
 
104
{
 
105
    test -z "${WHOIS}" && WHOIS=$(whois ${IP})
 
106
}
 
107
 
 
108
# processes the player_entered messages individually
 
109
function process_core()
 
110
{
 
111
    IP=$3
 
112
    #echo ${IP}
 
113
    PLAYER=$2
 
114
 
 
115
    WHOIS=""
 
116
    GEOIP=""
 
117
    BANME=false
 
118
 
 
119
   # load configuration
 
120
   . flexban_cfg.sh
 
121
}
 
122
 
 
123
# processes the player_entered messages
 
124
function process()
 
125
{
 
126
    while LINE=$(line); do
 
127
        process_core ${LINE}
 
128
    done
 
129
}
 
130
 
 
131
# for debugging, set the path like it would be when run from the
 
132
# game itself
 
133
export PATH="${PATH}:$(dirname $(dirname $(dirname $0)))/config/"
 
134
#set -x
 
135
 
 
136
# echo SAY flexban!
 
137
grep ^PLAYER_ENTERED | process
 
138
 
 
139