xref: /freebsd/usr.sbin/bsdconfig/networking/share/media.subr (revision f8ea072a542112d5e0e74a2d6ecf75d967c3054c)
1ab2043b8SDevin Teskeif [ ! "$_NETWORKING_MEDIA_SUBR" ]; then _NETWORKING_MEDIA_SUBR=1
2ab2043b8SDevin Teske#
3d3a0f918SDevin Teske# Copyright (c) 2006-2013 Devin Teske
4*f8ea072aSDevin Teske# All rights reserved.
5ab2043b8SDevin Teske#
6ab2043b8SDevin Teske# Redistribution and use in source and binary forms, with or without
7ab2043b8SDevin Teske# modification, are permitted provided that the following conditions
8ab2043b8SDevin Teske# are met:
9ab2043b8SDevin Teske# 1. Redistributions of source code must retain the above copyright
10ab2043b8SDevin Teske#    notice, this list of conditions and the following disclaimer.
11ab2043b8SDevin Teske# 2. Redistributions in binary form must reproduce the above copyright
12ab2043b8SDevin Teske#    notice, this list of conditions and the following disclaimer in the
13ab2043b8SDevin Teske#    documentation and/or other materials provided with the distribution.
14ab2043b8SDevin Teske#
15ab2043b8SDevin Teske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16ab2043b8SDevin Teske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE
17ab2043b8SDevin Teske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ab2043b8SDevin Teske# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19ab2043b8SDevin Teske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20ab2043b8SDevin Teske# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21ab2043b8SDevin Teske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22ab2043b8SDevin Teske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23ab2043b8SDevin Teske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24ab2043b8SDevin Teske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25ab2043b8SDevin Teske# SUCH DAMAGE.
26ab2043b8SDevin Teske#
27ab2043b8SDevin Teske# $FreeBSD$
28ab2043b8SDevin Teske#
29ab2043b8SDevin Teske############################################################ INCLUDES
30ab2043b8SDevin Teske
31ab2043b8SDevin TeskeBSDCFG_SHARE="/usr/share/bsdconfig"
32ab2043b8SDevin Teske. $BSDCFG_SHARE/common.subr || exit 1
3356961fd7SDevin Teskef_dprintf "%s: loading includes..." networking/media.subr
34ab2043b8SDevin Teskef_include $BSDCFG_SHARE/dialog.subr
351de60ff0SDevin Teskef_include $BSDCFG_SHARE/networking/common.subr
36ab2043b8SDevin Teskef_include $BSDCFG_SHARE/strings.subr
37ab2043b8SDevin Teskef_include $BSDCFG_SHARE/sysrc.subr
38ab2043b8SDevin Teske
39ab2043b8SDevin TeskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="120.networking"
40ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
41ab2043b8SDevin Teske
42ab2043b8SDevin Teske############################################################ FUNCTIONS
43ab2043b8SDevin Teske
44ab2043b8SDevin Teske# f_ifconfig_options $interface
45ab2043b8SDevin Teske#
46ab2043b8SDevin Teske# Returns any/all extra ifconfig(8) parameters associated with $interface.
47ab2043b8SDevin Teske#
48ab2043b8SDevin Teskef_ifconfig_options()
49ab2043b8SDevin Teske{
50ab2043b8SDevin Teske	local interface="$1"
51ab2043b8SDevin Teske	[ "$interface" ] || return $SUCCESS
52ab2043b8SDevin Teske
53ab2043b8SDevin Teske	#
54ab2043b8SDevin Teske	# Loop over the options, removing what we don't want
55ab2043b8SDevin Teske	#
56ab2043b8SDevin Teske	(
57ab2043b8SDevin Teske		set -- $( f_sysrc_get ifconfig_$interface )
58ab2043b8SDevin Teske
59ab2043b8SDevin Teske		#
60ab2043b8SDevin Teske		# Return if the interface is configured for DHCP
61ab2043b8SDevin Teske		#
62ab2043b8SDevin Teske		glob="[Dd][Hh][Cc][Pp]"
63ab2043b8SDevin Teske		case "$*" in
64ab2043b8SDevin Teske		$glob|[Ss][Yy][Nn][Cc]$glob|[Nn][Oo][Ss][Yy][Nn][Cc]$glob)
65ab2043b8SDevin Teske			exit $SUCCESS
66ab2043b8SDevin Teske		esac
67ab2043b8SDevin Teske
68ab2043b8SDevin Teske		output=
69ab2043b8SDevin Teske		while [ $# -gt 0 ]; do
70ab2043b8SDevin Teske			case "$1" in
71ab2043b8SDevin Teske			inet|netmask) shift 1 ;;
72ab2043b8SDevin Teske			*) output="$output${output:+ }$1"
73ab2043b8SDevin Teske			esac
74ab2043b8SDevin Teske			shift 1
75ab2043b8SDevin Teske		done
76ab2043b8SDevin Teske		echo "$output"
77ab2043b8SDevin Teske	)
78ab2043b8SDevin Teske}
79ab2043b8SDevin Teske
80ab2043b8SDevin Teske# f_ifconfig_media $interface
81ab2043b8SDevin Teske#
82ab2043b8SDevin Teske# Returns list of supported media for $interface.
83ab2043b8SDevin Teske#
84ab2043b8SDevin Teskef_ifconfig_media()
85ab2043b8SDevin Teske{
86ab2043b8SDevin Teske	local interface="$1"
87fb7d723eSDevin Teske	ifconfig -m "$interface" 2> /dev/null | awk \
88ab2043b8SDevin Teske	'
89ab2043b8SDevin Teske		BEGIN { media_found = 0 }
90ab2043b8SDevin Teske		{
91ab2043b8SDevin Teske			if ( media_found == 1 ) { print; next }
92ab2043b8SDevin Teske		}
93ab2043b8SDevin Teske		( $1 $2 == "supported" "media:" ) \
94ab2043b8SDevin Teske		{
95ab2043b8SDevin Teske			media_found = 1
96ab2043b8SDevin Teske			next
97ab2043b8SDevin Teske		}
98ab2043b8SDevin Teske		END { exit ! media_found }
99ab2043b8SDevin Teske	'
100ab2043b8SDevin Teske}
101ab2043b8SDevin Teske
102ab2043b8SDevin Teske# f_dialog_input_options $interface
103ab2043b8SDevin Teske#
104f4844f65SDevin Teske# Input custom interface options. If the user does not press ESC or choose
105f4844f65SDevin Teske# Cancel/No, $options will hold the user's input. Default input is taken from
106f4844f65SDevin Teske# the same variable ($options).
107ab2043b8SDevin Teske#
108ab2043b8SDevin Teskef_dialog_input_options()
109ab2043b8SDevin Teske{
110ab2043b8SDevin Teske	local interface="$1"
111ab2043b8SDevin Teske
112ab2043b8SDevin Teske	#
113ab2043b8SDevin Teske	# Return with-error when there are NFS-mounts currently active. If the
114ab2043b8SDevin Teske	# options are changed while NFS-exported directories are mounted,
115ab2043b8SDevin Teske	# the system may hang (if any NFS mounts are using that interface).
116ab2043b8SDevin Teske	#
117ab2043b8SDevin Teske	if f_nfs_mounted && ! f_jailed; then
118ab2043b8SDevin Teske		local setting="$( printf "$msg_current_options" \
119ab2043b8SDevin Teske		                         "$interface" "$options" )"
12039c22926SDevin Teske		f_noyes "$msg_nfs_mounts_may_cause_hang" "$setting" ||
121ab2043b8SDevin Teske			return $FAILURE
122ab2043b8SDevin Teske	fi
123ab2043b8SDevin Teske
124ab2043b8SDevin Teske	local msg="$( printf "$msg_please_enter_mediaopts" "$interface" )"
125ab2043b8SDevin Teske	local hline="$hline_alnum_punc_tab_enter"
126ab2043b8SDevin Teske
127ec7120b5SDevin Teske	local _options
128ec7120b5SDevin Teske	_options=$( $DIALOG \
129ab2043b8SDevin Teske		--title "$DIALOG_TITLE"         \
130ab2043b8SDevin Teske		--backtitle "$DIALOG_BACKTITLE" \
131ab2043b8SDevin Teske		--hline "$hline"                \
132ab2043b8SDevin Teske		--ok-label "$msg_ok"            \
133ab2043b8SDevin Teske		--cancel-label "$msg_cancel"    \
134ab2043b8SDevin Teske		--inputbox "$msg" 9 70          \
135ab2043b8SDevin Teske		"$options"                      \
13689498fdfSDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
13789498fdfSDevin Teske	)
138ab2043b8SDevin Teske	local retval=$?
139ec7120b5SDevin Teske	f_dialog_line_sanitize _options
140ab2043b8SDevin Teske
141ab2043b8SDevin Teske	[ $retval -eq $SUCCESS ] && options="$_options"
142ab2043b8SDevin Teske
143ab2043b8SDevin Teske	return $retval
144ab2043b8SDevin Teske}
145ab2043b8SDevin Teske
146ab2043b8SDevin Teske# f_dialog_menu_media_options $interface
147ab2043b8SDevin Teske#
148ab2043b8SDevin Teske# Display a menu of additional media options for the given network interface.
149ab2043b8SDevin Teske#
150ab2043b8SDevin Teskef_dialog_menu_media_options()
151ab2043b8SDevin Teske{
152ab2043b8SDevin Teske	local interface="$1" _options="$2"
153ab2043b8SDevin Teske	#
154ab2043b8SDevin Teske	# Not all network interfaces support additional media options, but
155ab2043b8SDevin Teske	# when available we should prompt the user to select from a list
156ab2043b8SDevin Teske	# of available options (or none, as is the first/default option).
157ab2043b8SDevin Teske	#
158ab2043b8SDevin Teske
159ab2043b8SDevin Teske	#
160ab2043b8SDevin Teske	# Return with-error when there are NFS-mounts currently active. If the
161ab2043b8SDevin Teske	# media options are changed while NFS-exported directories are mounted,
162ab2043b8SDevin Teske	# the system may hang (if any NFS mounts are using that interface).
163ab2043b8SDevin Teske	#
164ab2043b8SDevin Teske	if f_nfs_mounted && ! f_jailed; then
165ab2043b8SDevin Teske		local setting="$( printf "$msg_current_options" \
166ab2043b8SDevin Teske		                         "$interface" "$_options" )"
16739c22926SDevin Teske		f_noyes "$msg_nfs_mounts_may_cause_hang" "$setting" ||
168ab2043b8SDevin Teske			return $FAILURE
169ab2043b8SDevin Teske	fi
170ab2043b8SDevin Teske
171ab2043b8SDevin Teske	#
172ab2043b8SDevin Teske	# Build list of additional media options
173ab2043b8SDevin Teske	#
174ab2043b8SDevin Teske	local opt_none="$msg_no_options"
175ab2043b8SDevin Teske	local opt_cust="$msg_custom"
176ab2043b8SDevin Teske	local supported_media="$(
177ab2043b8SDevin Teske		f_ifconfig_media $interface | \
178ab2043b8SDevin Teske		( index=1
179ab2043b8SDevin Teske
180ab2043b8SDevin Teske		  echo "'$( f_substr "$DIALOG_MENU_TAGS" $index 1 )'"
181ab2043b8SDevin Teske		  echo "'$opt_none'"
182ab2043b8SDevin Teske		  index=$(( $index + 1 ))
183ab2043b8SDevin Teske
184ab2043b8SDevin Teske		  echo "'$( f_substr "$DIALOG_MENU_TAGS" $index 1 )'"
185ab2043b8SDevin Teske		  echo "'$opt_cust'"
186ab2043b8SDevin Teske		  index=$(( $index + 1 ))
187ab2043b8SDevin Teske
188ab2043b8SDevin Teske		  while read media_options; do
189ab2043b8SDevin Teske		  	[ $index -lt ${#DIALOG_MENU_TAGS} ] || break
190ab2043b8SDevin Teske		  	echo "'$( f_substr "$DIALOG_MENU_TAGS" $index 1 )'"
191ab2043b8SDevin Teske		  	echo "'$media_options'"
192ab2043b8SDevin Teske		  	index=$(( $index + 1 ))
193ab2043b8SDevin Teske		  done
194ab2043b8SDevin Teske		)
195ab2043b8SDevin Teske	)"
196ab2043b8SDevin Teske
197ab2043b8SDevin Teske	local msg
198ab2043b8SDevin Teske	if [ "$USE_XDIALOG" ]; then
199ab2043b8SDevin Teske		msg=$( printf "$xmsg_supported_media_options" \
200ab2043b8SDevin Teske		       		"$interface" "$interface" )
201ab2043b8SDevin Teske	else
202ab2043b8SDevin Teske		msg=$( printf "$msg_supported_media_options" \
203ab2043b8SDevin Teske		       		"$interface" "$interface" )
204ab2043b8SDevin Teske	fi
205ab2043b8SDevin Teske
206ab2043b8SDevin Teske	local hline="$hline_arrows_tab_enter"
207ab2043b8SDevin Teske
208fd962ac6SDevin Teske	local tag
209fd962ac6SDevin Teske	tag=$( eval $DIALOG \
210d3a0f918SDevin Teske		--title \"\$DIALOG_TITLE\"         \
211ab2043b8SDevin Teske		--backtitle \"\$DIALOG_BACKTITLE\" \
212ab2043b8SDevin Teske		--hline \"\$hline\"                \
213ab2043b8SDevin Teske		--ok-label \"\$msg_ok\"            \
214ab2043b8SDevin Teske		--cancel-label \"\$msg_cancel\"    \
215ab2043b8SDevin Teske		--menu \"\$msg\" 21 60 12          \
216ab2043b8SDevin Teske		$supported_media                   \
21789498fdfSDevin Teske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
21889498fdfSDevin Teske	)
219ab2043b8SDevin Teske	local retval=$?
220fd962ac6SDevin Teske	f_dialog_data_sanitize tag
221fd962ac6SDevin Teske
222ab2043b8SDevin Teske	if [ $retval -eq $SUCCESS ]; then
223ab2043b8SDevin Teske		options=$( eval f_dialog_menutag2item \"\$tag\" \
224ab2043b8SDevin Teske		                                      $supported_media )
22597142e6aSDevin Teske		case "$options" in
22697142e6aSDevin Teske		"$opt_none")
22797142e6aSDevin Teske			options=
22897142e6aSDevin Teske			;;
22997142e6aSDevin Teske		"$opt_cust")
230ab2043b8SDevin Teske			options="$_options"
231ab2043b8SDevin Teske			f_dialog_input_options "$interface"
232ab2043b8SDevin Teske			retval=$?
23397142e6aSDevin Teske			;;
23497142e6aSDevin Teske		esac
235ab2043b8SDevin Teske	fi
236ab2043b8SDevin Teske
237ab2043b8SDevin Teske	return $retval
238ab2043b8SDevin Teske}
239ab2043b8SDevin Teske
24056961fd7SDevin Teske############################################################ MAIN
24156961fd7SDevin Teske
24256961fd7SDevin Teskef_dprintf "%s: Successfully loaded." networking/media.subr
24356961fd7SDevin Teske
244ab2043b8SDevin Teskefi # ! $_NETWORKING_MEDIA_SUBR
245