File: 30-interface

package info (click to toggle)
fai 6.5.1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 2,084 kB
  • sloc: sh: 6,774; perl: 5,665; makefile: 138
file content (118 lines) | stat: -rwxr-xr-x 3,410 bytes parent folder | download | duplicates (3)
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
#! /bin/bash

netplan_yaml() {
    # network configuration using ubuntu's netplan.io
    local IFNAME="$1"
    local METHOD="$2"
    echo     "Generating netplan configuration for $IFNAME ($METHOD)" >&2
    echo     "# generated by FAI"
    echo     "network:"
    echo     "  version: 2"
    echo     "  renderer: $RENDERER"
    case "$RENDERER" in
      networkd)
        echo     "  ethernets:"
        echo     "    $IFNAME:"
        case "$METHOD" in
          dhcp)
            echo "      dhcp4: true"
            ;;
          static)
            echo "      addresses: [$CIDR]"
            echo "      gateway4: $GATEWAYS_1"
            echo "      nameservers:"
            echo "        search: [$DOMAIN]"
            echo "        addresses: [${DNSSRVS// /, }]"
            ;;
        esac
    esac
}

iface_stanza() {
    # classic network configuration using /etc/network/interfaces
    local IFNAME="$1"
    local METHOD="$2"
    echo "Generating interface configuration for $IFNAME ($METHOD)" >&2
    echo "# generated by FAI"
    echo "auto $IFNAME"
    echo "iface $IFNAME inet $METHOD"
    case "$METHOD" in
      static)
        echo "    address $CIDR"
        echo "    gateway $GATEWAYS"
        ;;
    esac
}

newnicnames() {

    local name

    inside_nfsroot || return
    [ -z "$NIC1" ] && return

    fields="ID_NET_NAME_FROM_DATABASE ID_NET_NAME_ONBOARD ID_NET_NAME_SLOT ID_NET_NAME_PATH"
    for field in $fields; do
	name=$(udevadm info /sys/class/net/$NIC1 | sed -rn "s/^E: $field=(.+)/\1/p")
	if [[ $name ]]; then
	    NIC1=$name
	    return
	fi
    done

    # try to get altname net dev
    name=$(ip link show $NIC1 | awk '/altname / { print $2 }')
    if [[ $name ]]; then
	NIC1=$name
	return
    else
	echo "$0: error: could not find systemd predictable network name. Using $NIC1."
    fi
}

if [ -z "$NIC1" ]; then
    echo "WARNING: \$NIC1 is not defined. Cannot add ethernet to /etc/network/interfaces."
fi
CIDR=$(ip --br ad sh $NIC1|awk '{print $3}')
newnicnames

case "$FAI_ACTION" in
  install|dirinstall)
    ifclass DHCPC && METHOD=dhcp || METHOD=static
    ifclass XORG && RENDERER=NetworkManager || RENDERER=networkd

    if [ -d $target/etc/netplan ]; then
        # Ubuntu >= 17.10 with netplan.io
        if [ -n "$NIC1" ]; then
            netplan_yaml $NIC1 $METHOD > $target/etc/netplan/01-${NIC1}.yaml
            chmod 600 $target/etc/netplan/01-${NIC1}.yaml
        fi
    elif [ -d $target/etc/network/interfaces.d ]; then
        # ifupdown >= 0.7.41 (Debian >= 8, Ubuntu >= 14.04)
        iface_stanza lo loopback > $target/etc/network/interfaces.d/lo

        if [ -n "$NIC1" ] && [ ! -f $target/etc/NetworkManager/NetworkManager.conf ]; then
            iface_stanza $NIC1 $METHOD > $target/etc/network/interfaces.d/$NIC1
        fi
    else
        (
            iface_stanza lo loopback
            iface_stanza $NIC1 $METHOD
        ) > $target/etc/network/interfaces
    fi

    if ! ifclass DHCPC ; then
        [ -n "$NETWORK" ] && echo "localnet $NETWORK" > $target/etc/networks
        if [ ! -L $target/etc/resolv.conf ] && [ -e /etc/resolv.conf ]; then
            cp -p /etc/resolv.conf $target/etc
        fi
    fi
    ;;
esac

# here fcopy is mostly used, when installing a client for running in a
# different subnet than during the installation
fcopy -iM /etc/resolv.conf
fcopy -iM /etc/network/interfaces /etc/networks

exit $error