* Martin Michlmayr <t...@cyrius.com> [2009-02-23 20:08]: > Michael Hahn reported that the installer didn't boot because netcfg > showed a "Unreachable gateway" error message. oldsys-preseed should > implement a similar check and use DHCP if the network configuration is > invalid.
I've implemented this now based on some code Stephen Gran kindly wrote. Stephen, are you happy to release your code under GPL 2 or later? The only thing that is not done that netcfg does is to make up a netmask based on the IP address if no netmask is given. Index: functions =================================================================== --- functions (revision 57551) +++ functions (working copy) @@ -1,4 +1,5 @@ -# Copyright (C) 2005, 2006, 2008 Martin Michlmayr <t...@cyrius.com> +# Copyright (C) 2005, 2006, 2008, 2009 Martin Michlmayr <t...@cyrius.com> +# Copyright (C) 2009 Stephen Gran <sg...@debian.org> # This code is covered by the GNU General Public License (version 2 # or higher) @@ -246,11 +247,42 @@ return 0 } -# Sanity check for static IP configuration: netcfg will prompt for an IP -# address and nameserver if they are not set, so use DHCP in that case. +# Convert an IP address (like 127.0.0.1) to bits. +make_bit_address () { + addr=$1 + + first=$(( $(echo $addr | cut -d. -f1) << 24)) + second=$(( $(echo $addr | cut -d. -f2) << 16)) + third=$(( $(echo $addr | cut -d. -f3) << 8)) + fourth=$(echo $addr | cut -d. -f4) + echo $(( $first + $second + $third + $fourth )) +} + +# Check if two IP addresses are on the same network. +address_is_in () { + addr=$1 + addr2=$2 + netmask=$3 + + bitaddr=$(make_bit_address $addr) + bitaddr2=$(make_bit_address $addr2) + bitmask=$(make_bit_address $netmask) + + [ "$(( $bitaddr & $bitmask ))" = "$(( $bitaddr2 & $bitmask))" ] +} + +# Sanity checks for static IP configuration sanity_check_static_config() { + # netcfg will prompt for an IP address and nameserver if they are + # not set, so use DHCP in that case. if [ "$NONINTERACTIVE" = "yes" ] && [ -z "$IPADDRESS" -o -z "$NAMESERVERS" ]; then NET_CONFIG=dhcp fi + # Replicate the "gateway is unreachable" check from netcfg. + if [ -n "$IPADDRESS" -a -n "$GATEWAY" -a -n "$NETMASK " ]; then + if ! address_is_in "$IPADDRESS" "$GATEWAY" "$NETMASK"; then + NET_CONFIG=dhcp + fi + fi } Index: tests/misc/gateway.test =================================================================== --- tests/misc/gateway.test (revision 0) +++ tests/misc/gateway.test (revision 0) @@ -0,0 +1,15 @@ +#!/bin/sh + +tmp="$1" + +check_gateway() { + if ! address_is_in "$1" "$2" "$3" ; then + echo "Invalid gateway $2" >> $tmp + else + echo "Valid gateway $2" >> $tmp + fi +} + +check_gateway 192.168.178.10 192.168.178.1 255.255.255.0 +check_gateway 192.168.178.10 192.168.1.1 255.255.255.0 + Property changes on: tests/misc/gateway.test ___________________________________________________________________ Added: svn:executable + * Index: tests/misc/gateway.preseed =================================================================== --- tests/misc/gateway.preseed (revision 0) +++ tests/misc/gateway.preseed (revision 0) @@ -0,0 +1,2 @@ +Valid gateway 192.168.178.1 +Invalid gateway 192.168.1.1 -- Martin Michlmayr http://www.cyrius.com/ -- To UNSUBSCRIBE, email to debian-boot-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org