1#!/bin/sh 2#- 3# Copyright (c) 2006-2013 Devin Teske 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 1. Redistributions of source code must retain the above copyright 10# notice, this list of conditions and the following disclaimer. 11# 2. Redistributions in binary form must reproduce the above copyright 12# notice, this list of conditions and the following disclaimer in the 13# documentation and/or other materials provided with the distribution. 14# 15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25# SUCH DAMAGE. 26# 27# $FreeBSD$ 28# 29############################################################ INCLUDES 30 31# Prevent device.subr (included indirectly) from auto scanning; this will be 32# performed indirectly later via f_dialog_menu_netdev() -- but only after we've 33# successfully completed f_mustberoot_init(). 34# 35DEVICE_SELF_SCAN_ALL=NO 36 37BSDCFG_SHARE="/usr/share/bsdconfig" 38. $BSDCFG_SHARE/common.subr || exit 1 39f_dprintf "%s: loading includes..." "$0" 40f_include $BSDCFG_SHARE/dialog.subr 41f_include $BSDCFG_SHARE/mustberoot.subr 42f_include $BSDCFG_SHARE/sysrc.subr 43f_include $BSDCFG_SHARE/media/tcpip.subr 44f_include $BSDCFG_SHARE/networking/device.subr 45f_include $BSDCFG_SHARE/networking/ipaddr.subr 46f_include $BSDCFG_SHARE/networking/media.subr 47f_include $BSDCFG_SHARE/networking/netmask.subr 48 49BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="120.networking" 50f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr 51 52f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" ipgm && 53 pgm="${ipgm:-$pgm}" 54 55############################################################ MAIN 56 57# Incorporate rc-file if it exists 58[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc" 59 60# 61# Process command-line options 62# 63while getopts h$GETOPTS_STDARGS flag; do 64 case "$flag" in 65 h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm" ;; 66 esac 67done 68shift $(( $OPTIND - 1 )) 69 70# 71# Initialize 72# 73f_dialog_title "$msg_networking_devices" 74f_dialog_backtitle "${ipgm:+bsdconfig }$pgm" 75f_mustberoot_init 76 77# 78# Launch application main menu 79# 80defaultitem= 81while :; do 82 f_dialog_menu_netdev "$defaultitem" || break 83 f_dialog_menutag_fetch interface 84 defaultitem="$interface" 85 86 # 87 # dialog_menu_netdev adds an asterisk (*) to the right of the 88 # device name if the interface is active. Remove the asterisk 89 # from the device name if present. 90 # 91 case "$interface" in 92 *\*) interface="${interface%?}" ;; 93 esac 94 95 # 96 # Obtain initial interface settings to be configured. These will be 97 # passed to the f_dialog_menu_netdev_edit function-call below which 98 # will block until the user has either cancelled or finished editing 99 # the values. 100 # 101 # First, attempt to read stored configuration from rc.conf(5) and 102 # fallback to reading the active configuration if not configured in 103 # the rc.conf(5) file(s). 104 # 105 dhcp= 106 _ipaddr= 107 _netmask= 108 _ifconfig=$( f_sysrc_get ifconfig_$interface ) 109 if [ "$_ifconfig" ]; then 110 # If DHCP, get IP address/netmask later from ifconfig(8) 111 glob="[Dd][Hh][Cc][Pp]" 112 case "$_ifconfig" in 113 $glob) dhcp=1 ;; 114 [Ss][Yy][Nn][Cc]$glob) dhcp=1 ;; 115 [Nn][Oo][Ss][Yy][Nn][Cc]$glob) dhcp=1 ;; 116 *) 117 # 118 # Get IP address/netmask from rc.conf(5) configuration 119 # 120 dhcp= 121 eval "$( 122 exec 2> /dev/null 123 set -- $_ifconfig 124 while [ $# -gt 0 ]; do 125 case "$1" in 126 inet) 127 shift 1 128 echo "_ipaddr='$1'" 129 ;; 130 netmask) 131 shift 1 132 echo "_netmask='$1'" 133 ;; 134 esac 135 shift 1 136 done 137 )" 138 ;; 139 esac 140 fi 141 142 # 143 # Fill in IP address/netmask from active settings if no 144 # configuration could be extrapolated from rc.conf(5) 145 # 146 [ "$_ipaddr" ] || f_ifconfig_inet $interface _ipaddr 147 [ "$_netmask" ] || f_ifconfig_netmask $interface _netmask 148 149 # Get the extra options (this always comes from rc.conf(5)) 150 _options=$( f_ifconfig_options $interface ) 151 152 # Block on user-configuration of the probed settings 153 f_dialog_menu_netdev_edit \ 154 "$interface" "$_ipaddr" "$_netmask" "$_options" $dhcp 155 156 # Return to root menu if above returns success 157 [ $? -eq $DIALOG_OK ] && break 158done 159 160exit $SUCCESS 161 162################################################################################ 163# END 164################################################################################ 165