1238438Sdteskeif [ ! "$_NETWORKING_IPADDR_SUBR" ]; then _NETWORKING_IPADDR_SUBR=1 2238438Sdteske# 3247280Sdteske# Copyright (c) 2006-2013 Devin Teske 4252980Sdteske# All rights reserved. 5238438Sdteske# 6238438Sdteske# Redistribution and use in source and binary forms, with or without 7238438Sdteske# modification, are permitted provided that the following conditions 8238438Sdteske# are met: 9238438Sdteske# 1. Redistributions of source code must retain the above copyright 10238438Sdteske# notice, this list of conditions and the following disclaimer. 11238438Sdteske# 2. Redistributions in binary form must reproduce the above copyright 12238438Sdteske# notice, this list of conditions and the following disclaimer in the 13238438Sdteske# documentation and/or other materials provided with the distribution. 14238438Sdteske# 15238438Sdteske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16252987Sdteske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17238438Sdteske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18238438Sdteske# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19238438Sdteske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20252987Sdteske# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21238438Sdteske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22238438Sdteske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23238438Sdteske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24238438Sdteske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25238438Sdteske# SUCH DAMAGE. 26238438Sdteske# 27238438Sdteske# $FreeBSD$ 28238438Sdteske# 29238438Sdteske############################################################ INCLUDES 30238438Sdteske 31240684SdteskeBSDCFG_SHARE="/usr/share/bsdconfig" 32240684Sdteske. $BSDCFG_SHARE/common.subr || exit 1 33244675Sdteskef_dprintf "%s: loading includes..." networking/ipaddr.subr 34240684Sdteskef_include $BSDCFG_SHARE/dialog.subr 35252077Sdteskef_include $BSDCFG_SHARE/networking/common.subr 36240684Sdteskef_include $BSDCFG_SHARE/strings.subr 37238438Sdteske 38240684SdteskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="120.networking" 39238438Sdteskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr 40238438Sdteske 41238438Sdteske############################################################ FUNCTIONS 42238438Sdteske 43243504Sdteske# f_dialog_iperror $error $ipaddr 44243504Sdteske# 45243504Sdteske# Display a msgbox with the appropriate error message for an error returned by 46247280Sdteske# the f_validate_ipaddr function. 47243504Sdteske# 48243504Sdteskef_dialog_iperror() 49243504Sdteske{ 50243504Sdteske local error="$1" ip="$2" 51238438Sdteske 52243504Sdteske [ ${error:-0} -ne 0 ] || return $SUCCESS 53243504Sdteske 54243504Sdteske case "$error" in 55252178Sdteske 1) f_show_msg "$msg_ipv4_addr_octet_contains_invalid_chars" "$ip" ;; 56252178Sdteske 2) f_show_msg "$msg_ipv4_addr_octet_is_null" "$ip" ;; 57252178Sdteske 3) f_show_msg "$msg_ipv4_addr_octet_exceeds_max_value" "$ip" ;; 58252178Sdteske 4) f_show_msg "$msg_ipv4_addr_octet_missing_or_extra" "$ip" ;; 59238438Sdteske esac 60243504Sdteske} 61238438Sdteske 62243504Sdteske# f_dialog_validate_ipaddr $ipaddr 63243504Sdteske# 64243504Sdteske# Returns zero if the given argument (an IP address) is of the proper format. 65243504Sdteske# 66243504Sdteske# If the IP address is determined to be invalid, the appropriate error will be 67243504Sdteske# displayed using the f_dialog_iperror function above. 68243504Sdteske# 69243504Sdteskef_dialog_validate_ipaddr() 70243504Sdteske{ 71243504Sdteske local ip="$1" 72243504Sdteske 73243504Sdteske f_validate_ipaddr "$ip" 74243504Sdteske local retval=$? 75243504Sdteske 76243504Sdteske # Produce an appropriate error message if necessary. 77243504Sdteske [ $retval -eq $SUCCESS ] || f_dialog_iperror $retval "$ip" 78243504Sdteske 79238438Sdteske return $retval 80238438Sdteske} 81238438Sdteske 82243504Sdteske# f_dialog_ip6error $error $ipv6_addr 83243504Sdteske# 84243504Sdteske# Display a msgbox with the appropriate error message for an error returned by 85243634Sdteske# the f_validate_ipaddr6 function above. 86243504Sdteske# 87243504Sdteskef_dialog_ip6error() 88243504Sdteske{ 89243504Sdteske local error="$1" ip="$2" 90243504Sdteske 91243504Sdteske [ ${error:-0} -ne 0 ] || return $SUCCESS 92243504Sdteske 93243504Sdteske case "$error" in 94252178Sdteske 1) f_show_msg "$msg_ipv6_addr_segment_contains_invalid_chars" "$ip" ;; 95252178Sdteske 2) f_show_msg "$msg_ipv6_addr_too_many_null_segments" "$ip" ;; 96252178Sdteske 3) f_show_msg "$msg_ipv6_addr_segment_contains_too_many_chars" "$ip" ;; 97252178Sdteske 4) f_show_msg "$msg_ipv6_addr_too_few_or_extra_segments" "$ip" ;; 98243504Sdteske *) 99243504Sdteske if [ $(( $error & 0xF )) -eq 5 ]; then 100243504Sdteske # IPv4 at the end of IPv6 address is invalid 101243504Sdteske f_dialog_iperror $(( $error >> 4 )) "$ip" 102243504Sdteske fi 103243475Sdteske esac 104243504Sdteske} 105243475Sdteske 106243504Sdteske# f_dialog_validate_ipaddr6 $ipv6_addr 107243504Sdteske# 108243504Sdteske# Returns zero if the given argument (an IPv6 address) is of the proper format. 109243504Sdteske# 110243504Sdteske# If the IP address is determined to be invalid, the appropriate error will be 111243504Sdteske# displayed using the f_dialog_ip6error function above. 112243504Sdteske# 113243504Sdteskef_dialog_validate_ipaddr6() 114243504Sdteske{ 115243504Sdteske local ip="$1" 116243504Sdteske 117243504Sdteske f_validate_ipaddr6 "$ip" 118243504Sdteske local retval=$? 119243504Sdteske 120243504Sdteske # Produce an appropriate error message if necessary. 121243504Sdteske [ $retval -eq $SUCCESS ] || f_dialog_ip6error $retval "$ip" 122243504Sdteske 123243475Sdteske return $retval 124243475Sdteske} 125243475Sdteske 126238438Sdteske# f_dialog_input_ipaddr $interface $ipaddr 127238438Sdteske# 128238438Sdteske# Allows the user to edit a given IP address. If the user does not cancel or 129238438Sdteske# press ESC, the $ipaddr environment variable will hold the newly-configured 130238438Sdteske# value upon return. 131238438Sdteske# 132238438Sdteske# Optionally, the user can enter the format "IP_ADDRESS/NBITS" to set the 133238438Sdteske# netmask at the same time as the IP address. If such a format is entered by 134238438Sdteske# the user, the $netmask environment variable will hold the newly-configured 135238438Sdteske# netmask upon return. 136238438Sdteske# 137238438Sdteskef_dialog_input_ipaddr() 138238438Sdteske{ 139238438Sdteske local interface="$1" _ipaddr="$2" _input 140238438Sdteske 141238438Sdteske # 142238438Sdteske # Return with-error when there are NFS-mounts currently active. If the 143238438Sdteske # IP address is changed while NFS-exported directories are mounted, the 144238438Sdteske # system may hang (if any NFS mounts are using that interface). 145238438Sdteske # 146238438Sdteske if f_nfs_mounted && ! f_jailed; then 147260678Sdteske local setting 148260678Sdteske f_sprintf setting "$msg_current_ipaddr" "$interface" "$_ipaddr" 149252853Sdteske f_noyes "$msg_nfs_mounts_may_cause_hang" "$setting" || 150256181Sdteske return $DIALOG_CANCEL 151238438Sdteske fi 152238438Sdteske 153260678Sdteske local msg 154260678Sdteske f_sprintf msg "$msg_please_enter_new_ip_addr" "$interface" 155238438Sdteske 156238438Sdteske # 157238438Sdteske # Loop until the user provides taint-free input. 158238438Sdteske # 159244548Sdteske local retval 160238438Sdteske while :; do 161238438Sdteske # 162238438Sdteske # Return error status if: 163244548Sdteske # - User has either pressed ESC or chosen Cancel/No 164238438Sdteske # - User has not made any changes to the given value 165238438Sdteske # 166251242Sdteske f_dialog_input _input "$msg" "$_ipaddr" \ 167256181Sdteske "$hline_num_punc_tab_enter" || return $? 168256181Sdteske [ "$_ipaddr" = "$_input" ] && return $DIALOG_CANCEL 169238438Sdteske 170238438Sdteske # Return success if NULL value was entered 171256181Sdteske [ "$_input" ] || return $DIALOG_OK 172238438Sdteske 173238438Sdteske # Take only the first "word" of the user's input 174238438Sdteske _ipaddr="$_input" 175238438Sdteske _ipaddr="${_ipaddr%%[$IFS]*}" 176238438Sdteske 177238438Sdteske # Taint-check the user's input 178238438Sdteske f_dialog_validate_ipaddr "${_ipaddr%%/*}" && break 179238438Sdteske done 180238438Sdteske 181238438Sdteske # 182238438Sdteske # Support the syntax: IP_ADDRESS/NBITS 183238438Sdteske # 184238438Sdteske local _netmask="" 185238438Sdteske case "$_ipaddr" in 186238438Sdteske */*) 187238438Sdteske local nbits="${_ipaddr#*/}" n=0 188238438Sdteske _ipaddr="${_ipaddr%%/*}" 189238438Sdteske 190238438Sdteske # 191238438Sdteske # Taint-check $nbits to be (a) a positive whole-integer, 192238438Sdteske # and (b) to be less than or equal to 32. Otherwise, set 193238438Sdteske # $n so that the below loop never executes. 194238438Sdteske # 195238438Sdteske ( f_isinteger "$nbits" && [ $nbits -ge 0 -a $nbits -le 32 ] ) \ 196238438Sdteske || n=4 197238438Sdteske 198238438Sdteske while [ $n -lt 4 ]; do 199238438Sdteske _netmask="$_netmask${_netmask:+.}$(( 200238438Sdteske (65280 >> ($nbits - 8 * $n) & 255) 201238438Sdteske * ((8*$n) < $nbits & $nbits <= (8*($n+1))) 202238438Sdteske + 255 * ($nbits > (8*($n+1))) 203238438Sdteske ))" 204238438Sdteske n=$(( $n + 1 )) 205238438Sdteske done 206238438Sdteske ;; 207238438Sdteske esac 208238438Sdteske 209238438Sdteske ipaddr="$_ipaddr" 210238438Sdteske [ "$_netmask" ] && netmask="$_netmask" 211238438Sdteske 212256181Sdteske return $DIALOG_OK 213238438Sdteske} 214238438Sdteske 215244675Sdteske############################################################ MAIN 216244675Sdteske 217244675Sdteskef_dprintf "%s: Successfully loaded." networking/ipaddr.subr 218244675Sdteske 219238438Sdteskefi # ! $_NETWORKING_IPADDR_SUBR 220