summaryrefslogtreecommitdiffstats
path: root/setup-interfaces.in
blob: b96ee58a7709962757a41ff15cf8ed0ffa210816 (plain)
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
149
150
151
152
153
#!/bin/sh

PROGRAM=setup-interfaces
PREFIX=

. $PREFIX/lib/libalpine.sh


detect_interfaces() {
	ip addr | grep -v ' lo:' | awk -F : '/^[0-9]*:/ { print $2}'
}

get_first_unconfigured() {
	ls *.noconf 2>/dev/null | head -n 1 | sed 's/.noconf//'
}

get_default_addr() {
	# check if dhcpcd is running
	if pidof dhcpcd > /dev/null && [ -f "$ROOT/var/lib/dhcpc/dhcpcd-$1.info" ]; then
		echo dhcp
	else
		ip addr show $1 | awk '/inet / {print $2}' | head -n 1 | sed 's:/.*::'
	fi
}

get_default_mask() {
	if [ "$1" ] ; then
		ipcalc -m $1 | sed 's/.*=//'
	else
		echo "255.255.255.0"
	fi
}

get_default_gateway() {
	ip route show dev $1 | awk '/^default/ {print $3}'
}


config_iface() {
	local iface=$1
	local address
	local netmask
	local gateway

	# use ipcalc to validate the address. we do accept /mask
	# we are no interested in the result, only error code, so
	# we send result to /dev/null
	while ! ipcalc -s -m $address >/dev/null 2>&1; do
		address=`get_default_addr $iface`
		[ -z "$address" ] && address="dhcp"
		echon "Ip address for $iface? (or 'dhcp') [$address] "
		default_read address $address
		[ "$address" = "abort" ] && return
		if [ "$address" = "dhcp" ] ; then
			HAS_DHCP=yes
			echo "type=dhcp" > $iface.conf
			rm $iface.noconf
			return
		fi
	done

	# extract netmask if entered together with address
	if [ "$address" != "${address%%/*}" ]; then
		netmask=$(ipcalc -s -m $address | cut -d= -f2)
	fi

	# use ipcalc -m to validate netmask. we dont accept <addr>/mask suffix
	# so we pass on a dummy mask to ipcalc.
	while ! ipcalc -s -m $netmask/0 >/dev/null 2>&1; do
		netmask=`get_default_mask $address`
		echon "Netmask? [$netmask] "
		default_read netmask "$netmask"
		[ "$netmask" = "abort" ] && return
	done

	# use ipcalc -m to validate netmask. we dont accept <addr>/mask suffix
	# so we pass on a dummy mask to ipcalc.
	while ! ipcalc -s -m $gateway/0 >/dev/null 2>&1; do
		gateway=`get_default_gateway $iface`
		[ -z "$gateway" ] && gateway=none
		echon "Gateway? (or 'none') [$gateway] "
		default_read gateway $gateway
		[ "$gateway" = "abort" ] && return
		[ "$gateway" = "none" ] && gateway=""
		[ -z "$gateway" ] && break
	done
	
	echo "type=static" > $iface.conf
	echo "address=${address%%/*}" >> $iface.conf  #strip off /mask if there
	echo "netmask=$netmask" >> $iface.conf
	echo "gateway=$gateway" >> $iface.conf

	# print summary
	echo "Configuration for $iface:"
	sed 's/^/  /' $iface.conf
	
	rm $iface.noconf
}

init_tmpdir TMP

cd $TMP
for i in $(detect_interfaces); do
	touch $i.noconf
done


while ls *.noconf > /dev/null 2>&1 ; do
	echon "Available interfaces are:"
	for i in *.noconf; do
		echon " `basename $i .noconf`"
	done
	echo "."

	firstif=`get_first_unconfigured`
	echon "Which one do you want to initialize? (or 'done') [$firstif] "
	default_read iface "$firstif"
	
	[ "$iface" = "done" ] && break
	[ -f $iface.noconf ] || continue
	config_iface $iface
done

echo "type=loopback" > lo.conf
echo "" > interface
for i in *.conf ; do
	iface=`basename $i .conf`
	. ./$i
	echo "" >> interfaces
	echo "auto $iface" >> interfaces
	echo "iface $iface inet $type" >> interfaces
	[ "$type" = "static" ] || continue
	echo -e "\taddress $address" >> interfaces
	echo -e "\tnetmask $netmask" >> interfaces
	[ "$gateway" ] && echo -e "\tgateway $gateway" >> interfaces
done

while [ "$answer" != "yes" ] && [ "$answer" != "no" ] ; do
	echon "Do you want to do any manual network configuration? [no] "
	default_read answer no
done

if [ "$answer" = "yes" ]; then
	case "$EDITOR" in
		nano)	pkg_inst nano;;
		vim)	pkg_inst vim;;
	esac
	${EDITOR:-vi} interfaces
fi

mkdir -p $ROOT/etc/network
cp interfaces $ROOT/etc/network/