aboutsummaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2017-03-23 20:08:19 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2017-03-23 20:08:19 +0200
commit603657a166bff4a16606a2575364446171466af6 (patch)
treead31cfff7432d5846d8a40505c1943a6fb1d1718 /init
parent6b3c6b23a16869012c934c0df6244885b22e0aa1 (diff)
Initial implementation of network configuration
Diffstat (limited to 'init')
-rwxr-xr-xinit96
1 files changed, 95 insertions, 1 deletions
diff --git a/init b/init
index 0caf718..b733fde 100755
--- a/init
+++ b/init
@@ -57,7 +57,101 @@ udevadm settle || true
cmdline="$(cat /proc/cmdline)"
info "boot cmdline: $cmdline"
-sleep 2
+# Figure out network configuration and generate the corresponding
+# /etc/network/interfaces.
+#
+info "starting network..."
+
+# We are using udev's predictable interface names. The two character prefixes
+# based on the type of interface:
+#
+# en -- ethernet
+# sl -- serial line IP (slip)
+# wl -- wlan
+# ww -- wwan
+#
+eth_all="$(cd /sys/class/net && ls -d en?*)"
+
+if [ -z "$eth_all" ]; then
+ info "no ethernet interfaces found among:"
+ ip link show
+fi
+
+eth=
+eth_up=
+for s in 1 2 4 8; do
+
+ # Try to bring them all up and find the one that has carrier.
+ #
+ for i in $eth_all; do
+ ip link set "$i" up || true
+ done
+
+ sleep "$s"
+
+ for i in $eth_all; do
+ if [ "$(cat "/sys/class/net/$i/carrier")" -eq "1" ]; then
+ info "detected carrier on $i"
+ eth_up+=" $i"
+ fi
+ done
+
+ # Bring them all down.
+ #
+ for i in $eth_all; do
+ ip link set "$i" down || true
+ done
+
+ # If we didn't find anything, try to wait for carrier longer.
+ #
+ if [ -z "$eth_up" ]; then
+ continue
+ fi
+
+ # If we end up with several interfaces we simply unleash dhcp on all of
+ # them and use the first that gets configured.
+ #
+ # Note also that it's possible the interface that we want is not yet ready
+ # in which case we will try to wait for carrier a bit longer.
+ #
+ for i in $eth_up; do
+ if dhclient -v "$i"; then
+ eth="$i"
+ break
+ fi
+ done
+
+ if [ -n "$eth" ]; then
+ break
+ fi
+done
+
+if [ -z "$eth_up" ]; then
+ error "no ethernet interfaces with carrier among:"
+ ip link show
+fi
+
+if [ -z "$eth" ]; then
+ error "no ethernet interfaces with DHCP among:"
+ ip link show
+fi
+
+mac="$(cat "/sys/class/net/$eth/address")"
+
+info "configured $eth ($mac)"
+
+# Set the hostname.
+#
+hname="$(hostname)"
+
+if [ "$hname" = "(none)" ]; then
+ hname="build-$(sed -e 's/://g' <<<"$mac")"
+ hostname "$hname"
+fi
+
+echo "$hname" >/etc/hostname
+
+info "hostname $hname"
# --machine-id
#