Subversion Repositories configs

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
34 - 1
#!/bin/bash
2
#
3
# ipset      Start, stop and save IP sets
4
#
5
# chkconfig: 2345 07 93
6
# description:  Starts, stops and saves IP sets
7
#
8
# config: /etc/sysconfig/ipset
9
# config: /etc/sysconfig/iptables-config
10
# config: /etc/sysconfig/ip6tables-config
11
#
12
### BEGIN INIT INFO
13
# Provides: ipset
14
# Default-Start:  2 3 4 5
15
# Default-Stop: 0 1 6
16
# Short-Description: start and stop IP sets
17
# Description: Start, stop and save IP sets
18
### END INIT INFO
19
 
20
# Source function library.
21
. /etc/init.d/functions
22
 
23
IPSET=ipset
24
IPSET_BIN=/usr/sbin/${IPSET}
25
IPSET_DATA=/etc/sysconfig/$IPSET
26
VAR_SUBSYS_IPSET=/var/lock/subsys/$IPSET
27
 
28
IPTABLES_CONFIG=/etc/sysconfig/iptables-config
29
IP6TABLES_CONFIG=${IPTABLES_CONFIG/iptables/ip6tables}
30
 
31
# only usable for root
32
[ $EUID = 0 ] || exit 4
33
 
34
if [[ ! -x ${IPSET_BIN} ]]; then
35
	echo -n "${IPSET_BIN} does not exist."; warning; echo
36
	exit 5
37
fi
38
 
39
# Default ipset configuration:
40
[[ -z $IPSET_SAVE_ON_STOP ]] && IPSET_SAVE_ON_STOP=no		# Overridden by ip(6)tables IP(6)TABLES_SAVE_ON_STOP
41
[[ -z $IPSET_SAVE_ON_RESTART ]] && IPSET_SAVE_ON_RESTART=no	# Overridden by ip(6)tables IP(6)TABLES_SAVE_ON_RESTART
42
 
43
# Load iptables configuration(s)
44
[[ -f "$IPTABLES_CONFIG" ]] && . "$IPTABLES_CONFIG"
45
[[ -f "$IP6TABLES_CONFIG" ]] && . "$IP6TABLES_CONFIG"
46
 
47
# It doesn't make sense to save iptables config and not our config
48
[[ ${IPTABLES_SAVE_ON_STOP} = yes || ${IP6TABLES_SAVE_ON_STOP} = yes ]] && IPSET_SAVE_ON_STOP=yes
49
[[ ${IPTABLES_SAVE_ON_RESTART} = yes || ${IP6TABLES_SAVE_ON_RESTART} = yes ]] && IPSET_SAVE_ON_RESTART=yes
50
 
51
flush_n_delete() {
52
    local ret=0 set
53
 
54
    if [[ -n $(lsmod | grep "^xt_set ") ]]; then
55
        rmmod xt_set 2>/dev/null
56
        [[ $? -ne 0 ]] && {
57
	    echo -n $"${IPSET}: Current ip*tables configuration requires ipset";
58
	    warning; echo
59
	    return 1;
60
	}
61
    fi
62
 
63
    [[ -z "$(${IPSET_BIN} list -n)" ]] && return 1
64
 
65
    echo -n $"${IPSET}: Flushing and destroying IP sets: "
66
 
67
    # Flush sets
68
    ${IPSET_BIN} flush
69
    let ret+=$?
70
 
71
    # Delete ipset sets. If we don't do them individually, then none
72
    # will be deleted unless they all can be.
73
    for set in $(${IPSET_BIN} list -name); do
74
	    ${IPSET_BIN} destroy 2>/dev/null
75
	    [[ $? -ne 0 ]] && ret=1
76
    done
77
 
78
    [[ $ret -eq 0 ]] && success || failure
79
    echo
80
 
81
    return $ret
82
}
83
 
84
start() {
85
    # Do not start if there is no config file.
86
    [[ ! -f "$IPSET_DATA" ]] && {
87
	echo $"${IPSET}: Loaded with no configuration"
88
	return 6;
89
    }
90
 
91
    [[ -n "$(${IPSET_BIN} list -n)" ]] && flush_n_delete
92
 
93
    # This is the easy way to start but would leave any old
94
    # entries still configured. Still, better than nothing -
95
    # but fine if we had no config
96
    echo -n $"${IPSET}: Loading IP sets: "
97
    ${IPSET_BIN} restore -! <${IPSET_DATA}
98
    res=$?
99
    [[ $res -eq 0 ]] && success || failure
100
    echo
101
 
102
    if [[ $res -ne 0 ]]; then
103
	return 1
104
    fi
105
 
106
    touch $VAR_SUBSYS_IPSET
107
    return 0
108
}
109
 
110
stop() {
111
    # Nothing to stop if ip_set module is not loaded.
112
    lsmod | grep -q "^ip_set "
113
    [[ $? -ne 0 ]] && return 6
114
 
115
    flush_n_delete
116
 
117
    rm -f $VAR_SUBSYS_IPSET
118
    return 0
119
}
120
 
