home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
boot
/
i386
/
rescue
/
lib
/
udev
/
rename_netiface
< prev
next >
Wrap
Text File
|
2006-11-29
|
6KB
|
230 lines
#! /bin/bash
#
PATH="/sbin:/bin"
declare -i MAXLOOPS=40 #
declare -i LOOPDELAY=500000 # useconds
declare -i MAXIFNUM=1024 #
RULE_FILE=/etc/udev/rules.d/30-net_persistent_names.rules
USED_IFACE_FILE_STUB=/tmp/used_interface_names
USED_IFACE_FILE="`mktemp $USED_IFACE_FILE_STUB.XXXXXXXX`"
STAMPFILE=/tmp/dummy_stamp
trap 'rm -f $USED_IFACE_FILE
echo renamed > $STAMPFILE
echo INTERFACE=$INTERFACE
echo DEVPATH=${DEVPATH%/*}/$INTERFACE
echo RENAMED=yes' EXIT
. /etc/sysconfig/network/config
. /etc/sysconfig/network/scripts/functions
if [ -r /sys/class/net/$1/ifindex ] ; then
STAMPFILE=$STAMPFILE_STUB`cat /sys/class/net/$1/ifindex`
else
STAMPFILE=${STAMPFILE_STUB}no_iface
fi
echo virgin > $STAMPFILE
if [ "$FORCE_PERSISTENT_NAMES" != yes ] ; then
info_mesg "No persistent names wanted"
exit 0
fi
#exec 2>>/tmp/rename_netiface.$1-$2.$SEQNUM.log
#set -x
error_exit() {
local RET
declare -i RET=$1
if [ $RET -ne "$1" ] ; then
RET=255
else
shift
fi
err_mesg "$@"
exit $RET
}
usage() {
mesg "usage: $0 <oldname> [<newname>]" >&2
error_exit $*
}
check_if_name_is_free() {
grep -qs "^[^#].*rename_netiface %k $NEWNAME\"" $RULE_FILE && return 1
cat $USED_IFACE_FILE_STUB* \
| grep -vs "$DEV_ID" \
| grep -q "^$NEWNAME" && return 1
echo $NEWNAME $DEV_ID >> $USED_IFACE_FILE
usleep $((RANDOM%600+700))000
cat $USED_IFACE_FILE_STUB* \
| grep -vs "$DEV_ID" \
| grep -q "^$NEWNAME" && return 1
return 0
}
# Return 0 only if rule was successfully written (if needed of course)
write_rule() {
test "$WRITE_RULE" == yes || return 0
check_if_name_is_free || return 1
if [ "$PHYSDEVBUS" == ccwgroup ] ; then
echo "SUBSYSTEM==\"net\", ACTION==\"add\"," \
"ENV{PHYSDEVPATH}==\"*$DEV_ID\"," \
"IMPORT=\"/lib/udev/rename_netiface %k $NEWNAME\"" \
>> $RULE_FILE
elif [ "$NOMAC_HACK_APPLIED" == yes ] ; then
echo "SUBSYSTEM==\"net\", ACTION==\"add\"," \
"ENV{ADDRESS}==\"$DEV_ID\"," \
"IMPORT=\"/lib/udev/rename_netiface %k $NEWNAME\"" \
>> $RULE_FILE
else
echo "SUBSYSTEM==\"net\", ACTION==\"add\"," \
"SYSFS{address}==\"$DEV_ID\"," \
"IMPORT=\"/lib/udev/rename_netiface %k $NEWNAME\"" \
>> $RULE_FILE
fi
/sbin/udevcontrol reload_rules || return 1
info_mesg "New rule for $DEV_ID added."
}
test $# -gt 2 && usage 1 "too many arguments: $*"
OLDNAME=$1
NEWNAME=$2
test -z "$OLDNAME" && usage 2 "too little arguments"
ls /sys/class/net/$OLDNAME 2>/dev/null 1>&2 \
|| error_exit 3 "oldname $OLDNAME does not exist"
NAMEBASE=${OLDNAME%%[0-9]*}
case "$NAMEBASE" in
eth|ath|wlan|ra|hsi|ctc|tr)
: go on
;;
*)
exit 0
;;
esac
# Also check if interface is not an vlan interface
test -f "/proc/net/vlan/$OLDNAME" && exit 0
declare -i IFNUM=${OLDNAME##$NAMEBASE}
if [ "$PHYSDEVBUS" == ccwgroup ] ; then
get_device_id() {
if [ -z "$PHYSDEVPATH" -a -L /sys/class/net/$1/device ] ; then
PHYSDEVPATH=`cd -P /sys/class/net/$1/device; pwd`
PHYSDEVPATH=${PHYSDEVPATH#/sys}
fi
if [ -n "$PHYSDEVPATH" -a -d /sys/$PHYSDEVPATH ] ; then
DEV_ID=${PHYSDEVPATH##*/}
else
DEV_ID=$2
fi
}
else
get_device_id() {
if ls /sys/class/net/$1 2>/dev/null 1>&2; then
DEV_ID=`cat /sys/class/net/$1/address`
else
DEV_ID=$2
fi
}
fi
if [ -z "$NEWNAME" ] ; then
# This routine looks for a network interface name that is still not
# used as persistent name. At first it tries the name the interface
# currently has. If this name is already occupied, then increase the
# number and try again.
# To check if a name is occupied we have to look in
# /etc/udev/rules.d/60-net_*.rules and in /tmp/used_interface_names*.
# The latter serves as temporary registration file to avoid race
# conditions. It will be removed when the script exits.
NEWNAME=$OLDNAME
get_device_id "$OLDNAME" "$2"
if [ -z "$DEV_ID" ] ; then
error_exit 4 "no device id for $OLDNAME"
fi
if [ "${DEV_ID//0/}" == ":::::" ] ; then
# Workaround for some drivers which don't request their
# firmware before beeing set up and don't have a mac address
# before firmware was loaded.
ip link set up dev $OLDNAME
ip link set down dev $OLDNAME
# Do we have to wait some time?
for i in 0 1 2 3 4 5 6 7 8 9; do
get_device_id "$OLDNAME"
info_mesg "waiting for a usefull mac address: $DEV_ID"
test "${DEV_ID//0/}" != ":::::" && break
sleep 1
done
fi
if [ "${DEV_ID//0/}" == ":::::" ] ; then
error_exit 5 "all zero mac address for $OLDNAME"
fi
while ! check_if_name_is_free; do
while [ $IFNUM -lt $MAXIFNUM ] ; do
: $((IFNUM++))
NEWNAME=$NAMEBASE$IFNUM
ls /sys/class/net/$NEWNAME 2>/dev/null 1>&2 && continue
continue 2
done
error_exit 6 "could not get a free persistent interfacename" \
"for $OLDNAME ($DEV_ID)"
done
WRITE_RULE=yes
info_mesg "$OLDNAME: new persistent name for $DEV_ID is $NEWNAME"
fi
if [ -z "$NEWNAME" ] ; then
error_exit 7 "cannot get a valid new interface name"
fi
# Simply try to rename directly, because it will work in most cases
if nameif -r "$NEWNAME" "$OLDNAME" 2>/dev/null 1>&2; then
write_rule || error_exit 8 "Name $NEWNAME for $DEV_ID is NOT" \
"persistent"
info_mesg "$OLDNAME -> $NEWNAME: immediate success"
INTERFACE=$NEWNAME
exit 0
fi
# Generate a temporary interface name
TMPNAME="${NAMEBASE}xx${IFNUM}"
ls /sys/class/net/$TMPNAME 2>/dev/null 1>&2 \
&& error_exit 10 "temporary interface name $TMPNAME does exist"
# Rename it to the temporary name.
# Then try several times to rename it to new name
nameif -r "$TMPNAME" "$OLDNAME" 2>/dev/null 1>&2 \
|| error_exit 11 "cannot rename interface to temporary name $TMPNAME"
echo looping > $STAMPFILE
declare -i LOOPS=0
while [ $MAXLOOPS -gt $LOOPS ] ; do
: $((LOOPS++))
if nameif -r "$NEWNAME" "$TMPNAME" 2>/dev/null 1>&2; then
write_rule || error_exit 12 "Name $NEWNAME for $DEV_ID is" \
"NOT persistent"
info_mesg "$OLDNAME -> $NEWNAME: success after $LOOPS loops"
INTERFACE=$NEWNAME
exit 0
fi
usleep $LOOPDELAY
done
if nameif -r "$OLDNAME" "$TMPNAME" 2>/dev/null 1>&2; then
info_mesg "$OLDNAME -> $NEWNAME: NO success after $LOOPS loops." \
"Interface again named $OLDNAME"
else
info_mesg "$OLDNAME -> $NEWNAME: NO success after $LOOPS loops." \
"Interface now named $TMPNAME, because $OLDNAME was no" \
"longer available"
INTERFACE=$TMPNAME
fi
exit 0