freebsd-skq/usr.sbin/pc-sysinstall/backend/functions-networking.sh
pfg fe02230059 share and pc-sysinstall: adoption of SPDX licensing ID tags.
Mainly focus on files that use BSD 2-Clause license, however the tool I
was using misidentified many licenses so this was mostly a manual - error
prone - task.

The Software Package Data Exchange (SPDX) group provides a specification
to make it easier for automated tools to detect and summarize well known
opensource licenses. We are gradually adopting the specification, noting
that the tags are considered only advisory and do not, in any way,
superceed or replace the license texts.

Commit these apart because compile testing doesn't guarantee I didn't made
some nasty mistake. No functional change intended.
2017-11-27 15:28:26 +00:00

503 lines
12 KiB
Bash
Executable File

#!/bin/sh
#-
# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
#
# 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
};