File: 9990-select-eth-device.sh

package info (click to toggle)
live-boot 1%3A20230131%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 680 kB
  • sloc: sh: 3,379; makefile: 151
file content (148 lines) | stat: -rwxr-xr-x 3,327 bytes parent folder | download
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
#!/bin/sh

Wait_for_carrier ()
{
	# $1 = network device
	echo -n "Waiting for link to come up on $1... "
	ip link set $1 up
	for step in $(seq 1 15)
	do
		carrier=$(cat /sys/class/net/$1/carrier \
		2>/dev/null)
		case "${carrier}" in
			1)
			echo -e "\nLink is up"
			return
			;;
			*)
			# Counter
			echo -n "$step "
			;;
		esac
		sleep 1
	done
	echo -e "\nError - carrier not detected on $1."
	ip link set $1 down
}

Select_eth_device ()
{
	# Boot type in initramfs's config
	bootconf=$(egrep '^BOOT=' /conf/initramfs.conf | tail -1)

	# can be superseded by command line (used by Debian-Live's netboot for example)
	for ARGUMENT in ${LIVE_BOOT_CMDLINE}
	do
		case "${ARGUMENT}" in
			netboot=*)
				NETBOOT="${ARGUMENT#netboot=}"
				;;
		esac
	done

	if [ "$bootconf" != "BOOT=nfs" ] && [ -z "$NETBOOT" ] && [ -z "$FETCH" ] && [ -z "$FTPFS" ] && [ -z "$HTTPFS" ]
	then
		# Not a net boot : nothing to do
		return
	fi

	# we want to do some basic IP
	modprobe -q af_packet

	# Ensure all our net modules get loaded so we can actually compare MAC addresses...
	udevadm trigger
	udevadm settle

	# Available Ethernet interfaces ?
	l_interfaces=""

	# See if we can derive the boot device
	Device_from_bootif

	if [ -z "$DEVICE" ]
	then
		echo "Waiting for ethernet card(s) up... If this fails, maybe the ethernet card is not supported by the kernel `uname -r`?"
		while [ -z "$l_interfaces" ]
		do
			l_interfaces="$(cd /sys/class/net/ && ls -d * 2>/dev/null | grep -v "lo")"
		done

		if [ $(echo $l_interfaces | wc -w) -lt 2 ]
		then
			# only one interface : no choice
			echo "DEVICE=$l_interfaces" >> /conf/param.conf
			Wait_for_carrier $l_interfaces
			return
		fi

		# If user force to use specific device, write it
		for ARGUMENT in ${LIVE_BOOT_CMDLINE}
		do
			case "${ARGUMENT}" in
				live-netdev=*)
				NETDEV="${ARGUMENT#live-netdev=}"
				echo "DEVICE=$NETDEV" >> /conf/param.conf
				echo "Found live-netdev parameter, forcing to to use network device $NETDEV."
				Wait_for_carrier $NETDEV
				return
				;;
			esac
		done
	else
		l_interfaces="$DEVICE"
	fi

	found_eth_dev=""
	echo -n "Looking for a connected Ethernet interface."

	for interface in $l_interfaces
	do
		# ATTR{carrier} is not set if this is not done
		echo -n " $interface ?"
		ipconfig -c none -d $interface -t 1 >/dev/null 2>&1
		sleep 1
	done

	echo ''

	for step in 1 2 3 4 5
	do
		for interface in $l_interfaces
		do
			# Skip the interface if it's already found.
			IN_IT=no
			for DEV in $found_eth_dev ; do
				if [ "${DEV}" = "$interface" ] ; then
					IN_IT=yes
				fi
			done

			if [ "${IN_IT}" = "no" ] ; then
				ip link set $interface up
				carrier=$(cat /sys/class/net/$interface/carrier \
					2>/dev/null)
				# link detected
				if [ "${carrier}" = 1 ] ; then
					echo "Connected $interface found"
					# inform initrd's init script :
					if [ -z "${found_eth_dev}" ] ; then
						found_eth_dev="$interface"
					else
						found_eth_dev="$found_eth_dev $interface"
					fi
				fi
			fi
		done
		# wait a bit
		sleep 1
	done
	if [ -n "$found_eth_dev" ]
	then
		echo "Done searching for connected Ethernet interface."
		echo "Writing DEVICE='$found_eth_dev' in /conf/param.conf."
		echo "DEVICE='$found_eth_dev'" >> /conf/param.conf
	else
		echo "Could not find an interface that is up: giving-up..."
	fi
	return
}