flatcar-scripts/mod_for_test_scripts/100setupTestingInterface
Nathan Williams 9494671269 Fix up the modification of the flimflam upstart script
to handle changed command line arguments, and attempt
to make it resilient in the face of future changes.

TEST=Run script on fresh image; confirm that '-I eth_test' is present on the exec line of /etc/init/flimflam.conf

Review URL: http://codereview.chromium.org/2842023
2010-06-24 10:15:34 -04:00

133 lines
4.3 KiB
Bash
Executable File

#!/bin/bash
# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
echo "Configuring for backchannel network device"
testif=eth_test
# Prevent flimflam from taking control of the backchannel network device.
ORIG_CONF=${ROOT_FS_DIR}/etc/init/flimflam.conf
TEMP_CONF=${ORIG_CONF}.tmp
sed "s,/usr/sbin/flimflamd,/usr/sbin/flimflamd -I ${testif}," ${ORIG_CONF} > ${TEMP_CONF}
mv -f ${TEMP_CONF} ${ORIG_CONF}
# Arrange to run dhclient on the backchannel device but without
# installing the default route, and stashing said route away for later
# installation as a host route.
cat > ${ROOT_FS_DIR}/etc/udev/rules.d/50-backchannel-network.rules <<EOF
KERNEL=="eth*", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/sbin/backchannel-setup %k"
KERNEL=="${testif}", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="kill \$(cat /var/run/dhclient-%k.pid)"
EOF
cat > ${ROOT_FS_DIR}/sbin/backchannel-setup <<EOF
#!/bin/sh
testif=${testif}
if [ ! -f /mnt/stateful_partition/etc/enable_backchannel_network ]; then
# This mechanism has to be explicitly enabled on the device.
exit
fi
if [ -f /var/run/dhclient-\${testif}.pid ]; then
# Something else is already going on - perhaps a second
# USB Ethernet device has been inserted. Let's not mess with it.
exit
fi
if [ "\$1" != "\${testif}" ]; then
initctl stop flimflam
# \$1 is the current name of the backchannel device. Swap it with testif.
if ifconfig \${testif} > /dev/null 2>&1; then
orig_mac=\$(ifconfig \${testif} | awk '/HWaddr/ {print \$5}')
ifconfig \${testif} down # must be down for nameif to work
nameif eth_tmp \${orig_mac}
fi
bdev_mac=\$(ifconfig \$1 | awk '/HWaddr/ {print \$5}')
ifconfig \$1 down # must be down for nameif to work
nameif \${testif} \${bdev_mac}
if [ -n "\${orig_mac}" ]; then
nameif \$1 \${orig_mac}
fi
initctl start flimflam
fi
# Bring up the backchannel interface
dhclient -q -pf /var/run/dhclient-\${testif}.pid \\
-lf /var/run/dhclient-\${testif}.leases \\
-cf /etc/dhclient-backchannel.conf \\
-sf /sbin/dhclient-backchannel-script \\
\${testif}
EOF
chmod +x ${ROOT_FS_DIR}/sbin/backchannel-setup
cat > ${ROOT_FS_DIR}/etc/dhclient-backchannel.conf <<EOF
request subnet-mask, broadcast-address, routers;
EOF
cat > ${ROOT_FS_DIR}/sbin/dhclient-backchannel-script <<EOF
#!/bin/sh
if [ -n "\$new_broadcast_address" ]; then
new_broadcast_arg="broadcast \$new_broadcast_address"
fi
if [ -n "\$new_subnet_mask" ]; then
new_subnet_arg="netmask \$new_subnet_mask"
fi
case "\$reason" in
MEDIUM|ARPCHECK|ARPSEND)
# Do nothing
;;
PREINIT)
# The DHCP client is requesting that an interface be
# configured as required in order to send packets prior to
# receiving an actual address. - dhclient-script(8)
ifconfig \$interface inet 0 up
# We need to give the kernel some time to get the interface up.
sleep 1
;;
BOUND|RENEW|REBIND|REBOOT|TIMEOUT)
if [ -n "\$old_ip_address" -a \
"\$old_ip_address" != "\$new_ip_address" ]; then
# IP address changed. Bringing down the interface will delete all routes,
# and clear the ARP cache.
ifconfig \$interface inet 0
fi
if [ -z "\$old_ip_address" -o "\$old_ip_address" != "\$new_ip_address" -o \
"\$reason" = "BOUND" -o "\$reason" = "REBOOT" ]; then
ifconfig \$interface inet \$new_ip_address \$new_subnet_arg \
\$new_broadcast_arg \$mtu_arg
# Since this script is for the backchannel testing interface,
# we don't set the default route from here, but we do stash
# it for possible later use in setting up a host route.
cp /dev/null /var/run/dhclient-\${interface}.routers
for router in \$new_routers; do
echo \$router >> /var/run/dhclient-\${interface}.routers
done
fi
;;
EXPIRE|FAIL|RELEASE|STOP)
if [ -n "\$old_ip_address" ]; then
# Shut down interface, which will delete routes and clear arp cache.
ifconfig \$interface inet 0
fi
;;
esac
EOF
chmod +x ${ROOT_FS_DIR}/sbin/dhclient-backchannel-script