[1108] | 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 | } |
---|
[2573] | 75 | . /etc/sysconfig/network-scripts/${PARENTCONFIG##*/} |
---|
| 76 | [ -r "/etc/sysconfig/network-scripts/keys-$PARENTDEVNAME" ] && . /etc/sysconfig/network-scripts/keys-$PARENTDEVNAME |
---|
[1108] | 77 | fi |
---|
[2573] | 78 | . /etc/sysconfig/network-scripts/${CONFIG##*/} |
---|
| 79 | [ -r "/etc/sysconfig/network-scripts/keys-$DEVNAME" ] && . /etc/sysconfig/network-scripts/keys-$DEVNAME |
---|
[1108] | 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 |
---|
[2573] | 198 | dev=$(. /etc/sysconfig/network-scripts/${nconfig##*/} ; echo $DEVICE) |
---|
[1108] | 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 | } |
---|