update to 31b795ca71189b326b80666076398f31aea4f2be
[automated-distro-installer] / fai / config / scripts / DEBIAN / 30-interface
1 #! /bin/bash
2
3 netplan_yaml() {
4 # network configuration using ubuntu's netplan.io
5 local IFNAME="$1"
6 local METHOD="$2"
7 echo "Generating netplan configuration for $IFNAME ($METHOD)" >&2
8 echo "# generated by FAI"
9 echo "network:"
10 echo " version: 2"
11 echo " renderer: $RENDERER"
12 case "$RENDERER" in
13 networkd)
14 echo " ethernets:"
15 echo " $IFNAME:"
16 case "$METHOD" in
17 dhcp)
18 echo " dhcp4: true"
19 ;;
20 static)
21 echo " addresses: [$CIDR]"
22 echo " gateway4: $GATEWAYS_1"
23 echo " nameservers:"
24 echo " search: [$DOMAIN]"
25 echo " addresses: [${DNSSRVS// /, }]"
26 ;;
27 esac
28 esac
29 }
30
31 iface_stanza() {
32 # classic network configuration using /etc/network/interfaces
33 local IFNAME="$1"
34 local METHOD="$2"
35 echo "Generating interface configuration for $IFNAME ($METHOD)" >&2
36 echo "# generated by FAI"
37 echo "auto $IFNAME"
38 echo "iface $IFNAME inet $METHOD"
39 case "$METHOD" in
40 static)
41 echo " address $IPADDR"
42 echo " netmask $NETMASK"
43 echo " broadcast $BROADCAST"
44 echo " gateway $GATEWAYS"
45 ;;
46 esac
47 }
48
49 newnicnames() {
50
51 # determine predictable network names only for stretch and above
52 local name
53
54 [ $do_init_tasks -eq 0 ] && return
55 [ -z "$NIC1" ] && return
56 ver=$($ROOTCMD dpkg-query --showformat='${Version}' --show udev)
57 if dpkg --compare-versions $ver lt 220-7; then
58 return
59 fi
60
61
62 fields="ID_NET_NAME_FROM_DATABASE ID_NET_NAME_ONBOARD ID_NET_NAME_SLOT ID_NET_NAME_PATH"
63 for field in $fields; do
64 name=$(udevadm info /sys/class/net/$NIC1 | sed -rn "s/^E: $field=(.+)/\1/p")
65 if [[ $name ]]; then
66 NIC1=$name
67 return
68 fi
69 done
70
71 # try to get altname net dev
72 name=$(ip link show $NIC1 | awk '/altname / { print $2 }')
73 if [[ $name ]]; then
74 NIC1=$name
75 return
76 else
77 echo "$0: error: could not find systemd predictable network name. Using $NIC1."
78 fi
79 }
80
81 if [ -z "$NIC1" ]; then
82 echo "WARNING: \$NIC1 is not defined. Cannot add ethernet to /etc/network/interfaces."
83 fi
84 CIDR=$(ip -o -f inet addr show $NIC1 | awk '{print $4}')
85 newnicnames
86
87 case "$FAI_ACTION" in
88 install|dirinstall)
89 ifclass DHCPC && METHOD=dhcp || METHOD=static
90 ifclass XORG && RENDERER=NetworkManager || RENDERER=networkd
91
92 if [ -d $target/etc/netplan ]; then
93 # Ubuntu >= 17.10 with netplan.io
94 if [ -n "$NIC1" ]; then
95 netplan_yaml $NIC1 $METHOD > $target/etc/netplan/01-${NIC1}.yaml
96 fi
97 elif [ -d $target/etc/network/interfaces.d ]; then
98 # ifupdown >= 0.7.41 (Debian >= 8, Ubuntu >= 14.04)
99 iface_stanza lo loopback > $target/etc/network/interfaces.d/lo
100
101 if [ -n "$NIC1" -a ! -f $target/etc/NetworkManager/NetworkManager.conf ]; then
102 iface_stanza $NIC1 $METHOD > $target/etc/network/interfaces.d/$NIC1
103 fi
104 else
105 (
106 iface_stanza lo loopback
107 iface_stanza $NIC1 $METHOD
108 ) > $target/etc/network/interfaces
109 fi
110
111 if ! ifclass DHCPC ; then
112 [ -n "$NETWORK" ] && echo "localnet $NETWORK" > $target/etc/networks
113 if [ ! -L $target/etc/resolv.conf -a -e /etc/resolv.conf ]; then
114 cp -p /etc/resolv.conf $target/etc
115 fi
116 fi
117 ;;
118 esac
119
120 # here fcopy is mostly used, when installing a client for running in a
121 # different subnet than during the installation
122 fcopy -iM /etc/resolv.conf
123 fcopy -iM /etc/network/interfaces /etc/networks
124
125 exit $error