diff options
Diffstat (limited to 'usr.sbin/pc-sysinstall/backend/functions-networking.sh')
-rwxr-xr-x | usr.sbin/pc-sysinstall/backend/functions-networking.sh | 500 |
1 files changed, 500 insertions, 0 deletions
diff --git a/usr.sbin/pc-sysinstall/backend/functions-networking.sh b/usr.sbin/pc-sysinstall/backend/functions-networking.sh new file mode 100755 index 0000000..1aa08bd --- /dev/null +++ b/usr.sbin/pc-sysinstall/backend/functions-networking.sh @@ -0,0 +1,500 @@ +#!/bin/sh +#- +# Copyright (c) 2010 iXsystems, Inc. All rights reserved. +# Copyright (c) 2011 The FreeBSD Foundation +# All rights reserved. +# +# Portions of this software were developed by Bjoern Zeeb +# under sponsorship from the FreeBSD Foundation. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +# Functions which perform our networking setup + +# Function which creates a kde4 .desktop file for the PC-BSD net tray +create_desktop_nettray() +{ + NIC="${1}" + echo "#!/usr/bin/env xdg-open +[Desktop Entry] +Exec=/usr/local/kde4/bin/pc-nettray ${NIC} +Icon=network +StartupNotify=false +Type=Application" > ${FSMNT}/usr/share/skel/.kde4/Autostart/tray-${NIC}.desktop + chmod 744 ${FSMNT}/usr/share/skel/.kde4/Autostart/tray-${NIC}.desktop + +}; + +# Function which checks is a nic is wifi or not +check_is_wifi() +{ + NIC="$1" + ifconfig ${NIC} | grep -q "802.11" 2>/dev/null + if [ $? -eq 0 ] + then + return 0 + else + return 1 + fi +}; + +# Function to get the first available wired nic, used for setup +get_first_wired_nic() +{ + rm ${TMPDIR}/.niclist >/dev/null 2>/dev/null + # start by getting a list of nics on this system + ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist + if [ -e "${TMPDIR}/.niclist" ] + then + while read line + do + NIC="`echo $line | cut -d ':' -f 1`" + check_is_wifi ${NIC} + if [ $? -ne 0 ] + then + export VAL="${NIC}" + return + fi + done < ${TMPDIR}/.niclist + fi + + export VAL="" + return +}; + + +# Function which simply enables plain dhcp on all detected nics +enable_dhcp_all() +{ + rm ${TMPDIR}/.niclist >/dev/null 2>/dev/null + # start by getting a list of nics on this system + ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist + if [ -e "${TMPDIR}/.niclist" ] + then + echo "# Auto-Enabled NICs from pc-sysinstall" >>${FSMNT}/etc/rc.conf + WLANCOUNT="0" + while read line + do + NIC="`echo $line | cut -d ':' -f 1`" + DESC="`echo $line | cut -d ':' -f 2`" + echo_log "Setting $NIC to DHCP on the system." + check_is_wifi ${NIC} + if [ $? -eq 0 ] + then + # We have a wifi device, setup a wlan* entry for it + WLAN="wlan${WLANCOUNT}" + cat ${FSMNT}/etc/rc.conf | grep -q "wlans_${NIC}=" + if [ $? -ne 0 ] ; then + echo "wlans_${NIC}=\"${WLAN}\"" >>${FSMNT}/etc/rc.conf + fi + echo "ifconfig_${WLAN}=\"DHCP\"" >>${FSMNT}/etc/rc.conf + CNIC="${WLAN}" + WLANCOUNT=$((WLANCOUNT+1)) + else + echo "ifconfig_${NIC}=\"DHCP\"" >>${FSMNT}/etc/rc.conf + CNIC="${NIC}" + fi + + done < ${TMPDIR}/.niclist + fi +}; + + +# Function which detects available nics, and enables dhcp on them +save_auto_dhcp() +{ + enable_dhcp_all +}; + +# Function which simply enables iPv6 SLAAC on all detected nics +enable_slaac_all() +{ + rm ${TMPDIR}/.niclist >/dev/null 2>/dev/null + # start by getting a list of nics on this system + ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist + if [ -e "${TMPDIR}/.niclist" ] + then + echo "# Auto-Enabled NICs from pc-sysinstall" >>${FSMNT}/etc/rc.conf + WLANCOUNT="0" + while read line + do + NIC="`echo $line | cut -d ':' -f 1`" + DESC="`echo $line | cut -d ':' -f 2`" + echo_log "Setting $NIC to accepting RAs on the system." + check_is_wifi ${NIC} + if [ $? -eq 0 ] + then + # We have a wifi device, setup a wlan* entry for it + # Given we cannot have DHCP and SLAAC the same time currently + # it's save to just duplicate. + WLAN="wlan${WLANCOUNT}" + cat ${FSMNT}/etc/rc.conf | grep -q "wlans_${NIC}=" + if [ $? -ne 0 ] ; then + echo "wlans_${NIC}=\"${WLAN}\"" >>${FSMNT}/etc/rc.conf + fi + #echo "ifconfig_${NIC}=\"up\"" >>${FSMNT}/etc/rc.conf + echo "ifconfig_${WLAN}_ipv6=\"inet6 accept_rtadv\"" >>${FSMNT}/etc/rc.conf + CNIC="${WLAN}" + WLANCOUNT=$((WLANCOUNT+1)) + else + #echo "ifconfig_${NIC}=\"up\"" >>${FSMNT}/etc/rc.conf + echo "ifconfig_${NIC}_ipv6=\"inet6 accept_rtadv\"" >>${FSMNT}/etc/rc.conf + CNIC="${NIC}" + fi + + done < ${TMPDIR}/.niclist + fi + + # Given we cannot yet rely on RAs to provide DNS information as much + # as we can in the DHCP world, we should append a given nameserver. + : > ${FSMNT}/etc/resolv.conf + get_value_from_cfg netSaveIPv6NameServer + NAMESERVER="${VAL}" + if [ -n "${NAMESERVER}" ] + then + echo "nameserver ${NAMESERVER}" >>${FSMNT}/etc/resolv.conf + fi + +}; + + +# Function which detects available nics, and enables IPv6 SLAAC on them +save_auto_slaac() +{ + enable_slaac_all +}; + + +# Function which saves a manual nic setup to the installed system +save_manual_nic() +{ + # Get the target nic + NIC="$1" + + get_value_from_cfg netSaveIP_${NIC} + NETIP="${VAL}" + + if [ "$NETIP" = "DHCP" ] + then + echo_log "Setting $NIC to DHCP on the system." + echo "ifconfig_${NIC}=\"DHCP\"" >>${FSMNT}/etc/rc.conf + return 0 + fi + + # If we get here, we have a manual setup, lets do so now + IFARGS="" + IF6ARGS="" + + # Set the manual IP + if [ -n "${NETIP}" ] + then + IFARGS="inet ${NETIP}" + + # Check if we have a netmask to set + get_value_from_cfg netSaveMask_${NIC} + NETMASK="${VAL}" + if [ -n "${NETMASK}" ] + then + IFARGS="${IFARGS} netmask ${NETMASK}" + fi + fi + + get_value_from_cfg netSaveIPv6_${NIC} + NETIP6="${VAL}" + if [ -n "${NETIP6}" ] + then + # Make sure we have one inet6 prefix. + IF6ARGS=`echo "${NETIP6}" | awk '{ if ("^inet6 ") { print $0; } else + { printf "inet6 %s", $0; } }'` + fi + + echo "# Auto-Enabled NICs from pc-sysinstall" >>${FSMNT}/etc/rc.conf + if [ -n "${IFARGS}" ] + then + echo "ifconfig_${NIC}=\"${IFARGS}\"" >>${FSMNT}/etc/rc.conf + fi + if [ -n "${IF6ARGS}" ] + then + echo "ifconfig_${NIC}_ipv6=\"${IF6ARGS}\"" >>${FSMNT}/etc/rc.conf + fi + +}; + +# Function which saves a manual gateway router setup to the installed system +save_manual_router() +{ + + # Check if we have a default router to set + get_value_from_cfg netSaveDefaultRouter + NETROUTE="${VAL}" + if [ -n "${NETROUTE}" ] + then + echo "defaultrouter=\"${NETROUTE}\"" >>${FSMNT}/etc/rc.conf + fi + get_value_from_cfg netSaveIPv6DefaultRouter + NETROUTE="${VAL}" + if [ -n "${NETROUTE}" ] + then + echo "ipv6_defaultrouter=\"${NETROUTE}\"" >>${FSMNT}/etc/rc.conf + fi + +}; + +save_manual_nameserver() +{ + # Check if we have a nameserver to enable + : > ${FSMNT}/etc/resolv.conf + get_value_from_cfg_with_spaces netSaveNameServer + NAMESERVERLIST="${VAL}" + if [ ! -z "${NAMESERVERLIST}" ] + then + for NAMESERVER in ${NAMESERVERLIST} + do + echo "nameserver ${NAMESERVER}" >>${FSMNT}/etc/resolv.conf + done + fi + + get_value_from_cfg_with_spaces netSaveIPv6NameServer + NAMESERVERLIST="${VAL}" + if [ ! -z "${NAMESERVERLIST}" ] + then + for NAMESERVER in ${NAMESERVERLIST} + do + echo "nameserver ${NAMESERVER}" >>${FSMNT}/etc/resolv.conf + done + fi + +}; + +# Function which determines if a nic is active / up +is_nic_active() +{ + ifconfig ${1} | grep -q "status: active" 2>/dev/null + if [ $? -eq 0 ] ; then + return 0 + else + return 1 + fi +}; + + +# Function which detects available nics, and runs DHCP on them until +# a success is found +enable_auto_dhcp() +{ + # start by getting a list of nics on this system + ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist + while read line + do + NIC="`echo $line | cut -d ':' -f 1`" + DESC="`echo $line | cut -d ':' -f 2`" + + is_nic_active "${NIC}" + if [ $? -eq 0 ] ; then + echo_log "Trying DHCP on $NIC $DESC" + dhclient ${NIC} >/dev/null 2>/dev/null + if [ $? -eq 0 ] ; then + # Got a valid DHCP IP, we can return now + export WRKNIC="$NIC" + return 0 + fi + fi + done < ${TMPDIR}/.niclist + +}; + +# Function which detects available nics, and runs rtsol on them. +enable_auto_slaac() +{ + + # start by getting a list of nics on this system + ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist + ALLNICS="" + while read line + do + NIC="`echo $line | cut -d ':' -f 1`" + DESC="`echo $line | cut -d ':' -f 2`" + + is_nic_active "${NIC}" + if [ $? -eq 0 ] ; then + echo_log "Will try IPv6 SLAAC on $NIC $DESC" + ifconfig ${NIC} inet6 -ifdisabled accept_rtadv up + ALLNICS="${ALLNICS} ${NIC}" + fi + done < ${TMPDIR}/.niclist + + # XXX once we support it in-tree call /sbin/resovconf here. + echo_log "Running rtsol on ${ALLNICS}" + rtsol -F ${ALLNICS} >/dev/null 2>/dev/null +} + +# Get the mac address of a target NIC +get_nic_mac() +{ + FOUNDMAC="`ifconfig ${1} | grep 'ether' | tr -d '\t' | cut -d ' ' -f 2`" + export FOUNDMAC +} + +# Function which performs the manual setup of a target nic in the cfg +enable_manual_nic() +{ + # Get the target nic + NIC="$1" + + # Check that this NIC exists + rc_halt "ifconfig ${NIC}" + + get_value_from_cfg netIP + NETIP="${VAL}" + + if [ "$NETIP" = "DHCP" ] + then + echo_log "Enabling DHCP on $NIC" + rc_halt "dhclient ${NIC}" + return 0 + fi + + # If we get here, we have a manual setup, lets do so now + + # IPv4: + + # Set the manual IP + if [ -n "${NETIP}" ] + then + # Check if we have a netmask to set + get_value_from_cfg netMask + NETMASK="${VAL}" + if [ -n "${NETMASK}" ] + then + rc_halt "ifconfig inet ${NIC} netmask ${NETMASK}" + else + rc_halt "ifconfig inet ${NIC} ${NETIP}" + fi + fi + + # Check if we have a default router to set + get_value_from_cfg netDefaultRouter + NETROUTE="${VAL}" + if [ -n "${NETROUTE}" ] + then + rc_halt "route add -inet default ${NETROUTE}" + fi + + # IPv6: + + # Set static IPv6 address + get_value_from_cfg netIPv6 + NETIP="${VAL}" + if [ -n ${NETIP} ] + then + rc_halt "ifconfig inet6 ${NIC} ${NETIP} -ifdisabled up" + fi + + # Default router + get_value_from_cfg netIPv6DefaultRouter + NETROUTE="${VAL}" + if [ -n "${NETROUTE}" ] + then + rc_halt "route add -inet6 default ${NETROUTE}" + fi + + # Check if we have a nameserver to enable + : >/etc/resolv.conf + get_value_from_cfg netNameServer + NAMESERVER="${VAL}" + if [ -n "${NAMESERVER}" ] + then + echo "nameserver ${NAMESERVER}" >>/etc/resolv.conf + fi + get_value_from_cfg netIPv6NameServer + NAMESERVER="${VAL}" + if [ -n "${NAMESERVER}" ] + then + echo "nameserver ${NAMESERVER}" >>/etc/resolv.conf + fi + +}; + + +# Function which parses the cfg and enables networking per specified +start_networking() +{ + # Check if we have any networking requested + get_value_from_cfg netDev + if [ -z "${VAL}" ] + then + return 0 + fi + + NETDEV="${VAL}" + if [ "$NETDEV" = "AUTO-DHCP" ] + then + enable_auto_dhcp + elif [ "$NETDEV" = "IPv6-SLAAC" ] + then + enable_auto_slaac + elif [ "$NETDEV" = "AUTO-DHCP-SLAAC" ] + then + enable_auto_dhcp + enable_auto_slaac + else + enable_manual_nic ${NETDEV} + fi + +}; + + +# Function which checks the cfg and enables the specified networking on +# the installed system +save_networking_install() +{ + + # Check if we have any networking requested to save + get_value_from_cfg_with_spaces netSaveDev + if [ -z "${VAL}" ] + then + return 0 + fi + + NETDEVLIST="${VAL}" + if [ "$NETDEVLIST" = "AUTO-DHCP" ] + then + save_auto_dhcp + elif [ "$NETDEVLIST" = "IPv6-SLAAC" ] + then + save_auto_slaac + elif [ "$NETDEVLIST" = "AUTO-DHCP-SLAAC" ] + then + save_auto_dhcp + save_auto_slaac + else + for NETDEV in ${NETDEVLIST} + do + save_manual_nic ${NETDEV} + done + save_manual_router + save_manual_nameserver + fi + +}; |