f10e614579
Refactors dhcp-all-interfaces.sh so that if an optional INTERFACE argument (the first argument) is passed to the script it only inspects that single interface. If no argument is passed then the previous default behaviour is used which causes all interfaces to be inspected. To avoid a collision with the previous $1 we move to using $FLOCKED for the exec flock command which runs on distributions using ENI. Also sets PATH so that the commands within the script can all be found if it isn't set properly (/sbin/ip, /bin/cat, etc.) This is a move towards using udev rules to add these types of interfaces automatically. Change-Id: I3ec8fd2cc2071bfc6943c744ca619e31b71146fc
108 lines
2.6 KiB
Bash
Executable File
108 lines
2.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
INTERFACE=${1:-} #optional, if not specified configure all available interfaces
|
|
ENI_FILE="/etc/network/interfaces"
|
|
|
|
PATH=/sbin:$PATH
|
|
|
|
if [ -d "/etc/network" ]; then
|
|
CONF_TYPE="eni"
|
|
elif [ -d "/etc/sysconfig/network-scripts/" ]; then
|
|
CONF_TYPE="netscripts"
|
|
else
|
|
echo "Unsupported network configuration type!"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$CONF_TYPE" == "eni" ]; then
|
|
# Serialize runs so that we don't miss hot-add interfaces
|
|
FLOCKED=${FLOCKED:-}
|
|
if [ -z "$FLOCKED" ] ; then
|
|
FLOCKED=true exec flock -x $ENI_FILE $0
|
|
fi
|
|
fi
|
|
|
|
function get_if_link() {
|
|
cat /sys/class/net/${1}/carrier
|
|
}
|
|
|
|
function enable_interface() {
|
|
local interface=$1
|
|
|
|
if [ "$CONF_TYPE" == "eni" ]; then
|
|
printf "auto $interface\niface $interface inet dhcp\n\n" >>$ENI_FILE
|
|
elif [ "$CONF_TYPE" == "netscripts" ]; then
|
|
printf "DEVICE=\"$interface\"\nBOOTPROTO=\"dhcp\"\nONBOOT=\"yes\"\nTYPE=\"Ethernet\"" >"/etc/sysconfig/network-scripts/ifcfg-$interface"
|
|
fi
|
|
echo "Configured $1"
|
|
|
|
}
|
|
|
|
function disable_interface() {
|
|
local interface=$1
|
|
|
|
if [ "$CONF_TYPE" == "netscripts" ]; then
|
|
local IFCFG_FILE="/etc/sysconfig/network-scripts/ifcfg-$interface"
|
|
if [ -f "$IFCFG_FILE" ]; then
|
|
rm $IFCFG_FILE
|
|
else
|
|
echo "No link detected, skipping"
|
|
fi
|
|
else
|
|
echo "No link detected, skipping"
|
|
fi
|
|
}
|
|
|
|
function config_exists() {
|
|
local interface=$1
|
|
if [ "$CONF_TYPE" == "netscripts" ]; then
|
|
if [ -f "/etc/sysconfig/network-scripts/ifcfg-$interface" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
else
|
|
return ifquery $interface >/dev/null 2>&1
|
|
fi
|
|
}
|
|
|
|
function inspect_interface() {
|
|
local interface=$1
|
|
local mac_addr_type="$(cat /sys/class/net/${interface}/addr_assign_type)"
|
|
|
|
echo -n "Inspecting interface: $interface..."
|
|
if config_exists $interface; then
|
|
echo "Has config, skipping."
|
|
elif [ "$mac_addr_type" != "0" ]; then
|
|
echo "Device has generated MAC, skipping."
|
|
else
|
|
ip link set dev $interface up &>/dev/null
|
|
HAS_LINK="$(get_if_link $interface)"
|
|
|
|
TRIES=10
|
|
while [ "$HAS_LINK" == "0" -a $TRIES -gt 0 ]; do
|
|
HAS_LINK="$(get_if_link $interface)"
|
|
if [ "$HAS_LINK" == "1" ]; then
|
|
break
|
|
else
|
|
sleep 1
|
|
fi
|
|
TRIES=$(( TRIES - 1 ))
|
|
done
|
|
if [ "$HAS_LINK" == "1" ] ; then
|
|
enable_interface "$interface"
|
|
else
|
|
disable_interface "$interface"
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
if [ -n "$INTERFACE" ]; then
|
|
inspect_interface $INTERFACE
|
|
else
|
|
for iface in $(ls /sys/class/net | grep -v ^lo$); do
|
|
inspect_interface $iface
|
|
done
|
|
fi
|