diff options
author | dteske <dteske@FreeBSD.org> | 2012-09-18 22:28:42 +0000 |
---|---|---|
committer | dteske <dteske@FreeBSD.org> | 2012-09-18 22:28:42 +0000 |
commit | 282d6b7f2c0f1fb51d911f75ef9989f62e389985 (patch) | |
tree | 3ef909c692976c6a6b0854f8d722182e78ff8915 /usr.sbin/bsdconfig/networking/share/media.subr | |
parent | 969b25f00f504248a5c234274661472d753475ad (diff) | |
download | FreeBSD-src-282d6b7f2c0f1fb51d911f75ef9989f62e389985.zip FreeBSD-src-282d6b7f2c0f1fb51d911f75ef9989f62e389985.tar.gz |
Move major includes into /usr/share/bsdconfig for easy external access.
Reviewed by: adrian (co-mentor)
Approved by: adrian (co-mentor)
Diffstat (limited to 'usr.sbin/bsdconfig/networking/share/media.subr')
-rw-r--r-- | usr.sbin/bsdconfig/networking/share/media.subr | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/usr.sbin/bsdconfig/networking/share/media.subr b/usr.sbin/bsdconfig/networking/share/media.subr new file mode 100644 index 0000000..c546220 --- /dev/null +++ b/usr.sbin/bsdconfig/networking/share/media.subr @@ -0,0 +1,235 @@ +if [ ! "$_NETWORKING_MEDIA_SUBR" ]; then _NETWORKING_MEDIA_SUBR=1 +# +# Copyright (c) 2006-2012 Devin Teske +# All Rights Reserved. +# +# 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 (INLUDING, 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$ +# +############################################################ INCLUDES + +BSDCFG_SHARE="/usr/share/bsdconfig" +. $BSDCFG_SHARE/common.subr || exit 1 +f_include $BSDCFG_SHARE/dialog.subr +f_include $BSDCFG_SHARE/strings.subr +f_include $BSDCFG_SHARE/sysrc.subr +f_include $BSDCFG_SHARE/networking/common.subr + +BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="120.networking" +f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr + +############################################################ FUNCTIONS + +# f_ifconfig_options $interface +# +# Returns any/all extra ifconfig(8) parameters associated with $interface. +# +f_ifconfig_options() +{ + local interface="$1" + [ "$interface" ] || return $SUCCESS + + # + # Loop over the options, removing what we don't want + # + ( + set -- $( f_sysrc_get ifconfig_$interface ) + + # + # Return if the interface is configured for DHCP + # + glob="[Dd][Hh][Cc][Pp]" + case "$*" in + $glob|[Ss][Yy][Nn][Cc]$glob|[Nn][Oo][Ss][Yy][Nn][Cc]$glob) + exit $SUCCESS + esac + + output= + while [ $# -gt 0 ]; do + case "$1" in + inet|netmask) shift 1;; + *) output="$output${output:+ }$1" + esac + shift 1 + done + echo "$output" + ) +} + +# f_ifconfig_media $interface +# +# Returns list of supported media for $interface. +# +f_ifconfig_media() +{ + local interface="$1" + ifconfig -m "$interface" 2> /dev/null | awk \ + ' + BEGIN { media_found = 0 } + { + if ( media_found == 1 ) { print; next } + } + ( $1 $2 == "supported" "media:" ) \ + { + media_found = 1 + next + } + END { exit ! media_found } + ' +} + +# f_dialog_input_options $interface +# +# Input custom interface options. +# +f_dialog_input_options() +{ + local interface="$1" + + # + # Return with-error when there are NFS-mounts currently active. If the + # options are changed while NFS-exported directories are mounted, + # the system may hang (if any NFS mounts are using that interface). + # + if f_nfs_mounted && ! f_jailed; then + local setting="$( printf "$msg_current_options" \ + "$interface" "$options" )" + local message="$( printf "$msg_nfs_mounts_may_cause_hang" \ + "$setting" )" + f_dialog_msgbox "$message" + return $FAILURE + fi + + local msg="$( printf "$msg_please_enter_mediaopts" "$interface" )" + local hline="$hline_alnum_punc_tab_enter" + + $DIALOG \ + --title "$DIALOG_TITLE" \ + --backtitle "$DIALOG_BACKTITLE" \ + --hline "$hline" \ + --ok-label "$msg_ok" \ + --cancel-label "$msg_cancel" \ + --inputbox "$msg" 9 70 \ + "$options" \ + 2> "$DIALOG_TMPDIR/dialog.inputbox.$$" + + local retval=$? + local _options="$( f_dialog_inputstr )" + + [ $retval -eq $SUCCESS ] && options="$_options" + + return $retval +} + +# f_dialog_menu_media_options $interface +# +# Display a menu of additional media options for the given network interface. +# +f_dialog_menu_media_options() +{ + local interface="$1" _options="$2" + # + # Not all network interfaces support additional media options, but + # when available we should prompt the user to select from a list + # of available options (or none, as is the first/default option). + # + + # + # Return with-error when there are NFS-mounts currently active. If the + # media options are changed while NFS-exported directories are mounted, + # the system may hang (if any NFS mounts are using that interface). + # + if f_nfs_mounted && ! f_jailed; then + local setting="$( printf "$msg_current_options" \ + "$interface" "$_options" )" + local message="$( printf "$msg_nfs_mounts_may_cause_hang" \ + "$setting" )" + f_dialog_msgbox "$message" + return $FAILURE + fi + + # + # Build list of additional media options + # + local opt_none="$msg_no_options" + local opt_cust="$msg_custom" + local supported_media="$( + f_ifconfig_media $interface | \ + ( index=1 + + echo "'$( f_substr "$DIALOG_MENU_TAGS" $index 1 )'" + echo "'$opt_none'" + index=$(( $index + 1 )) + + echo "'$( f_substr "$DIALOG_MENU_TAGS" $index 1 )'" + echo "'$opt_cust'" + index=$(( $index + 1 )) + + while read media_options; do + [ $index -lt ${#DIALOG_MENU_TAGS} ] || break + echo "'$( f_substr "$DIALOG_MENU_TAGS" $index 1 )'" + echo "'$media_options'" + index=$(( $index + 1 )) + done + ) + )" + + local msg + if [ "$USE_XDIALOG" ]; then + msg=$( printf "$xmsg_supported_media_options" \ + "$interface" "$interface" ) + else + msg=$( printf "$msg_supported_media_options" \ + "$interface" "$interface" ) + fi + + local hline="$hline_arrows_tab_enter" + + eval $DIALOG \ + --clear --title \"\$DIALOG_TITLE\" \ + --backtitle \"\$DIALOG_BACKTITLE\" \ + --hline \"\$hline\" \ + --ok-label \"\$msg_ok\" \ + --cancel-label \"\$msg_cancel\" \ + --menu \"\$msg\" 21 60 12 \ + $supported_media \ + 2> "$DIALOG_TMPDIR/dialog.menu.$$" + + local retval=$? + if [ $retval -eq $SUCCESS ]; then + local tag="$( f_dialog_menutag )" + options=$( eval f_dialog_menutag2item \"\$tag\" \ + $supported_media ) + [ "$options" = "$opt_none" ] && options= + + if [ "$options" = "$opt_cust" ]; then + options="$_options" + f_dialog_input_options "$interface" + retval=$? + fi + fi + + return $retval +} + +fi # ! $_NETWORKING_MEDIA_SUBR |