File: 9990-select-eth-device.sh

package info (click to toggle)
live-boot 1%3A20210208
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 672 kB
  • sloc: sh: 3,321; makefile: 151
file content (138 lines) | stat: -rwxr-xr-x 2,990 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
#!/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=""
	while true
	do
		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
				ip link set $interface up
				carrier=$(cat /sys/class/net/$interface/carrier \
					2>/dev/null)
				# link detected

				case "${carrier}" in
					1)
						echo "Connected $interface found"
						# inform initrd's init script :
						found_eth_dev="$found_eth_dev $interface"
						found_eth_dev="$(echo $found_eth_dev | sed -e "s/^[[:space:]]*//g")"
						;;
				esac
			done
			if [ -n "$found_eth_dev" ]
			then
				echo "DEVICE='$found_eth_dev'" >> /conf/param.conf
				return
			else
				# wait a bit
				sleep 1
			fi
		done
	done
}