1 | # -*-Shell-script-*- |
---|
2 | # |
---|
3 | # This file is not a stand-alone shell script; it provides functions |
---|
4 | # to network scripts that source it. |
---|
5 | |
---|
6 | # Set up a default search path. |
---|
7 | PATH="/sbin:/usr/sbin:/bin:/usr/bin" |
---|
8 | export PATH |
---|
9 | |
---|
10 | [ -z "$__sed_discard_ignored_files" ] && . /etc/init.d/functions |
---|
11 | |
---|
12 | get_hwaddr () |
---|
13 | { |
---|
14 | if [ -f /sys/class/net/${1}/address ]; then |
---|
15 | awk '{ print toupper($0) }' < /sys/class/net/${1}/address |
---|
16 | elif [ -d "/sys/class/net/${1}" ]; then |
---|
17 | LC_ALL= LANG= ip -o link show ${1} 2>/dev/null | \ |
---|
18 | awk '{ print toupper(gensub(/.*link\/[^ ]* ([[:alnum:]:]*).*/, |
---|
19 | "\\1", 1)); }' |
---|
20 | fi |
---|
21 | } |
---|
22 | |
---|
23 | get_config_by_hwaddr () |
---|
24 | { |
---|
25 | LANG=C grep -il "^[[:space:]]*HWADDR=${1}\([[:space:]#]\|$\)" /etc/sysconfig/network-scripts/ifcfg-* \ |
---|
26 | | LC_ALL=C sed -e "$__sed_discard_ignored_files" |
---|
27 | } |
---|
28 | |
---|
29 | get_config_by_subchannel () |
---|
30 | { |
---|
31 | LANG=C grep -il "^[[:space:]]*SUBCHANNELS=${1}\([[:space:]#]\|$\|,\)" /etc/sysconfig/network-scripts/ifcfg-* \ |
---|
32 | | LC_ALL=C sed -e "$__sed_discard_ignored_files" |
---|
33 | } |
---|
34 | |
---|
35 | get_device_by_hwaddr () |
---|
36 | { |
---|
37 | LANG=C ip -o link | grep -v link/ieee802.11 | awk -F ': ' -vIGNORECASE=1 "/$1/ { print \$2 }" |
---|
38 | } |
---|
39 | |
---|
40 | need_config () |
---|
41 | { |
---|
42 | local nconfig |
---|
43 | |
---|
44 | CONFIG="ifcfg-${1}" |
---|
45 | [ -f "${CONFIG}" ] && return |
---|
46 | CONFIG="${1}" |
---|
47 | [ -f "${CONFIG}" ] && return |
---|
48 | local addr=`get_hwaddr ${1}` |
---|
49 | if [ -n "$addr" ]; then |
---|
50 | nconfig=`get_config_by_hwaddr ${addr}` |
---|
51 | if [ -n "$nconfig" ] ; then |
---|
52 | CONFIG=${nconfig##*/} |
---|
53 | [ -f "${CONFIG}" ] && return |
---|
54 | fi |
---|
55 | fi |
---|
56 | nconfig=$(LANG=C grep -l "^[[:space:]]*DEVICE=${1}\([[:space:]#]\|$\)" \ |
---|
57 | /etc/sysconfig/network-scripts/ifcfg-* \ |
---|
58 | | LC_ALL=C sed -e "$__sed_discard_ignored_files") |
---|
59 | if [ -n "$nconfig" -a -f "$nconfig" ]; then |
---|
60 | CONFIG=${nconfig##*/} |
---|
61 | return |
---|
62 | fi |
---|
63 | } |
---|
64 | |
---|
65 | source_config () |
---|
66 | { |
---|
67 | DEVNAME=`basename $CONFIG | sed 's/^ifcfg-//g'` |
---|
68 | if echo ${CONFIG##*/} | grep -q '[^g]-' ; then |
---|
69 | PARENTCONFIG=`echo $CONFIG | sed 's/-[^-]*$//g'` |
---|
70 | PARENTDEVNAME=${PARENTCONFIG##*/ifcfg-} |
---|
71 | [ -f $PARENTCONFIG ] || { |
---|
72 | echo $"Missing config file $PARENTCONFIG." >&2 |
---|
73 | exit 1 |
---|
74 | } |
---|
75 | . /etc/sysconfig/network-scripts/${PARENTCONFIG##*/} |
---|
76 | [ -r "/etc/sysconfig/network-scripts/keys-$PARENTDEVNAME" ] && . /etc/sysconfig/network-scripts/keys-$PARENTDEVNAME |
---|
77 | fi |
---|
78 | . /etc/sysconfig/network-scripts/${CONFIG##*/} |
---|
79 | [ -r "/etc/sysconfig/network-scripts/keys-$DEVNAME" ] && . /etc/sysconfig/network-scripts/keys-$DEVNAME |
---|
80 | case "$TYPE" in |
---|
81 | Ethernet) |
---|
82 | DEVICETYPE="eth" |
---|
83 | ;; |
---|
84 | CIPE) |
---|
85 | DEVICETYPE="cipcb" |
---|
86 | ;; |
---|
87 | IPSEC) |
---|
88 | DEVICETYPE="ipsec" |
---|
89 | ;; |
---|
90 | Modem) |
---|
91 | DEVICETYPE="ppp" |
---|
92 | ;; |
---|
93 | xDSL) |
---|
94 | DEVICETYPE="ppp" |
---|
95 | ;; |
---|
96 | ISDN) |
---|
97 | DEVICETYPE="ippp" |
---|
98 | ;; |
---|
99 | Wireless) |
---|
100 | DEVICETYPE="eth" |
---|
101 | ;; |
---|
102 | "Token Ring") |
---|
103 | DEVICETYPE="eth" |
---|
104 | ;; |
---|
105 | CTC) |
---|
106 | DEVICETYPE="ctc" |
---|
107 | ;; |
---|
108 | IUCV) |
---|
109 | DEVICETYPE="iucv" |
---|
110 | ;; |
---|
111 | GRE | IPIP) |
---|
112 | DEVICETYPE="tunnel" |
---|
113 | ;; |
---|
114 | SIT | sit) |
---|
115 | DEVICETYPE="sit" |
---|
116 | ;; |
---|
117 | esac |
---|
118 | [ -z "$DEVICETYPE" ] && DEVICETYPE=`echo ${DEVICE} | sed "s/[0-9]*$//"` |
---|
119 | [ -z "$REALDEVICE" -a -n "$PARENTDEVICE" ] && REALDEVICE=$PARENTDEVICE |
---|
120 | [ -z "$REALDEVICE" ] && REALDEVICE=${DEVICE%%:*} |
---|
121 | if [ "${DEVICE}" != "${REALDEVICE}" ]; then |
---|
122 | ISALIAS=yes |
---|
123 | else |
---|
124 | ISALIAS=no |
---|
125 | fi |
---|
126 | if [ -n "$HWADDR" ]; then |
---|
127 | HWADDR=`echo $HWADDR | awk '{ print toupper($0) }'` |
---|
128 | fi |
---|
129 | if [ -n "$MACADDR" ]; then |
---|
130 | MACADDR=`echo $MACADDR | awk '{ print toupper($0) }'` |
---|
131 | fi |
---|
132 | } |
---|
133 | |
---|
134 | |
---|
135 | |
---|
136 | expand_config () |
---|
137 | { |
---|
138 | if [ -z "${NETMASK}" ]; then |
---|
139 | eval `/bin/ipcalc --netmask ${IPADDR}` |
---|
140 | fi |
---|
141 | |
---|
142 | if [ -z "${PREFIX}" ]; then |
---|
143 | eval `/bin/ipcalc --prefix ${IPADDR} ${NETMASK}` |
---|
144 | fi |
---|
145 | |
---|
146 | if [ -z "${BROADCAST}" ]; then |
---|
147 | eval `/bin/ipcalc --broadcast ${IPADDR} ${NETMASK}` |
---|
148 | fi |
---|
149 | |
---|
150 | if [ -z "${NETWORK}" ]; then |
---|
151 | eval `/bin/ipcalc --network ${IPADDR} ${NETMASK}` |
---|
152 | fi |
---|
153 | } |
---|
154 | |
---|
155 | toggle_value () |
---|
156 | { |
---|
157 | if [ "$2" = "yes" -o "$2" = "YES" ] ; then |
---|
158 | echo "$1 on" |
---|
159 | elif [ "$2" = "no" -o "$2" = "NO" ] ; then |
---|
160 | echo "$1 off" |
---|
161 | else |
---|
162 | echo '' |
---|
163 | fi |
---|
164 | } |
---|
165 | |
---|
166 | do_netreport () |
---|
167 | { |
---|
168 | # Notify programs that have requested notification |
---|
169 | ( cd /var/run/netreport || exit |
---|
170 | for i in * ; do |
---|
171 | if [ -f $i ]; then |
---|
172 | OWNER=`ls -l $i | awk '{ print $3 }'` |
---|
173 | |
---|
174 | if [ "`id -u`" = "0" ]; then |
---|
175 | su -s /bin/bash $OWNER -c "kill -SIGIO $i >/dev/null 2>&1 || rm -f $i >/dev/null 2>&1" > /dev/null 2>&1 |
---|
176 | else |
---|
177 | kill -SIGIO $i >/dev/null 2>&1 || rm -f $i >/dev/null 2>&1 |
---|
178 | fi |
---|
179 | fi |
---|
180 | done |
---|
181 | ) |
---|
182 | } |
---|
183 | |
---|
184 | # rename_device() - Rename a network device to something else |
---|
185 | # $1 - desired name |
---|
186 | # $2 - hardware address to name |
---|
187 | # $3 - list of devices that are already in use |
---|
188 | # (for general calls, use the current device you're trying to |
---|
189 | # change to $1) |
---|
190 | |
---|
191 | rename_device() |
---|
192 | { |
---|
193 | /sbin/nameif "$1" "$2" || { |
---|
194 | local hw2=`get_hwaddr ${1}` |
---|
195 | local nconfig=`get_config_by_hwaddr ${hw2}` |
---|
196 | local dev= |
---|
197 | if [ -n "$nconfig" ]; then |
---|
198 | dev=$(. /etc/sysconfig/network-scripts/${nconfig##*/} ; echo $DEVICE) |
---|
199 | for device in $3 ; do |
---|
200 | [ "$dev" = "$device" ] && unset dev |
---|
201 | done |
---|
202 | fi |
---|
203 | [ -z "$dev" ] && dev=dev$RANDOM |
---|
204 | rename_device $dev $hw2 "$3 $1" |
---|
205 | /sbin/nameif "$1" "$2" |
---|
206 | } |
---|
207 | } |
---|
208 | |
---|
209 | # Sets $alias to the device module if $? != 0 |
---|
210 | is_available () |
---|
211 | { |
---|
212 | LC_ALL= LANG= ip -o link | grep -q $1 |
---|
213 | [ "$?" = "1" ] || return 0 |
---|
214 | |
---|
215 | alias=$(modprobe -c | awk \ |
---|
216 | 'BEGIN { alias = ""; } |
---|
217 | $1 == "alias" && $2 == "'"$1"'" { alias = $3; } |
---|
218 | $1 == "install" { install[$2] = $3; } |
---|
219 | END { |
---|
220 | cmd = install[alias]; |
---|
221 | print alias; |
---|
222 | if (alias == "" || alias == "off" || cmd == "/bin/true" || cmd == ":") |
---|
223 | exit 1; |
---|
224 | exit 0; |
---|
225 | }') |
---|
226 | [ $? -eq 0 ] || return 2 |
---|
227 | |
---|
228 | modprobe $1 > /dev/null 2>&1 || { |
---|
229 | return 1 |
---|
230 | } |
---|
231 | if [ -n "$HWADDR" ]; then |
---|
232 | local curdev=`get_device_by_hwaddr "$HWADDR"` |
---|
233 | if [ -z "$curdev" ]; then |
---|
234 | return 1 |
---|
235 | fi |
---|
236 | #rename_device "$1" "$HWADDR" "$curdev" |
---|
237 | fi |
---|
238 | |
---|
239 | if [ ${alias} == "bonding" ]; then |
---|
240 | install_bonding_driver $1 |
---|
241 | fi |
---|
242 | |
---|
243 | LC_ALL= LANG= ip -o link | grep -q $1 |
---|
244 | return $? |
---|
245 | } |
---|
246 | |
---|
247 | need_hostname () |
---|
248 | { |
---|
249 | CHECK_HOSTNAME=`hostname` |
---|
250 | if [ "$CHECK_HOSTNAME" = "(none)" -o "$CHECK_HOSTNAME" = "localhost" -o \ |
---|
251 | "$CHECK_HOSTNAME" = "localhost.localdomain" ]; then |
---|
252 | return 0 |
---|
253 | else |
---|
254 | return 1 |
---|
255 | fi |
---|
256 | } |
---|
257 | |
---|
258 | set_hostname () |
---|
259 | { |
---|
260 | hostname $1 |
---|
261 | if ! grep search /etc/resolv.conf >/dev/null 2>&1; then |
---|
262 | domain=`echo $1 | sed 's/^[^\.]*\.//'` |
---|
263 | if [ -n "$domain" ]; then |
---|
264 | rsctmp=`mktemp /tmp/XXXXXX`; |
---|
265 | cat /etc/resolv.conf > $rsctmp |
---|
266 | echo "search $domain" >> $rsctmp |
---|
267 | change_resolv_conf $rsctmp |
---|
268 | /bin/rm -f $rsctmp |
---|
269 | fi |
---|
270 | fi |
---|
271 | } |
---|
272 | |
---|
273 | check_device_down () |
---|
274 | { |
---|
275 | if echo $1 | grep -q ':' ; then |
---|
276 | if LC_ALL=C ifconfig -a 2>/dev/null | grep -q $1 ; then |
---|
277 | return 1 |
---|
278 | else |
---|
279 | return 0 |
---|
280 | fi |
---|
281 | else |
---|
282 | if LC_ALL=C ip -o link 2>/dev/null | grep -q "$1[:@].*,UP" ; then |
---|
283 | return 1 |
---|
284 | else |
---|
285 | return 0 |
---|
286 | fi |
---|
287 | fi |
---|
288 | } |
---|
289 | |
---|
290 | check_mii_tool () |
---|
291 | { |
---|
292 | [ -x /sbin/mii-tool ] || return 2 |
---|
293 | output=`LC_ALL=C mii-tool $1 2>&1` |
---|
294 | echo $output | LC_ALL=C grep -q "link ok" && return 1 |
---|
295 | echo $output | LC_ALL=C grep -q "no link" && return 0 || return 2 |
---|
296 | } |
---|
297 | |
---|
298 | check_ethtool () |
---|
299 | { |
---|
300 | [ -x /sbin/ethtool ] || return 2 |
---|
301 | output=`LC_ALL=C ethtool $1 2>&1` |
---|
302 | echo $output | LC_ALL=C grep -q "Link detected: yes" && return 1 |
---|
303 | echo $output | LC_ALL=C grep -q "Link detected: no" && return 0 || return 2 |
---|
304 | } |
---|
305 | |
---|
306 | |
---|
307 | check_link_down () |
---|
308 | { |
---|
309 | if [ -x /sbin/mii-tool -o -x /sbin/ethtool ]; then |
---|
310 | if ! LC_ALL=C ip link show dev $1 2>/dev/null| grep -q UP ; then |
---|
311 | ip link set dev $1 up >/dev/null 2>&1 |
---|
312 | fi |
---|
313 | timeout=0 |
---|
314 | delay=10 |
---|
315 | [ -n "$LINKDELAY" ] && delay=$(($LINKDELAY * 2)) |
---|
316 | while [ $timeout -le $delay ]; do |
---|
317 | check_mii_tool $1 |
---|
318 | m=$? |
---|
319 | check_ethtool $1 |
---|
320 | e=$? |
---|
321 | if [ $m -eq 1 ] || [ $e -eq 1 ] ; then |
---|
322 | return 1 |
---|
323 | fi |
---|
324 | if [ $m -eq 2 ] && [ $e -eq 2 ] ; then |
---|
325 | return 1 |
---|
326 | fi |
---|
327 | usleep 500000 |
---|
328 | timeout=$((timeout+1)) |
---|
329 | done |
---|
330 | return 0 |
---|
331 | fi |
---|
332 | return 1 |
---|
333 | } |
---|
334 | |
---|
335 | check_default_route () |
---|
336 | { |
---|
337 | LC_ALL=C ip route list match 0/0 | grep -q default |
---|
338 | } |
---|
339 | |
---|
340 | find_gateway_dev () |
---|
341 | { |
---|
342 | . /etc/sysconfig/network |
---|
343 | if [ -n "${GATEWAY}" -a "${GATEWAY}" != "none" ] ; then |
---|
344 | dev=$(LC_ALL=C /sbin/ip route get to "${GATEWAY}" 2>/dev/null | \ |
---|
345 | sed -n 's/.* dev \([[:alnum:]]*\) .*/\1/p') |
---|
346 | if [ -n "$dev" ]; then |
---|
347 | GATEWAYDEV="$dev" |
---|
348 | fi |
---|
349 | fi |
---|
350 | } |
---|
351 | |
---|
352 | # After the device $1 goes away, restore the standard default route; typically |
---|
353 | # used for ppp with DEFROUTE temporarily replacing the "standard" default |
---|
354 | # route. |
---|
355 | # FIXME: This function doesn't support some newer features (GATEWAY in ifcfg, |
---|
356 | # $WINDOW, $METRIC) |
---|
357 | add_default_route () |
---|
358 | { |
---|
359 | . /etc/sysconfig/network |
---|
360 | check_default_route && return 0 |
---|
361 | find_gateway_dev |
---|
362 | if [ "$GATEWAYDEV" != "" -a -n "${GATEWAY}" -a \ |
---|
363 | "${GATEWAY}" != "none" ]; then |
---|
364 | if ! check_device_down $1; then |
---|
365 | if [ "$GATEWAY" = "0.0.0.0" ]; then |
---|
366 | /sbin/ip route add default dev ${GATEWAYDEV} |
---|
367 | else |
---|
368 | /sbin/ip route add default via ${GATEWAY} |
---|
369 | fi |
---|
370 | fi |
---|
371 | elif [ -f /etc/default-routes ]; then |
---|
372 | while read spec; do |
---|
373 | /sbin/ip route add $spec |
---|
374 | done < /etc/default-routes |
---|
375 | rm -f /etc/default-routes |
---|
376 | fi |
---|
377 | } |
---|
378 | |
---|
379 | is_wireless_device () |
---|
380 | { |
---|
381 | [ -x /sbin/iwconfig ] || return 1 |
---|
382 | LC_ALL=C iwconfig $1 2>&1 | grep -q "no wireless extensions" || return 0 |
---|
383 | return 1 |
---|
384 | } |
---|
385 | |
---|
386 | install_bonding_driver () |
---|
387 | { |
---|
388 | ethtool -i $1 2>/dev/null | grep -q "driver: bonding" && return 0 |
---|
389 | [ ! -f /sys/class/net/bonding_masters ] && ( modprobe bonding || return 1 ) |
---|
390 | echo "+$1" > /sys/class/net/bonding_masters |
---|
391 | return 0 |
---|
392 | } |
---|
393 | |
---|
394 | is_bonding_device () |
---|
395 | { |
---|
396 | [ -f "/sys/class/net/$1/bonding/slaves" ] |
---|
397 | } |
---|
398 | |
---|
399 | # Invoke this when /etc/resolv.conf has changed: |
---|
400 | change_resolv_conf () |
---|
401 | { |
---|
402 | s=`/bin/grep '^[\ \ ]*option' /etc/resolv.conf 2>/dev/null`; |
---|
403 | if [ "x$s" != "x" ]; then |
---|
404 | s="$s"$'\n'; |
---|
405 | fi; |
---|
406 | if [ $# -gt 1 ]; then |
---|
407 | let n_args=$#; |
---|
408 | while [ $n_args -gt 0 ]; |
---|
409 | do |
---|
410 | if [[ "$s" = *$1* ]]; then |
---|
411 | shift; |
---|
412 | let n_args=n_args-1; |
---|
413 | continue; |
---|
414 | fi; |
---|
415 | s="$s$1"; |
---|
416 | shift; |
---|
417 | if [ $# -gt 0 ]; then |
---|
418 | s="$s"$'\n'; |
---|
419 | fi; |
---|
420 | let n_args=n_args-1; |
---|
421 | done; |
---|
422 | elif [ $# -eq 1 ]; then |
---|
423 | if [ "x$s" != "x" ]; then |
---|
424 | s="$s"`/bin/grep -vF "$s" $1`; |
---|
425 | else |
---|
426 | s=`cat $1`; |
---|
427 | fi; |
---|
428 | fi; |
---|
429 | (echo "$s" > /etc/resolv.conf;) >/dev/null 2>&1; |
---|
430 | r=$? |
---|
431 | if [ $r -eq 0 ]; then |
---|
432 | [ -x /sbin/restorecon ] && /sbin/restorecon /etc/resolv.conf >/dev/null 2>&1 # reset the correct context |
---|
433 | logger -p local7.notice -t "NET" -i "$0 : updated /etc/resolv.conf"; |
---|
434 | [ -e /var/lock/subsys/nscd ] && /usr/sbin/nscd -i hosts; # invalidate cache |
---|
435 | fi; |
---|
436 | return $r; |
---|
437 | } |
---|