#!/bin/sh PROGRAM=setup-interfaces PREFIX= for i in ./libalpine.sh $PREFIX/lib/libalpine.sh; do [ -e $i ] && . $i && break done unconfigured_add() { touch $1.noconf } unconfigured_detect() { local i= for i in ${INTERFACES:-$(available_ifaces)}; do if [ "$i" != "lo" ]; then unconfigured_add $i fi done } unconfigured_get_first() { ls *.noconf 2>/dev/null | head -n 1 | sed 's/.noconf//' } unconfigured_del() { rm $1.noconf } unconfigured_all_done() { local i= for i in *.noconf; do [ -e $i ] && return 1 done return 0 } unconfigured_list() { local list= i= for i in *.noconf; do [ -e "$i" ] || continue list="${list} ${i%.noconf}" done echo $list } unconfigured_isin() { [ -f $1.noconf ] } iface_exists() { test -e /sys/class/net/$1 } get_default_addr() { # check if dhcpcd is running if pidof dhcpcd > /dev/null && [ -f "$ROOT/var/lib/dhcpc/dhcpcd-$1.info" ]; then echo dhcp elif iface_exists; then 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}' } ipaddr_help() { cat <<__EOF__ For static ip: Enter the ip address in the format x.x.x.x For dhcp: Enter 'dhcp' To add this interface to a bridge enter the bridge name (eg 'br0' or 'bridge0') __EOF__ } bridge_add_port() { local bridge=$1 iface= shift for iface; do echo $iface >> $bridge.bridge_ports unconfigured_add $bridge unconfigured_del $iface done } bridge_list_ports() { if [ -r $1.bridge_ports ]; then echo $(cat $1.bridge_ports) fi } config_iface() { local iface=$1 local prefix=$2 local address= netmask= gateway= bridge_ports= local bridge local conf=$prefix$iface.conf local answer= while [ -n "$ask_bridge" ]; do ask "Do you want to bridge the interface $iface?" no case "$resp" in yes|y) resp=yes; break;; no|n) break;; esac done if [ "$resp" = "yes" ]; then bridge="br"`echo $iface | sed 's/[^0-9]//g'` ask "Name of the bridge you want add $iface to:" $bridge bridge_add_port $resp $iface return fi if [ -r "$iface.bridge_ports" ]; then bridge_ports=$(echo $(cat $iface.bridge_ports)) echo "bridge_ports=\"$bridge_ports\"" >> $conf fi # 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" ask "Ip address for $iface? (or 'dhcp' or '?')" $address address=$resp case "$resp" in '?') ipaddr_help;; "abort") return;; "dhcp") HAS_DHCP=yes echo "type=dhcp" >> $conf unconfigured_del $iface return ;; br[0-9]*|bridge[0-9]*) case "$iface" in # we dont allow bridge bridges br[0-9]*|bridge[0-9]*) continue;; esac bridge_add_port $resp $iface return ;; esac 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 /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` ask "Netmask?" $netmask netmask=$resp [ "$netmask" = "abort" ] && return done # use ipcalc -m to validate netmask. we dont accept /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 ask "Gateway? (or 'none')" $gateway gateway=$resp [ "$gateway" = "abort" ] && return [ "$gateway" = "none" ] && gateway="" [ -z "$gateway" ] && break done echo "type=static" >> $conf if [ -n "$bridge_ports" ]; then echo "bridge_ports=$bridge_ports" >> $conf fi echo "address=${address%%/*}" >> $conf #strip off /mask if there echo "netmask=$netmask" >> $conf echo "gateway=$gateway" >> $conf # print summary echo "Configuration for $iface:" sed 's/^/ /' $conf unconfigured_del $iface } is_bridge() { [ -e /sys/class/net/$1/bridge ] || [ -e $i.bridge_ports ] } unconfigured_non_bridges() { local local i= iflist= for i in $(unconfigured_list); do if ! is_bridge $i; then iflist="${iflist}${iflist:+ }$i" fi done echo $iflist } unconfigured_all_are() { local i= for i; do unconfigured_isin $i || return 1 done return 0 } config_bridge() { local bridge=$1 iflist= i= ports= while ! unconfigured_all_done; do set -- $(unconfigured_non_bridges) [ $# -eq 0 ] && return 0; ports=$(bridge_list_ports $bridge) if [ -n "$ports" ]; then echo "Bridge ports in $bridge are: $ports" fi echo "Available bridge ports are: $@" ask "Which port(s) do you want add to bridge $bridge? (or 'done')" $1 case $resp in 'abort') return 1;; 'done') return 0;; esac for i in $resp; do if unconfigured_isin $i; then bridge_add_port $bridge $i else echo "$i is not valid" fi done done } usage() { cat <<__EOF__ usage: setup-interfaces [-bhi] [-p ROOT] Setup network interfaces options: -b Ask for bridging of interfaces -h Show this help -i Read new contents of /etc/network/interfaces from stdin -p Use ROOT as system prefix __EOF__ exit 1 } prompt_for_interfaces() { init_tmpdir TMP cd $TMP unconfigured_detect index=1 while ! unconfigured_all_done; do echo "Available interfaces are: $(unconfigured_list)." ask "Which one do you want to initialize? (or 'done')" \ $(unconfigured_get_first) iface=$resp case "$iface" in "done") break;; br[0-9]*|bridge[0-9]*|virbr[0-9]*) config_bridge $iface || continue;; *) unconfigured_isin $iface || continue;; esac config_iface $iface $(printf "%.3d~" $index) index=$(( $index + 1 )) done echo "type=loopback" > 000~lo.conf echo "" > interface hostname=$(cat $ROOT/etc/hostname 2>/dev/null) for i in *.conf ; do iface=`basename $i .conf` iface=${iface#[0-9]*~} bridge_ports= address= type= gateway= . ./$i echo "auto $iface" >> interfaces echo "iface $iface inet $type" >> interfaces if [ -n "$bridge_ports" ]; then echo -e "\tbridge-ports $bridge_ports" >> interfaces fi case $type in dhcp) [ -n "$hostname" ] \ && echo -e "\thostname $hostname" >> interfaces ;; static) echo -e "\taddress $address" >> interfaces echo -e "\tnetmask $netmask" >> interfaces [ "$gateway" ] \ && echo -e "\tgateway $gateway" >> interfaces ;; esac done while [ "$answer" != "yes" ] && [ "$answer" != "no" ] ; do ask "Do you want to do any manual network configuration?" no case $resp in y) answer=yes;; n) answer=no;; *) answer=$resp;; esac done if yesno "$answer"; then case "$EDITOR" in nano) apk add nano;; vim) apk add vim;; esac ${EDITOR:-vi} interfaces fi mkdir -p $ROOT/etc/network cp interfaces $ROOT/etc/network/ } ask_bridge= is_xen_dom0 && ask_bridge=1 while getopts "bhip:" opt; do case $opt in b) ask_bridge=1;; h) usage;; i) STDINPUT=1;; p) ROOT=$OPTARG;; esac done mkdir -p $ROOT/etc/network if [ "$STDINPUT" = "1" ]; then cat > $ROOT/etc/network/interfaces else prompt_for_interfaces fi