summaryrefslogtreecommitdiff
path: root/components/9990-networking.sh
blob: cdec92a98a963194f261e17075530e8f8a733a43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#!/bin/sh

#set -e

Device_from_bootif ()
{
	# support for Syslinux IPAPPEND parameter
	# it sets the BOOTIF variable on the kernel parameter

	if [ -n "${BOOTIF}" ]
	then
	# pxelinux sets BOOTIF to a value based on the mac address of the
	# network card used to PXE boot, so use this value for DEVICE rather
	# than a hard-coded device name from initramfs.conf. this facilitates
	# network booting when machines may have multiple network cards.
	# pxelinux sets BOOTIF to 01-$mac_address

	# strip off the leading "01-", which isn't part of the mac
	# address
	temp_mac=${BOOTIF#*-}

	# convert to typical mac address format by replacing "-" with ":"
	bootif_mac=""
	IFS='-'
	for x in $temp_mac
	do
		if [ -z "$bootif_mac" ]
		then
			bootif_mac="$x"
		else
			bootif_mac="$bootif_mac:$x"
		fi
	done
	unset IFS

	# look for devices with matching mac address, and set DEVICE to
	# appropriate value if match is found.

	for device in /sys/class/net/*
	do
		if [ -f "$device/address" ]
		then
		current_mac=$(cat "$device/address")

			if [ "$bootif_mac" = "$current_mac" ]
			then
				DEVICE=${device##*/}
				break
			fi
		fi
	done
	fi

}

do_netsetup ()
{
	modprobe -q af_packet # For DHCP

	udevadm trigger
	udevadm settle

	[ -n "$ETHDEV_TIMEOUT" ] || ETHDEV_TIMEOUT=15
	echo "Using timeout of $ETHDEV_TIMEOUT seconds for network configuration."

	if [ -z "${NETBOOT}" ] && [ -z "${FETCH}" ] && [ -z "${HTTPFS}" ] && [ -z "${FTPFS}" ]
	then
		# See if we can select the device from BOOTIF
		Device_from_bootif

		# if ethdevice was not specified on the kernel command line
		# make sure we try to get a working network configuration
		# for *every* present network device (except for loopback of course)
		if [ -z "$ETHDEVICE" ]
		then
			echo "If you want to boot from a specific device use bootoption ethdevice=..."
			for device in /sys/class/net/*
			do
				dev=${device##*/}
				if [ "$dev" != "lo" ]
				then
					ETHDEVICE="$ETHDEVICE $dev"
				fi
			done
		fi

		# split args of ethdevice=eth0,eth1 into "eth0 eth1"
		for device in $(echo $ETHDEVICE | sed 's/,/ /g')
		do
			devlist="$devlist $device"
		done

		# this is tricky (and ugly) because ipconfig sometimes just hangs/runs into
		# an endless loop; if execution fails give it two further tries, that's
		# why we use '$devlist $devlist $devlist' for the other for loop
		for dev in $devlist $devlist $devlist
		do
			echo "Executing ipconfig -t $ETHDEV_TIMEOUT $dev"
			ipconfig -t "$ETHDEV_TIMEOUT" $dev | tee -a /netboot.config &
			jobid=$!
			sleep "$ETHDEV_TIMEOUT" ; sleep 1
			if [ -r /proc/"$jobid"/status ]
			then
				echo "Killing job $jobid for device $dev as ipconfig ran into recursion..."
				kill -9 $jobid
			fi

			# if configuration of device worked we should have an assigned
			# IP address, if so let's use the device as $DEVICE for later usage.
			# simple and primitive approach which seems to work fine
			if ifconfig $dev | grep -q 'inet.*addr:'
			then
				export DEVICE="$dev"
				break
			fi
		done
	else
		for interface in ${DEVICE}; do
			ipconfig -t "$ETHDEV_TIMEOUT" ${interface} | tee /netboot-${interface}.config

			[ -e /run/net-${interface}.conf ] && . /run/net-${interface}.conf

			if [ "$IPV4ADDR" != "0.0.0.0" ]
			then
				break
			fi
		done
	fi

	for interface in ${DEVICE}
	do
		# source relevant ipconfig output
		OLDHOSTNAME=${HOSTNAME}

		[ -e /run/net-${interface}.conf ] && . /run/net-${interface}.conf

		[ -z ${HOSTNAME} ] && HOSTNAME=${OLDHOSTNAME}
		export HOSTNAME

		if [ -n "${interface}" ]
		then
			HWADDR="$(cat /sys/class/net/${interface}/address)"
		fi

		if [ ! -e "/etc/resolv.conf" ]
		then
			echo "Creating /etc/resolv.conf"

			if [ -n "${DNSDOMAIN}" ]
			then
				echo "domain ${DNSDOMAIN}" > /etc/resolv.conf
				echo "search ${DNSDOMAIN}" >> /etc/resolv.conf
			fi

			for i in ${IPV4DNS0} ${IPV4DNS1} ${IPV4DNS1}
			do
				if [ -n "$i" ] && [ "$i" != 0.0.0.0 ]
				then
					echo "nameserver $i" >> /etc/resolv.conf
				fi
			done
		fi

		# Check if we have a network device at all
		if ! ls /sys/class/net/"$interface" > /dev/null 2>&1 && \
		   ! ls /sys/class/net/eth0 > /dev/null 2>&1 && \
		   ! ls /sys/class/net/wlan0 > /dev/null 2>&1 && \
		   ! ls /sys/class/net/ath0 > /dev/null 2>&1 && \
		   ! ls /sys/class/net/ra0 > /dev/null 2>&1
		then
			panic "No supported network device found, maybe a non-mainline driver is required."
		fi
	done
}