121
save() {
122
    # Do not save if ip_set module is not loaded.
123
    lsmod | grep -q "^ip_set "
124
    [[ $? -ne 0 ]] && return 6
125
 
126
    [[ -z $(${IPSET_BIN} list -name) ]] && {
127
	echo -n $"${IPSET}: No IP sets: "; warning; echo
128
	return 0
129
    }
130
 
131
    echo -n $"${IPSET}: Saving IP sets to $IPSET_DATA: "
132
 
133
    ret=0
134
    TMP_FILE=$(/bin/mktemp -q /tmp/$IPSET.XXXXXX) \
135
	&& chmod 600 "$TMP_FILE" \
136
	&& ${IPSET_BIN} save > $TMP_FILE 2>/dev/null \
137
	&& [[ -s $TMP_FILE ]] \
138
	|| ret=1
139
 
140
    if [[ $ret -eq 0 ]]; then
141
	# No need to do anything if the files are the same
142
	if [[ ! -f $IPSET_DATA ]]; then
143
	    mv $TMP_FILE $IPSET_DATA && chmod 600 $IPSET_DATA || ret=1
144
	else
145
	    diff -q $TMP_FILE $IPSET_DATA >/dev/null
146
 
147
	    if [[ $? -ne 0 ]]; then
148
		if [[ -f $IPSET_DATA ]]; then
149
		    cp -f --preserve=timestamps $IPSET_DATA $IPSET_DATA.save \
150
			&& chmod 600 $IPSET_DATA.save \
151
			|| ret=1
152
		fi
153
		if [[ $ret -eq 0 ]]; then
154
		    cp -f --preserve=timestamps $TMP_FILE $IPSET_DATA \
155
			&& chmod 600 $IPSET_DATA \
156
			|| ret=1
157
		fi
158
	    fi
159
	fi
160
    fi
161
 
162
    rm -f $TMP_FILE
163
 
164
    [ $ret -eq 0 ] && success || failure
165
    echo
166
    return $ret
167
}
168
 
169
status() {
170
    if [ ! -f "$VAR_SUBSYS_IPSET" -a -z "$(${IPSET_BIN} list -name)" ]; then
171
	echo $"${IPSET}: not running"
172
	return 3
173
    fi
174
 
175
    local ret=0 set
176
 
177
    # No IP sets, ip_set module is not loaded.
178
    lsmod | grep -q "^ip_set "
179
    [[ $? -ne 0 ]] && return 3
180
 
181
    for set in $(${IPSET_BIN} list -name | sort -u); do
182
	LANG=C ipset list $set | awk '{
183
  m = 0
184
  n = 0
185
  do {
186
    if ($i == "Members:") { m = 1 }
187
    if (m == 0) {
188
      if ($i ~ /^Name:/)
189
        print $i
190
      else
191
        print "  "$i
192
    } else
193
      n++
194
  } while (getline > 0)
195
  print "  Members: "n-1
196
}'
197
	let ret+=$?
198
    done
199
 
200
    return $ret
201
}
202
 
203
restart() {
204
    [ "x$IPSET_SAVE_ON_RESTART" = "xyes" ] && save
205
    stop
206
    start
207
}
208
 
209
case "$1" in
210
    start)
211
	[[ -f "$VAR_SUBSYS_IPSET" ]] && exit 0
212
	start
213
	RETVAL=$?
214
	;;
215
    stop)
216
	[[ $IPSET_SAVE_ON_STOP = yes ]] && save
217
	stop
218
	RETVAL=$?
219
	[[ $RETVAL -eq 6 ]] && {
220
	    echo -n $"${IPSET}: not running"; failure; echo
221
	    exit 0
222
	}
223
	;;
224
    status)
225
	status
226
	RETVAL=$?
227
	[[ $RETVAL -eq 6 ]] && {
228
	    echo -n $"${IPSET}: not running"; failure; echo
229
	}
230
	;;
231
    reload)
232
	[[ $IPSET_SAVE_ON_RESTART = yes ]] && save
233
	stop
234
	RETVAL=$?
235
	[[ $RETVAL -eq 6 ]] && {
236
	    echo -n $"${IPSET}: not running"; failure; echo
237
	    exit 0
238
}
239
	start
240
	RETVAL=$?
241
	;;
242
    restart|force-reload)
243
	[[ $IPSET_SAVE_ON_RESTART = yes ]] && save
244
	stop
245
	start
246
	RETVAL=$?
247
	;;
248
    condrestart|try-restart)
249
	[[ ! -e "$VAR_SUBSYS_IPSET" ]] && exit 0
250
	restart
251
	RETVAL=$?
252
	;;
253
    save)
254
	save
255
	RETVAL=$?
256
	;;
257
    *)
258
	echo $"Usage: $IPSET {start|stop|restart|condrestart|reload|save}" >&2
259
	exit 2
260
esac
261
 
262
exit $RETVAL