functions-networking.sh revision 222528
1#!/bin/sh 2#- 3# Copyright (c) 2010 iXsystems, Inc. All rights reserved. 4# Copyright (c) 2011 The FreeBSD Foundation 5# All rights reserved. 6# 7# Portions of this software were developed by Bjoern Zeeb 8# under sponsorship from the FreeBSD Foundation. 9# 10# Redistribution and use in source and binary forms, with or without 11# modification, are permitted provided that the following conditions 12# are met: 13# 1. Redistributions of source code must retain the above copyright 14# notice, this list of conditions and the following disclaimer. 15# 2. Redistributions in binary form must reproduce the above copyright 16# notice, this list of conditions and the following disclaimer in the 17# documentation and/or other materials provided with the distribution. 18# 19# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 23# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29# SUCH DAMAGE. 30# 31# $FreeBSD: head/usr.sbin/pc-sysinstall/backend/functions-networking.sh 222528 2011-05-31 15:02:30Z bz $ 32 33# Functions which perform our networking setup 34 35# Function which creates a kde4 .desktop file for the PC-BSD net tray 36create_desktop_nettray() 37{ 38 NIC="${1}" 39 echo "#!/usr/bin/env xdg-open 40[Desktop Entry] 41Exec=/usr/local/kde4/bin/pc-nettray ${NIC} 42Icon=network 43StartupNotify=false 44Type=Application" > ${FSMNT}/usr/share/skel/.kde4/Autostart/tray-${NIC}.desktop 45 chmod 744 ${FSMNT}/usr/share/skel/.kde4/Autostart/tray-${NIC}.desktop 46 47}; 48 49# Function which checks is a nic is wifi or not 50check_is_wifi() 51{ 52 NIC="$1" 53 ifconfig ${NIC} | grep -q "802.11" 2>/dev/null 54 if [ $? -eq 0 ] 55 then 56 return 0 57 else 58 return 1 59 fi 60}; 61 62# Function to get the first available wired nic, used for setup 63get_first_wired_nic() 64{ 65 rm ${TMPDIR}/.niclist >/dev/null 2>/dev/null 66 # start by getting a list of nics on this system 67 ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist 68 if [ -e "${TMPDIR}/.niclist" ] 69 then 70 while read line 71 do 72 NIC="`echo $line | cut -d ':' -f 1`" 73 check_is_wifi ${NIC} 74 if [ $? -ne 0 ] 75 then 76 export VAL="${NIC}" 77 return 78 fi 79 done < ${TMPDIR}/.niclist 80 fi 81 82 export VAL="" 83 return 84}; 85 86 87# Function which simply enables plain dhcp on all detected nics 88enable_dhcp_all() 89{ 90 rm ${TMPDIR}/.niclist >/dev/null 2>/dev/null 91 # start by getting a list of nics on this system 92 ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist 93 if [ -e "${TMPDIR}/.niclist" ] 94 then 95 echo "# Auto-Enabled NICs from pc-sysinstall" >>${FSMNT}/etc/rc.conf 96 WLANCOUNT="0" 97 while read line 98 do 99 NIC="`echo $line | cut -d ':' -f 1`" 100 DESC="`echo $line | cut -d ':' -f 2`" 101 echo_log "Setting $NIC to DHCP on the system." 102 check_is_wifi ${NIC} 103 if [ $? -eq 0 ] 104 then 105 # We have a wifi device, setup a wlan* entry for it 106 WLAN="wlan${WLANCOUNT}" 107 echo "wlans_${NIC}=\"${WLAN}\"" >>${FSMNT}/etc/rc.conf 108 echo "ifconfig_${WLAN}=\"DHCP\"" >>${FSMNT}/etc/rc.conf 109 CNIC="${WLAN}" 110 WLANCOUNT=$((WLANCOUNT+1)) 111 else 112 echo "ifconfig_${NIC}=\"DHCP\"" >>${FSMNT}/etc/rc.conf 113 CNIC="${NIC}" 114 fi 115 116 done < ${TMPDIR}/.niclist 117 fi 118}; 119 120 121# Function which detects available nics, and enables dhcp on them 122save_auto_dhcp() 123{ 124 enable_dhcp_all 125}; 126 127# Function which simply enables iPv6 SLAAC on all detected nics 128enable_slaac_all() 129{ 130 rm ${TMPDIR}/.niclist >/dev/null 2>/dev/null 131 # start by getting a list of nics on this system 132 ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist 133 if [ -e "${TMPDIR}/.niclist" ] 134 then 135 echo "# Auto-Enabled NICs from pc-sysinstall" >>${FSMNT}/etc/rc.conf 136 WLANCOUNT="0" 137 while read line 138 do 139 NIC="`echo $line | cut -d ':' -f 1`" 140 DESC="`echo $line | cut -d ':' -f 2`" 141 echo_log "Setting $NIC to acceptign RAs on the system." 142 check_is_wifi ${NIC} 143 if [ $? -eq 0 ] 144 then 145 # We have a wifi device, setup a wlan* entry for it 146 # Given we cannot have DHCP and SLAAC the same time currently 147 # it's save to just duplicate. 148 WLAN="wlan${WLANCOUNT}" 149 echo "wlans_${NIC}=\"${WLAN}\"" >>${FSMNT}/etc/rc.conf 150 #echo "ifconfig_${NIC}=\"up\"" >>${FSMNT}/etc/rc.conf 151 echo "ifconfig_${WLAN}=\"inet6 accept_rtadv\"" >>${FSMNT}/etc/rc.conf 152 CNIC="${WLAN}" 153 WLANCOUNT=$((WLANCOUNT+1)) 154 else 155 #echo "ifconfig_${NIC}=\"up\"" >>${FSMNT}/etc/rc.conf 156 echo "ifconfig_${NIC}_ipv6=\"inet6 accept_rtadv\"" >>${FSMNT}/etc/rc.conf 157 CNIC="${NIC}" 158 fi 159 160 done < ${TMPDIR}/.niclist 161 fi 162 163 # Given we cannot yet rely on RAs to provide DNS information as much 164 # as we can in the DHCP world, we should append a given nameserver. 165 : > ${FSMNT}/etc/resolv.conf 166 get_value_from_cfg netSaveIPv6NameServer 167 NAMESERVER="${VAL}" 168 if [ -n "${NAMESERVER}" ] 169 then 170 echo "nameserver ${NAMESERVER}" >>${FSMNT}/etc/resolv.conf 171 fi 172 173}; 174 175 176# Function which detects available nics, and enables IPv6 SLAAC on them 177save_auto_slaac() 178{ 179 enable_slaac_all 180}; 181 182 183# Function which saves a manual nic setup to the installed system 184save_manual_nic() 185{ 186 # Get the target nic 187 NIC="$1" 188 189 get_value_from_cfg netSaveIP 190 NETIP="${VAL}" 191 192 if [ "$NETIP" = "DHCP" ] 193 then 194 echo_log "Setting $NIC to DHCP on the system." 195 echo "ifconfig_${NIC}=\"DHCP\"" >>${FSMNT}/etc/rc.conf 196 return 0 197 fi 198 199 # If we get here, we have a manual setup, lets do so now 200 IFARGS="" 201 IF6ARGS="" 202 203 # Set the manual IP 204 if [ -n "${NETIP}" ] 205 then 206 IFARGS="inet ${NETIP}" 207 208 # Check if we have a netmask to set 209 get_value_from_cfg netSaveMask 210 NETMASK="${VAL}" 211 if [ -n "${NETMASK}" ] 212 then 213 IFARGS="${IFARGS} netmask ${NETMASK}" 214 fi 215 fi 216 217 get_value_from_cfg netSaveIPv6 218 NETIP6="${VAL}" 219 if [ -n "${NETIP6}" ] 220 then 221 # Make sure we have one inet6 prefix. 222 IF6ARGS=`echo "${NETIP6}" | awk '{ if ("^inet6 ") { print $0; } else 223 { printf "inet6 %s", $0; } }'` 224 fi 225 226 echo "# Auto-Enabled NICs from pc-sysinstall" >>${FSMNT}/etc/rc.conf 227 if [ -n "${IFARGS}" ] 228 then 229 echo "ifconfig_${NIC}=\"${IFARGS}\"" >>${FSMNT}/etc/rc.conf 230 fi 231 if [ -n "${IF6ARGS}" ] 232 then 233 echo "ifconfig_${NIC}_ipv6=\"${IF6ARGS}\"" >>${FSMNT}/etc/rc.conf 234 fi 235 236 # Check if we have a default router to set 237 get_value_from_cfg netSaveDefaultRouter 238 NETROUTE="${VAL}" 239 if [ -n "${NETROUTE}" ] 240 then 241 echo "defaultrouter=\"${NETROUTE}\"" >>${FSMNT}/etc/rc.conf 242 fi 243 get_value_from_cfg netSaveIPv6DefaultRouter 244 NETROUTE="${VAL}" 245 if [ -n "${NETROUTE}" ] 246 then 247 echo "ipv6_defaultrouter=\"${NETROUTE}\"" >>${FSMNT}/etc/rc.conf 248 fi 249 250 # Check if we have a nameserver to enable 251 : > ${FSMNT}/etc/resolv.conf 252 get_value_from_cfg netSaveNameServer 253 NAMESERVER="${VAL}" 254 if [ -n "${NAMESERVER}" ] 255 then 256 echo "nameserver ${NAMESERVER}" >>${FSMNT}/etc/resolv.conf 257 fi 258 get_value_from_cfg netSaveIPv6NameServer 259 NAMESERVER="${VAL}" 260 if [ -n "${NAMESERVER}" ] 261 then 262 echo "nameserver ${NAMESERVER}" >>${FSMNT}/etc/resolv.conf 263 fi 264 265}; 266 267# Function which determines if a nic is active / up 268is_nic_active() 269{ 270 ifconfig ${1} | grep -q "status: active" 2>/dev/null 271 if [ $? -eq 0 ] ; then 272 return 0 273 else 274 return 1 275 fi 276}; 277 278 279# Function which detects available nics, and runs DHCP on them until 280# a success is found 281enable_auto_dhcp() 282{ 283 # start by getting a list of nics on this system 284 ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist 285 while read line 286 do 287 NIC="`echo $line | cut -d ':' -f 1`" 288 DESC="`echo $line | cut -d ':' -f 2`" 289 290 is_nic_active "${NIC}" 291 if [ $? -eq 0 ] ; then 292 echo_log "Trying DHCP on $NIC $DESC" 293 dhclient ${NIC} >/dev/null 2>/dev/null 294 if [ $? -eq 0 ] ; then 295 # Got a valid DHCP IP, we can return now 296 export WRKNIC="$NIC" 297 return 0 298 fi 299 fi 300 done < ${TMPDIR}/.niclist 301 302}; 303 304# Function which detects available nics, and runs rtsol on them. 305enable_auto_slaac() 306{ 307 308 # start by getting a list of nics on this system 309 ${QUERYDIR}/detect-nics.sh > ${TMPDIR}/.niclist 310 ALLNICS="" 311 while read line 312 do 313 NIC="`echo $line | cut -d ':' -f 1`" 314 DESC="`echo $line | cut -d ':' -f 2`" 315 316 is_nic_active "${NIC}" 317 if [ $? -eq 0 ] ; then 318 echo_log "Will try IPv6 SLAAC on $NIC $DESC" 319 ifconfig ${NIC} inet6 -ifdisabled accept_rtadv up 320 ALLNICS="${ALLNICS} ${NIC}" 321 fi 322 done < ${TMPDIR}/.niclist 323 324 # XXX once we support it in-tree call /sbin/resovconf here. 325 echo_log "Running rtsol on ${ALLNICS}" 326 rtsol -F ${ALLNICS} >/dev/null 2>/dev/null 327} 328 329# Get the mac address of a target NIC 330get_nic_mac() 331{ 332 FOUNDMAC="`ifconfig ${1} | grep 'ether' | tr -d '\t' | cut -d ' ' -f 2`" 333 export FOUNDMAC 334} 335 336# Function which performs the manual setup of a target nic in the cfg 337enable_manual_nic() 338{ 339 # Get the target nic 340 NIC="$1" 341 342 # Check that this NIC exists 343 rc_halt "ifconfig ${NIC}" 344 345 get_value_from_cfg netIP 346 NETIP="${VAL}" 347 348 if [ "$NETIP" = "DHCP" ] 349 then 350 echo_log "Enabling DHCP on $NIC" 351 rc_halt "dhclient ${NIC}" 352 return 0 353 fi 354 355 # If we get here, we have a manual setup, lets do so now 356 357 # IPv4: 358 359 # Set the manual IP 360 if [ -n "${NETIP}" ] 361 then 362 # Check if we have a netmask to set 363 get_value_from_cfg netMask 364 NETMASK="${VAL}" 365 if [ -n "${NETMASK}" ] 366 then 367 rc_halt "ifconfig inet ${NIC} netmask ${NETMASK}" 368 else 369 rc_halt "ifconfig inet ${NIC} ${NETIP}" 370 fi 371 fi 372 373 # Check if we have a default router to set 374 get_value_from_cfg netDefaultRouter 375 NETROUTE="${VAL}" 376 if [ -n "${NETROUTE}" ] 377 then 378 rc_halt "route add -inet default ${NETROUTE}" 379 fi 380 381 # IPv6: 382 383 # Set static IPv6 address 384 get_value_from_cfg netIPv6 385 NETIP="${VAL}" 386 if [ -n ${NETIP} ] 387 then 388 rc_halt "ifconfig inet6 ${NIC} ${NETIP} -ifdisabled up" 389 fi 390 391 # Default router 392 get_value_from_cfg netIPv6DefaultRouter 393 NETROUTE="${VAL}" 394 if [ -n "${NETROUTE}" ] 395 then 396 rc_halt "route add -inet6 default ${NETROUTE}" 397 fi 398 399 # Check if we have a nameserver to enable 400 : >/etc/resolv.conf 401 get_value_from_cfg netNameServer 402 NAMESERVER="${VAL}" 403 if [ -n "${NAMESERVER}" ] 404 then 405 echo "nameserver ${NAMESERVER}" >>/etc/resolv.conf 406 fi 407 get_value_from_cfg netIPv6NameServer 408 NAMESERVER="${VAL}" 409 if [ -n "${NAMESERVER}" ] 410 then 411 echo "nameserver ${NAMESERVER}" >>/etc/resolv.conf 412 fi 413 414}; 415 416 417# Function which parses the cfg and enables networking per specified 418start_networking() 419{ 420 # Check if we have any networking requested 421 get_value_from_cfg netDev 422 if [ -z "${VAL}" ] 423 then 424 return 0 425 fi 426 427 NETDEV="${VAL}" 428 if [ "$NETDEV" = "AUTO-DHCP" ] 429 then 430 enable_auto_dhcp 431 elif [ "$NETDEV" = "IPv6-SLAAC" ] 432 then 433 enable_auto_slaac 434 else 435 enable_manual_nic ${NETDEV} 436 fi 437 438}; 439 440 441# Function which checks the cfg and enables the specified networking on 442# the installed system 443save_networking_install() 444{ 445 446 # Check if we have any networking requested to save 447 get_value_from_cfg netSaveDev 448 if [ -z "${VAL}" ] 449 then 450 return 0 451 fi 452 453 NETDEV="${VAL}" 454 if [ "$NETDEV" = "AUTO-DHCP" ] 455 then 456 save_auto_dhcp 457 elif [ "$NETDEV" = "IPv6-SLAAC" ] 458 then 459 save_auto_slaac 460 else 461 save_manual_nic ${NETDEV} 462 fi 463 464}; 465