diff options
Diffstat (limited to 'bsdconfig/share')
37 files changed, 0 insertions, 17300 deletions
diff --git a/bsdconfig/share/Makefile b/bsdconfig/share/Makefile deleted file mode 100644 index a09697a29d0d..000000000000 --- a/bsdconfig/share/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# $FreeBSD$ - -SUBDIR= media packages - -FILESDIR= ${SHAREDIR}/bsdconfig -FILES= common.subr device.subr dialog.subr geom.subr keymap.subr \ - mustberoot.subr script.subr strings.subr struct.subr \ - sysrc.subr variable.subr - -.include <bsd.prog.mk> diff --git a/bsdconfig/share/Makefile.depend b/bsdconfig/share/Makefile.depend deleted file mode 100644 index f80275d86ab1..000000000000 --- a/bsdconfig/share/Makefile.depend +++ /dev/null @@ -1,11 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - - -.include <dirdeps.mk> - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif diff --git a/bsdconfig/share/common.subr b/bsdconfig/share/common.subr deleted file mode 100644 index 49b9186f548f..000000000000 --- a/bsdconfig/share/common.subr +++ /dev/null @@ -1,1046 +0,0 @@ -if [ ! "$_COMMON_SUBR" ]; then _COMMON_SUBR=1 -# -# Copyright (c) 2012 Ron McDowell -# Copyright (c) 2012-2016 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 (INCLUDING, 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$ -# -############################################################ CONFIGURATION - -# -# Default file descriptors to link to stdout/stderr for passthru allowing -# redirection within a sub-shell to bypass directly to the terminal. -# -: ${TERMINAL_STDOUT_PASSTHRU:=3} -: ${TERMINAL_STDERR_PASSTHRU:=4} - -############################################################ GLOBALS - -# -# Program name -# -pgm="${0##*/}" - -# -# Program arguments -# -ARGC="$#" -ARGV="$@" - -# -# Global exit status variables -# -SUCCESS=0 -FAILURE=1 - -# -# Operating environment details -# -export UNAME_S="$( uname -s )" # Operating System (i.e. FreeBSD) -export UNAME_P="$( uname -p )" # Processor Architecture (i.e. i386) -export UNAME_M="$( uname -m )" # Machine platform (i.e. i386) -export UNAME_R="$( uname -r )" # Release Level (i.e. X.Y-RELEASE) - -# -# Default behavior is to call f_debug_init() automatically when loaded. -# -: ${DEBUG_SELF_INITIALIZE=1} - -# -# Default behavior of f_debug_init() is to truncate $debugFile (set to NULL to -# disable truncating the debug file when initializing). To get child processes -# to append to the same log file, export this variarable (with a NULL value) -# and also export debugFile with the desired value. -# -: ${DEBUG_INITIALIZE_FILE=1} - -# -# Define standard optstring arguments that should be supported by all programs -# using this include (unless DEBUG_SELF_INITIALIZE is set to NULL to prevent -# f_debug_init() from autamatically processing "$@" for the below arguments): -# -# d Sets $debug to 1 -# D: Sets $debugFile to $OPTARG -# -GETOPTS_STDARGS="dD:" - -# -# The getopts builtin will return 1 either when the end of "$@" or the first -# invalid flag is reached. This makes it impossible to determine if you've -# processed all the arguments or simply have hit an invalid flag. In the cases -# where we want to tolerate invalid flags (f_debug_init() for example), the -# following variable can be appended to your optstring argument to getopts, -# preventing it from prematurely returning 1 before the end of the arguments. -# -# NOTE: This assumes that all unknown flags are argument-less. -# -GETOPTS_ALLFLAGS="abcdefghijklmnopqrstuvwxyz" -GETOPTS_ALLFLAGS="${GETOPTS_ALLFLAGS}ABCDEFGHIJKLMNOPQRSTUVWXYZ" -GETOPTS_ALLFLAGS="${GETOPTS_ALLFLAGS}0123456789" - -# -# When we get included, f_debug_init() will fire (unless $DEBUG_SELF_INITIALIZE -# is set to disable automatic initialization) and process "$@" for a few global -# options such as `-d' and/or `-D file'. However, if your program takes custom -# flags that take arguments, this automatic processing may fail unexpectedly. -# -# The solution to this problem is to pre-define (before including this file) -# the following variable (which defaults to NULL) to indicate that there are -# extra flags that should be considered when performing automatic processing of -# globally persistent flags. -# -: ${GETOPTS_EXTRA:=} - -############################################################ FUNCTIONS - -# f_dprintf $format [$arguments ...] -# -# Sensible debug function. Override in ~/.bsdconfigrc if desired. -# See /usr/share/examples/bsdconfig/bsdconfigrc for example. -# -# If $debug is set and non-NULL, prints DEBUG info using printf(1) syntax: -# + To $debugFile, if set and non-NULL -# + To standard output if $debugFile is either NULL or unset -# + To both if $debugFile begins with a single plus-sign (`+') -# -f_dprintf() -{ - [ "$debug" ] || return $SUCCESS - local fmt="$1"; shift - case "$debugFile" in ""|+*) - printf "DEBUG: $fmt${fmt:+\n}" "$@" >&${TERMINAL_STDOUT_PASSTHRU:-1} - esac - [ "${debugFile#+}" ] && - printf "DEBUG: $fmt${fmt:+\n}" "$@" >> "${debugFile#+}" - return $SUCCESS -} - -# f_debug_init -# -# Initialize debugging. Truncates $debugFile to zero bytes if set. -# -f_debug_init() -{ - # - # Process stored command-line arguments - # - set -- $ARGV - local OPTIND OPTARG flag - f_dprintf "f_debug_init: ARGV=[%s] GETOPTS_STDARGS=[%s]" \ - "$ARGV" "$GETOPTS_STDARGS" - while getopts "$GETOPTS_STDARGS$GETOPTS_EXTRA$GETOPTS_ALLFLAGS" flag \ - > /dev/null; do - case "$flag" in - d) debug=1 ;; - D) debugFile="$OPTARG" ;; - esac - done - shift $(( $OPTIND - 1 )) - f_dprintf "f_debug_init: debug=[%s] debugFile=[%s]" \ - "$debug" "$debugFile" - - # - # Automagically enable debugging if debugFile is set (and non-NULL) - # - [ "$debugFile" ] && { [ "${debug+set}" ] || debug=1; } - - # - # Make debugging persistent if set - # - [ "$debug" ] && export debug - [ "$debugFile" ] && export debugFile - - # - # Truncate debug file unless requested otherwise. Note that we will - # trim a leading plus (`+') from the value of debugFile to support - # persistent meaning that f_dprintf() should print both to standard - # output and $debugFile (minus the leading plus, of course). - # - local _debug_file="${debugFile#+}" - if [ "$_debug_file" -a "$DEBUG_INITIALIZE_FILE" ]; then - if ( umask 022 && :> "$_debug_file" ); then - f_dprintf "Successfully initialized debugFile \`%s'" \ - "$_debug_file" - f_isset debug || debug=1 # turn debugging on if not set - else - unset debugFile - f_dprintf "Unable to initialize debugFile \`%s'" \ - "$_debug_file" - fi - fi -} - -# f_err $format [$arguments ...] -# -# Print a message to stderr (fd=2). -# -f_err() -{ - printf "$@" >&2 -} - -# f_quietly $command [$arguments ...] -# -# Run a command quietly (quell any output to stdout or stderr) -# -f_quietly() -{ - "$@" > /dev/null 2>&1 -} - -# f_have $anything ... -# -# A wrapper to the `type' built-in. Returns true if argument is a valid shell -# built-in, keyword, or externally-tracked binary, otherwise false. -# -f_have() -{ - f_quietly type "$@" -} - -# setvar $var_to_set [$value] -# -# Implement setvar for shells unlike FreeBSD sh(1). -# -if ! f_have setvar; then -setvar() -{ - [ $# -gt 0 ] || return $SUCCESS - local __setvar_var_to_set="$1" __setvar_right="$2" __setvar_left= - case $# in - 1) unset "$__setvar_var_to_set" - return $? ;; - 2) : fall through ;; - *) f_err "setvar: too many arguments\n" - return $FAILURE - esac - case "$__setvar_var_to_set" in *[!0-9A-Za-z_]*) - f_err "setvar: %s: bad variable name\n" "$__setvar_var_to_set" - return 2 - esac - while case "$__setvar_r" in *\'*) : ;; *) false ; esac - do - __setvar_left="$__setvar_left${__setvar_right%%\'*}'\\''" - __setvar_right="${__setvar_right#*\'}" - done - __setvar_left="$__setvar_left${__setvar_right#*\'}" - eval "$__setvar_var_to_set='$__setvar_left'" -} -fi - -# f_which $anything [$var_to_set] -# -# A fast built-in replacement for syntaxes such as foo=$( which bar ). In a -# comparison of 10,000 runs of this function versus which, this function -# completed in under 3 seconds, while `which' took almost a full minute. -# -# If $var_to_set is missing or NULL, output is (like which) to standard out. -# Returns success if a match was found, failure otherwise. -# -f_which() -{ - local __name="$1" __var_to_set="$2" - case "$__name" in */*|'') return $FAILURE; esac - local __p __exec IFS=":" __found= - for __p in $PATH; do - __exec="$__p/$__name" - [ -f "$__exec" -a -x "$__exec" ] && __found=1 break - done - if [ "$__found" ]; then - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__exec" - else - echo "$__exec" - fi - return $SUCCESS - fi - return $FAILURE -} - -# f_getvar $var_to_get [$var_to_set] -# -# Utility function designed to go along with the already-builtin setvar. -# Allows clean variable name indirection without forking or sub-shells. -# -# Returns error status if the requested variable ($var_to_get) is not set. -# -# If $var_to_set is missing or NULL, the value of $var_to_get is printed to -# standard output for capturing in a sub-shell (which is less-recommended -# because of performance degredation; for example, when called in a loop). -# -f_getvar() -{ - local __var_to_get="$1" __var_to_set="$2" - [ "$__var_to_set" ] || local value - eval [ \"\${$__var_to_get+set}\" ] - local __retval=$? - eval ${__var_to_set:-value}=\"\${$__var_to_get}\" - eval f_dprintf '"f_getvar: var=[%s] value=[%s] r=%u"' \ - \"\$__var_to_get\" \"\$${__var_to_set:-value}\" \$__retval - [ "$__var_to_set" ] || { [ "$value" ] && echo "$value"; } - return $__retval -} - -# f_isset $var -# -# Check if variable $var is set. Returns success if variable is set, otherwise -# returns failure. -# -f_isset() -{ - eval [ \"\${${1%%[$IFS]*}+set}\" ] -} - -# f_die [$status [$format [$arguments ...]]] -# -# Abruptly terminate due to an error optionally displaying a message in a -# dialog box using printf(1) syntax. -# -f_die() -{ - local status=$FAILURE - - # If there is at least one argument, take it as the status - if [ $# -gt 0 ]; then - status=$1 - shift 1 # status - fi - - # If there are still arguments left, pass them to f_show_msg - [ $# -gt 0 ] && f_show_msg "$@" - - # Optionally call f_clean_up() function if it exists - f_have f_clean_up && f_clean_up - - exit $status -} - -# f_interrupt -# -# Interrupt handler. -# -f_interrupt() -{ - exec 2>&1 # fix sh(1) bug where stderr gets lost within async-trap - f_die -} - -# f_show_info $format [$arguments ...] -# -# Display a message in a dialog infobox using printf(1) syntax. -# -f_show_info() -{ - local msg - msg=$( printf "$@" ) - - # - # Use f_dialog_infobox from dialog.subr if possible, otherwise fall - # back to dialog(1) (without options, making it obvious when using - # un-aided system dialog). - # - if f_have f_dialog_info; then - f_dialog_info "$msg" - else - dialog --infobox "$msg" 0 0 - fi -} - -# f_show_msg $format [$arguments ...] -# -# Display a message in a dialog box using printf(1) syntax. -# -f_show_msg() -{ - local msg - msg=$( printf "$@" ) - - # - # Use f_dialog_msgbox from dialog.subr if possible, otherwise fall - # back to dialog(1) (without options, making it obvious when using - # un-aided system dialog). - # - if f_have f_dialog_msgbox; then - f_dialog_msgbox "$msg" - else - dialog --msgbox "$msg" 0 0 - fi -} - -# f_show_err $format [$arguments ...] -# -# Display a message in a dialog box with ``Error'' i18n title (overridden by -# setting msg_error) using printf(1) syntax. -# -f_show_err() -{ - local msg - msg=$( printf "$@" ) - - : ${msg:=${msg_an_unknown_error_occurred:-An unknown error occurred}} - - if [ "$_DIALOG_SUBR" ]; then - f_dialog_title "${msg_error:-Error}" - f_dialog_msgbox "$msg" - f_dialog_title_restore - else - dialog --title "${msg_error:-Error}" --msgbox "$msg" 0 0 - fi - return $SUCCESS -} - -# f_yesno $format [$arguments ...] -# -# Display a message in a dialog yes/no box using printf(1) syntax. -# -f_yesno() -{ - local msg - msg=$( printf "$@" ) - - # - # Use f_dialog_yesno from dialog.subr if possible, otherwise fall - # back to dialog(1) (without options, making it obvious when using - # un-aided system dialog). - # - if f_have f_dialog_yesno; then - f_dialog_yesno "$msg" - else - dialog --yesno "$msg" 0 0 - fi -} - -# f_noyes $format [$arguments ...] -# -# Display a message in a dialog yes/no box using printf(1) syntax. -# NOTE: THis is just like the f_yesno function except "No" is default. -# -f_noyes() -{ - local msg - msg=$( printf "$@" ) - - # - # Use f_dialog_noyes from dialog.subr if possible, otherwise fall - # back to dialog(1) (without options, making it obvious when using - # un-aided system dialog). - # - if f_have f_dialog_noyes; then - f_dialog_noyes "$msg" - else - dialog --defaultno --yesno "$msg" 0 0 - fi -} - -# f_show_help $file -# -# Display a language help-file. Automatically takes $LANG and $LC_ALL into -# consideration when displaying $file (suffix ".$LC_ALL" or ".$LANG" will -# automatically be added prior to loading the language help-file). -# -# If a language has been requested by setting either $LANG or $LC_ALL in the -# environment and the language-specific help-file does not exist we will fall -# back to $file without-suffix. -# -# If the language help-file does not exist, an error is displayed instead. -# -f_show_help() -{ - local file="$1" - local lang="${LANG:-$LC_ALL}" - - [ -f "$file.$lang" ] && file="$file.$lang" - - # - # Use f_dialog_textbox from dialog.subr if possible, otherwise fall - # back to dialog(1) (without options, making it obvious when using - # un-aided system dialog). - # - if f_have f_dialog_textbox; then - f_dialog_textbox "$file" - else - dialog --msgbox "$( cat "$file" 2>&1 )" 0 0 - fi -} - -# f_include $file -# -# Include a shell subroutine file. -# -# If the subroutine file exists but returns error status during loading, exit -# is called and execution is prematurely terminated with the same error status. -# -f_include() -{ - local file="$1" - f_dprintf "f_include: file=[%s]" "$file" - . "$file" || exit $? -} - -# f_include_lang $file -# -# Include a language file. Automatically takes $LANG and $LC_ALL into -# consideration when including $file (suffix ".$LC_ALL" or ".$LANG" will -# automatically by added prior to loading the language file). -# -# No error is produced if (a) a language has been requested (by setting either -# $LANG or $LC_ALL in the environment) and (b) the language file does not -# exist -- in which case we will fall back to loading $file without-suffix. -# -# If the language file exists but returns error status during loading, exit -# is called and execution is prematurely terminated with the same error status. -# -f_include_lang() -{ - local file="$1" - local lang="${LANG:-$LC_ALL}" - - f_dprintf "f_include_lang: file=[%s] lang=[%s]" "$file" "$lang" - if [ -f "$file.$lang" ]; then - . "$file.$lang" || exit $? - else - . "$file" || exit $? - fi -} - -# f_usage $file [$key1 $value1 ...] -# -# Display USAGE file with optional pre-processor macro definitions. The first -# argument is the template file containing the usage text to be displayed. If -# $LANG or $LC_ALL (in order of preference, respectively) is set, ".encoding" -# will automatically be appended as a suffix to the provided $file pathname. -# -# When processing $file, output begins at the first line containing that is -# (a) not a comment, (b) not empty, and (c) is not pure-whitespace. All lines -# appearing after this first-line are output, including (a) comments (b) empty -# lines, and (c) lines that are purely whitespace-only. -# -# If additional arguments appear after $file, substitutions are made while -# printing the contents of the USAGE file. The pre-processor macro syntax is in -# the style of autoconf(1), for example: -# -# f_usage $file "FOO" "BAR" -# -# Will cause instances of "@FOO@" appearing in $file to be replaced with the -# text "BAR" before being printed to the screen. -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_usage_awk=' -BEGIN { found = 0 } -{ - if ( !found && $0 ~ /^[[:space:]]*($|#)/ ) next - found = 1 - print -} -' -f_usage() -{ - local file="$1" - local lang="${LANG:-$LC_ALL}" - - f_dprintf "f_usage: file=[%s] lang=[%s]" "$file" "$lang" - - shift 1 # file - - local usage - if [ -f "$file.$lang" ]; then - usage=$( awk "$f_usage_awk" "$file.$lang" ) || exit $FAILURE - else - usage=$( awk "$f_usage_awk" "$file" ) || exit $FAILURE - fi - - while [ $# -gt 0 ]; do - local key="$1" - export value="$2" - usage=$( echo "$usage" | awk \ - "{ gsub(/@$key@/, ENVIRON[\"value\"]); print }" ) - shift 2 - done - - f_err "%s\n" "$usage" - - exit $FAILURE -} - -# f_index_file $keyword [$var_to_set] -# -# Process all INDEX files known to bsdconfig and return the path to first file -# containing a menu_selection line with a keyword portion matching $keyword. -# -# If $LANG or $LC_ALL (in order of preference, respectively) is set, -# "INDEX.encoding" files will be searched first. -# -# If no file is found, error status is returned along with the NULL string. -# -# If $var_to_set is NULL or missing, output is printed to stdout (which is less -# recommended due to performance degradation; in a loop for example). -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_index_file_awk=' -# Variables that should be defined on the invocation line: -# -v keyword="keyword" -BEGIN { found = 0 } -( $0 ~ "^menu_selection=\"" keyword "\\|" ) { - print FILENAME - found++ - exit -} -END { exit ! found } -' -f_index_file() -{ - local __keyword="$1" __var_to_set="$2" - local __lang="${LANG:-$LC_ALL}" - local __indexes="$BSDCFG_LIBE${BSDCFG_LIBE:+/}*/INDEX" - - f_dprintf "f_index_file: keyword=[%s] lang=[%s]" "$__keyword" "$__lang" - - if [ "$__lang" ]; then - if [ "$__var_to_set" ]; then - eval "$__var_to_set"='"$( awk -v keyword="$__keyword" \ - "$f_index_file_awk" $__indexes.$__lang - )"' && return $SUCCESS - else - awk -v keyword="$__keyword" "$f_index_file_awk" \ - $__indexes.$__lang && return $SUCCESS - fi - # No match, fall-thru to non-i18n sources - fi - if [ "$__var_to_set" ]; then - eval "$__var_to_set"='"$( awk -v keyword="$__keyword" \ - "$f_index_file_awk" $__indexes )"' && return $SUCCESS - else - awk -v keyword="$__keyword" "$f_index_file_awk" $__indexes && - return $SUCCESS - fi - - # No match? Fall-thru to `local' libexec sources (add-on modules) - - [ "$BSDCFG_LOCAL_LIBE" ] || return $FAILURE - __indexes="$BSDCFG_LOCAL_LIBE/*/INDEX" - if [ "$__lang" ]; then - if [ "$__var_to_set" ]; then - eval "$__var_to_set"='"$( awk -v keyword="$__keyword" \ - "$f_index_file_awk" $__indexes.$__lang - )"' && return $SUCCESS - else - awk -v keyword="$__keyword" "$f_index_file_awk" \ - $__indexes.$__lang && return $SUCCESS - fi - # No match, fall-thru to non-i18n sources - fi - if [ "$__var_to_set" ]; then - eval "$__var_to_set"='$( awk -v keyword="$__keyword" \ - "$f_index_file_awk" $__indexes )"' - else - awk -v keyword="$__keyword" "$f_index_file_awk" $__indexes - fi -} - -# f_index_menusel_keyword $indexfile $pgm [$var_to_set] -# -# Process $indexfile and return only the keyword portion of the menu_selection -# line with a command portion matching $pgm. -# -# This function is for internationalization (i18n) mapping of the on-disk -# scriptname ($pgm) into the localized language (given language-specific -# $indexfile). If $LANG or $LC_ALL (in orderder of preference, respectively) is -# set, ".encoding" will automatically be appended as a suffix to the provided -# $indexfile pathname. -# -# If, within $indexfile, multiple $menu_selection values map to $pgm, only the -# first one will be returned. If no mapping can be made, the NULL string is -# returned. -# -# If $indexfile does not exist, error status is returned with NULL. -# -# If $var_to_set is NULL or missing, output is printed to stdout (which is less -# recommended due to performance degradation; in a loop for example). -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_index_menusel_keyword_awk=' -# Variables that should be defined on the invocation line: -# -v pgm="program_name" -# -BEGIN { - prefix = "menu_selection=\"" - plen = length(prefix) - found = 0 -} -{ - if (!match($0, "^" prefix ".*\\|.*\"")) next - - keyword = command = substr($0, plen + 1, RLENGTH - plen - 1) - sub(/^.*\|/, "", command) - sub(/\|.*$/, "", keyword) - - if ( command == pgm ) - { - print keyword - found++ - exit - } -} -END { exit ! found } -' -f_index_menusel_keyword() -{ - local __indexfile="$1" __pgm="$2" __var_to_set="$3" - local __lang="${LANG:-$LC_ALL}" __file="$__indexfile" - - [ -f "$__indexfile.$__lang" ] && __file="$__indexfile.$__lang" - f_dprintf "f_index_menusel_keyword: index=[%s] pgm=[%s] lang=[%s]" \ - "$__file" "$__pgm" "$__lang" - - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$( awk \ - -v pgm="$__pgm" "$f_index_menusel_keyword_awk" "$__file" - )" - else - awk -v pgm="$__pgm" "$f_index_menusel_keyword_awk" "$__file" - fi -} - -# f_index_menusel_command $indexfile $keyword [$var_to_set] -# -# Process $indexfile and return only the command portion of the menu_selection -# line with a keyword portion matching $keyword. -# -# This function is for mapping [possibly international] keywords into the -# command to be executed. If $LANG or $LC_ALL (order of preference) is set, -# ".encoding" will automatically be appended as a suffix to the provided -# $indexfile pathname. -# -# If, within $indexfile, multiple $menu_selection values map to $keyword, only -# the first one will be returned. If no mapping can be made, the NULL string is -# returned. -# -# If $indexfile doesn't exist, error status is returned with NULL. -# -# If $var_to_set is NULL or missing, output is printed to stdout (which is less -# recommended due to performance degradation; in a loop for example). -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_index_menusel_command_awk=' -# Variables that should be defined on the invocation line: -# -v key="keyword" -# -BEGIN { - prefix = "menu_selection=\"" - plen = length(prefix) - found = 0 -} -{ - if (!match($0, "^" prefix ".*\\|.*\"")) next - - keyword = command = substr($0, plen + 1, RLENGTH - plen - 1) - sub(/^.*\|/, "", command) - sub(/\|.*$/, "", keyword) - - if ( keyword == key ) - { - print command - found++ - exit - } -} -END { exit ! found } -' -f_index_menusel_command() -{ - local __indexfile="$1" __keyword="$2" __var_to_set="$3" __command - local __lang="${LANG:-$LC_ALL}" __file="$__indexfile" - - [ -f "$__indexfile.$__lang" ] && __file="$__indexfile.$__lang" - f_dprintf "f_index_menusel_command: index=[%s] key=[%s] lang=[%s]" \ - "$__file" "$__keyword" "$__lang" - - [ -f "$__file" ] || return $FAILURE - __command=$( awk -v key="$__keyword" \ - "$f_index_menusel_command_awk" "$__file" ) || return $FAILURE - - # - # If the command pathname is not fully qualified fix-up/force to be - # relative to the $indexfile directory. - # - case "$__command" in - /*) : already fully qualified ;; - *) - local __indexdir="${__indexfile%/*}" - [ "$__indexdir" != "$__indexfile" ] || __indexdir="." - __command="$__indexdir/$__command" - esac - - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__command" - else - echo "$__command" - fi -} - -# f_running_as_init -# -# Returns true if running as init(1). -# -f_running_as_init() -{ - # - # When a custom init(8) performs an exec(3) to invoke a shell script, - # PID 1 becomes sh(1) and $PPID is set to 1 in the executed script. - # - [ ${PPID:-0} -eq 1 ] # Return status -} - -# f_mounted $local_directory -# f_mounted -b $device -# -# Return success if a filesystem is mounted on a particular directory. If `-b' -# is present, instead check that the block device (or a partition thereof) is -# mounted. -# -f_mounted() -{ - local OPTIND OPTARG flag use_device= - while getopts b flag; do - case "$flag" in - b) use_device=1 ;; - esac - done - shift $(( $OPTIND - 1 )) - if [ "$use_device" ]; then - local device="$1" - mount | grep -Eq \ - "^$device([[:space:]]|p[0-9]|s[0-9]|\.nop|\.eli)" - else - [ -d "$dir" ] || return $FAILURE - mount | grep -Eq " on $dir \([^)]+\)$" - fi - # Return status is that of last grep(1) -} - -# f_eval_catch [-de] [-k $var_to_set] $funcname $utility \ -# $format [$arguments ...] -# -# Silently evaluate a command in a sub-shell and test for error. If debugging -# is enabled a copy of the command and its output is sent to debug (either -# stdout or file depending on environment). If an error occurs, output of the -# command is displayed in a dialog(1) msgbox using the [above] f_show_err() -# function (unless optional `-d' flag is given, then no dialog). -# -# The $funcname argument is sent to debugging while the $utility argument is -# used in the title of the dialog box. The command that is executed as well as -# sent to debugging with $funcname is the product of the printf(1) syntax -# produced by $format with optional $arguments. -# -# The following options are supported: -# -# -d Do not use dialog(1). -# -e Produce error text from failed command on stderr. -# -k var Save output from the command in var. -# -# Example 1: -# -# debug=1 -# f_eval_catch myfunc echo 'echo "%s"' "Hello, World!" -# -# Produces the following debug output: -# -# DEBUG: myfunc: echo "Hello, World!" -# DEBUG: myfunc: retval=0 <output below> -# Hello, World! -# -# Example 2: -# -# debug=1 -# f_eval_catch -k contents myfunc cat 'cat "%s"' /some/file -# # dialog(1) Error ``cat: /some/file: No such file or directory'' -# # contents=[cat: /some/file: No such file or directory] -# -# Produces the following debug output: -# -# DEBUG: myfunc: cat "/some/file" -# DEBUG: myfunc: retval=1 <output below> -# cat: /some/file: No such file or directory -# -# Example 3: -# -# debug=1 -# echo 123 | f_eval_catch myfunc rev rev -# -# Produces the following debug output: -# -# DEBUG: myfunc: rev -# DEBUG: myfunc: retval=0 <output below> -# 321 -# -# Example 4: -# -# debug=1 -# f_eval_catch myfunc true true -# -# Produces the following debug output: -# -# DEBUG: myfunc: true -# DEBUG: myfunc: retval=0 <no output> -# -# Example 5: -# -# f_eval_catch -de myfunc ls 'ls "%s"' /some/dir -# # Output on stderr ``ls: /some/dir: No such file or directory'' -# -# Example 6: -# -# f_eval_catch -dek contents myfunc ls 'ls "%s"' /etc -# # Output from `ls' sent to stderr and also saved in $contents -# -f_eval_catch() -{ - local __no_dialog= __show_err= __var_to_set= - - # - # Process local function arguments - # - local OPTIND OPTARG __flag - while getopts "dek:" __flag > /dev/null; do - case "$__flag" in - d) __no_dialog=1 ;; - e) __show_err=1 ;; - k) __var_to_set="$OPTARG" ;; - esac - done - shift $(( $OPTIND - 1 )) - - local __funcname="$1" __utility="$2"; shift 2 - local __cmd __output __retval - - __cmd=$( printf -- "$@" ) - f_dprintf "%s: %s" "$__funcname" "$__cmd" # Log command *before* eval - __output=$( exec 2>&1; eval "$__cmd" ) - __retval=$? - if [ "$__output" ]; then - [ "$__show_err" ] && echo "$__output" >&2 - f_dprintf "%s: retval=%i <output below>\n%s" "$__funcname" \ - $__retval "$__output" - else - f_dprintf "%s: retval=%i <no output>" "$__funcname" $__retval - fi - - ! [ "$__no_dialog" -o "$nonInteractive" -o $__retval -eq $SUCCESS ] && - msg_error="${msg_error:-Error}${__utility:+: $__utility}" \ - f_show_err "%s" "$__output" - # NB: f_show_err will handle NULL output appropriately - - [ "$__var_to_set" ] && setvar "$__var_to_set" "$__output" - - return $__retval -} - -# f_count $var_to_set arguments ... -# -# Sets $var_to_set to the number of arguments minus one (the effective number -# of arguments following $var_to_set). -# -# Example: -# f_count count dog house # count=[2] -# -f_count() -{ - setvar "$1" $(( $# - 1 )) -} - -# f_count_ifs $var_to_set string ... -# -# Sets $var_to_set to the number of words (split by the internal field -# separator, IFS) following $var_to_set. -# -# Example 1: -# -# string="word1 word2 word3" -# f_count_ifs count "$string" # count=[3] -# f_count_ifs count $string # count=[3] -# -# Example 2: -# -# IFS=. f_count_ifs count www.freebsd.org # count=[3] -# -# NB: Make sure to use double-quotes if you are using a custom value for IFS -# and you don't want the current value to effect the result. See example 3. -# -# Example 3: -# -# string="a-b c-d" -# IFS=- f_count_ifs count "$string" # count=[3] -# IFS=- f_count_ifs count $string # count=[4] -# -f_count_ifs() -{ - local __var_to_set="$1" - shift 1 - set -- $* - setvar "$__var_to_set" $# -} - -############################################################ MAIN - -# -# Trap signals so we can recover gracefully -# -trap 'f_interrupt' INT -trap 'f_die' TERM PIPE XCPU XFSZ FPE TRAP ABRT SEGV -trap '' ALRM PROF USR1 USR2 HUP VTALRM - -# -# Clone terminal stdout/stderr so we can redirect to it from within sub-shells -# -eval exec $TERMINAL_STDOUT_PASSTHRU\>\&1 -eval exec $TERMINAL_STDERR_PASSTHRU\>\&2 - -# -# Self-initialize unless requested otherwise -# -f_dprintf "%s: DEBUG_SELF_INITIALIZE=[%s]" \ - dialog.subr "$DEBUG_SELF_INITIALIZE" -case "$DEBUG_SELF_INITIALIZE" in -""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;; -*) f_debug_init -esac - -# -# Log our operating environment for debugging purposes -# -f_dprintf "UNAME_S=[%s] UNAME_P=[%s] UNAME_R=[%s]" \ - "$UNAME_S" "$UNAME_P" "$UNAME_R" - -f_dprintf "%s: Successfully loaded." common.subr - -fi # ! $_COMMON_SUBR diff --git a/bsdconfig/share/device.subr b/bsdconfig/share/device.subr deleted file mode 100644 index 97e878424703..000000000000 --- a/bsdconfig/share/device.subr +++ /dev/null @@ -1,1393 +0,0 @@ -if [ ! "$_DEVICE_SUBR" ]; then _DEVICE_SUBR=1 -# -# Copyright (c) 2012-2016 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 (INCLUDING, 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_dprintf "%s: loading includes..." device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/geom.subr -f_include $BSDCFG_SHARE/strings.subr -f_include $BSDCFG_SHARE/struct.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -NDEVICES=0 # Set by f_device_register(), used by f_device_*() - -# -# A "device" from legacy sysinstall's point of view (mostly) -# -# NB: Disk devices have their `private' property set to GEOM ident -# NB: USB devices have their `private' property set to USB disk device name -# -f_struct_define DEVICE \ - capacity \ - desc \ - devname \ - enabled \ - flags \ - get \ - init \ - name \ - private \ - shutdown \ - type \ - volume - -# Network devices have their `private' property set to this -f_struct_define DEVICE_INFO \ - extras \ - ipaddr \ - ipv6addr \ - netmask \ - use_dhcp \ - use_rtsol - -# -# Device types for f_device_register(), f_device_find(), et al. -# -setvar DEVICE_TYPE_ANY "any" # Any -setvar DEVICE_TYPE_NONE "NONE" # Unknown -setvar DEVICE_TYPE_DISK "DISK" # GEOM `DISK' -setvar DEVICE_TYPE_FLOPPY "FD" # GEOM `FD' -setvar DEVICE_TYPE_FTP "FTP" # Dynamic network device -setvar DEVICE_TYPE_NETWORK "NETWORK" # See f_device_get_all_network -setvar DEVICE_TYPE_CDROM "CDROM" # GEOM `DISK' -setvar DEVICE_TYPE_USB "USB" # GEOM `PART' -setvar DEVICE_TYPE_DOS "DOS" # GEOM `DISK' `PART' or `LABEL' -setvar DEVICE_TYPE_UFS "UFS" # GEOM `DISK' `PART' or `LABEL' -setvar DEVICE_TYPE_NFS "NFS" # Dynamic network device -setvar DEVICE_TYPE_HTTP_PROXY "HTTP_PROXY" # Dynamic network device -setvar DEVICE_TYPE_HTTP "HTTP" # Dynamic network device - -# Network devices have the following flags available -setvar IF_ETHERNET 1 -setvar IF_WIRELESS 2 -setvar IF_ACTIVE 4 - -# -# Default behavior is to call f_device_get_all() automatically when loaded. -# -: ${DEVICE_SELF_SCAN_ALL=1} - -# -# Device Catalog variables -# -DEVICE_CATALOG_APPEND_ONLY= # Used by f_device_catalog_set() -NCATALOG_DEVICES=0 # Used by f_device_catalog_*() and MAIN - -# -# A ``catalog'' device is for mapping GEOM devices to media devices (for -# example, determining if a $GEOM_CLASS_DISK geom is $DEVICE_TYPE_CDROM or -# $DEVICE_TYPE_DISK) and also getting default descriptions for devices that -# either lack a GEOM provided description or lack a presence in GEOM) -# -f_struct_define CATALOG_DEVICE \ - desc \ - name \ - type - -############################################################ FUNCTIONS - -# f_device_register $var_to_set $name $desc $devname $type $enabled -# $init_function $get_function $shutdown_function -# $private $capacity -# -# Register a device. A `structure' (see struct.subr) is created and if -# $var_to_set is non-NULL, upon success holds the name of the struct created. -# The remaining positional arguments correspond to the properties of the -# `DEVICE' structure-type to be assigned (defined above). -# -# If not already registered (based on $name and $type), a new device is created -# and $NDEVICES is incremented. -# -f_device_register() -{ - local __var_to_set="$1" __name="$2" __desc="$3" __devname="$4" - local __type="$5" __enabled="$6" __init_func="$7" __get_func="$8" - local __shutdown_func="$9" __private="${10}" __capacity="${11}" - - # Required parameter(s) - [ "$__name" ] || return $FAILURE - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "" || return $FAILURE - fi - - local __device - if f_device_find -1 "$__name" "$__type" __device; then - f_struct_free "$__device" - f_struct_new DEVICE "$__device" || return $FAILURE - else - __device=device_$(( NDEVICES + 1 )) - f_struct_new DEVICE "$__device" || return $FAILURE - NDEVICES=$(( $NDEVICES + 1 )) - fi - $__device set name "$__name" - $__device set desc "$__desc" - $__device set devname "$__devname" - $__device set type "$__type" - $__device set enabled "$__enabled" - $__device set init "$__init_func" - $__device set get "$__get_func" - $__device set shutdown "$__shutdown_func" - $__device set private "$__private" - $__device set capacity "$__capacity" - - [ "$__var_to_set" ] && setvar "$__var_to_set" "$__device" - return $SUCCESS -} - -# f_device_reset -# -# Reset the registered device chain. -# -f_device_reset() -{ - local n=1 - while [ $n -le $NDEVICES ]; do - f_device_shutdown device_$n - - # - # XXX This potentially leaks $dev->private if it's being - # used to point to something dynamic, but you're not supposed - # to call this routine at such times that some open instance - # has its private member pointing somewhere anyway. - # - f_struct_free device_$n - - n=$(( $n + 1 )) - done - NDEVICES=0 -} - -# f_device_reset_network -# -# Reset the registered network device chain. -# -f_device_reset_network() -{ - local n=1 device type private i - while [ $n -le $NDEVICES ]; do - device=device_$n - f_struct $device || continue - $device get type type - [ "$type" = "$DEVICE_TYPE_NETWORK" ] || continue - - # - # Leave the device up (don't call shutdown routine) - # - - # Network devices may have DEVICE_INFO private member - $device get private private - [ "$private" ] && f_struct_free "$private" - - # Free the network device - f_struct_free $device - - # Fill the gap we just created - i=$n - while [ $i -lt $NDEVICES ]; do - f_struct_copy device_$(( $i + 1 )) device_$i - done - f_struct_free device_$NDEVICES - - # Finally decrement the number of devices - NDEVICES=$(( $NDEVICES - 1 )) - - n=$(( $n + 1 )) - done -} - -# f_device_get_all -# -# Get all device information for all devices. -# -f_device_get_all() -{ - local devname type desc capacity - - f_dprintf "f_device_get_all: Probing devices..." - f_dialog_info "$msg_probing_devices_please_wait_this_can_take_a_while" - - # First go for the network interfaces - f_device_get_all_network - - # Next, go for the GEOM devices we might want to use as media - local geom geoms geom_name - debug= f_geom_find "" $GEOM_CLASS_DEV geoms - for geom in $geoms; do - if ! f_device_probe_geom $geom; then - debug= $geom get name geom_name - f_dprintf "WARNING! Unable to classify %s as %s" \ - "GEOM device $geom_name" "media source" - fi - done -} - -# f_device_get_all_network -# -# Get all network device information for attached network devices. -# -f_device_get_all_network() -{ - local devname desc device flags - for devname in $( ifconfig -l ); do - # Eliminate network devices that don't make sense - case "$devname" in - lo*) continue ;; - esac - - # Try and find its description - f_device_desc "$devname" $DEVICE_TYPE_NETWORK desc - - f_dprintf "Found network device named %s" "$devname" - debug= f_device_register device $devname "$desc" \ - "$devname" $DEVICE_TYPE_NETWORK 1 \ - f_media_init_network "" f_media_shutdown_network "" -1 - - # Set flags based on media and status - flags=0 - eval "$( ifconfig $devname 2> /dev/null | awk -v var=flags ' - function _or(var, mask) { - printf "%s=$(( $%s | $%s ))\n", var, var, mask - } - BEGIN { S = "[[:space:]]+" } - { - if (!match($0, "^" S "(media|status):" S)) next - value = substr($0, RLENGTH + 1) - if ($1 == "media:") { - if (value ~ /Ethernet/) _or(var, "IF_ETHERNET") - if (value ~ /802\.11/) _or(var, "IF_WIRELESS") - } else if ($1 == "status:") { - if (value ~ /^active/) _or(var, "IF_ACTIVE") - } - }' )" - $device set flags $flags - done -} - -# f_device_rescan -# -# Rescan all devices, after closing previous set - convenience function. -# -f_device_rescan() -{ - f_device_reset - f_geom_rescan - f_device_get_all -} - -# f_device_rescan_network -# -# Rescan all network devices, after closing previous set - for convenience. -# -f_device_rescan_network() -{ - f_device_reset_network - f_device_get_all_network -} - -# f_device_probe_geom $geom -# -# Probe a single GEOM device and if it can be classified as a media source, -# register it using f_device_register() with known type-specific arguments. -# -f_device_probe_geom() -{ - local geom="$1" - - f_struct "$geom" || return $FAILURE - - # geom associated variables - local geom_name geom_consumer provider_ref geom_provider= - local provider_geom provider_config provider_class= - local provider_config_type catalog_struct catalog_type - local disk_ident - - # gnop(8)/geli(8) associated variables (p for `parent device') - local p_devname p_geom p_consumer p_provider_ref p_provider - local p_provider_config p_provider_geom p_provider_class - - # md(4) associated variables - local config config_type config_file magic= - - # Temporarily disable debugging to keep debug output light - local old_debug="$debug" debug= - - # - # Get the GEOM name (for use below in device registration) - # - $geom get name devname || continue - - # - # Attempt to get the consumer, provider, provider config, and - # provider class for this geom (errors ignored). - # - # NB: Each GEOM in the `DEV' class should have one consumer. - # That consumer should have a reference to its provider. - # - $geom get consumer1 geom_consumer - f_struct "$geom_consumer" get provider_ref provider_ref && - f_geom_find_by id "$provider_ref" provider geom_provider - if f_struct "$geom_provider"; then - $geom_provider get config provider_config - f_geom_parent $geom_provider provider_geom && - f_geom_parent $provider_geom provider_class - fi - - # - # Get values for device registration (errors ignored) - # - f_struct "$provider_class" get name type - f_struct "$geom_provider" get mediasize capacity - f_struct "$provider_config" get descr desc - - # - # For gnop(8), geli(8), or combination thereof, change device type to - # that of the consumer - # - p_devname= p_geom= p_provider= p_provider_config= - case "$devname" in - *.nop.eli) p_devname="${devname%.nop.eli}" ;; - *.eli.nop) p_devname="${devname%.eli.nop}" ;; - *.eli) p_devname="${devname%.eli}" ;; - *.nop) p_devname="${devname%.nop}" ;; - esac - [ "$p_devname" ] && f_geom_find "$p_devname" $GEOM_CLASS_DEV p_geom - if [ "${p_geom:-$geom}" != "$geom" ]; then - f_struct "$p_geom" get consumer1 p_consumer - f_struct "$p_consumer" get provider_ref p_provider_ref && - f_geom_find_by id "$p_provider_ref" provider p_provider - if f_struct "$p_provider"; then - $p_provider get config p_provider_config - f_geom_parent $p_provider p_provider_geom && - f_geom_parent $p_provider_geom p_provider_class - fi - f_struct "$p_provider_class" get name type - fi - - # Look up geom device in device catalog for default description - f_device_catalog_get \ - $DEVICE_TYPE_ANY "${p_devname:-$devname}" catalog_struct - [ "$desc" ] || f_struct "catalog_device_$catalog_struct" get desc desc - - # Use device catalog entry for potential re-classification(s) - f_struct "catalog_device_$catalog_struct" get type catalog_type - - # Restore debugging for this next part (device registration) - debug="$old_debug" - - # - # Register the device - # - local retval device - case "$type" in - $GEOM_CLASS_DISK) - # First attempt to classify by device catalog (see MAIN) - case "$catalog_type" in - $DEVICE_TYPE_CDROM) - f_dprintf "Found CDROM device for disk %s" "$devname" - debug= f_device_register device "$devname" "$desc" \ - "/dev/$devname" $DEVICE_TYPE_CDROM 1 \ - f_media_init_cdrom f_media_get_cdrom \ - f_media_shutdown_cdrom "" "$capacity" && - return $SUCCESS - ;; - esac - - # Fall back to register label device as a disk and taste it - f_dprintf "Found disk device named %s" "$devname" - debug= f_struct "$p_provider_config" get \ - ident disk_ident || - debug= f_struct "$provider_config" get \ - ident disk_ident - debug= f_device_register device "$devname" "$desc" \ - "/dev/$devname" $DEVICE_TYPE_DISK 1 \ - "" "" "" "$disk_ident" "$capacity" - retval=$? - - # Detect ``dangerously dedicated'' filesystems (errors ignored) - f_device_probe_disk_fs device "$devname" "$capacity" && - retval=$SUCCESS - - return $retval - ;; - $GEOM_CLASS_FD) - f_dprintf "Found floppy device named %s" "$devname" - debug= f_device_register device "$devname" "$desc" \ - "/dev/$devname" $DEVICE_TYPE_FLOPPY 1 \ - f_media_init_floppy f_media_get_floppy \ - f_media_shutdown_floppy "" "$capacity" - return $? - ;; - $GEOM_CLASS_LABEL) - : fall through to below section # reduces indentation level - ;; - $GEOM_CLASS_MD) - f_dprintf "Found disk device named %s" "$devname" - debug= f_device_register device "$devname" "$desc" \ - "/dev/$devname" $DEVICE_TYPE_DISK 1 \ - "" "" "" "" "$capacity" - retval=$? - - # - # Attempt to get file(1) magic to potentially classify as - # alternate media type. If unable to get magic, fall back to - # md(4) characteristics (such as vnode filename). - # - [ -r "/dev/$devname" ] && - magic=$( file -bs "/dev/$devname" 2> /dev/null ) - if [ ! "$magic" ]; then - # Fall back to md(4) characteristics - if f_struct "$p_provider_config"; then - config="$p_provider_config" - else - config="$provider_config" - fi - debug= f_struct "$config" get type config_type - debug= f_struct "$config" get file config_file - - # Substitute magic for below based on type and file - case "$config_type=$config_file" in - vnode=*.iso) magic="ISO 9660" ;; - esac - fi - f_device_probe_disk_fs device \ - "$devname" "$capacity" "$magic" && - retval=$SUCCESS # Errors ignored - - return $retval - ;; - $GEOM_CLASS_PART) - if f_struct "$p_provider_config"; then - config="$p_provider_config" - else - config="$provider_config" - fi - debug= f_struct "$config" get type provider_config_type - f_device_probe_geom_part device \ - "$provider_config_type" "$devname" "$capacity" - retval=$? - device_type=$DEVICE_TYPE_NONE - [ $retval -eq $SUCCESS ] && - debug= f_struct "$device" get type device_type - - # Potentially re-classify as USB device - if [ "$device_type" = "$DEVICE_TYPE_UFS" -a \ - "$catalog_type" = "$DEVICE_TYPE_USB" ] - then - f_dprintf "Found USB device for partition %s" \ - "$devname" - debug= f_struct "$p_provider_geom" get \ - name disk_name || - debug= f_struct "$provider_geom" get \ - name disk_name - debug= f_device_register device "$devname" "$desc" \ - "/dev/$devname" $DEVICE_TYPE_USB 1 \ - f_media_init_usb f_media_get_usb \ - f_media_shutdown_usb "$disk_name" "$capacity" - retval=$? - fi - - return $retval - ;; - $GEOM_CLASS_RAID) - # Use the provider geom name as the description - if [ ! "$desc" ]; then - f_struct "$p_provider_geom" get name desc || - f_struct "$provider_geom" get name desc - fi - - f_dprintf "Found disk device named %s" "$devname" - debug= f_device_register device \ - "$devname" "${desc:-GEOM RAID device}" \ - "/dev/$devname" $DEVICE_TYPE_DISK 1 \ - "" "" "" "" "$capacity" - retval=$? - - # Detect ``dangerously dedicated'' filesystems - f_device_probe_disk_fs device "$devname" "$capacity" && - retval=$SUCCESS # Errors ignored - - return $retval - ;; - $GEOM_CLASS_ZFS_ZVOL) - f_dprintf "Found disk device named %s" "$devname" - debug= f_device_register device \ - "$devname" "${desc:-GEOM ZFS::ZVOL device}" \ - "/dev/$devname" $DEVICE_TYPE_DISK 1 \ - "" "" "" "" "$capacity" - retval=$? - - # Detect ``dangerously dedicated'' filesystems - f_device_probe_disk_fs device "$devname" "$capacity" && - retval=$SUCCESS # Errors ignored - - return $retval - ;; - *) - return $FAILURE # Unknown GEOM class - esac - - # - # Still here? Must be $GEOM_CLASS_LABEL - # - - local label_geom label_devname label_devgeom= label_devconsumer - local label_devprovider= label_devprovider_ref label_devprovider_config - local label_gpart_type - - if f_struct "$p_provider"; then - label_geom="$p_provider_geom" - else - label_geom="$provider_geom" - fi - - case "$devname" in - gpt/*|gptid/*) - # - # Attempt to get the partition type by getting the `config' - # member of the provider for our device (which is named in the - # parent geom of our current provider). - # - debug= f_struct "$label_geom" get name label_devname && - debug= f_geom_find "$label_devname" $GEOM_CLASS_DEV \ - label_devgeom - debug= f_struct "$label_devgeom" get \ - consumer1 label_devconsumer - debug= f_struct "$label_devconsumer" get \ - provider_ref label_devprovider_ref && - debug= f_geom_find_by id "$label_devprovider_ref" \ - provider label_devprovider - debug= f_struct "$label_devprovider" get \ - config label_devprovider_config - debug= f_struct "$label_devprovider_config" get \ - type label_gpart_type - - # - # Register device label based on partition type - # - f_device_probe_geom_part device \ - "$label_gpart_type" "$devname" "$capacity" - return $? - ;; - iso9660/*) - f_dprintf "Found CDROM device labeled %s" "$devname" - debug= f_device_register device \ - "$devname" "ISO9660 file system" \ - "/dev/$devname" $DEVICE_TYPE_CDROM 1 \ - f_media_init_cdrom f_media_get_cdrom \ - f_media_shutdown_cdrom "" "$capacity" - return $? - ;; - label/*) - # For generic labels, use provider geom name as real device - debug= f_struct "$label_geom" get name label_devname - - # Look up label geom device in device catalog for default desc - debug= f_device_catalog_get \ - $DEVICE_TYPE_ANY "$label_devname" catalog_struct - [ "$desc" ] || debug= f_struct \ - "catalog_device_$catalog_struct" get desc desc - - # Use device catalog entry for potential re-classification(s) - debug= f_struct "catalog_device_$catalog_struct" get \ - type catalog_type - - # First attempt to classify by device catalog (see MAIN) - case "$catalog_type" in - $DEVICE_TYPE_CDROM) - f_dprintf "Found CDROM device for disk %s" "$devname" - debug= f_device_register device "$devname" "$desc" \ - "/dev/$devname" $DEVICE_TYPE_CDROM 1 \ - f_media_init_cdrom f_media_get_cdrom \ - f_media_shutdown_cdrom "" "$capacity" && - return $SUCCESS - ;; - esac - - # Fall back to register label device as a disk and taste it - f_dprintf "Found disk device labeled %s" "$devname" - debug= f_device_register device \ - "$devname" "GEOM LABEL device" \ - "/dev/$devname" $DEVICE_TYPE_DISK 1 \ - "" "" "" "" "$capacity" - retval=$? - - # Detect ``dangerously dedicated'' filesystems (errors ignored) - f_device_probe_disk_fs device "$devname" "$capacity" && - retval=$SUCCESS - - return $retval - ;; - msdosfs/*) - f_dprintf "Found DOS partition labeled %s" "$devname" - debug= f_device_register device "$devname" "DOS file system" \ - "/dev/$devname" $DEVICE_TYPE_DOS 1 \ - f_media_init_dos f_media_get_dos \ - f_media_shutdown_dos "" "$capacity" - return $? - ;; - ufs/*|ufsid/*) - f_dprintf "Found UFS partition labeled %s" "$devname" - debug= f_device_register device "$devname" "UFS file system" \ - "/dev/$devname" $DEVICE_TYPE_UFS 1 \ - f_media_init_ufs f_media_get_ufs \ - f_media_shutdown_ufs "" "$capacity" - return $? - ;; - ext2fs/*|ntfs/*|reiserfs/*) - return $FAILURE # No media device handlers for these labels - ;; - esac - - # Unable to classify GEOM label - return $FAILURE -} - -# f_device_probe_geom_part $var_to_set $gpart_type $devname $capacity [$magic] -# -# Given a gpart(8) partition type and a device name, register the device if it -# is a known partition type that we can handle. If $var_to_set is non-NULL, -# upon success holds the DEVICE struct name of the registered device. -# -# Returns success if the device was successfully registered, failure otherwise. -# -f_device_probe_geom_part() -{ - local __var_to_set="$1" __gpart_type="$2" __devname="$3" - local __capacity="${4:--1}" __magic="$5" - - # - # Register device based on partition type - # NB: !0 equates to `unused' bsdlabel - # - case "$__gpart_type" in - fat16|fat32) - f_dprintf "Found DOS partition named %s" "$__devname" - debug= f_device_register "$__var_to_set" \ - "$__devname" "DOS file system" \ - "/dev/$__devname" $DEVICE_TYPE_DOS 1 \ - f_media_init_dos f_media_get_dos \ - f_media_shutdown_dos "" "$__capacity" - return $? - ;; - freebsd|!0) # Commonly used inappropriately, taste for FreeBSD - [ -r "/dev/$__devname" -a ! "$__magic" ] && - __magic=$( file -bs "/dev/$__devname" 2> /dev/null ) - case "$__magic" in - *"Unix Fast File system"*) - f_dprintf "Found UFS partition named %s" "$__devname" - debug= f_device_register "$__var_to_set" \ - "$__devname" "UFS file system" \ - "/dev/$__devname" $DEVICE_TYPE_UFS 1 \ - f_media_init_ufs f_media_get_ufs \ - f_media_shutdown_ufs "" "$__capacity" - return $? - esac - return $FAILURE - ;; - freebsd-ufs) - f_dprintf "Found UFS partition named %s" "$__devname" - debug= f_device_register "$__var_to_set" \ - "$__devname" "UFS file system" \ - "/dev/$__devname" $DEVICE_TYPE_UFS 1 \ - f_media_init_ufs f_media_get_ufs \ - f_media_shutdown_ufs "" "$__capacity" - return $? - ;; - apple-*|linux-*|ms-*|netbsd-*|ntfs|vmware-*) - return $FAILURE # No device types for these - ;; - bios-*|ebr|efi|mbr|freebsd-boot|freebsd-swap) - return $FAILURE # Not a source for media - ;; - freebsd-nandfs|freebsd-vinum|freebsd-zfs) - return $FAILURE # Unsupported as media source - ;; - esac - - return $FAILURE # Unknown partition type -} - -# f_device_probe_disk_fs $var_to_set $devname [$capacity [$magic]] -# -# Given a device name, taste it and register the device if it is a so-called -# ``dangerously dedicated'' file system written without a partition table. -# Tasting is done using file(1) (specifically `file -bs') but if $magic is -# present and non-NULL it is used instead. If $var_to_set is non-NULL, upon -# success holds the DEVICE struct name of the registered device. -# -# Returns success if the device was successfully registered, failure otherwise. -# -f_device_probe_disk_fs() -{ - local __var_to_set="$1" __devname="$2" __capacity="${3:--1}" - local __magic="$4" - - [ -r "/dev/${__devname#/dev/}" -a ! "$__magic" ] && - __magic=$( file -bs "/dev/$__devname" 2> /dev/null ) - - case "$__magic" in - *"ISO 9660"*) - f_dprintf "Found CDROM device for disk %s" "$__devname" - debug= f_device_register "$__var_to_set" \ - "$__devname" "ISO9660 file system" \ - "/dev/$__devname" $DEVICE_TYPE_CDROM 1 \ - f_media_init_cdrom f_media_get_cdrom \ - f_media_shutdown_cdrom "" "$__capacity" - return $? - ;; - *"Unix Fast File system"*) - f_dprintf "Found UFS device for disk %s" "$__devname" - debug= f_device_register "$__var_to_set" \ - "$__devname" "UFS file system" \ - "/dev/$__devname" $DEVICE_TYPE_UFS 1 \ - f_media_init_ufs f_media_get_ufs \ - f_media_shutdown_ufs "" "$__capacity" - return $? - ;; - *"FAT (12 bit)"*|*"FAT (16 bit)"*|*"FAT (32 bit)"*) - f_dprintf "Found DOS device for disk %s" "$__devname" - debug= f_device_register "$__var_to_set" \ - "$__devname" "DOS file system" \ - "/dev/$__devname" $DEVICE_TYPE_DOS 1 \ - f_media_init_dos f_media_get_dos \ - f_media_shutdown_dos "" "$__capacity" - return $? - ;; - esac - - return $FAILURE # Unknown file system type -} - -# f_device_catalog_get $type $name [$var_to_set] -# -# Fetch the struct name of the catalog device matching device $name. If $type -# is either NULL, missing, or set to $DEVICE_TYPE_ANY then only $name is used. -# Returns success if a match was found, otherwise failure. -# -# If $var_to_set is missing or NULL, the struct name is printed to standard out -# for capturing in a sub-shell (which is less-recommended because of -# performance degredation; for example, when called in a loop). -# -f_device_catalog_get() -{ - local __type="$1" __name="$2" __var_to_set="$3" - local __dname= - - # Return failure if no $name - [ "$__name" ] || return $FAILURE - - # Disable debugging to keep debug output light - local debug= - - # - # Attempt to create an alternate-form of $__name that contains the - # first contiguous string of numbers replaced with `%d' for comparison - # against stored pattern names (see MAIN). - # - local __left="${__name%%[0-9]*}" __right="${__name#*[0-9]}" - if [ "$__left" != "$__name" ]; then - # Chop leading digits from right 'til we hit first non-digit - while :; do - case "$__right" in - [0-9]*) __right="${__right#[0-9]}" ;; - *) break - esac - done - __dname="${__left}%d$__right" - fi - - [ "$__type" = "$DEVICE_TYPE_ANY" ] && __type= - local __dev __dev_name __dev_type - for __dev in $DEVICE_CATALOG; do - catalog_device_$__dev get name __dev_name - [ "$__dev_name" = "$__name" -o "$__dev_name" = "$__dname" ] || - continue - catalog_device_$__dev get type __dev_type - [ "${__type:-$__dev_type}" = "$__dev_type" ] || continue - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" $__dev - else - echo $__dev - fi - return $? - done - - [ "$__var_to_set" ] && setvar "$__var_to_set" "" - return $FAILURE -} - -# f_device_catalog_set $type $name $desc -# -# Store a description (desc) in-association with device $type and $name. -# Returns success unless $name is NULL or missing. Use f_device_catalog_get() -# routine with the same $name and optionally $type to retrieve catalog device -# structure (see CATALOG_DEVICE struct definition in GLOBALS section). -# -f_device_catalog_set() -{ - local type="$1" name="$2" desc="$3" - local struct dev dev_type found= - - [ "$name" ] || return $FAILURE - - # Disable debugging to keep debug output light - local debug= - - f_str2varname "$name" struct - if [ ! "$DEVICE_CATALOG_APPEND_ONLY" ]; then - for dev in $DEVICE_CATALOG; do - [ "$dev" = "$struct" ] || continue - found=1 break - done - fi - if [ "$found" ]; then - f_struct_free "catalog_device_$struct" - else - DEVICE_CATALOG="$DEVICE_CATALOG $struct" - fi - f_struct_new CATALOG_DEVICE "catalog_device_$struct" || return $FAILURE - catalog_device_$struct set type "$type" - catalog_device_$struct set name "$name" - catalog_device_$struct set desc "$desc" - return $SUCCESS -} - -# f_device_desc $device_name $device_type [$var_to_set] -# -# Print a description for a device name (eg., `fxp0') given a specific device -# type/class. -# -# If $var_to_set is missing or NULL, the device description is printed to -# standard out for capturing in a sub-shell (which is less-recommended because -# of performance degredation; for example, when called in a loop). -# -f_device_desc() -{ - local __name="$1" __type="$2" __var_to_set="$3" - local __devname __devunit __cp - - # Check variables - [ "$__name" ] || return $SUCCESS - [ "$__type" = "$DEVICE_TYPE_ANY" ] && type= - [ "$__var_to_set" ] && { setvar "$__var_to_set" "" || return; } - - # - # Return sysctl MIB dev.NAME.UNIT.%desc if it exists, otherwise fall - # through to further alternate methods. - # - if f_have sysctl; then - __devname="${__name%%[0-9]*}" - __devunit="${__name#$__devname}" - __devunit="${__devunit%%[!0-9]*}" - if [ "$__var_to_set" ]; then - if __cp=$( - sysctl -n "dev.$__devname.$__devunit.%desc" \ - 2> /dev/null - ); then - setvar "$__var_to_set" "$__cp" && - return $SUCCESS - fi - else - sysctl -n "dev.$__devname.$__devunit.%desc" \ - 2> /dev/null && return $SUCCESS - fi - fi - - # Look up device in catalog for default description - local __catalog_struct - debug= f_device_catalog_get "$__type" "$__name" __catalog_struct - debug= f_struct "catalog_device_$__catalog_struct" get \ - desc "$__var_to_set" && return $SUCCESS - - # - # Sensible fall-backs for specific types - # - case "$__type" in - $DEVICE_TYPE_CDROM) __cp="<unknown cdrom device type>" ;; - $DEVICE_TYPE_DISK) __cp="<unknown disk device type>" ;; - $DEVICE_TYPE_FLOPPY) __cp="<unknown floppy device type>" ;; - $DEVICE_TYPE_USB) __cp="<unknown USB storage device type>" ;; - $DEVICE_TYPE_NETWORK) __cp="<unknown network interface type>" ;; - *) - __cp="<unknown device type>" - esac - - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__cp" - else - echo "$__cp" - fi - - return $FAILURE -} - -# f_device_is_ethernet $device -# -# Returns true if $device is a wired Ethernet network interface. Otherwise -# returns false. Example wired interfaces include: fxp0 em0 bge0 rl0 etc. -# -f_device_is_ethernet() -{ - local dev="$1" type flags - - # Make sure we have an actual device by that name - f_struct "$dev" || return $FAILURE - - # Make sure that the device is a network device - $dev get type type - [ "$type" = "$DEVICE_TYPE_NETWORK" ] || return $FAILURE - - # Make sure that the media flags indicate that it is Ethernet - $dev get flags flags - [ $(( ${flags:-0} & $IF_ETHERNET )) -eq $IF_ETHERNET ] -} - -# f_device_is_wireless $device -# -# Returns true if $device is a Wireless network interface. Otherwise returns -# false. Examples of wireless interfaces include: iwn0 -# -f_device_is_wireless() -{ - local dev="$1" type flags - - # Make sure we have an actual device by that name - f_struct "$dev" || return $FAILURE - - # Make sure that the device is a network device - $dev get type type - [ "$type" = "$DEVICE_TYPE_NETWORK" ] || return $FAILURE - - # Make sure that the media flags indicate that it is 802.11 wireless - $dev get flags flags - [ $(( ${flags:-0} & $IF_WIRELESS )) -eq $IF_WIRELESS ] -} - -# f_device_is_active $device -# -# Returns true if $device is active. Otherwise returns false. Currently this -# only works for network interfaces. -# -f_device_is_active() -{ - local dev="$1" type flags=0 - - # Make sure we have an actual device by that name - f_struct "$dev" || return $FAILURE - - $dev get type type - case "$type" in - $DEVICE_TYPE_NETWORK) - # Make sure that the media flags indicate that it is active - $dev get flags flags - [ $(( ${flags:-0} & $IF_ACTIVE )) -eq $IF_ACTIVE ] - ;; - *) - return $FAILURE - esac -} - -# f_device_find [-1] $name [$type [$var_to_set]] -# -# Find one or more registered devices by name, type, or both. Returns a space- -# separated list of devices matching the search criterion. -# -# If `-1' option flag is given, only the first matching device is returned. -# -# If $var_to_set is missing or NULL, the device name(s) are printed to standard -# out for capturing in a sub-shell (which is less-recommended because of -# performance degredation; for example, when called in a loop). -# -f_device_find() -{ - local OPTIND=1 OPTARG flag only_one= - while getopts 1 flag; do - case "$flag" in - 1) only_one=1 ;; - esac - done - shift $(( $OPTIND - 1 )) - - local __name="$1" __type="${2:-$DEVICE_TYPE_ANY}" __var_to_set="$3" - local __n=1 __devname __devtype __found= - while [ $__n -le $NDEVICES ]; do - device_$__n get name __devname - device_$__n get type __devtype - if [ "$__name" = "$__devname" -o ! "$__name" ] && - [ "$__type" = "$DEVICE_TYPE_ANY" -o \ - "$__type" = "$__devtype" ] - then - __found="$__found device_$__n" - [ "$only_one" ] && break - fi - __n=$(( $__n + 1 )) - done - - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "${__found# }" - else - echo $__found - fi - [ "$__found" ] # Return status -} - -# f_device_init $device -# -# Initialize a device by evaluating its `init' function. The $device argument -# is a DEVICE struct name. -# -f_device_init() -{ - local device="$1" init_func - f_struct "$device" || return $? - $device get init init_func - ${init_func:-:} "$device" -} - -# f_device_get $device $file [$probe] -# -# Read $file by evaluating the device's `get' function. The file is commonly -# produced on standard output (but it truly depends on the function called). -# The $device argument is a DEVICE struct name. -# -f_device_get() -{ - local device="$1" file="$2" probe="$3" get_func - f_struct "$device" || return $? - $device get get get_func - ${get_func:-:} "$device" "$file" ${3+"$probe"} -} - -# f_device_shutdown $device -# -# Shutdown a device by evaluating its `shutdown' function. The $device argument -# is a DEVICE struct name. -# -f_device_shutdown() -{ - local device="$1" shutdown_func - f_struct "$device" || return $? - $device get shutdown shutdown_func - ${shutdown_func:-:} "$device" -} - -# f_devices_sort_by $property $var_to_get [$var_to_set] -# -# Take list of devices from $var_to_get (separated by whitespace, newline -# included) and sort them by $property (e.g., `name'). The sorted list of -# DEVICE struct names is returned on standard output separated by whitespace -# (newline to be specific) unless $var_to_set is present and non-NULL. -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_device_sort_by_awk=' -# Variables that should be defined on the invocation line: -# -v prop="property" -function _asorti(src, dest) -{ - k = nitems = 0 - for (i in src) dest[++nitems] = i - for (i = 1; i <= nitems; k = i++) { - idx = dest[i] - while ((k > 0) && (dest[k] > idx)) { - dest[k+1] = dest[k]; k-- - } - dest[k+1] = idx - } - return nitems -} -{ - split($0, devs, FS) - for (d in devs) { - name = ENVIRON["_struct_value_" devs[d] "_" prop] - devices[name] = devs[d] - } -} -END { - nitems = _asorti(devices, devices_sorted) - for (i = 1; i <= nitems; i++) print devices[devices_sorted[i]] -} -' -f_device_sort_by() -{ - local __property="${1:-name}" __var_to_get="$2" __var_to_set="$3" - - f_isset "$__var_to_get" || return $FAILURE - - local __dev - for __dev in $( f_getvar "$__var_to_get" ); do - export _struct_value_${__dev}_$__property - done - - local __cp - setvar "${__var_to_set:-__cp}" "$( - f_getvar "$__var_to_get" | - awk -v prop="$__property" "$f_device_sort_by_awk" - )" - [ "$__var_to_set" ] || echo "$__cp" -} - -# f_device_menu $title $prompt $hline $device_type [$helpfile] -# -# Display a menu listing all the devices of a certain type in the system. -# -f_device_menu() -{ - f_dialog_title "$1" - local title="$DIALOG_TITLE" btitle="$DIALOG_BACKTITLE" - f_dialog_title_restore - - local prompt="$2" hline="$3" type="$4" helpfile="$5" - - local devs - f_device_find "" "$type" devs || return $DIALOG_CANCEL - - local name desc menu_list= - f_device_sort_by name devs devs - for dev in $devs; do - $dev get name name - $dev get desc desc - f_shell_escape "$name" name - f_shell_escape "$desc" desc - menu_list="$menu_list - '$name' '$desc'" # END-QUOTE - done - menu_list="${menu_list#$NL}" - - local height width rows - eval f_dialog_menu_size height width rows \ - \"\$title\" \ - \"\$btitle\" \ - \"\$prompt\" \ - \"\$hline\" \ - $menu_list - - local errexit= - case $- in *e*) errexit=1; esac - set +e - - local mtag - while :; do - mtag=$( eval $DIALOG \ - --title \"\$title\" \ - --backtitle \"\$btitle\" \ - --hline \"\$hline\" \ - --ok-label \"\$msg_ok\" \ - --cancel-label \"\$msg_cancel\" \ - ${helpfile:+ \ - --help-button \ - --help-label \"\$msg_help\" \ - ${USE_XDIALOG:+--help \"\"} \ - } \ - --menu \"\$prompt\" \ - $height $width $rows \ - $menu_list \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) - local retval=$? - - [ $retval -ne $DIALOG_HELP ] && break - # Otherwise, the Help button was pressed - f_show_help "$helpfile" - # ...then loop back to menu - done - f_dprintf "retval=%u mtag=[%s]" $retval "$mtag" - - [ "$errexit" ] && set -e - - if [ $retval -eq $DIALOG_OK ]; then - # Clean up the output of [X]dialog(1) - f_dialog_data_sanitize mtag - - # Map the user's choice back to a struct name - local index device - index=$( eval f_dialog_menutag2index \"\$mtag\" $menu_list ) - device=$( set -- $devs; eval echo \${$index} ) - - echo "$device" >&2 - fi - - return $retval -} - -# -# Short-hand -# -f_cdrom() { f_device_catalog_set $DEVICE_TYPE_CDROM "$1" "$2"; } -f_disk() { f_device_catalog_set $DEVICE_TYPE_DISK "$1" "$2"; } -f_floppy() { f_device_catalog_set $DEVICE_TYPE_FLOPPY "$1" "$2"; } -f_usb() { f_device_catalog_set $DEVICE_TYPE_USB "$1" "$2"; } -f_network() { f_device_catalog_set $DEVICE_TYPE_NETWORK "$1" "$2"; } - -############################################################ MAIN - -# -# The below classifications allow us to re-group the GEOM devices from the -# `DEV' GEOM class appropriately while providing fall-back descriptions both -# for making the below code more maintainable and handling the rare case the -# GEOM device lacks a description. -# - -DEVICE_CATALOG_APPEND_ONLY=1 # Make initial loading faster - -# CDROM, Disk, Floppy, and USB devices/names -f_cdrom "cd%d" "SCSI CDROM drive" -f_cdrom "mcd%d" "Mitsumi (old model) CDROM drive" -f_cdrom "scd%d" "Sony CDROM drive - CDU31/33A type" -f_disk "aacd%d" "Adaptec FSA RAID array" -f_disk "ada%d" "ATA/SATA disk device" -f_disk "amrd%d" "AMI MegaRAID drive" -f_disk "da%d" "SCSI disk device" -f_disk "idad%d" "Compaq RAID array" -f_disk "ipsd%d" "IBM ServeRAID RAID array" -f_disk "md%d" "md(4) disk device" -f_disk "mfid%d" "LSI MegaRAID SAS array" -f_disk "mlxd%d" "Mylex RAID disk" -f_disk "twed%d" "3ware ATA RAID array" -f_disk "vtbd%d" "VirtIO Block Device" -f_floppy "fd%d" "Floppy Drive unit A" -f_usb "da%da" "USB Mass Storage Device" - -# Network interfaces/names -f_network "ae%d" "Attansic/Atheros L2 Fast Ethernet" -f_network "age%d" "Attansic/Atheros L1 Gigabit Ethernet" -f_network "alc%d" "Atheros AR8131/AR8132 PCIe Ethernet" -f_network "ale%d" "Atheros AR8121/AR8113/AR8114 PCIe Ethernet" -f_network "an%d" "Aironet 4500/4800 802.11 wireless adapter" -f_network "ath%d" "Atheros IEEE 802.11 wireless adapter" -f_network "aue%d" "ADMtek USB Ethernet adapter" -f_network "axe%d" "ASIX Electronics USB Ethernet adapter" -f_network "bce%d" "Broadcom NetXtreme II Gigabit Ethernet card" -f_network "bfe%d" "Broadcom BCM440x PCI Ethernet card" -f_network "bge%d" "Broadcom BCM570x PCI Gigabit Ethernet card" -f_network "bm%d" "Apple BMAC Built-in Ethernet" -f_network "bwn%d" "Broadcom BCM43xx IEEE 802.11 wireless adapter" -f_network "cas%d" "Sun Cassini/Cassini+ or NS DP83065 Saturn Ethernet" -f_network "cc3i%d" "SDL HSSI sync serial PCI card" -f_network "cue%d" "CATC USB Ethernet adapter" -f_network "cxgb%d" "Chelsio T3 10Gb Ethernet card" -f_network "dc%d" "DEC/Intel 21143 (and clones) PCI Fast Ethernet card" -f_network "de%d" "DEC DE435 PCI NIC or other DC21040-AA based card" -f_network "disc%d" "Software discard network interface" -f_network "ed%d" "Novell NE1000/2000; 3C503; NE2000-compatible PCMCIA" -f_network "el%d" "3Com 3C501 Ethernet card" -f_network "em%d" "Intel(R) PRO/1000 Ethernet card" -f_network "ep%d" "3Com 3C509 Ethernet card/3C589 PCMCIA" -f_network "et%d" "Agere ET1310 based PCI Express Gigabit Ethernet card" -f_network "ex%d" "Intel EtherExpress Pro/10 Ethernet card" -f_network "fe%d" "Fujitsu MB86960A/MB86965A Ethernet card" -f_network "fpa%d" "DEC DEFPA PCI FDDI card" -f_network "fwe%d" "FireWire Ethernet emulation" -f_network "fwip%d" "IP over FireWire" -f_network "fxp%d" "Intel EtherExpress Pro/100B PCI Fast Ethernet card" -f_network "gem%d" "Apple GMAC or Sun ERI/GEM Ethernet adapter" -f_network "hme%d" "Sun HME (Happy Meal Ethernet) Ethernet adapter" -f_network "ie%d" "AT&T StarLAN 10 and EN100; 3Com 3C507; NI5210" -f_network "igb%d" "Intel(R) PRO/1000 PCI Express Gigabit Ethernet card" -f_network "ipw%d" "Intel PRO/Wireless 2100 IEEE 802.11 adapter" -f_network "iwi%d" "Intel PRO/Wireless 2200BG/2225BG/2915ABG adapter" -f_network "iwn%d" "Intel Wireless WiFi Link 4965AGN IEEE 802.11n adapter" -f_network "ix%d" "Intel Etherexpress Ethernet card" -f_network "ixgbe%d" "Intel(R) PRO/10Gb Ethernet card" -f_network "jme%d" "JMicron JMC250 Gigabit/JMC260 Fast Ethernet" -f_network "kue%d" "Kawasaki LSI USB Ethernet adapter" -f_network "le%d" "AMD Am7900 LANCE or Am79C9xx PCnet Ethernet adapter" -f_network "lge%d" "Level 1 LXT1001 Gigabit Ethernet card" -f_network "lnc%d" "Lance/PCnet (Isolan/Novell NE2100/NE32-VL) Ethernet" -f_network "lo%d" "Loop-back (local) network interface" -f_network "lp%d" "Parallel Port IP (PLIP) peer connection" -f_network "malo%d" "Marvell Libertas 88W8335 802.11 wireless adapter" -f_network "msk%d" "Marvell/SysKonnect Yukon II Gigabit Ethernet" -f_network "mxge%d" "Myricom Myri10GE 10Gb Ethernet card" -f_network "nfe%d" "NVIDIA nForce MCP Ethernet" -f_network "ng%d" "Vimage netgraph(4) bridged Ethernet device" -f_network "nge%d" "NatSemi PCI Gigabit Ethernet card" -f_network "nve%d" "NVIDIA nForce MCP Ethernet" -f_network "pcn%d" "AMD Am79c79x PCI Ethernet card" -f_network "plip%d" "Parallel Port IP (PLIP) peer connection" -f_network "ral%d" "Ralink Technology IEEE 802.11 wireless adapter" -f_network "ray%d" "Raytheon Raylink 802.11 wireless adapter" -f_network "re%d" "RealTek 8139C+/8169/8169S/8110S PCI Ethernet adapter" -f_network "rl%d" "RealTek 8129/8139 PCI Ethernet card" -f_network "rue%d" "RealTek USB Ethernet card" -f_network "rum%d" "Ralink Technology USB IEEE 802.11 wireless adapter" -f_network "sf%d" "Adaptec AIC-6915 PCI Ethernet card" -f_network "sge%d" "Silicon Integrated Systems SiS190/191 Ethernet" -f_network "sis%d" "SiS 900/SiS 7016 PCI Ethernet card" -f_network "sk%d" "SysKonnect PCI Gigabit Ethernet card" -f_network "sn%d" "SMC/Megahertz Ethernet card" -f_network "snc%d" "SONIC Ethernet card" -f_network "sr%d" "SDL T1/E1 sync serial PCI card" -f_network "ste%d" "Sundance ST201 PCI Ethernet card" -f_network "stge%d" "Sundance/Tamarack TC9021 Gigabit Ethernet" -f_network "ti%d" "Alteon Networks PCI Gigabit Ethernet card" -f_network "tl%d" "Texas Instruments ThunderLAN PCI Ethernet card" -f_network "tx%d" "SMC 9432TX Ethernet card" -f_network "txp%d" "3Com 3cR990 Ethernet card" -f_network "uath%d" "Atheros AR5005UG and AR5005UX USB wireless adapter" -f_network "upgt%d" "Conexant/Intersil PrismGT USB wireless adapter" -f_network "ural%d" "Ralink Technology RT2500USB 802.11 wireless adapter" -f_network "urtw%d" "Realtek 8187L USB wireless adapter" -f_network "vge%d" "VIA VT612x PCI Gigabit Ethernet card" -f_network "vlan%d" "IEEE 802.1Q VLAN network interface" -f_network "vr%d" "VIA VT3043/VT86C100A Rhine PCI Ethernet card" -f_network "vx%d" "3COM 3c590 / 3c595 Ethernet card" -f_network "wb%d" "Winbond W89C840F PCI Ethernet card" -f_network "wi%d" "Lucent WaveLAN/IEEE 802.11 wireless adapter" -f_network "wpi%d" "Intel 3945ABG IEEE 802.11 wireless adapter" -f_network "wx%d" "Intel Gigabit Ethernet (82452) card" -f_network "xe%d" "Xircom/Intel EtherExpress Pro100/16 Ethernet card" -f_network "xl%d" "3COM 3c90x / 3c90xB PCI Ethernet card" -f_network "zyd%d" "ZyDAS ZD1211/ZD1211B USB 802.11 wireless adapter" - -DEVICE_CATALOG_APPEND_ONLY= # Additional loading modifies existing devices - -f_count NCATALOG_DEVICES $DEVICE_CATALOG -f_dprintf "%s: Initialized device catalog with %u names/descriptions." \ - device.subr $NCATALOG_DEVICES - -# -# Scan for the above devices unless requeted otherwise -# -f_dprintf "%s: DEVICE_SELF_SCAN_ALL=[%s]" device.subr "$DEVICE_SELF_SCAN_ALL" -case "$DEVICE_SELF_SCAN_ALL" in -""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;; -*) f_device_get_all -esac - -f_dprintf "%s: Successfully loaded." device.subr - -fi # ! $_DEVICE_SUBR diff --git a/bsdconfig/share/dialog.subr b/bsdconfig/share/dialog.subr deleted file mode 100644 index 5b5c8a32984e..000000000000 --- a/bsdconfig/share/dialog.subr +++ /dev/null @@ -1,2339 +0,0 @@ -if [ ! "$_DIALOG_SUBR" ]; then _DIALOG_SUBR=1 -# -# Copyright (c) 2006-2015 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 (INCLUDING, 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_dprintf "%s: loading includes..." dialog.subr -f_include $BSDCFG_SHARE/strings.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ CONFIGURATION - -# -# Default file descriptor to link to stdout for dialog(1) passthru allowing -# execution of dialog from within a sub-shell (so-long as its standard output -# is explicitly redirected to this file descriptor). -# -: ${DIALOG_TERMINAL_PASSTHRU_FD:=${TERMINAL_STDOUT_PASSTHRU:-3}} - -############################################################ GLOBALS - -# -# Default name of dialog(1) utility -# NOTE: This is changed to "Xdialog" by the optional `-X' argument -# -DIALOG="dialog" - -# -# Default dialog(1) title and backtitle text -# -DIALOG_TITLE="$pgm" -DIALOG_BACKTITLE="bsdconfig" - -# -# Settings used while interacting with dialog(1) -# -DIALOG_MENU_TAGS="123456789ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwxyz" - -# -# Declare that we are fully-compliant with Xdialog(1) by unset'ing all -# compatibility settings. -# -unset XDIALOG_HIGH_DIALOG_COMPAT -unset XDIALOG_FORCE_AUTOSIZE -unset XDIALOG_INFOBOX_TIMEOUT - -# -# Exit codes for [X]dialog(1) -# -DIALOG_OK=${SUCCESS:-0} -DIALOG_CANCEL=${FAILURE:-1} -DIALOG_HELP=2 -DIALOG_EXTRA=3 -DIALOG_ITEM_HELP=4 -export DIALOG_ERROR=254 # sh(1) can't handle the default of `-1' -DIALOG_ESC=255 - -# -# Default behavior is to call f_dialog_init() automatically when loaded. -# -: ${DIALOG_SELF_INITIALIZE=1} - -# -# Default terminal size (used if/when running without a controlling terminal) -# -: ${DEFAULT_TERMINAL_SIZE:=24 80} - -# -# Minimum width(s) for various dialog(1) implementations (sensible global -# default(s) for all widgets of a given variant) -# -: ${DIALOG_MIN_WIDTH:=24} -: ${XDIALOG_MIN_WIDTH:=35} - -# -# When manually sizing Xdialog(1) widgets such as calendar and timebox, you'll -# need to know the size of the embedded GUI objects because the height passed -# to Xdialog(1) for these widgets has to be tall enough to accommodate them. -# -# These values are helpful when manually sizing with dialog(1) too, but in a -# different way. dialog(1) does not make you accommodate the custom items in the -# height (but does for width) -- a height of 3 will display three lines and a -# full calendar, for example (whereas Xdialog will truncate the calendar if -# given a height of 3). For dialog(1), use these values for making sure that -# the height does not exceed max_height (obtained by f_dialog_max_size()). -# -DIALOG_CALENDAR_HEIGHT=15 -DIALOG_TIMEBOX_HEIGHT=6 - -############################################################ GENERIC FUNCTIONS - -# f_dialog_data_sanitize $var_to_edit ... -# -# When using dialog(1) or Xdialog(1) sometimes unintended warnings or errors -# are generated from underlying libraries. For example, if $LANG is set to an -# invalid or unknown locale, the warnings from the Xdialog(1) libraries will -# clutter the output. This function helps by providing a centralied function -# that removes spurious warnings from the dialog(1) (or Xdialog(1)) response. -# -# Simply pass the name of one or more variables that need to be sanitized. -# After execution, the variables will hold their newly-sanitized data. -# -f_dialog_data_sanitize() -{ - if [ "$#" -eq 0 ]; then - f_dprintf "%s: called with zero arguments" \ - f_dialog_response_sanitize - return $FAILURE - fi - - local __var_to_edit - for __var_to_edit in $*; do - # Skip warnings and trim leading/trailing whitespace - setvar $__var_to_edit "$( f_getvar $__var_to_edit | awk ' - BEGIN { data = 0 } - { - if ( ! data ) - { - if ( $0 ~ /^$/ ) next - if ( $0 ~ /^Gdk-WARNING \*\*:/ ) next - data = 1 - } - print - } - ' )" - done -} - -# f_dialog_line_sanitize $var_to_edit ... -# -# When using dialog(1) or Xdialog(1) sometimes unintended warnings or errors -# are generated from underlying libraries. For example, if $LANG is set to an -# invalid or unknown locale, the warnings from the Xdialog(1) libraries will -# clutter the output. This function helps by providing a centralied function -# that removes spurious warnings from the dialog(1) (or Xdialog(1)) response. -# -# Simply pass the name of one or more variables that need to be sanitized. -# After execution, the variables will hold their newly-sanitized data. -# -# This function, unlike f_dialog_data_sanitize(), also removes leading/trailing -# whitespace from each line. -# -f_dialog_line_sanitize() -{ - if [ "$#" -eq 0 ]; then - f_dprintf "%s: called with zero arguments" \ - f_dialog_response_sanitize - return $FAILURE - fi - - local __var_to_edit - for __var_to_edit in $*; do - # Skip warnings and trim leading/trailing whitespace - setvar $__var_to_edit "$( f_getvar $__var_to_edit | awk ' - BEGIN { data = 0 } - { - if ( ! data ) - { - if ( $0 ~ /^$/ ) next - if ( $0 ~ /^Gdk-WARNING \*\*:/ ) next - data = 1 - } - sub(/^[[:space:]]*/, "") - sub(/[[:space:]]*$/, "") - print - } - ' )" - done -} - -############################################################ TITLE FUNCTIONS - -# f_dialog_title [$new_title] -# -# Set the title of future dialog(1) ($DIALOG_TITLE) or backtitle of Xdialog(1) -# ($DIALOG_BACKTITLE) invocations. If no arguments are given or the first -# argument is NULL, the current title is returned. -# -# Each time this function is called, a backup of the current values is made -# allowing a one-time (single-level) restoration of the previous title using -# the f_dialog_title_restore() function (below). -# -f_dialog_title() -{ - local new_title="$1" - - if [ "${1+set}" ]; then - if [ "$USE_XDIALOG" ]; then - _DIALOG_BACKTITLE="$DIALOG_BACKTITLE" - DIALOG_BACKTITLE="$new_title" - else - _DIALOG_TITLE="$DIALOG_TITLE" - DIALOG_TITLE="$new_title" - fi - else - if [ "$USE_XDIALOG" ]; then - echo "$DIALOG_BACKTITLE" - else - echo "$DIALOG_TITLE" - fi - fi -} - -# f_dialog_title_restore -# -# Restore the previous title set by the last call to f_dialog_title(). -# Restoration is non-recursive and only works to restore the most-recent title. -# -f_dialog_title_restore() -{ - if [ "$USE_XDIALOG" ]; then - DIALOG_BACKTITLE="$_DIALOG_BACKTITLE" - else - DIALOG_TITLE="$_DIALOG_TITLE" - fi -} - -# f_dialog_backtitle [$new_backtitle] -# -# Set the backtitle of future dialog(1) ($DIALOG_BACKTITLE) or title of -# Xdialog(1) ($DIALOG_TITLE) invocations. If no arguments are given or the -# first argument is NULL, the current backtitle is returned. -# -f_dialog_backtitle() -{ - local new_backtitle="$1" - - if [ "${1+set}" ]; then - if [ "$USE_XDIALOG" ]; then - _DIALOG_TITLE="$DIALOG_TITLE" - DIALOG_TITLE="$new_backtitle" - else - _DIALOG_BACKTITLE="$DIALOG_BACKTITLE" - DIALOG_BACKTITLE="$new_backtitle" - fi - else - if [ "$USE_XDIALOG" ]; then - echo "$DIALOG_TITLE" - else - echo "$DIALOG_BACKTITLE" - fi - fi -} - -# f_dialog_backtitle_restore -# -# Restore the previous backtitle set by the last call to f_dialog_backtitle(). -# Restoration is non-recursive and only works to restore the most-recent -# backtitle. -# -f_dialog_backtitle_restore() -{ - if [ "$USE_XDIALOG" ]; then - DIALOG_TITLE="$_DIALOG_TITLE" - else - DIALOG_BACKTITLE="$_DIALOG_BACKTITLE" - fi -} - -############################################################ SIZE FUNCTIONS - -# f_dialog_max_size $var_height $var_width -# -# Get the maximum height and width for a dialog widget and store the values in -# $var_height and $var_width (respectively). -# -f_dialog_max_size() -{ - local funcname=f_dialog_max_size - local __var_height="$1" __var_width="$2" __max_size - [ "$__var_height" -o "$__var_width" ] || return $FAILURE - if [ "$USE_XDIALOG" ]; then - __max_size="$XDIALOG_MAXSIZE" # see CONFIGURATION - else - if __max_size=$( $DIALOG --print-maxsize \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - then - f_dprintf "$funcname: %s --print-maxsize = [%s]" \ - "$DIALOG" "$__max_size" - # usually "MaxSize: 24, 80" - __max_size="${__max_size#*: }" - f_replaceall "$__max_size" "," "" __max_size - else - f_eval_catch -dk __max_size $funcname stty \ - 'stty size' || __max_size= - # usually "24 80" - fi - : ${__max_size:=$DEFAULT_TERMINAL_SIZE} - fi - if [ "$__var_height" ]; then - local __height="${__max_size%%[$IFS]*}" - # - # If we're not using Xdialog(1), we should assume that $DIALOG - # will render --backtitle behind the widget. In such a case, we - # should prevent a widget from obscuring the backtitle (unless - # $NO_BACKTITLE is set and non-NULL, allowing a trap-door). - # - if [ ! "$USE_XDIALOG" ] && [ ! "$NO_BACKTITLE" ]; then - # - # If use_shadow (in ~/.dialogrc) is OFF, we need to - # subtract 4, otherwise 5. However, don't check this - # every time, rely on an initialization variable set - # by f_dialog_init(). - # - local __adjust=5 - [ "$NO_SHADOW" ] && __adjust=4 - - # Don't adjust height if already too small (allowing - # obscured backtitle for small values of __height). - [ ${__height:-0} -gt 11 ] && - __height=$(( $__height - $__adjust )) - fi - setvar "$__var_height" "$__height" - fi - [ "$__var_width" ] && setvar "$__var_width" "${__max_size##*[$IFS]}" -} - -# f_dialog_size_constrain $var_height $var_width [$min_height [$min_width]] -# -# Modify $var_height to be no-less-than $min_height (if given; zero otherwise) -# and no-greater-than terminal height (or screen height if $USE_XDIALOG is -# set). -# -# Also modify $var_width to be no-less-than $XDIALOG_MIN_WIDTH (or -# $XDIALOG_MIN_WIDTH if $_USE_XDIALOG is set) and no-greater-than terminal -# or screen width. The use of $[X]DIALOG_MIN_WIDTH can be overridden by -# passing $min_width. -# -# Return status is success unless one of the passed arguments is invalid -# or all of the $var_* arguments are either NULL or missing. -# -f_dialog_size_constrain() -{ - local __var_height="$1" __var_width="$2" - local __min_height="$3" __min_width="$4" - local __retval=$SUCCESS - - # Return failure unless at least one var_* argument is passed - [ "$__var_height" -o "$__var_width" ] || return $FAILURE - - # - # Print debug warnings if any given (non-NULL) argument are invalid - # NOTE: Don't change the name of $__{var,min,}{height,width} - # - local __height __width - local __arg __cp __fname=f_dialog_size_constrain - for __arg in height width; do - debug= f_getvar __var_$__arg __cp - [ "$__cp" ] || continue - if ! debug= f_getvar "$__cp" __$__arg; then - f_dprintf "%s: var_%s variable \`%s' not set" \ - $__fname $__arg "$__cp" - __retval=$FAILURE - elif ! eval f_isinteger \$__$__arg; then - f_dprintf "%s: var_%s variable value not a number" \ - $__fname $__arg - __retval=$FAILURE - fi - done - for __arg in height width; do - debug= f_getvar __min_$__arg __cp - [ "$__cp" ] || continue - f_isinteger "$__cp" && continue - f_dprintf "%s: min_%s value not a number" $__fname $__arg - __retval=$FAILURE - setvar __min_$__arg "" - done - - # Obtain maximum height and width values - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - local __max_height_size_constain __max_width_size_constrain - f_dialog_max_size \ - __max_height_size_constrain __max_width_size_constrain - - # Adjust height if desired - if [ "$__var_height" ]; then - if [ $__height -lt ${__min_height:-0} ]; then - setvar "$__var_height" $__min_height - elif [ $__height -gt $__max_height_size_constrain ]; then - setvar "$__var_height" $__max_height_size_constrain - fi - fi - - # Adjust width if desired - if [ "$__var_width" ]; then - if [ "$USE_XDIALOG" ]; then - : ${__min_width:=${XDIALOG_MIN_WIDTH:-35}} - else - : ${__min_width:=${DIALOG_MIN_WIDTH:-24}} - fi - if [ $__width -lt $__min_width ]; then - setvar "$__var_width" $__min_width - elif [ $__width -gt $__max_width_size_constrain ]; then - setvar "$__var_width" $__max_width_size_constrain - fi - fi - - if [ "$debug" ]; then - # Print final constrained values to debugging - [ "$__var_height" ] && f_quietly f_getvar "$__var_height" - [ "$__var_width" ] && f_quietly f_getvar "$__var_width" - fi - - return $__retval # success if no debug warnings were printed -} - -# f_dialog_menu_constrain $var_height $var_width $var_rows "$prompt" \ -# [$min_height [$min_width [$min_rows]]] -# -# Modify $var_height to be no-less-than $min_height (if given; zero otherwise) -# and no-greater-than terminal height (or screen height if $USE_XDIALOG is -# set). -# -# Also modify $var_width to be no-less-than $XDIALOG_MIN_WIDTH (or -# $XDIALOG_MIN_WIDTH if $_USE_XDIALOG is set) and no-greater-than terminal -# or screen width. The use of $[X]DIALOG_MIN_WIDTH can be overridden by -# passing $min_width. -# -# Last, modify $var_rows to be no-less-than $min_rows (if specified; zero -# otherwise) and no-greater-than (max_height - 8) where max_height is the -# terminal height (or screen height if $USE_XDIALOG is set). If $prompt is NULL -# or missing, dialog(1) allows $var_rows to be (max_height - 7), maximizing the -# number of visible rows. -# -# Return status is success unless one of the passed arguments is invalid -# or all of the $var_* arguments are either NULL or missing. -# -f_dialog_menu_constrain() -{ - local __var_height="$1" __var_width="$2" __var_rows="$3" __prompt="$4" - local __min_height="$5" __min_width="$6" __min_rows="$7" - - # Return failure unless at least one var_* argument is passed - [ "$__var_height" -o "$__var_width" -o "$__var_rows" ] || - return $FAILURE - - # - # Print debug warnings if any given (non-NULL) argument are invalid - # NOTE: Don't change the name of $__{var,min,}{height,width,rows} - # - local __height_menu_constrain __width_menu_constrain - local __rows_menu_constrain - local __arg __cp __fname=f_dialog_menu_constrain - for __arg in height width rows; do - debug= f_getvar __var_$__arg __cp - [ "$__cp" ] || continue - if ! debug= f_getvar "$__cp" __${__arg}_menu_constrain; then - f_dprintf "%s: var_%s variable \`%s' not set" \ - $__fname $__arg "$__cp" - __retval=$FAILURE - elif ! eval f_isinteger \$__${__arg}_menu_constrain; then - f_dprintf "%s: var_%s variable value not a number" \ - $__fname $__arg - __retval=$FAILURE - fi - done - for __arg in height width rows; do - debug= f_getvar __min_$__arg __cp - [ "$__cp" ] || continue - f_isinteger "$__cp" && continue - f_dprintf "%s: min_%s value not a number" $__fname $__arg - __retval=$FAILURE - setvar __min_$__arg "" - done - - # Obtain maximum height and width values - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - local __max_height_menu_constrain __max_width_menu_constrain - f_dialog_max_size \ - __max_height_menu_constrain __max_width_menu_constrain - - # Adjust height if desired - if [ "$__var_height" ]; then - if [ $__height_menu_constrain -lt ${__min_height:-0} ]; then - setvar "$__var_height" $__min_height - elif [ $__height_menu_constrain -gt \ - $__max_height_menu_constrain ] - then - setvar "$__var_height" $__max_height_menu_constrain - fi - fi - - # Adjust width if desired - if [ "$__var_width" ]; then - if [ "$USE_XDIALOG" ]; then - : ${__min_width:=${XDIALOG_MIN_WIDTH:-35}} - else - : ${__min_width:=${DIALOG_MIN_WIDTH:-24}} - fi - if [ $__width_menu_constrain -lt $__min_width ]; then - setvar "$__var_width" $__min_width - elif [ $__width_menu_constrain -gt \ - $__max_width_menu_constrain ] - then - setvar "$__var_width" $__max_width_menu_constrain - fi - fi - - # Adjust rows if desired - if [ "$__var_rows" ]; then - if [ "$USE_XDIALOG" ]; then - : ${__min_rows:=1} - else - : ${__min_rows:=0} - fi - - local __max_rows_menu_constrain=$(( - $__max_height_menu_constrain - 7 - )) - # If prompt_len is zero (no prompt), bump the max-rows by 1 - # Default assumption is (if no argument) that there's no prompt - [ ${__prompt_len:-0} -gt 0 ] || __max_rows_menu_constrain=$(( - $__max_rows_menu_constrain + 1 - )) - - if [ $__rows_menu_constrain -lt $__min_rows ]; then - setvar "$__var_rows" $__min_rows - elif [ $__rows_menu_constrain -gt $__max_rows_menu_constrain ] - then - setvar "$__var_rows" $__max_rows_menu_constrain - fi - fi - - if [ "$debug" ]; then - # Print final constrained values to debugging - [ "$__var_height" ] && f_quietly f_getvar "$__var_height" - [ "$__var_width" ] && f_quietly f_getvar "$__var_width" - [ "$__var_rows" ] && f_quietly f_getvar "$__var_rows" - fi - - return $__retval # success if no debug warnings were printed -} - -# f_dialog_infobox_size [-n] $var_height $var_width \ -# $title $backtitle $prompt [$hline] -# -# Not all versions of dialog(1) perform auto-sizing of the width and height of -# `--infobox' boxes sensibly. -# -# This function helps solve this issue by taking two sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height and width. The second set of arguments are the -# title, backtitle, prompt, and [optionally] hline. The optimal height and -# width for the described widget (not exceeding the actual terminal height or -# width) is stored in $var_height and $var_width (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height and -# $var_width) are not constrained to minimum/maximum values. -# -# Newline character sequences (``\n'') in $prompt are expanded as-is done by -# dialog(1). -# -f_dialog_infobox_size() -{ - local __constrain=1 - [ "$1" = "-n" ] && __constrain= && shift 1 # -n - local __var_height="$1" __var_width="$2" - local __title="$3" __btitle="$4" __prompt="$5" __hline="$6" - - # Return unless at least one size aspect has been requested - [ "$__var_height" -o "$__var_width" ] || return $FAILURE - - # Default height/width of zero for auto-sizing - local __height=0 __width=0 __n - - # Adjust height if desired - if [ "$__var_height" ]; then - # - # Set height based on number of rows in prompt - # - __n=$( echo -n "$__prompt" | f_number_of_lines ) - __n=$(( $__n + 2 )) - [ $__n -gt $__height ] && __height=$__n - - # - # For Xdialog(1) bump height if backtitle is enabled (displayed - # in the X11 window with a separator line between the backtitle - # and msg text). - # - if [ "$USE_XDIALOG" -a "$__btitle" ]; then - __n=$( echo "$__btitle" | f_number_of_lines ) - __height=$(( $__height + $__n + 2 )) - fi - - setvar "$__var_height" $__height - fi - - # Adjust width if desired - if [ "$__var_width" ]; then - # - # Bump width for long titles - # - __n=$(( ${#__title} + 4 )) - [ $__n -gt $__width ] && __width=$__n - - # - # If using Xdialog(1), bump width for long backtitles (which - # appear within the window). - # - if [ "$USE_XDIALOG" ]; then - __n=$(( ${#__btitle} + 4 )) - [ $__n -gt $__width ] && __width=$__n - fi - - # - # Bump width for long prompts - # - __n=$( echo "$__prompt" | f_longest_line_length ) - __n=$(( $__n + 4 )) # add width for border - [ $__n -gt $__width ] && __width=$__n - - # - # Bump width for long hlines. Xdialog(1) supports `--hline' but - # it's currently not used (so don't do anything here if using - # Xdialog(1)). - # - if [ ! "$USE_XDIALOG" ]; then - __n=$(( ${#__hline} + 12 )) - [ $__n -gt $__width ] && __width=$__n - fi - - # Bump width by 16.6% if using Xdialog(1) - [ "$USE_XDIALOG" ] && __width=$(( $__width + $__width / 6 )) - - setvar "$__var_width" $__width - fi - - # Constrain values to sensible minimums/maximums unless `-n' was passed - # Return success if no-constrain, else return status from constrain - [ ! "$__constrain" ] || - f_dialog_size_constrain "$__var_height" "$__var_width" -} - -# f_dialog_buttonbox_size [-n] $var_height $var_width \ -# $title $backtitle $prompt [$hline] -# -# Not all versions of dialog(1) perform auto-sizing of the width and height of -# `--msgbox' and `--yesno' boxes sensibly. -# -# This function helps solve this issue by taking two sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height and width. The second set of arguments are the -# title, backtitle, prompt, and [optionally] hline. The optimal height and -# width for the described widget (not exceeding the actual terminal height or -# width) is stored in $var_height and $var_width (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height and -# $var_width) are not constrained to minimum/maximum values. -# -# Newline character sequences (``\n'') in $prompt are expanded as-is done by -# dialog(1). -# -f_dialog_buttonbox_size() -{ - local __constrain=1 - [ "$1" = "-n" ] && __constrain= && shift 1 # -n - local __var_height="$1" __var_width="$2" - local __title="$3" __btitle="$4" __prompt="$5" __hline="$6" - - # Return unless at least one size aspect has been requested - [ "$__var_height" -o "$__var_width" ] || return $FAILURE - - # Calculate height/width of infobox (adjusted/constrained below) - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - local __height_bbox_size __width_bbox_size - f_dialog_infobox_size -n \ - "${__var_height:+__height_bbox_size}" \ - "${__var_width:+__width_bbox_size}" \ - "$__title" "$__btitle" "$__prompt" "$__hline" - - # Adjust height if desired - if [ "$__var_height" ]; then - # Add height to accommodate the buttons - __height_bbox_size=$(( $__height_bbox_size + 2 )) - - # Adjust for clipping with Xdialog(1) on Linux/GTK2 - [ "$USE_XDIALOG" ] && - __height_bbox_size=$(( $__height_bbox_size + 3 )) - - setvar "$__var_height" $__height_bbox_size - fi - - # No adjustemnts to width, just pass-thru the infobox width - if [ "$__var_width" ]; then - setvar "$__var_width" $__width_bbox_size - fi - - # Constrain values to sensible minimums/maximums unless `-n' was passed - # Return success if no-constrain, else return status from constrain - [ ! "$__constrain" ] || - f_dialog_size_constrain "$__var_height" "$__var_width" -} - -# f_dialog_inputbox_size [-n] $var_height $var_width \ -# $title $backtitle $prompt $init [$hline] -# -# Not all versions of dialog(1) perform auto-sizing of the width and height of -# `--inputbox' boxes sensibly. -# -# This function helps solve this issue by taking two sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height and width. The second set of arguments are the -# title, backtitle, prompt, and [optionally] hline. The optimal height and -# width for the described widget (not exceeding the actual terminal height or -# width) is stored in $var_height and $var_width (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height and -# $var_width) are not constrained to minimum/maximum values. -# -# Newline character sequences (``\n'') in $prompt are expanded as-is done by -# dialog(1). -# -f_dialog_inputbox_size() -{ - local __constrain=1 - [ "$1" = "-n" ] && __constrain= && shift 1 # -n - local __var_height="$1" __var_width="$2" - local __title="$3" __btitle="$4" __prompt="$5" __init="$6" __hline="$7" - - # Return unless at least one size aspect has been requested - [ "$__var_height" -o "$__var_width" ] || return $FAILURE - - # Calculate height/width of buttonbox (adjusted/constrained below) - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - local __height_ibox_size __width_ibox_size - f_dialog_buttonbox_size -n \ - "${__var_height:+__height_ibox_size}" \ - "${__var_width:+__width_ibox_size}" \ - "$__title" "$__btitle" "$__prompt" "$__hline" - - # Adjust height if desired - if [ "$__var_height" ]; then - # Add height for input box (not needed for Xdialog(1)) - [ ! "$USE_XDIALOG" ] && - __height_ibox_size=$(( $__height_ibox_size + 3 )) - - setvar "$__var_height" $__height_ibox_size - fi - - # Adjust width if desired - if [ "$__var_width" ]; then - # Bump width for initial text (something neither dialog(1) nor - # Xdialog(1) do, but worth it!; add 16.6% if using Xdialog(1)) - local __n=$(( ${#__init} + 7 )) - [ "$USE_XDIALOG" ] && __n=$(( $__n + $__n / 6 )) - [ $__n -gt $__width_ibox_size ] && __width_ibox_size=$__n - - setvar "$__var_width" $__width_ibox_size - fi - - # Constrain values to sensible minimums/maximums unless `-n' was passed - # Return success if no-constrain, else return status from constrain - [ ! "$__constrain" ] || - f_dialog_size_constrain "$__var_height" "$__var_width" -} - -# f_xdialog_2inputsbox_size [-n] $var_height $var_width \ -# $title $backtitle $prompt \ -# $label1 $init1 $label2 $init2 -# -# Xdialog(1) does not perform auto-sizing of the width and height of -# `--2inputsbox' boxes sensibly. -# -# This function helps solve this issue by taking two sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height and width. The second set of arguments are the -# title, backtitle, prompt, label for the first field, initial text for said -# field, label for the second field, and initial text for said field. The -# optimal height and width for the described widget (not exceeding the actual -# terminal height or width) is stored in $var_height and $var_width -# (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height and -# $var_width) are not constrained to minimum/maximum values. -# -# Newline character sequences (``\n'') in $prompt are expanded as-is done by -# Xdialog(1). -# -f_xdialog_2inputsbox_size() -{ - local __constrain=1 - [ "$1" = "-n" ] && __constrain= && shift 1 # -n - local __var_height="$1" __var_width="$2" - local __title="$3" __btitle="$4" __prompt="$5" - local __label1="$6" __init1="$7" __label2="$8" __init2="$9" - - # Return unless at least one size aspect has been requested - [ "$__var_height" -o "$__var_width" ] || return $FAILURE - - # Calculate height/width of inputbox (adjusted/constrained below) - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - local __height_2ibox_size __width_2ibox_size - f_dialog_inputbox_size -n \ - "${__var_height:+__height_2ibox_size}" \ - "${__var_width:+__width_2ibox_size}" \ - "$__title" "$__btitle" "$__prompt" "$__hline" "$__init1" - - # Adjust height if desired - if [ "$__var_height" ]; then - # Add height for 1st label, 2nd label, and 2nd input box - __height_2ibox_size=$(( $__height_2ibox_size + 2 + 2 + 2 )) - setvar "$__var_height" $__height_2ibox_size - fi - - # Adjust width if desired - if [ "$__var_width" ]; then - local __n - - # Bump width for first label text (+16.6% since Xdialog(1)) - __n=$(( ${#__label1} + 7 )) - __n=$(( $__n + $__n / 6 )) - [ $__n -gt $__width_2ibox_size ] && __width_2ibox_size=$__n - - # Bump width for second label text (+16.6% since Xdialog(1)) - __n=$(( ${#__label2} + 7 )) - __n=$(( $__n + $__n / 6 )) - [ $__n -gt $__width_2ibox_size ] && __width_2ibox_size=$__n - - # Bump width for 2nd initial text (something neither dialog(1) - # nor Xdialog(1) do, but worth it!; +16.6% since Xdialog(1)) - __n=$(( ${#__init2} + 7 )) - __n=$(( $__n + $__n / 6 )) - [ $__n -gt $__width_2ibox_size ] && __width_2ibox_size=$__n - - setvar "$__var_width" $__width_2ibox_size - fi - - # Constrain values to sensible minimums/maximums unless `-n' was passed - # Return success if no-constrain, else return status from constrain - [ ! "$__constrain" ] || - f_dialog_size_constrain "$__var_height" "$__var_width" -} - -# f_dialog_menu_size [-n] $var_height $var_width $var_rows \ -# $title $backtitle $prompt $hline \ -# $tag1 $item1 $tag2 $item2 ... -# -# Not all versions of dialog(1) perform auto-sizing of the width and height of -# `--menu' boxes sensibly. -# -# This function helps solve this issue by taking three sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height, width, and rows. The second set of arguments -# are the title, backtitle, prompt, and hline. The [optional] third set of -# arguments are the menu list itself (comprised of tag/item couplets). The -# optimal height, width, and rows for the described widget (not exceeding the -# actual terminal height or width) is stored in $var_height, $var_width, and -# $var_rows (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height, $var_width, -# and $var_rows) are not constrained to minimum/maximum values. -# -f_dialog_menu_size() -{ - local __constrain=1 - [ "$1" = "-n" ] && __constrain= && shift 1 # -n - local __var_height="$1" __var_width="$2" __var_rows="$3" - local __title="$4" __btitle="$5" __prompt="$6" __hline="$7" - shift 7 # var_height/var_width/var_rows/title/btitle/prompt/hline - - # Return unless at least one size aspect has been requested - [ "$__var_height" -o "$__var_width" -o "$__var_rows" ] || - return $FAILURE - - # Calculate height/width of infobox (adjusted/constrained below) - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - local __height_menu_size __width_menu_size - f_dialog_infobox_size -n \ - "${__var_height:+__height_menu_size}" \ - "${__var_width:+__width_menu_size}" \ - "$__title" "$__btitle" "$__prompt" "$__hline" - - # - # Always process the menu-item arguments to get the longest tag-length, - # longest item-length (both used to bump the width), and the number of - # rows (used to bump the height). - # - local __longest_tag=0 __longest_item=0 __rows=0 - while [ $# -ge 2 ]; do - local __tag="$1" __item="$2" - shift 2 # tag/item - [ ${#__tag} -gt $__longest_tag ] && __longest_tag=${#__tag} - [ ${#__item} -gt $__longest_item ] && __longest_item=${#__item} - __rows=$(( $__rows + 1 )) - done - - # Adjust rows early (for up-comning height calculation) - if [ "$__var_height" -o "$__var_rows" ]; then - # Add a row for visual aid if using Xdialog(1) - [ "$USE_XDIALOG" ] && __rows=$(( $__rows + 1 )) - fi - - # Adjust height if desired - if [ "$__var_height" ]; then - # Add rows to height - if [ "$USE_XDIALOG" ]; then - __height_menu_size=$(( - $__height_menu_size + $__rows + 7 )) - else - __height_menu_size=$(( - $__height_menu_size + $__rows + 4 )) - fi - setvar "$__var_height" $__height_menu_size - fi - - # Adjust width if desired - if [ "$__var_width" ]; then - # The sum total between the longest tag-length and the - # longest item-length should be used to bump menu width - local __n=$(( $__longest_tag + $__longest_item + 10 )) - [ "$USE_XDIALOG" ] && __n=$(( $__n + $__n / 6 )) # plus 16.6% - [ $__n -gt $__width_menu_size ] && __width_menu_size=$__n - - setvar "$__var_width" $__width_menu_size - fi - - # Store adjusted rows if desired - [ "$__var_rows" ] && setvar "$__var_rows" $__rows - - # Constrain height, width, and rows to sensible minimum/maximum values - # Return success if no-constrain, else return status from constrain - [ ! "$__constrain" ] || f_dialog_menu_constrain \ - "$__var_height" "$__var_width" "$__var_rows" "$__prompt" -} - -# f_dialog_menu_with_help_size [-n] $var_height $var_width $var_rows \ -# $title $backtitle $prompt $hline \ -# $tag1 $item1 $help1 $tag2 $item2 $help2 ... -# -# Not all versions of dialog(1) perform auto-sizing of the width and height of -# `--menu' boxes sensibly. -# -# This function helps solve this issue by taking three sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height, width, and rows. The second set of arguments -# are the title, backtitle, prompt, and hline. The [optional] third set of -# arguments are the menu list itself (comprised of tag/item/help triplets). The -# optimal height, width, and rows for the described widget (not exceeding the -# actual terminal height or width) is stored in $var_height, $var_width, and -# $var_rows (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height, $var_width, -# and $var_rows) are not constrained to minimum/maximum values. -# -f_dialog_menu_with_help_size() -{ - local __constrain=1 - [ "$1" = "-n" ] && __constrain= && shift 1 # -n - local __var_height="$1" __var_width="$2" __var_rows="$3" - local __title="$4" __btitle="$5" __prompt="$6" __hline="$7" - shift 7 # var_height/var_width/var_rows/title/btitle/prompt/hline - - # Return unless at least one size aspect has been requested - [ "$__var_height" -o "$__var_width" -o "$__var_rows" ] || - return $FAILURE - - # Calculate height/width of infobox (adjusted/constrained below) - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - local __height_menu_with_help_size __width_menu_with_help_size - f_dialog_infobox_size -n \ - "${__var_height:+__height_menu_with_help_size}" \ - "${__var_width:+__width_menu_with_help_size}" \ - "$__title" "$__btitle" "$__prompt" "$__hline" - - # - # Always process the menu-item arguments to get the longest tag-length, - # longest item-length, longest help-length (help-length only considered - # if using Xdialog(1), as it places the help string in the widget) -- - # all used to bump the width -- and the number of rows (used to bump - # the height). - # - local __longest_tag=0 __longest_item=0 __longest_help=0 __rows=0 - while [ $# -ge 3 ]; do - local __tag="$1" __item="$2" __help="$3" - shift 3 # tag/item/help - [ ${#__tag} -gt $__longest_tag ] && __longest_tag=${#__tag} - [ ${#__item} -gt $__longest_item ] && __longest_item=${#__item} - [ ${#__help} -gt $__longest_help ] && __longest_help=${#__help} - __rows=$(( $__rows + 1 )) - done - - # Adjust rows early (for up-coming height calculation) - if [ "$__var_height" -o "$__var_rows" ]; then - # Add a row for visual aid if using Xdialog(1) - [ "$USE_XDIALOG" ] && __rows=$(( $__rows + 1 )) - fi - - # Adjust height if desired - if [ "$__var_height" ]; then - # Add rows to height - if [ "$USE_XDIALOG" ]; then - __height_menu_with_help_size=$(( - $__height_menu_with_help_size + $__rows + 8 )) - else - __height_menu_with_help_size=$(( - $__height_menu_with_help_size + $__rows + 4 )) - fi - setvar "$__var_height" $__height_menu_with_help_size - fi - - # Adjust width if desired - if [ "$__var_width" ]; then - # The sum total between the longest tag-length and the - # longest item-length should be used to bump menu width - local __n=$(( $__longest_tag + $__longest_item + 10 )) - [ "$USE_XDIALOG" ] && __n=$(( $__n + $__n / 6 )) # plus 16.6% - [ $__n -gt $__width_menu_with_help_size ] && - __width_menu_with_help_size=$__n - - # Update width for help text if using Xdialog(1) - if [ "$USE_XDIALOG" ]; then - __n=$(( $__longest_help + 10 )) - __n=$(( $__n + $__n / 6 )) # plus 16.6% - [ $__n -gt $__width_menu_with_help_size ] && - __width_menu_with_help_size=$__n - fi - - setvar "$__var_width" $__width_menu_with_help_size - fi - - # Store adjusted rows if desired - [ "$__var_rows" ] && setvar "$__var_rows" $__rows - - # Constrain height, width, and rows to sensible minimum/maximum values - # Return success if no-constrain, else return status from constrain - [ ! "$__constrain" ] || f_dialog_menu_constrain \ - "$__var_height" "$__var_width" "$__var_rows" "$__prompt" -} - -# f_dialog_radiolist_size [-n] $var_height $var_width $var_rows \ -# $title $backtitle $prompt $hline \ -# $tag1 $item1 $status1 $tag2 $item2 $status2 ... -# -# Not all versions of dialog(1) perform auto-sizing of the width and height of -# `--radiolist' boxes sensibly. -# -# This function helps solve this issue by taking three sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height, width, and rows. The second set of arguments -# are the title, backtitle, prompt, and hline. The [optional] third set of -# arguments are the radio list itself (comprised of tag/item/status triplets). -# The optimal height, width, and rows for the described widget (not exceeding -# the actual terminal height or width) is stored in $var_height, $var_width, -# and $var_rows (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height, $var_width, -# and $var_rows) are not constrained to minimum/maximum values. -# -f_dialog_radiolist_size() -{ - local __constrain=1 - [ "$1" = "-n" ] && __constrain= && shift 1 # -n - local __var_height="$1" __var_width="$2" __var_rows="$3" - local __title="$4" __btitle="$5" __prompt="$6" __hline="$7" - shift 7 # var_height/var_width/var_rows/title/btitle/prompt/hline - - # Return unless at least one size aspect has been requested - [ "$__var_height" -o "$__var_width" -o "$__var_rows" ] || - return $FAILURE - - # Calculate height/width of infobox (adjusted/constrained below) - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - local __height_rlist_size __width_rlist_size - f_dialog_infobox_size -n \ - "${__var_height:+__height_rlist_size}" \ - "${__var_width:+__width_rlist_size}" \ - "$__title" "$__btitle" "$__prompt" "$__hline" - - # - # Always process the menu-item arguments to get the longest tag-length, - # longest item-length (both used to bump the width), and the number of - # rows (used to bump the height). - # - local __longest_tag=0 __longest_item=0 __rows_rlist_size=0 - while [ $# -ge 3 ]; do - local __tag="$1" __item="$2" - shift 3 # tag/item/status - [ ${#__tag} -gt $__longest_tag ] && __longest_tag=${#__tag} - [ ${#__item} -gt $__longest_item ] && __longest_item=${#__item} - __rows_rlist_size=$(( $__rows_rlist_size + 1 )) - done - - # Adjust rows early (for up-coming height calculation) - if [ "$__var_height" -o "$__var_rows" ]; then - # Add a row for visual aid if using Xdialog(1) - [ "$USE_XDIALOG" ] && - __rows_rlist_size=$(( $__rows_rlist_size + 1 )) - fi - - # Adjust height if desired - if [ "$__var_height" ]; then - # Add rows to height - if [ "$USE_XDIALOG" ]; then - __height_rlist_size=$(( - $__height_rlist_size + $__rows_rlist_size + 7 - )) - else - __height_rlist_size=$(( - $__height_rlist_size + $__rows_rlist_size + 4 - )) - fi - setvar "$__var_height" $__height_rlist_size - fi - - # Adjust width if desired - if [ "$__var_width" ]; then - # Sum total between longest tag-length, longest item-length, - # and radio-button width should be used to bump menu width - local __n=$(( $__longest_tag + $__longest_item + 13 )) - [ "$USE_XDIALOG" ] && __n=$(( $__n + $__n / 6 )) # plus 16.6% - [ $__n -gt $__width_rlist_size ] && __width_rlist_size=$__n - - setvar "$__var_width" $__width_rlist_size - fi - - # Store adjusted rows if desired - [ "$__var_rows" ] && setvar "$__var_rows" $__rows_rlist_size - - # Constrain height, width, and rows to sensible minimum/maximum values - # Return success if no-constrain, else return status from constrain - [ ! "$__constrain" ] || f_dialog_menu_constrain \ - "$__var_height" "$__var_width" "$__var_rows" "$__prompt" -} - -# f_dialog_checklist_size [-n] $var_height $var_width $var_rows \ -# $title $backtitle $prompt $hline \ -# $tag1 $item1 $status1 $tag2 $item2 $status2 ... -# -# Not all versions of dialog(1) perform auto-sizing of the width and height of -# `--checklist' boxes sensibly. -# -# This function helps solve this issue by taking three sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height, width, and rows. The second set of arguments -# are the title, backtitle, prompt, and hline. The [optional] third set of -# arguments are the check list itself (comprised of tag/item/status triplets). -# The optimal height, width, and rows for the described widget (not exceeding -# the actual terminal height or width) is stored in $var_height, $var_width, -# and $var_rows (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height, $var_width, -# and $var_rows) are not constrained to minimum/maximum values. -# -f_dialog_checklist_size() -{ - f_dialog_radiolist_size "$@" -} - -# f_dialog_radiolist_with_help_size [-n] $var_height $var_width $var_rows \ -# $title $backtitle $prompt $hline \ -# $tag1 $item1 $status1 $help1 \ -# $tag2 $item2 $status2 $help2 ... -# -# Not all versions of dialog(1) perform auto-sizing of the width and height of -# `--radiolist' boxes sensibly. -# -# This function helps solve this issue by taking three sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height, width, and rows. The second set of arguments -# are the title, backtitle, prompt, and hline. The [optional] third set of -# arguments are the radio list itself (comprised of tag/item/status/help -# quadruplets). The optimal height, width, and rows for the described widget -# (not exceeding the actual terminal height or width) is stored in $var_height, -# $var_width, and $var_rows (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height, $var_width, -# and $var_rows) are not constrained to minimum/maximum values. -# -f_dialog_radiolist_with_help_size() -{ - local __constrain=1 - [ "$1" = "-n" ] && __constrain= && shift 1 # -n - local __var_height="$1" __var_width="$2" __var_rows="$3" - local __title="$4" __btitle="$5" __prompt="$6" __hline="$7" - shift 7 # var_height/var_width/var_rows/title/btitle/prompt/hline - - # Return unless at least one size aspect has been requested - [ "$__var_height" -o "$__var_width" -o "$__var_rows" ] || - return $FAILURE - - # Calculate height/width of infobox (adjusted/constrained below) - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - local __height_rlist_with_help_size __width_rlist_with_help_size - f_dialog_infobox_size -n \ - "${__var_height:+__height_rlist_with_help_size}" \ - "${__var_width:+__width_rlist_with_help_size}" \ - "$__title" "$__btitle" "$__prompt" "$__hline" - - # - # Always process the menu-item arguments to get the longest tag-length, - # longest item-length, longest help-length (help-length only considered - # if using Xdialog(1), as it places the help string in the widget) -- - # all used to bump the width -- and the number of rows (used to bump - # the height). - # - local __longest_tag=0 __longest_item=0 __longest_help=0 - local __rows_rlist_with_help_size=0 - while [ $# -ge 4 ]; do - local __tag="$1" __item="$2" __status="$3" __help="$4" - shift 4 # tag/item/status/help - [ ${#__tag} -gt $__longest_tag ] && __longest_tag=${#__tag} - [ ${#__item} -gt $__longest_item ] && __longest_item=${#__item} - [ ${#__help} -gt $__longest_help ] && __longest_help=${#__help} - __rows_rlist_with_help_size=$(( - $__rows_rlist_with_help_size + 1 - )) - done - - # Adjust rows early (for up-coming height calculation) - if [ "$__var_height" -o "$__var_rows" ]; then - # Add a row for visual aid if using Xdialog(1) - [ "$USE_XDIALOG" ] && - __rows_rlist_with_help_size=$(( - $__rows_rlist_with_help_size + 1 - )) - fi - - # Adjust height if desired - if [ "$__var_height" ]; then - # Add rows to height - if [ "$USE_XDIALOG" ]; then - __height_rlist_with_help_size=$(( - $__height_rlist_with_help_size + - $__rows_rlist_with_help_size + 7 - )) - else - __height_rlist_with_help_size=$(( - $__height_rlist_with_help_size + - $__rows_rlist_with_help_size + 4 - )) - fi - setvar "$__var_height" $__height - fi - - # Adjust width if desired - if [ "$__var_width" ]; then - # Sum total between longest tag-length, longest item-length, - # and radio-button width should be used to bump menu width - local __n=$(( $__longest_tag + $__longest_item + 13 )) - [ "$USE_XDIALOG" ] && __n=$(( $__n + $__n / 6 )) # plus 16.6% - [ $__n -gt $__width_rlist_with_help_size ] && - __width_rlist_with_help_size=$__n - - # Update width for help text if using Xdialog(1) - if [ "$USE_XDIALOG" ]; then - __n=$(( $__longest_help + 10 )) - __n=$(( $__n + $__n / 6 )) # plus 16.6% - [ $__n -gt $__width_rlist_with_help_size ] && - __width_rlist_with_help_size=$__n - fi - - setvar "$__var_width" $__width_rlist_with_help_size - fi - - # Store adjusted rows if desired - [ "$__var_rows" ] && setvar "$__var_rows" $__rows_rlist_with_help_size - - # Constrain height, width, and rows to sensible minimum/maximum values - # Return success if no-constrain, else return status from constrain - [ ! "$__constrain" ] || f_dialog_menu_constrain \ - "$__var_height" "$__var_width" "$__var_rows" "$__prompt" -} - -# f_dialog_checklist_with_help_size [-n] $var_height $var_width $var_rows \ -# $title $backtitle $prompt $hline \ -# $tag1 $item1 $status1 $help1 \ -# $tag2 $item2 $status2 $help2 ... -# -# Not all versions of dialog(1) perform auto-sizing of the width and height of -# `--checklist' boxes sensibly. -# -# This function helps solve this issue by taking three sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height, width, and rows. The second set of arguments -# are the title, backtitle, prompt, and hline. The [optional] third set of -# arguments are the check list itself (comprised of tag/item/status/help -# quadruplets). The optimal height, width, and rows for the described widget -# (not exceeding the actual terminal height or width) is stored in $var_height, -# $var_width, and $var_rows (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height, $var_width, -# and $var_rows) are not constrained to minimum/maximum values. -# -f_dialog_checklist_with_help_size() -{ - f_dialog_radiolist_with_help_size "$@" -} - -# f_dialog_calendar_size [-n] $var_height $var_width \ -# $title $backtitle $prompt [$hline] -# -# Not all versions of dialog(1) perform auto-sizing of the width and height of -# `--calendar' boxes sensibly. -# -# This function helps solve this issue by taking two sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height and width. The second set of arguments are the -# title, backtitle, prompt, and [optionally] hline. The optimal height and -# width for the described widget (not exceeding the actual terminal height or -# width) is stored in $var_height and $var_width (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height and -# $var_width) are not constrained to minimum/maximum values. -# -# Newline character sequences (``\n'') in $prompt are expanded as-is done by -# dialog(1). -# -f_dialog_calendar_size() -{ - local __constrain=1 - [ "$1" = "-n" ] && __constrain= && shift 1 # -n - local __var_height="$1" __var_width="$2" - local __title="$3" __btitle="$4" __prompt="$5" __hline="$6" - - # Return unless at least one size aspect has been requested - [ "$__var_height" -o "$__var_width" ] || return $FAILURE - - # - # Obtain/Adjust minimum and maximum thresholds - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - # - local __max_height_cal_size __max_width_cal_size - f_dialog_max_size __max_height_cal_size __max_width_cal_size - __max_width_cal_size=$(( $__max_width_cal_size - 2 )) - # the calendar box will refuse to display if too wide - local __min_width - if [ "$USE_XDIALOG" ]; then - __min_width=55 - else - __min_width=40 - __max_height_cal_size=$(( - $__max_height_cal_size - $DIALOG_CALENDAR_HEIGHT )) - # When using dialog(1), we can't predict whether the user has - # disabled shadow's in their `$HOME/.dialogrc' file, so we'll - # subtract one for the potential shadow around the widget - __max_height_cal_size=$(( $__max_height_cal_size - 1 )) - fi - - # Calculate height if desired - if [ "$__var_height" ]; then - local __height - __height=$( echo "$__prompt" | f_number_of_lines ) - - if [ "$USE_XDIALOG" ]; then - # Add height to accommodate for embedded calendar widget - __height=$(( $__height + $DIALOG_CALENDAR_HEIGHT - 1 )) - - # Also, bump height if backtitle is enabled - if [ "$__btitle" ]; then - local __n - __n=$( echo "$__btitle" | f_number_of_lines ) - __height=$(( $__height + $__n + 2 )) - fi - else - [ "$__prompt" ] && __height=$(( $__height + 1 )) - fi - - # Enforce maximum height, unless `-n' was passed - [ "$__constrain" -a $__height -gt $__max_height_cal_size ] && - __height=$__max_height_cal_size - - setvar "$__var_height" $__height - fi - - # Calculate width if desired - if [ "$__var_width" ]; then - # NOTE: Function name appended to prevent __var_{height,width} - # values from becoming local (and thus preventing setvar - # from working). - local __width_cal_size - f_dialog_infobox_size -n "" __width_cal_size \ - "$__title" "$__btitle" "$__prompt" "$__hline" - - # Enforce minimum/maximum width, unless `-n' was passed - if [ "$__constrain" ]; then - if [ $__width_cal_size -lt $__min_width ]; then - __width_cal_size=$__min_width - elif [ $__width_cal_size -gt $__max_width_cal_size ] - then - __width_cal_size=$__max_width_size - fi - fi - - setvar "$__var_width" $__width_cal_size - fi - - return $SUCCESS -} - -# f_dialog_timebox_size [-n] $var_height $var_width \ -# $title $backtitle $prompt [$hline] -# -# Not all versions of dialog(1) perform auto-sizing of the width and height of -# `--timebox' boxes sensibly. -# -# This function helps solve this issue by taking two sets of sequential -# arguments. The first set of arguments are the variable names to use when -# storing the calculated height and width. The second set of arguments are the -# title, backtitle, prompt, and [optionally] hline. The optional height and -# width for the described widget (not exceeding the actual terminal height or -# width) is stored in $var_height and $var_width (respectively). -# -# If the first argument is `-n', the calculated sizes ($var_height and -# $var_width) are not constrained to minimum/maximum values. -# -# Newline character sequences (``\n'') in $prompt are expanded as-is done by -# dialog(1). -# -f_dialog_timebox_size() -{ - local __constrain=1 - [ "$1" = "-n" ] && __constrain= && shift 1 # -n - local __var_height="$1" __var_width="$2" - local __title="$3" __btitle="$4" __prompt="$5" __hline="$6" - - # Return unless at least one size aspect has been requested - [ "$__var_height" -o "$__var_width" ] || return $FAILURE - - # - # Obtain/Adjust minimum and maximum thresholds - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - # - local __max_height_tbox_size __max_width_tbox_size - f_dialog_max_size __max_height_tbox_size __max_width_tbox_size - __max_width_tbox_size=$(( $__max_width_tbox_size - 2 )) - # the timebox widget refuses to display if too wide - local __min_width - if [ "$USE_XDIALOG" ]; then - __min_width=40 - else - __min_width=20 - __max_height_tbox_size=$(( \ - $__max_height_tbox_size - $DIALOG_TIMEBOX_HEIGHT )) - # When using dialog(1), we can't predict whether the user has - # disabled shadow's in their `$HOME/.dialogrc' file, so we'll - # subtract one for the potential shadow around the widget - __max_height_tbox_size=$(( $__max_height_tbox_size - 1 )) - fi - - # Calculate height if desired - if [ "$__var_height" -a "$USE_XDIALOG" ]; then - # When using Xdialog(1), the height seems to have - # no effect. All values provide the same results. - setvar "$__var_height" 0 # autosize - elif [ "$__var_height" ]; then - local __height - __height=$( echo "$__prompt" | f_number_of_lines ) - __height=$(( $__height ${__prompt:++1} + 1 )) - - # Enforce maximum height, unless `-n' was passed - [ "$__constrain" -a $__height -gt $__max_height_tbox_size ] && - __height=$__max_height_tbox_size - - setvar "$__var_height" $__height - fi - - # Calculate width if desired - if [ "$__var_width" ]; then - # NOTE: Function name appended to prevent __var_{height,width} - # values from becoming local (and thus preventing setvar - # from working). - local __width_tbox_size - f_dialog_infobox_size -n "" __width_tbox_size \ - "$__title" "$__btitle" "$__prompt" "$__hline" - - # Enforce the minimum width for displaying the timebox - if [ "$__constrain" ]; then - if [ $__width_tbox_size -lt $__min_width ]; then - __width_tbox_size=$__min_width - elif [ $__width_tbox_size -ge $__max_width_tbox_size ] - then - __width_tbox_size=$__max_width_tbox_size - fi - fi - - setvar "$__var_width" $__width_tbox_size - fi - - return $SUCCESS -} - -############################################################ CLEAR FUNCTIONS - -# f_dialog_clear -# -# Clears any/all previous dialog(1) displays. -# -f_dialog_clear() -{ - $DIALOG --clear -} - -############################################################ INFO FUNCTIONS - -# f_dialog_info $info_text ... -# -# Throw up a dialog(1) infobox. The infobox remains until another dialog is -# displayed or `dialog --clear' (or f_dialog_clear) is called. -# -f_dialog_info() -{ - local info_text="$*" height width - f_dialog_infobox_size height width \ - "$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$info_text" - $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - ${USE_XDIALOG:+--ignore-eof} \ - ${USE_XDIALOG:+--no-buttons} \ - --infobox "$info_text" $height $width -} - -# f_xdialog_info $info_text ... -# -# Throw up an Xdialog(1) infobox and do not dismiss it until stdin produces -# EOF. This implies that you must execute this either as an rvalue to a pipe, -# lvalue to indirection or in a sub-shell that provides data on stdin. -# -# To open an Xdialog(1) infobox that does not disappear until expeclitly dis- -# missed, use the following: -# -# f_xdialog_info "$info_text" < /dev/tty & -# pid=$! -# # Perform some lengthy actions -# kill $pid -# -# NB: Check $USE_XDIALOG if you need to support both dialog(1) and Xdialog(1). -# -f_xdialog_info() -{ - local info_text="$*" height width - f_dialog_infobox_size height width \ - "$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$info_text" - exec $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --no-close --no-buttons \ - --infobox "$info_text" $height $width \ - -1 # timeout of -1 means abort when EOF on stdin -} - -############################################################ PAUSE FUNCTIONS - -# f_dialog_pause $msg_text $duration [$hline] -# -# Display a message in a widget with a progress bar that runs backward for -# $duration seconds. -# -f_dialog_pause() -{ - local pause_text="$1" duration="$2" hline="$3" height width - f_isinteger "$duration" || return $FAILURE - f_dialog_buttonbox_size height width \ - "$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$pause_text" "$hline" - if [ "$USE_XDIALOG" ]; then - $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --ok-label "$msg_skip" \ - --cancel-label "$msg_cancel" \ - ${noCancel:+--no-cancel} \ - --timeout "$duration" \ - --yesno "$pause_text" \ - $height $width - else - [ $duration -gt 0 ] && duration=$(( $duration - 1 )) - height=$(( $height + 3 )) # Add height for progress bar - $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ - --ok-label "$msg_skip" \ - --cancel-label "$msg_cancel" \ - ${noCancel:+--no-cancel} \ - --pause "$pause_text" \ - $height $width "$duration" - fi -} - -# f_dialog_pause_no_cancel $msg_text $duration [$hline] -# -# Display a message in a widget with a progress bar that runs backward for -# $duration seconds. No cancel button is provided. Always returns success. -# -f_dialog_pause_no_cancel() -{ - noCancel=1 f_dialog_pause "$@" - return $SUCCESS -} - -############################################################ MSGBOX FUNCTIONS - -# f_dialog_msgbox $msg_text [$hline] -# -# Throw up a dialog(1) msgbox. The msgbox remains until the user presses ENTER -# or ESC, acknowledging the modal dialog. -# -# If the user presses ENTER, the exit status is zero (success), otherwise if -# the user presses ESC the exit status is 255. -# -f_dialog_msgbox() -{ - local msg_text="$1" hline="$2" height width - f_dialog_buttonbox_size height width \ - "$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$msg_text" "$hline" - $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ - --ok-label "$msg_ok" \ - --msgbox "$msg_text" $height $width -} - -############################################################ TEXTBOX FUNCTIONS - -# f_dialog_textbox $file -# -# Display the contents of $file (or an error if $file does not exist, etc.) in -# a dialog(1) textbox (which has a scrollable region for the text). The textbox -# remains until the user presses ENTER or ESC, acknowledging the modal dialog. -# -# If the user presses ENTER, the exit status is zero (success), otherwise if -# the user presses ESC the exit status is 255. -# -f_dialog_textbox() -{ - local file="$1" - local contents height width retval - - contents=$( cat "$file" 2>&1 ) - retval=$? - - f_dialog_buttonbox_size height width \ - "$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$contents" - - if [ $retval -eq $SUCCESS ]; then - $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --exit-label "$msg_ok" \ - --no-cancel \ - --textbox "$file" $height $width - else - $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --ok-label "$msg_ok" \ - --msgbox "$contents" $height $width - fi -} - -############################################################ YESNO FUNCTIONS - -# f_dialog_yesno $msg_text [$hline] -# -# Display a dialog(1) Yes/No prompt to allow the user to make some decision. -# The yesno prompt remains until the user presses ENTER or ESC, acknowledging -# the modal dialog. -# -# If the user chooses YES the exit status is zero, or chooses NO the exit -# status is one, or presses ESC the exit status is 255. -# -f_dialog_yesno() -{ - local msg_text="$1" height width - local hline="${2-$hline_arrows_tab_enter}" - - f_interactive || return 0 # If non-interactive, return YES all the time - - f_dialog_buttonbox_size height width \ - "$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$msg_text" "$hline" - - if [ "$USE_XDIALOG" ]; then - $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ - --ok-label "$msg_yes" \ - --cancel-label "$msg_no" \ - --yesno "$msg_text" $height $width - else - $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ - --yes-label "$msg_yes" \ - --no-label "$msg_no" \ - --yesno "$msg_text" $height $width - fi -} - -# f_dialog_noyes $msg_text [$hline] -# -# Display a dialog(1) No/Yes prompt to allow the user to make some decision. -# The noyes prompt remains until the user presses ENTER or ESC, acknowledging -# the modal dialog. -# -# If the user chooses YES the exit status is zero, or chooses NO the exit -# status is one, or presses ESC the exit status is 255. -# -# NOTE: This is just like the f_dialog_yesno function except "No" is default. -# -f_dialog_noyes() -{ - local msg_text="$1" height width - local hline="${2-$hline_arrows_tab_enter}" - - f_interactive || return 1 # If non-interactive, return NO all the time - - f_dialog_buttonbox_size height width \ - "$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$msg_text" "$hline" - - if [ "$USE_XDIALOG" ]; then - $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ - --default-no \ - --ok-label "$msg_yes" \ - --cancel-label "$msg_no" \ - --yesno "$msg_text" $height $width - else - $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ - --defaultno \ - --yes-label "$msg_yes" \ - --no-label "$msg_no" \ - --yesno "$msg_text" $height $width - fi -} - -############################################################ INPUT FUNCTIONS - -# f_dialog_inputstr_store [-s] $text -# -# Store some text from a dialog(1) inputbox to be retrieved later by -# f_dialog_inputstr_fetch(). If the first argument is `-s', the text is -# sanitized before being stored. -# -f_dialog_inputstr_store() -{ - local sanitize= - [ "$1" = "-s" ] && sanitize=1 && shift 1 # -s - local text="$1" - - # Sanitize the line before storing it if desired - [ "$sanitize" ] && f_dialog_line_sanitize text - - setvar DIALOG_INPUTBOX_$$ "$text" -} - -# f_dialog_inputstr_fetch [$var_to_set] -# -# Obtain the inputstr entered by the user from the most recently displayed -# dialog(1) inputbox (previously stored with f_dialog_inputstr_store() above). -# If $var_to_set is NULL or missing, output is printed to stdout (which is less -# recommended due to performance degradation; in a loop for example). -# -f_dialog_inputstr_fetch() -{ - local __var_to_set="$1" __cp - - debug= f_getvar DIALOG_INPUTBOX_$$ "${__var_to_set:-__cp}" # get data - setvar DIALOG_INPUTBOX_$$ "" # scrub memory in case data was sensitive - - # Return the line on standard-out if desired - [ "$__var_to_set" ] || echo "$__cp" - - return $SUCCESS -} - -# f_dialog_input $var_to_set $prompt [$init [$hline]] -# -# Prompt the user with a dialog(1) inputbox to enter some value. The inputbox -# remains until the user presses ENTER or ESC, or otherwise ends the -# editing session (by selecting `Cancel' for example). -# -# If the user presses ENTER, the exit status is zero (success), otherwise if -# the user presses ESC the exit status is 255, or if the user chose Cancel, the -# exit status is instead 1. -# -# NOTE: The hline should correspond to the type of data you want from the user. -# NOTE: Should not be used to edit multiline values. -# -f_dialog_input() -{ - local __var_to_set="$1" __prompt="$2" __init="$3" __hline="$4" - - # NOTE: Function name appended to prevent __var_{height,width} values - # from becoming local (and thus preventing setvar from working). - local __height_input __width_input - f_dialog_inputbox_size __height_input __width_input \ - "$DIALOG_TITLE" "$DIALOG_BACKTITLE" \ - "$__prompt" "$__init" "$__hline" - - local __opterm="--" - [ "$USE_XDIALOG" ] && __opterm= - - local __dialog_input - __dialog_input=$( - $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$__hline" \ - --ok-label "$msg_ok" \ - --cancel-label "$msg_cancel" \ - --inputbox "$__prompt" \ - $__height_input $__width_input \ - $__opterm "$__init" \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) - local __retval=$? - - # Remove warnings and leading/trailing whitespace from user input - f_dialog_line_sanitize __dialog_input - - setvar "$__var_to_set" "$__dialog_input" - return $__retval -} - -############################################################ MENU FUNCTIONS - -# f_dialog_menutag_store [-s] $text -# -# Store some text from a dialog(1) menu to be retrieved later by -# f_dialog_menutag_fetch(). If the first argument is `-s', the text is -# sanitized before being stored. -# -f_dialog_menutag_store() -{ - local sanitize= - [ "$1" = "-s" ] && sanitize=1 && shift 1 # -s - local text="$1" - - # Sanitize the menutag before storing it if desired - [ "$sanitize" ] && f_dialog_data_sanitize text - - setvar DIALOG_MENU_$$ "$text" -} - -# f_dialog_menutag_fetch [$var_to_set] -# -# Obtain the menutag chosen by the user from the most recently displayed -# dialog(1) menu (previously stored with f_dialog_menutag_store() above). If -# $var_to_set is NULL or missing, output is printed to stdout (which is less -# recommended due to performance degradation; in a loop for example). -# -f_dialog_menutag_fetch() -{ - local __var_to_set="$1" __cp - - debug= f_getvar DIALOG_MENU_$$ "${__var_to_set:-__cp}" # get the data - setvar DIALOG_MENU_$$ "" # scrub memory in case data was sensitive - - # Return the data on standard-out if desired - [ "$__var_to_set" ] || echo "$__cp" - - return $SUCCESS -} - -# f_dialog_menuitem_store [-s] $text -# -# Store the item from a dialog(1) menu (see f_dialog_menutag2item()) to be -# retrieved later by f_dialog_menuitem_fetch(). If the first argument is `-s', -# the text is sanitized before being stored. -# -f_dialog_menuitem_store() -{ - local sanitize= - [ "$1" = "-s" ] && sanitize=1 && shift 1 # -s - local text="$1" - - # Sanitize the menuitem before storing it if desired - [ "$sanitize" ] && f_dialog_data_sanitize text - - setvar DIALOG_MENUITEM_$$ "$text" -} - -# f_dialog_menuitem_fetch [$var_to_set] -# -# Obtain the menuitem chosen by the user from the most recently displayed -# dialog(1) menu (previously stored with f_dialog_menuitem_store() above). If -# $var_to_set is NULL or missing, output is printed to stdout (which is less -# recommended due to performance degradation; in a loop for example). -# -f_dialog_menuitem_fetch() -{ - local __var_to_set="$1" __cp - - debug= f_getvar DIALOG_MENUITEM_$$ "${__var_to_set:-__cp}" # get data - setvar DIALOG_MENUITEM_$$ "" # scrub memory in case data was sensitive - - # Return the data on standard-out if desired - [ "$__var_to_set" ] || echo "$__cp" - - return $SUCCESS -} - -# f_dialog_default_store [-s] $text -# -# Store some text to be used later as the --default-item argument to dialog(1) -# (or Xdialog(1)) for --menu, --checklist, and --radiolist widgets. Retrieve -# the text later with f_dialog_menutag_fetch(). If the first argument is `-s', -# the text is sanitized before being stored. -# -f_dialog_default_store() -{ - local sanitize= - [ "$1" = "-s" ] && sanitize=1 && shift 1 # -s - local text="$1" - - # Sanitize the defaulitem before storing it if desired - [ "$sanitize" ] && f_dialog_data_sanitize text - - setvar DEFAULTITEM_$$ "$text" -} - -# f_dialog_default_fetch [$var_to_set] -# -# Obtain text to be used with the --default-item argument of dialog(1) (or -# Xdialog(1)) (previously stored with f_dialog_default_store() above). If -# $var_to_set is NULL or missing, output is printed to stdout (which is less -# recommended due to performance degradation; in a loop for example). -# -f_dialog_default_fetch() -{ - local __var_to_set="$1" __cp - - debug= f_getvar DEFAULTITEM_$$ "${__var_to_set:-__cp}" # get the data - setvar DEFAULTITEM_$$ "" # scrub memory in case data was sensitive - - # Return the data on standard-out if desired - [ "$__var_to_set" ] || echo "$__cp" - - return $SUCCESS -} - -# f_dialog_menutag2item $tag_chosen $tag1 $item1 $tag2 $item2 ... -# -# To use the `--menu' option of dialog(1) you must pass an ordered list of -# tag/item pairs on the command-line. When the user selects a menu option the -# tag for that item is printed to stderr. -# -# This function allows you to dereference the tag chosen by the user back into -# the item associated with said tag. -# -# Pass the tag chosen by the user as the first argument, followed by the -# ordered list of tag/item pairs (HINT: use the same tag/item list as was -# passed to dialog(1) for consistency). -# -# If the tag cannot be found, NULL is returned. -# -f_dialog_menutag2item() -{ - local tag="$1" tagn item - shift 1 # tag - - while [ $# -gt 0 ]; do - tagn="$1" - item="$2" - shift 2 # tagn/item - - if [ "$tag" = "$tagn" ]; then - echo "$item" - return $SUCCESS - fi - done - return $FAILURE -} - -# f_dialog_menutag2item_with_help $tag_chosen $tag1 $item1 $help1 \ -# $tag2 $item2 $help2 ... -# -# To use the `--menu' option of dialog(1) with the `--item-help' option, you -# must pass an ordered list of tag/item/help triplets on the command-line. When -# the user selects a menu option the tag for that item is printed to stderr. -# -# This function allows you to dereference the tag chosen by the user back into -# the item associated with said tag (help is discarded/ignored). -# -# Pass the tag chosen by the user as the first argument, followed by the -# ordered list of tag/item/help triplets (HINT: use the same tag/item/help list -# as was passed to dialog(1) for consistency). -# -# If the tag cannot be found, NULL is returned. -# -f_dialog_menutag2item_with_help() -{ - local tag="$1" tagn item - shift 1 # tag - - while [ $# -gt 0 ]; do - tagn="$1" - item="$2" - shift 3 # tagn/item/help - - if [ "$tag" = "$tagn" ]; then - echo "$item" - return $SUCCESS - fi - done - return $FAILURE -} - -# f_dialog_menutag2index $tag_chosen $tag1 $item1 $tag2 $item2 ... -# -# To use the `--menu' option of dialog(1) you must pass an ordered list of -# tag/item pairs on the command-line. When the user selects a menu option the -# tag for that item is printed to stderr. -# -# This function allows you to dereference the tag chosen by the user back into -# the index associated with said tag. The index is the one-based tag/item pair -# array position within the ordered list of tag/item pairs passed to dialog(1). -# -# Pass the tag chosen by the user as the first argument, followed by the -# ordered list of tag/item pairs (HINT: use the same tag/item list as was -# passed to dialog(1) for consistency). -# -# If the tag cannot be found, NULL is returned. -# -f_dialog_menutag2index() -{ - local tag="$1" tagn n=1 - shift 1 # tag - - while [ $# -gt 0 ]; do - tagn="$1" - shift 2 # tagn/item - - if [ "$tag" = "$tagn" ]; then - echo $n - return $SUCCESS - fi - n=$(( $n + 1 )) - done - return $FAILURE -} - -# f_dialog_menutag2index_with_help $tag_chosen $tag1 $item1 $help1 \ -# $tag2 $item2 $help2 ... -# -# To use the `--menu' option of dialog(1) with the `--item-help' option, you -# must pass an ordered list of tag/item/help triplets on the command-line. When -# the user selects a menu option the tag for that item is printed to stderr. -# -# This function allows you to dereference the tag chosen by the user back into -# the index associated with said tag. The index is the one-based tag/item/help -# triplet array position within the ordered list of tag/item/help triplets -# passed to dialog(1). -# -# Pass the tag chosen by the user as the first argument, followed by the -# ordered list of tag/item/help triplets (HINT: use the same tag/item/help list -# as was passed to dialog(1) for consistency). -# -# If the tag cannot be found, NULL is returned. -# -f_dialog_menutag2index_with_help() -{ - local tag="$1" tagn n=1 - shift 1 # tag - - while [ $# -gt 0 ]; do - tagn="$1" - shift 3 # tagn/item/help - - if [ "$tag" = "$tagn" ]; then - echo $n - return $SUCCESS - fi - n=$(( $n + 1 )) - done - return $FAILURE -} - -# f_dialog_menutag2help $tag_chosen $tag1 $item1 $help1 $tag2 $item2 $help2 ... -# -# To use the `--menu' option of dialog(1) with the `--item-help' option, you -# must pass an ordered list of tag/item/help triplets on the command-line. When -# the user selects a menu option the tag for that item is printed to stderr. -# -# This function allows you to dereference the tag chosen by the user back into -# the help associated with said tag (item is discarded/ignored). -# -# Pass the tag chosen by the user as the first argument, followed by the -# ordered list of tag/item/help triplets (HINT: use the same tag/item/help list -# as was passed to dialog(1) for consistency). -# -# If the tag cannot be found, NULL is returned. -# -f_dialog_menutag2help() -{ - local tag="$1" tagn help - shift 1 # tag - - while [ $# -gt 0 ]; do - tagn="$1" - help="$3" - shift 3 # tagn/item/help - - if [ "$tag" = "$tagn" ]; then - echo "$help" - return $SUCCESS - fi - done - return $FAILURE -} - -############################################################ INIT FUNCTIONS - -# f_dialog_init -# -# Initialize (or re-initialize) the dialog module after setting/changing any -# of the following environment variables: -# -# USE_XDIALOG Either NULL or Non-NULL. If given a value will indicate -# that Xdialog(1) should be used instead of dialog(1). -# -# SECURE Either NULL or Non-NULL. If given a value will indicate -# that (while running as root) sudo(8) authentication is -# required to proceed. -# -# Also reads ~/.dialogrc for the following information: -# -# NO_SHADOW Either NULL or Non-NULL. If use_shadow is OFF (case- -# insensitive) in ~/.dialogrc this is set to "1" (otherwise -# unset). -# -f_dialog_init() -{ - local funcname=f_dialog_init - - DIALOG_SELF_INITIALIZE= - USE_DIALOG=1 - - # - # Clone terminal stdout so we can redirect to it from within sub-shells - # - eval exec $DIALOG_TERMINAL_PASSTHRU_FD\>\&1 - - # - # Add `-S' and `-X' to the list of standard arguments supported by all - # - case "$GETOPTS_STDARGS" in - *SX*) : good ;; # already present - *) GETOPTS_STDARGS="${GETOPTS_STDARGS}SX" - esac - - # - # Process stored command-line arguments - # - # NB: Using backticks instead of $(...) for portability since Linux - # bash(1) balks at the right parentheses encountered in the case- - # statement (incorrectly interpreting it as the close of $(...)). - # - f_dprintf "f_dialog_init: ARGV=[%s] GETOPTS_STDARGS=[%s]" \ - "$ARGV" "$GETOPTS_STDARGS" - SECURE=`set -- $ARGV - OPTIND=1 - while getopts \ - "$GETOPTS_STDARGS$GETOPTS_EXTRA$GETOPTS_ALLFLAGS" \ - flag > /dev/null; do - case "$flag" in - S) echo 1 ;; - esac - done - ` # END-BACKTICK - USE_XDIALOG=`set -- $ARGV - OPTIND=1 - while getopts \ - "$GETOPTS_STDARGS$GETOPTS_EXTRA$GETOPTS_ALLFLAGS" \ - flag > /dev/null; do - case "$flag" in - S|X) echo 1 ;; - esac - done - ` # END-BACKTICK - f_dprintf "f_dialog_init: SECURE=[%s] USE_XDIALOG=[%s]" \ - "$SECURE" "$USE_XDIALOG" - - # - # Process `-X' command-line option - # - [ "$USE_XDIALOG" ] && DIALOG=Xdialog USE_DIALOG= - - # - # Sanity check, or die gracefully - # - if ! f_have $DIALOG; then - unset USE_XDIALOG - local failed_dialog="$DIALOG" - DIALOG=dialog - f_die 1 "$msg_no_such_file_or_directory" "$pgm" "$failed_dialog" - fi - - # - # Read ~/.dialogrc (unless using Xdialog(1)) for properties - # - if [ -f ~/.dialogrc -a ! "$USE_XDIALOG" ]; then - eval "$( - awk -v param=use_shadow -v expect=OFF \ - -v set="NO_SHADOW=1" ' - !/^[[:space:]]*(#|$)/ && \ - tolower($1) ~ "^"param"(=|$)" && \ - /[^#]*=/ { - sub(/^[^=]*=[[:space:]]*/, "") - if ( toupper($1) == expect ) print set";" - }' ~/.dialogrc - )" - fi - - # - # If we're already running as root but we got there by way of sudo(8) - # and we have X11, we should merge the xauth(1) credentials from our - # original user. - # - if [ "$USE_XDIALOG" ] && - [ "$( id -u )" = "0" ] && - [ "$SUDO_USER" -a "$DISPLAY" ] - then - if ! f_have xauth; then - # Die gracefully, as we [likely] can't use Xdialog(1) - unset USE_XDIALOG - DIALOG=dialog - f_die 1 "$msg_no_such_file_or_directory" "$pgm" "xauth" - fi - HOSTNAME=$( hostname ) - local displaynum="${DISPLAY#*:}" - eval xauth -if \~$SUDO_USER/.Xauthority extract - \ - \"\$HOSTNAME/unix:\$displaynum\" \ - \"\$HOSTNAME:\$displaynum\" | sudo sh -c 'xauth -ivf \ - ~root/.Xauthority merge - > /dev/null 2>&1' - fi - - # - # Probe Xdialog(1) for maximum height/width constraints, or die - # gracefully - # - if [ "$USE_XDIALOG" ]; then - local maxsize - if ! f_eval_catch -dk maxsize $funcname "$DIALOG" \ - 'LANG= LC_ALL= %s --print-maxsize' "$DIALOG" - then - # Xdialog(1) failed, fall back to dialog(1) - unset USE_XDIALOG - - # Display the error message produced by Xdialog(1) - local height width - f_dialog_buttonbox_size height width \ - "$DIALOG_TITLE" "$DIALOG_BACKTITLE" "$maxsize" - dialog \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --ok-label "$msg_ok" \ - --msgbox "$maxsize" $height $width - exit $FAILURE - fi - - XDIALOG_MAXSIZE=$( - set -- ${maxsize##*:} - - height=${1%,} - width=$2 - - echo $height $width - ) - fi - - # - # If using Xdialog(1), swap DIALOG_TITLE with DIALOG_BACKTITLE. - # The reason for this is because many dialog(1) applications use - # --backtitle for the program name (which is better suited as - # --title with Xdialog(1)). - # - if [ "$USE_XDIALOG" ]; then - local _DIALOG_TITLE="$DIALOG_TITLE" - DIALOG_TITLE="$DIALOG_BACKTITLE" - DIALOG_BACKTITLE="$_DIALOG_TITLE" - fi - - f_dprintf "f_dialog_init: dialog(1) API initialized." -} - -############################################################ MAIN - -# -# Self-initialize unless requested otherwise -# -f_dprintf "%s: DIALOG_SELF_INITIALIZE=[%s]" \ - dialog.subr "$DIALOG_SELF_INITIALIZE" -case "$DIALOG_SELF_INITIALIZE" in -""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;; -*) f_dialog_init -esac - -f_dprintf "%s: Successfully loaded." dialog.subr - -fi # ! $_DIALOG_SUBR diff --git a/bsdconfig/share/geom.subr b/bsdconfig/share/geom.subr deleted file mode 100644 index d6486c6d6543..000000000000 --- a/bsdconfig/share/geom.subr +++ /dev/null @@ -1,430 +0,0 @@ -if [ ! "$_GEOM_SUBR" ]; then _GEOM_SUBR=1 -# -# Copyright (c) 2012-2014 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 (INCLUDING, 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_dprintf "%s: loading includes..." geom.subr -f_include $BSDCFG_SHARE/strings.subr -f_include $BSDCFG_SHARE/struct.subr - -############################################################ GLOBALS - -NGEOM_CLASSES=0 # Set by f_geom_get_all()/f_geom_reset() - -# -# GEOM classes for use with f_geom_find() -# -# NB: Since $GEOM_CLASS_ANY is the NULL string, make sure you quote it whenever -# you put arguments after it. -# -setvar GEOM_CLASS_ANY "any" -setvar GEOM_CLASS_DEV "DEV" -setvar GEOM_CLASS_DISK "DISK" -setvar GEOM_CLASS_ELI "ELI" -setvar GEOM_CLASS_FD "FD" -setvar GEOM_CLASS_LABEL "LABEL" -setvar GEOM_CLASS_MD "MD" -setvar GEOM_CLASS_NOP "NOP" -setvar GEOM_CLASS_PART "PART" -setvar GEOM_CLASS_RAID "RAID" -setvar GEOM_CLASS_SWAP "SWAP" -setvar GEOM_CLASS_VFS "VFS" -setvar GEOM_CLASS_ZFS_VDEV "ZFS::VDEV" -setvar GEOM_CLASS_ZFS_ZVOL "ZFS::ZVOL" - -# -# GEOM structure definitions -# -f_struct_define GEOM_CLASS \ - id name ngeoms -f_struct_define GEOM_GEOM \ - id class_ref config name nconsumers nproviders rank - # Also consumerN where N is 1 through nconsumers - # Also providerN where N is 1 through nproviders -f_struct_define GEOM_CONSUMER \ - id geom_ref config mode provider_ref -f_struct_define GEOM_PROVIDER \ - id geom_ref config mode name mediasize - -# The config property of GEOM_GEOM struct is defined as this -f_struct_define GEOM_GEOM_CONFIG \ - entries first fwheads fwsectors last modified scheme state - -# The config property of GEOM_PROVIDER struct is defined as this -f_struct_define GEOM_PROVIDER_CONFIG \ - descr file fwheads fwsectors ident length type unit - -# -# Default behavior is to call f_geom_get_all() automatically when loaded. -# -: ${GEOM_SELF_SCAN_ALL=1} - -############################################################ FUNCTIONS - -# f_geom_get_all -# -# Parse sysctl(8) `kern.geom.confxml' data into a series of structs. GEOM -# classes are at the top of the hierarchy and are stored as numbered structs -# from 1 to $NGEOM_CLASSES (set by this function) named `geom_class_C'. GEOM -# objects within each class are stored as numbered structs from 1 to `ngeoms' -# (a property of the GEOM class struct) named `geom_class_C_geom_N' (where C -# is the class number and N is the geom number). -# -# Use the function f_geom_find() to get a list of geoms (execute without -# arguments) or find specific geoms by class or name. -# -f_geom_get_all() -{ - eval "$( sysctl -n kern.geom.confxml | awk ' - BEGIN { - struct_count["class"] = 0 - struct_count["geom"] = 0 - struct_count["consumer"] = 0 - struct_count["provider"] = 0 - } - ############################################### FUNCTIONS - function set_value(prop, value) - { - if (!struct_stack[cur_struct]) return - printf "%s set %s \"%s\"\n", - struct_stack[cur_struct], prop, value - } - function create(type, id) - { - if (struct = created[type "_" id]) - print "f_struct_free", struct - else { - struct = struct_stack[cur_struct] - struct = struct ( struct ? "" : "geom" ) - struct = struct "_" type "_" ++struct_count[type] - created[type "_" id] = struct - } - print "debug= f_struct_new GEOM_" toupper(type), struct - cur_struct++ - struct_stack[cur_struct] = struct - type_stack[cur_struct] = type - set_value("id", id) - } - function create_config() - { - struct = struct_stack[cur_struct] - struct = struct ( struct ? "" : "geom" ) - struct = struct "_config" - set_value("config", struct) - type = type_stack[cur_struct] - print "debug= f_struct_new GEOM_" toupper(type) "_CONFIG", \ - struct - cur_struct++ - struct_stack[cur_struct] = struct - type_stack[cur_struct] = type "_config" - } - function extract_attr(field, attr) - { - if (match(field, attr "=\"0x[[:xdigit:]]+\"")) { - len = length(attr) - return substr($2, len + 3, RLENGTH - len - 3) - } - } - function extract_data(type) - { - data = $0 - sub("^[[:space:]]*<" type ">", "", data) - sub("</" type ">.*$", "", data) - return data - } - ############################################### OPENING PATTERNS - $1 == "<mesh>" { mesh = 1 } - $1 ~ /^<(class|geom)$/ && mesh { - prop = substr($1, 2) - if ((ref = extract_attr($2, "ref")) != "") - set_value(prop "_ref", ref) - else if ((id = extract_attr($2, "id")) != "") - create(prop, id) - } - $1 ~ /^<(consumer|provider)$/ && mesh { - prop = substr($1, 2) - if ((ref = extract_attr($2, "ref")) != "") - set_value(prop "_ref", ref) - else if ((id = extract_attr($2, "id")) != "") { - create(prop, id) - cur_struct-- - propn = struct_count[prop] - set_value(prop propn, struct_stack[cur_struct+1]) - cur_struct++ - } - } - $1 == "<config>" && mesh { create_config() } - ############################################### PROPERTIES - $1 ~ /^<[[:alnum:]]+>/ { - prop = $1 - sub(/^</, "", prop); sub(/>.*/, "", prop) - set_value(prop, extract_data(prop)) - } - ############################################### CLOSING PATTERNS - $1 ~ "^</(consumer|provider|config)>$" { cur_struct-- } - $1 == "</geom>" { - set_value("nconsumers", struct_count["consumer"]) - set_value("nproviders", struct_count["provider"]) - cur_struct-- - struct_count["consumer"] = 0 - struct_count["provider"] = 0 - } - $1 == "</class>" { - set_value("ngeoms", struct_count["geom"]) - cur_struct-- - struct_count["consumer"] = 0 - struct_count["provider"] = 0 - struct_count["geom"] = 0 - } - $1 == "</mesh>" { - printf "NGEOM_CLASSES=%u\n", struct_count["class"] - delete struct_count - mesh = 0 - }' )" -} - -# f_geom_reset -# -# Reset the registered GEOM chain. -# -f_geom_reset() -{ - local classn=1 class ngeoms geomn geom - while [ $classn -le ${NGEOM_CLASSES:-0} ]; do - class=geom_class_$classn - $class get ngeoms ngeoms - geomn=1 - while [ $geomn -le $ngeoms ]; do - f_struct_free ${class}_geom_$geomn - geomn=$(( $geomn + 1 )) - done - classn=$(( $classn + 1 )) - done - NGEOM_CLASSES=0 -} - -# f_geom_rescan -# -# Rescan all GEOMs - convenience function. -# -f_geom_rescan() -{ - f_geom_reset - f_geom_get_all -} - -# f_geom_find $name [$type [$var_to_set]] -# -# Find one or more registered GEOMs by name, type, or both. Returns a space- -# separated list of GEOMs matching the search criterion. The $type argument -# should be the GEOM class (see $GEOM_CLASS_* variables in GLOBALS above). -# -# If $var_to_set is missing or NULL, the GEOM name(s) are printed to standard -# out for capturing in a sub-shell (which is less-recommended because of -# performance degredation; for example, when called in a loop). -# -f_geom_find() -{ - local __name="$1" __type="${2:-$GEOM_CLASS_ANY}" __var_to_set="$3" - local __classn=1 __class __class_name __ngeoms - local __geomn __geom __geom_name __found= - while [ $__classn -le ${NGEOM_CLASSES:-0} ]; do - __class=geom_class_$__classn - $__class get name __class_name - if [ "$__type" != "$GEOM_CLASS_ANY" -a \ - "$__type" != "$__class_name" ] - then - __classn=$(( $__classn + 1 )) - continue - fi - - __geomn=1 - $__class get ngeoms __ngeoms || __ngeoms=0 - while [ $__geomn -le $__ngeoms ]; do - __geom=${__class}_geom_$__geomn - $__geom get name __geom_name - [ "$__name" = "$__geom_name" -o ! "$__name" ] && - __found="$__found $__geom" - __geomn=$(( $__geomn + 1 )) - done - __classn=$(( $__classn + 1 )) - done - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "${__found# }" - else - echo $__found - fi - [ "$__found" ] # Return status -} - -# f_geom_find_by $prop $find [$type [$var_to_set]] -# -# Find GEOM-related struct where $prop of the struct is equal to $find. Returns -# NULL or the name of the first GEOM struct to match. The $type argument should -# be one of the following: -# -# NULL Find any of the below -# class Find GEOM_CLASS struct -# geom Find GEOM_GEOM struct -# consumer Find GEOM_CONSUMER struct -# provider Find GEOM_PROVIDER struct -# -# The $prop argument can be any property of the given type of struct. Some -# properties are common to all types (such as id) so the $type argument is -# optional (allowing you to return any struct whose property matches $find). -# -# If $var_to_set is missing or NULL, the GEOM struct name is printed to -# standard out for capturing in a sub-shell (which is less-recommended because -# of performance degredation; for example when called in a loop). -# -f_geom_find_by() -{ - local __prop="$1" __find="$2" __type="$3" __var_to_set="$4" - local __classn=1 __class __ngeoms - local __geomn __geom __nitems - local __itype __itemn __item - local __value __found= - - if [ ! "$__prop" ]; then - [ "$__var_to_set" ] && setvar "$__var_to_set" "" - return $FAILURE - fi - - case "$__type" in - "") : OK ;; - class|GEOM_CLASS) __type=class ;; - geom|GEOM_GEOM) __type=geom ;; - consumer|GEOM_CONSUMER) __type=consumer ;; - provider|GEOM_PROVIDER) __type=provider ;; - *) - [ "$__var_to_set" ] && setvar "$__var_to_set" "" - return $FAILURE - esac - - while [ $__classn -le ${NGEOM_CLASSES:-0} ]; do - __class=geom_class_$__classn - - if [ "${__type:-class}" = "class" ]; then - $__class get "$__prop" __value || __value= - [ "$__value" = "$__find" ] && __found="$__class" break - [ "$__type" ] && __classn=$(( $__classn + 1 )) continue - fi - - __geomn=1 - $__class get ngeoms __ngeoms || __ngeoms=0 - while [ $__geomn -le $__ngeoms ]; do - __geom=${__class}_geom_$__geomn - - if [ "${__type:-geom}" = "geom" ]; then - $__geom get "$__prop" __value || __value= - [ "$__value" = "$__find" ] && - __found="$__geom" break - [ "$__type" ] && - __geomn=$(( $__geomn + 1 )) continue - fi - - for __itype in ${__type:-consumer provider}; do - $__geom get n${__itype}s __nitems || continue - __itemn=1 - while [ $__itemn -le $__nitems ]; do - __item=${__geom}_${__itype}_$__itemn - - $__item get "$__prop" __value || - __value= - [ "$__value" = "$__find" ] && - __found="$__item" break - __itemn=$(( $__itemn + 1 )) - done - [ "$__found" ] && break - done - [ "$__found" ] && break - __geomn=$(( $__geomn + 1 )) - done - [ "$__found" ] && break - __classn=$(( $__classn + 1 )) - done - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__found" - else - [ "$__found" ] && echo "$__found" - fi - [ "$__found" ] # Return status -} - -# f_geom_parent $geom|$consumer|$provider|$config [$var_to_set] -# -# Get the GEOM class associated with one of $geom, $consumer, $provider or -# $config. -# -# If $var_to_set is missing or NULL, the GEOM class name is printed to standard -# out for capturing in a sub-shell (which is less-recommended because of -# performance degredation; for example when called in a loop). -# -f_geom_parent() -{ - local __struct="$1" __var_to_set="$2" - # NB: Order of pattern matches below is important - case "$__struct" in - *_config*) __struct="${__struct%_config*}" ;; - *_consumer_*) __struct="${__struct%_consumer_[0-9]*}" ;; - *_provider_*) __struct="${__struct%_provider_[0-9]*}" ;; - *_geom_*) __struct="${__struct%_geom_[0-9]*}" ;; - *) __struct= - esac - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__struct" - else - echo "$__struct" - fi - f_struct "$__struct" # Return status -} - -############################################################ MAIN - -# -# Parse GEOM configuration unless requested otherwise -# -f_dprintf "%s: GEOM_SELF_SCAN_ALL=[%s]" geom.subr "$GEOM_SELF_SCAN_ALL" -case "$GEOM_SELF_SCAN_ALL" in -""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;; -*) - f_geom_get_all - if [ "$debug" ]; then - debug= f_geom_find "" "$GEOM_CLASS_ANY" geoms - f_count ngeoms $geoms - f_dprintf "%s: Initialized %u geom devices in %u classes." \ - geom.subr "$ngeoms" "$NGEOM_CLASSES" - unset geoms ngeoms - fi -esac - -f_dprintf "%s: Successfully loaded." geom.subr - -fi # ! $_GEOM_SUBR diff --git a/bsdconfig/share/keymap.subr b/bsdconfig/share/keymap.subr deleted file mode 100644 index ca6f3c8df841..000000000000 --- a/bsdconfig/share/keymap.subr +++ /dev/null @@ -1,266 +0,0 @@ -if [ ! "$_KEYMAP_SUBR" ]; then _KEYMAP_SUBR=1 -# -# Copyright (c) 2013-2015 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 (INCLUDING, 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_dprintf "%s: loading includes..." keymap.subr -f_include $BSDCFG_SHARE/struct.subr - -############################################################ CONFIGURATION - -# -# Defaults taken from usr.sbin/kbdmap/kbdmap.h -# -: ${DEFAULT_LANG:=en} -case "$( sysctl -n kern.vty )" in -vt) : ${DEFAULT_KEYMAP_DIR:=/usr/share/vt/keymaps} ;; -*) : ${DEFAULT_KEYMAP_DIR:=/usr/share/syscons/keymaps} ;; -esac - -############################################################ GLOBALS - -KEYMAPS= -NKEYMAPS=0 - -# A "keymap" from kbdmap's point of view -f_struct_define KEYMAP \ - desc \ - keym \ - mark - -# -# Default behavior is to call f_keymap_get_all() automatically when loaded. -# -: ${KEYMAP_SELF_SCAN_ALL=1} - -############################################################ FUNCTIONS - -# f_keymap_register $name $desc $keym $mark -# -# Register a keymap. A `structure' (see struct.subr) is created with the name -# keymap_$name (so make sure $name contains only alpha-numeric characters or -# the underscore, `_'). The remaining arguments after $name correspond to the -# propertise of the `KEYMAP' structure-type (defined above). -# -# If not already registered, the keymap is then appended to the KEYMAPS -# environment variable, a space-separated list of all registered keymaps. -# -f_keymap_register() -{ - local name="$1" desc="$2" keym="$3" mark="$4" - - f_struct_new KEYMAP "keymap_$name" || return $FAILURE - keymap_$name set desc "$desc" - keymap_$name set keym "$keym" - keymap_$name set mark "$mark" - - # Scan our global register to see if needs ammending - local k found= - for k in $KEYMAPS; do - [ "$k" = "$name" ] || continue - found=1 && break - done - [ "$found" ] || KEYMAPS="$KEYMAPS $name" - - return $SUCCESS -} - -# f_keymap_checkfile $keymap -# -# Check that $keymap is a readable kbdmap(5) file. Returns success if $keymap -# is a file, is readable, and exists in $DEFAULT_KEYMAP_DIR; otherwise failure. -# If debugging is enabled, an appropriate debug error message is printed if -# $keymap is not available. -# -f_keymap_checkfile() -{ - local keym="$1" - - # Fixup keymap if it doesn't already contain at least one `/' - [ "${keym#*/}" = "$keym" ] && keym="$DEFAULT_KEYMAP_DIR/$keym" - - # Short-cuts - [ -f "$keym" -a -r "$keym" ] && return $SUCCESS - f_debugging || return $FAILURE - - # Print an appropriate debug error message - if [ ! -e "$keym" ]; then - f_dprintf "%s: No such file or directory" "$keym" - elif [ ! -f "$keym" ]; then - f_dprintf "%s: Not a file!" "$keym" - elif [ ! -r "$keym" ]; then - f_dprintf "%s: Permission denied" "$keym" - fi - - return $FAILURE -} - -# f_keymap_get_all -# -# Get all keymap information for kbdmap(5) entries both in the database and -# loosely existing in $DEFAULT_KEYMAP_DIR. -# -f_keymap_get_all() -{ - local fname=f_keymap_get_all - local lang="${LC_ALL:-${LC_CTYPE:-${LANG:-$DEFAULT_LANG}}}" - [ "$lang" = "C" ] && lang="$DEFAULT_LANG" - - f_dprintf "%s: Looking for keymap files..." $fname - f_dialog_info "$msg_looking_for_keymap_files" - f_dprintf "DEFAULT_LANG=[%s]" "$DEFAULT_LANG" - - eval "$( awk -F: -v lang="$lang" -v lang_default="$DEFAULT_LANG" ' - BEGIN { - # en_US.ISO8859-1 -> en_..\.ISO8859-1 - dialect = lang - if (length(dialect) >= 6 && - substr(dialect, 3, 1) == "_") - dialect = substr(dialect, 1, 3) ".." \ - substr(dialect, 6) - printf "f_dprintf \"dialect=[%%s]\" \"%s\";\n", dialect - - # en_US.ISO8859-1 -> en - lang_abk = lang - if (length(lang_abk) >= 3 && - substr(lang_abk, 3, 1) == "_") - lang_abk = substr(lang_abk, 1, 2) - printf "f_dprintf \"lang_abk=[%%s]\" \"%s\";\n", - lang_abk - } - function find_token(buffer, token) - { - if (split(buffer, tokens, /,/) == 0) return 0 - found = 0 - for (t in tokens) - if (token == tokens[t]) { found = 1; break } - return found - } - function add_keymap(desc,mark,keym) - { - marks[keym] = mark - name = keym - gsub(/[^[:alnum:]_]/, "_", name) - gsub(/'\''/, "'\''\\'\'\''", desc); - printf "f_keymap_checkfile %s && " \ - "f_keymap_register %s '\'%s\'' %s %u\n", - keym, name, desc, keym, mark - } - !/^[[:space:]]*(#|$)/ { - sub(/^[[:space:]]*/, "", $0) - keym = $1 - if (keym ~ /^(MENU|FONT)$/) next - lg = ($2 == "" ? lang_default : $2) - - # Match the entry and store the type of match we made - # as the mark value (so that if we make a better match - # later on with a higher mark, it overwrites previous) - - mark = marks[keym]; - if (find_token(lg, lang)) - add_keymap($3, 4, keym) # Best match - else if (mark <= 3 && find_token(lg, dialect)) - add_keymap($3, 3, keym) - else if (mark <= 2 && find_token(lg, lang_abk)) - add_keymap($3, 2, keym) - else if (mark <= 1 && find_token(lg, lang_default)) - add_keymap($3, 1, keym) - else if (mark <= 0) - add_keymap($3, 0, keym) - } - ' "$DEFAULT_KEYMAP_DIR/INDEX.${DEFAULT_KEYMAP_DIR##*/}" )" - - - # - # Look for keymaps not in database - # - local direntry keym name - set +f # glob - for direntry in "$DEFAULT_KEYMAP_DIR"/*; do - [ "${direntry##*.}" = ".kbd" ] || continue - keym="${direntry##*/}" - f_str2varname "$keym" name - f_struct keymap_$name && continue - f_keymap_checkfile "$keym" && - f_keymap_register $name "${keym%.*}" "$keym" 0 - f_dprintf "%s: not in kbdmap(5) database" "$keym" - done - - # - # Sort the items by their descriptions - # - f_dprintf "%s: Sorting keymap entries by description..." $fname - KEYMAPS=$( - for k in $KEYMAPS; do - echo -n "$k " - # NOTE: Translate '8x8' to '8x08' before sending to - # sort(1) so that things work out as we might expect. - debug= keymap_$k get desc | awk 'gsub(/8x8/,"8x08")||1' - done | sort -k2 | awk '{ - printf "%s%s", (started ? " " : ""), $1; started = 1 - }' - ) - - return $SUCCESS -} - -# f_keymap_kbdcontrol $keymap -# -# Install keyboard map file from $keymap. -# -f_keymap_kbdcontrol() -{ - local keymap="$1" - - [ "$keymap" ] || return $SUCCESS - - # Fixup keymap if it doesn't already contain at least one `/' - [ "${keymap#*/}" = "$keymap" ] && keymap="$DEFAULT_KEYMAP_DIR/$keymap" - - [ "$USE_XDIALOG" ] || kbdcontrol -l "$keymap" -} - -############################################################ MAIN - -# -# Scan for keymaps unless requeted otherwise -# -f_dprintf "%s: KEYMAP_SELF_SCAN_ALL=[%s]" keymap.subr "$KEYMAP_SELF_SCAN_ALL" -case "$KEYMAP_SELF_SCAN_ALL" in -""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;; -*) f_keymap_get_all -esac - -f_count NKEYMAPS $KEYMAPS -f_dprintf "%s: Found %u keymap file(s)." keymap.subr $NKEYMAPS - -f_dprintf "%s: Successfully loaded." keymap.subr - -fi # ! $_KEYMAP_SUBR diff --git a/bsdconfig/share/media/Makefile b/bsdconfig/share/media/Makefile deleted file mode 100644 index e8ec319a0ae4..000000000000 --- a/bsdconfig/share/media/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# $FreeBSD$ - -FILESDIR= ${SHAREDIR}/bsdconfig/media -FILES= any.subr cdrom.subr common.subr directory.subr dos.subr \ - floppy.subr ftp.subr http.subr httpproxy.subr network.subr \ - nfs.subr options.subr tcpip.subr ufs.subr usb.subr wlan.subr - -.include <bsd.prog.mk> diff --git a/bsdconfig/share/media/Makefile.depend b/bsdconfig/share/media/Makefile.depend deleted file mode 100644 index f80275d86ab1..000000000000 --- a/bsdconfig/share/media/Makefile.depend +++ /dev/null @@ -1,11 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - - -.include <dirdeps.mk> - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif diff --git a/bsdconfig/share/media/any.subr b/bsdconfig/share/media/any.subr deleted file mode 100644 index 516d2d2bd4ba..000000000000 --- a/bsdconfig/share/media/any.subr +++ /dev/null @@ -1,149 +0,0 @@ -if [ ! "$_MEDIA_ANY_SUBR" ]; then _MEDIA_ANY_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/any.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/cdrom.subr -f_include $BSDCFG_SHARE/media/directory.subr -f_include $BSDCFG_SHARE/media/dos.subr -f_include $BSDCFG_SHARE/media/floppy.subr -f_include $BSDCFG_SHARE/media/ftp.subr -f_include $BSDCFG_SHARE/media/http.subr -f_include $BSDCFG_SHARE/media/httpproxy.subr -f_include $BSDCFG_SHARE/media/nfs.subr -f_include $BSDCFG_SHARE/media/options.subr -f_include $BSDCFG_SHARE/media/ufs.subr -f_include $BSDCFG_SHARE/media/usb.subr -f_include $BSDCFG_SHARE/struct.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -MEDIA_HELPFILE=$BSDCFG_LIBE/include/media.hlp - -############################################################ FUNCTIONS - -# f_media_get_type -# -# Prompt the user to select amongst the known media types (included above). -# -# If the user does not cancel or press Esc, invokes the f_media_set_* function -# associated with the chosen media type. If after all that we have a struct -# named `device_media' then success is returned, otherwise failure. -# -# NOTE: The f_media_set_* function should create the `device_media' struct. -# See `struct.subr' and the above `media/*.subr' includes for more details. -# -f_media_get_type() -{ - f_dialog_title "$msg_choose_installation_media" - local title="$DIALOG_TITLE" btitle="$DIALOG_BACKTITLE" - f_dialog_title_restore - local prompt="$msg_choose_installation_media_description" - local menu_list=" - '1 $msg_cd_dvd' '$msg_install_from_a_freebsd_cd_dvd' - '2 $msg_ftp' '$msg_install_from_an_ftp_server' - '3 $msg_http_proxy' - '$msg_install_from_an_ftp_server_thru_proxy' - '4 $msg_http_direct' '$msg_install_from_an_http_server' - '5 $msg_directory' '$msg_install_from_the_existing_filesystem' - '6 $msg_nfs' '$msg_install_over_nfs' - '7 $msg_dos' '$msg_install_from_a_dos_partition' - '8 $msg_ufs' '$msg_install_from_a_ufs_partition' - '9 $msg_floppy' '$msg_install_from_a_floppy_disk_set' - 'A $msg_usb' '$msg_install_from_a_usb_drive' - 'X $msg_options' '$msg_view_set_various_media_options' - " # END-QUOTE - local hline="$hline_choose_help_for_more_information_on_media_types" - - local height width rows - eval f_dialog_menu_size height width rows \ - \"\$title\" \ - \"\$btitle\" \ - \"\$prompt\" \ - \"\$hline\" \ - $menu_list - - local mtag - while :; do - mtag=$( eval $DIALOG \ - --title \"\$title\" \ - --backtitle \"\$btitle\" \ - --hline \"\$hline\" \ - --ok-label \"\$msg_ok\" \ - --cancel-label \"\$msg_cancel\" \ - --help-button \ - --help-label \"\$msg_help\" \ - ${USE_XDIALOG:+--help \"\"} \ - --menu \"\$prompt\" \ - $height $width $rows \ - $menu_list \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) - local retval=$? - f_dialog_data_sanitize mtag - f_dprintf "retval=%s mtag=[%s]" $retval "$mtag" - - if [ $retval -eq $DIALOG_HELP ]; then - f_show_help "$MEDIA_HELPFILE" - continue - elif [ $retval -ne $DIALOG_OK ]; then - return $FAILURE - fi - - case "$mtag" in - ?" $msg_cd_dvd") f_media_set_cdrom ;; - ?" $msg_ftp") f_media_set_ftp ;; - ?" $msg_http_proxy") f_media_set_http_proxy ;; - ?" $msg_http_direct") f_media_set_http ;; - ?" $msg_directory") f_media_set_directory ;; - ?" $msg_dos") f_media_set_dos ;; - ?" $msg_nfs") f_media_set_nfs ;; - ?" $msg_ufs") f_media_set_ufs ;; - ?" $msg_floppy") f_media_set_floppy ;; - ?" $msg_usb") f_media_set_usb ;; - ?" $msg_options") - f_media_options_menu - continue - ;; - esac - break - done - - f_struct device_media || return $FAILURE -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/any.subr - -fi # ! $_MEDIA_ANY_SUBR diff --git a/bsdconfig/share/media/cdrom.subr b/bsdconfig/share/media/cdrom.subr deleted file mode 100644 index bbbd638fec6e..000000000000 --- a/bsdconfig/share/media/cdrom.subr +++ /dev/null @@ -1,217 +0,0 @@ -if [ ! "$_MEDIA_CDROM_SUBR" ]; then _MEDIA_CDROM_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/cdrom.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/common.subr -f_include $BSDCFG_SHARE/struct.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -CDROM_MOUNTED= -CDROM_PREVIOUSLY_MOUNTED= -CDROM_INIT_QUIET= - -############################################################ FUNCTIONS - -# f_media_set_cdrom -# -# Return success if we both found and set the media type to be a CD. -# -f_media_set_cdrom() -{ - f_media_close - - local devs ndevs - f_device_find "" $DEVICE_TYPE_CDROM devs - f_count ndevs $devs - - if [ ${ndevs:=0} -eq 0 ]; then - f_interactive && f_show_msg "$msg_no_cd_dvd_devices_found" - return $FAILURE - elif [ $ndevs -eq 1 ]; then - f_struct_copy $devs device_media - else - local dev - local title="$msg_choose_a_cd_dvd_type" - local prompt="$msg_please_select_a_cd_dvd_drive" - local hline= - - dev=$( f_device_menu \ - "$title" "$prompt" "$hline" $DEVICE_TYPE_CDROM \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || - return $FAILURE - - f_struct_copy "$dev" device_media - fi - - f_struct device_media || return $FAILURE -} - -# f_media_init_cdrom $device -# -# Initializes the CDROM media device. Returns success if able to mount the CD -# device using mount_cd9660(8). -# -f_media_init_cdrom() -{ - local funcname=f_media_init_cdrom - local dev="$1" devname err - - f_struct "$dev" get devname devname || return $FAILURE - f_dprintf "Init routine called for CDROM device. devname=[%s]" \ - "$devname" - - if [ "$CDROM_MOUNTED" ]; then - f_dprintf "CDROM device already mounted." - return $SUCCESS - fi - - if [ ! -e "$MOUNTPOINT" ]; then - f_eval_catch $funcname mkdir 'mkdir -p "%s"' "$MOUNTPOINT" || - return $FAILURE - fi - - if ! f_eval_catch -dk err $funcname mount_cd9660 \ - 'mount_cd9660 "%s" "%s"' "$devname" "$MOUNTPOINT" - then - err="${err#mount_cd9660: }"; err="${err#$devname: }" - case "$err" in - "Device busy") - # Perhaps the CDROM drive is already mounted as /cdrom - if f_mounted /cdrom; then - CDROM_PREVIOUSLY_MOUNTED=1 - MOUNTPOINT=/cdrom - err= - fi - ;; - esac - case "$err" in - "") : good ;; # no error - *) - [ "$CDROM_INIT_QUIET" ] || - f_show_msg "$msg_error_mounting_device" \ - "$devname" "$MOUNTPOINT" "$err" - return $FAILURE - esac - fi - CDROM_MOUNTED=1 - - : xxx # /cdrom.inf has been deprecated since 9.0-R - - # No other CDROM media validation at this time - - return $SUCCESS -} - -# f_media_get_cdrom $device $file [$probe_type] -# -# Returns data from $file on a mounted CDROM device. Similar to cat(1). If -# $probe_type is present and non-NULL, returns success if $file exists. If -# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to -# standard-out. -# -f_media_get_cdrom() -{ - local dev="$1" file="$2" probe_type="$3" - local name - - $dev get name name - f_dprintf "f_media_get_cdrom: dev=[%s] file=[%s] probe_type=%s" \ - "$name" "$file" "$probe_type" - - f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" -} - -# f_media_shutdown_cdrom $device -# -# Shuts down the CDROM device. Return status should be ignored. -# -f_media_shutdown_cdrom() -{ - local funcname=f_media_shutdown_cdrom - local dev="$1" err - - [ "$CDROM_MOUNTED" ] || return $FAILURE - - if [ "$CDROM_PREVIOUSLY_MOUNTED" ]; then - CDROM_MOUNTED= - return $SUCCESS - fi - - if ! f_eval_catch -dk err $funcname umount \ - 'umount -f "%s"' "$MOUNTPOINT" - then - err="${err#umount: }"; err="${err#*: }" - f_show_msg "$msg_could_not_unmount_the_cdrom_dvd" \ - "$MOUNTPOINT" "$err" - else - CDROM_MOUNTED= - fi -} - -# f_media_eject_cdrom $device -# -# Eject the media from the CDROM device. Returns success. -# -f_media_eject_cdrom() -{ - local funcname=f_media_eject_cdrom - local dev="$1" name devname err - - f_struct "$dev" || return $SUCCESS - $dev get name name || return $SUCCESS - $dev get devname devname || return $SUCCESS - - # Don't eject labels - case "$name" in */*) return $SUCCESS; esac - - f_dprintf "Ejecting CDROM/DVD at %s" "$devname" - if ! f_eval_catch -dk err $funcname cdcontrol \ - 'cdcontrol -f "%s" eject' "$devname" - then - f_dprintf "Could not eject the CDROM/DVD from %s: %s" \ - "$devname" "${err#cdcontrol: }" - fi - return $SUCCESS -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/cdrom.subr - -fi # ! $_MEDIA_CDROM_SUBR diff --git a/bsdconfig/share/media/common.subr b/bsdconfig/share/media/common.subr deleted file mode 100644 index 0bd420d58b38..000000000000 --- a/bsdconfig/share/media/common.subr +++ /dev/null @@ -1,155 +0,0 @@ -if [ ! "$_MEDIA_COMMON_SUBR" ]; then _MEDIA_COMMON_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/common.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/media/any.subr -f_include $BSDCFG_SHARE/struct.subr - -############################################################ GLOBALS - -# -# Where to mount media -# -MOUNTPOINT=/dist - -# -# Media probe values to use for `f_media_get_TYPE media $file $PROBE' or -# `f_device_get device_media $file $PROBE' (where $PROBE is one of the below -# values). -# -PROBE_EXIST=1 -PROBE_SIZE=2 - -############################################################ FUNCTIONS - -# f_media_open -# -# Returms success if able to initialize the media device. -# -f_media_open() -{ - f_dprintf "f_media_open: Verifying and initiliazing media device" - { # Verify and initialize device media if-defined - f_struct device_media && - f_media_verify && - f_device_init device_media - } || return $FAILURE -} - -# f_media_close -# -# Shuts down the media device, see f_device_shutdown() from device.subr for -# more details. -# -f_media_close() -{ - f_dprintf "f_media_close: Shutting down media device" - f_struct device_media && - f_device_shutdown device_media - f_struct_free device_media -} - -# f_media_verify -# -# Returns success if the media device is available, and if not, prompts the -# user to select a media type. See f_media_get_type() from media/any.subr for -# more details. -# -f_media_verify() -{ - f_dprintf "f_media_verify: Verifying media device" - f_struct device_media || f_media_get_type -} - -# f_media_generic_get $base $file [$probe_type] -# -# A generic open which follows a well-known "path" of places to look. If -# $probe_type is present and non-NULL, returns success if $file exists. If -# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to -# standard-out. -# -f_media_generic_get() -{ - local funcname=f_media_generic_get - local base="$1" file="$2" probe_type="$3" - - local fname=f_media_generic_get - f_dprintf "%s: base=[%s] files=[%s] probe_type=%s" \ - $fname "$base" "$file" "$probe_type" - - local rel path - f_getvar $VAR_RELNAME rel - for path in \ - "$base/$file" \ - "$base/FreeBSD/$file" \ - "$base/releases/$file" \ - "$base/$rel/$file" \ - ; do - if [ -f "$path" -a -r "$path" ]; then - f_dprintf "%s: file exists path=[%s]" $fname "$path" - if [ "$probe_type" = "$PROBE_SIZE" ]; then - local size - f_eval_catch -dk size $funcname stat \ - 'stat -f %%z "%s"' "$path" || size=-1 - f_isinteger "$size" || size=-1 - echo $size - fi - [ "$probe_type" ] && return $SUCCESS - cat "$path" - return $? - fi - done - - path="$base/releases/$rel/$file" # Final path to try - if [ -f "$path" -a -r "$path" ]; then - f_dprintf "%s: file exists path=[%s]" $fname "$path" - if [ "$probe_type" = "$PROBE_SIZE" ]; then - local size - f_eval_catch -dk size $funcname stat \ - 'stat -f %%z "%s"' "$path" || size=-1 - f_isinteger "$size" || size=-1 - echo $size - fi - [ "$probe_type" ] && return $SUCCESS - elif [ "$probe_type" ]; then - [ "$probe_type" = "$PROBE_SIZE" ] && echo "-1" - return $FAILURE - fi - cat "$base/releases/$rel/$file" # Final path to try -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/common.subr - -fi # ! $_MEDIA_COMMON_SUBR diff --git a/bsdconfig/share/media/directory.subr b/bsdconfig/share/media/directory.subr deleted file mode 100644 index 004cb74bb07e..000000000000 --- a/bsdconfig/share/media/directory.subr +++ /dev/null @@ -1,151 +0,0 @@ -if [ ! "$_MEDIA_DIRECTORY_SUBR" ]; then _MEDIA_DIRECTORY_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/directory.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/common.subr -f_include $BSDCFG_SHARE/struct.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -DIRECTORY_CHECKED= - -############################################################ FUNCTIONS - -# f_media_set_directory -# -# Return success if we both found and set the media type to be a local -# directory. -# -# Variables from variable.subr that can be used to script user input: -# -# VAR_DIRECTORY_PATH -# Path to an existing directory containing the FreeBSD -# distribution files. -# -f_media_set_directory() -{ - local path - - f_media_close - - f_variable_get_value $VAR_DIRECTORY_PATH \ - "$msg_enter_a_fully_qualified_pathname_for_the_directory" - f_getvar $VAR_DIRECTORY_PATH path - [ "$path" ] || return $FAILURE - - f_struct_new DEVICE device_directory - device_directory set name "$path" - device_directory set get f_media_get_directory - device_directory set init f_media_init_directory - device_directory set shutdown f_media_shutdown_directory - device_directory set private "$path" - - f_struct_copy device_directory device_media - f_struct_free device_directory - - f_struct device_media || return $FAILURE -} - -# f_media_init_directory $device -# -# Initializes the Directory media device. Returns success if the directory path -# both exists and is a directory. -# -f_media_init_directory() -{ - local dev="$1" path - - $dev get private path || return $FAILURE - f_dprintf "Init routine called for Directory device. path=[%s]" \ - "$path" - - # Track whether we've been through here before (for remote filesystems - # mounted in the directory path, not repeating these queries saves us - # valuable time for slow/uncooperative links). - if [ "$DIRECTORY_CHECKED" ]; then - f_dprintf "Directory device already checked." - return $SUCCESS - fi - - if [ ! -e "$path" ]; then - f_show_msg "$msg_no_such_file_or_directory" \ - "f_media_init_directory" "$path" - return $FAILURE - elif [ ! -d "$path" ]; then - f_show_msg "$msg_not_a_directory" \ - "f_media_init_directory" "$path" - return $FAILURE - fi - DIRECTORY_CHECKED=1 - return $SUCCESS -} - -# f_media_get_directory $device $file [$probe_type] -# -# Returns data from $file in the existing/current filesystem. Similar to -# cat(1). If $probe_type is present and non-NULL, returns success if $file -# exists. If $probe_type is equal to $PROBE_SIZE, prints the size of $file in -# bytes to standard-out. -# -f_media_get_directory() -{ - local dev="$1" file="$2" probe_type="$3" path - local name - - $dev get name name - f_dprintf "f_media_get_directory: dev=[%s] file=[%s] probe_type=%s" \ - "$name" "$file" "$probe_type" - - $dev get private path - f_media_generic_get "$path" "$file" "$probe_type" -} - -# f_media_shutdown_directory $device -# -# Shuts down the Directory device. Return status should be ignored. -# -f_media_shutdown_directory() -{ - DIRECTORY_CHECKED= -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/directory.subr - -fi # ! $_MEDIA_DIRECTORY_SUBR diff --git a/bsdconfig/share/media/dos.subr b/bsdconfig/share/media/dos.subr deleted file mode 100644 index df91aebcd814..000000000000 --- a/bsdconfig/share/media/dos.subr +++ /dev/null @@ -1,165 +0,0 @@ -if [ ! "$_MEDIA_DOS_SUBR" ]; then _MEDIA_DOS_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/dos.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/common.subr -f_include $BSDCFG_SHARE/struct.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -DOS_MOUNTED= - -############################################################ FUNCTIONS - -# f_media_set_dos -# -# Return success if we both found and set the media type to be a DOS partition. -# -f_media_set_dos() -{ - f_media_close - - local devs ndevs - f_device_find "" $DEVICE_TYPE_DOS devs - f_count ndevs $devs - - if [ ${ndevs:=0} -eq 0 ]; then - f_show_msg "$msg_no_dos_primary_partitions_found" - return $FAILURE - elif [ $ndevs -eq 1 ]; then - f_struct_copy $devs device_media - else - local dev - local title="$msg_choose_a_dos_partition" - local prompt="$msg_please_select_dos_partition" - local hline= - - dev=$( f_device_menu \ - "$title" "$prompt" "$hline" $DEVICE_TYPE_DOS \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || - return $FAILURE - - f_struct_copy "$dev" device_media - fi - - f_struct device_media || return $FAILURE -} - -# f_media_init_dos $device -# -# Initializes the DOS media device. Returns success if able to mount the DOS -# partition device using mount_msdosfs(8). -# -f_media_init_dos() -{ - local funcname=f_media_init_dos - local dev="$1" devname err - - $dev get devname devname || return $FAILURE - f_dprintf "Init routine called for DOS device. devname=[%s]" \ - "$devname" - - if [ "$DOS_MOUNTED" ]; then - f_dprintf "DOS device already mounted." - return $SUCCESS - fi - - if [ ! -e "$MOUNTPOINT" ]; then - f_eval_catch $funcname mkdir 'mkdir -p "%s"' "$MOUNTPOINT" || - return $FAILURE - fi - - if ! f_eval_catch -dk err $funcname mount_msdosfs \ - 'mount_msdosfs "%s" "%s"' "$devname" "$MOUNTPOINT" - then - err="${err#mount_msdosfs: }"; err="${err#$devname: }" - f_show_msg "$msg_error_mounting_device" \ - "$devname" "$MOUNTPOINT" "$err" - return $FAILURE - fi - DOS_MOUNTED=1 - return $SUCCESS -} - -# f_media_get_dos $device $file [$probe_type] -# -# Returns data from $file on a mounted DOS partition device. Similar to cat(1). -# If $probe_type is present and non-NULL, returns success if $file exists. If -# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to -# standard-out. -# -f_media_get_dos() -{ - local dev="$1" file="$2" probe_type="$3" - local name - - $dev get name name - f_dprintf "f_media_get_dos: dev=[%s] file=[%s] probe_type=%s" \ - "$name" "$file" "$probe_type" - - f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" -} - -# f_media_shutdown_dos $device -# -# Shuts down the DOS partition device using umount(8). Return status should be -# ignored. -# -f_media_shutdown_dos() -{ - local funcname=f_media_shutdown_dos - local dev="$1" err - - [ "$DOS_MOUNTED" ] || return $FAILURE - - if ! f_eval_catch -dk err $funcname umount \ - 'umount -f "%s"' "$MOUNTPOINT" - then - err="${err#umount: }"; err="${err#*: }" - f_show_msg "$msg_could_not_unmount_the_dos_partition" \ - "$MOUNTPOINT" "$err" - else - DOS_MOUNTED= - fi -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/dos.subr - -fi # ! $_MEDIA_DOS_SUBR diff --git a/bsdconfig/share/media/floppy.subr b/bsdconfig/share/media/floppy.subr deleted file mode 100644 index bf402e533d33..000000000000 --- a/bsdconfig/share/media/floppy.subr +++ /dev/null @@ -1,229 +0,0 @@ -if [ ! "$_MEDIA_FLOPPY_SUBR" ]; then _MEDIA_FLOPPY_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/floppy.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/common.subr -f_include $BSDCFG_SHARE/struct.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -FLOPPY_MOUNTED= -FLOPPY_DISTWANTED= - -############################################################ FUNCTIONS - -# f_media_set_floppy -# -# Return success if we both found and set the media type to be a floppy. -# -f_media_set_floppy() -{ - f_media_close - - local devs ndevs - f_device_find "" $DEVICE_TYPE_FLOPPY devs - f_count ndevs $devs - - if [ ${ndevs:=0} -eq 0 ]; then - f_interactive && f_show_msg "$msg_no_floppy_devices_found" - return $FAILURE - elif [ $ndevs -eq 1 ]; then - f_struct_copy $devs device_media - else - local dev - local title="$msg_choose_a_floppy_drive" - local prompt="$msg_please_select_a_floppy_drive" - local hline= - - dev=$( f_device_menu \ - "$title" "$prompt" "$hline" $DEVICE_TYPE_FLOPPY \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || - return $FAILURE - - f_struct_copy "$dev" device_media - fi - - f_struct device_media && - device_media unset private - - f_struct device_media || return $FAILURE -} - -# f_media_init_floppy $device -# -# Initializes the Floppy media device. Returns success if able to mount the -# Floppy disk device using either mount_msdosfs(8) or mount(8) (tried in that -# order). -# -f_media_init_floppy() -{ - local funcname=f_media_init_floppy - local dev="$1" devname err - - $dev get devname devname || return $FAILURE - f_dprintf "Init floppy called for %s distribution. devname=[%s]" \ - "${FLOPPY_DISTWANTED:-some}" "$devname" - - if [ "$FLOPPY_MOUNTED" ]; then - f_dprintf "Floppy device already mounted." - return $SUCCESS - fi - - local mp - $dev get private mp - if [ ! -e "${mp:=$MOUNTPOINT}" ] && ! f_quietly mkdir -p "$mp"; then - f_show_msg "$msg_unable_to_make_directory_mountpoint" \ - "$mp" "$devname" - return $FAILURE - fi - - if f_interactive; then - local desc - $dev get desc desc - if [ "$FLOPPY_DISTWANTED" ]; then - f_show_msg "$msg_please_insert_floppy_in_drive" "$desc" - else - f_show_msg "$msg_please_insert_floppy_containing" \ - "$FLOPPY_DISTWANTED" "$desc" - fi - fi - - if ! { - f_eval_catch -dk err $funcname mount_msdosfs \ - 'mount_msdosfs -o ro -m 0777 -u 0 -g 0 "%s" "%s"' \ - "$devname" "$mp" || - f_eval_catch -dk err $funcname mount \ - 'mount -o ro "%s" "%s"' "$devname" "$mp" - }; then - err="${err#mount: }"; err="${err#*: }" - local name - $dev get name name - f_show_msg "$msg_error_mounting_floppy_device" \ - "$name" "$devname" "$mp" "$err" - return $FAILURE - fi - FLOPPY_MOUNTED=1 - FLOPPY_DISTWANTED= - return $SUCCESS -} - -# f_media_get_floppy $device $file [$probe_type] -# -# Returns data from $file on a mounted Floppy disk device. Similar to cat(1). -# If $probe_type is present and non-NULL, limits retries to zero and returns -# success if $file exists. If $probe_type is equal to $PROBE_SIZE, prints the -# size of $file in bytes to standard-out. -# -f_media_get_floppy() -{ - local funcname=f_media_get_floppy - local dev="$1" file="$2" probe_type="$3" - local name - - $dev get name name - f_dprintf "f_media_get_floppy: dev=[%s] file=[%s] probe_type=%s" \ - "$name" "$file" "$probe_type" - - # - # floppies don't use f_media_generic_get() because it's too expensive - # to speculatively open files on a floppy disk. Make user get it - # right or give up with floppies. - # - local mp - $dev get private mp - local fp="${mp:=$MOUNTPOINT}/$file" - if ! [ -f "$fp" -a -r "$fp" ]; then - local nretries=4 - [ "$probe_type" = "$PROBE_SIZE" ] && echo "-1" - [ "$probe_type" ] && return $FAILURE - while ! [ -f "$fp" -a -r "$fp" ]; do - if [ $nretries -eq 0 ]; then - f_show_msg "$msg_failed_to_get_floppy_file" \ - "$fp" - [ "$probe_type" = "$PROBE_SIZE" ] && echo "-1" - return $FAILURE - fi - FLOPPY_DISTWANTED="$fp" - f_media_shutdown_floppy "$dev" - f_media_init_floppy "$dev" || return $FAILURE - nretries=$(( $nretries - 1 )) - done - fi - # - # If we reach here, $file exists - # - if [ "$probe_type" = "$PROBE_SIZE" ]; then - local size - f_eval_catch -dk size $funcname stat 'stat -f %%z "%s"' "$fp" - f_isinteger "$size" || size=-1 - echo "$size" - fi - [ "$probe_type" ] && return $SUCCESS - cat "$fp" -} - -# f_media_shutdown_floppy $device -# -# Shuts down the Floppy disk device using umount(8). Return status should be -# ignored. -# -f_media_shutdown_floppy() -{ - local funcname=f_media_shutdown_floppy - local dev="$1" err mp - - [ "$FLOPPY_MOUNTED" ] || return $FAILURE - - $dev get private mp - if f_eval_catch -d $funcname umount \ - 'umount -f "%s"' "${mp:=$MOUNTPOINT}" - then - FLOPPY_MOUNTED= - if f_interactive && [ "$_systemState" != "fixit" ]; then - local desc - $dev get desc desc - f_show_msg "$msg_you_may_remove_the_floppy" "$desc" - fi - fi -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/floppy.subr - -fi # ! $_MEDIA_FLOPPY_SUBR diff --git a/bsdconfig/share/media/ftp.subr b/bsdconfig/share/media/ftp.subr deleted file mode 100644 index 1f6f216eb0a9..000000000000 --- a/bsdconfig/share/media/ftp.subr +++ /dev/null @@ -1,897 +0,0 @@ -if [ ! "$_MEDIA_FTP_SUBR" ]; then _MEDIA_FTP_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/ftp.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/common.subr -f_include $BSDCFG_SHARE/media/tcpip.subr -f_include $BSDCFG_SHARE/strings.subr -f_include $BSDCFG_SHARE/struct.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -FTP_SKIP_RESOLV= - -URL_MAX=261261 # according to actual fetch(1) test-results - -FTP_DIRS=" - . - releases/$UNAME_P - snapshots/$UNAME_P - pub/FreeBSD - pub/FreeBSD/releases/$UNAME_P - pub/FreeBSD/snapshots/$UNAME_P - pub/FreeBSD-Archive/old-releases/$UNAME_P -" # END-QUOTE - -############################################################ FUNCTIONS - -# f_dialog_menu_media_ftp -# -# Prompt the user to select from a range of ``built-in'' FTP servers or specify -# their own. If the user makes a choice and doesn't cancel or press Esc, stores -# the user's choice in VAR_FTP_PATH (see variables.subr) and returns success. -# -f_dialog_menu_media_ftp() -{ - f_dialog_title "$msg_please_select_a_freebsd_ftp_distribution_site" - local title="$DIALOG_TITLE" btitle="$DIALOG_BACKTITLE" - f_dialog_title_restore - local prompt="$msg_please_select_the_site_closest_to_you_or_other" - local menu_list=" - '$msg_main_site' 'ftp.freebsd.org' - 'URL' '$msg_specify_some_other_ftp_site' - 'IPv6 $msg_main_site' 'ftp.freebsd.org' - ' IPv6 $msg_france' 'ftp4.fr.freebsd.org' - ' IPv6 $msg_france #8' 'ftp8.fr.freebsd.org' - ' IPv6 $msg_ireland' 'ftp3.ie.freebsd.org' - ' IPv6 $msg_japan' 'ftp2.jp.freebsd.org' - ' IPv6 $msg_sweden' 'ftp4.se.freebsd.org' - ' IPv6 $msg_usa' 'ftp4.us.freebsd.org' - '$msg_primary' 'ftp1.freebsd.org' - ' $msg_primary #2' 'ftp2.freebsd.org' - ' $msg_primary #3' 'ftp3.freebsd.org' - ' $msg_primary #4' 'ftp4.freebsd.org' - ' $msg_primary #5' 'ftp5.freebsd.org' - ' $msg_primary #6' 'ftp6.freebsd.org' - ' $msg_primary #7' 'ftp7.freebsd.org' - ' $msg_primary #10' 'ftp10.freebsd.org' - ' $msg_primary #11' 'ftp11.freebsd.org' - ' $msg_primary #12' 'ftp12.freebsd.org' - ' $msg_primary #13' 'ftp13.freebsd.org' - ' $msg_primary #14' 'ftp14.freebsd.org' - '$msg_australia' 'ftp.au.freebsd.org' - ' $msg_australia #2' 'ftp2.au.freebsd.org' - ' $msg_australia #3' 'ftp3.au.freebsd.org' - '$msg_austria' 'ftp.at.freebsd.org' - '$msg_brazil' 'ftp2.br.freebsd.org' - ' $msg_brazil #3' 'ftp3.br.freebsd.org' - ' $msg_brazil #4' 'ftp4.br.freebsd.org' - '$msg_bulgaria' 'ftp.bg.freebsd.org' - '$msg_china' 'ftp.cn.freebsd.org' - '$msg_czech_republic' 'ftp.cz.freebsd.org' - '$msg_denmark' 'ftp.dk.freebsd.org' - '$msg_finland' 'ftp.fi.freebsd.org' - '$msg_france' 'ftp.fr.freebsd.org' - ' $msg_france #3' 'ftp3.fr.freebsd.org' - ' $msg_france #4' 'ftp4.fr.freebsd.org' - ' $msg_france #5' 'ftp5.fr.freebsd.org' - ' $msg_france #6' 'ftp6.fr.freebsd.org' - ' $msg_france #7' 'ftp7.fr.freebsd.org' - ' $msg_france #8' 'ftp8.fr.freebsd.org' - '$msg_germany' 'ftp.de.freebsd.org' - ' $msg_germany #2' 'ftp2.de.freebsd.org' - ' $msg_germany #4' 'ftp4.de.freebsd.org' - ' $msg_germany #5' 'ftp5.de.freebsd.org' - ' $msg_germany #7' 'ftp7.de.freebsd.org' - ' $msg_germany #8' 'ftp8.de.freebsd.org' - '$msg_greece' 'ftp.gr.freebsd.org' - ' $msg_greece #2' 'ftp2.gr.freebsd.org' - '$msg_ireland' 'ftp3.ie.freebsd.org' - '$msg_japan' 'ftp.jp.freebsd.org' - ' $msg_japan #2' 'ftp2.jp.freebsd.org' - ' $msg_japan #3' 'ftp3.jp.freebsd.org' - ' $msg_japan #4' 'ftp4.jp.freebsd.org' - ' $msg_japan #5' 'ftp5.jp.freebsd.org' - ' $msg_japan #6' 'ftp6.jp.freebsd.org' - ' $msg_japan #7' 'ftp7.jp.freebsd.org' - ' $msg_japan #8' 'ftp8.jp.freebsd.org' - ' $msg_japan #9' 'ftp9.jp.freebsd.org' - '$msg_korea' 'ftp.kr.freebsd.org' - ' $msg_korea #2' 'ftp2.kr.freebsd.org' - '$msg_latvia' 'ftp.lv.freebsd.org' - '$msg_netherlands' 'ftp.nl.freebsd.org' - ' $msg_netherlands #2' 'ftp2.nl.freebsd.org' - '$msg_new_zealand' 'ftp.nz.freebsd.org' - '$msg_norway' 'ftp.no.freebsd.org' - '$msg_poland' 'ftp.pl.freebsd.org' - '$msg_russia' 'ftp.ru.freebsd.org' - ' $msg_russia #2' 'ftp2.ru.freebsd.org' - ' $msg_russia #5' 'ftp5.ru.freebsd.org' - ' $msg_russia #6' 'ftp6.ru.freebsd.org' - '$msg_slovak_republic' 'ftp.sk.freebsd.org' - ' $msg_slovak_republic #2' 'ftp2.sk.freebsd.org' - '$msg_slovenia' 'ftp.si.freebsd.org' - '$msg_south_africa' 'ftp.za.freebsd.org' - ' $msg_south_africa #2' 'ftp2.za.freebsd.org' - ' $msg_south_africa #4' 'ftp4.za.freebsd.org' - '$msg_sweden' 'ftp.se.freebsd.org' - ' $msg_sweden #2' 'ftp2.se.freebsd.org' - ' $msg_sweden #4' 'ftp4.se.freebsd.org' - '$msg_switzerland' 'ftp.ch.freebsd.org' - '$msg_taiwan' 'ftp.tw.freebsd.org' - ' $msg_taiwan #2' 'ftp2.tw.freebsd.org' - ' $msg_taiwan #3' 'ftp3.tw.freebsd.org' - ' $msg_taiwan #4' 'ftp4.tw.freebsd.org' - ' $msg_taiwan #6' 'ftp6.tw.freebsd.org' - ' $msg_taiwan #11' 'ftp11.tw.freebsd.org' - '$msg_uk' 'ftp.uk.freebsd.org' - ' $msg_uk #2' 'ftp2.uk.freebsd.org' - ' $msg_uk #3' 'ftp3.uk.freebsd.org' - ' $msg_uk #4' 'ftp4.uk.freebsd.org' - ' $msg_uk #5' 'ftp5.uk.freebsd.org' - '$msg_ukraine' 'ftp.ua.freebsd.org' - '$msg_usa #1' 'ftp1.us.freebsd.org' - ' $msg_usa #2' 'ftp2.us.freebsd.org' - ' $msg_usa #3' 'ftp3.us.freebsd.org' - ' $msg_usa #4' 'ftp4.us.freebsd.org' - ' $msg_usa #5' 'ftp5.us.freebsd.org' - ' $msg_usa #6' 'ftp6.us.freebsd.org' - ' $msg_usa #8' 'ftp8.us.freebsd.org' - ' $msg_usa #10' 'ftp10.us.freebsd.org' - ' $msg_usa #11' 'ftp11.us.freebsd.org' - ' $msg_usa #13' 'ftp13.us.freebsd.org' - ' $msg_usa #14' 'ftp14.us.freebsd.org' - ' $msg_usa #15' 'ftp15.us.freebsd.org' - " # END-QUOTE - local hline="$msg_select_a_site_thats_close" - - local height width rows - eval f_dialog_menu_size height width rows \ - \"\$title\" \ - \"\$btitle\" \ - \"\$prompt\" \ - \"\$hline\" \ - $menu_list - - local mtag - mtag=$( eval $DIALOG \ - --title \"\$title\" \ - --backtitle \"\$btitle\" \ - --hline \"\$hline\" \ - --ok-label \"\$msg_ok\" \ - --cancel-label \"\$msg_cancel\" \ - --menu \"\$prompt\" \ - $height $width $rows \ - $menu_list \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) || return $DIALOG_CANCEL - f_dialog_data_sanitize mtag - - case "$mtag" in - URL) setvar $VAR_FTP_PATH "other" ;; - *) - local value - value=$( eval f_dialog_menutag2item \"\$mtag\" $menu_list ) - setvar $VAR_FTP_PATH "ftp://$value" - esac - - return $DIALOG_OK -} - -# f_media_set_ftp -# -# Return success if we both found and set the media type to be an FTP server. -# Variables from variable.subr that can be used to script user input: -# -# VAR_FTP_PATH -# Can be a URL (including "ftp://" protocol-prefix) or "other" -# (user is prompted to enter FTP URL). If a URL, can optionally -# contain directory prefix after hostname/port. Valid examples -# include: -# ftp://myhost -# ftp://somename:21/pub/ -# ftp://192.168.2.3/pub/ -# ftp://[::1]:21/ -# The default port if not specified is 21. -# VAR_NAMESERVER [Optional] -# If set, overrides resolv.conf(5) and sets the nameserver that -# is used to convert names into addresses (when a name converts -# into multiple addresses, the first address to successfully -# connect is used). -# -# Meanwhile, the following variables from variable.subr are set after -# successful execution: -# -# VAR_FTP_HOST -# The FTP host to connect to, parsed from VAR_FTP_PATH. In the -# example case of IPv6 where VAR_FTP_PATH is "ftp://[::1]", this -# variable will be set to "::1" (the outer brackets are removed). -# VAR_FTP_PORT -# The TCP port to connect to, parsed from VAR_FTP_PATH. Usually -# 21 unless VAR_FTP_PATH was of one of the following forms: -# ftp://hostname:OTHER_PORT -# ftp://hostname:OTHER_PORT/* -# ftp://ip:OTHER_PORT -# ftp://ip:OTHER_PORT/* -# ftp://[ip6]:OTHER_PORT -# ftp://[ip6]:OTHER_PORT/* -# VAR_FTP_DIR -# If VAR_FTP_PATH contained a directory element (e.g., -# "ftp://localhost/pub") this variable contains only the -# directory element (e.g., "/pub"). -# -f_media_set_ftp() -{ - f_media_close - - local url - f_getvar $VAR_FTP_PATH url - - # If we've been through here before ... - if f_struct device_network && [ "${url#$msg_other}" ]; then - f_dialog_yesno "$msg_reuse_old_ftp_site_selection_values" || - url= - fi - - if [ ! "$url" ]; then - f_dialog_menu_media_ftp || return $FAILURE - f_getvar $VAR_FTP_PATH url - fi - [ "$url" ] || return $FAILURE - - case "$url" in - other) - setvar $VAR_FTP_PATH "ftp://" - f_variable_get_value $VAR_FTP_PATH \ - "$msg_please_specify_url_of_a_freebsd_distribution" - f_getvar $VAR_FTP_PATH url - if [ ! "${url#ftp://}" ]; then - unset $VAR_FTP_PATH - return $FAILURE - fi - if [ ${#url} -gt ${URL_MAX:-261261} ]; then - f_show_msg "$msg_length_of_specified_url_is_too_long" \ - ${#url} ${URL_MAX:-261261} - unset $VAR_FTP_PATH - return $FAILURE - fi - case "$url" in - ftp://*) : valid URL ;; - *) - f_show_msg "$msg_sorry_invalid_url" "$url" - unset $VAR_FTP_PATH - return $FAILURE - esac - esac - case "$url" in - ftp://*) : valid URL ;; - *) - f_show_msg "$msg_sorry_invalid_url" "$url" - unset $VAR_FTP_PATH - return $FAILURE - esac - - # Set the name of the FTP device to the URL - f_struct_new DEVICE device_ftp - device_ftp set name "$url" - - if ! f_struct device_network || - ! f_dialog_yesno "$msg_youve_already_done_the_network_configuration" - then - f_struct device_network && - f_device_shutdown device_network - if ! f_device_select_tcp; then - unset $VAR_FTP_PATH - return $FAILURE - fi - local dev if - f_getvar $VAR_NETWORK_DEVICE if - f_device_find -1 "$if" $DEVICE_TYPE_NETWORK dev - f_struct_copy "$dev" device_network - fi - if ! f_device_init device_network; then - f_dprintf "f_media_set_ftp: %s" "$msg_net_device_init_failed" - unset $VAR_FTP_PATH - return $FAILURE - fi - - local hostname="${url#*://}" port=21 dir=/ - case "$hostname" in - # - # The order in-which the below individual cases appear is important! - # - "["*"]":*/*) # IPv6 address with port and directory - f_dprintf "Looks like an IPv6 addr with port/dir: %s" \ - "$hostname" - hostname="${hostname#\[}" - port="${hostname#*\]:}" - port="${port%%[!0-9]*}" - dir="/${hostname#*/}" - hostname="${hostname%%\]:*}" - ;; - "["*"]":*) # IPv6 address with port - f_dprintf "Looks like an IPv6 addr with port: %s" "$hostname" - hostname="${hostname#\[}" - port="${hostname#*\]:}" - port="${port%%[!0-9]*}" - hostname="${hostname%%\]:*}" - ;; - "["*"]"/*) # IPv6 address with directory - f_dprintf "Looks like an IPv6 addr with dir: %s" "$hostname" - hostname="${hostname#\[}" - dir="/${hostname#*/}" - hostname="${hostname%%\]*}" - ;; - "["*"]") # IPv6 address - f_dprintf "Looks like an IPv6 addr: %s" "$hostname" - hostname="${hostname#\[}" - hostname="${hostname%\]}" - ;; - # - # ^^^ IPv6 above / DNS Name or IPv4 below vvv - # - *:*/*) # DNS name or IPv4 address with port and directory - f_dprintf "Looks like a %s with port/dir: %s" \ - "DNS name or IPv4 addr" "$hostname" - port="${hostname#*:}" - port="${port%%[!0-9]*}" - dir="/${hostname#*/}" - hostname="${hostname%%:*}" - ;; - *:*) # DNS name or IPv4 address with port - f_dprintf "Looks like a DNS name or IPv4 addr with port: %s" \ - "$hostname" - port="${hostname#*:}" - hostname="${hostname%%:*}" - ;; - */*) # DNS name or IPv4 address with directory - f_dprintf "Looks like a DNS name or IPv4 addr with dir: %s" \ - "$hostname" - dir="/${hostname#*/}" - hostname="${hostname%%/*}" - ;; - *) # DNS name or IPv4 address - f_dprintf "Looks like a DNS name or IPv4 addr: %s" "$hostname" - : leave hostname as-is - esac - - f_dprintf "hostname = \`%s'" "$hostname" - f_dprintf "dir = \`%s'" "$dir" - f_dprintf "port \# = \`%d'" "$port" - - local ns - f_getvar $VAR_NAMESERVER ns - [ "$ns" ] || f_resolv_conf_nameservers ns - if [ "$ns" -a ! "$FTP_SKIP_RESOLV" ] && ! { - f_validate_ipaddr "$hostname" || - f_validate_ipaddr6 "$hostname" - }; then - f_show_info "$msg_looking_up_host" "$hostname" - f_dprintf "%s: Looking up hostname, %s, using host(1)" \ - "f_media_set_ftp" "$hostname" - if ! f_quietly f_host_lookup "$hostname"; then - f_show_msg "$msg_cannot_resolve_hostname" "$hostname" - f_struct device_network && - f_device_shutdown device_network - f_struct_free device_network - unset $VAR_FTP_PATH - return $FAILURE - fi - f_dprintf "Found DNS entry for %s successfully." "$hostname" - fi - - setvar $VAR_FTP_HOST "$hostname" - setvar $VAR_FTP_PORT "$port" - setvar $VAR_FTP_DIR "$dir" - - device_ftp set type $DEVICE_TYPE_FTP - device_ftp set init f_media_init_ftp - device_ftp set get f_media_get_ftp - device_ftp set shutdown f_media_shutdown_ftp - device_ftp set private device_network - f_struct_copy device_ftp device_media - f_struct_free device_ftp - - return $SUCCESS -} - -# f_media_set_ftp_active -# -# Wrapper to f_media_set_ftp to access FTP servers actively. -# -f_media_set_ftp_active() -{ - setvar $VAR_FTP_STATE "active" - f_media_set_ftp -} - -# f_media_set_ftp_passive -# -# Wrapper to f_media_set_ftp to access FTP servers passively. -# -f_media_set_ftp_passive() -{ - setvar $VAR_FTP_STATE "passive" - f_media_set_ftp -} - -# f_media_set_ftp_userpass -# -# Prompt the user to enter/confirm the username/password variables that will -# be used to communicate with the FTP servers. Returns success if the user does -# not cancel or press Esc to either username or password. -# -# Variables from variable.subr that can be used to script user input: -# -# VAR_FTP_USER -# The username to send via ftp(1) when connecting to an FTP -# server. -# VAR_FTP_PASS -# The password to send with the above username. -# -# Does not prompt for confirmation of values if VAR_NONINTERACTIVE is set (see -# variable.subr for more information). -# -f_media_set_ftp_userpass() -{ - local user pass - f_variable_get_value $VAR_FTP_USER \ - "$msg_please_enter_the_username_you_wish_to_login_as" - f_getvar $VAR_FTP_USER user - if [ "$user" ]; then - f_variable_get_value $VAR_FTP_PASS \ - "$msg_please_enter_the_password_for_this_user" - f_getvar $VAR_FTP_PASS pass - else - pass= - fi - [ "$pass" ] # Return status -} - -# f_device_network_up $device -# -# Brings up attached network device, if any - takes FTP device as arg. -# -f_device_network_up() -{ - local dev="$1" netDev - f_struct "$dev" || return $FAILURE - $dev get private netDev || return $SUCCESS # No net == happy net -debug=1 f_dprintf "netDev=[$netDev]" - f_device_init $netDev -} - -# f_device_network_down $device -# -# Brings down attached network device, if any - takes FTP device as arg. -# -f_device_network_down() -{ - local dev="$1" netDev - f_struct "$dev" || return $FAILURE - $dev get private netDev || return $SUCCESS - f_device_shutdown $netDev -} - -# f_media_init_ftp $device -# -# Initializes the FTP media device. Returns success if both able to log into -# the FTP server and confirm the existence of at least one known release path -# using ftp(1). -# -# Variables from variable.subr used to initialize the connection are as follows -# (all of which are configured by f_media_set_ftp above): -# -# VAR_FTP_PATH -# The unparsed FTP URL representing the server to contact. -# Usually "ftp://server" for example. Can contain TCP port number -# and/or directory path (but should not contain username/password -# info). -# VAR_FTP_HOST -# The FTP host to connect to. Can be an IPv4 address (e.g., -# 127.0.0.1), IPv6 address (e.g., ::1), or DNS hostname. Usually -# set automatically in f_media_set_ftp() by parsing VAR_FTP_PATH. -# VAR_FTP_PORT -# The TCP port to connect to. Usually set automatically in -# f_media_set_ftp() by parsing VAR_FTP_PATH. -# VAR_FTP_DIR -# The base FTP directory to use when downloading files from the -# FTP server. Usually set automatically in f_media_set_ftp() by -# parsing VAR_FTP_PATH. -# VAR_FTP_USER [Optional] -# If unset, defaults to using anonymous access. -# VAR_FTP_PASS [Optional] -# If unset, defaults to a sensible value. -# -# In addition, the following (managed either manually or by f_media_set_ftp_*): -# -# VAR_FTP_STATE -# Sets FTPMODE for ftp(1) and can be one of: -# active active mode FTP only -# auto automatic determination of passive or active -# (this is the default) -# gate gate-ftp mode -# passive passive mode FTP only -# See ftp(1) for additional information. -# -# And last, but not least (managed automatically or manually): -# -# VAR_RELNAME -# Defaults to being set to $(uname -r) but can be overridden. -# This sets the name of a release to look for as part of a well -# known set of paths to search for release data once connected -# via FTP. If set to "__RELEASE" or "any" then the VAR_FTP_DIR is -# taken as the absolute path to the release and no further -# searching is done (see FTP_DIRS above in the GLOBALS section -# for a list of well known paths that are used when searching for -# a VAR_RELNAME sub-directory). -# -f_media_init_ftp() -{ - local dev="$1" - local url - - $dev get name url - f_dprintf "Init routine called for FTP device. url=[%s]" "$url" - - if [ "$FTP_INITIALIZED" ]; then - f_dprintf "FTP device already initialized." - return $SUCCESS - fi - - # If we can't initialize the network, bag it! - f_device_network_up $dev || return $FAILURE - - local cp - while :; do - f_getvar $VAR_FTP_PATH cp - if [ ! "$cp" ]; then - if ! f_media_set_ftp || - ! f_getvar $VAR_FTP_PATH cp || - [ ! "$cp" ] - then - f_show_msg "$msg_unable_to_get_proper_ftp_path" - f_device_network_down $dev - return $FAILURE - fi - fi - - local ftp_host ftp_dir - if ! { - f_getvar $VAR_FTP_HOST ftp_host && - f_getvar $VAR_FTP_DIR ftp_dir - }; then - f_show_msg "$msg_missing_ftp_host_or_directory" - f_device_network_down $dev - return $FAILURE - fi - - local ftp_port - f_getvar $VAR_FTP_PORT ftp_port - local host="$ftp_host" port="${ftp_port:+:$ftp_port}" - case "$host" in *:*) host="[$host]"; esac - - local user pass use_anon= - f_getvar $VAR_FTP_USER user - if [ ! "$user" ]; then - user="anonymous" - use_anon=1 - fi - if ! f_getvar $VAR_FTP_PASS pass; then - f_getvar $VAR_HOSTNAME cp - if f_running_as_init; then - pass="installer@$cp" - else - local name="$( id -un 2> /dev/null )" - pass="${name:-ftp}@$cp" - fi - fi - - f_show_info "$msg_logging_in_to_user_at_host" \ - "$user" "$ftp_host" - - local userpass="" - if [ ! "$use_anon" ] && [ "$user" -o "$pass" ]; then - userpass="$user${pass:+:$( f_uriencode "$pass" )}" - userpass="$userpass${userpass:+@}" - fi - - local mode rx - f_getvar $VAR_FTP_STATE mode - - if [ "$ftp_dir" ]; then - if ! rx=$( - printf 'cd "%s"\npwd\n' "$ftp_dir" | eval \ - FTPMODE=\"\$mode\" \ - ${use_anon:+FTPANONPASS=\"\$pass\"} \ - ftp -V ${use_anon:+-a} \ - \"ftp://\$userpass\$host\$port\" \ - 2>&1 - ); then - f_show_msg "$msg_couldnt_open_ftp_connection" \ - "$ftp_host" "$rx" - break # to failure - fi - if echo "$rx" | awk -v dir="/${ftp_dir#/}" ' - BEGIN { - found = 0 - if ( dir != "/" ) sub("/$", "", dir) - } - /^Remote directory: / { - sub(/^[^:]*:[[:space:]]*/, "") - if ($0 != dir) next - found = 1; exit - } - END { exit ! found } - '; then - setvar $VAR_FTP_DIR "$ftp_dir" - setvar $VAR_FTP_PATH \ - "ftp://$ftp_host/${ftp_dir#/}" - else - f_show_msg \ - "$msg_please_check_the_url_and_try_again" \ - "ftp://$ftp_host/${ftp_dir#/}" - break # to failure - fi - fi - - # - # Now that we've verified that the path we're given is ok, - # let's try to be a bit intelligent in locating the release we - # are looking for. First off, if the release is specified as - # "__RELEASE" or "any", then just assume that the current - # directory is the one we want and give up. - # - local rel - f_getvar $VAR_RELNAME rel - f_dprintf "f_media_init_ftp: rel=[%s]" "$rel" - - case "$rel" in - __RELEASE|any) - FTP_INITIALIZED=YES - return $SUCCESS - ;; - *) - # - # Ok, since we have a release variable, let's walk - # through the list of directories looking for a release - # directory. First successful CWD wins. - # - if ! rx=$( - for dir in $FTP_DIRS; do - # Avoid confusing some servers - [ "$dir" = "." ] && continue - printf 'cd "/%s/%s"\npwd\n' \ - "$dir" "$rel" - done | eval \ - FTPMODE=\"\$mode\" \ - ${use_anon:+FTPANONPASS=\"\$pass\"} \ - ftp -V ${use_anon:+-a} \ - \"ftp://\$userpass\$host\$port\" \ - 2>&1 - ); then - f_show_msg "$msg_couldnt_open_ftp_connection" \ - "$ftp_host" "$rx" - break # to failure - fi - - local fdir - if fdir=$( echo "$rx" | awk ' - /^Remote directory: / { - sub(/^[^:]*:[[:space:]]*/, "") - if ($0 == "/") next - # Exit after the first dir - found++; print; exit - } - END { exit ! found } - ' ); then - setvar $VAR_FTP_DIR "$fdir" - setvar $VAR_FTP_PATH "ftp://$ftp_host$fdir" - FTP_INITIALIZED=YES - return $SUCCESS - else - f_yesno "$msg_cant_find_distribution" \ - "$rel" "$ftp_host" - if [ $? -eq $DIALOG_OK ]; then - unset $VAR_FTP_PATH - f_media_set_ftp && continue - fi - fi - esac - break # to failure - done - - unset FTP_INITIALIZED $VAR_FTP_PATH - f_device_network_down $dev - return $FAILURE -} - -# f_media_get_ftp $device $file [$probe_type] -# -# Returns data from $file on an FTP server using ftp(1). Please note that -# $device is unused but must be present (even if null). Information is instead -# gathered from the environment. If $probe_type is present and non-NULL, -# returns success if $file exists. If $probe_type is equal to $PROBE_SIZE, -# prints the size of $file in bytes to standard-out. -# -# Variables from variable.subr used to configure the connection are as follows -# (all of which are configured by f_media_set_ftp above): -# -# VAR_FTP_HOST -# FTP host to connect to. Can be an IPv4 address, IPv6 address, -# or DNS hostname of your choice. -# VAR_FTP_PORT -# TCP port to connect on; see f_media_set_ftp() above. -# VAR_FTP_USER [Optional] -# If unset, defaults to using anonymous access. -# VAR_FTP_PASS [Optional] -# If unset, defaults to a sensible value. -# -# In addition, the following (managed either manually or by f_media_set_ftp_*): -# -# VAR_FTP_STATE -# Sets FTPMODE for ftp(1) and can be one of: -# active active mode FTP only -# auto automatic determination of passive or active -# (this is the default) -# gate gate-ftp mode -# passive passive mode FTP only -# See ftp(1) for additional information. -# -# See variable.subr for additional information. -# -# Example usage: -# f_media_set_ftp -# f_media_get_ftp media $file -# -f_media_get_ftp() -{ - local funcname=f_media_get_ftp - local dev="$1" file="$2" probe_type="$3" hosts= - - f_dprintf "f_media_get_ftp: dev=[%s] file=[%s] probe_type=%s" \ - "$dev" "$file" "$probe_type" - - local ftp_host ftp_port - f_getvar $VAR_FTP_HOST ftp_host - f_getvar $VAR_FTP_PORT ftp_port - - if [ ! "$FTP_INITIALIZED" ]; then - f_dprintf "No FTP connection open, can't get file %s" "$file" - return $FAILURE - fi - - if ! { - f_validate_ipaddr "$ftp_host" || - f_validate_ipaddr6 "$ftp_host" || - { - f_dprintf "%s: Looking up hostname, %s, using host(1)" \ - "f_media_get_ftp" "$ftp_host" - f_host_lookup "$ftp_host" hosts - } - }; then - # All the above validations failed - [ "$hosts" ] && f_dialog_msgbox "$hosts" - return $FAILURE - elif [ ! "$hosts" ]; then - # One of the first two validations passed - hosts="$ftp_host" - fi - - local host connected= - for host in $hosts; do - f_quietly nc -nz "$host" "$ftp_port" || continue - connected=1; break - done - if [ ! "$connected" ]; then - f_show_msg "$msg_couldnt_connect_to_ftp_server %s:%s" \ - "$ftp_host" "$ftp_port" - return $FAILURE - fi - - local user pass use_anon= - f_getvar $VAR_FTP_USER user - if [ ! "$user" ]; then - user="anonymous" - use_anon=1 - fi - if ! f_getvar $VAR_FTP_PASS pass; then - f_getvar $VAR_HOSTNAME cp - if f_running_as_init; then - pass="installer@$cp" - else - local name="$( id -un 2> /dev/null )" - pass="${name:-ftp}@$cp" - fi - fi - - local userpass="" - if [ ! "$use_anon" ] && [ "$user" -o "$pass" ]; then - userpass="$user${pass:+:$( f_uriencode "$pass" )}" - userpass="$userpass${userpass:+@}" - fi - - local dir mode rx - f_getvar $VAR_FTP_DIR\#/ dir - f_getvar $VAR_FTP_STATE mode - - local port="${ftp_port:+:$ftp_port}" - case "$host" in *:*) host="[$host]"; esac - - f_dprintf "sending ftp request for: %s" "ftp://$host$port/$dir/$file" - - if [ "$probe_type" ]; then - local url="ftp://$userpass$host$port/$dir/$file" size - [ "$use_anon" ] && url="ftp://$host$port/$dir/$file" - if ! f_eval_catch -dk size $funcname fetch \ - 'fetch -s "%s"' "$url" || ! f_isinteger "$size" - then - f_dprintf "size request failed!" - [ "$probe_type" = "$PROBE_SIZE" ] && echo "-1" - return $FAILURE - fi - [ "$probe_type" = "$PROBE_SIZE" ] && echo "$size" - return $SUCCESS - fi - - eval FTPMODE=\"\$mode\" ${use_anon:+FTPANONPASS=\"\$pass\"} \ - ftp -V ${use_anon:+-a} -o - \ - \"ftp://\$userpass\$host\$port/\$dir/\$file\" 2> /dev/null - local retval=$? - - [ $retval -eq $SUCCESS ] || f_dprintf "request failed!" - return $retval -} - -# f_media_shutdown_ftp $device -# -# Shuts down the FTP device. Return status should be ignored. Note that since -# we don't maintain an open connection to the FTP server there's nothing to do. -# -f_media_shutdown_ftp() -{ - [ "$FTP_INITIALIZED" ] || return $SUCCESS - - unset FTP_INITIALIZED -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/ftp.subr - -fi # ! $_MEDIA_FTP_SUBR diff --git a/bsdconfig/share/media/http.subr b/bsdconfig/share/media/http.subr deleted file mode 100644 index b928f7d6a78f..000000000000 --- a/bsdconfig/share/media/http.subr +++ /dev/null @@ -1,688 +0,0 @@ -if [ ! "$_MEDIA_HTTP_SUBR" ]; then _MEDIA_HTTP_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/http.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/common.subr -f_include $BSDCFG_SHARE/media/tcpip.subr -f_include $BSDCFG_SHARE/strings.subr -f_include $BSDCFG_SHARE/struct.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -HTTP_SKIP_RESOLV= - -URL_MAX=261261 - # NOTE: This is according to actual fetch(1) test-results. We actually - # use nc(1) to retrieve files, but it's still a good idea to keep the - # URLs short enough that fetch(1) won't complain. - -HTTP_DIRS=" - . - releases/$UNAME_P - snapshots/$UNAME_P - pub/FreeBSD - pub/FreeBSD/releases/$UNAME_P - pub/FreeBSD/snapshots/$UNAME_P - pub/FreeBSD-Archive/old-releases/$UNAME_P -" # END-QUOTE - -############################################################ FUNCTIONS - -# f_dialog_menu_media_http -# -# Prompt the user to select from a range of ``built-in'' HTTP servers or -# specify their own. If the user makes a choice and doesn't cancel or press -# Esc, stores the user's choice in VAR_FTP_PATH (see variable.subr) and returns -# success. -# -f_dialog_menu_media_http() -{ - f_dialog_title "$msg_please_select_a_freebsd_http_distribution_site" - local title="$DIALOG_TITLE" btitle="$DIALOG_BACKTITLE" - f_dialog_title_restore - local prompt="$msg_please_select_the_site_closest_to_you_or_other" - local menu_list=" - 'dist $msg_main_site' 'ftp.freebsd.org' - 'pkg $msg_main_site' 'pkg.freebsd.org' - 'URL' '$msg_specify_some_other_http_site' - " # END-QUOTE - local hline="$msg_select_a_site_thats_close" - - local height width rows - eval f_dialog_menu_size height width rows \ - \"\$title\" \ - \"\$btitle\" \ - \"\$prompt\" \ - \"\$hline\" \ - $menu_list - - local mtag - mtag=$( eval $DIALOG \ - --title \"\$title\" \ - --backtitle \"\$btitle\" \ - --hline \"\$hline\" \ - --ok-label \"\$msg_ok\" \ - --cancel-label \"\$msg_cancel\" \ - --menu \"\$prompt\" \ - $height $width $rows \ - $menu_list \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) || return $DIALOG_CANCEL - f_dialog_data_sanitize mtag - - case "$mtag" in - URL) setvar $VAR_HTTP_PATH "other" ;; - *) - local value - value=$( eval f_dialog_menutag2item \"\$mtag\" $menu_list ) - setvar $VAR_HTTP_PATH "http://$value" - esac - - return $DIALOG_OK -} - -# f_media_set_http -# -# Return success if we both found and set the media type to be an HTTP server. -# -# Variables from variable.subr that can be used to script user input: -# -# VAR_HTTP_PATH -# URL containing host and optionally a target path to the release -# repository on the HTTP server. Valid examples include: -# http://myhost -# http://somename:80/pub/ -# http://192.168.2.3/pub/ -# http://[::1]:8000/ -# The default port if not specified is 80. -# VAR_NAMESERVER [Optional] -# If set, overrides resolv.conf(5) and sets the nameserver that -# is used to convert names into addresses (when a name converts -# into multiple addresses, the first address to successfully -# connect is used). -# -# Meanwhile, the following variables from variable.subr are set after -# successful execution: -# -# VAR_HTTP_HOST -# The HTTP host to connect to, parsed from VAR_HTTP_PATH. In the -# example case of IPv6 where VAR_HTTP_PATH is "http://[::1]" this -# variable will be set to "::1" (the outer brackets are removed). -# VAR_HTTP_PORT -# The TCP port to connect to, parsed from VAR_HTTP_PATH. Usually -# 80 unless VAR_HTTP_PATH was one of the following forms: -# http://hostname:OTHER_PORT -# http://hostname:OTHER_PORT/* -# http://ip:OTHER_PORT -# http://ip:OTHER_PORT/* -# http://[ip6]:OTHER_PORT -# http://[ip6]:OTHER_PORT/* -# VAR_HTTP_DIR -# If VAR_HTTP_PATH contained a directory element (e.g., -# "http://localhost/pub") this variable contains only the -# directory element (e.g., "/pub"). -# -f_media_set_http() -{ - f_media_close - - local url - f_getvar $VAR_HTTP_PATH url - - # If we've been through here before ... - if f_struct device_network && [ "${url#$msg_other}" ]; then - f_dialog_yesno "$msg_reuse_old_http_site_settings" || url= - fi - - if [ ! "$url" ]; then - f_dialog_menu_media_http || return $FAILURE - f_getvar $VAR_HTTP_PATH url - fi - [ "$url" ] || return $FAILURE - - case "$url" in - other) - setvar $VAR_HTTP_PATH "http://" - f_variable_get_value $VAR_HTTP_PATH \ - "$msg_please_specify_url_of_freebsd_http_distribution" - f_getvar $VAR_HTTP_PATH url - if [ ! "${url#http://}" ]; then - unset $VAR_HTTP_PATH - return $FAILURE - fi - if [ ${#url} -gt ${URL_MAX:-261261} ]; then - f_show_msg "$msg_length_of_specified_url_is_too_long" \ - ${#url} ${URL_MAX:-261261} - unset $VAR_HTTP_PATH - return $FAILURE - fi - case "$url" in - http://*) : valid URL ;; - *) - f_show_msg "$msg_sorry_invalid_url" "$url" - unset $VAR_HTTP_PATH - return $FAILURE - esac - esac - case "$url" in - http://*) : valid URL ;; - *) - f_show_msg "$msg_sorry_invalid_url" "$url" - unset $VAR_HTTP_PATH - return $FAILURE - esac - - # Set the name of the HTTP device to the URL - f_struct_new DEVICE device_http - device_http set name "$url" - - if ! f_struct device_network || - ! f_dialog_yesno "$msg_youve_already_done_the_network_configuration" - then - f_struct device_network && - f_device_shutdown device_network - if ! f_device_select_tcp; then - unset $VAR_HTTP_PATH - return $FAILURE - fi - local dev if - f_getvar $VAR_NETWORK_DEVICE if - f_device_find -1 "$if" $DEVICE_TYPE_NETWORK dev - f_struct_copy "$dev" device_network - fi - if ! f_device_init device_network; then - f_dprintf "f_media_set_http: %s" "$msg_net_device_init_failed" - unset $VAR_HTTP_PATH - return $FAILURE - fi - - local hostname="${url#*://}" port=80 dir=/ - case "$hostname" in - # - # The order in-which the below individual cases appear is important! - # - "["*"]":*/*) # IPv6 address with port and directory - f_dprintf "Looks like an IPv6 addr with port/dir: %s" \ - "$hostname" - hostname="${hostname#\[}" - port="${hostname#*\]:}" - port="${port%%[!0-9]*}" - dir="/${hostname#*/}" - hostname="${hostname%%\]:*}" - ;; - "["*"]":*) # IPv6 address with port - f_dprintf "Looks like an IPv6 addr with port: %s" "$hostname" - hostname="${hostname#\[}" - port="${hostname#*\]:}" - port="${port%%[!0-9]*}" - hostname="${hostname%%\]:*}" - ;; - "["*"]"/*) # IPv6 address with directory - f_dprintf "Looks like an IPv6 addr with dir: %s" "$hostname" - hostname="${hostname#\[}" - dir="/${hostname#*/}" - hostname="${hostname%%\]*}" - ;; - "["*"]") # IPv6 address - f_dprintf "Looks like an IPv6 addr: %s" "$hostname" - hostname="${hostname#\[}" - hostname="${hostname%\]}" - ;; - # - # ^^^ IPv6 above / DNS Name or IPv4 below vvv - # - *:*/*) # DNS name or IPv4 address with port and directory - f_dprintf "Looks like a %s with port/dir: %s" \ - "DNS name or IPv4 addr" "$hostname" - port="${hostname#*:}" - port="${port%%[!0-9]*}" - dir="/${hostname#*/}" - hostname="${hostname%%:*}" - ;; - *:*) # DNS name or IPv4 address with port - f_dprintf "Looks like a DNS name or IPv4 addr with port: %s" \ - "$hostname" - port="${hostname#*:}" - hostname="${hostname%%:*}" - ;; - */*) # DNS name or IPv4 address with directory - f_dprintf "Looks like a DNS name or IPv4 addr with dir: %s" \ - "$hostname" - dir="/${hostname#*/}" - hostname="${hostname%%/*}" - ;; - *) # DNS name or IPv4 address - f_dprintf "Looks like a DNS name or IPv4 addr: %s" "$hostname" - : leave hostname as-is - esac - - f_dprintf "hostname = \`%s'" "$hostname" - f_dprintf "dir = \`%s'" "$dir" - f_dprintf "port \# = \`%d'" "$port" - - local ns - f_getvar $VAR_NAMESERVER ns - [ "$ns" ] || f_resolv_conf_nameservers ns - if [ "$ns" -a ! "$HTTP_SKIP_RESOLV" ] && ! { - f_validate_ipaddr "$hostname" || - f_validate_ipaddr6 "$hostname" - }; then - f_show_info "$msg_looking_up_host" "$hostname" - f_dprintf "%s: Looking up hostname, %s, using host(1)" \ - "f_media_set_http" "$hostname" - if ! f_quietly f_host_lookup "$hostname"; then - f_show_msg "$msg_cannot_resolve_hostname" "$hostname" - f_struct device_network && - f_device_shutdown device_network - f_struct_free device_network - unset $VAR_HTTP_PATH - return $FAILURE - fi - f_dprintf "Found DNS entry for %s successfully." "$hostname" - fi - - setvar $VAR_HTTP_HOST "$hostname" - setvar $VAR_HTTP_PORT "$port" - setvar $VAR_HTTP_DIR "$dir" - - device_http set type $DEVICE_TYPE_HTTP - device_http set init f_media_init_http - device_http set get f_media_get_http - device_http set shutdown f_media_shutdown_http - device_http set private device_network - f_struct_copy device_http device_media - f_struct_free device_http - - return $SUCCESS -} - -# f_http_check_access [$connect_only] -# -# Return success if able list a remote HTTP directory. If $connect_only is -# present and non-null, then returns success if a connection can be made. -# Variables from variable.subr that can be used to script user input: -# -# VAR_HTTP_HOST -# The HTTP server host name, IPv4 address or IPv6 address. -# Valid examples include: -# myhost -# 192.168.2.3 -# ::1 -# VAR_HTTP_PORT -# The TCP port to connect to when communicating with the server. -# VAR_HTTP_PATH -# The HTTP path sent to the server. Unused if $connect_only is -# present and non-NULL. -# -f_http_check_access() -{ - local connect_only="$1" hosts= - - local http_host http_port - f_getvar $VAR_HTTP_HOST http_host - f_getvar $VAR_HTTP_PORT http_port - - if ! { - f_validate_ipaddr "$http_host" || - f_validate_ipaddr6 "$http_host" || - { - f_dprintf "%s: Looking up hostname, %s, using host(1)" \ - "f_http_check_access" "$http_host" - f_host_lookup "$http_host" hosts - } - }; then - # All the above validations failed - [ "$hosts" ] && f_dialog_msgbox "$hosts" - unset $VAR_HTTP_HOST - return $FAILURE - elif [ ! "$hosts" ]; then - # One of the first two validations passed - hosts="$http_host" - fi - - local host connected= - for host in $hosts; do - f_quietly nc -nz "$host" "$http_port" || continue - connected=1; break - done - if [ ! "$connected" ]; then - f_show_msg "$msg_couldnt_connect_to_server http://%s:%s/" \ - "$http_host" "$http_port" - unset $VAR_HTTP_HOST - return $FAILURE - fi - [ "$connect_only" ] && return $SUCCESS - - local http_path - f_getvar $VAR_HTTP_PATH http_path - f_show_info "$msg_checking_access_to" "$http_path" - - local rx - case "$http_path" in - http://*|/*) : valid request ;; - *) http_path="/$http_path" # full URI requests only - esac - if ! rx=$( - printf "GET %s/ HTTP/1.0\r\n\r\n" "${http_path%/}" | - nc -n "$host" "$http_port" - ); then - f_show_msg "$msg_couldnt_connect_to_server http://%s:%s/" \ - "$http_host" "$http_port" - unset $VAR_HTTP_HOST - return $FAILURE - fi - - local hdr - hdr=$( echo "$rx" | awk '/^\r$/{exit}{print}' ) - - local http_found=$FAILURE - if echo "$hdr" | awk ' - BEGIN { found = 0 } - /^HTTP.... 200 / { - found = 1 - exit - } - END { exit ! found } - '; then - http_found=$SUCCESS - fi - - return $http_found -} - -# f_media_init_http $device -# -# Initializes the HTTP media device. Returns success if able to confirm the -# existence of at least one known HTTP server release path directly via HTTP -# using f_http_check_access(), above. -# -# Variables from variable.subr that can be used to script user input: -# -# VAR_HTTP_HOST -# The HTTP server to connect to. Must be set. Also see -# f_http_check_access() for additional variables. -# VAR_RELNAME -# Usually set to `uname -r' but can be overridden. -# VAR_HTTP_PATH -# The HTTP path sent to the server. Usually set by calling -# f_media_set_http(). -# -# Meanwhile, after successful execution, the following variables (also from -# variable.subr) are set: -# -# VAR_HTTP_PATH -# The [possibly] adjusted VAR_HTTP_PATH that was found to contain -# a valid FreeBSD repository. -# -f_media_init_http() -{ - local dev="$1" - f_dprintf "Init routine called for HTTP device. dev=[%s]" "$dev" - - if [ "$HTTP_INITIALIZED" ]; then - f_dprintf "HTTP device already initialized." - return $SUCCESS - fi - - # - # First verify access - # - local connect_only=1 - f_http_check_access $connect_only - - local http_host - f_getvar $VAR_HTTP_HOST http_host - while [ ! "$http_host" ]; do - f_media_set_http || return $FAILURE - f_http_check_access $connect_only - f_getvar $VAR_HTTP_HOST http_host - done - - local http_path http_found=$FAILURE - while :; do - # - # Now that we've verified that the path we're given is ok, - # let's try to be a bit intelligent in locating the release we - # are looking for. First off, if the release is specified as - # "__RELEASE" or "any", then just assume that the current - # directory is the one we want and give up. - # - local rel - f_getvar $VAR_RELNAME rel - f_dprintf "f_media_init_http: rel=[%s]" "$rel" - - case "$rel" in - __RELEASE|any) - f_getvar $VAR_HTTP_DIR $VAR_HTTP_PATH - f_http_check_access - http_found=$? - ;; - *) - # - # Ok, since we have a release variable, let's walk - # through the list of directories looking for a release - # directory. First successful path wins. - # - local fdir hp - f_getvar $VAR_HTTP_PATH%/ hp - setvar $VAR_HTTP_PATH "$hp/$PKG_ABI/latest" - if [ "$PKG_ABI" ] && f_http_check_access; then - http_found=$SUCCESS - setvar $VAR_HTTP_PATH "$hp" - else - for fdir in $HTTP_DIRS; do - setvar $VAR_HTTP_PATH "$hp/$fdir/$rel" - if f_http_check_access; then - http_found=$SUCCESS - break - fi - done - fi - esac - - [ $http_found -eq $SUCCESS ] && HTTP_INITIALIZED=YES break - - f_getvar $VAR_HTTP_PATH http_path - f_show_msg "$msg_please_check_the_url_and_try_again" \ - "$http_path" - - unset HTTP_INITIALIZED $VAR_HTTP_PATH - f_media_set_http || break - done - - return $http_found -} - -# f_media_get_http $device $file [$probe_type] -# -# Returns data from $file on an HTTP server using nc(1). Please note that -# $device is unused but must be present (even if null). Information is instead -# gathered from the environment. If $probe_type is both present and non-NULL, -# this function exits after receiving the HTTP header response from the server -# (if the HTTP response code is 200, success is returned; otherwise failure). -# If $probe_type is equal to $PROBE_SIZE, prints the content-length in bytes -# from the response (or -1 if not found) to standard-out. -# -# The variables used to configure the connection are as follows (all of which -# are configured by f_media_set_http above): -# -# VAR_HTTP_HOST -# HTTP server which to connect. Can be an IPv4 address, IPv6 -# address, or DNS hostname of your choice. -# VAR_HTTP_PORT -# TCP port to connect on; see f_media_set_http above. -# VAR_HTTP_PATH -# Directory prefix to use when requesting $file. Default is `/' -# unless f_media_init_http was able to use f_http_check_access -# to validate one of the defaults in $HTTP_DIRS (see GLOBALS at -# the top of this file); assuming VAR_RELNAME was not set to -# either `__RELEASE' or `any' (indicating that the global set of -# $HTTP_DIRS should be ignored). -# -# See variable.subr for additional information. -# -# Example usage: -# f_media_set_http -# f_media_get_http media $file -# -f_media_get_http() -{ - local dev="$1" file="$2" probe_type="$3" hosts= - local name - - $dev get name name - f_dprintf "f_media_get_http: dev=[%s] file=[%s] probe_type=%s" \ - "$name" "$file" "$probe_type" - - local http_host http_port - f_getvar $VAR_HTTP_HOST http_host - f_getvar $VAR_HTTP_PORT http_port - - if [ ! "$HTTP_INITIALIZED" ]; then - f_dprintf "No HTTP connection open, can't get file %s" "$file" - return $FAILURE - fi - - if ! { - f_validate_ipaddr "$http_host" || - f_validate_ipaddr6 "$http_host" || - { - f_dprintf "%s: Looking up hostname, %s, using host(1)" \ - "f_media_get_http" "$http_host" - f_host_lookup "$http_host" hosts - } - }; then - # All the above validations failed - [ "$hosts" ] && f_dialog_msgbox "$hosts" - return $FAILURE - elif [ ! "$hosts" ]; then - # One of the first two validations passed - hosts="$http_host" - fi - - local host connected= - for host in $hosts; do - f_quietly nc -nz "$host" "$http_port" || continue - connected=1; break - done - if [ ! "$connected" ]; then - f_show_msg "$msg_couldnt_connect_to_server http://%s:%s/" \ - "$http_host" "$http_port" - return $FAILURE - fi - - local http_path - f_getvar $VAR_HTTP_PATH%/ http_path - case "$http_path" in - http://*|/*) : valid request ;; - *) http_path="/$http_path" # full URI requests only - esac - - local url="$http_path/$file" rx - f_dprintf "sending http request for: %s" "$url" - f_dprintf "using nc to connect to: %s:%s" "$host" "$http_port" - printf "GET %s HTTP/1.0\r\n\r\n" "$url" | nc -n "$host" "$http_port" | - ( - # - # scan the headers of the response - # this is extremely quick'n dirty - # - - rv=0 length=-1 - while read LINE; do - case "$LINE" in - HTTP*) - f_dprintf "received response: %s" "$LINE" - set -- $LINE; rv=$2 - f_isinteger "$rv" || rv=0 - ;; - "Content-Length: "*) - length="${LINE%
}" - length="${length#Content-Length: }" - f_dprintf "received content-length: %s" \ - "$length" - ;; - *) - [ "${LINE%
}" ] || break # End of headers - esac - done - - [ $rv -ge 500 ] && exit 5 - [ $rv -eq 404 ] && exit 44 - [ $rv -ge 400 ] && exit 4 - [ $rv -ge 300 ] && exit 3 - [ $rv -eq 200 ] || exit $FAILURE - - if [ ! "$probe_type" ]; then - cat # output the rest ``as-is'' - elif [ "$probe_type" = "$PROBE_SIZE" ]; then - f_isinteger "$length" || length=-1 - echo "$length" - fi - exit 200 - ) - local retval=$? - [ $retval -eq 200 ] && return $SUCCESS - [ "$probe_type" ] && return $FAILURE - - case "$retval" in - 5) f_show_msg "$msg_server_error_when_requesting_url" "$url" ;; - 44) f_show_msg "$msg_url_was_not_found" "$url" ;; - 4) f_show_msg "$msg_client_error" ;; - *) f_show_msg "$msg_error_when_requesting_url" "$url" ;; - esac 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - return $FAILURE -} - -# f_media_shutdown_http $device -# -# Shuts down the HTTP device. Return status should be ignored. Note that since -# we don't maintain an open connection to the HTTP server, nothing to do. -# -f_media_shutdown_http() -{ - [ "$HTTP_INITIALIZED" ] || return $SUCCESS - - unset HTTP_INITIALIZED -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/http.subr - -fi # ! $_MEDIA_HTTP_SUBR diff --git a/bsdconfig/share/media/httpproxy.subr b/bsdconfig/share/media/httpproxy.subr deleted file mode 100644 index 1ef516f76463..000000000000 --- a/bsdconfig/share/media/httpproxy.subr +++ /dev/null @@ -1,463 +0,0 @@ -if [ ! "$_MEDIA_HTTPPROXY_SUBR" ]; then _MEDIA_HTTPPROXY_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/httpproxy.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/ftp.subr -f_include $BSDCFG_SHARE/media/tcpip.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ FUNCTIONS - -# f_media_set_http_proxy -# -# Return success if we both found and set the media type to be an ftp server, -# accessed via http proxy. -# -# Variables from variable.subr that can be used to script user input: -# -# VAR_HTTP_PROXY -# HTTP Proxy server to use. Valid examples include: -# myhost -# somename:3128 -# 192.168.2.3 -# [::1]:8080 -# The default port if not specified is 3128. -# -# Variables from variable.subr that are set after successful execution include -# the following: -# -# VAR_HTTP_PROXY_HOST The host portion of VAR_HTTP_PROXY. -# VAR_HTTP_PROXY_PORT The TCP port parsed from VAR_HTTP_PROXY. -# -# See also f_media_set_ftp() for additional variables. -# -f_media_set_http_proxy() -{ - FTP_SKIP_RESOLV=1 f_media_set_ftp || return $FAILURE - - f_variable_get_value $VAR_HTTP_PROXY \ - "$msg_please_enter_the_address_of_the_http_proxy" - - local proxy - f_getvar $VAR_HTTP_PROXY proxy - [ "$proxy" ] || return $FAILURE - - local hostname="$proxy" port=3128 - case "$hostname" in - # - # The order in-which the below individual cases appear is important! - # - "["*"]":*) # IPv6 address with port - f_dprintf "Looks like an IPv6 addr with port: %s" "$hostname" - hostname="${hostname#\[}" - port="${hostname#*\]:}" - port="${port%%[!0-9]*}" - hostname="${hostname%%\]:*}" - ;; - "["*"]") # IPv6 address - f_dprintf "Looks like an IPv6 addr: %s" "$hostname" - hostname="${hostname#\[}" - hostname="${hostname%\]}" - ;; - # - # ^^^ IPv6 above / DNS Name or IPv4 below vvv - # - *:*) # DNS name or IPv4 address with port - f_dprintf "Looks like a DNS name or IPv4 addr with port: %s" \ - "$hostname" - port="${hostname#*:}" - hostname="${hostname%%:*}" - ;; - *) # DNS name or IPv4 address - f_dprintf "Looks like a DNS name or IPv4 addr: %s" "$hostname" - : leave hostname as-is - esac - - setvar $VAR_HTTP_PROXY_HOST "$hostname" - setvar $VAR_HTTP_PROXY_PORT "$port" - - if f_debugging; then - f_dprintf "VAR_FTP_PATH : %s" "$( f_getvar $VAR_FTP_PATH )" - f_dprintf "VAR_HTTP_PROXY_HOST, _PORT: %s:%s" \ - "$( f_getvar $VAR_HTTP_PROXY_HOST )" \ - "$( f_getvar $VAR_HTTP_PROXY_PORT )" - fi - - # media device has been set by f_media_set_ftp(), overwrite partly: - device_media set type $DEVICE_TYPE_HTTP_PROXY - device_media set init f_media_init_http_proxy - device_media set get f_media_get_http_proxy - device_media unset shutdown - - return $SUCCESS -} - -# f_http_proxy_check_access [$connect_only] -# -# Return success if able list a remote FTP directory via HTTP proxy. If -# $connect_only is present and non-null, then returns success if a connection -# can be made. Variables from variable.subr that can be used to script user -# input: -# -# VAR_HTTP_PROXY_HOST -# The HTTP proxy server host name, IPv4 address or IPv6 address. -# Valid examples include: -# myhost -# 192.168.2.3 -# ::1 -# VAR_HTTP_PROXY_PORT -# The TCP port to connect to when communicating with the HTTP -# proxy server. -# VAR_HTTP_PROXY_PATH -# The FTP URL sent to the HTTP proxy server. Unused if -# $connect_only is present and non-NULL. -# -f_http_proxy_check_access() -{ - local connect_only="$1" hosts= - - local proxy_host proxy_port - f_getvar $VAR_HTTP_PROXY_HOST proxy_host - f_getvar $VAR_HTTP_PROXY_PORT proxy_port - - if ! { - f_validate_ipaddr "$proxy_host" || - f_validate_ipaddr6 "$proxy_host" || - { - f_dprintf "%s: Looking up hostname, %s, using host(1)" \ - "f_http_proxy_check_access" "$proxy_host" - f_host_lookup "$proxy_host" hosts - } - }; then - # All the above validations failed - [ "$hosts" ] && f_dialog_msgbox "$hosts" - unset $VAR_HTTP_PROXY_HOST - return $FAILURE - elif [ ! "$hosts" ]; then - # One of the first two validations passed - hosts="$proxy_host" - fi - - local host connected= - for host in $hosts; do - f_quietly nc -nz "$host" "$proxy_port" || continue - connected=1; break - done - if [ ! "$connected" ]; then - f_show_msg "$msg_couldnt_connect_to_proxy %s:%s" \ - "$proxy_host" "$proxy_port" - unset $VAR_HTTP_PROXY_HOST - return $FAILURE - fi - [ "$connect_only" ] && return $SUCCESS - - # - # Some proxies fetch files with certain extensions in "ascii mode" - # instead of "binary mode" for FTP. The FTP server then translates all - # LF to CRLF. - # - # You can force Squid to use binary mode by appending ";type=i" to the - # URL, which is what sysinstall(8) has traditionally done. - # - - local proxy_path - f_getvar $VAR_HTTP_PROXY_PATH proxy_path - f_show_info "$msg_checking_access_to" "$proxy_path" - - local rx - if ! rx=$( - printf "GET %s/ HTTP/1.0\r\n\r\n" "${proxy_path%/}" | - nc -n "$host" "$proxy_port" - ); then - f_show_msg "$msg_couldnt_connect_to_proxy %s:%s" \ - "$proxy_host" "$proxy_port" - unset $VAR_HTTP_PROXY_HOST - return $FAILURE - fi - - local hdr - hdr=$( echo "$rx" | awk '/^\r$/{exit}{print}' ) - - local http_found=$FAILURE - if echo "$hdr" | awk ' - BEGIN { found = 0 } - /^HTTP.... 200 / { - found = 1 - exit - } - END { exit ! found } - '; then - http_found=$SUCCESS - fi - - # - # Scan the headers of the response - # this is extremely quick'n dity - # - - unset $VAR_HTTP_FTP_MODE - if echo "$hdr" | awk ' - BEGIN { found = 0 } - { - if (!match($0, /^Server: /)) next - found = ( substr($0, 9, 5) ~ /[Ss]quid/ ) - } - END { exit ! found } - '; then - setvar $VAR_HTTP_FTP_MODE ";type=i" - else - setvar $VAR_HTTP_FTP_MODE "" - fi - - return $http_found -} - -# f_media_init_http_proxy $device -# -# Initializes the HTTP Proxy media device. Returns success if able to confirm -# the existence of at least one known FTP server release path via HTTP proxy -# using f_http_proxy_check_access(), above. -# -# Variables from variable.subr that can be used to script user input: -# -# VAR_HTTP_PROXY_HOST -# The HTTP proxy server to connect to. Usually set by having -# f_media_set_http_proxy() parse VAR_HTTP_PROXY. Must be set. -# Also see f_http_proxy_check_access() for additional variables. -# VAR_RELNAME -# Usually set to `uname -r' but can be overridden. -# VAR_FTP_PATH -# The FTP URL to send to the HTTP proxy server. Usually set by -# calling f_media_set_ftp(). -# -# Meanwhile, after successful execution, the following variables (also from -# variable.subr) are set: -# -# VAR_HTTP_PROXY_PATH -# The [possibly] adjusted VAR_FTP_PATH that was found to contain -# a valid FreeBSD repository. -# -f_media_init_http_proxy() -{ - local dev="$1" - f_dprintf "Init routine called for HTTP Proxy device. dev=[%s]" "$dev" - - # - # First verify access - # - local connect_only=1 - f_http_proxy_check_access $connect_only - - local proxy_host - f_getvar $VAR_HTTP_PROXY_HOST proxy_host - while [ ! "$proxy_host" ]; do - f_media_set_http_proxy || return $FAILURE - f_http_proxy_check_access $connect_only - f_getvar $VAR_HTTP_PROXY_HOST proxy_host - done - - local rel proxy_path http_found=$FAILURE - while :; do - # - # If the release is specified as "__RELEASE" or "any", then - # just assume that the path the user gave is ok. - # - f_getvar $VAR_RELNAME rel - f_dprintf "f_media_init_http_proxy: rel=[%s]" "$rel" - - case "$rel" in - __RELEASE|any) - f_getvar $VAR_FTP_PATH $VAR_HTTP_PROXY_PATH - f_http_proxy_check_access - http_found=$? - ;; - *) - local fdir fp - f_getvar $VAR_FTP_PATH%/ fp - for fdir in $FTP_DIRS; do - setvar $VAR_HTTP_PROXY_PATH "$fp/$fdir/$rel" - if f_http_proxy_check_access; then - http_found=$SUCCESS - break - fi - done - esac - - [ $http_found -eq $SUCCESS ] && break - - f_getvar $VAR_HTTP_PROXY_PATH proxy_path - f_show_msg "$msg_please_check_the_url_and_try_again" \ - "$proxy_path" - - unset $VAR_HTTP_PROXY_PATH - f_media_set_http_proxy || break - done - - return $http_found -} - -# f_media_get_http_proxy $device $file [$probe_type] -# -# Returns data from $file on an FTP server via HTTP proxy using nc(1). Please -# note that $device is unused but must be present (even if null). Information -# is instead gathered from the environment. If $probe_type is both present and -# non-NULL, this function exits after receiving the HTTP header response from -# the proxy server (if the HTTP response code is 200, success is returned; -# otherwise failure). If $probe_type is equal to $PROBE_SIZE, prints the -# content-length in bytes from the response (or -1 if not found) to standard- -# out. -# -# The variables used to configure the connection are as follows (all of which -# are configured by f_media_set_http_proxy above): -# -# VAR_HTTP_PROXY_HOST -# HTTP proxy host to connect. Can be an IPv4 address, IPv6 -# address, or DNS hostname of your choice. -# VAR_HTTP_PROXY_PORT -# TCP port to connect on; see f_media_set_http_proxy above. -# VAR_HTTP_PROXY_PATH -# URL (including "ftp://" protocol-prefix) of FTP directory to -# use as a prefix when requesting $file via HTTP proxy. -# -# See variable.subr for additional information. -# -# Example usage: -# f_media_set_http_proxy -# f_media_get_http_proxy media $file -# -f_media_get_http_proxy() -{ - local dev="$1" file="$2" probe_type="$3" hosts= - - f_dprintf "f_media_get_http_proxy: dev=[%s] file=[%s] probe_type=%s" \ - "$dev" "$file" "$probe_type" - - local proxy_host proxy_port - f_getvar $VAR_HTTP_PROXY_HOST proxy_host - f_getvar $VAR_HTTP_PROXY_PORT proxy_port - - if ! { - f_validate_ipaddr "$proxy_host" || - f_validate_ipaddr6 "$proxy_host" || - { - f_dprintf "%s: Looking up hostname, %s, using host(1)" \ - "f_media_get_http_proxy" "$proxy_host" - f_host_lookup "$proxy_host" hosts - } - }; then - # All the above validations failed - [ "$hosts" ] && f_dialog_msgbox "$hosts" - return $FAILURE - elif [ ! "$hosts" ]; then - # One of the first two validations passed - hosts="$proxy_host" - fi - - local host connected= - for host in $hosts; do - f_quietly nc -nz "$host" "$proxy_port" || continue - connected=1; break - done - if [ ! "$connected" ]; then - f_show_msg "$msg_couldnt_connect_to_proxy %s:%s" \ - "$proxy_host" "$proxy_port" - return $FAILURE - fi - - local proxy_path mode - f_getvar $VAR_HTTP_PROXY_PATH%/ proxy_path - f_getvar $VAR_HTTP_FTP_MODE mode - local url="$proxy_path/$file$mode" rx - - f_dprintf "sending http request for: %s" "$url" - printf "GET %s HTTP/1.0\r\n\r\n" "$url" | nc -n "$host" "$proxy_port" | - ( - # - # scan the headers of the response - # this is extremely quick'n dirty - # - - rv=0 length=-1 - while read LINE; do - case "$LINE" in - HTTP*) - f_dprintf "received response: %s" "$LINE" - set -- $LINE; rv=$2 - f_isinteger "$rv" || rv=0 - ;; - "Content-Length: "*) - length="${LINE%
}" - length="${length#Content-Length: }" - f_dprintf "received content-length: %s" \ - "$length" - ;; - *) - [ "${LINE%
}" ] || break # End of headers - esac - done - - [ $rv -ge 500 ] && exit 5 - [ $rv -eq 404 ] && exit 44 - [ $rv -ge 400 ] && exit 4 - [ $rv -ge 300 ] && exit 3 - [ $rv -eq 200 ] || exit $FAILURE - - if [ ! "$probe_type" ]; then - cat # output the rest ``as-is'' - elif [ "$probe_type" = "$PROBE_SIZE" ]; then - f_isinteger "$length" || length=-1 - echo "$length" - fi - exit 200 - ) - local retval=$? - [ $retval -eq 200 ] && return $SUCCESS - [ "$probe_type" ] && return $FAILURE - - case "$retval" in - 5) f_show_msg "$msg_server_error_when_requesting_url" "$url" ;; - 44) f_show_msg "$msg_url_was_not_found" "$url" ;; - 4) f_show_msg "$msg_client_error" ;; - *) f_show_msg "$msg_error_when_requesting_url" "$url" ;; - esac 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - return $FAILURE -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/httpproxy.subr - -fi # ! $_MEDIA_HTTPPROXY_SUBR diff --git a/bsdconfig/share/media/network.subr b/bsdconfig/share/media/network.subr deleted file mode 100644 index 5a03d80e8163..000000000000 --- a/bsdconfig/share/media/network.subr +++ /dev/null @@ -1,182 +0,0 @@ -if [ ! "$_MEDIA_NETWORK_SUBR" ]; then _MEDIA_NETWORK_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/network.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/tcpip.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -NETWORK_INITIALIZED= - -############################################################ FUNCTIONS - -# f_media_init_network $device -# -# Initialize a network device (such as `fxp0', `em0', etc.). Returns success if -# able to successfully initialize the device. If not running as init (basically -# from the FreeBSD install media) then assume that the network has already been -# initialized and returns success. -# -# The variables (from variable.subr) used to initialize the network are as -# follows (all of which are configured either automatically or manually): -# -# VAR_IFCONFIG + device_name (e.g., `ifconfig_em0') -# Automatically populated but can be overridden in a script. This -# defines the ifconfig(8) properties specific to a chosen network -# interface device. Optional if VAR_IPV6ADDR is set. -# VAR_IPV6ADDR [Optional] -# If not running as init (and setting up RTSOL connections for -# the interface), then must be set manually. If set, used as the -# IPv6 configuration for the given network interface device. -# VAR_GATEWAY [Optional] -# If not running as init (and setting up a static connection for -# the interface) then must be set (usually via rc.conf(5), but -# can be set manually to override). If unset, the user is warned -# but not prevented from proceeding (as most connections need a -# default route but not everyone). -# -f_media_init_network() -{ - local dev="$1" - - f_dprintf "Init routine called for network device \`%s'." "$dev" - if [ "$NETWORK_INITIALIZED" ]; then - f_dprintf "Network already initialized." - return $SUCCESS - elif ! f_running_as_init; then - f_dprintf "Not running as init -- calling the deed done." - NETWORK_INITIALIZED=1 - return $SUCCESS - fi - - if [ ! -e "$RESOLV_CONF" ]; then - if ! f_config_resolv; then - f_show_msg "$msg_cant_seem_to_write_out_resolv_conf" \ - "$RESOLV_CONF" - return $FAILURE - fi - fi - - local cp - if f_getvar $VAR_IFCONFIG$dev cp; then - # - # If this interface isn't a DHCP one, bring it up. - # If it is, then it's already up. - # - case "$cp" in - *DHCP*) - f_dprintf "A DHCP interface. Should already be up." - ;; - *) - f_dprintf "Not a DHCP interface." - if ! f_quietly ifconfig "$dev" $cp; then - f_show_msg "$msg_unable_to_configure_device" \ - "$dev" - return $FAILURE - fi - local rp - f_getvar $VAR_GATEWAY rp - if [ ! "$rp" ]; then - f_show_msg "$msg_no_gateway_has_been_set" - else - # - # Explicitly flush all routes to get back to a - # known sane state. We don't need to check this - # exit code because if anything fails it will - # show up in the route add below. - # - f_quietly route -n flush - f_dprintf "Adding default route to %s." "$rp" - if ! f_quietly route -n add default "$rp"; then - f_show_msg \ - "$msg_failed_to_add_default_route" - return $FAILURE - fi - fi - esac - elif ! { f_getvar $VAR_IPV6ADDR cp && [ "$cp" ]; }; then - f_show_msg "$msg_device_is_not_configured" "$dev" - return $FAILURE - fi - - f_dprintf "Network initialized successfully." - NETWORK_INITIALIZED=1 - return $SUCCESS -} - -# f_media_shutdown_network $device -# -# Shuts down the configured network device (e.g., `fxp0', `em0', etc.) and -# deletes the default route (if configured). Returns failure if the device -# passed has not been configured. If not running as init (basically from the -# FreeBSD install media) then does nothing and returns success. -# -f_media_shutdown_network() -{ - local dev="$1" cp - - f_dprintf "Shutdown called for network device %s" "$dev" - if [ ! "$NETWORK_INITIALIZED" ]; then - f_dprintf "Network not initialized -- nothing to do." - return $SUCCESS - fi - - unset NETWORK_INITIALIZED - unset $VAR_NETWORK_DEVICE - - if ! f_running_as_init; then - f_dprintf "Not running as init -- calling the deed done." - return $SUCCESS - fi - - f_getvar $VAR_IFCONFIG$dev cp || return $FAILURE - f_dprintf "ifconfig %s down" "$dev" - f_quietly ifconfig $dev down || - f_show_msg "$msg_unable_to_down_the_interface_properly" "$dev" - - if f_getvar $VAR_GATEWAY cp; then - f_dprintf "Deleting default route." - f_quietly route -n delete default - fi - - return $SUCCESS -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/network.subr - -fi # ! $_MEDIA_NETWORK_SUBR diff --git a/bsdconfig/share/media/nfs.subr b/bsdconfig/share/media/nfs.subr deleted file mode 100644 index d83661f46b69..000000000000 --- a/bsdconfig/share/media/nfs.subr +++ /dev/null @@ -1,258 +0,0 @@ -if [ ! "$_MEDIA_NFS_SUBR" ]; then _MEDIA_NFS_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/nfs.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/common.subr -f_include $BSDCFG_SHARE/media/network.subr -f_include $BSDCFG_SHARE/media/tcpip.subr -f_include $BSDCFG_SHARE/struct.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -NFS_MOUNTED= - -############################################################ FUNCTIONS - -# f_media_set_nfs -# -# Return success if we both found and set the media type to be an NFS server. -# Variables from variable.subr that can be used to script user input: -# -# VAR_NFS_PATH -# The NFS path specification (host:path) to use when mounting the -# remote repository. -# VAR_NAMESERVER [Optional] -# Automatically populated from resolv.conf(5) but can be -# overridden. If set, the host portion of VAR_NFS_PATH is -# looked up using f_host_lookup() from `tcpip.subr'. -# -# Meanwhile, the following variables from variable.subr are set after -# successful execution: -# -# VAR_NFS_HOST -# The host portion of the NFS path specification, parsed from -# VAR_NFS_PATH. -# -f_media_set_nfs() -{ - local nfs - - f_media_close - - f_variable_get_value $VAR_NFS_PATH \ - "$msg_please_enter_the_full_nfs_file_specification" - f_getvar $VAR_NFS_PATH nfs - [ "$nfs" ] || return $FAILURE - - case "$nfs" in - *:*) : valid NFS path ;; - *) - f_show_msg "$msg_invalid_nfs_path_specification" - return $FAILURE - esac - - f_struct_new DEVICE device_nfs - device_nfs set name "$nfs" - - if ! f_struct device_network || - ! f_dialog_yesno "$msg_youve_already_done_the_network_configuration" - then - f_struct device_network && - f_device_shutdown device_network - f_device_select_tcp || return $FAILURE - local dev if - f_getvar $VAR_NETWORK_DEVICE if - f_device_find -1 "$if" $DEVICE_TYPE_NETWORK dev - f_struct_copy "$dev" device_network - fi - f_device_init device_network || - f_dprintf "%s: $msg_net_device_init_failed\n" f_media_set_nfs - - local hostname="${nfs%%:*}" - if f_isset $VAR_NAMESERVER && ! { - f_validate_ipaddr "$hostname" || f_validate_ipaddr6 "$hostname" - }; then - f_show_info "$msg_looking_up_host" "$hostname" - f_dprintf "%s Looking up hostname, %s, using host(1)" \ - "f_media_set_nfs" "$hostname" - if ! f_quietly f_host_lookup "$hostname"; then - f_show_msg "$msg_cannot_resolve_hostname" "$hostname" - f_struct device_network && - f_device_shutdown device_network - f_struct_free device_network - unset $VAR_NFS_PATH - return $FAILURE - fi - f_dprintf "Found DNS entry for %s successfully." "$hostname" - fi - - setvar $VAR_NFS_HOST "$hostname" - - device_nfs set type $DEVICE_TYPE_NFS - device_nfs set init f_media_init_nfs - device_nfs set get f_media_get_nfs - device_nfs set shutdown f_media_shutdown_nfs - device_nfs set private device_network # in name only (deref'd later) - - f_struct_copy device_nfs device_media - f_struct_free device_nfs - - return $SUCCESS -} - -# f_media_init_nfs $device -# -# Initializes the NFS media device. Returns success if able to mount the NFS -# device using mount_nfs(1). -# -# The variables (from variable.subr) used to initialize the NFS mount are as -# follows (all of which are configured manually/optionally from the options -# menu): -# -# VAR_NFS_TCP [Optional] -# If non-NULL, adds the "tcp" option via `-o' to mount_nfs(8). -# VAR_NFS_V3 [Optional] -# If non-NULL, adds the "nfsv3" option via `-o' to mount_nfs(8). -# VAR_NFS_SECURE [Optional] -# If non-NULL, adds the "-P" flag to mount_nfs(8). -# VAR_SLOW_ETHER [Optional] -# If non-NULL, adjusts the read/write size to avoid timeouts. -# -f_media_init_nfs() -{ - local funcname=f_media_init_nfs - local dev="$1" name err - - $dev get name name || return $FAILURE - f_dprintf "Init routine called for NFS device. name=[%s]" \ - "$name" - - if [ "$NFS_MOUNTED" ]; then - f_dprintf "NFS device already mounted." - return $SUCCESS - fi - - if ! f_device_init device_network; then - f_dprintf "f_media_init_nfs: %s" "$msg_net_device_init_failed" - return $FAILURE - fi - - if [ ! -e "$MOUNTPOINT" ]; then - f_eval_catch $funcname mkdir 'mkdir -p "%s"' "$MOUNTPOINT" || - return $FAILURE - fi - - local cp tcp="" use3="" secure="" readsize=4096 writesize=4096 - f_getvar $VAR_NFS_TCP cp - [ "$cp" = "YES" ] && tcp=1 - f_getvar $VAR_NFS_V3 cp - [ "$cp" = "YES" ] && use3=1 - f_getvar $VAR_NFS_SECURE cp - [ "$cp" = "YES" ] && secure=1 - f_getvar $VAR_SLOW_ETHER cp - [ "$cp" = "YES" ] && readsize=1024 writesize=1024 - - local options="rsize=$readsize,wsize=$writesize" - [ "$use3" ] && options="$options,nfsv3" - [ "$tcp" ] && options="$options,tcp" - - if ! f_eval_catch -dk err $funcname mount_nfs \ - 'mount_nfs %s -o "%s" "%s" "%s"' \ - "${secure:+-P}" "$options" "$name" "$MOUNTPOINT" - then - err="${err#mount_nfs: }" - f_show_msg "$msg_error_mounting_device" \ - "$name" "$MOUNTPOINT" "$err" - f_struct device_network && - f_device_shutdown device_network - return $FAILURE - fi - NFS_MOUNTED=1 - - f_dprintf "Mounted NFS device %s onto %s" "$name" "$MOUNTPOINT" - - return $SUCCESS -} - -# f_media_get_nfs $device $file [$probe_type] -# -# Returns data from $file on a mounted NFS device. Similar to cat(1). If -# $probe_type is present and non-NULL, returns success if $file exists. If -# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to -# standard-out. -# -f_media_get_nfs() -{ - local dev="$1" file="$2" probe_type="$3" - local name - - $dev get name name - f_dprintf "f_media_get_nfs: dev=[%s] file=[%s] probe_type=%s" \ - "$name" "$file" "$probe_type" - - f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" -} - -# f_media_shutdown_nfs $device -# -# Shuts down the NFS device using umount(8). Return status should be ignored. -# -f_media_shutdown_nfs() -{ - local funcname=f_media_shutdown_nfs - local dev="$1" err - - [ "$NFS_MOUNTED" ] || return $FAILURE - - f_dprintf "Unmounting NFS partition on %s" "$MOUNTPOINT" - if ! f_eval_catch -dk err $funcname umount \ - 'umount -f "%s"' "$MOUNTPOINT" - then - err="${err#umount: }"; err="${err#*: }" - f_show_msg "$msg_could_not_unmount_the_nfs_partition" \ - "$MOUNTPOINT" "$err" - else - NFS_MOUNTED= - fi -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/nfs.subr - -fi # ! $_MEDIA_NFS_SUBR diff --git a/bsdconfig/share/media/options.subr b/bsdconfig/share/media/options.subr deleted file mode 100644 index bc9568e65102..000000000000 --- a/bsdconfig/share/media/options.subr +++ /dev/null @@ -1,327 +0,0 @@ -if [ ! "$_MEDIA_OPTIONS_SUBR" ]; then _MEDIA_OPTIONS_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/options.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/any.subr -f_include $BSDCFG_SHARE/media/ftp.subr -f_include $BSDCFG_SHARE/struct.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -OPTIONS_HELPFILE=$BSDCFG_LIBE/include/options.hlp - -############################################################ FUNCTIONS - -# f_media_options_menu -# -# Prompt the user to confirm/edit various media settings. Returns success. -# -f_media_options_menu() -{ - f_dialog_title "$msg_options_editor" - local title="$DIALOG_TITLE" btitle="$DIALOG_BACKTITLE" - f_dialog_title_restore - local prompt= - local menu_list # Calculated below - local defaultitem= - local hline="$hline_arrows_tab_enter" - - # - # A hack so that the dialogs below are always interactive in a script - # - local old_interactive= - if ! f_interactive; then - f_getvar $VAR_NONINTERACTIVE old_interactive - unset $VAR_NONINTERACTIVE - fi - - local cp - while :; do - menu_list= - - f_getvar $VAR_NFS_SECURE cp - if [ "$cp" = "YES" ]; then menu_list="$menu_list - ' $msg_nfs_secure' 'YES' - '$msg_nfs_server_talks_only_on_a_secure_port'" - else menu_list="$menu_list - ' $msg_nfs_secure' 'NO' - '$msg_nfs_server_talks_only_on_a_secure_port'" - fi - - f_getvar $VAR_SLOW_ETHER cp - if [ "$cp" = "YES" ]; then menu_list="$menu_list - ' $msg_nfs_slow' 'YES' - '$msg_user_is_using_a_slow_pc_or_ethernet_card'" - else menu_list="$menu_list - ' $msg_nfs_slow' 'NO' - '$msg_user_is_using_a_slow_pc_or_ethernet_card'" - fi - - f_getvar $VAR_NFS_TCP cp - if [ "$cp" = "YES" ]; then menu_list="$menu_list - ' $msg_nfs_tcp' 'YES' '$msg_use_tcp_protocol_for_nfs'" - else menu_list="$menu_list - ' $msg_nfs_tcp' 'NO' '$msg_use_tcp_protocol_for_nfs'" - fi - - f_getvar $VAR_NFS_V3 cp - if [ "$cp" = "YES" ]; then menu_list="$menu_list - ' $msg_nfs_version_3' 'YES' '$msg_use_nfs_version_3'" - else menu_list="$menu_list - ' $msg_nfs_version_3' 'NO' '$msg_use_nfs_version_3'" - fi - - f_getvar $VAR_DEBUG cp - if [ "$cp" ]; then menu_list="$menu_list - ' $msg_debugging' 'YES' - '$msg_emit_extra_debugging_output'" - else menu_list="$menu_list - ' $msg_debugging' 'NO' - '$msg_emit_extra_debugging_output'" - fi - - f_getvar $VAR_NO_CONFIRM cp - if [ "$cp" ]; then menu_list="$menu_list - ' $msg_yes_to_all' 'YES' - '$msg_assume_yes_to_all_non_critical_dialogs'" - else menu_list="$menu_list - ' $msg_yes_to_all' 'NO' - '$msg_assume_yes_to_all_non_critical_dialogs'" - fi - - f_getvar $VAR_TRY_DHCP cp - if [ "$cp" = "YES" ]; then menu_list="$menu_list - ' $msg_dhcp' 'YES' - '$msg_attempt_automatic_dhcp_configuration'" - else menu_list="$menu_list - ' $msg_dhcp' 'NO' - '$msg_attempt_automatic_dhcp_configuration'" - fi - - f_getvar $VAR_TRY_RTSOL cp - if [ "$cp" = "YES" ]; then menu_list="$menu_list - ' $msg_ipv6' 'YES' - '$msg_attempt_ipv6_configuration_of_interfaces'" - else menu_list="$menu_list - ' $msg_ipv6' 'NO' - '$msg_attempt_ipv6_configuration_of_interfaces'" - fi - - f_getvar $VAR_FTP_USER cp - menu_list="$menu_list - ' $msg_ftp_username' '$cp' - '$msg_username_and_password_to_use'" - - f_getvar $VAR_EDITOR cp - menu_list="$menu_list - ' $msg_editor' '$cp' '$msg_which_text_editor_to_use'" - - f_getvar $VAR_RELNAME cp - menu_list="$menu_list - ' $msg_release_name' '$cp' - '$msg_which_release_to_attempt_to_load'" - - if f_struct device_media; then - device_media get type cp - case "$cp" in - $DEVICE_TYPE_UFS|$DEVICE_TYPE_DISK) - cp="$msg_file_system" ;; - $DEVICE_TYPE_DIRECTORY) cp="$msg_directory" ;; - $DEVICE_TYPE_FLOPPY) cp="$msg_floppy" ;; - $DEVICE_TYPE_FTP) cp="$msg_ftp" ;; - $DEVICE_TYPE_HTTP_PROXY) cp="$msg_http_proxy" ;; - $DEVICE_TYPE_HTTP) cp="$msg_http_direct" ;; - $DEVICE_TYPE_CDROM) cp="$msg_cdrom" ;; - $DEVICE_TYPE_USB) cp="$msg_usb" ;; - $DEVICE_TYPE_DOS) cp="$msg_dos" ;; - $DEVICE_TYPE_NFS) cp="$msg_nfs" ;; - *) - cp="<$msg_unknown>" - esac - else - cp="<$msg_not_yet_set>" - fi - menu_list="$menu_list - ' $msg_media_type' '$cp' - '$msg_the_current_installation_media_type'" - - f_getvar $VAR_MEDIA_TIMEOUT cp - menu_list="$menu_list - ' $msg_media_timeout' '$cp' - '$msg_timeout_value_in_seconds_for_slow_media'" - - f_getvar $VAR_PKG_TMPDIR cp - menu_list="$menu_list - ' $msg_package_temp' '$cp' - '$msg_directory_where_package_temporary_files_go'" - - menu_list="$menu_list - ' $msg_rescan_devices' '<*>' - '$msg_rerun_bsdconfig_initial_device_probe' - ' $msg_use_defaults' '[${msg_reset}]' - '$msg_reset_all_values_to_startup_defaults' - " # END-QUOTE - - local height width rows - eval f_dialog_menu_with_help_size height width rows \ - \"\$title\" \ - \"\$btitle\" \ - \"\$prompt\" \ - \"\$hline\" \ - $menu_list - - local mtag - mtag=$( eval $DIALOG \ - --title \"\$title\" \ - --backtitle \"\$btitle\" \ - --hline \"\$hline\" \ - --item-help \ - --ok-label \"\$msg_ok\" \ - --cancel-label \"\$msg_done\" \ - --help-button \ - --help-label \"\$msg_help\" \ - --default-item \"\$defaultitem\" \ - ${USE_XDIALOG:+--help \"\"} \ - --menu \"\$prompt\" \ - $height $width $rows \ - $menu_list \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) - local retval=$? - f_dialog_data_sanitize mtag - defaultitem="$mtag" - f_dprintf "retval=%s mtag=[%s]" $retval "$mtag" - - if [ $retval -eq $DIALOG_HELP ]; then - f_show_help "$OPTIONS_HELPFILE" - continue - elif [ $retval -ne $DIALOG_OK ]; then - break # to success - fi - - case "$mtag" in - " $msg_nfs_secure") - f_getvar $VAR_NFS_SECURE cp - if [ "$cp" = "YES" ]; then - export $VAR_NFS_SECURE="NO" - else - export $VAR_NFS_SECURE="YES" - fi ;; - " $msg_nfs_slow") - f_getvar $VAR_SLOW_ETHER cp - if [ "$cp" = "YES" ]; then - export $VAR_SLOW_ETHER="NO" - else - export $VAR_SLOW_ETHER="YES" - fi ;; - " $msg_nfs_tcp") - f_getvar $VAR_NFS_TCP cp - if [ "$cp" = "YES" ]; then - export $VAR_NFS_TCP="NO" - else - export $VAR_NFS_TCP="YES" - fi ;; - " $msg_nfs_version_3") - f_getvar $VAR_NFS_V3 cp - if [ "$cp" = "YES" ]; then - export $VAR_NFS_V3="NO" - else - export $VAR_NFS_V3="YES" - fi ;; - " $msg_debugging") - if f_getvar $VAR_DEBUG cp && [ "$cp" ]; then - unset $VAR_DEBUG - else - export $VAR_DEBUG=1 - fi ;; - " $msg_yes_to_all") - if f_getvar $VAR_NO_CONFIRM cp && [ "$cp" ]; then - unset $VAR_NO_CONFIRM - else - export $VAR_NO_CONFIRM=1 - fi ;; - " $msg_dhcp") - f_getvar $VAR_TRY_DHCP cp - if [ "$cp" = "YES" ]; then - export $VAR_TRY_DHCP="NO" - else - export $VAR_TRY_DHCP="YES" - fi ;; - " $msg_ipv6") - f_getvar $VAR_TRY_RTSOL cp - if [ "$cp" = "YES" ]; then - export $VAR_TRY_RTSOL="NO" - else - export $VAR_TRY_RTSOL="YES" - fi ;; - " $msg_ftp_username") - f_media_set_ftp_userpass ;; - " $msg_editor") - f_variable_get_value $VAR_EDITOR \ - "$msg_please_specify_the_name_of_the_text_editor" - ;; - " $msg_release_name") - f_variable_get_value $VAR_RELNAME \ - "$msg_please_specify_the_release_you_wish_to_load" - ;; - " $msg_media_type") - f_media_get_type ;; - " $msg_media_timeout") - f_variable_get_value $VAR_MEDIA_TIMEOUT \ - "$msg_please_specify_the_number_of_seconds_to_wait" - ;; - " $msg_package_temp") - f_variable_get_value $VAR_PKG_TMPDIR \ - "$msg_please_specify_a_temporary_directory" - ;; - " $msg_rescan_devices") - f_device_rescan ;; - " $msg_use_defaults") - f_variable_set_defaults ;; - esac - done - - # Restore old VAR_NONINTERACTIVE if needed. - [ "$old_interactive" ] && - setvar $VAR_NONINTERACTIVE "$old_interactive" - - return $SUCCESS -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/options.subr - -fi # ! $_MEDIA_OPTIONS_SUBR diff --git a/bsdconfig/share/media/tcpip.subr b/bsdconfig/share/media/tcpip.subr deleted file mode 100644 index d149bc6036d1..000000000000 --- a/bsdconfig/share/media/tcpip.subr +++ /dev/null @@ -1,1713 +0,0 @@ -if [ ! "$_MEDIA_TCPIP_SUBR" ]; then _MEDIA_TCPIP_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/tcpip.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/strings.subr -f_include $BSDCFG_SHARE/struct.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -TCP_HELPFILE=$BSDCFG_LIBE/include/tcp.hlp -NETWORK_DEVICE_HELPFILE=$BSDCFG_LIBE/include/network_device.hlp - -############################################################ GLOBALS - -# -# Path to resolv.conf(5). -# -: ${RESOLV_CONF:="/etc/resolv.conf"} - -# -# Path to nsswitch.conf(5). -# -: ${NSSWITCH_CONF:="/etc/nsswitch.conf"} - -# -# Path to hosts(5) -# -: ${ETC_HOSTS:="/etc/hosts"} - -# -# Structure of dhclient.leases(5) lease { ... } entry -# -f_struct_define DHCP_LEASE \ - interface \ - fixed_address \ - filename \ - server_name \ - script \ - medium \ - host_name \ - subnet_mask \ - routers \ - domain_name_servers \ - domain_name \ - broadcast_address \ - dhcp_lease_time \ - dhcp_message_type \ - dhcp_server_identifier \ - dhcp_renewal_time \ - dhcp_rebinding_time \ - renew \ - rebind \ - expire - -############################################################ FUNCTIONS - -# f_validate_hostname $hostname -# -# Returns zero if the given argument (a fully-qualified hostname) is compliant -# with standards set-forth in RFC's 952 and 1123 of the Network Working Group: -# -# RFC 952 - DoD Internet host table specification -# http://tools.ietf.org/html/rfc952 -# -# RFC 1123 - Requirements for Internet Hosts - Application and Support -# http://tools.ietf.org/html/rfc1123 -# -# See http://en.wikipedia.org/wiki/Hostname for a brief overview. -# -# The return status for invalid hostnames is one of: -# 255 Entire hostname exceeds the maximum length of 255 characters. -# 63 One or more individual labels within the hostname (separated by -# dots) exceeds the maximum of 63 characters. -# 1 One or more individual labels within the hostname contains one -# or more invalid characters. -# 2 One or more individual labels within the hostname starts or -# ends with a hyphen (hyphens are allowed, but a label cannot -# begin or end with a hyphen). -# 3 One or more individual labels within the hostname are null. -# -# To call this function and display an appropriate error message to the user -# based on the above error codes, use the following function defined in -# dialog.subr: -# -# f_dialog_validate_hostname $hostname -# -f_validate_hostname() -{ - local fqhn="$1" - - # Return error if the hostname exceeds 255 characters - [ ${#fqhn} -gt 255 ] && return 255 - - local IFS="." # Split on `dot' - for label in $fqhn; do - # Return error if the label exceeds 63 characters - [ ${#label} -gt 63 ] && return 63 - - # Return error if the label is null - [ "$label" ] || return 3 - - # Return error if label begins/ends with dash - case "$label" in -*|*-) return 2; esac - - # Return error if the label contains any invalid chars - case "$label" in *[!0-9a-zA-Z-]*) return 1; esac - done - - return $SUCCESS -} - -# f_inet_atoi $ipv4_address [$var_to_set] -# -# Convert an IPv4 address or mask from dotted-quad notation (e.g., `127.0.0.1' -# or `255.255.255.0') to a 32-bit unsigned integer for the purpose of network -# and broadcast calculations. For example, one can validate that two addresses -# are on the same network: -# -# f_inet_atoi 1.2.3.4 ip1num -# f_inet_atoi 1.2.4.5 ip2num -# f_inet_atoi 255.255.0.0 masknum -# if [ $(( $ip1num & $masknum )) -eq \ -# $(( $ip2num & $masknum )) ] -# then -# : IP addresses are on same network -# fi -# -# See f_validate_ipaddr() below for an additional example usage, on calculating -# network and broadcast addresses. -# -# If $var_to_set is missing or NULL, the converted IP address is printed to -# standard output for capturing in a sub-shell (which is less-recommended -# because of performance degredation; for example, when called in a loop). -# -f_inet_atoi() -{ - local __addr="$1" __var_to_set="$2" __num=0 - if f_validate_ipaddr "$__addr"; then - local IFS=. - set -- $__addr - __num=$(( ($1 << 24) + ($2 << 16) + ($3 << 8) + $4 )) - fi - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" $__num - else - echo $__num - fi -} - -# f_validate_ipaddr $ipaddr [$netmask] -# -# Returns zero if the given argument (an IP address) is of the proper format. -# -# The return status for invalid IP address is one of: -# 1 One or more individual octets within the IP address (separated -# by dots) contains one or more invalid characters. -# 2 One or more individual octets within the IP address are null -# and/or missing. -# 3 One or more individual octets within the IP address exceeds the -# maximum of 255 (or 2^8, being an octet comprised of 8 bits). -# 4 The IP address has either too few or too many octets. -# -# If a netmask is provided, the IP address is checked further: -# -# 5 The IP address must not be the network or broadcast address. -# -f_validate_ipaddr() -{ - local ip="$1" mask="$2" - - # Track number of octets for error checking - local noctets=0 - - local oldIFS="$IFS" IFS="." # Split on `dot' - for octet in $ip; do - # Return error if the octet is null - [ "$octet" ] || return 2 - - # Return error if not a whole integer - f_isinteger "$octet" || return 1 - - # Return error if not a positive integer - [ $octet -ge 0 ] || return 1 - - # Return error if the octet exceeds 255 - [ $octet -gt 255 ] && return 3 - - noctets=$(( $noctets + 1 )) - done - IFS="$oldIFS" - - [ $noctets -eq 4 ] || return 4 - - # - # The IP address must not be network or broadcast address. - # - if [ "$mask" ]; then - local ipnum masknum netnum bcastnum - local max_addr=4294967295 # 255.255.255.255 - - f_inet_atoi $ip ipnum - f_inet_atoi $mask masknum - - netnum=$(( $ipnum & $masknum )) - bcastnum=$(( ($ipnum & $masknum)+$max_addr-$masknum )) - - if [ "$masknum" ] && - [ $ipnum -eq $netnum -o $ipnum -eq $bcastnum ] - then - return 5 - fi - fi - - return $SUCCESS -} - -# f_validate_ipaddr6 $ipv6_addr -# -# Returns zero if the given argument (an IPv6 address) is of the proper format. -# -# The return status for invalid IP address is one of: -# 1 One or more individual segments within the IP address -# (separated by colons) contains one or more invalid characters. -# Segments must contain only combinations of the characters 0-9, -# A-F, or a-f. -# 2 Too many/incorrect null segments. A single null segment is -# allowed within the IP address (separated by colons) but not -# allowed at the beginning or end (unless a double-null segment; -# i.e., "::*" or "*::"). -# 3 One or more individual segments within the IP address -# (separated by colons) exceeds the length of 4 hex-digits. -# 4 The IP address entered has either too few (less than 3), too -# many (more than 8), or not enough segments, separated by -# colons. -# 5* The IPv4 address at the end of the IPv6 address is invalid. -# * When there is an error with the dotted-quad IPv4 address at the -# end of the IPv6 address, the return value of 5 is OR'd with a -# bit-shifted (<< 4) return of f_validate_ipaddr. -# -f_validate_ipaddr6() -{ - local ip="${1%\%*}" # removing the interface specification if-present - - local IFS=":" # Split on `colon' - set -- $ip: - - # Return error if too many or too few segments - # Using 9 as max in case of leading or trailing null spanner - [ $# -gt 9 -o $# -lt 3 ] && return 4 - - local h="[0-9A-Fa-f]" - local nulls=0 nsegments=$# contains_ipv4_segment= - - while [ $# -gt 0 ]; do - - segment="${1%:}" - shift - - # - # Return error if this segment makes one null too-many. A - # single null segment is allowed anywhere in the middle as well - # as double null segments are allowed at the beginning or end - # (but not both). - # - if [ ! "$segment" ]; then - nulls=$(( $nulls + 1 )) - if [ $nulls -eq 3 ]; then - # Only valid syntax for 3 nulls is `::' - [ "$ip" = "::" ] || return 2 - elif [ $nulls -eq 2 ]; then - # Only valid if begins/ends with `::' - case "$ip" in - ::*|*::) : fall thru ;; - *) return 2 - esac - fi - continue - fi - - # - # Return error if not a valid hexadecimal short - # - case "$segment" in - $h|$h$h|$h$h$h|$h$h$h$h) - : valid segment of 1-4 hexadecimal digits - ;; - *[!0-9A-Fa-f]*) - # Segment contains at least one invalid char - - # Return error immediately if not last segment - [ $# -eq 0 ] || return 1 - - # Otherwise, check for legacy IPv4 notation - case "$segment" in - *[!0-9.]*) - # Segment contains at least one invalid - # character even for an IPv4 address - return 1 - esac - - # Return error if not enough segments - if [ $nulls -eq 0 ]; then - [ $nsegments -eq 7 ] || return 4 - fi - - contains_ipv4_segment=1 - - # Validate the IPv4 address - f_validate_ipaddr "$segment" || - return $(( 5 | $? << 4 )) - ;; - *) - # Segment characters are all valid but too many - return 3 - esac - - done - - if [ $nulls -eq 1 ]; then - # Single null segment cannot be at beginning/end - case "$ip" in - :*|*:) return 2 - esac - fi - - # - # A legacy IPv4 address can span the last two 16-bit segments, - # reducing the amount of maximum allowable segments by-one. - # - maxsegments=8 - if [ "$contains_ipv4_segment" ]; then - maxsegments=7 - fi - - case $nulls in - # Return error if missing segments with no null spanner - 0) [ $nsegments -eq $maxsegments ] || return 4 ;; - # Return error if null spanner with too many segments - 1) [ $nsegments -le $maxsegments ] || return 4 ;; - # Return error if leading/trailing `::' with too many segments - 2) [ $nsegments -le $(( $maxsegments + 1 )) ] || return 4 ;; - esac - - return $SUCCESS -} - -# f_validate_netmask $netmask -# -# Returns zero if the given argument (a subnet mask) is of the proper format. -# -# The return status for invalid netmask is one of: -# 1 One or more individual fields within the subnet mask (separated -# by dots) contains one or more invalid characters. -# 2 One or more individual fields within the subnet mask are null -# and/or missing. -# 3 One or more individual fields within the subnet mask exceeds -# the maximum of 255 (a full 8-bit register). -# 4 The subnet mask has either too few or too many fields. -# 5 One or more individual fields within the subnet mask is an -# invalid integer (only 0,128,192,224,240,248,252,254,255 are -# valid integers). -# -f_validate_netmask() -{ - local mask="$1" - - # Track number of fields for error checking - local nfields=0 - - local IFS="." # Split on `dot' - for field in $mask; do - # Return error if the field is null - [ "$field" ] || return 2 - - # Return error if not a whole positive integer - f_isinteger "$field" || return 1 - - # Return error if the field exceeds 255 - [ $field -gt 255 ] && return 3 - - # Return error if the field is an invalid integer - case "$field" in - 0|128|192|224|240|248|252|254|255) : ;; - *) return 5 ;; - esac - - nfields=$(( $nfields + 1 )) - done - - [ $nfields -eq 4 ] || return 4 -} - -# f_validate_gateway $gateway $ipaddr $netmask -# -# Validate an IPv4 default gateway (aka router) address for a given IP address -# making sure the two are in the same network (able to ``talk'' to each other). -# Returns success if $ipaddr and $gateway are in the same network given subnet -# mask $netmask. -# -f_validate_gateway() -{ - local gateway="$1" ipaddr="$2" netmask="$3" - local gwnum ipnum masknum - - f_validate_ipaddr "$gateway" "$netmask" || return $FAILURE - - f_inet_atoi "$netmask" masknum - f_inet_atoi "$ipaddr" ipnum - f_inet_atoi "$gateway" gwnum - - # Gateway must be within set of IPs reachable through interface - [ $(( $ipnum & $masknum )) -eq \ - $(( $gwnum & $masknum )) ] # Return status -} - -# f_dialog_validate_tcpip $hostname $gateway $nameserver $ipaddr $netmask -# -# Returns success if the arguments provided are valid for accessing a TCP/IP -# network, otherwise returns failure. -# -f_dialog_validate_tcpip() -{ - local hostname="$1" gateway="$2" nameserver="$3" - local ipaddr="$4" netmask="$5" - local ipnum masknum - - if [ ! "$hostname" ]; then - f_show_msg "$msg_must_specify_a_host_name_of_some_sort" - elif ! f_validate_hostname "$hostname"; then - f_show_msg "$msg_invalid_hostname_value" - elif [ "$netmask" ] && ! f_validate_netmask "$netmask"; then - f_show_msg "$msg_invalid_netmask_value" - elif [ "$nameserver" ] && - ! f_validate_ipaddr "$nameserver" && - ! f_validate_ipaddr6 "$nameserver"; then - f_show_msg "$msg_invalid_name_server_ip_address_specified" - elif [ "$ipaddr" ] && ! f_validate_ipaddr "$ipaddr" "$netmask"; then - f_show_msg "$msg_invalid_ipv4_address" - elif [ "$gateway" -a "$gateway" != "NO" ] && - ! f_validate_gateway "$gateway" "$ipaddr" "$netmask"; then - f_show_msg "$msg_invalid_gateway_ipv4_address_specified" - else - return $DIALOG_OK - fi - - return $DIALOG_CANCEL -} - -# f_ifconfig_inet $interface [$var_to_set] -# -# Returns the IPv4 address associated with $interface. If $var_to_set is -# missing or NULL, the IP address is printed to standard output for capturing -# in a sub-shell (which is less-recommended because of performance degredation; -# for example, when called in a loop). -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_ifconfig_inet_awk=' -BEGIN { found = 0 } -( $1 == "inet" ) \ -{ - print $2 - found = 1 - exit -} -END { exit ! found } -' -f_ifconfig_inet() -{ - local __interface="$1" __var_to_set="$2" - if [ "$__var_to_set" ]; then - local __ip - __ip=$( ifconfig "$__interface" 2> /dev/null | - awk "$f_ifconfig_inet_awk" ) - setvar "$__var_to_set" "$__ip" - else - ifconfig "$__interface" 2> /dev/null | - awk "$f_ifconfig_inet_awk" - fi -} - -# f_ifconfig_inet6 $interface [$var_to_set] -# -# Returns the IPv6 address associated with $interface. If $var_to_set is -# missing or NULL, the IP address is printed to standard output for capturing -# in a sub-shell (which is less-recommended because of performance degredation; -# for example, when called in a loop). -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_ifconfig_inet6_awk=' -BEGIN { found = 0 } -( $1 == "inet6" ) \ -{ - print $2 - found = 1 - exit -} -END { exit ! found } -' -f_ifconfig_inet6() -{ - local __interface="$1" __var_to_set="$2" - if [ "$__var_to_set" ]; then - local __ip6 - __ip6=$( ifconfig "$__interface" 2> /dev/null | - awk "$f_ifconfig_inet6_awk" ) - setvar "$__var_to_set" "$__ip6" - else - ifconfig "$__interface" 2> /dev/null | - awk "$f_ifconfig_inet6_awk" - fi -} - -# f_ifconfig_netmask $interface [$var_to_set] -# -# Returns the IPv4 subnet mask associated with $interface. If $var_to_set is -# missing or NULL, the netmask is printed to standard output for capturing in a -# sub-shell (which is less-recommended because of performance degredation; for -# example, when called in a loop). -# -f_ifconfig_netmask() -{ - local __interface="$1" __var_to_set="$2" __octets - __octets=$( ifconfig "$__interface" 2> /dev/null | awk \ - ' - BEGIN { found = 0 } - ( $1 == "inet" ) \ - { - printf "%s %s %s %s\n", - substr($4,3,2), - substr($4,5,2), - substr($4,7,2), - substr($4,9,2) - found = 1 - exit - } - END { exit ! found } - ' ) || return $FAILURE - - local __octet __netmask= - for __octet in $__octets; do - f_sprintf __netmask "%s.%u" "$__netmask" "0x$__octet" - done - __netmask="${__netmask#.}" - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__netmask" - else - echo $__netmask - fi -} - -# f_route_get_default [$var_to_set] -# -# Returns the IP address of the currently active default router. If $var_to_set -# is missing or NULL, the IP address is printed to standard output for -# capturing in a sub-shell (which is less-recommended because of performance -# degredation; for example, when called in a loop). -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_route_get_default_awk=' -BEGIN { found = 0 } -( $1 == "gateway:" ) \ -{ - print $2 - found = 1 - exit -} -END { exit ! found } -' -f_route_get_default() -{ - local __var_to_set="$1" - if [ "$__var_to_set" ]; then - local __ip - __ip=$( route -n get default 2> /dev/null | - awk "$f_route_get_default_awk" ) - setvar "$__var_to_set" "$__ip" - else - route -n get default 2> /dev/null | - awk "$f_route_get_default_awk" - fi -} - -# f_resolv_conf_nameservers [$var_to_set] -# -# Returns nameserver(s) configured in resolv.conf(5). If $var_to_set is missing -# or NULL, the list of nameservers is printed to standard output for capturing -# in a sub-shell (which is less-recommended because of performance degredation; -# for example, when called in a loop). -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_resolv_conf_nameservers_awk=' -BEGIN { found = 0 } -( $1 == "nameserver" ) \ -{ - print $2 - found = 1 -} -END { exit ! found } -' -f_resolv_conf_nameservers() -{ - local __var_to_set="$1" - if [ "$__var_to_set" ]; then - local __ns - __ns=$( awk "$f_resolv_conf_nameservers_awk" "$RESOLV_CONF" \ - 2> /dev/null ) - setvar "$__var_to_set" "$__ns" - else - awk "$f_resolv_conf_nameservers_awk" "$RESOLV_CONF" \ - 2> /dev/null - fi -} - -# f_config_resolv -# -# Attempts to configure resolv.conf(5) and ilk. Returns success if able to -# write the file(s), otherwise returns error status. -# -# Variables from variable.subr that are used in configuring resolv.conf(5) are -# as follows (all of which can be configured automatically through functions -# like f_dhcp_get_info() or manually): -# -# VAR_NAMESERVER -# The nameserver to add in resolv.conf(5). -# VAR_DOMAINNAME -# The domain to configure in resolv.conf(5). Also used in the -# configuration of hosts(5). -# VAR_IPADDR -# The IPv4 address to configure in hosts(5). -# VAR_IPV6ADDR -# The IPv6 address to configure in hosts(5). -# VAR_HOSTNAME -# The hostname to associate with the IPv4 and/or IPv6 address in -# hosts(5). -# -f_config_resolv() -{ - local cp c6p dp hp - - f_getvar $VAR_NAMESERVER cp - if [ "$cp" ]; then - case "$RESOLV_CONF" in - */*) f_quietly mkdir -p "${RESOLV_CONF%/*}" ;; - esac - - # Attempt to create/truncate the file - ( :> "$RESOLV_CONF" ) 2> /dev/null || return $FAILURE - - f_getvar $VAR_DOMAINNAME dp && - printf "domain\t%s\n" "$dp" >> "$RESOLV_CONF" - printf "nameserver\t%s\n" "$cp" >> "$RESOLV_CONF" - - f_dprintf "Wrote out %s" "$RESOLV_CONF" - fi - - f_getvar $VAR_DOMAINNAME dp - f_getvar $VAR_IPADDR cp - f_getvar $VAR_IPV6ADDR c6p - f_getvar $VAR_HOSTNAME hp - - # Attempt to create the file if it doesn't already exist - if [ ! -e "$ETC_HOSTS" ]; then - case "$ETC_HOSTS" in - */*) f_quietly mkdir -p "${ETC_HOSTS%/*}" ;; - esac - - ( :> "$ETC_HOSTS" ) 2> /dev/null || return $FAILURE - fi - - # Scan the file and add ourselves if not already configured - awk -v dn="$dp" -v ip4="$cp" -v ip6="$c6p" -v hn="$hp" ' - BEGIN { - local4found = local6found = 0 - hn4found = hn6found = h4found = h6found = 0 - h = ( match(hn, /\./) ? substr(hn, 0, RSTART-1) : "" ) - } - ($1 == "127.0.0.1") { local4found = 1 } - ($1 == "::1") { local6found = 1 } - { - for (n = 2; n <= NF; n++) - { - if ( $1 == ip4 ) { - if ( $n == h ) h4found = 1 - if ( $n == hn ) hn4found = 1 - if ( $n == hn "." ) hn4found = 1 - } - if ( $1 == ip6 ) { - if ( $n == h ) h6found = 1 - if ( $n == hn ) hn6found = 1 - if ( $n == hn "." ) hn6found = 1 - } - } - } - END { - hosts = FILENAME - - if ( ! local6found ) - printf "::1\t\t\tlocalhost%s\n", - ( dn ? " localhost." dn : "" ) >> hosts - if ( ! local4found ) - printf "127.0.0.1\t\tlocalhost%s\n", - ( dn ? " localhost." dn : "" ) >> hosts - - if ( ip6 && ! (h6found && hn6found)) - { - printf "%s\t%s %s\n", ip6, hn, h >> hosts - printf "%s\t%s.\n", ip6, hn >> hosts - } - else if ( ip6 ) - { - if ( ! h6found ) - printf "%s\t%s.\n", ip6, h >> hosts - if ( ! hn6found ) - printf "%s\t%s\n", ip6, hn >> hosts - } - - if ( ip4 && ! (h4found && hn4found)) - { - printf "%s\t\t%s %s\n", ip4, hn, h >> hosts - printf "%s\t\t%s.\n", ip4, hn >> hosts - } - else if ( ip4 ) - { - if ( ! h4found ) - printf "%s\t\t%s.\n", ip4, h >> hosts - if ( ! hn4found ) - printf "%s\t\t%s\n", ip4, hn >> hosts - } - } - ' "$ETC_HOSTS" 2> /dev/null || return $FAILURE - - f_dprintf "Wrote out %s" "$ETC_HOSTS" - return $SUCCESS -} - -# f_dhcp_parse_leases $leasefile struct_name -# -# Parse $leasefile and store the information for the most recent lease in a -# struct (see struct.subr for additional details) named `struct_name'. See -# DHCP_LEASE struct definition in the GLOBALS section above. -# -f_dhcp_parse_leases() -{ - local leasefile="$1" struct_name="$2" - - [ "$struct_name" ] || return $FAILURE - - if [ ! -e "$leasefile" ]; then - f_dprintf "%s: No such file or directory" "$leasefile" - return $FAILURE - fi - - f_struct "$struct_name" && f_struct_free "$struct_name" - f_struct_new DHCP_LEASE "$struct_name" - - eval "$( awk -v struct="$struct_name" ' - BEGIN { - lease_found = 0 - keyword_list = " \ - interface \ - fixed-address \ - filename \ - server-name \ - script \ - medium \ - " - split(keyword_list, keywords, FS) - - time_list = "renew rebind expire" - split(time_list, times, FS) - - option_list = " \ - host-name \ - subnet-mask \ - routers \ - domain-name-servers \ - domain-name \ - broadcast-address \ - dhcp-lease-time \ - dhcp-message-type \ - dhcp-server-identifier \ - dhcp-renewal-time \ - dhcp-rebinding-time \ - " - split(option_list, options, FS) - } - function set_value(prop,value) - { - lease_found = 1 - gsub(/[^[:alnum:]_]/, "_", prop) - sub(/;$/, "", value) - sub(/^"/, "", value) - sub(/"$/, "", value) - sub(/,.*/, "", value) - printf "%s set %s \"%s\"\n", struct, prop, value - } - /^lease {$/, /^}$/ \ - { - if ( $0 ~ /^lease {$/ ) next - if ( $0 ~ /^}$/ ) exit - - for (k in keywords) - { - keyword = keywords[k] - if ( $1 == keyword ) - { - set_value(keyword, $2) - next - } - } - - for (t in times) - { - time = times[t] - if ( $1 == time ) - { - set_value(time, $2 " " $3 " " $4) - next - } - } - - if ( $1 != "option" ) next - for (o in options) - { - option = options[o] - if ( $2 == option ) - { - set_value(option, $3) - next - } - } - } - EXIT { - if ( ! lease_found ) - { - printf "f_struct_free \"%s\"\n", struct - print "return $FAILURE" - } - } - ' "$leasefile" )" -} - -# f_dhcp_get_info $interface -# -# Parse the dhclient(8) lease database for $interface to obtain all the -# necessary IPv4 details necessary to communicate on the network. The retrieved -# information is stored in VAR_IPADDR, VAR_NETMASK, VAR_GATEWAY, and -# VAR_NAMESERVER. -# -# If reading the lease database fails, values are obtained from ifconfig(8) and -# route(8). If the DHCP lease did not provide a nameserver (or likewise, we -# were unable to parse the lease database), fall-back to resolv.conf(5) for -# obtaining the nameserver. Always returns success. -# -f_dhcp_get_info() -{ - local interface="$1" cp - local leasefile="/var/db/dhclient.leases.$interface" - - # If it fails, do it the old-fashioned way - if f_dhcp_parse_leases "$leasefile" lease; then - lease get fixed_address $VAR_IPADDR - lease get subnet_mask $VAR_NETMASK - lease get routers cp - setvar $VAR_GATEWAY "${cp%%,*}" - lease get domain_name_servers cp - setvar $VAR_NAMESERVER "${cp%%,*}" - lease get host_name cp && - setvar $VAR_HOSTNAME "$cp" - f_struct_free lease - else - # Bah, now we have to get the information from ifconfig - if f_debugging; then - f_dprintf "DHCP configured interface returns %s" \ - "$( ifconfig "$interface" )" - fi - f_ifconfig_inet "$interface" $VAR_IPADDR - f_ifconfig_netmask "$interface" $VAR_NETMASK - f_route_get_default $VAR_GATEWAY - fi - - # If we didn't get a name server value, hunt for it in resolv.conf - local ns - if [ -r "$RESOLV_CONF" ] && ! { - f_getvar $VAR_NAMESERVER ns || [ "$ns" ] - }; then - f_resolv_conf_nameservers cp && - setvar $VAR_NAMESERVER ${cp%%[$IFS]*} - fi - - return $SUCCESS -} - -# f_rtsol_get_info $interface -# -# Returns the rtsol-provided IPv6 address associated with $interface. The -# retrieved IP address is stored in VAR_IPV6ADDR. Always returns success. -# -f_rtsol_get_info() -{ - local interface="$1" cp - cp=$( ifconfig "$interface" 2> /dev/null | awk \ - ' - BEGIN { found = 0 } - ( $1 == "inet6" ) && ( $2 ~ /^fe80:/ ) \ - { - print $2 - found = 1 - exit - } - END { exit ! found } - ' ) && setvar $VAR_IPV6ADDR "$cp" -} - -# f_host_lookup $host [$var_to_set] -# -# Use host(1) to lookup (or reverse) an Internet number from (or to) a name. -# Multiple answers are returned separated by a single space. If host(1) does -# not exit cleanly, its full output is provided and the return status is 1. -# -# If nsswitch.conf(5) has been configured to query local access first for the -# `hosts' database, we'll manually check hosts(5) first (preventing host(1) -# from hanging in the event that DNS goes awry). -# -# If $var_to_set is missing or NULL, the list of IP addresses is printed to -# standard output for capturing in a sub-shell (which is less-recommended -# because of performance degredation; for example, when called in a loop). -# -# The variables from variable.subr used in looking up the host are as follows -# (which are set manually): -# -# VAR_IPV6_ENABLE [Optional] -# If set to "YES", enables the lookup of IPv6 addresses and IPv4 -# address. IPv6 addresses, if any, will come before IPv4. Note -# that if nsswitch.conf(5) shows an affinity for "files" for the -# "host" database and there is a valid entry in hosts(5) for -# $host, this setting currently has no effect (an IPv4 address -# can supersede an IPv6 address). By design, hosts(5) overrides -# any preferential treatment. Otherwise, if this variable is not -# set, IPv6 addresses will not be used (IPv4 addresses will -# specifically be requested from DNS). -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_host_lookup_awk=' -BEGIN{ addrs = "" } -!/^[[:space:]]*(#|$)/ \ -{ - for (n=1; n++ < NF;) if ($n == name) - addrs = addrs (addrs ? " " : "") $1 -} -END { - if (addrs) print addrs - exit !addrs -} -' -f_host_lookup() -{ - local __host="$1" __var_to_set="$2" - f_dprintf "f_host_lookup: host=[%s]" "$__host" - - # If we're configured to look at local files first, do that - if awk '/^hosts:/{exit !($2=="files")}' "$NSSWITCH_CONF"; then - if [ "$__var_to_set" ]; then - local __cp - if __cp=$( awk -v name="$__host" \ - "$f_host_lookup_awk" "$ETC_HOSTS" ) - then - setvar "$__var_to_set" "$__cp" - return $SUCCESS - fi - else - awk -v name="$__host" \ - "$f_host_lookup_awk" "$ETC_HOSTS" && - return $SUCCESS - fi - fi - - # - # Fall back to host(1) -- which is further governed by nsswitch.conf(5) - # - - local __output __ip6 __addrs= - f_getvar $VAR_IPV6_ENABLE __ip6 - - # If we have a TCP media type configured, check for an SRV record - local __srvtypes= - { f_quietly f_getvar $VAR_HTTP_PATH || - f_quietly f_getvar $VAR_HTTP_PROXY_PATH - } && __srvtypes="$__srvtypes _http._tcp" - f_quietly f_getvar $VAR_FTP_PATH && __srvtypes="$__srvtypes _ftp._tcp" - f_quietly f_getvar $VAR_NFS_PATH && - __srvtypes="$__srvtypes _nfs._tcp _nfs._udp" - - # Calculate wait time as dividend of total time and host(1) invocations - local __host_runs __wait - f_count __host_runs $__srvtypes - if [ "$__ip6" = "YES" ]; then - __host_runs=$(( $__host_runs + 2 )) - else - __host_runs=$(( $__host_runs + 1 )) - fi - f_getvar $VAR_MEDIA_TIMEOUT __wait - [ "$__wait" ] && __wait="-W $(( $__wait / $__host_runs ))" - - # Query SRV types first (1st host response taken as new host to query) - for __type in $__srvtypes; do - if __output=$( - host -t SRV $__wait -- "$__type.$__host" \ - 2> /dev/null - ); then - __host=$( echo "$__output" | - awk '/ SRV /{print $NF;exit}' ) - break - fi - done - - # Try IPv6 first (if enabled) - if [ "$__ip6" = "YES" ]; then - if ! __output=$( host -t AAAA $__wait -- "$__host" 2>&1 ); then - # An error occurred, display in-full and return error - [ "$__var_to_set" ] && - setvar "$__var_to_set" "$__output" - return $FAILURE - fi - # Add the IPv6 addresses and fall-through to collect IPv4 too - __addrs=$( echo "$__output" | awk '/ address /{print $NF}' ) - fi - - # Good ol' IPv4 - if ! __output=$( host -t A $__wait -- "$__host" 2>&1 ); then - # An error occurred, display it in-full and return error - [ "$__var_to_set" ] && setvar "$__var_to_set" "$__output" - return $FAILURE - fi - - __addrs="$__addrs${__addrs:+ }$( - echo "$__output" | awk '/ address /{print $NF}' )" - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__addrs" - else - echo $__addrs - fi -} - -# f_device_dialog_tcp $device -# -# This is it - how to get TCP setup values. Prompt the user to edit/confirm the -# interface, gateway, nameserver, and hostname settings -- all required for -# general TCP/IP access. -# -# Variables from variable.subr that can be used to sript user input: -# -# VAR_NO_INET6 -# If set, prevents asking the user if they would like to use -# rtsol(8) to check for an IPv6 router. -# VAR_TRY_RTSOL -# If set to "YES" (and VAR_NONINTERACTIVE is unset), asks the -# user if they would like to try the IPv6 RouTer SOLicitation -# utility (rtsol(8)) to get IPv6 information. Ignored if -# VAR_NO_INET6 is set. -# VAR_TRY_DHCP -# If set to "YES" (and VAR_NONINTERACTIVE is unset), asks the -# user if they would like to try to acquire IPv4 connection -# settings from a DHCP server using dhclient(8). -# -# VAR_GATEWAY Default gateway to use. -# VAR_IPADDR Interface address to assign. -# VAR_NETMASK Interface subnet mask. -# VAR_EXTRAS Extra interface options to ifconfig(8). -# VAR_HOSTNAME Hostname to set. -# VAR_DOMAINNAME Domain name to use. -# VAR_NAMESERVER DNS nameserver to use when making lookups. -# VAR_IPV6ADDR IPv6 interface address. -# -# In addition, the following variables are used in acquiring network settings -# from the user: -# -# VAR_NONINTERACTIVE -# If set (such as when running in a script), prevents asking the -# user questions or displaying the usual prompts, etc. -# VAR_NETINTERACTIVE -# The one exception to VAR_NONINTERACTIVE is VAR_NETINTERACTIVE, -# which if set will prompt the user to try RTSOL (unless -# VAR_TRY_RTSOL has been set), try DHCP (unless VAR_TRY_DHCP has -# been set), and display the network verification dialog. This -# allows you to have a mostly non-interactive script that still -# prompts for network setup/confirmation. -# -# After successful execution, the following variables are set: -# -# VAR_IFCONFIG + $device (e.g., `ifconfig_em0') -# Defines the ifconfig(8) properties specific to $device. -# -f_device_dialog_tcp() -{ - local dev="$1" devname cp n - local use_dhcp="" use_rtsol="" - local _ipaddr _netmask _extras - - [ "$dev" ] || return $DIALOG_CANCEL - f_struct "$dev" get name devname || return $DIALOG_CANCEL - - # Initialize vars from previous device values - local private - $dev get private private - if [ "$private" ] && f_struct "$private"; then - $private get ipaddr _ipaddr - $private get netmask _netmask - $private get extras _extras - $private get use_dhcp use_dhcp - $private get use_rtsol use_rtsol - else # See if there are any defaults - - # - # This is a hack so that the dialogs below are interactive in a - # script if we have requested interactive behavior. - # - local old_interactive= - if ! f_interactive && f_netinteractive; then - f_getvar $VAR_NONINTERACTIVE old_interactive - unset $VAR_NONINTERACTIVE - fi - - # - # Try a RTSOL scan if such behavior is desired. - # If the variable was configured and is YES, do it. - # If it was configured to anything else, treat it as NO. - # Otherwise, ask the question interactively. - # - local try6 - if ! f_isset $VAR_NO_INET6 && { - { f_getvar $VAR_TRY_RTSOL try6 && [ "$try6" = "YES" ]; } || - { - # Only prompt the user when VAR_TRY_RTSOL is unset - ! f_isset $VAR_TRY_RTSOL && - f_dialog_noyes "$msg_try_ipv6_configuration" - } - }; then - local i - - f_quietly sysctl net.inet6.ip6.forwarding=0 - f_quietly sysctl net.inet6.ip6.accept_rtadv=1 - f_quietly ifconfig $devname up - - i=$( sysctl -n net.inet6.ip6.dad_count ) - sleep $(( $i + 1 )) - - f_quietly mkdir -p /var/run - f_dialog_info "$msg_scanning_for_ra_servers" - if f_quietly rtsol $devname; then - i=$( sysctl -n net.inet6.ip6.dad_count ) - sleep $(( $i + 1 )) - f_rtsol_get_info $devname - use_rtsol=1 - else - use_rtsol= - fi - fi - - # - # Try a DHCP scan if such behavior is desired. - # If the variable was configured and is YES, do it. - # If it was configured to anything else, treat it as NO. - # Otherwise, ask the question interactively. - # - local try4 - if { f_getvar $VAR_TRY_DHCP try4 && [ "$try4" = "YES" ]; } || { - # Only prompt the user when VAR_TRY_DHCP is unset - ! f_isset $VAR_TRY_DHCP && - f_dialog_noyes "$msg_try_dhcp_configuration" - }; then - f_quietly ifconfig $devname delete - f_quietly mkdir -p /var/db - f_quietly mkdir -p /var/run - f_quietly mkdir -p /tmp - - local msg="$msg_scanning_for_dhcp_servers" - trap - SIGINT - ( # Execute in sub-shell to allow/catch Ctrl-C - trap 'exit $FAILURE' SIGINT - if [ "$USE_XDIALOG" ]; then - f_quietly dhclient $devname | - f_xdialog_info "$msg" - else - f_dialog_info "$msg" - f_quietly dhclient $devname - fi - ) - local retval=$? - trap 'f_interrupt' SIGINT - if [ $retval -eq $SUCCESS ]; then - f_dhcp_get_info $devname - use_dhcp=1 - else - use_dhcp= - fi - fi - - # Restore old VAR_NONINTERACTIVE if needed. - [ "$old_interactive" ] && - setvar $VAR_NONINTERACTIVE "$old_interactive" - - # Special hack so it doesn't show up oddly in the menu - local gw - if f_getvar $VAR_GATEWAY gw && [ "$gw" = "NO" ]; then - setvar $VAR_GATEWAY "" - fi - - # Get old IP address from variable space, if available - if [ ! "$_ipaddr" ]; then - if f_getvar $VAR_IPADDR cp; then - _ipaddr="$cp" - elif f_getvar ${devname}_$VAR_IPADDR cp; then - _ipaddr="$cp" - fi - fi - - # Get old netmask from variable space, if available - if [ ! "$_netmask" ]; then - if f_getvar $VAR_NETMASK cp; then - _netmask="$cp" - elif f_getvar ${devname}_$VAR_NETMASK cp; then - _netmask="$cp" - fi - fi - - # Get old extras string from variable space, if available - if [ ! "$_extras" ]; then - if f_getvar $VAR_EXTRAS cp; then - _extras="$cp" - elif f_getvar ${devname}_$VAR_EXTRAS cp; then - _extras="$cp" - fi - fi - fi - - # Look up values already recorded with the system, or blank the string - # variables ready to accept some new data - local _hostname _gateway _nameserver - f_getvar $VAR_HOSTNAME _hostname - case "$_hostname" in - *.*) : do nothing ;; # Already fully-qualified - *) - f_getvar $VAR_DOMAINNAME cp - [ "$cp" ] && _hostname="$_hostname.$cp" - esac - f_getvar $VAR_GATEWAY _gateway - f_getvar $VAR_NAMESERVER _nameserver - - # Re-check variables for initial inheritance before heading into dialog - [ "$_hostname" ] || _hostname="${HOSTNAME:-$( hostname )}" - [ "$_gateway" ] || f_route_get_default _gateway - [ ! "$_nameserver" ] && - f_resolv_conf_nameservers cp && _nameserver=${cp%%[$IFS]*} - [ "$_ipaddr" ] || f_ifconfig_inet $devname _ipaddr - [ "$_netmask" ] || f_ifconfig_netmask $devname _netmask - - # If non-interactive, jump over dialog section and into config section - if f_netinteractive || f_interactive || [ ! "$_hostname" ] - then - [ ! "$_hostname" ] && f_interactive && - f_show_msg "$msg_hostname_variable_not_set" - - local title=" $msg_network_configuration " - local hline="$hline_alnum_arrows_punc_tab_enter" - local extras_help="$tcplayout_extras_help" - - # Modify the help line for PLIP config - [ "${devname#plip}" != "$devname" ] && - extras_help="$tcplayout_extras_help_for_plip" - - f_getvar $VAR_IPV6ADDR cp && [ "$cp" ] && - title="$title($msg_ipv6_ready) " - - if [ ! "$USE_XDIALOG" ]; then - local prompt="$msg_dialog_mixedform_navigation_help" - # Calculate center position for displaying device label - local devlabel="$msg_configuration_for_interface" - devlabel="$devlabel $devname" - local width=54 - local n=$(( $width/2 - (${#devlabel} + 4)/2 - 2 )) - - while :; do - cp=$( $DIALOG \ - --title "$title" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ - --item-help \ - --ok-label "$msg_ok" \ - --cancel-label "$msg_cancel" \ - --help-button \ - --help-label "$msg_help" \ - --mixedform "$prompt" 16 $width 9 \ - "$msg_host_name_including_domain:" 1 2 \ - "$_hostname" 2 3 45 255 0 \ - "$tcplayout_hostname_help" \ - "$msg_ipv4_gateway:" 3 2 \ - "$_gateway" 4 3 16 15 0 \ - "$tcplayout_gateway_help" \ - "$msg_name_server:" 3 31 \ - "$_nameserver" 4 32 16 15 0 \ - "$tcplayout_nameserver_help" \ - "- $devlabel -" 5 $n "" 0 0 0 0 3 "" \ - "$msg_ipv4_address:" 6 6 \ - "$_ipaddr" 7 7 16 15 0 \ - "$tcplayout_ipaddr_help" \ - "$msg_netmask:" 6 31 \ - "$_netmask" 7 32 16 15 0 \ - "$tcplayout_netmask_help" \ - "$msg_extra_options_to_ifconfig" 8 6 \ - "$_extras" 9 7 41 2048 0 \ - "$extras_help" \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) - - # --mixed-form always returns 0, we have to - # use the returned data to determine button - if [ ! "$cp" ]; then - # User either chose "Cancel", pressed - # ESC, or blanked every form field - return $DIALOG_CANCEL - else - n=$( echo "$cp" | f_number_of_lines ) - [ $n -eq 1 ] && case "$cp" in HELP*) - # User chose "Help" - f_show_help "$TCP_HELPFILE" - continue - esac - fi - - # Turn mixed-form results into env variables - eval "$( echo "$cp" | awk ' - BEGIN { - n = 0 - field[++n] = "_hostname" - field[++n] = "_gateway" - field[++n] = "_nameserver" - field[++n] = "_ipaddr" - field[++n] = "_netmask" - field[++n] = "_extras" - nfields = n - n = 0 - } - { - gsub(/'\''/, "'\'\\\\\'\''") - sub(/[[:space:]]*$/, "") - value[field[++n]] = $0 - } - END { - for ( n = 1; n <= nfields; n++ ) - { - printf "%s='\''%s'\'';\n", - field[n], - value[field[n]] - } - }' )" - - f_dialog_validate_tcpip \ - "$_hostname" \ - "$_gateway" \ - "$_nameserver" \ - "$_ipaddr" \ - "$_netmask" \ - && break - done - else - # Xdialog(1) does not support --mixed-form - # Create a persistent menu instead - - f_dialog_title "$msg_network_configuration" - local prompt= - - while :; do - cp=$( $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ - --item-help \ - --ok-label "$msg_ok" \ - --cancel-label "$msg_cancel" \ - --help "" \ - --menu "$prompt" 21 60 8 \ - "$msg_accept_continue" "" \ - "$tcplayout_accept_cont_help" \ - "$msg_host_name_including_domain:" \ - "$_hostname" \ - "$tcplayout_hostname_help" \ - "$msg_ipv4_gateway:" "$_gateway" \ - "$tcplayout_gateway_help" \ - "$msg_name_server:" "$_nameserver" \ - "$tcplayout_nameserver_help" \ - "$msg_ipv4_address:" "$_ipaddr" \ - "$tcplayout_ipaddr_help" \ - "$msg_netmask:" "$_netmask" \ - "$tcplayout_netmask_help" \ - "$msg_extra_options_to_ifconfig" \ - "$_extras" "$extras_help" \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) - local retval=$? - f_dialog_data_sanitize cp - f_dprintf "retval=%u mtag=[%s]" $retval "$cp" - - if [ $retval -eq $DIALOG_HELP ]; then - f_show_help "$TCP_HELPFILE" - continue - elif [ $retval -ne $DIALOG_OK ]; then - f_dialog_title_restore - return $DIALOG_CANCEL - fi - - case "$cp" in - "$msg_accept_continue") - f_dialog_validate_tcpip \ - "$_hostname" \ - "$_gateway" \ - "$_nameserver" \ - "$_ipaddr" \ - "$_netmask" \ - && break ;; - "$msg_host_name_including_domain:") - f_dialog_input cp "$cp" "$_hostname" \ - && _hostname="$cp" ;; - "$msg_ipv4_gateway:") - f_dialog_input cp "$cp" "$_gateway" \ - && _gateway="$cp" ;; - "$msg_name_server:") - f_dialog_input cp "$cp" "$_nameserver" \ - && _nameserver="$cp" ;; - "$msg_ipv4_address:") - f_dialog_input cp "$cp" "$_ipaddr" \ - && _ipaddr="$cp" ;; - "$msg_netmask:") - f_dialog_input cp "$cp" "$_netmask" \ - && _netmask="$cp" ;; - "$msg_extra_options_to_ifconfig") - f_dialog_input cp "$cp" "$_extras" \ - && _extras="$cp" ;; - esac - done - - f_dialog_title_restore - - fi # XDIALOG - - fi # interactive - - # We actually need to inform the rest of bsdconfig about this - # data now if the user hasn't selected cancel. - - if [ "$_hostname" ]; then - setvar $VAR_HOSTNAME "$_hostname" - f_quietly hostname "$_hostname" - case "$_hostname" in - *.*) setvar $VAR_DOMAINNAME "${_hostname#*.}" ;; - esac - fi - [ "$_gateway" ] && setvar $VAR_GATEWAY "$_gateway" - [ "$_nameserver" ] && setvar $VAR_NAMESERVER "$_nameserver" - [ "$_ipaddr" ] && setvar $VAR_IPADDR "$_ipaddr" - [ "$_netmask" ] && setvar $VAR_NETMASK "$_netmask" - [ "$_extras" ] && setvar $VAR_EXTRAS "$_extras" - - f_dprintf "Creating struct DEVICE_INFO devinfo_%s" "$dev" - f_struct_new DEVICE_INFO devinfo_$dev - $dev set private devinfo_$dev - - devinfo_$dev set ipaddr $_ipaddr - devinfo_$dev set netmask $_netmask - devinfo_$dev set extras $_extras - devinfo_$dev set use_rtsol $use_rtsol - devinfo_$dev set use_dhcp $use_dhcp - - if [ "$use_dhcp" -o "$_ipaddr" ]; then - if [ "$use_dhcp" ]; then - cp="DHCP${extras:+ $extras}" - else - cp="inet $_ipaddr netmask $_netmask${extras:+ $extras}" - fi - setvar $VAR_IFCONFIG$devname "$cp" - fi - [ "$use_rtsol" ] && - setvar $VAR_IPV6_ENABLE "YES" - - [ "$use_dhcp" ] || - f_config_resolv # XXX this will do it on the MFS copy - - return $DIALOG_OK -} - -# f_device_scan_tcp [$var_to_set] -# -# Scan for the first active/configured TCP/IP device. The name of the interface -# is printed to stderr like other dialog(1)-based functions (stdout is reserved -# for dialog(1) interaction) if $var_to_set is missing or NULL. Returns failure -# if no active/configured interface -# -f_device_scan_tcp() -{ - local __var_to_set="$1" __iface - for __iface in $( ifconfig -l ); do - if ifconfig $__iface | awk ' - BEGIN { - has_inet = has_inet6 = is_ethernet = 0 - is_usable = 1 - } - ( $1 == "status:" && $2 != "active" ) { is_usable = 0; exit } - ( $1 == "inet" ) { - if ($2 == "0.0.0.0") { is_usable = 0; exit } - has_inet++ - } - ( $1 == "inet6") { has_inet6++ } - ( $1 == "media:" ) { - if ($2 != "Ethernet") { is_usable = 0; exit } - is_ethernet = 1 - } - END { - if (!(is_ethernet && (has_inet || has_inet6))) - is_usable = 0 - exit ! is_usable - }'; then - f_interactive && - f_show_msg "$msg_using_interface" "$__iface" - f_dprintf "f_device_scan_tcp found %s" "$__iface" - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__iface" - else - echo "$__iface" >&2 - fi - return $SUCCESS - fi - done - - return $FAILURE -} - -# f_device_select_tcp -# -# Prompt the user to select network interface to use for TCP/IP access. -# Variables from variable.subr that can be used to script user input: -# -# VAR_NETWORK_DEVICE [Optional] -# Either a comma-separated list of network interfaces to try when -# setting up network access (e.g., "fxp0,em0") or "ANY" (case- -# sensitive) to indicate that the first active and configured -# interface is acceptable. If unset, the user is presented with a -# menu of all available network interfaces. -# -# Returns success if a valid network interface has been selected. -# -f_device_select_tcp() -{ - local devs dev cnt if network_dev - f_getvar $VAR_NETWORK_DEVICE network_dev - - f_dprintf "f_device_select_tcp: %s=[%s]" \ - VAR_NETWORK_DEVICE "$network_dev" - - if [ "$network_dev" ]; then - # - # This can be set to several types of values. If set to ANY, - # scan all network devices looking for a valid link, and go - # with the first device found. Can also be specified as a - # comma delimited list, with each network device tried in - # order. Can also be set to a single network device. - # - [ "$network_dev" = "ANY" ] && f_device_scan_tcp network_dev - - while [ "$network_dev" ]; do - case "$network_dev" in - *,*) if="${network_dev%%,*}" - network_dev="${network_dev#*,}" - ;; - *) if="$network_dev" - network_dev= - esac - - f_device_find -1 "$if" $DEVICE_TYPE_NETWORK dev - f_device_dialog_tcp $dev - if [ $? -eq $DIALOG_OK ]; then - setvar $VAR_NETWORK_DEVICE $if - return $DIALOG_OK - fi - done - - f_interactive && f_show_msg "$msg_no_network_devices" - return $DIALOG_CANCEL - - fi # $network_dev - - f_device_find "" $DEVICE_TYPE_NETWORK devs - f_count cnt $devs - dev="${devs%%[$IFS]*}" - $dev get name if - - f_quietly f_getvar NETWORK_CONFIGURED # for debugging info - if ! f_running_as_init && - ! [ "${NETWORK_CONFIGURED+set}" -a "$NETWORK_CONFIGURED" = "NO" ] - then - trap 'f_interrupt' SIGINT - if f_dialog_yesno "$msg_assume_network_is_already_configured" - then - setvar $VAR_NETWORK_DEVICE $if - return $DIALOG_OK - fi - fi - - local retval=$SUCCESS - if [ ${cnt:=0} -eq 0 ]; then - f_show_msg "$msg_no_network_devices" - retval=$DIALOG_CANCEL - elif [ $cnt -eq 1 ]; then - f_device_dialog_tcp $dev - retval=$? - [ $retval -eq $DIALOG_OK ] && setvar $VAR_NETWORK_DEVICE $if - else - local title="$msg_network_interface_information_required" - local prompt="$msg_please_select_ethernet_device_to_configure" - local hline="$hline_arrows_tab_enter" - - dev=$( f_device_menu \ - "$title" "$prompt" "$hline" $DEVICE_TYPE_NETWORK \ - "$NETWORK_DEVICE_HELPFILE" \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || - return $DIALOG_CANCEL - - f_device_dialog_tcp $dev - retval=$? - if [ $retval -eq $DIALOG_OK ]; then - f_struct_copy "$dev" device_network - setvar $VAR_NETWORK_DEVICE device_network - else - f_struct_free device_network - fi - fi - - return $retval -} - -# f_dialog_menu_select_tcp -# -# Like f_dialog_select_tcp() above, but do it from a menu that doesn't care -# about status. In other words, where f_dialog_select_tcp() will not display a -# menu if scripted, this function will always display the menu of available -# network interfaces. -# -f_dialog_menu_select_tcp() -{ - local private use_dhcp name - NETWORK_CONFIGURED=NO f_device_select_tcp - if f_struct device_network && - device_network get private private && - f_struct_copy "$private" di && - di get use_dhcp use_dhcp && - [ ! "$use_dhcp" ] && - device_network get name name && - f_yesno "$msg_would_you_like_to_bring_interface_up" "$name" - then - if ! f_device_init device_network; then - f_show_msg "$msg_initialization_of_device_failed" \ - "$name" - fi - fi - return $DIALOG_OK -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/tcpip.subr - -fi # ! $_MEDIA_TCPIP_SUBR diff --git a/bsdconfig/share/media/ufs.subr b/bsdconfig/share/media/ufs.subr deleted file mode 100644 index 27e2f275b182..000000000000 --- a/bsdconfig/share/media/ufs.subr +++ /dev/null @@ -1,198 +0,0 @@ -if [ ! "$_MEDIA_UFS_SUBR" ]; then _MEDIA_UFS_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/ufs.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/common.subr -f_include $BSDCFG_SHARE/struct.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -UFS_MOUNTED= - -############################################################ FUNCTIONS - -# f_media_set_ufs -# -# Return success if we both found and set the media type to be a UFS partition. -# Variables from variable.subr that can be used to script user input: -# -# VAR_UFS_PATH -# Path to a UFS character device node to be used with mount(8) in -# mounting a UFS formatted partition. Valid examples include: -# /dev/da0s1a -# /dev/ad4s1e -# However, other forms may be valid (see mount(8) for additional -# information). -# -f_media_set_ufs() -{ - local ufs - - f_media_close - - local devs ndevs - f_device_find "" $DEVICE_TYPE_UFS devs - f_count ndevs $devs - - if [ ${ndevs:=0} -eq 0 ]; then - f_variable_get_value $VAR_UFS_PATH \ - "$msg_enter_the_device_name_of_a_ufs_formatted_partition" - f_getvar $VAR_UFS_PATH ufs - [ "$ufs" ] || return $FAILURE - - local fstype - fstype=$( df -nT $ufs 2> /dev/null | - awk '!/Type/{print $2;exit}' ) - - f_struct_new DEVICE device_ufs - device_ufs set name ${fstype:-ufs} - device_ufs set devname "$ufs" - device_ufs set get f_media_get_ufs - device_ufs set init f_media_init_ufs - device_ufs set shutdown f_media_shutdown_ufs - device_ufs unset private - - f_struct_copy device_ufs device_media - f_struct_free device_ufs - elif [ $ndevs -eq 1 ]; then - f_struct_copy $devs device_media - else - local dev - local title="$msg_choose_a_ufs_partition" - local prompt="$msg_please_select_ufs_partition" - local hline="" - - dev=$( f_device_menu \ - "$title" "$prompt" "$hline" $DEVICE_TYPE_UFS \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || - return $FAILURE - - f_struct_copy "$dev" device_media - fi - - f_struct device_media || return $FAILURE -} - -# f_media_init_ufs $device -# -# Initializes the UFS media device. Returns success if able to mount the UFS -# partition device using mount(1). -# -f_media_init_ufs() -{ - local funcname=f_media_init_ufs - local dev="$1" devname err - - $dev get devname devname || return $FAILURE - f_dprintf "Init routine called for UFS device. devname=[%s]" \ - "$devname" - - if [ "$UFS_MOUNTED" ]; then - f_dprintf "UFS device already mounted." - return $SUCCESS - fi - - if [ ! -e "$devname" ]; then - f_show_msg "$msg_no_such_file_or_directory" \ - "f_media_init_ufs" "$devname" - return $FAILURE - fi - - if [ ! -e "$MOUNTPOINT" ]; then - f_eval_catch $funcname mkdir 'mkdir -p "%s"' "$MOUNTPOINT" || - return $FAILURE - fi - - if ! f_eval_catch -dk err $funcname mount \ - 'mount "%s" "%s"' "$devname" "$MOUNTPOINT" - then - err="${err#mount: }"; err="${err#$devname : }" - f_show_msg "$msg_error_mounting_device" \ - "$devname" "$MOUNTPOINT" "$err" - return $FAILURE - fi - UFS_MOUNTED=1 - return $SUCCESS -} - -# f_media_get_ufs $device $file [$probe_type] -# -# Returns data from $file on a mounted UFS partition device. Similar to cat(1). -# If $probe_type is present and non-NULL, returns success if $file exists. If -# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to -# standard-out. -# -f_media_get_ufs() -{ - local dev="$1" file="$2" probe_type="$3" - local name - - $dev get name name - f_dprintf "f_media_get_ufs: dev=[%s] file=[%s] probe_type=%s" \ - "$name" "$file" "$probe_type" - - f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" -} - -# f_media_shutdown_ufs $device -# -# Shuts down the UFS device using umount(8). Return status should be ignored. -# -f_media_shutdown_ufs() -{ - local funcname=f_media_shutdown_ufs - local dev="$1" err - - [ "$UFS_MOUNTED" ] || return $FAILURE - - if ! f_eval_catch -dk err $funcname umount \ - 'umount -f "%s"' "$MOUNTPOINT" - then - err="${err#umount: }"; err="${err#*: }" - f_show_msg "$msg_could_not_unmount_the_ufs_partition" \ - "$MOUNTPOINT" "$err" - else - UFS_MOUNTED= - fi -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/ufs.subr - -fi # ! $_MEDIA_UFS_SUBR diff --git a/bsdconfig/share/media/usb.subr b/bsdconfig/share/media/usb.subr deleted file mode 100644 index 5ee9bc043800..000000000000 --- a/bsdconfig/share/media/usb.subr +++ /dev/null @@ -1,176 +0,0 @@ -if [ ! "$_MEDIA_USB_SUBR" ]; then _MEDIA_USB_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/usb.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/media/common.subr -f_include $BSDCFG_SHARE/struct.subr -f_include $BSDCFG_SHARE/variable.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -USB_MOUNTED= - -############################################################ FUNCTIONS - -# f_media_set_usb -# -# Attempt to use USB as the media type. Return success if we both found and set -# the media type to be a USB drive. -# -f_media_set_usb() -{ - f_media_close - - local devs ndevs - f_device_find "" $DEVICE_TYPE_USB devs - f_count ndevs $devs - - if [ ${ndevs:=0} -eq 0 ]; then - f_show_msg "$msg_no_usb_devices_found" - return $FAILURE - elif [ $ndevs -eq 1 ]; then - f_struct_copy $devs device_media - else - local dev - local title="$msg_choose_a_usb_drive" - local prompt="$msg_please_select_a_usb_drive" - local hline= - - dev=$( f_device_menu \ - "$title" "$prompt" "$hline" $DEVICE_TYPE_USB \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD ) || - return $FAILURE - - f_struct_copy "$dev" device_media - fi - - f_struct device_media && - device_media unset private - - if f_interactive; then - local name - f_struct device_media get name name - f_show_msg "$msg_using_usb_device" "$name" - fi - - f_struct device_media || return $FAILURE -} - -# f_media_init_usb $device -# -# Initializes the USB media device. Returns success if able to mount the USB -# disk device using mount(8). -# -f_media_init_usb() -{ - local funcname=f_media_init_usb - local dev="$1" devname err - - $dev get devname devname || return $FAILURE - f_dprintf "Init routine called for USB device. devname=[%s]" \ - "$devname" - - if [ "$USB_MOUNTED" ]; then - f_dprintf "USB device already mounted." - return $SUCCESS - fi - - if [ ! -e "$MOUNTPOINT" ]; then - f_eval_catch $funcname mkdir 'mkdir -p "%s"' "$MOUNTPOINT" || - return $FAILURE - fi - - if f_eval_catch -dk err $funcname mount \ - 'mount "%s" "%s"' "$devname" "$MOUNTPOINT" - then - USB_MOUNTED=1 - return $SUCCESS - fi - - err="${err#mount: }"; err="${err#$devname: }" - f_show_msg "$msg_error_mounting_usb_drive" \ - "$devname" "$MOUNTPOINT" "$err" - return $FAILURE -} - -# f_media_get_usb $device $file [$probe_type] -# -# Returns data from $file on a mounted USB disk device. Similar to cat(1). If -# $probe_type is present and non-NULL, returns success if $file exists. If -# $probe_type is equal to $PROBE_SIZE, prints the size of $file in bytes to -# standard-out. -# -f_media_get_usb() -{ - local dev="$1" file="$2" probe_type="$3" - local name - - $dev get name name - f_dprintf "f_media_get_usb: dev=[%s] file=[%s] probe_type=%s" \ - "$name" "$file" "$probe_type" - - f_media_generic_get "$MOUNTPOINT" "$file" "$probe_type" -} - -# f_media_shutdown_usb $device -# -# Shuts down the USB disk device using umount(8). Return status should be -# ignored. -# -f_media_shutdown_usb() -{ - local funcname=f_media_shutdown_usb - local dev="$1" err - - [ "$USB_MOUNTED" ] || return $FAILURE - - if ! f_eval_catch -dk err $funcname umount \ - 'umount -f "%s"' "$MOUNTPOINT" - then - err="${err#umount: }"; err="${err#*: }" - f_show_msg "$msg_could_not_unmount_the_ufs_partition" \ - "$MOUNTPOINT" "$err" - else - USB_MOUNTED= - fi -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/usb.subr - -fi # ! $_MEDIA_USB_SUBR diff --git a/bsdconfig/share/media/wlan.subr b/bsdconfig/share/media/wlan.subr deleted file mode 100644 index f25cddff94cd..000000000000 --- a/bsdconfig/share/media/wlan.subr +++ /dev/null @@ -1,1392 +0,0 @@ -if [ ! "$_MEDIA_WLAN_SUBR" ]; then _MEDIA_WLAN_SUBR=1 -# -# Copyright (c) 2013-2016 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 (INCLUDING, 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_dprintf "%s: loading includes..." media/wlan.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/strings.subr -f_include $BSDCFG_SHARE/sysrc.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -NWIRELESS_CONFIGS=0 -NWSCAN_RESULTS=0 - -# -# Settings used while interacting with various dialog(1) menus -# -: ${DIALOG_MENU_WLAN_SCAN_DURATION:=5} -: ${DIALOG_MENU_WLAN_SHOW_ALL=} -: ${DIALOG_MENU_WLAN_SHOW_CONFIGURED=1} -: ${DIALOG_MENU_WLAN_SHOW_SCAN_RESULTS=1} - -# -# Structure to contain the wpa_supplicant.conf(5) default overrides -# -f_struct_define WPA_DEFAULTS \ - ap_scan \ - ctrl_interface \ - ctrl_interface_group \ - eapol_version \ - fast_reauth - -# -# Structure of wpa_supplicant.conf(5) network={ ... } entry -# -f_struct_define WPA_NETWORK \ - anonymous_identity \ - auth_alg \ - bssid \ - ca_cert \ - ca_cert2 \ - client_cert \ - client_cert2 \ - dh_file \ - dh_file2 \ - eap \ - eap_workaround \ - eapol_flags \ - eappsk \ - engine \ - engine_id \ - frequency \ - group \ - identity \ - key_id \ - key_mgmt \ - mixed_cell \ - mode \ - nai \ - pac_file \ - pairwise \ - password \ - pcsc \ - phase1 \ - phase2 \ - pin \ - priority \ - private_key \ - private_key2 \ - private_key2_passwd \ - private_key_passwd \ - proto \ - psk \ - scan_ssid \ - server_nai \ - ssid \ - subject_match \ - subject_match2 \ - wep_key0 \ - wep_key1 \ - wep_key2 \ - wep_key3 \ - wpa_ptk_rekey \ - wep_tx_keyidx - -# -# The following properties are ``Lists'' and as such should not be quoted. -# Everything else should be quoted. -# -WPA_NETWORK_LIST_PROPERTIES=" - auth_algo - eap - group - key_mgmt - pairwise - proto -" # END-QUOTE - -# -# Structure of wpa_cli(8) `scan_results' entry -# -f_struct_define WPA_SCAN_RESULT \ - bssid \ - flags \ - freq \ - siglev \ - ssid - -# -# Structure of a menu item in the wireless editor -# -f_struct_define WLAN_MENU_ITEM \ - letter \ - ssid \ - nconfigs \ - nfound \ - help - -############################################################ FUNCTIONS - -# f_wpa_supplicant_init $file -# -# Initialize $file with basic contents of new wpa_supplicant.conf(5). -# -f_wpa_supplicant_init() -{ - local funcname=f_wpa_supplicant_init - local conf_file="$1" tmpfile - - # Create a temporary file - f_eval_catch -k tmpfile $funcname mktemp 'mktemp -t "%s"' "$pgm" || - return $FAILURE - - # Make it unreadable by anyone but ourselves - f_eval_catch $funcname chmod \ - 'chmod 0600 "%s"' "$tmpfile" || return $FAILURE - - # Make it owned by root/wheel - f_eval_catch $funcname chown \ - 'chown 0:0 "%s"' "$tmpfile" || return $FAILURE - - # Populate it - cat <<-EOF >> "$tmpfile" - ctrl_interface=/var/run/wpa_supplicant - eapol_version=2 - ap_scan=1 - fast_reauth=1 - EOF - echo >> "$tmpfile" - - # Move it into place - f_eval_catch $funcname mv 'mv "%s" "%s"' "$tmpfile" "$conf_file" -} - -# f_wpa_supplicant_parse $file [struct_prefix [count_var]] -# -# Parse wpa_supplicant.conf(5) $file. Default overrides are stored in a struct -# (see struct.subr for additional details) named `{struct_prefix}defaults'. See -# WPA_DEFAULTS struct definition in the GLOBALS section above. -# -# In addition, for each one of the wireless networks we parse from $file, -# create a struct named `struct_prefixN' where `N' is a number starting from 1 -# and ending in $count_var (zero means no networks). See WPA_NETWORK struct -# definition in the GLOBALS section above. -# -# If a `blob-base64-*={ ... }' entry appears, a struct named -# `{struct_prefix}blob_base64_*' is created and the `data' property holds the -# base64 encoded binary data without whitespace. -# -# Custom `*={ ... }' definitions are also supported, but should be unique -# (unlike the `network' definition). A struct named `{struct_prefix}*' is -# created if at least one property is defined in the block. -# -f_wpa_supplicant_parse() -{ - local file="$1" struct_prefix="$2" count_var="$3" - - [ "$count_var" ] && setvar "$count_var" 0 - - [ "$file" ] || file=$( f_sysrc_get wpa_supplicant_conf_file ) - if [ ! -e "$file" ]; then - f_dprintf "%s: No such file or directory" "$file" - return $FAILURE - fi - - local list_properties - f_replaceall "$WPA_NETWORK_LIST_PROPERTIES" "$NL" "" list_properties - eval "$( awk \ - -v count_var="$count_var" \ - -v struct_prefix="$struct_prefix" \ - -v list_properties="$list_properties" ' - BEGIN { - if (!count_var && !struct_prefix) exit - blob = count = custom_struct = network = 0 - split(list_properties, lists, FS) - } - function set_value(struct, prop, value) - { - quoted = substr(value, 0, 1) == "\"" - for (l in lists) if (list = prop == lists[l]) break - # Remove data after whitespace if unquoted and not a list - if (!quoted && !list) sub("[[:space:]].*", "", value) - # Otherwise if quoted and not a list, remove the quotes - # NB: wep_keyN needs to retain quoting if/when present - else if (quoted && !list && prop !~ /^wep_key[[:digit:]]+/) { - sub("^\"", "", value) - sub("\".*", "", value) - } - gsub(/'\''/, "'\''\\'\'\''", value) # Sanitize the value - if (!created[struct]) { - print "debug= f_struct_free", struct - print "debug= f_struct_new WPA_NETWORK", struct - created[struct] = 1 - } - printf "debug= %s set %s '\'%s\''\n", struct, prop, value - } - { - if ($1 ~ /^network={/) { - empty = 1 # We do not increment count unless !empty - network = 1 - next - } else if (match($1, "^blob-base64-[[:alnum:]_./-]+={")) { - blob = 1 - blob_data = "" - struct = struct_prefix "blob_bas64_" - struct = struct substr($1, 13, RLENGTH - 14) - next - } else if (match($1, "^[[:alnum:]_./-]+={")) { - empty = 1 - custom_struct = 1 - struct = struct_prefix substr($1, 0, RLENGTH - 2) - gsub(/[^[:alnum:]_]/, "_", struct) - next - } else if ($1 ~ /^}/) { - if (blob) { - gsub("[[:space:]]", "", blob_data) - set_value(struct, "data", blob_data) - } - blob = custom_struct = network = 0 - next - } else if (!match($0, /^[[:space:]]*[[:alnum:]_]+=/)) - next - - if (blob) { - blob_data = blob_data $0 - next - } else if (network) { - if (empty) { count++; empty = 0 } - struct = struct_prefix count - } else if (!custom_struct) - struct = struct_prefix "defaults" - - if (!struct_prefix) next - - prop = substr($0, 0, RLENGTH - 1) - sub(/^[[:space:]]*/, "", prop) - value = substr($0, RSTART + RLENGTH) - - set_value(struct, prop, value) - } - END { if (count_var) print count_var "=" count }' "$file" )" -} - -# f_wpa_scan_results_parse [struct_prefix [count_var]] -# -# Parse the results of wpa_cli(8) `scan_results' into a series of structs (see -# struct.subr for additional details) named `struct_prefixN' where `N' is a -# number starting from 1 and ending in $count_var (zero means no results). See -# WPA_SCAN_RESULT struct definition in the GLOBALS section above. -# -f_wpa_scan_results_parse() -{ - local struct_prefix="$1" count_var="$2" - - [ "$count_var" ] && setvar "$count_var" 0 - - eval "$( wpa_cli scan_results 2> /dev/null | awk \ - -v count_var="$count_var" \ - -v struct_prefix="$struct_prefix" ' - BEGIN { - if (!count_var && !struct_prefix) exit - count = 0 - seg = "[[:xdigit:]][[:xdigit:]]" - bssid = seg":"seg":"seg":"seg":"seg":"seg - freq = siglev = flags = "[^[:space:]]+" - S = "[[:space:]]+" - line = bssid S freq S siglev S flags - line = "^[[:space:]]*" line "[[:space:]]*" - } - function set_value(struct, prop, value) - { - gsub(/'\''/, "'\''\\'\'\''", value) # Sanitize the value - if (!created[struct]) { - print "debug= f_struct_free", struct - print "debug= f_struct_new WPA_SCAN_RESULT", struct - created[struct] = 1 - } - printf "debug= %s set %s '\'%s\''\n", struct, prop, value - } - { - if (!match($0, line)) next - ssid = substr($0, RLENGTH + 1) - - count++ - if (!struct_prefix) next - - struct = struct_prefix count - set_value(struct, "ssid", ssid) - set_value(struct, "bssid", $1) - set_value(struct, "freq", $2) - set_value(struct, "siglev", $3) - set_value(struct, "flags", $4) - } - END { if (count_var) print count_var "=" count }' )" -} - -# f_wpa_scan_match_network WPA_SCAN_RESULT WPA_NETWORK -# -# Compares a WPA_SCAN_RESULT struct to a WPA_NETWORK struct. If they appear to -# be a match returns success, otherwise failure. -# -f_wpa_scan_match_network() -{ - local scan_struct="$1" wireless_struct="$2" - local cp debug= - - f_struct "$scan_struct" || return $FAILURE - f_struct "$wireless_struct" || return $FAILURE - - local scan_ssid scan_bssid - $scan_struct get ssid scan_ssid - $scan_struct get bssid scan_bssid - local wireless_ssid wireless_bssid - $wireless_struct get ssid wireless_ssid - $wireless_struct get bssid wireless_bssid - - local id_matched= - if [ "$wireless_ssid" -a "$wireless_bssid" ]; then - # Must match both SSID and BSSID - [ "$scan_ssid" = "$wireless_ssid" -a \ - "$scan_bssid" = "$wireless_bssid" ] && id_matched=1 - elif [ "$wireless_ssid" ]; then - # Must match SSID only - [ "$scan_ssid" = "$wireless_ssid" ] && id_matched=1 - elif [ "$wireless_bssid" ]; then - # Must match BSSID only - [ "$scan_bssid" = "$wireless_bssid" ] && id_matched=1 - fi - [ "$id_matched" ] || return $FAILURE - - - # - # Get the scanned flags for the next few comparisons - # - local flags - $scan_struct get flags flags - - # - # Compare configured key management against scanned network - # - if $wireless_struct get key_mgmt cp && [ "$cp" -a "$cp" != "NONE" ] - then - local mgmt mgmt_matched= - for mgmt in $cp; do - local mgmt2="$mgmt" - [ "$mgmt" != "${mgmt#WPA-}" ] && - mgmt2="WPA2${mgmt#WPA}" - case "$flags" in - "$mgmt"|"$mgmt"-*|*-"$mgmt"|*-"$mgmt"-*) - mgmt_matched=1 break ;; - "$mgmt2"|"$mgmt2"-*|*-"$mgmt2"|*-"$mgmt2"-*) - mgmt_matched=1 break ;; - esac - done - [ "$mgmt_matched" ] || return $FAILURE - fi - - local enc type flag - - # - # Compare configured encryption against scanned network - # - for enc in psk:PSK eap:EAP \ - wep_key0:WEP wep_key1:WEP wep_key2:WEP wep_key3:WEP - do - type=${enc%%:*} - flag=${enc#*:} - { debug= $wireless_struct get $type cp && [ "$cp" ]; } || - continue - # Configured network requires encryption - case "$flags" in "[$flag]"|*"-$flag-"*) - break # Success; stop after first match - esac - return $FAILURE - done - cp="" # sensitive info - - # - # Compare scanned network encryption against configuration - # NB: Scanned network flags indicates _one_ of PSK EAP or WEP - # NB: Otherwise, no encryption (so encryption won't match) - # - local enc_wanted= - for enc in -PSK-:psk -EAP-:eap; do - flag=${enc%%:*} - type=${enc#*:} - case "$flags" in *"$flag"*) - enc_wanted=1 - { debug= $wireless_struct get $type cp && - [ "$cp" ]; } || return $FAILURE - break # success - esac - done - case "$flags" in *"[WEP]"*) - enc_wanted=1 - local wep_found= - for type in wep_key0 wep_key1 wep_key2 wep_key3; do - debug= $wireless_struct get $type cp && [ "$cp" ] && - wep_found=1 break - done - [ "$wep_found" ] || return $FAILURE - esac - if [ ! "$enc_wanted" ]; then - # No match if the network specifies encryption - for type in psk eap wep_key0 wep_key1 wep_key2 wep_key3; do - debug= $wireless_struct get $type cp && [ "$cp" ] && - return $FAILURE - done - fi - cp="" # sensitive info - - return $SUCCESS -} - -# f_wpa_scan_find_matches scans_prefix $scans_count \ -# wireless_prefix $wireless_count -# -# For each struct from `{scans_prefix}1' up to `{scans_prefix}$scans_count' -# (see struct.subr for additional details) compare the wireless network info -# (defined as struct WPA_SCAN_RESULT) to that of each configured wireless -# stored in `{wireless_prefix}1' (defined as struct WPA_NETWORK) up to -# `{wireless_prefix}$wireless_count'. -# -# If a scanned network is deemed to be a match to a configured wireless -# network, a new `match' property is set on the WPA_NETWORK struct with a value -# of `{scans_prefix}N' (where N represents the scanned network that matched). -# At the same time, a new `matched' property is set on the WPA_SCAN_RESULT -# struct with a value of 1, indicating that this network has been matched to a -# stored [known] configuration and that it should not be displayed in menus. -# -# NB: If a matching entry is not correct, the user can optionally `Forget' the -# network and that will cause the WPA_SCAN_RESULT to no longer match anything, -# causing it to appear in the menus again. -# -# Return status should be ignored. -# -f_wpa_scan_find_matches() -{ - local scans_prefix="$1" scans_count="$2" - local wireless_prefix="$3" wireless_count="$4" - local matches - - [ "$scans_count" -a "$wireless_count" ] || return $SUCCESS - f_isinteger "$scans_count" || return $FAILURE - f_isinteger "$wireless_count" || return $FAILURE - - # - # Go through and eradicate any flags we set in a prior run, as things - # might have changed on us (either from the config side or scan side) - # - local w=1 - while [ $w -le $wireless_count ]; do - f_struct "$wireless_prefix$w" set matches "" - w=$(( $w + 1 )) - done - - # - # Find matches and set match data on structs - # - local s=1 - while [ $s -le $scans_count ]; do - f_struct "$scans_prefix$s" set matched "" - w=1 - while [ $w -le $wireless_count ]; do - if f_wpa_scan_match_network \ - "$scans_prefix$s" "$wireless_prefix$w" - then - f_struct "$scans_prefix$s" set matched 1 - debug= f_struct "$wireless_prefix$w" \ - get matches matches - matches="$matches${matches:+ }$scans_prefix$s" - f_struct "$wireless_prefix$w" \ - set matches "$matches" - break # to next scan result - fi - w=$(( $w + 1 )) - done - s=$(( $s + 1 )) - done -} - -# f_dialog_menu_wlandev_edit $wlandev [$defaultitem] -# -# Display a list of wireless network devices (wlan*) associated with -# $wlandev (e.g., `iwn0'). Allow the user to create and destroy wlan interfaces -# while selecting ones to be cloned at startup (by setting `wlans_$wlandev'). -# -f_dialog_menu_wlandev_edit() -{ - local funcname=f_dialog_menu_wlandev_edit - local wlandev="$1" defaultitem="$2" - local title="$DIALOG_TITLE" - local btitle="$DIALOG_BACKTITLE" - local prompt # Calculated below - local hline="$hline_arrows_tab_enter" - - [ "$wlandev" ] || return $FAILURE - - f_sprintf prompt "$msg_select_wlan_interfaces_for" "wlandev" - - # - # Initially mark wlan devices with a %parent of $wlandev - # - local dev devs if list_to_save= - f_device_find "" $DEVICE_TYPE_NETWORK devs - for dev in $devs; do - f_struct "$dev" get name if || continue - case "$if" in wlan[0-9]*) - parent=$( sysctl -n net.wlan.${if#wlan}.%parent \ - 2> /dev/null ) - if [ "$parent" = "$if" ]; then - local _wlanmark_$if="X" - list_to_save="$list_to_save $if" - fi - esac - done - list_to_save="${list_to_save# }" - - # - # Operate in a loop so we can create/destroy interfaces from here - # - while :; do - # - # Refresh list of wlan interfaces - # - local wlanlist= - f_device_rescan_network - f_device_find "" $DEVICE_TYPE_NETWORK devs - for dev in $devs; do - f_struct "$dev" get name if || continue - case "$if" in wlan[0-9]*) - wlanlist="$wlanlist $if" - esac - done - - # - # Build menu list of wlan devices - # - local menu_list=" - '> $msg_save_exit' '$msg_return_to_previous_menu' - '> $msg_create_new' 'wlan' - '> $msg_destroy' '...' - " # END-QUOTE - local parent X - for if in $wlanlist; do - f_getvar _wlanmark_$if-" " X - menu_list="$menu_list '[$X] $if' '%parent: $parent'" - [ "$defaultitem" = "$if" ] && defaultitem="[$X] $if" - done - - # - # Ask user to make a choice - # - local height width rows - eval f_dialog_menu_size height width rows \ - \"\$title\" \"\$btitle\" \"\$prompt\" \"\$hline\" \ - $menu_list - local menu_choice - menu_choice=$( eval $DIALOG \ - --title \"\$title\" \ - --backtitle \"\$btitle\" \ - --hline \"\$hline\" \ - --ok-label \"\$msg_select\" \ - --cancel-label \"\$msg_cancel\" \ - --default-item \"\$defaultitem\" \ - --menu \"\$prompt\" \ - $height $width $rows \ - $menu_list \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) || return $FAILURE - f_dialog_data_sanitize menu_choice - - case "$menu_choice" in - "> $msg_save_exit") # Save list to rc.conf(5) `wlans_$wlandev' - f_eval_catch $funcname f_sysrc_set \ - 'f_sysrc_set "wlans_%s" "%s"' \ - "$wlandev" "$list_to_save" || continue - break # to success - ;; - "> $msg_create_new") # Create new wlan interface for wlandev - local wlan - f_eval_catch -k wlan $funcname ifconfig \ - 'ifconfig wlan create wlandev "%s"' \ - "$wlandev" || continue - local _wlanmark_$wlan="X" - list_to_save="$list_to_save${list_to_save:+ }$wlan" - ;; - "> $msg_destroy") # Display a menu to pick one item to destroy - [ "$wlanlist" ] || continue # Nothing to destroy - - menu_list= - for if in $wlanlist; do - menu_list="$menu_list '$if' ''" - done - local msg="$msg_pick_an_interface_to_destroy" - eval f_dialog_menu_size height width rows \ - \"\$title\" \"$btitle\" \"\$msg\" \"\" $menu_list - menu_choice=$( eval $DIALOG \ - --title \"\$title\" \ - --backtitle \"\$btitle\" \ - --ok-label \"\$msg_destroy\" \ - --cancel-label \"\$msg_cancel\" \ - --menu \"\$msg\" \ - $height $width $rows \ - $menu_list \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) || continue - f_dialog_data_sanitize menu_choice - f_eval_catch $funcname ifconfig \ - 'ifconfig "%s" destroy' "$menu_choice" - ;; - "[ ] wlan"[0-9]*) # Unmarked; Mark - if="${menu_choice#??? }" - local _wlanmark_$if="X" - list_to_save="$list_to_save${list_to_save:+ }$if" - ;; - "[X] wlan"[0-9]*) # Marked; Unmark - menu_choice="${menu_choice#??? }" - local _wlanmark_$menu_choice=" " - local new_list_to_save= - for if in $list_to_save; do - [ "$if" = "$menu_choice" ] && continue - new_list_to_save="$new_list_to_save $if" - done - list_to_save="${new_list_to_save# }" - ;; - esac - done - - return $SUCCESS -} - -# f_dialog_scan_wireless -# -# Initiate a scan for wireless networks. If wpa_supplicant(8) is not running -# but a wlan interface has been created, start an instance of wpa_supplicant(8) -# with the first wlan(4) interface we find. After initiating the scan, displays -# a message for 5 seconds (with option to dismiss). Returns failure if an error -# occurs, otherwise success. -# -f_dialog_scan_wireless() -{ - local funcname=f_dialog_scan_wireless - - # - # Try to communicate with a running wpa_supplicant(8) - # - if ! f_eval_catch -d $funcname wpa_cli 'wpa_cli ping'; then - - # If there is indeed one running, bail! - if ps axo ucomm= | grep -qw wpa_supplicant; then - f_show_msg "$msg_failed_to_reach_wpa_supplicant" \ - "$msg_wpa_cli_ping_failed" - return $FAILURE - fi - - # Try and find a wlan device so we can start wpa_supplicant - local dev devs if wlan= - f_device_rescan_network - f_device_find "" $DEVICE_TYPE_NETWORK devs - for dev in $devs; do - f_struct "$dev" get name if || continue - case "$if" in wlan[0-9]*) - wlan=$if - break - esac - done - if [ ! "$wlan" ]; then - # We can't start wpa_supplicant without wlan interface - # Tell the user they have to create one by navigating - # to a Wireless device to create a wlan interface. But - # let's go one step further and find an interface that - # we can provide in the prompt text. - local wlandev= - for if in $devs; do - case "$if" in wlan[0-9]*) next; esac - if f_device_is_wireless $if; then - wlandev=$if - break - fi - done - if [ "$wlandev" ]; then - f_show_msg "$msg_cant_start_wpa_supplicant" \ - "$wlandev" - else - # Warn user, appears no wireless available - f_show_msg "$msg_warning_no_wireless_devices" - fi - return $FAILURE - fi - - # NB: Before we can proceed to fire up wpa_supplicant(8), let's - # make sure there is a bare-bones wpa_supplicant.conf(5) for it - local conf_file - conf_file=$( f_sysrc_get wpa_supplicant_conf_file ) - if [ ! -e "$conf_file" ]; then - f_wpa_supplicant_init "$conf_file" || return $FAILURE - f_eval_catch -d $funcname wpa_cli 'wpa_cli reconfigure' - fi - - # Try and start wpa_supplicant(8) - f_eval_catch $funcname wpa_supplicant \ - '/etc/rc.d/wpa_supplicant start "%s"' "$wlan" || - return $FAILURE - - # Try to reach this new wpa_supplicant(8) - if ! f_eval_catch -d $funcname wpa_cli 'wpa_cli ping'; then - f_show_msg "$msg_failed_to_reach_wpa_supplicant" \ - "$msg_wpa_cli_ping_failed" - return $FAILURE - fi - - fi # ! f_quietly wpa_cli ping - - # If we reach hear, then it should be OK to scan the airwaves - f_eval_catch -d $funcname wpa_cli 'wpa_cli scan' || return $FAILURE - - # Return immediately if a duration is: null or not a number >= 1 - local duration="$DIALOG_MENU_WLAN_SCAN_DURATION" - f_isinteger "$duration" || return $SUCCESS - [ $duration -gt 0 ] || return $SUCCESS - - # Display a message that times-out if not dismissed manually - local prompt - f_sprintf prompt "$msg_scanning_wireless_pausing" "$duration" - f_dialog_pause "$prompt" "$duration" -} - -# f_dialog_wireless_edit $ssid -# -# Display a menu to allow the user to either create a new entry for the -# wpa_supplicants.conf(5) file, or to edit values for an existing entry. -# -# If more than one wireless network is found to match $ssid, a sub-menu is -# presented, allowing the user to select the desired network. -# -f_dialog_wireless_edit() -{ - local title="$DIALOG_TITLE" - local btitle="$DIALOG_BACKTITLE" - local prompt1="$msg_select_the_configuration_you_would_like" - local prompt2 # Calculated below - local hline="$hline_alnum_arrows_punc_tab_enter" - local ssid="$1" bssid="$2" - - f_sprintf prompt2 "$msg_wireless_network_configuration_for" "$ssid" - - # - # Find one or more configurations that match the SSID selection - # - local height1 width1 rows1 menu_list1= - local n=0 nmatches=0 tag wssid wbssid help matches= - while [ $n -lt $NWIRELESS_CONFIGS ]; do - n=$(( $n + 1 )) - - debug= f_struct WIRELESS_$n get ssid wssid - [ "$ssid" = "$wssid" ] || continue - debug= f_struct WIRELESS_$n get bssid wbssid - [ "${bssid:-$wbssid}" = "$wbssid" ] || continue - - nmatches=$(( $nmatches + 1 )) - [ $nmatches -le ${#DIALOG_MENU_TAGS} ] || break - f_substr -v tag "$DIALOG_MENU_TAGS" $nmatches 1 - - f_wireless_describe WIRELESS_$n help - menu_list1="$menu_list1 - '$tag $wssid' '$wbssid' '$help' - " # END-QUOTE - - matches="$matches WIRELESS_$n" - done - if [ $nmatches -eq 0 ]; then - f_show_msg "$msg_cannot_edit_wireless_ssid" "$ssid" - return $FAILURE - elif [ $nmatches -eq 1 ]; then - struct=${matches# } - else - eval f_dialog_menu_with_help_size height1 width1 rows1 \ - \"\$title\" \"\$btitle\" \"\$prompt1\" \"\$hline\" \ - $menu_list1 - fi - - # - # Operate in a loop; for the case of $nmatches > 1, we can cycle back - # to allow the user to make another choice after inspecting each one. - # - local menu_choice index struct defaultitem1= - while :; do - if [ $nmatches -gt 1 ]; then - menu_choice=$( eval $DIALOG \ - --title \"\$title\" \ - --backtitle \"\$btitle\" \ - --hline \"\$hline\" \ - --ok-label \"\$msg_select\" \ - --cancel-label \"\$msg_cancel\" \ - --item-help \ - --default-item \"\$defaultitem1\" \ - --menu \"\$prompt1\" \ - $height1 $width1 $rows1 \ - $menu_list1 \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) || return $FAILURE - f_dialog_data_sanitize menu_choice - defaultitem1="$menu_choice" - index=$( eval f_dialog_menutag2index_with_help \ - \"\$menu_choice\" $menu_list1 ) - struct=$( set -- $matches; eval echo \${$index} ) - fi - - # - # Operate within another loop to allow editing multiple values - # - local menu_list2 height2 width2 rows2 member - while :; do - menu_list2=" - '> $msg_save_exit' - '$msg_return_to_previous_menu' - " # END-QUOTE - n=0 - for member in $_struct_typedef_WPA_NETWORK; do - [ "$member" = "ssid" ] && continue - debug= $struct get $member value || continue - n=$(( $n + 1 )) - [ $n -le ${#DIALOG_MENU_TAGS} ] || break - f_substr -v tag "$DIALOG_MENU_TAGS" $n 1 - if [ ${#value} -gt 32 ]; then - f_snprintf value 29 "%s" "$value" - value="$value..." - fi - case "$member" in - password|pin|private_key_passwd|psk|wep_key*) - f_replaceall "$value" "?" "*" value ;; - esac - f_shell_escape "$value" value - menu_list2="$menu_list2 - '$tag $member' '$value' - " # END-QUOTE - done - eval f_dialog_menu_size height2 width2 rows2 \ - \"\$title\" \"\$btitle\" \"\$prompt2\" \ - \"\$hline\" $menu_list2 - menu_choice=$( eval $DIALOG \ - --title \"\$title\" \ - --backtitle \"\$btitle\" \ - --hline \"\$hline\" \ - --ok-label \"\$msg_select\" \ - --cancel-label \"\$msg_cancel\" \ - --default-item \"\$defaultitem2\" \ - --menu \"\$prompt2\" \ - $height2 $width2 $rows2 \ - $menu_list2 \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) || break - f_dialog_data_sanitize menu_choice - defaultitem2="$menu_choice" - - # XXXDT Unfinished - done - [ $nmatches -eq 1 ] && break - done - - # - # XXXDT Unfinished - # This is where we display a menu that edits the entry - # And then we modify the wpa_supplicants.conf(5) config file - # XXXDT Unfinished - # - - return $FAILURE # XXXDT Simulating DIALOG_CANCEL to mean ``no changes'' -} - -# f_wireless_describe WPA_NETWORK [$var_to_set] -# -# Provide a description of the WPA_NETWORK struct. If $var_to_set is missing or -# NULL, the description is provided on standard output (which is less preferred -# due to performance; e.g., if called in a loop). -# -f_wireless_describe() -{ - local __struct="$1" __var_to_set="$2" debug= - - [ "$__var_to_set" ] && setvar "$__var_to_set" "" - f_struct "$__struct" || return $FAILURE - - # - # Basic description is `proto key_mgmt group eap' - # - local __member __cp __desc= - for __member in proto key_mgmt group eap; do - $__struct get $__member __cp && [ "$__cp" ] && - __desc="$__desc${__desc:+ }$__cp" - done - - local __check __kk - - # - # Make sure we add WEP40/WEP140 even if omitted from the key_mgmt - # section of entry - # - local __wep_keyN __f_wireless_describe_first_char __length - for __wep_keyN in wep_key0 wep_key1 wep_key2 wep_key3; do - $__struct get $__wep_keyN __kk - [ "$__kk" ] || continue - - # What type is it? ASCII or HEX? - __check=WEP - f_substr -v __f_wireless_describe_first_char "$__kk" 1 1 - case "$__f_wireless_describe_first_char" in - \") # ASCII - __length=$(( ${#__kk} - 2 )) - if [ $__length -le 5 ]; then - __check=WEP40 - elif [ $__length -le 13 ]; then - __check=WEP104 - fi ;; - *) # HEX - __length=${#__kk} - if [ $__length -eq 10 ]; then - __check=WEP40 - elif [ $__length -le 26 ]; then - __check=WEP104 - fi - esac - __kk="" # sensitive info - - case "$__desc" in - *"$__check"*) : already there ;; - *) __desc="$__desc${__desc:+ }$__check" - esac - done - - # - # Make sure we display PSK even if omitted - # from the key_mgmt section of the entry - # - $__struct get psk __kk - if [ "$__kk" ]; then - __kk="" # sensitive info - __check=PSK - case "$__desc" in - *"$__check"*) : already there ;; - *) __desc="$__desc${__desc:+ }$__check" - esac - fi - - # - # Produce results - # - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "${__desc:-NONE}" - else - echo "$__desc" - fi -} - -# f_menu_wireless_configs -# -# Generates the tag/item/help triplets for wireless network menu (`--item-help' -# required) from wpa_supplicant.conf(5) [WPA_NETWORK] structs. -# -f_menu_wireless_configs() -{ - [ "$DIALOG_MENU_WLAN_SHOW_CONFIGURED" ] || return $SUCCESS - - echo "' - $msg_configured_ssids -' ' - $msg_details -' ''" - - local n=0 nunique=0 debug= - local ssid ussid matches nmatches nconfigs nfound help desc w - while [ $n -lt $NWIRELESS_CONFIGS ]; do - n=$(( $n + 1 )) - - f_struct WIRELESS_$n get ssid ssid - [ ! "$DIALOG_MENU_WLAN_SHOW_ALL" -a ! "$ssid" ] && continue - - local u=0 unique=1 - while [ $u -lt $nunique ]; do - u=$(( $u + 1 )) - menuitem_$u get ssid ussid - [ "$ssid" != "$ussid" ] || unique= break - done - if [ "$unique" ]; then - nunique=$(( $nunique + 1 )) - u=$nunique - - # Set SSID and initialize number of configs found (1) - f_struct_new WLAN_MENU_ITEM menuitem_$u - menuitem_$u set ssid "$ssid" - menuitem_$u set nconfigs 1 - - # Set number of wireless networks that match config - WIRELESS_$n get matches matches - f_count nmatches $matches - menuitem_$u set nfound $nmatches - - # Set help to description of the wireless config - f_wireless_describe WIRELESS_$n desc - menuitem_$u set help "$desc" - else - # Increment number of configs found with this SSID - menuitem_$u get nconfigs nconfigs - nconfigs=$(( $nconfigs + 1 )) - menuitem_$u set nconfigs $nconfigs - - # Add number of matched networks to existing count - WIRELESS_$n get matches matches - f_count nmatches $matches - menuitem_$u get nfound nfound - nfound=$(( $nfound + $nmatches )) - menuitem_$u set nfound $nfound - - # Combine description with existing help - menuitem_$u get help help - f_wireless_describe WIRELESS_$n desc - for w in $desc; do - case "$help" in - "$w"|"$w "*|*" $w"|*" $w "*) : already there ;; - *) help="$help $w" - esac - done - menuitem_$u set help "${help# }" - fi - done - - n=0 - while [ $n -lt $nunique ]; do - n=$(( $n + 1 )) - menuitem_$n get ssid ssid - - menuitem_$n get nconfigs nconfigs - desc="$nconfigs $msg_configured_lc" - [ $nconfigs -lt 10 ] && desc=" $desc" - menuitem_$n get nfound nfound - [ $nfound -gt 0 ] && desc="$desc $nfound $msg_found" - - menuitem_$n get help help - echo "'[X] $ssid' '$desc' '$help'" - done | sort -bf | awk 'BEGIN { prefix = "" } - { - cur_prefix = toupper(substr($0, 6, 1)) - if (cur_prefix != "'\''" && prefix != cur_prefix ) { - prefix = cur_prefix - printf "'\''%c%s\n", prefix, substr($0, 2) - } else - printf "'\'' %s\n", substr($0, 2) - }' -} - -# f_menu_wpa_scan_results -# -# Generates the tag/item/help triplets for wireless network menu (`--item-help' -# required) from wpa_cli(8) `scan_results' [WPA_SCAN_RESULT] structs. -# -f_menu_wpa_scan_results() -{ - [ "$DIALOG_MENU_WLAN_SHOW_SCAN_RESULTS" ] || return $SUCCESS - - if [ "$DIALOG_MENU_WLAN_SHOW_ALL" ]; then - echo "' - $msg_discovered_ssids -' ' - $msg_details -' ''" - else - echo "' - $msg_discovered_ssids -' '' ''" - fi - - local n=0 nunique=0 debug= - local ssid ussid matched nfound help flags f - while [ $n -lt $NWSCAN_RESULTS ]; do - n=$(( $n + 1 )) - - WSCANS_$n get ssid ssid - [ ! "$DIALOG_MENU_WLAN_SHOW_ALL" -a ! "$ssid" ] && continue - - WSCANS_$n get matched matched - [ "$DIALOG_MENU_WLAN_SHOW_CONFIGURED" -a "$matched" ] && - continue - - local u=0 unique=1 - while [ $u -lt $nunique ]; do - u=$(( $u + 1 )) - menuitem_$u get ssid ussid - [ "$ssid" != "$ussid" ] || unique= break - done - if [ "$unique" ]; then - nunique=$(( $nunique + 1 )) - u=$nunique - - # Set SSID and initialize number of networks found (1) - f_struct_new WLAN_MENU_ITEM menuitem_$u - menuitem_$u set ssid "$ssid" - menuitem_$u set nfound 1 - - # Set help to flags - WSCANS_$n get flags flags - f_replaceall "$flags" "[" " " flags - f_replaceall "$flags" "]" "" flags - flags="${flags# }" - case "$flags" in - "") flags="NONE" ;; - ESS) flags="NONE ESS" ;; - esac - menuitem_$u set help "$flags" - else - # Increment number of networks found with this SSID - menuitem_$u get nfound nfound - nfound=$(( $nfound + 1 )) - menuitem_$u set nfound $nfound - - # Combine flags into existing help - WSCANS_$n get flags flags - f_replaceall "$flags" "[" " " flags - f_replaceall "$flags" "]" "" flags - local flags_ess= - case "$flags" in *" ESS") - flags_ess=1 - flags="${flags% ESS}" - esac - local help_ess= - menuitem_$u get help help - case "$help" in *" ESS") - help_ess=1 - help="${help% ESS}" - esac - for f in ${flags:-NONE}; do - case "$help" in - "$f"|"$f "*|*" $f"|*" $f "*) : already there ;; - *) help="$help $f" - esac - done - [ "$flags_ess" -a ! "$help_ess" ] && help="$help ESS" - menuitem_$u set help "${help# }" - fi - done - - local desc n=0 - while [ $n -lt $nunique ]; do - n=$(( $n + 1 )) - menuitem_$n get ssid ssid - - desc= - if [ "$DIALOG_MENU_WLAN_SHOW_ALL" ]; then - menuitem_$n get nfound nfound - desc="$nfound $msg_found" - [ $nfound -lt 10 ] && desc=" $desc" - fi - - menuitem_$n get help help - echo "'[ ] $ssid' '$desc' '$help'" - done | sort -bf | awk 'BEGIN { prefix = "" } - { - cur_prefix = toupper(substr($0, 6, 1)) - if (cur_prefix != "'\''" && prefix != cur_prefix ) { - prefix = cur_prefix - printf "'\''%c%s\n", prefix, substr($0, 2) - } else - printf "'\'' %s\n", substr($0, 2) - }' -} - -# f_dialog_menu_wireless_edit -# -# Display a list of wireless networks configured in wpa_supplicants.conf(5) and -# (if wpa_supplicant(8) is running) also displays scan results for unconfigured -# wireless networks. -# -f_dialog_menu_wireless_edit() -{ - local funcname=f_dialog_menu_wireless_edit - local title="$DIALOG_TITLE" - local btitle="$DIALOG_BACKTITLE" - local prompt="$msg_wireless_networks_text" - local menu_list # Calculated below - local defaultitem= # Calculated below - local hline="$hline_alnum_arrows_punc_tab_enter" - - f_show_info "$msg_loading_wireless_menu" - - local conf_file - conf_file=$( f_sysrc_get wpa_supplicant_conf_file ) - - # - # Operate in a loop so we can edit wpa_supplicant.conf(5) and rescan - # for new wireless networks from here. - # - local do_parse=1 remake_menu=1 item - while :; do - # - # If this is the first time here, parse wpa_supplicant.conf(5), - # scan the airwaves, and compare to find matches. - # - if [ "$do_parse" -a "$DIALOG_MENU_WLAN_SHOW_SCAN_RESULTS" ] - then - f_dprintf "$funcname: Parsing wireless scan results" - f_dialog_scan_wireless && - f_wpa_scan_results_parse WSCANS_ NWSCAN_RESULTS - f_dprintf "$funcname: Parsed %i scanned networks" \ - $NWSCAN_RESULTS - fi - if [ "$do_parse" -a "$DIALOG_MENU_WLAN_SHOW_CONFIGURED" ] - then - f_dprintf "$funcname: Parsing wpa_supplicants.conf(5)" - f_wpa_supplicant_parse "$conf_file" \ - WIRELESS_ NWIRELESS_CONFIGS - f_dprintf "%s: Parsed %i wireless configurations" \ - $funcname $NWIRELESS_CONFIGS - f_wpa_scan_find_matches WSCANS_ $NWSCAN_RESULTS \ - WIRELESS_ $NWIRELESS_CONFIGS - fi - do_parse= - - if [ "$remake_menu" ]; then - remake_menu= - - # - # Add both items scanned from the airwaves and networks - # parsed from wpa_supplicants.conf(5). Latter items are - # marked, sorted, and added to top of list above the - # former (which are unmarked and sorted separately). - # - f_dprintf "$funcname: Building menu list..." - menu_list=$( - # Process wpa_supplicant.conf(5) structs - f_menu_wireless_configs - # Process wpa_cli(8) `scan_results' structs - f_menu_wpa_scan_results - ) - f_dprintf "$funcname: menu list built." - - # - # Add static top-level menu items - # - local XA=" " XC=" " XS=" " - [ "$DIALOG_MENU_WLAN_SHOW_ALL" ] && XA="X" - [ "$DIALOG_MENU_WLAN_SHOW_CONFIGURED" ] && XC="X" - [ "$DIALOG_MENU_WLAN_SHOW_SCAN_RESULTS" ] && XS="X" - menu_list=" - '> $msg_exit' '$msg_return_to_previous_menu' - '' - '> $msg_rescan_wireless' '*' - '$msg_rescan_wireless_help' - '> $msg_forget_all' '*' - '$msg_forget_all_help' - '> $msg_show_configured' '[$XC]' - '$msg_show_configured_help' - '> $msg_show_scan_results' '[$XS]' - '$msg_show_scan_results_help' - '> $msg_show_all' '[$XA]' - '$msg_show_all_help' - '> $msg_manually_connect' '...' - '$msg_manually_connect_help' - $menu_list" # END-QUOTE - fi - - local height width rows - eval f_dialog_menu_with_help_size height width rows \ - \"\$title\" \"\$btitle\" \"\$prompt\" \"\$hline\" \ - $menu_list - - local menu_choice - menu_choice=$( eval $DIALOG \ - --title \"\$title\" \ - --backtitle \"\$btitle\" \ - --hline \"\$hline\" \ - --ok-label \"\$msg_select\" \ - --cancel-label \"\$msg_cancel\" \ - --item-help \ - --default-item \"\$defaultitem\" \ - --menu \"\$prompt\" \ - $height $width $rows \ - $menu_list \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) || break - f_dialog_data_sanitize menu_choice - defaultitem="$menu_choice" - - case "$menu_choice" in - "> $msg_exit") break ;; - "> $msg_rescan_wireless") do_parse=1 remake_menu=1 ;; - "> $msg_forget_all") - if f_noyes "$msg_forget_all_confirm"; then - f_eval_catch $funcname rm \ - 'rm -f "%s"' "$conf_file" || continue - f_wpa_supplicant_init "$conf_file" || continue - f_eval_catch -d $funcname wpa_cli \ - 'wpa_cli reconfigure' - f_wpa_supplicant_parse "$conf_file" \ - WIRELESS_ NWIRELESS_CONFIGS - f_wpa_scan_find_matches \ - WSCANS_ $NWSCAN_RESULTS \ - WIRELESS_ $NWIRELESS_CONFIGS - do_parse=1 remake_menu=1 - fi ;; - "> $msg_show_configured") - item=$( eval f_dialog_menutag2item_with_help \ - \"\$menu_choice\" $menu_list ) - if [ "$item" = "[ ]" ]; then - DIALOG_MENU_WLAN_SHOW_CONFIGURED=1 - else - DIALOG_MENU_WLAN_SHOW_CONFIGURED= - fi - remake_menu=1 ;; - "> $msg_show_scan_results") - item=$( eval f_dialog_menutag2item_with_help \ - \"\$menu_choice\" $menu_list ) - if [ "$item" = "[ ]" ]; then - DIALOG_MENU_WLAN_SHOW_SCAN_RESULTS=1 - else - DIALOG_MENU_WLAN_SHOW_SCAN_RESULTS= - fi - remake_menu=1 ;; - "> $msg_show_all") - item=$( eval f_dialog_menutag2item_with_help \ - \"\$menu_choice\" $menu_list ) - if [ "$item" = "[ ]" ]; then - DIALOG_MENU_WLAN_SHOW_ALL=1 - else - DIALOG_MENU_WLAN_SHOW_ALL= - fi - remake_menu=1 ;; - "> $msg_manually_connect") - f_dialog_wireless_edit && remake_menu=1 ;; - ?"[X] "*) - ssid="${menu_choice#??X? }" - f_dialog_wireless_edit "$ssid" || continue - do_parse=1 remake_menu=1 ;; - "[ ] "*) - : - : XXXDT Unfinished - : - ;; - esac - done - - # - # XXXDT Unfinished - # -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." media/wlan.subr - -fi # ! $_MEDIA_WLAN_SUBR diff --git a/bsdconfig/share/mustberoot.subr b/bsdconfig/share/mustberoot.subr deleted file mode 100644 index 88ff81868d45..000000000000 --- a/bsdconfig/share/mustberoot.subr +++ /dev/null @@ -1,424 +0,0 @@ -if [ ! "$_MUSTBEROOT_SUBR" ]; then _MUSTBEROOT_SUBR=1 -# -# Copyright (c) 2006-2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." mustberoot.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/strings.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ CONFIGURATION -# NOTE: These are not able to be overridden/inherited for security purposes. - -# -# Number of tries a user gets to enter his/her password before we log the -# sudo(8) failure and exit. -# -PASSWD_TRIES=3 - -# -# While in SECURE mode, should authentication as `root' be allowed? Set to -# non-NULL to enable authentication as `root', otherwise disabled. -# -# WARNING: -# Unless using a custom sudo(8) configuration, user `root' should not be -# allowed because no password is required to become `root' when already `root' -# and therefore, any value entered as password will work. -# -SECURE_ALLOW_ROOT= - -# -# While in SECURE mode, should we divulge (through error message) when the -# requested authentication user does not exist? Set to non-NULL to enable, -# otherwise a non-existent user is treated like an invalid password. -# -SECURE_DIVULGE_UNKNOWN_USER= - -############################################################ FUNCTIONS - -# f_become_root_via_sudo -# -# If not running as root, prompt for sudo(8) credentials to become root. -# Re-execution of the current program via sudo is automatically handled. -# -# The following environment variables effect functionality: -# -# USE_XDIALOG Either NULL or Non-NULL. If given a value will indicate -# that Xdialog(1) should be used instead of dialog(1). -# -f_become_root_via_sudo() -{ - local funcname=f_become_root_via_sudo - local prompt hline height width rows msg - - [ "$( id -u )" = "0" ] && return $SUCCESS - - f_have sudo || f_die 1 "$msg_must_be_root_to_execute" "$pgm" - - # - # Ask the user if it's OK to become root via sudo(8) and give them - # the option to save this preference (by touch(1)ing a file in the - # user's $HOME directory). - # - local checkpath="${HOME%/}/.bsdconfig_uses_sudo" - if [ ! -e "$checkpath" ]; then - f_sprintf prompt "$msg_you_are_not_root_but" bsdconfig - f_sprintf msg "$msg_always_try_sudo_when_run_as" "$USER" - local menu_list=" - 'X' '$msg_cancel_exit' - '1' '$msg' - '2' '$msg_try_sudo_only_this_once' - " # END-QUOTE - hline="$hline_arrows_tab_enter" - - eval f_dialog_menu_size height width rows \ - \"\$DIALOG_TITLE\" \ - \"\$DIALOG_BACKTITLE\" \ - \"\$prompt\" \ - \"\$hline\" \ - $menu_list - - local mtag - mtag=$( eval $DIALOG \ - --title \"\$DIALOG_TITLE\" \ - --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ - --ok-label \"\$msg_ok\" \ - --cancel-label \"\$msg_cancel\" \ - --menu \"\$prompt\" \ - $height $width $rows \ - $menu_list \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) || f_die - f_dialog_data_sanitize mtag - - case "$mtag" in - X) # Cancel/Exit - f_die ;; - 1) # Always try sudo(8) when run as $user - f_eval_catch $funcname touch \ - 'touch "%s"' "$checkpath" && - f_show_msg "$msg_created_path" "$checkpath" - esac - else - # - # This user has created the path signing-off on sudo(8)-use - # but let's still give them a short/quick/unobtrusive reminder - # - f_dialog_info "$msg_becoming_root_via_sudo" - [ "$USE_XDIALOG" ] || sleep 0.6 - fi - - # - # Check sudo(8) access before prompting for password. - # - :| sudo -S -v 2> /dev/null - if [ $? -ne $SUCCESS ]; then - # - # sudo(8) access denied. Prompt for their password. - # - prompt="$msg_please_enter_password" - hline="$hline_alnum_punc_tab_enter" - f_dialog_inputbox_size height width \ - "$DIALOG_TITLE" \ - "$DIALOG_BACKTITLE" \ - "$prompt" \ - "$hline" - - # - # Continue prompting until they either Cancel, succeed - # or exceed the number of allowed failures. - # - local password nfailures=0 retval - while [ $nfailures -lt $PASSWD_TRIES ]; do - if [ "$USE_XDIALOG" ]; then - password=$( $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ - --ok-label "$msg_ok" \ - --cancel-label "$msg_cancel" \ - --password --inputbox "$prompt" \ - $height $width \ - 2>&1 > /dev/null - ) - retval=$? - - # Catch X11-related errors - if [ $retval -eq $DIALOG_ESC ]; then - f_die $retval "$password" - elif [ $retval -ne $DIALOG_OK ]; then - # User cancelled - exit $retval - fi - else - password=$( $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ - --ok-label "$msg_ok" \ - --cancel-label "$msg_cancel" \ - --insecure \ - --passwordbox "$prompt" \ - $height $width \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) || exit $? - fi - debug= f_dialog_line_sanitize password - - # - # Validate sudo(8) credentials - # - sudo -S -v 2> /dev/null <<-EOF - $password - EOF - retval=$? - unset password # scrub memory - if [ $retval -eq $SUCCESS ]; then - # Access granted... - break - else - # Access denied... - nfailures=$(( $nfailures + 1 )) - - # introduce a short delay - if [ $nfailures -lt $PASSWD_TRIES ]; then - f_dialog_info "$msg_sorry_try_again" - sleep 1 - fi - fi - done - - # - # If user exhausted number of allowed password tries, log - # the security event and exit immediately. - # - if [ $nfailures -ge $PASSWD_TRIES ]; then - f_sprintf msg "$msg_nfailed_attempts" "$nfailures" - logger -p auth.notice -t sudo " " \ - "$USER : $msg" \ - "; TTY=$(tty)" \ - "; PWD=$PWD" \ - "; USER=root" \ - "; COMMAND=$0" - f_die 1 "sudo: $msg" - fi - fi - - # Use xauth(1) to grant root the ability to use this X11/SSH session - if [ "$USE_XDIALOG" -a "$SSH_CONNECTION" -a "$DISPLAY" ]; then - f_have xauth || f_die 1 \ - "$msg_no_such_file_or_directory" "$pgm" "xauth" - local HOSTNAME displaynum - HOSTNAME=$(hostname) - displaynum="${DISPLAY#*:}" - xauth -f ~/.Xauthority extract - $HOSTNAME/unix:$displaynum \ - $HOSTNAME:$displaynum | sudo sh -c 'xauth -ivf \ - ~root/.Xauthority merge - > /dev/null 2>&1' - fi - - # Re-execute ourselves with sudo(8) - f_dprintf "%s: Becoming root via sudo(8)..." mustberoot.subr - if [ $ARGC -gt 0 ]; then - exec sudo "$0" $ARGV - else - exec sudo "$0" - fi - exit $? # Never reached unless error -} - -# f_authenticate_some_user -# -# Only used if running as root and requires X11 (see USE_XDIALOG below). -# Prompts the user to enter a username and password to be authenticated via -# sudo(8) to proceed. -# -# The following environment variables effect functionality: -# -# USE_XDIALOG Either NULL or Non-NULL. If given a value will indicate -# that Xdialog(1) should be used instead of dialog(1). -# -f_authenticate_some_user() -{ - local msg hline height width - - f_have sudo || f_die 1 "$msg_must_be_root_to_execute" "$pgm" - - # - # Secure-mode has been requested. - # - - [ "$USE_XDIALOG" ] || f_die 1 "$msg_secure_mode_requires_x11" - [ "$(id -u)" = "0" ] || f_die 1 "$msg_secure_mode_requires_root" - - # - # Prompt for sudo(8) credentials. - # - - msg="$msg_please_enter_username_password" - hline="$hline_alnum_punc_tab_enter" - f_xdialog_2inputsbox_size height width \ - "$DIALOG_TITLE" \ - "$DIALOG_BACKTITLE" \ - "$msg" \ - "$field_username" "" \ - "$field_password" "" - height=$(( $height + 2 )) # Add height for --password - - # - # Continue prompting until they either Cancel, succeed or exceed the - # number of allowed failures. - # - local user_pass nfailures=0 retval - while [ $nfailures -lt $PASSWD_TRIES ]; do - user_pass=$( $DIALOG \ - --title "$DIALOG_TITLE" \ - --backtitle "$DIALOG_BACKTITLE" \ - --hline "$hline" \ - --ok-label "$msg_ok" \ - --cancel-label "$msg_cancel" \ - --password --2inputsbox "$msg" \ - $height $width \ - "$field_username" "" \ - "$field_password" "" \ - 2>&1 > /dev/null ) - retval=$? - - # Catch X11-related errors - [ $retval -eq $DIALOG_ESC ] && f_die $retval "$user_pass" - - # Exit if the user cancelled. - [ $retval -eq $DIALOG_OK ] || exit $retval - - # - # Make sure the user exists and is non-root - # - local user password - user="${user_pass%%/*}" - password="${user_pass#*/}" - unset user_pass # scrub memory - if [ ! "$user" ]; then - nfailures=$(( $nfailures + 1 )) - f_show_msg "$msg_no_username" - continue - fi - if [ ! "$SECURE_ALLOW_ROOT" ]; then - case "$user" in - root|toor) - nfailures=$(( $nfailures + 1 )) - f_show_msg "$msg_user_disallowed" "$user" - continue - esac - fi - if ! f_quietly id "$user"; then - nfailures=$(( $nfailures + 1 )) - if [ "$SECURE_DIVULGE_UNKNOWN_USER" ]; then - f_show_msg "$msg_unknown_user" "$user" - elif [ $nfailures -lt $PASSWD_TRIES ]; then - f_dialog_info "$msg_sorry_try_again" - sleep 1 - fi - continue - fi - - # - # Validate sudo(8) credentials for given user - # - su -m "$user" <<-EOF - sh <<EOS - sudo -k - sudo -S -v 2> /dev/null <<EOP - $password - EOP - EOS - EOF - retval=$? - unset user - unset password # scrub memory - - if [ $retval -eq $SUCCESS ]; then - # Access granted... - break - else - # Access denied... - nfailures=$(( $nfailures + 1 )) - - # introduce a short delay - if [ $nfailures -lt $PASSWD_TRIES ]; then - f_dialog_info "$msg_sorry_try_again" - sleep 1 - fi - fi - done - - # - # If user exhausted number of allowed password tries, log - # the security event and exit immediately. - # - if [ $nfailures -ge $PASSWD_TRIES ]; then - f_sprintf msg "$msg_nfailed_attempts" "$nfailures" - logger -p auth.notice -t sudo " " \ - "${SUDO_USER:-$USER} : $msg" \ - "; TTY=$(tty)" \ - "; PWD=$PWD" \ - "; USER=root" \ - "; COMMAND=$0" - f_die 1 "sudo: $message" - fi -} - -# f_mustberoot_init -# -# If not already root, make the switch to root by re-executing ourselves via -# sudo(8) using user-supplied credentials. -# -# The following environment variables effect functionality: -# -# SECURE Either NULL or Non-NULL. If given a value will indicate -# that (while running as root) sudo(8) authentication is -# required to proceed. -# -f_mustberoot_init() -{ - if [ "$(id -u)" != "0" -a ! "$SECURE" ]; then - f_become_root_via_sudo - elif [ "$SECURE" ]; then - f_authenticate_some_user - fi -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." mustberoot.subr - -fi # ! $_MUSTBEROOT_SUBR diff --git a/bsdconfig/share/packages/Makefile b/bsdconfig/share/packages/Makefile deleted file mode 100644 index bc0e59ad63cd..000000000000 --- a/bsdconfig/share/packages/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# $FreeBSD$ - -FILESDIR= ${SHAREDIR}/bsdconfig/packages -FILES= categories.subr index.subr musthavepkg.subr packages.subr - -.include <bsd.prog.mk> diff --git a/bsdconfig/share/packages/Makefile.depend b/bsdconfig/share/packages/Makefile.depend deleted file mode 100644 index f80275d86ab1..000000000000 --- a/bsdconfig/share/packages/Makefile.depend +++ /dev/null @@ -1,11 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - - -.include <dirdeps.mk> - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif diff --git a/bsdconfig/share/packages/categories.subr b/bsdconfig/share/packages/categories.subr deleted file mode 100644 index 474c41d948ed..000000000000 --- a/bsdconfig/share/packages/categories.subr +++ /dev/null @@ -1,209 +0,0 @@ -if [ ! "$_PACKAGES_CATEGORIES_SUBR" ]; then _PACKAGES_CATEGORIES_SUBR=1 -# -# Copyright (c) 2013 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 (INCLUDING, 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_dprintf "%s: loading includes..." packages/categories.subr -f_include $BSDCFG_SHARE/strings.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -CATEGORIES= -NCATEGORIES=0 - -############################################################ FUNCTIONS - -# f_category_desc_get $category [$var_to_set] -# -# Fetch the description of a given category. Returns success if a match was -# found, otherwise failure. -# -# If $var_to_set is missing or NULL, the category description is printed to -# standard out for capturing in a sub-shell (which is less-recommended because -# of performance degredation; for example, when called in a loop). -# -f_category_desc_get() -{ - local __category="$1" __var_to_set="$2" __cat __varcat - - # Return failure if $category - [ "$__category" ] || return $FAILURE - - for __cat in $CATEGORIES; do - [ "$__cat" = "$__category" ] || continue - f_str2varname $__cat __varcat - f_getvar _category_$__varcat $__var_to_set - return $? - done - return $FAILURE -} - -# f_category_desc_set $category $desc -# -# Store a description in-association with a category. $category should be -# alphanumeric and can include the underscore [_] but should not contain -# whitespace. Returns success unless $category is NULL or no arguments. Use the -# f_category_desc_get() routine with the same $category to retrieve the stored -# description. -# -f_category_desc_set() -{ - local category="$1" desc="$2" - local cat varcat found= - [ "$category" ] || return $FAILURE - for cat in $CATEGORIES; do - [ "$cat" = "$category" ] || continue - f_str2varname $cat varcat - f_isset _category_$varcat || continue - found=1 && break - done - if [ ! "$found" ]; then - CATEGORIES="$CATEGORIES $category" - fi - f_str2varname $category varcat - setvar "_category_$varcat" "$desc" - # Export the variable for awk(1) ENVIRON visibility - export "_category_$varcat" - return $SUCCESS -} - -############################################################ MAIN - -# -# Load descriptions for package categories. Note that we don't internationalize -# category names because this would be confusing for people used to browsing -# the FTP mirrors or are otherwise familiar with an interface that does not -# provide internationalized names. The descriptions can be used to provide i18n -# users a description of the non-i18n category name. -# -f_category() { f_category_desc_set "$1" "$2"; } -f_category All "$msg_all_desc" -f_category accessibility "$msg_accessibility_desc" -f_category afterstep "$msg_afterstep_desc" -f_category arabic "$msg_arabic_desc" -f_category archivers "$msg_archivers_desc" -f_category astro "$msg_astro_desc" -f_category audio "$msg_audio_desc" -f_category benchmarks "$msg_benchmarks_desc" -f_category biology "$msg_biology_desc" -f_category cad "$msg_cad_desc" -f_category chinese "$msg_chinese_desc" -f_category comms "$msg_comms_desc" -f_category converters "$msg_converters_desc" -f_category databases "$msg_databases_desc" -f_category deskutils "$msg_deskutils_desc" -f_category devel "$msg_devel_desc" -f_category dns "$msg_dns_desc" -f_category docs "$msg_docs_desc" -f_category editors "$msg_editors_desc" -f_category elisp "$msg_elisp_desc" -f_category emulators "$msg_emulators_desc" -f_category enlightenment "$msg_enlightenment_desc" -f_category finance "$msg_finance_desc" -f_category french "$msg_french_desc" -f_category ftp "$msg_ftp_desc" -f_category games "$msg_games_desc" -f_category geography "$msg_geography_desc" -f_category german "$msg_german_desc" -f_category gnome "$msg_gnome_desc" -f_category gnustep "$msg_gnustep_desc" -f_category graphics "$msg_graphics_desc" -f_category hamradio "$msg_hamradio_desc" -f_category haskell "$msg_haskell_desc" -f_category hebrew "$msg_hebrew_desc" -f_category hungarian "$msg_hungarian_desc" -f_category ipv6 "$msg_ipv6_desc" -f_category irc "$msg_irc_desc" -f_category japanese "$msg_japanese_desc" -f_category java "$msg_java_desc" -f_category kde "$msg_kde_desc" -f_category kld "$msg_kld_desc" -f_category korean "$msg_korean_desc" -f_category lang "$msg_lang_desc" -f_category linux "$msg_linux_desc" -f_category lisp "$msg_lisp_desc" -f_category mail "$msg_mail_desc" -f_category math "$msg_math_desc" -f_category mbone "$msg_mbone_desc" -f_category misc "$msg_misc_desc" -f_category multimedia "$msg_multimedia_desc" -f_category net "$msg_net_desc" -f_category net-im "$msg_net_im_desc" -f_category net-mgmt "$msg_net_mgmt_desc" -f_category net-p2p "$msg_net_p2p_desc" -f_category news "$msg_news_desc" -f_category palm "$msg_palm_desc" -f_category parallel "$msg_parallel_desc" -f_category pear "$msg_pear_desc" -f_category perl5 "$msg_perl5_desc" -f_category plan9 "$msg_plan9_desc" -f_category polish "$msg_polish_desc" -f_category ports-mgmt "$msg_ports_mgmt_desc" -f_category portuguese "$msg_portuguese_desc" -f_category print "$msg_print_desc" -f_category python "$msg_python_desc" -f_category ruby "$msg_ruby_desc" -f_category rubygems "$msg_rubygems_desc" -f_category russian "$msg_russian_desc" -f_category scheme "$msg_scheme_desc" -f_category science "$msg_science_desc" -f_category security "$msg_security_desc" -f_category shells "$msg_shells_desc" -f_category spanish "$msg_spanish_desc" -f_category sysutils "$msg_sysutils_desc" -f_category tcl "$msg_tcl_desc" -f_category textproc "$msg_textproc_desc" -f_category tk "$msg_tk_desc" -f_category ukrainian "$msg_ukrainian_desc" -f_category vietnamese "$msg_vietnamese_desc" -f_category windowmaker "$msg_windowmaker_desc" -f_category www "$msg_www_desc" -f_category x11 "$msg_x11_desc" -f_category x11-clocks "$msg_x11_clocks_desc" -f_category x11-drivers "$msg_x11_drivers_desc" -f_category x11-fm "$msg_x11_fm_desc" -f_category x11-fonts "$msg_x11_fonts_desc" -f_category x11-servers "$msg_x11_servers_desc" -f_category x11-themes "$msg_x11_themes_desc" -f_category x11-toolkits "$msg_x11_toolkits_desc" -f_category x11-wm "$msg_x11_wm_desc" -f_category xfce "$msg_xfce_desc" -f_category zope "$msg_zope_desc" - -f_count NCATEGORIES $CATEGORIES -f_dprintf "%s: Initialized %u package category descriptions." \ - packages/categories.subr $NCATEGORIES - -f_dprintf "%s: Successfully loaded." packages/categories.subr - -fi # ! $_PACKAGES_CATEGORIES_SUBR diff --git a/bsdconfig/share/packages/index.subr b/bsdconfig/share/packages/index.subr deleted file mode 100644 index 95260da0de05..000000000000 --- a/bsdconfig/share/packages/index.subr +++ /dev/null @@ -1,416 +0,0 @@ -if [ ! "$_PACKAGES_INDEX_SUBR" ]; then _PACKAGES_INDEX_SUBR=1 -# -# Copyright (c) 2013-2016 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 (INCLUDING, 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_dprintf "%s: loading includes..." packages/index.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/media/common.subr -f_include $BSDCFG_SHARE/packages/musthavepkg.subr -f_include $BSDCFG_SHARE/strings.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ GLOBALS - -PACKAGE_INDEX= -_INDEX_INITTED= - -# -# Default path to pkg(8) repo-packagesite.sqlite database -# -SQLITE_REPO="/var/db/pkg/repo-FreeBSD.sqlite" - -# -# Default path to on-disk cache INDEX file -# -PACKAGES_INDEX_CACHEFILE="/var/run/bsdconfig/packages_INDEX.cache" - -############################################################ FUNCTIONS - -# f_index_initialize [$var_to_set] -# -# Read and initialize the global index. Returns success unless media cannot be -# initialized for any reason (e.g. user cancels media selection dialog or an -# error occurs). The index is sorted before being loaded into $var_to_set. -# -# NOTE: The index is processed with f_index_read() [below] after being loaded. -# -f_index_initialize() -{ - local __funcname=f_index_initialize - local __var_to_set="${1:-PACKAGE_INDEX}" - - [ "$_INDEX_INITTED" ] && return $SUCCESS - - # Got any media? - f_media_verify || return $FAILURE - - # Make sure we have a usable pkg(8) with $PKG_ABI - f_musthavepkg_init - - # Does it move when you kick it? - f_device_init device_media || return $FAILURE - - f_show_info "$msg_attempting_to_update_repository_catalogue" - - # - # Generate $PACKAGESITE variable for pkg(8) based on media type - # - local __type __data __site - device_media get type __type - device_media get private __data - case "$__type" in - $DEVICE_TYPE_DIRECTORY) - __site="file://$__data/packages/$PKG_ABI" ;; - $DEVICE_TYPE_FLOPPY) - __site="file://${__data:-$MOUNTPOINT}/packages/$PKG_ABI" ;; - $DEVICE_TYPE_FTP) - f_getvar $VAR_FTP_PATH __site - __site="$__site/packages/$PKG_ABI" ;; - $DEVICE_TYPE_HTTP) - f_getvar $VAR_HTTP_PATH __site - __site="$__site/$PKG_ABI/latest" ;; - $DEVICE_TYPE_HTTP_PROXY) - f_getvar $VAR_HTTP_PROXY_PATH __site - __site="$__site/packages/$PKG_ABI" ;; - $DEVICE_TYPE_CDROM) - __site="file://$MOUNTPOINT/packages/$PKG_ABI" - export REPOS_DIR="$MOUNTPOINT/packages/repos" ;; - *) # UFS, DISK, CDROM, USB, DOS, NFS, etc. - __site="file://$MOUNTPOINT/packages/$PKG_ABI" - esac - - f_dprintf "PACKAGESITE=[%s]" "$__site" - if ! f_eval_catch $__funcname pkg \ - 'PACKAGESITE="%s" pkg update' "$__site" - then - f_show_err "$msg_unable_to_update_pkg_from_selected_media" - f_device_shutdown device_media - return $FAILURE - fi - - # - # Try to get contents from validated on-disk cache - # - - # - # Calculate digest used to determine if the on-disk persistent cache - # INDEX (containing this digest on the first line) is valid and can be - # used to quickly populate the environment. - # - local __sqlite_digest - if ! __sqlite_digest=$( md5 < "$SQLITE_REPO" 2> /dev/null ); then - f_show_err "$msg_no_pkg_database_found" - f_device_shutdown device_media - return $FAILURE - fi - - # - # Check to see if the persistent cache INDEX file exists - # - if [ -f "$PACKAGES_INDEX_CACHEFILE" ]; then - # - # Attempt to populate the environment with the (soon to be) - # validated on-disk cache. If validation fails, fall-back to - # generating a fresh cache. - # - if eval $__var_to_set='$( - ( # Get digest as the first word on first line - read digest rest_ignored - - # - # If the stored digest matches the calculated- - # one populate the environment from the on-disk - # cache and provide success exit status. - # - if [ "$digest" = "$__sqlite_digest" ]; then - cat - exit $SUCCESS - else - # Otherwise, return the current value - eval echo \"\$__var_to_set\" - exit $FAILURE - fi - ) < "$PACKAGES_INDEX_CACHEFILE" 2> /dev/null - )'; then - if ! f_index_read "$__var_to_set"; then - f_show_err \ - "$msg_io_or_format_error_on_index_file" - return $FAILURE - fi - _INDEX_INITTED=1 - return $SUCCESS - fi - # Otherwise, fall-thru to create a fresh cache from scratch - fi - - # - # If we reach this point, we need to generate the data from scratch - # - - eval "$__var_to_set"='$( pkg rquery -I | ( - exec 2<&1; dpv -ko /dev/stderr >&$TERMINAL_STDOUT_PASSTHRU \ - -b "$DIALOG_BACKTITLE" \ - -- "$msg_generating_index_from_pkg_database" - ) | sort )' - - # - # Attempt to create the persistent on-disk cache - # - - # Create a new temporary file to write to - local __tmpfile - if f_eval_catch -dk __tmpfile $__funcname mktemp \ - 'mktemp -t "%s"' "$pgm" - then - # Write the temporary file contents - echo "$__sqlite_digest" > "$__tmpfile" - debug= f_getvar "$__var_to_set" >> "$__tmpfile" - - # Finally, move the temporary file into place - case "$PACKAGES_INDEX_CACHEFILE" in - */*) f_eval_catch -d $__funcname mkdir \ - 'mkdir -p "%s"' "${PACKAGES_INDEX_CACHEFILE%/*}" - esac - f_eval_catch -d $__funcname mv 'mv -f "%s" "%s"' \ - "$__tmpfile" "$PACKAGES_INDEX_CACHEFILE" - fi - - if ! f_index_read "$__var_to_set"; then - f_show_err "$msg_io_or_format_error_on_index_file" - return $FAILURE - fi - - _INDEX_INITTED=1 - return $SUCCESS -} - -# f_index_read [$var_to_get] -# -# Process the INDEX file (contents contained in $var_to_get) and... -# -# 1. create a list ($CATEGORY_MENU_LIST) of categories with package counts -# 2. For convenience, create $_npkgs holding the total number of all packages -# 3. extract associative categories for each package into $_categories_$varpkg -# 4. extract runtime dependencies for each package into $_rundeps_$varpkg -# 5. extract a [sorted] list of categories into $PACKAGE_CATEGORIES -# 6. create $_npkgs_$varcat holding the total number of packages in category -# -# NOTE: $varpkg is the product of f_str2varname $package varpkg -# NOTE: $package is the name as it appears in the INDEX (no archive suffix) -# NOTE: We only show categories for which there are at least one package. -# NOTE: $varcat is the product of f_str2varname $category varcat -# -f_index_read() -{ - local var_to_get="${1:-PACKAGE_INDEX}" - - # Export variables required by awk(1) below - export msg_no_description_provided - export msg_all msg_all_desc - export VALID_VARNAME_CHARS - export msg_packages - - eval "$( debug= f_getvar "$var_to_get" | awk -F'|' ' - function _asorti(src, dest) - { - k = nitems = 0 - - # Copy src indices to dest and calculate array length - for (i in src) dest[++nitems] = i - - # Sort the array of indices (dest) using insertion sort method - for (i = 1; i <= nitems; k = i++) - { - idx = dest[i] - while ((k > 0) && (dest[k] > idx)) - { - dest[k+1] = dest[k] - k-- - } - dest[k+1] = idx - } - - return nitems - } - function print_category(category, npkgs, desc) - { - cat = category - # Accent the category if the first page has been - # cached (also acting as a visitation indicator) - if ( ENVIRON["_index_page_" varcat "_1"] ) - cat = cat "*" - printf "'\''%s'\'' '\''%s " packages "'\'' '\''%s'\''\n", - cat, npkgs, desc - } - BEGIN { - valid_chars = ENVIRON["VALID_VARNAME_CHARS"] - default_desc = ENVIRON["msg_no_description_provided"] - packages = ENVIRON["msg_packages"] - tpkgs = 0 - prefix = "" - } - { - tpkgs++ - varpkg = $1 - gsub("[^" valid_chars "]", "_", varpkg) - print "_categories_" varpkg "=\"" $7 "\"" - split($7, pkg_categories, /[[:space:]]+/) - for (pkg_category in pkg_categories) - categories[pkg_categories[pkg_category]]++ - print "_rundeps_" varpkg "=\"" $9 "\"" - } - END { - print "_npkgs=" tpkgs # For convenience, total package count - - n = _asorti(categories, categories_sorted) - - # Produce package counts for each category - for (i = 1; i <= n; i++) - { - cat = varcat = categories_sorted[i] - npkgs = categories[cat] - gsub("[^" valid_chars "]", "_", varcat) - print "_npkgs_" varcat "=\"" npkgs "\"" - } - - # Create menu list and generate list of categories at same time - print "CATEGORY_MENU_LIST=\"" - print_category(ENVIRON["msg_all"], tpkgs, - ENVIRON["msg_all_desc"]) - category_list = "" - for (i = 1; i <= n; i++) - { - cat = varcat = categories_sorted[i] - npkgs = categories[cat] - cur_prefix = tolower(substr(cat, 1, 1)) - if ( prefix != cur_prefix ) - prefix = cur_prefix - else - cat = " " cat - gsub("[^" valid_chars "]", "_", varcat) - desc = ENVIRON["_category_" varcat] - if ( ! desc ) desc = default_desc - print_category(cat, npkgs, desc) - category_list = category_list " " cat - } - print "\"" - - # Produce the list of categories (calculated in above block) - sub(/^ /, "", category_list) - print "PACKAGE_CATEGORIES=\"" category_list "\"" - - }' | ( exec 2<&1; dpv -ko /dev/stderr >&$TERMINAL_STDOUT_PASSTHRU \ - -b "$DIALOG_BACKTITLE" -- "$msg_reading_package_index_data" - ) )" # End-Quote -} - -# f_index_extract_pages $var_to_get $var_basename $pagesize [$category] -# -# Extracts the package INDEX ($PACKAGE_INDEX by default if/when $var_to_get is -# NULL; but should not be missing) into a series of sequential variables -# corresponding to "pages" containing up to $pagesize packages. The package -# INDEX data must be contained in the variable $var_to_get. The extracted pages -# are stored in variables ${var_basename}_# -- where "#" is a the page number. -# If $category is set, only packages for that category are extracted. -# Otherwise, if $category is "All", missing, or NULL, all packages are -# extracted and no filtering is done. -# -f_index_extract_pages() -{ - local var_to_get="${1:-PACKAGE_INDEX}" var_basename="$2" pagesize="$3" - local category="$4" # Optional - - eval "$( - debug= f_getvar "$var_to_get" | awk -F'|' \ - -v cat="$category" \ - -v pagesize="$pagesize" \ - -v var_basename="$var_basename" \ - -v i18n_all="$msg_all" ' - BEGIN { n = page = 0 } - /'\''/{ gsub(/'\''/, "'\''\\'\'\''") } - { - if ( cat !~ "(^$|^" i18n_all "$)" && $7 !~ \ - "(^|[[:space:]])" cat "([[:space:]]|$)" ) next - starting_new_page = (n++ == (pagesize * page)) - if ( starting_new_page ) - printf "%s%s", ( n > 1 ? "'\''\n" : "" ), - var_basename "_" ++page "='\''" - printf "%s%s", ( starting_new_page ? "" : "\n" ), $0 - } - END { if ( n > 0 ) print "'\''" }' - )" -} - -# f_index_search $var_to_get $name [$var_to_set] -# -# Search the package INDEX ($PACKAGE_INDEX by default if/when $var_to_get is -# NULL; but should not be missing) for $name, returning the first match. -# Matches are strict (not regular expressions) and must match the beginning -# portion of the package name to be considered a match. If $var_to_set is -# missing or NULL, output is sent to standard output. If a match is found, -# returns success; otherwise failure. -# -f_index_search() -{ - local __var_to_get="${1:-PACKAGE_INDEX}" __pkg_basename="$2" - local __var_to_set="$3" - - f_dprintf "f_index_search: Searching package data (in %s) for %s" \ - "$__var_to_get" "$__pkg_basename" - - local __pkg= - __pkg=$( debug= f_getvar "$__var_to_get" | - awk -F'|' -v basename="$__pkg_basename" ' - BEGIN { n = length(basename) } - substr($1, 0, n) == basename { print $1; exit } - ' ) - if [ ! "$__pkg" ]; then - f_dprintf "f_index_search: No packages matching %s found" \ - "$__pkg_basename" - return $FAILURE - fi - - f_dprintf "f_index_search: Found package %s" "$__pkg" - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__pkg" - else - echo "$__pkg" - fi - return $SUCCESS -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." packages/index.subr - -fi # ! $_PACKAGES_INDEX_SUBR diff --git a/bsdconfig/share/packages/musthavepkg.subr b/bsdconfig/share/packages/musthavepkg.subr deleted file mode 100644 index b336d26d9c2e..000000000000 --- a/bsdconfig/share/packages/musthavepkg.subr +++ /dev/null @@ -1,91 +0,0 @@ -if [ ! "$_PACKAGES_MUSTHAVEPKG_SUBR" ]; then _PACKAGES_MUSTHAVEPKG_SUBR=1 -# -# Copyright (c) 2014-2016 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 (INCLUDING, 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_dprintf "%s: loading includes..." packages/musthavepkg.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/mustberoot.subr - -############################################################ FUNCTIONS - -# f_musthavepkg_init -# -# Validate pkg(8) is installed and set $PKG_ABI global if not already set. -# Returns success unless pkg(8) is not installed and user refuses to install -# it (upon prompt when running interactively). -# -f_musthavepkg_init() -{ - local funcname=f_musthavepkg_init - local pkg_abi_awk=' # BEGIN-AWK - $1 ~ /^ABI/ && $0 = $NF, sub(/^"/, "") && sub(/".*/, "") { - print; found = 1; exit - } END { exit ! found } - ' # END-AWK - - if [ "$PKG_ABI" ]; then # Already set - f_dprintf "PKG_ABI=[%s]" "$PKG_ABI" - export PKG_ABI - f_quietly pkg -N -vv # return status (pkg(8) functional?) - return $? - fi - - # Attempt to get PKG_ABI without prematurely bootstrapping pkg(8) - if f_eval_catch -k PKG_ABI $funcname pkg \ - "pkg -N -vv | awk '%s'" "$pkg_abi_awk" - then - f_dprintf "PKG_ABI=[%s]" "$PKG_ABI" - export PKG_ABI - return $SUCCESS - fi - - # pkg(8) not yet bootstrapped; ask for permission unless nonInteractive - f_dialog_yesno "$msg_pkg_not_yet_installed_install_now" || - f_die 1 "$msg_must_have_pkg_to_execute" "$pgm" - - f_mustberoot_init # Have to be root to install pkg(8) - - # Bootstrap pkg(8) - f_dialog_info "$msg_bootstrapping_pkg" - f_eval_catch -k PKG_ABI $funcname pkg \ - "ASSUME_ALWAYS_YES=1 pkg -vv | awk '%s'" "$pkg_abi_awk" || - f_die 1 "$msg_must_have_pkg_to_execute" "$pgm" - - f_dprintf "PKG_ABI=[%s]" "$PKG_ABI" - export PKG_ABI - return $SUCCESS -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." packages/musthavepkg.subr - -fi # ! $_PACKAGES_MUSTHAVEPKG_SUBR diff --git a/bsdconfig/share/packages/packages.subr b/bsdconfig/share/packages/packages.subr deleted file mode 100644 index a22edd8bbb27..000000000000 --- a/bsdconfig/share/packages/packages.subr +++ /dev/null @@ -1,1194 +0,0 @@ -if [ ! "$_PACKAGES_PACKAGES_SUBR" ]; then _PACKAGES_PACKAGES_SUBR=1 -# -# Copyright (c) 2013-2016 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 (INCLUDING, 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_dprintf "%s: loading includes..." "$0" -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/media/common.subr -f_include $BSDCFG_SHARE/packages/categories.subr -f_include $BSDCFG_SHARE/packages/index.subr -f_include $BSDCFG_SHARE/packages/musthavepkg.subr -f_include $BSDCFG_SHARE/strings.subr - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -f_include_lang $BSDCFG_LIBE/include/messages.subr - -############################################################ CONFIGURATION - -# -# How many packages to display (maximum) per dialog menubox. -# -: ${PACKAGE_MENU_PAGESIZE:=2000} - -############################################################ GLOBALS - -# -# Package extensions to try -# -PACKAGE_EXTENSIONS=".txz .tbz .tbz2 .tgz" - -# -# Variables used to track runtime states -# -PACKAGES_DETECTED= # Boolean (NULL/non-NULL); detected installed packages? -PACKAGE_CATEGORIES= # List of package categories parsed from INDEX -SELECTED_PACKAGES= # Packages selected by user in [X]dialog(1) interface - -# -# Options -# -[ "${SHOW_DESC+set}" ] || SHOW_DESC=1 - -############################################################ FUNCTIONS - -# eval f_package_accent_category_menu $var_to_set $CATEGORY_MENU_LIST -# -# Accent the CATEGORY_MENU_LIST produced by f_index_read() (see -# packages/index.subr). Accented information includes adding an asterisk to the -# category name if its index has been cached, adding the number of installed -# packages for each category, and adding the number _selected_ packages for -# each category. -# -# NOTE: The reason `eval' is recommended/shown for the syntax above is because -# the $CATEGORY_MENU_LIST generated by f_index_read() is meant to be expanded -# prior to execution (it contains a series of pre-quoted strings which act as -# the interpolated command arguments). -# -f_package_accent_category_menu() -{ - local var_to_set="$1" category cat desc help varcat menu_buf n - shift 1 # var_to_set - while [ $# -gt 0 ]; do - category="${1%\*}" desc="${2%%; *}" help="$3" - shift 3 # cat/desc/help - - cat="${category# }" # Trim lead space inserted by sort-method - f_str2varname "$cat" varcat - - # Add number of installed packages for this category (if any) - n=0 - case "$cat" in - "$msg_all") debug= f_getvar "_All_ninstalled" n ;; - *) debug= f_getvar "_${varcat}_ninstalled" n ;; - esac && - [ $n -ge 1 ] && desc="$desc; $n $msg_installed_lc" - - # Add number of selected packages for this category (if any) - n=0 - case "$cat" in - "$msg_all") debug= f_getvar "_All_nselected" n ;; - *) debug= f_getvar "_${varcat}_nselected" n ;; - esac && - [ $n -ge 1 ] && desc="$desc; $n $msg_selected" - - # Re-Add asterisk to the category if its index has been cached - f_isset _index_page_${varcat}_1 && category="$category*" - - # Update buffer with modified elements - menu_buf="$menu_buf - '$category' '$desc' '$help'" # End-Quote - done - setvar "$var_to_set" "$menu_buf" # return our buffer -} - -# f_package_select $package ... -# -# Add $package to the list of tracked/selected packages. If $package is already -# being tracked (already apears in $SELECTED_PACKAGES), this function amounts -# to having no effect. -# -f_package_select() -{ - local package pkgsel - while [ $# -gt 0 ]; do - package="$1" - shift 1 # package - for pkgsel in $SELECTED_PACKAGES; do - [ "$package" = "$pkgsel" ] && return $SUCCESS - done - SELECTED_PACKAGES="$SELECTED_PACKAGES $package" - f_dprintf "Added %s to selection list" "$package" - done - SELECTED_PACKAGES="${SELECTED_PACKAGES# }" # Trim leading space -} - -# f_package_deselect $package ... -# -# Remove $package from the list of tracked/selected packages. If $package is -# not being tracked (doesn't appear in $SELECTED_PACKAGES), this function -# amounts to having no effet. -# -f_package_deselect() -{ - local package pkgsel - while [ $# -gt 1 ]; do - local new_list="" - package="$1" - shift 1 # package - for pkgsel in $SELECTED_PACKAGES; do - [ "$pkgsel" = "$package" ] && continue - new_list="$new_list${new_list:+ }$pkgsel" - done - SELECTED_PACKAGES="$new_list" - f_dprintf "Removed %s from selection list" "$package" - done -} - -# f_package_detect_installed -# -# Detect installed packages. Currently this uses pkg-query(8) for querying -# entries and marks each entry as an installed/selected package. -# -f_package_detect_installed() -{ - local package varpkg - for package in $( pkg query "%n-%v" ); do - f_str2varname $package varpkg - export _mark_$varpkg=X # exported for awk(1) ENVIRON[] - f_package_select $package - done -} - -# f_package_calculate_totals -# -# Calculate number of installed/selected packages for each category listed in -# $PACKAGE_CATEGORIES (the number of installed packages for $category is stored -# as $_${varcat}_ninstalled -- where $varcat is the product of `f_str2varname -# $category varcat' -- and number selected packages as $_${varcat}_nselected). -# Also calculates the total number of installed/selected packages stored as -# $_All_ninstalled and $_All_nselected. -# -# Calculations are performed by checking "marks". A "mark" is stored as -# $_mark_$varpkg -- where $varpkg is the product of `f_str2varname $package -# varpkg'. A mark can be "X" for an installed package, `I' for a package that -# is marked for installation, "R" for a package that is marked for re-install, -# and "U" for a package that is marked for uninstallation. If a package mark is -# NULL or a single space (e.g., " "), the package is considered to be NOT -# selected (and therefore does not increment the counts calculated herein). -# -f_package_calculate_totals() -{ - local pkg varpkg mark cat varcat pkgcat n tselected=0 tinstalled=0 - for cat in $PACKAGE_CATEGORIES; do - f_str2varname $cat varcat - setvar _${varcat}_ninstalled=0 - setvar _${varcat}_nselected=0 - done - for pkg in $SELECTED_PACKAGES; do - f_str2varname $pkg varpkg - mark= - f_getvar _mark_$varpkg mark - case "$mark" in - ""|" ") : ;; - X) tinstalled=$(( $tinstalled + 1 )) ;; - *) tselected=$(( $tselected + 1 )) - esac - f_getvar _categories_$varpkg pkgcat - for cat in $pkgcat; do - f_str2varname $cat varcat - case "$mark" in - ""|" ") : ;; - X) debug= f_getvar _${varcat}_ninstalled n - setvar _${varcat}_ninstalled $(( $n + 1 )) ;; - *) debug= f_getvar _${varcat}_nselected n - setvar _${varcat}_nselected $(( $n + 1 )) - esac - done - done - _All_nselected=$tselected - _All_ninstalled=$tinstalled -} - -# f_package_calculate_rundeps -# -# Update package dependencies by first unmarking all dependencies and then -# re-marking all dependencies of packages marked for either install ("I") or -# re-install ("R"). -# -f_package_calculate_rundeps() -{ - local pkg varpkg mark rundeps dep vardep - - # - # First unmark all the existing run-dependencies - # - f_dprintf "Unselecting package run-dependencies..." - for pkg in $SELECTED_PACKAGES; do - f_str2varname $pkg varpkg - mark= - debug= f_getvar _mark_$varpkg mark - # Only unmark if it's marked as a Dependency - if [ "$mark" = "D" ]; then - f_dprintf "%s unselected" $pkg - unset _mark_$varpkg - f_package_deselect $pkg - fi - done - - # - # Processes selected packages, adding dependencies - # - f_dprintf "Re-selecting package run-dependencies..." - for pkg in $SELECTED_PACKAGES; do - f_str2varname $pkg varpkg - mark= - debug= f_getvar _mark_$varpkg mark - # Skip pkg unless marked for [Re-]Install - [ "$mark" = "I" -o "$mark" = "R" ] || continue - f_getvar _rundeps_$varpkg rundeps - for dep in $rundeps; do - f_str2varname $dep vardep - mark= - debug= f_getvar _mark_$vardep mark - # Skip dep if already marked - [ "${mark:- }" = " " ] || continue - export _mark_$vardep="D" - f_package_select $dep - done - done - - f_dprintf "Finished recalculating dependencies." -} - -# f_package_menu_categories $var_to_set $defaultitem -# -# Dislay the menu of package categories, complete with package counts for each -# category, accents, and other miscellany. If $defaultitem is non-NULL and -# matches one of the existing menu-items, it will be pre-highlighted in the -# menu dialog (HINT: Use f_dialog_menutag_fetch() to populate a local variable -# that is passed as $defaultitem to highlight the user's last selection). -# -f_package_menu_categories() -{ - local var_to_get="$1" defaultitem="$2" - local prompt="$msg_please_select_a_category_to_display" - local menu_list=" - '> $msg_review' '$msg_review_desc' '$msg_review_help' - " # End-Quote - local hline= - - f_package_calculate_rundeps - # updates package mark variables and SELECTED_PACKAGES - f_package_calculate_totals - # creates _{varcat}_ninstalled and _{varcat}_nselected - - local category_list - debug= f_getvar "$var_to_get" category_list || return $DIALOG_CANCEL - - # Accent the category menu list with ninstalled/nselected - eval f_package_accent_category_menu category_list $category_list - - # Add list of categories to menu list - menu_list="$menu_list $category_list" - - local height width rows - eval f_dialog_menu_with_help_size height width rows \ - \"\$DIALOG_TITLE\" \ - \"\$DIALOG_BACKTITLE\" \ - \"\$prompt\" \ - \"\$hline\" \ - $menu_list - local menu_choice - menu_choice=$( eval $DIALOG \ - --title \"\$DIALOG_TITLE\" \ - --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ - --item-help \ - --default-item \"\$defaultitem\" \ - --ok-label \"$msg_select\" \ - --cancel-label \"$msg_cancel\" \ - --menu \"\$prompt\" \ - $height $width $rows \ - $menu_list \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) - local retval=$? - f_dialog_menutag_store -s "$menu_choice" - return $retval -} - -# f_package_index_get_page $category $page [$var_to_set [$var_to_get]] -# -# Obtain a [potentially cached] page of the INDEX file for a given $category. -# If $page is 1 and the cache has not yet been generated, the cache-generating -# function f_index_extract_pages() (above) is called to generate all pages -# (not just the requested page) in cache before returning the requested page. -# If $page is not 1 and there is no cached page, failure status is returned. -# -f_package_index_get_page() -{ - local category="$1" page="$2" var_to_set="$3" var_to_get="$4" varcat - f_str2varname "$category" varcat - if ! debug= f_getvar "_index_page_${varcat}_$page" $var_to_set && - [ "$page" = "1" ] - then - f_show_info "$msg_building_package_menus" - local pagesize="$PACKAGE_MENU_PAGESIZE" - f_index_extract_pages "${var_to_get:-PACKAGE_INDEX}" \ - _index_page_${varcat} "$pagesize" "$category" - debug= f_getvar _index_page_${varcat}_$page $var_to_set - - # Update category default-item because now we're cached - [ $page -eq 1 ] && - category_defaultitem="${category_defaultitem%\*}*" - else - return $FAILURE - fi -} - -# f_package_menu_select $category [$page [$defaultitem]] -# -# Display list of packages for $category, optionally $page N and with a default -# item selected. If $page is omitted, the first page is displayed (but this -# only matters if there are multiple pages; which is determined by the global -# maximum $PACKAGE_MENU_PAGESIZE). -# -# On success, if the user doesn't press ESC or choose Cancel, use -# f_dialog_menuitem_fetch() to populate a local variable with the item (not -# tag) corresponding to the user's selection. The tag portion of the user's -# selection is available through f_dialog_menutag_fetch(). -# -f_package_menu_select() -{ - local category="$1" page="${2:-1}" - local prompt= # Calculated below - local menu_list # Calculated below - local defaultitem="$3" - local hline="$hline_arrows_tab_punc_enter" - - f_isinteger "$page" || return $DIALOG_CANCEL - - local varcat - f_str2varname "$category" varcat - - # Get number of packages for this category - local npkgs=0 - case "$category" in - "$msg_all"|"") npkgs="${_npkgs:-0}" ;; - *) f_getvar _npkgs_$varcat npkgs - esac - - # Calculate number of pages - local npages=$(( ${npkgs:=0} / $PACKAGE_MENU_PAGESIZE )) - - # Add a page to the pagecount if not evenly divisible - [ $(( $npages * $PACKAGE_MENU_PAGESIZE )) -lt $npkgs ] && - npages=$(( $npages + 1 )) - - # Print some debugging information - f_dprintf "f_package_menu_select: category=[%s] npkgs=%u npages=%u" \ - "$category" "$npkgs" "$npages" - - local add_prev="" add_next="" - local previous_page="$msg_previous_page" next_page="$msg_next_page" - if [ $page -gt 1 ]; then - add_prev=1 - # Accent the `Previous Page' item with an asterisk - # if the page-before-previous is loaded/cached - f_isset _index_page_${varcat}_$(( $page - 1 )) && - previous_page="$previous_page*" - fi - if [ $page -lt $npages ]; then - add_next=1 - # Accent the `Next Page' item with an asterisk - # if the page-after-next is loaded/cached - f_isset _index_page_${varcat}_$(( $page + 1 )) && - next_page="$next_page*" - fi - - local index_page - f_package_index_get_page "$category" $page index_page - - menu_list=" - ${add_prev:+'> $previous_page' '' ${SHOW_DESC:+''}} - ${add_next:+'> $next_page' '' ${SHOW_DESC:+''}} - $( - export SHOW_DESC - export VALID_VARNAME_CHARS - echo "$index_page" | awk -F'|' -v view="port" ' - BEGIN { - valid_chars = ENVIRON["VALID_VARNAME_CHARS"] - prefix = "" - } - { - cur_prefix = tolower(substr($1, 1, 1)) - printf "'\''" - if ( prefix != cur_prefix ) - prefix = cur_prefix - else - printf " " - package = $1 - if ( view == "port" ) - desc = $2 - varpkg = package - gsub("[^" valid_chars "]", "_", varpkg) - mark = ENVIRON["_mark_" varpkg] - if ( ! mark ) mark = " " - printf "%s'\'' '\''[%c] %s'\''", - package, mark, desc - if ( ENVIRON["SHOW_DESC"] ) { - help = $4 - gsub(/'\''/, "'\''\\'\'\''", help) - printf " '\''%s'\''", help - } - printf "\n" - }' - ) - ${add_prev:+'> $previous_page' '' ${SHOW_DESC:+''}} - ${add_next:+'> $next_page' '' ${SHOW_DESC:+''}} - " # End-Quote - - # Accept/Translate i18n "All" but other category names must - # match tree definitions from INDEX, ports, FTP, etc. - case "$category" in - "$msg_all"|"") f_category_desc_get "All" prompt ;; - *) f_category_desc_get "$category" prompt ;; - esac - f_sprintf prompt "%s $msg_page_of_npages" "$prompt" "$page" "$npages" - - local mheight mwidth mrows - eval f_dialog_menu${SHOW_DESC:+_with_help}_size mheight mwidth mrows \ - \"\$DIALOG_TITLE\" \"\$DIALOG_BACKTITLE\" \ - \"\$prompt\" \"\$hline\" $menu_list - local iheight iwidth - f_dialog_infobox_size iheight iwidth \ - "$DIALOG_TITLE" "$DIALOG_BACKTITLE" \ - "$msg_processing_selection" - - local menu_choice - menu_choice=$( eval $DIALOG \ - --title \"\$DIALOG_TITLE\" \ - --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ - --keep-tite \ - --ok-label \"$msg_select\" \ - --cancel-label \"$msg_back\" \ - ${SHOW_DESC:+--item-help} \ - --default-item \"\$defaultitem\" \ - --menu \"\$prompt\" \ - $mheight $mwidth $mrows \ - $menu_list \ - --and-widget \ - ${USE_XDIALOG:+--no-buttons} \ - --infobox \"\$msg_processing_selection\" \ - $iheight $iwidth \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) - local retval=$? - f_dialog_data_sanitize menu_choice - f_dialog_menutag_store "$menu_choice" - - if [ $retval -eq $DIALOG_OK ]; then - local item - item=$( eval f_dialog_menutag2item${SHOW_DESC:+_with_help} \ - \"\$menu_choice\" $menu_list ) - f_dialog_menuitem_store "$item" - fi - - return $retval -} - -# f_package_menu_deselect $package -# -# Display a menu, asking the user what they would like to do with $package -# with regard to "deselecting" an already installed package. Choices include -# uninstall, re-install, or cancel (leave $package marked as installed). -# Returns success if the user does not press ESC or choose Cnacel. Use the -# f_dialog_menutag_fetch() function upon success to retrieve the user's choice. -# -f_package_menu_deselect() -{ - local package="$1" - local prompt # Calculated below - local menu_list=" - 'X $msg_installed' '$msg_installed_desc' - 'R $msg_reinstall' '$msg_reinstall_desc' - 'U $msg_uninstall' '$msg_uninstall_desc' - " # End-Quote - local hline="$hline_alnum_arrows_punc_tab_enter" - - f_sprintf prompt "$msg_what_would_you_like_to_do_with" "$package" - - local height width rows - eval f_dialog_menu_size height width rows \ - \"\$DIALOG_TITLE\" \ - \"\$DIALOG_BACKTITLE\" \ - \"\$prompt\" \ - \"\$hline\" \ - $menu_list - local menu_choice - menu_choice=$( eval $DIALOG \ - --title \"\$DIALOG_TITLE\" \ - --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ - --ok-label \"$msg_select\" \ - --cancel-label \"$msg_cancel\" \ - --menu \"\$prompt\" \ - $height $width $rows \ - $menu_list \ - 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD - ) - local retval=$? - f_dialog_menutag_store -s "$menu_choice" - return $retval -} - -# f_package_review -# -# Display a review screen, showing selected packages and what they are marked -# for, before proceeding (if the user does not press ESC or choose Cancel) to -# operate on each selection. Returns error if no packages have been selected, -# or the user has pressed ESC, or if they have chosen Cancel. -# -f_package_review() -{ - local funcname=f_package_review - local prompt # Calculated below - local menu_list # Calculated below - local hline="$hline_alnum_arrows_punc_tab_enter" - - f_dprintf "$funcname: SELECTED_PACKAGES=[%s]" "$SELECTED_PACKAGES" - - f_sprintf prompt "$msg_reviewing_selected_packages" "$_All_nselected" - - local package varpkg mark - for package in $SELECTED_PACKAGES; do - mark= - f_str2varname "$package" varpkg - f_getvar _mark_$varpkg mark - [ "$mark" -a ! "${mark#[IRUD]}" ] || continue - menu_list="$menu_list - '$mark' '$package' - " # End-Quote - done - if [ ! "$menu_list" ]; then - f_show_msg "$msg_no_packages_were_selected_for_extraction" - return $DIALOG_CANCEL # Might have selected this by accident - fi - menu_list=$( echo "$menu_list" | sort ) - - local height width rows - eval f_dialog_menu_size height width rows \ - \"\$DIALOG_TITLE\" \ - \"\$DIALOG_BACKTITLE\" \ - \"\$prompt\" \ - \"\$hline\" \ - $menu_list - - # Show the review menu (ignore menu choice) - eval $DIALOG \ - --title \"\$DIALOG_TITLE\" \ - --backtitle \"\$DIALOG_BACKTITLE\" \ - --hline \"\$hline\" \ - --ok-label \"\$msg_proceed\" \ - --cancel-label \"\$msg_cancel\" \ - --menu \"\$prompt\" \ - $height $width $rows \ - $menu_list \ - 2> /dev/null || return $? - # Return if the user pressed ESC or chose Cancel/No - - # - # Process each of the selected packages: - # + First, process packages marked for Install. - # + Second, process packages marked for Re-install. - # + Finally, process packages marked for Uninstall. - # - for package in $SELECTED_PACKAGES; do - mark= - f_str2varname "$package" varpkg - debug= f_getvar _mark_$varpkg mark - [ "$mark" = "I" ] || continue - f_dprintf "$funcname: Installing %s package" "$package" - f_package_add "$package" - done - for package in $SELECTED_PACKAGES; do - mark= - f_str2varname "$package" varpkg - debug= f_getvar _mark_$varpkg mark - [ "$mark" = "R" ] || continue - f_dprintf "$funcname: Reinstalling %s package" "$package" - f_package_reinstall "$package" - done - for package in $SELECTED_PACKAGES; do - mark= - f_str2varname "$package" varpkg - debug= f_getvar _mark_$varpkg mark - [ "$mark" = "U" ] || continue - f_dprintf "$funcname: Uninstalling %s package" "$package" - f_package_delete "$package" || continue - f_package_deselect "$package" - done - - return $DIALOG_OK -} - -# f_package_config -# -# Allow the user to configure packages and install them. Initially, a list of -# package categories is loaded/displayed. When the user selects a category, -# the menus for that category are built (unlike sysinstall which built all -# category menus up-front -- which also took forever, despite the fact that -# few people visit more than a couple of categories each time). -# -f_package_config() -{ - # Did we get an INDEX? - f_index_initialize || return $FAILURE - # Creates following variables (indirectly via f_index_read()) - # CATEGORY_MENU_LIST _categories_{varpkg} _rundeps_{varpkg} - # PACKAGE_CATEGORIES _npkgs - - f_show_info "$msg_building_package_main_menu" - - # Detect installed packages (updates marks/SELECTED_PACKAGES) - f_package_detect_installed - export PACKAGES_DETECTED=1 # exported for awk(1) ENVIRON[] - - local retval category varcat defaultitem category_defaultitem="" - while :; do - # Display the list of package categories - f_package_menu_categories \ - CATEGORY_MENU_LIST "$category_defaultitem" - retval=$? - f_dialog_menutag_fetch category - f_dprintf "retval=%u mtag=[%s]" $retval "$category" - category_defaultitem="$category" - - [ $retval -eq $DIALOG_OK ] || break - - # Maybe the user chose an action (like `Review') - case "$category" in - "> $msg_review") - f_package_review && break - continue ;; - "> "*) - continue - esac - - # Anything else is a package category - - category=${category# } # Trim leading space if present - category=${category%\*} # Trim trailing asterisk if present - - f_str2varname "$category" varcat - - local page package varpkg mark menu_choice - while :; do - # Display the list of packages for selected category - page=1 defaultitem="" - f_getvar _defaultitem_$varcat defaultitem - f_getvar _defaultpage_$varcat page - f_package_menu_select \ - "$category" "${page:=1}" "$defaultitem" - retval=$? - f_dialog_menutag_fetch menu_choice - f_dprintf "retval=%u mtag=[%s]" $retval "$menu_choice" - - # NOTE: When --and-widget is used only ESC will cause - # dialog(1) to return without going to the next widget. - # This is alright in our case as we can still detect - # the Cancel button because stdout will be NULL. - # Alternatively, Xdialog(1) will terminate with 1 - # if/when Cancel is chosen on any widget. - if [ $retval -eq $DIALOG_ESC -o ! "$menu_choice" ] - then - break - elif [ $retval -eq $DIALOG_CANCEL ]; then - # Using X11, Xdialog(1) returned 1 for Cancel - f_show_msg "%s" "$menu_choice" - break - elif [ $retval -ne $DIALOG_OK ]; then - # X11-related error occurred using Xdialog(1) - f_show_msg "%s" "$menu_choice" - break - fi - - defaultitem="$menu_choice" - - # NOTE: f_package_menu_select() does not show the - # `Previous Page' or `Next Page' items unless needed - case "$menu_choice" in - "> $msg_previous_page"|"> $msg_previous_page*") - page=$(( $page - 1 )) - setvar _defaultpage_$varcat $page - # Update default-item to match accent that will - # be applied by f_package_menu_select(); if the - # page-before-prev is cached, add an asterisk. - if f_isset \ - _index_page_${varcat}_$(( $page - 1 )) - then - defaultitem="${defaultitem%\*}*" - else - defaultitem="${defaultitem%\*}" - fi - setvar _defaultitem_$varcat "$defaultitem" - continue ;; - "> $msg_next_page"|"> $msg_next_page*") - page=$(( $page + 1 )) - setvar _defaultpage_$varcat $page - # Update default-item to match accent that will - # be applied by f_package_menu_select(); if the - # page-after-next is cached, add an asterisk. - if f_isset \ - _index_page_${varcat}_$(( $page + 1 )) - then - defaultitem="${defaultitem%\*}*" - else - defaultitem="${defaultitem%\*}" - fi - setvar _defaultitem_$varcat "$defaultitem" - continue ;; - "> "*) # Unknown navigation/action item - setvar _defaultpage_$varcat $page - continue ;; # Do not treat as a package - *) - setvar _defaultitem_$varcat "$defaultitem" - esac - - # Treat any other selection as a package - package="${menu_choice# }" # Trim leading space - f_str2varname $package varpkg - f_dialog_menuitem_fetch mark - mark="${mark#?}" - mark="${mark%%\] *}" - case "$mark" in - "I") - mark=" " - f_package_deselect $package - ;; - " "|"D") - mark="I" - f_package_select $package - ;; - "X"|"R"|"U") - f_package_menu_deselect $package || continue - f_dialog_menutag_fetch menu_choice - case "$menu_choice" in - "X $msg_installed") - f_package_deselect "$package" - mark="X" - ;; - "R $msg_reinstall") - f_package_select "$package" - mark="R" - ;; - "U $msg_uninstall") - f_package_select "$package" - mark="U" - ;; - esac - ;; - esac - export _mark_$varpkg="$mark" - # NOTE: exported for awk(1) ENVIRON[] - done - done -} - -# f_package_add $package_name [$depended] -# -# Like f_package_extract(), but assumes current media device and chases deps. -# Note that $package_name should not contain the archive suffix (e.g., `.tbz'). -# If $depended is present and non-NULL, the package is treated as a dependency -# (in this function, dependencies are not handled any differently, but the -# f_package_extract() function is passed this value and it displays a different -# message when installing a dependency versus non-dependency). -# -f_package_add() -{ - local name="$1" depended="$2" status=$SUCCESS retval - - local alert=f_show_msg no_confirm= - f_getvar $VAR_NO_CONFIRM no_confirm - [ "$no_confirm" ] && alert=f_show_info - - if ! { [ "$name" ] || { f_getvar $VAR_PACKAGE name && [ "$name" ]; }; } - then - f_dprintf "packageAdd: %s" \ - "$msg_no_package_name_passed_in_package_variable" - return $FAILURE - fi - - { # Verify and initialize device media if-defined - f_media_verify && - f_device_init device_media && - f_index_initialize - } || return $FAILURE - - # Now we have (indirectly via f_index_read()): - # CATEGORY_MENU_LIST _categories_{varpkg} _rundeps_{varpkg} - # PACKAGE_CATEGORIES _npkgs - - local varpkg - f_str2varname "$name" varpkg - - # Just as-in the user-interface (opposed to scripted-use), only allow - # packages with at least one category to be recognized. - # - local pkgcat= - if ! f_getvar _categories_$varpkg pkgcat || [ ! "$pkgcat" ]; then - # $pkg may be a partial name, search the index (this is slow) - f_index_search PACKAGE_INDEX $name name - if [ ! "$name" ]; then - f_show_msg \ - "$msg_sorry_package_was_not_found_in_the_index" \ - "$name" - return $FAILURE - fi - f_str2varname "$name" varpkg - fi - - # If invoked through the scripted interface, we likely have not yet - # detected the installed packages -- something we should do only once. - # - if [ ! "$PACKAGES_DETECTED" ]; then - f_dprintf "f_package_add: Detecting installed packages" - f_package_detect_installed - export PACKAGES_DETECTED=1 # exported for awk(1) ENVIRON[] - fi - # Now we have: _mark_{varpkg}=X for all installed packages - - # - # Since we're maintaining data structures for installed packages, - # short-circuit the package dependency checks if the package is already - # installed. This prevents wasted cycles, minor delays between package - # extractions, and worst-case an infinite loop with a certain faulty - # INDEX file. - # - local mark= - f_getvar _mark_$varpkg mark && [ "$mark" = "X" ] && return $SUCCESS - - local dep vardep rundeps= - f_getvar _rundeps_$varpkg rundeps - for dep in $rundeps; do - f_str2varname "$dep" vardep - - # Skip dependency if already installed - mark= - f_getvar _mark_$vardep mark && [ "$mark" = "X" ] && continue - - # Just as-in the user-interface (opposed to scripted-use), only - # allow packages with at least one category to be recognized. - # - local depcat= - if ! f_getvar _categories_$vardep depcat || [ ! "$depcat" ] - then - $alert "$msg_required_package_not_found" "$dep" - [ "$no_confirm" ] && sleep 2 - fi - - f_package_add "$dep" - retval=$? - if [ $retval -ne $SUCCESS ]; then - status=$(( $status | $retval )) - - # XXX package could be on a future disc volume - # XXX (not supporting multiple disc volumes yet) - - $alert "$msg_loading_of_dependent_package_failed" \ - "$dep" - [ "$no_confirm" ] && sleep 2 - fi - done - [ $status -eq $SUCCESS ] || return $status - - # - # Done with the deps? Try to load the real m'coy. - # - - f_package_extract device_media "$name" "$depended" - retval=$? - if [ $retval -ne $SUCCESS ]; then - status=$(( $status | $retval )) - else - setvar _mark_$varpkg X - fi - - return $status -} - -# f_package_extract $device $name [$depended] -# -# Extract a package based on a namespec and media device. If $depended is -# present and non-NULL, the notification displayed while installing the package -# has "as a dependency" appended. -# -f_package_extract() -{ - local funcname=f_package_extract - local device="$1" name="$2" depended="$3" - local devname= - - f_musthavepkg_init # Make sure we have a usable pkg(8) with $PKG_ABI - - $device get name devname - f_dprintf "$funcname: device=[%s] name=[%s] depended=[%s]" \ - "$devname" "$name" "$depended" - - # Check to make sure it's not already there - local varpkg mark= - f_str2varname "$name" varpkg - f_getvar _mark_$varpkg mark - [ "$mark" = "X" ] && return $SUCCESS - - if ! f_device_init $device; then - f_show_msg \ - "$msg_unable_to_initialize_media_type_for_package_extract" - return $FAILURE - fi - - # If necessary, initialize the ldconfig hints - [ -f "/var/run/ld-elf.so.hints" ] || - f_quietly ldconfig /usr/lib /usr/lib/compat /usr/local/lib - - # Make a couple paranoid locations for temp - # files to live if user specified none - local tmpdir - f_getvar $VAR_PKG_TMPDIR:-/var/tmp tmpdir - f_quietly mkdir -p -m 1777 "$tmpdir" - - local path device_type - $device get type device_type - case "$name" in - */*) path="$name" ;; - *) - if [ "$device_type" = "$DEVICE_TYPE_HTTP" ]; then - path="$PKG_ABI/latest/All/$name" - else - path="packages/$PKG_ABI/All/$name" - fi - esac - - # We have a path, call the device strategy routine to check the file - local pkg_ext found= - for pkg_ext in "" $PACKAGE_EXTENSIONS; do - if f_device_get $device "$path$pkg_ext" $PROBE_EXIST; then - path="$path$pkg_ext" - found=1 - break - elif [ "$device_type" = "$DEVICE_TYPE_HTTP" ] && - f_device_get $device \ - "packages/$PKG_ABI/All/$name$pkg_ext" $PROBE_EXIST - then - # Mirroring physical media over HTTP - path="packages/$PKG_ABI/All/$name$pkg_ext" - found=1 - break - fi - done - [ "$found" ] && f_dprintf "$funcname: found path=[%s] dev=[%s]" \ - "$path" "$devname" - - local alert=f_show_msg no_confirm= - f_getvar $VAR_NO_CONFIRM no_confirm - [ "$no_confirm" ] && alert=f_show_info - - if [ ! "$found" ]; then - f_dprintf "$funcname: No such %s file on %s device" \ - "$path" "$devname" - $alert "$msg_unable_to_fetch_package_from_selected_media" \ - "$name" - [ "$no_confirm" ] && sleep 2 - return $FAILURE - fi - - if [ "$depended" ]; then - f_show_info "$msg_adding_package_as_a_dependency_from_media" \ - "$name" "$devname" - else - f_show_info "$msg_adding_package_from_media" "$name" "$devname" - fi - - # Request the package be added via pkg-install(8) - if f_debugging; then - f_eval_catch $funcname pkg \ - 'pkg -d install -${depended:+A}y "%s"' "$name" - else - f_eval_catch $funcname pkg \ - 'pkg install -${depended:+A}y "%s"' "$name" - fi - if [ $? -ne $SUCCESS ]; then - $alert "$msg_pkg_install_apparently_did_not_like_the_package" \ - "$name" - [ "$no_confirm" ] && sleep 2 - else - f_show_info "$msg_package_was_added_successfully" "$name" - sleep 1 - fi - - return $SUCCESS -} - -# f_package_delete $name -# -# Delete package by full $name (lacks archive suffix; e.g., `.tbz'). -# -f_package_delete() -{ - local funcname=f_package_delete - local name="$1" - - if ! { [ "$name" ] || { f_getvar $VAR_PACKAGE name && [ "$name" ]; }; } - then - f_dprintf "packageDelete: %s" \ - "$msg_no_package_name_passed_in_package_variable" - return $FAILURE - fi - - f_dprintf "$funcname: name=[%s]" "$name" - - [ "$name" ] || return $FAILURE - - { # Verify and initialize device media if-defined - f_media_verify && - f_device_init device_media && - f_index_initialize - } || return $FAILURE - - # Now we have (indirectly via f_index_read()): - # CATEGORY_MENU_LIST _categories_{varpkg} _rundeps_{varpkg} - # PACKAGE_CATEGORIES _npkgs - - local varpkg - f_str2varname "$name" varpkg - - # Just as-in the user-interface (opposed to scripted-use), only allow - # packages with at least one category to be recognized. - # - local pkgcat= - if ! f_getvar _categories_$varpkg pkgcat || [ ! "$pkgcat" ]; then - # $pkg may be a partial name, search the index (this is slow) - f_index_search PACKAGE_INDEX "$name" name - if [ ! "$name" ]; then - f_show_msg \ - "$msg_sorry_package_was_not_found_in_the_index" \ - "$name" - return $FAILURE - fi - f_str2varname "$name" varpkg - fi - - # If invoked through the scripted interface, we likely have not yet - # detected the installed packages -- something we should do only once. - # - if [ ! "$PACKAGES_DETECTED" ]; then - f_dprintf "$funcname: Detecting installed packages" - f_package_detect_installed - export PACKAGES_DETECTED=1 # exported for awk(1) ENVIRON[] - fi - # Now we have: _mark_{varpkg}=X for all installed packages - - # - # Return failure if the package is not already installed. - # - local pkgmark= - f_getvar _mark_$varpkg pkgmark - if ! [ "$pkgmark" -a ! "${pkgmark#[XUR]}" ]; then - f_show_msg "$msg_package_not_installed_cannot_delete" "$name" - return $FAILURE - fi - - # - # Check for dependencies - # - local pkgsel depc=0 udeps= - for pkgsel in $SELECTED_PACKAGES; do - local mark= - f_str2varname $pkgsel varpkg - debug= f_getvar _mark_$varpkg mark - [ "$mark" -a ! "${mark#[XUR]}" ] || continue - local dep rundeps= - debug= f_getvar _rundeps_$varpkg rundeps - for dep in $rundeps; do - if [ "$dep" = "$name" ]; then - # Maybe this package is marked for deletion too - if [ "$mark" = "U" ]; then - udeps="$udeps $pkgsel" - else - depc=$(( $depc + 1 )) - fi - break - fi - done - done - if [ $depc -gt 0 ]; then - local grammatical_s= - [ $depc -gt 1 ] && grammatical_s=s - f_show_msg \ - "$msg_package_is_needed_by_other_installed_packages" \ - "$name" "$depc" "$grammatical_s" - return $FAILURE - fi - - # - # Chase dependencies that are marked for uninstallation - # - for pkgsel in $udeps; do - f_dprintf "$funcname: Uninstalling dependency %s (%s)" \ - "$pkgsel" "marked for delete" - f_package_delete "$pkgsel" - done - - # - # OK to perform the delete (no other packages depend on it)... - # - f_show_info "$msg_uninstalling_package_waiting_for_pkg_delete" "$name" - if f_debugging; then - f_eval_catch $funcname pkg 'pkg -d delete -y "%s"' "$name" - else - f_eval_catch $funcname pkg 'pkg delete -y "%s"' "$name" - fi - if [ $? -ne $SUCCESS ]; then - f_show_msg "$msg_pkg_delete_failed" "$name" - return $FAILURE - else - f_dprintf "$funcname: pkg-delete(8) of %s successful" "$name" - f_str2varname "$name" varpkg - setvar _mark_$varpkg "" - fi -} - -# f_package_reinstall $name -# -# A simple wrapper to f_package_delete() + f_package_add() -# -f_package_reinstall() -{ - f_package_delete "$1" && f_package_add "$1" -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." packages/packages.subr - -fi # ! $_PACKAGES_PACKAGES_SUBR diff --git a/bsdconfig/share/script.subr b/bsdconfig/share/script.subr deleted file mode 100644 index b562e99b7303..000000000000 --- a/bsdconfig/share/script.subr +++ /dev/null @@ -1,219 +0,0 @@ -if [ ! "$_SCRIPT_SUBR" ]; then _SCRIPT_SUBR=1 -# -# Copyright (c) 2012-2014 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 (INCLUDING, 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_dprintf "%s: loading includes..." script.subr -f_include $BSDCFG_SHARE/device.subr -f_include $BSDCFG_SHARE/media/any.subr -f_include $BSDCFG_SHARE/media/tcpip.subr -f_include $BSDCFG_SHARE/mustberoot.subr -f_include $BSDCFG_SHARE/networking/services.subr -f_include $BSDCFG_SHARE/packages/packages.subr -f_include $BSDCFG_SHARE/usermgmt/group.subr -f_include $BSDCFG_SHARE/usermgmt/user.subr -f_include $BSDCFG_SHARE/variable.subr - -############################################################ GLOBALS - -RESWORDS= - -############################################################ FUNCTIONS - -# f_resword_new $resword $function -# -# Create a new `reserved' word for scripting purposes. Reswords call pre- -# defined functions but differ from those functions in the following ways: -# -# + Unless noError is set (must be non-NULL), if calling the resword -# results in failure, the application will terminate prematurely. -# + noError is unset after each/every resword is called. -# -# Reswords should not be used in bsdconfig itself (hence the name `reserved -# word') but instead only in scripts loaded through f_script_load(). -# -f_resword_new() -{ - local resword="$1" func="$2" - [ "$resword" ] || return $FAILURE - f_dprintf "script.subr: New resWord %s -> %s" "$resword" "$func" - eval $resword\(\){ f_dispatch $func $resword \"\$@\"\; } - RESWORDS="$RESWORDS${RESWORDS:+ }$resword" -} - -# f_dispatch $func $resword -# -# Wrapper function used by `reserved words' (reswords) to call other functions. -# If $noError is set and non-NULL, a failure result from $func is ignored, -# otherwise the application is prematurely terminated using f_die(). -# -# NOTE: $noError is unset after every call. -# -f_dispatch() -{ - local func="$1" resword="$2" - shift 2 # func resword - f_dprintf "f_dispatch: calling resword \`%s'" "$resword" - eval $func "$@" - local retval=$? - if [ $retval -ne $SUCCESS ]; then - local _ignore_this_error - f_getvar $VAR_NO_ERROR _ignore_this_error - [ "$_ignore_this_error" ] || f_die $retval \ - "$msg_command_failed_rest_of_script_aborted" "$resword" - fi - unset $VAR_NO_ERROR -} - -# f_script_load [$file] -# -# Load a script (usually filled with reswords). If $file is missing or NULL, -# use one of the following instead (in order): -# -# $configFile (global) -# install.cfg -# /stand/install.fg -# /tmp/install.cfg -# -# Unknown/unregistered reswords will generate sh(1) syntax errors but not cause -# premature termination. -# -# Returns success if a script was loaded and itself returned success. -# -f_script_load() -{ - local funcname=f_script_load - local script="$1" config_file retval=$SUCCESS - - f_dprintf "$funcname: script=[%s]" "$script" - if [ ! "$script" ]; then - f_getvar $VAR_CONFIG_FILE config_file - for script in \ - $config_file \ - install.cfg \ - /stand/install.cfg \ - /tmp/install.cfg \ - ; do - [ -e "$script" ] && break - done - fi - - local old_interactive= - f_getvar $VAR_NONINTERACTIVE old_interactive # save a copy - - # Hint to others that we're running from a script, should they care - setvar $VAR_NONINTERACTIVE yes - - if [ "$script" = "-" ]; then - f_dprintf "$funcname: Loading script from stdin" - eval "$( cat )" - retval=$? - else - f_dprintf "$funcname: Loading script \`%s'" "$script" - if [ ! -e "$script" ]; then - f_show_msg "$msg_unable_to_open" "$script" - return $FAILURE - fi - . "$script" - retval=$? - fi - - [ "$old_interactive" ] && - setvar $VAR_NONINTERACTIVE "$old_interactive" - - return $retval -} - -############################################################ MAIN - -# -# Reserved words meant for scripting -# - -# this file -f_resword_new loadConfig f_script_load - -# device.subr -f_resword_new deviceRescan f_device_rescan - -# media/common.subr -f_resword_new mediaOpen f_media_open -f_resword_new mediaClose f_media_close - -# media includes -f_resword_new mediaGetType f_media_get_type # media/any.subr -f_resword_new mediaSetCDROM f_media_set_cdrom # media/cdrom.subr -f_resword_new mediaSetDOS f_media_set_dos # media/dos.subr -f_resword_new mediaSetDirectory f_media_set_directory # media/directory.subr -f_resword_new mediaSetFloppy f_media_set_floppy # media/floppy.subr -f_resword_new mediaSetNFS f_media_set_nfs # media/nfs.subr -f_resword_new mediaSetUFS f_media_set_ufs # media/ufs.subr -f_resword_new mediaSetUSB f_media_set_usb # media/usb.subr -f_resword_new optionsEditor f_media_options_menu # media/options.subr -f_resword_new tcpMenuSelect f_dialog_menu_select_tcp # media/tcp.subr - -# media/ftp.subr -f_resword_new mediaSetFTP f_media_set_ftp -f_resword_new mediaSetFTPActive f_media_set_ftp_active -f_resword_new mediaSetFTPPassive f_media_set_ftp_passive -f_resword_new mediaSetFTPUserPass f_media_set_ftp_userpass - -# media/http.subr -f_resword_new mediaSetHTTP f_media_set_http - -# media/httpproxy.subr -f_resword_new mediaSetHTTPProxy f_media_set_http_proxy - -# networking/services.subr -f_resword_new configPCNFSD f_config_pcnfsd - -# packages/packages.subr -f_resword_new configPackages f_package_config -f_resword_new packageAdd f_package_add -f_resword_new packageDelete f_package_delete -f_resword_new packageReinstall f_package_reinstall - -# usermgmt/group.subr -f_resword_new addGroup f_group_add -f_resword_new deleteGroup f_group_delete -f_resword_new editGroup f_group_edit - -# usermgmt/user.subr -f_resword_new addUser f_user_add -f_resword_new deleteUser f_user_delete -f_resword_new editUser f_user_edit - -# variable.subr -f_resword_new installVarDefaults f_variable_set_defaults -f_resword_new dumpVariables f_dump_variables - -f_dprintf "%s: Successfully loaded." script.subr - -fi # ! $_SCRIPT_SUBR diff --git a/bsdconfig/share/strings.subr b/bsdconfig/share/strings.subr deleted file mode 100644 index f33f4df566ad..000000000000 --- a/bsdconfig/share/strings.subr +++ /dev/null @@ -1,577 +0,0 @@ -if [ ! "$_STRINGS_SUBR" ]; then _STRINGS_SUBR=1 -# -# Copyright (c) 2006-2016 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 (INCLUDING, 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 - -############################################################ GLOBALS - -# -# A Literal newline (for use with f_replace_all(), or IFS, or whatever) -# -NL=" -" # END-QUOTE - -# -# Valid characters that can appear in an sh(1) variable name -# -# Please note that the character ranges A-Z and a-z should be avoided because -# these can include accent characters (which are not valid in a variable name). -# For example, A-Z matches any character that sorts after A but before Z, -# including A and Z. Although ASCII order would make more sense, that is not -# how it works. -# -VALID_VARNAME_CHARS="0-9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_" - -############################################################ FUNCTIONS - -# f_isinteger $arg -# -# Returns true if argument is a positive/negative whole integer. -# -f_isinteger() -{ - local arg="${1#-}" - [ "${arg:-x}" = "${arg%[!0-9]*}" ] -} - -# f_substr [-v $var_to_set] $string $start [$length] -# -# Similar to awk(1)'s substr(), return length substring of string that begins -# at start position counted from 1. -# -case "$BASH_VERSION" in -*?*) - f_substr() - { - local __var_to_set= - case "$1" in - -v) __var_to_set="$2"; shift 2 ;; - -v?*) __var_to_set="${2#-v}"; shift 1 ;; - esac - local __tmp="$1" __start="${2:-1}" __len="$3" - [ "$__start" -gt 0 ] 2> /dev/null && - __start=$(( $__start - 1 )) - if [ ! "$__var_to_set" ]; then - eval echo \"\${__tmp:\$__start${__len:+:\$__len}}\" - return $? - fi - if [ "$__len" ]; then - eval $__var_to_set=\"\${__tmp:\$__start:\$__len}\" - else - eval $__var_to_set=\"\${__tmp:\$__start}\" - fi - } - ;; -*) - # NB: On FreeBSD, sh(1) runs this faster than bash(1) runs the above - f_substr() - { - local OPTIND=1 OPTARG __flag __var_to_set= - while getopts v: __flag; do - case "$__flag" in - v) __var_to_set="$OPTARG" ;; - esac - done - shift $(( $OPTIND - 1 )) - - local __tmp="$1" __start="${2:-1}" __size="$3" - local __tbuf __tbuf_len __trim __trimq - - if [ ! "$__tmp" ]; then - [ "$__var_to_set" ] && setvar "$__var_to_set" "" - return ${SUCCESS:-0} - fi - [ "$__start" -ge 1 ] 2> /dev/null || __start=1 - if ! [ "${__size:-1}" -ge 1 ] 2> /dev/null; then - [ "$__var_to_set" ] && setvar "$__var_to_set" "" - return ${FAILURE:-1} - fi - - __trim=$(( $__start - 1 )) - while [ $__trim -gt 0 ]; do - __tbuf="?" - __tbuf_len=1 - while [ $__tbuf_len -lt $(( $__trim / $__tbuf_len )) ] - do - __tbuf="$__tbuf?" - __tbuf_len=$(( $__tbuf_len + 1 )) - done - __trimq=$(( $__trim / $__tbuf_len )) - __trim=$(( $__trim - $__tbuf_len * $__trimq )) - while [ $__trimq -gt 0 ]; do - __tmp="${__tmp#$__tbuf}" - __trimq=$(( $__trimq - 1 )) - done - done - - local __tmp_size=${#__tmp} - local __mask __mask_len - __trim=$(( $__tmp_size - ${__size:-$__tmp_size} )) - while [ $__trim -gt 0 ]; do - __tbuf="?" - __tbuf_len=1 - if [ $__trim -le $__size ]; then - while [ $__tbuf_len -lt $(( - $__trim / $__tbuf_len - )) ]; do - __tbuf="$__tbuf?" - __tbuf_len=$(( $__tbuf_len + 1 )) - done - __trimq=$(( $__trim / $__tbuf_len )) - __trim=$(( $__trim - $__tbuf_len * $__trimq )) - while [ $__trimq -gt 0 ]; do - __tmp="${__tmp%$__tbuf}" - __trimq=$(( $__trimq - 1 )) - done - else - __mask="$__tmp" - while [ $__tbuf_len -lt $(( - $__size / $__tbuf_len - )) ]; do - __tbuf="$__tbuf?" - __tbuf_len=$(( $__tbuf_len + 1 )) - done - __trimq=$(( $__size / $__tbuf_len )) - if [ $__size -ne $(( - $__trimq * $__tbuf_len - )) ]; then - __tbuf="$__tbuf?" - __tbuf_len=$(( $__tbuf_len + 1 )) - fi - __mask_len=$(( - $__tmp_size - $__tbuf_len * $__trimq - )) - __trim=$(( - $__tmp_size - $__mask_len - $__size - )) - while [ $__trimq -gt 0 ]; do - __mask="${__mask#$__tbuf}" - __trimq=$(( $__trimq - 1 )) - done - __tmp="${__tmp%"$__mask"}" - fi - done - - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__tmp" - else - echo "$__tmp" - fi - } -esac - -# f_sprintf $var_to_set $format [$arguments ...] -# -# Similar to sprintf(3), write a string into $var_to_set using printf(1) syntax -# (`$format [$arguments ...]'). -# -case "$BASH_VERSION" in -3.1*|4.*) - f_sprintf() - { - local __var_to_set="$1" __tmp - shift 1 # var_to_set - printf -v __tmp "$@" - eval "$__var_to_set"=\"\${__tmp%\$NL}\" - } - ;; -*) - # NB: On FreeBSD, sh(1) runs this faster than bash(1) runs the above - f_sprintf() - { - local __var_to_set="$1" - shift 1 # var_to_set - eval "$__var_to_set"=\$\( printf -- \"\$@\" \) - } -esac - -# f_vsprintf $var_to_set $format $format_args -# -# Similar to vsprintf(3), write a string into $var_to_set using printf(1) -# syntax (`$format $format_args'). -# -f_vsprintf() -{ - eval f_sprintf \"\$1\" \"\$2\" $3 -} - -# f_snprintf $var_to_set $size $format [$arguments ...] -# -# Similar to snprintf(3), write at most $size number of bytes into $var_to_set -# using printf(1) syntax (`$format [$arguments ...]'). -# -f_snprintf() -{ - local __var_to_set="$1" __size="$2" - shift 2 # var_to_set size - - local __f_snprintf_tmp - f_sprintf __f_snprintf_tmp "$@" - f_substr "$__var_to_set" "$__f_snprintf_tmp" 1 "$__size" -} - -# f_vsnprintf $var_to_set $size $format $format_args -# -# Similar to vsnprintf(3), write at most $size number of bytes into $var_to_set -# using printf(1) syntax (`$format $format_args'). The value of $var_to_set is -# NULL unless at-least one byte is stored from the output. -# -# Example 1: -# -# limit=7 format="%s" -# format_args="'abc 123'" # 3-spaces between abc and 123 -# f_vsnprintf foo $limit "$format" "$format_args" # foo=[abc 1] -# -# Example 2: -# -# limit=12 format="%s %s" -# format_args=" 'doghouse' 'fox' " -# # even more spaces added to illustrate escape-method -# f_vsnprintf foo $limit "$format" "$format_args" # foo=[doghouse fox] -# -# Example 3: -# -# limit=13 format="%s %s" -# f_shell_escape arg1 'aaa"aaa' # arg1=[aaa"aaa] (no change) -# f_shell_escape arg2 "aaa'aaa" # arg2=[aaa'\''aaa] (escaped s-quote) -# format_args="'$arg1' '$arg2'" # use single-quotes to surround args -# f_vsnprintf foo $limit "$format" "$format_args" # foo=[aaa"aaa aaa'a] -# -# In all of the above examples, the call to f_vsnprintf() does not change. Only -# the contents of $limit, $format, and $format_args changes in each example. -# -f_vsnprintf() -{ - eval f_snprintf \"\$1\" \"\$2\" \"\$3\" $4 -} - -# f_replaceall $string $find $replace [$var_to_set] -# -# Replace all occurrences of $find in $string with $replace. If $var_to_set is -# either missing or NULL, the variable name is produced on standard out for -# capturing in a sub-shell (which is less recommended due to performance -# degradation). -# -# To replace newlines or a sequence containing the newline character, use $NL -# as `\n' is not supported. -# -f_replaceall() -{ - local __left="" __right="$1" - local __find="$2" __replace="$3" __var_to_set="$4" - while :; do - case "$__right" in *$__find*) - __left="$__left${__right%%$__find*}$__replace" - __right="${__right#*$__find}" - continue - esac - break - done - __left="$__left${__right#*$__find}" - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" "$__left" - else - echo "$__left" - fi -} - -# f_str2varname $string [$var_to_set] -# -# Convert a string into a suitable value to be used as a variable name -# by converting unsuitable characters into the underscrore [_]. If $var_to_set -# is either missing or NULL, the variable name is produced on standard out for -# capturing in a sub-shell (which is less recommended due to performance -# degradation). -# -f_str2varname() -{ - local __string="$1" __var_to_set="$2" - f_replaceall "$__string" "[!$VALID_VARNAME_CHARS]" "_" "$__var_to_set" -} - -# f_shell_escape $string [$var_to_set] -# -# Escape $string for shell eval statement(s) by replacing all single-quotes -# with a special sequence that creates a compound string when interpolated -# by eval with surrounding single-quotes. -# -# For example: -# -# foo="abc'123" -# f_shell_escape "$foo" bar # bar=[abc'\''123] -# eval echo \'$bar\' # produces abc'123 -# -# This is helpful when processing an argument list that has to retain its -# escaped structure for later evaluations. -# -# WARNING: Surrounding single-quotes are not added; this is the responsibility -# of the code passing the escaped values to eval (which also aids readability). -# -f_shell_escape() -{ - local __string="$1" __var_to_set="$2" - f_replaceall "$__string" "'" "'\\''" "$__var_to_set" -} - -# f_shell_unescape $string [$var_to_set] -# -# The antithesis of f_shell_escape(), this function takes an escaped $string -# and expands it. -# -# For example: -# -# foo="abc'123" -# f_shell_escape "$foo" bar # bar=[abc'\''123] -# f_shell_unescape "$bar" # produces abc'123 -# -f_shell_unescape() -{ - local __string="$1" __var_to_set="$2" - f_replaceall "$__string" "'\\''" "'" "$__var_to_set" -} - -# f_expand_number $string [$var_to_set] -# -# Unformat $string into a number, optionally to be stored in $var_to_set. This -# function follows the SI power of two convention. -# -# The prefixes are: -# -# Prefix Description Multiplier -# k kilo 1024 -# M mega 1048576 -# G giga 1073741824 -# T tera 1099511627776 -# P peta 1125899906842624 -# E exa 1152921504606846976 -# -# NOTE: Prefixes are case-insensitive. -# -# Upon successful completion, success status is returned; otherwise the number -# -1 is produced ($var_to_set set to -1 or if $var_to_set is NULL or missing) -# on standard output. In the case of failure, the error status will be one of: -# -# Status Reason -# 1 Given $string contains no digits -# 2 An unrecognized prefix was given -# 3 Result too large to calculate -# -f_expand_number() -{ - local __string="$1" __var_to_set="$2" - local __cp __num __bshift __maxinput - - # Remove any leading non-digits - __string="${__string#${__string%%[0-9]*}}" - - # Store the numbers (no trailing suffix) - __num="${__string%%[!0-9]*}" - - # Produce `-1' if string didn't contain any digits - if [ ! "$__num" ]; then - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" -1 - else - echo -1 - fi - return 1 # 1 = "Given $string contains no digits" - fi - - # Remove all the leading numbers from the string to get at the prefix - __string="${__string#"$__num"}" - - # - # Test for invalid prefix (and determine bitshift length) - # - case "$__string" in - ""|[[:space:]]*) # Shortcut - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" $__num - else - echo $__num - fi - return $SUCCESS ;; - [Kk]*) __bshift=10 ;; - [Mm]*) __bshift=20 ;; - [Gg]*) __bshift=30 ;; - [Tt]*) __bshift=40 ;; - [Pp]*) __bshift=50 ;; - [Ee]*) __bshift=60 ;; - *) - # Unknown prefix - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" -1 - else - echo -1 - fi - return 2 # 2 = "An unrecognized prefix was given" - esac - - # Determine if the wheels fall off - __maxinput=$(( 0x7fffffffffffffff >> $__bshift )) - if [ $__num -gt $__maxinput ]; then - # Input (before expanding) would exceed 64-bit signed int - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" -1 - else - echo -1 - fi - return 3 # 3 = "Result too large to calculate" - fi - - # Shift the number out and produce it - __num=$(( $__num << $__bshift )) - if [ "$__var_to_set" ]; then - setvar "$__var_to_set" $__num - else - echo $__num - fi -} - -# f_longest_line_length -# -# Simple wrapper to an awk(1) script to print the length of the longest line of -# input (read from stdin). Supports the newline escape-sequence `\n' for -# splitting a single line into multiple lines. -# -f_longest_line_length_awk=' -BEGIN { longest = 0 } -{ - if (split($0, lines, /\\n/) > 1) - { - for (n in lines) - { - len = length(lines[n]) - longest = ( len > longest ? len : longest ) - } - } - else - { - len = length($0) - longest = ( len > longest ? len : longest ) - } -} -END { print longest } -' -f_longest_line_length() -{ - awk "$f_longest_line_length_awk" -} - -# f_number_of_lines -# -# Simple wrapper to an awk(1) script to print the number of lines read from -# stdin. Supports newline escape-sequence `\n' for splitting a single line into -# multiple lines. -# -f_number_of_lines_awk=' -BEGIN { num_lines = 0 } -{ - num_lines += split(" "$0, unused, /\\n/) -} -END { print num_lines } -' -f_number_of_lines() -{ - awk "$f_number_of_lines_awk" -} - -# f_uriencode [$text] -# -# Encode $text for the purpose of embedding safely into a URL. Non-alphanumeric -# characters are converted to `%XX' sequence where XX represents the hexa- -# decimal ordinal of the non-alphanumeric character. If $text is missing, data -# is instead read from standard input. -# -f_uriencode_awk=' -BEGIN { - output = "" - for (n = 0; n < 256; n++) pack[sprintf("%c", n)] = sprintf("%%%02x", n) -} -{ - sline = "" - slen = length($0) - for (n = 1; n <= slen; n++) { - char = substr($0, n, 1) - if ( char !~ /^[[:alnum:]_]$/ ) char = pack[char] - sline = sline char - } - output = output ( output ? "%0a" : "" ) sline -} -END { print output } -' -f_uriencode() -{ - if [ $# -gt 0 ]; then - echo "$1" | awk "$f_uriencode_awk" - else - awk "$f_uriencode_awk" - fi -} - -# f_uridecode [$text] -# -# Decode $text from a URI. Encoded characters are converted from their `%XX' -# sequence into original unencoded ASCII sequences. If $text is missing, data -# is instead read from standard input. -# -f_uridecode_awk=' -BEGIN { for (n = 0; n < 256; n++) chr[n] = sprintf("%c", n) } -{ - sline = "" - slen = length($0) - for (n = 1; n <= slen; n++) - { - seq = substr($0, n, 3) - if ( seq ~ /^%[[:xdigit:]][[:xdigit:]]$/ ) { - hex = substr(seq, 2, 2) - sline = sline chr[sprintf("%u", "0x"hex)] - n += 2 - } else - sline = sline substr(seq, 1, 1) - } - print sline -} -' -f_uridecode() -{ - if [ $# -gt 0 ]; then - echo "$1" | awk "$f_uridecode_awk" - else - awk "$f_uridecode_awk" - fi -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." strings.subr - -fi # ! $_STRINGS_SUBR diff --git a/bsdconfig/share/struct.subr b/bsdconfig/share/struct.subr deleted file mode 100644 index 78c785fc2b51..000000000000 --- a/bsdconfig/share/struct.subr +++ /dev/null @@ -1,206 +0,0 @@ -if [ ! "$_STRUCT_SUBR" ]; then _STRUCT_SUBR=1 -# -# Copyright (c) 2012-2013 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 (INCLUDING, 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 - -############################################################ FUNCTIONS - -# f_struct_define $type $member_name1 ... -# -# Define a new `structure' type $type made up of the properties $member_name1 -# $member_name2 and so-on. Properties are not typed and can hold any type of -# data (including names of other structs). -# -# Before creating instances of a struct (using f_struct_new $type $name) you -# should use this function to define $type. -# -# Both $type and member names should consist only of alpha-numeric letters or -# the underscore. -# -f_struct_define() -{ - local type="$1" - [ "$type" ] || return $FAILURE - shift - setvar "_struct_typedef_$type" "$*" -} - -# f_struct_new $type $name -# -# Create a new `structure' named $name of type $type. There are two ways to -# access properties of a struct, but they are not equal (each method has its -# own unique benefits, discussed below). -# -# The primary method of accessing (both setting and getting) properties of any -# struct is through the f_struct() function below. -# -# The secondary method of accessing data is by using $name as a function. -# -# Both access methods are cross-platform compatible with any version of sh(1). -# Below is an example of the primary access method: -# -# f_struct_new MY_STRUCT_TYPE my_struct -# f_struct my_struct set abc 123 -# f_struct my_struct get abc # prints 123 to stdout -# f_struct my_struct get abc abc # sets local variable $abc to 123 -# -# Alternatively, the secondary access method (details below): -# -# f_struct_new MY_STRUCT_TYPE my_struct -# my_struct set abc 123 -# my_struct get abc # prints 123 to stdout -# my_struct get abc abc # sets local variable $abc to 123 -# -# The secondary form should only be used if/when: -# + You are certain that the structure already exists -# + You want a syntax error if/when the struct does not exist -# -# The primary benefit to the secondary form is syntax cleanliness and read- -# ability. If you are unsure if a given struct exists (which would cause a -# syntax error when using this form), you can use the primary access method to -# first test for the existence of the struct. For example: -# -# if f_struct my_struct; then -# my_struct get abc # only executed if my_struct exists -# fi -# -# For more information, see the f_struct() function. -# -f_struct_new() -{ - local type="$1" name="$2" - f_dprintf "f_struct_new: type=[%s] name=[%s]" "$type" "$name" - [ "$name" ] || return $FAILURE - setvar "_struct_type_$name" "$type" || return $FAILURE - # OK to use bare $name at this point - eval $name\(\){ f_struct $name \"\$@\"\; } -} - -# f_struct $name -# f_struct $name get $property [$var_to_set] -# f_struct $name set $property $new_value -# f_struct $name unset $property -# -# Access routine for getting, setting, unsetting, and testing properties of -# `structures'. -# -# If only given $name, returns success if struct $name has been created (using -# the f_struct_new() function above). -# -# For getting properties of a struct (versus setting) there are two methods of -# access. If $var_to_set is missing or NULL, the value of the property is -# printed to standard output for capturing in a sub-shell (which is less- -# recommended because of performance degredation; for example, when called in a -# loop). Returns success unless the property is unset. -# -# For setting properties of a struct, sets the value of $property to $new_value -# and returns success. -# -# For unsetting, the underlying environment variable associated with the given -# $property is unset. -# -f_struct() -{ - local __name="$1" __action="$2" __property="$3" - case $# in - 0) return $FAILURE ;; - 1) f_have "$__name" ;; - *) case "$__action" in - get) local __var_to_set="$4" - f_getvar "_struct_value_${__name}_$__property" "$__var_to_set" - ;; - set) local new_value="$4" - setvar "_struct_value_${__name}_$__property" "$new_value" ;; - unset) unset "_struct_value_${__name}_$__property" ;; - esac - esac - # Return the status of the last command above -} - -# f_struct_free $name -# -# Unset the collection of environment variables and accessor-function -# associated with struct $name. -# -f_struct_free() -{ - local name="$1" type member members - f_getvar "_struct_type_$name" type - f_dprintf "f_struct_free: name=[%s] type=[%s]" "$name" "$type" - [ "$name" ] || return $FAILURE - f_getvar "_struct_typedef_$type" members - for member in $members; do - f_struct "$name" unset $member - done - unset -f "$name" - unset "_struct_type_$name" -} - -# f_struct_copy $from_name $to_name -# -# Copy the properties of one struct to another. If struct $to_name does not -# exist, it is created. If struct $from_name does not exist, nothing is done -# and struct $to_name remains unmodified. -# -# Returns success unless struct $to_name did not exist and f_struct_new() was -# unable to create it. -# -f_struct_copy() -{ - local from_name="$1" to_name="$2" type - f_dprintf "f_struct_copy: from_name=[%s] to_name=[%s]" \ - "$from_name" "$to_name" - f_getvar "_struct_type_$from_name" type - f_struct "$to_name" || - f_struct_new "$type" "$to_name" || return $FAILURE - f_struct "$from_name" || return $SUCCESS - f_dprintf "f_struct_copy: copying properties from %s to %s" \ - "$from_name" "$to_name" - local property properties from_value n=0 k=0 - f_getvar "_struct_typedef_$type" properties - for property in $properties; do - k=$(( $k + 1 )) - if f_struct "$from_name" get $property from_value; then - f_struct "$to_name" set $property "$from_value" - n=$(( $n + 1 )) - else - f_struct "$to_name" unset $property - fi - done - f_dprintf "f_struct_copy: copied %u of %u properties from %s to %s" \ - "$n" "$k" "$from_name" "$to_name" -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." struct.subr - -fi # ! $_STRUCT_SUBR diff --git a/bsdconfig/share/sysrc.subr b/bsdconfig/share/sysrc.subr deleted file mode 100644 index 11298f00f47a..000000000000 --- a/bsdconfig/share/sysrc.subr +++ /dev/null @@ -1,758 +0,0 @@ -if [ ! "$_SYSRC_SUBR" ]; then _SYSRC_SUBR=1 -# -# Copyright (c) 2006-2015 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 (INCLUDING, 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" -[ "$_COMMON_SUBR" ] || . $BSDCFG_SHARE/common.subr || exit 1 - -BSDCFG_LIBE="/usr/libexec/bsdconfig" -if [ ! "$_SYSRC_JAILED" ]; then - f_dprintf "%s: loading includes..." sysrc.subr - f_include_lang $BSDCFG_LIBE/include/messages.subr -fi - -############################################################ CONFIGURATION - -# -# Standard pathnames (inherit values from shell if available) -# -: ${RC_DEFAULTS:="/etc/defaults/rc.conf"} - -############################################################ GLOBALS - -# -# Global exit status variables -# -SUCCESS=0 -FAILURE=1 - -# -# Valid characters that can appear in an sh(1) variable name -# -# Please note that the character ranges A-Z and a-z should be avoided because -# these can include accent characters (which are not valid in a variable name). -# For example, A-Z matches any character that sorts after A but before Z, -# including A and Z. Although ASCII order would make more sense, that is not -# how it works. -# -VALID_VARNAME_CHARS="0-9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_" - -############################################################ FUNCTIONS - -# f_clean_env [ --except $varname ... ] -# -# Unset all environment variables in the current scope. An optional list of -# arguments can be passed, indicating which variables to avoid unsetting; the -# `--except' is required to enable the exclusion-list as the remainder of -# positional arguments. -# -# Be careful not to call this in a shell that you still expect to perform -# $PATH expansion in, because this will blow $PATH away. This is best used -# within a sub-shell block "(...)" or "$(...)" or "`...`". -# -f_clean_env() -{ - local var arg except= - - # - # Should we process an exclusion-list? - # - if [ "$1" = "--except" ]; then - except=1 - shift 1 - fi - - # - # Loop over a list of variable names from set(1) built-in. - # - for var in $( set | awk -F= \ - '/^[[:alpha:]_][[:alnum:]_]*=/ {print $1}' \ - | grep -v '^except$' - ); do - # - # In POSIX bourne-shell, attempting to unset(1) OPTIND results - # in "unset: Illegal number:" and causes abrupt termination. - # - [ "$var" = OPTIND ] && continue - - # - # Process the exclusion-list? - # - if [ "$except" ]; then - for arg in "$@" ""; do - [ "$var" = "$arg" ] && break - done - [ "$arg" ] && continue - fi - - unset "$var" - done -} - -# f_sysrc_get $varname -# -# Get a system configuration setting from the collection of system- -# configuration files (in order: /etc/defaults/rc.conf /etc/rc.conf and -# /etc/rc.conf.local) -# -# NOTE: Additional shell parameter-expansion formats are supported. For -# example, passing an argument of "hostname%%.*" (properly quoted) will -# return the hostname up to (but not including) the first `.' (see sh(1), -# "Parameter Expansion" for more information on additional formats). -# -f_sysrc_get() -{ - # Sanity check - [ -f "$RC_DEFAULTS" -a -r "$RC_DEFAULTS" ] || return $FAILURE - - # Taint-check variable name - case "$1" in - [0-9]*) - # Don't expand possible positional parameters - return $FAILURE ;; - *) - [ "$1" ] || return $FAILURE - esac - - ( # Execute within sub-shell to protect parent environment - - # - # Clear the environment of all variables, preventing the - # expansion of normals such as `PS1', `TERM', etc. - # - f_clean_env --except IFS RC_CONFS RC_DEFAULTS - - . "$RC_DEFAULTS" > /dev/null 2>&1 - - unset RC_DEFAULTS - # no longer needed - - # - # If the query is for `rc_conf_files' then store the value that - # we inherited from sourcing RC_DEFAULTS (above) so that we may - # conditionally restore this value after source_rc_confs in the - # event that RC_CONFS does not customize the value. - # - if [ "$1" = "rc_conf_files" ]; then - _rc_conf_files="$rc_conf_files" - fi - - # - # If RC_CONFS is defined, set $rc_conf_files to an explicit - # value, modifying the default behavior of source_rc_confs(). - # - if [ "${RC_CONFS+set}" ]; then - rc_conf_files="$RC_CONFS" - _rc_confs_set=1 - fi - - source_rc_confs > /dev/null 2>&1 - - # - # If the query was for `rc_conf_files' AND after calling - # source_rc_confs the value has not changed, then we should - # restore the value to the one inherited from RC_DEFAULTS - # before performing the final query (preventing us from - # returning what was set via RC_CONFS when the intent was - # instead to query the value from the file(s) specified). - # - if [ "$1" = "rc_conf_files" -a \ - "$_rc_confs_set" -a \ - "$rc_conf_files" = "$RC_CONFS" \ - ]; then - rc_conf_files="$_rc_conf_files" - unset _rc_conf_files - unset _rc_confs_set - fi - - unset RC_CONFS - # no longer needed - - # - # This must be the last functional line for both the sub-shell - # and the function to preserve the return status from formats - # such as "${varname?}" and "${varname:?}" (see "Parameter - # Expansion" in sh(1) for more information). - # - eval printf "'%s\\n'" '"${'"$1"'}"' 2> /dev/null - ) -} - -# f_sysrc_service_configs [-a|-p] $name [$var_to_set] -# -# Get a list of optional `rc.conf.d' entries sourced by system `rc.d' script -# $name (see rc.subr(8) for additional information on `rc.conf.d'). If $name -# exists in `/etc/rc.d' or $local_startup directories and is an rc(8) script -# the result is a space separated list of `rc.conf.d' entries sourced by the -# $name `rc.d' script. Otherwise, if $name exists as a binary `rc.d' script, -# the result is ``/etc/rc.conf.d/$name /usr/local/etc/rc.conf.d/$name''. The -# result is NULL if $name does not exist. -# -# If $var_to_set is missing or NULL, output is to standard out. Returns success -# if $name was found, failure otherwise. -# -# If `-a' flag is given and $var_to_set is non-NULL, append result to value of -# $var_to_set rather than overwriting current contents. -# -# If `-p' flag is given and $var_to_set is non-NULL, prepend result to value of -# $var_to_set rather than overwriting current contents. -# -# NB: The `-a' and `-p' option flags are mutually exclusive. -# -f_sysrc_service_configs() -{ - local OPTIND=1 OPTARG __flag __append= __prepend= - local __local_startup __dir __spath __stype __names= - - while getopts ap __flag; do - case "$__flag" in - a) __append=1 __prepend= ;; - p) __prepend=1 __append= ;; - esac - done - shift $(( $OPTIND - 1 )) - - [ $# -gt 0 ] || return $FAILURE - local __sname="$1" __var_to_set="$2" - - __local_startup=$( f_sysrc_get local_startup ) - for __dir in /etc/rc.d $__local_startup; do - __spath="$__dir/$__sname" - [ -f "$__spath" -a -x "$__spath" ] || __spath= continue - break - done - [ "$__spath" ] || return $FAILURE - - __stype=$( file -b "$__spath" 2> /dev/null ) - case "$__stype" in - *"shell script"*) - __names=$( exec 9<&1 1>&- 2>&- - last_name= - print_name() { - local name="$1" - case "$name" in - ""|.|..|*/*|"$last_name") return ;; - esac - echo "$name" >&9 - last_name="$name" - } - eval "$( awk '{ - gsub(/load_rc_config /, "print_name ") - gsub(/run_rc_command /, ": ") - print - }' "$__spath" )" - ) ;; - *) - __names="$__sname" - esac - - local __name __test_path __configs= - for __name in $__names; do - for __dir in /etc/rc.d $__local_startup; do - __test_path="${__dir%/rc.d}/rc.conf.d/$__name" - [ -d "$__test_path" ] || - __configs="$__configs $__test_path" continue - for __test_path in "$__test_path"/*; do - [ -f "$__test_path" ] || continue - __configs="$__configs $__test_path" - done - done - done - __configs="${__configs# }" - - if [ "$__var_to_set" ]; then - local __cur= - [ "$__append" -o "$__prepend" ] && - f_getvar "$__var_to_set" __cur - [ "$__append" ] && __configs="$__cur{$__cur:+ }$__configs" - [ "$__prepend" ] && __configs="$__configs${__cur:+ }$__cur" - setvar "$__var_to_set" "$__configs" - else - echo "$__configs" - fi - - return $SUCCESS -} - -# f_sysrc_get_default $varname -# -# Get a system configuration default setting from the default rc.conf(5) file -# (or whatever RC_DEFAULTS points at). -# -f_sysrc_get_default() -{ - # Sanity check - [ -f "$RC_DEFAULTS" -a -r "$RC_DEFAULTS" ] || return $FAILURE - - # Taint-check variable name - case "$1" in - [0-9]*) - # Don't expand possible positional parameters - return $FAILURE ;; - *) - [ "$1" ] || return $FAILURE - esac - - ( # Execute within sub-shell to protect parent environment - - # - # Clear the environment of all variables, preventing the - # expansion of normals such as `PS1', `TERM', etc. - # - f_clean_env --except RC_DEFAULTS - - . "$RC_DEFAULTS" > /dev/null 2>&1 - - unset RC_DEFAULTS - # no longer needed - - # - # This must be the last functional line for both the sub-shell - # and the function to preserve the return status from formats - # such as "${varname?}" and "${varname:?}" (see "Parameter - # Expansion" in sh(1) for more information). - # - eval printf "'%s\\n'" '"${'"$1"'}"' 2> /dev/null - ) -} - -# f_sysrc_find $varname -# -# Find which file holds the effective last-assignment to a given variable -# within the rc.conf(5) file(s). -# -# If the variable is found in any of the rc.conf(5) files, the function prints -# the filename it was found in and then returns success. Otherwise output is -# NULL and the function returns with error status. -# -f_sysrc_find() -{ - local varname="${1%%[!$VALID_VARNAME_CHARS]*}" - local regex="^[[:space:]]*$varname=" - local rc_conf_files="$( f_sysrc_get rc_conf_files )" - local conf_files= - local file - - # Check parameters - case "$varname" in - ""|[0-9]*) return $FAILURE - esac - - # - # If RC_CONFS is defined, set $rc_conf_files to an explicit - # value, modifying the default behavior of source_rc_confs(). - # - [ "${RC_CONFS+set}" ] && rc_conf_files="$RC_CONFS" - - # - # Reverse the order of files in rc_conf_files (the boot process sources - # these in order, so we will search them in reverse-order to find the - # last-assignment -- the one that ultimately effects the environment). - # - for file in $rc_conf_files; do - conf_files="$file${conf_files:+ }$conf_files" - done - - # - # Append the defaults file (since directives in the defaults file - # indeed affect the boot process, we'll want to know when a directive - # is found there). - # - conf_files="$conf_files${conf_files:+ }$RC_DEFAULTS" - - # - # Find which file matches assignment to the given variable name. - # - for file in $conf_files; do - [ -f "$file" -a -r "$file" ] || continue - if grep -Eq "$regex" $file; then - echo $file - return $SUCCESS - fi - done - - return $FAILURE # Not found -} - -# f_sysrc_desc $varname -# -# Attempts to return the comments associated with varname from the rc.conf(5) -# defaults file `/etc/defaults/rc.conf' (or whatever RC_DEFAULTS points to). -# -# Multi-line comments are joined together. Results are NULL if no description -# could be found. -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_sysrc_desc_awk=' -# Variables that should be defined on the invocation line: -# -v varname="varname" -# -BEGIN { - regex = "^[[:space:]]*"varname"=" - found = 0 - buffer = "" -} -{ - if ( ! found ) - { - if ( ! match($0, regex) ) next - - found = 1 - sub(/^[^#]*(#[[:space:]]*)?/, "") - buffer = $0 - next - } - - if ( !/^[[:space:]]*#/ || - /^[[:space:]]*[[:alpha:]_][[:alnum:]_]*=/ || - /^[[:space:]]*#[[:alpha:]_][[:alnum:]_]*=/ || - /^[[:space:]]*$/ ) exit - - sub(/(.*#)*[[:space:]]*/, "") - buffer = buffer" "$0 -} -END { - # Clean up the buffer - sub(/^[[:space:]]*/, "", buffer) - sub(/[[:space:]]*$/, "", buffer) - - print buffer - exit ! found -} -' -f_sysrc_desc() -{ - awk -v varname="$1" "$f_sysrc_desc_awk" < "$RC_DEFAULTS" -} - -# f_sysrc_set $varname $new_value -# -# Change a setting in the system configuration files (edits the files in-place -# to change the value in the last assignment to the variable). If the variable -# does not appear in the source file, it is appended to the end of the primary -# system configuration file `/etc/rc.conf'. -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_sysrc_set_awk=' -# Variables that should be defined on the invocation line: -# -v varname="varname" -# -v new_value="new_value" -# -BEGIN { - regex = "^[[:space:]]*"varname"=" - found = retval = 0 -} -{ - # If already found... just spew - if ( found ) { print; next } - - # Does this line match an assignment to our variable? - if ( ! match($0, regex) ) { print; next } - - # Save important match information - found = 1 - matchlen = RSTART + RLENGTH - 1 - - # Store the value text for later munging - value = substr($0, matchlen + 1, length($0) - matchlen) - - # Store the first character of the value - t1 = t2 = substr(value, 0, 1) - - # Assignment w/ back-ticks, expression, or misc. - # We ignore these since we did not generate them - # - if ( t1 ~ /[`$\\]/ ) { retval = 1; print; next } - - # Assignment w/ single-quoted value - else if ( t1 == "'\''" ) { - sub(/^'\''[^'\'']*/, "", value) - if ( length(value) == 0 ) t2 = "" - sub(/^'\''/, "", value) - } - - # Assignment w/ double-quoted value - else if ( t1 == "\"" ) { - sub(/^"(.*\\\\+")*[^"]*/, "", value) - if ( length(value) == 0 ) t2 = "" - sub(/^"/, "", value) - } - - # Assignment w/ non-quoted value - else if ( t1 ~ /[^[:space:];]/ ) { - t1 = t2 = "\"" - sub(/^[^[:space:]]*/, "", value) - } - - # Null-assignment - else if ( t1 ~ /[[:space:];]/ ) { t1 = t2 = "\"" } - - printf "%s%c%s%c%s\n", substr($0, 0, matchlen), \ - t1, new_value, t2, value -} -END { exit retval } -' -f_sysrc_set() -{ - local funcname=f_sysrc_set - local varname="$1" new_value="$2" - - # Check arguments - [ "$varname" ] || return $FAILURE - - # - # Find which rc.conf(5) file contains the last-assignment - # - local not_found= - local file="$( f_sysrc_find "$varname" )" - if [ "$file" = "$RC_DEFAULTS" -o ! "$file" ]; then - # - # We either got a null response (not found) or the variable - # was only found in the rc.conf(5) defaults. In either case, - # let's instead modify the first file from $rc_conf_files. - # - - not_found=1 - - # - # If RC_CONFS is defined, use $RC_CONFS - # rather than $rc_conf_files. - # - if [ "${RC_CONFS+set}" ]; then - file="${RC_CONFS%%[$IFS]*}" - else - file=$( f_sysrc_get 'rc_conf_files%%[$IFS]*' ) - fi - fi - - # - # If not found, append new value to first file and return. - # - if [ "$not_found" ]; then - # Add a newline if missing before appending to the file - [ ! -e "$file" ] || awk 'BEGIN { wc = 0 } NR == 1 { - (cmd = "wc -l " FILENAME) | getline - close(cmd) - wc = $1 - } END { exit wc != NR }' "$file" || - echo >> "$file" || return $? - echo "$varname=\"$new_value\"" >> "$file" - return $? - fi - - # - # Perform sanity checks. - # - if [ ! -w "$file" ]; then - f_err "$msg_cannot_create_permission_denied\n" \ - "$pgm" "$file" - return $FAILURE - fi - - # - # Create a new temporary file to write to. - # - local tmpfile - if ! f_eval_catch -dk tmpfile $funcname mktemp 'mktemp -t "%s"' "$pgm" - then - echo "$tmpfile" >&2 - return $FAILURE - fi - - # - # Fixup permissions (else we're in for a surprise, as mktemp(1) creates - # the temporary file with 0600 permissions, and if we simply mv(1) the - # temporary file over the destination, the destination will inherit the - # permissions from the temporary file). - # - local mode - f_eval_catch -dk mode $funcname stat 'stat -f "%%#Lp" "%s"' "$file" || - mode=0644 - f_eval_catch -d $funcname chmod 'chmod "%s" "%s"' "$mode" "$tmpfile" - - # - # Fixup ownership. The destination file _is_ writable (we tested - # earlier above). However, this will fail if we don't have sufficient - # permissions (so we throw stderr into the bit-bucket). - # - local owner - f_eval_catch -dk owner $funcname stat \ - 'stat -f "%%u:%%g" "%s"' "$file" || owner="root:wheel" - f_eval_catch -d $funcname chown 'chown "%s" "%s"' "$owner" "$tmpfile" - - # - # Operate on the matching file, replacing only the last occurrence. - # - # Use awk to ensure LF at end of each line, else files without ending - # LF will trigger a bug in `tail -r' where last two lines are joined. - # - local new_contents retval - new_contents=$( awk 1 "$file" 2> /dev/null | tail -r ) - new_contents=$( echo "$new_contents" | awk -v varname="$varname" \ - -v new_value="$new_value" "$f_sysrc_set_awk" ) - retval=$? - - # - # Write the temporary file contents. - # - echo "$new_contents" | tail -r > "$tmpfile" || return $FAILURE - if [ $retval -ne $SUCCESS ]; then - echo "$varname=\"$new_value\"" >> "$tmpfile" - fi - - # - # Taint-check our results. - # - if ! f_eval_catch -d $funcname sh '/bin/sh -n "%s"' "$tmpfile"; then - f_err "$msg_previous_syntax_errors\n" "$pgm" "$file" - rm -f "$tmpfile" - return $FAILURE - fi - - # - # Finally, move the temporary file into place. - # - f_eval_catch -de $funcname mv 'mv "%s" "%s"' "$tmpfile" "$file" -} - -# f_sysrc_delete $varname -# -# Remove a setting from the system configuration files (edits files in-place). -# Deletes all assignments to the given variable in all config files. If the -# `-f file' option is passed, the removal is restricted to only those files -# specified, otherwise the system collection of rc_conf_files is used. -# -# This function is a two-parter. Below is the awk(1) portion of the function, -# afterward is the sh(1) function which utilizes the below awk script. -# -f_sysrc_delete_awk=' -# Variables that should be defined on the invocation line: -# -v varname="varname" -# -BEGIN { - regex = "^[[:space:]]*"varname"=" - found = 0 -} -{ - if ( $0 ~ regex ) - found = 1 - else - print -} -END { exit ! found } -' -f_sysrc_delete() -{ - local funcname=f_sysrc_delete - local varname="$1" - local file - - # Check arguments - [ "$varname" ] || return $FAILURE - - # - # Operate on each of the specified files - # - local tmpfile - for file in ${RC_CONFS-$( f_sysrc_get rc_conf_files )}; do - [ -e "$file" ] || continue - - # - # Create a new temporary file to write to. - # - if ! f_eval_catch -dk tmpfile $funcname mktemp \ - 'mktemp -t "%s"' "$pgm" - then - echo "$tmpfile" >&2 - return $FAILURE - fi - - # - # Fixup permissions and ownership (mktemp(1) defaults to 0600 - # permissions) to instead match the destination file. - # - local mode owner - f_eval_catch -dk mode $funcname stat \ - 'stat -f "%%#Lp" "%s"' "$file" || mode=0644 - f_eval_catch -dk owner $funcname stat \ - 'stat -f "%%u:%%g" "%s"' "$file" || owner="root:wheel" - f_eval_catch -d $funcname chmod \ - 'chmod "%s" "%s"' "$mode" "$tmpfile" - f_eval_catch -d $funcname chown \ - 'chown "%s" "%s"' "$owner" "$tmpfile" - - # - # Operate on the file, removing all occurrences, saving the - # output in our temporary file. - # - awk -v varname="$varname" "$f_sysrc_delete_awk" "$file" \ - > "$tmpfile" - if [ $? -ne $SUCCESS ]; then - # The file didn't contain any assignments - rm -f "$tmpfile" - continue - fi - - # - # Taint-check our results. - # - if ! f_eval_catch -d $funcname sh '/bin/sh -n "%s"' "$tmpfile" - then - f_err "$msg_previous_syntax_errors\n" \ - "$pgm" "$file" - rm -f "$tmpfile" - return $FAILURE - fi - - # - # Perform sanity checks - # - if [ ! -w "$file" ]; then - f_err "$msg_permission_denied\n" "$pgm" "$file" - rm -f "$tmpfile" - return $FAILURE - fi - - # - # Finally, move the temporary file into place. - # - f_eval_catch -de $funcname mv \ - 'mv "%s" "%s"' "$tmpfile" "$file" || return $FAILURE - done -} - -############################################################ MAIN - -f_dprintf "%s: Successfully loaded." sysrc.subr - -fi # ! $_SYSRC_SUBR diff --git a/bsdconfig/share/variable.subr b/bsdconfig/share/variable.subr deleted file mode 100644 index c453f674ee57..000000000000 --- a/bsdconfig/share/variable.subr +++ /dev/null @@ -1,315 +0,0 @@ -if [ ! "$_VARIABLE_SUBR" ]; then _VARIABLE_SUBR=1 -# -# Copyright (c) 2012-2014 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 (INCLUDING, 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_dprintf "%s: loading includes..." variable.subr -f_include $BSDCFG_SHARE/dialog.subr -f_include $BSDCFG_SHARE/strings.subr - -############################################################ GLOBALS - -VARIABLES= - -# -# Default behavior is to call f_variable_set_defaults() when loaded. -# -: ${VARIABLE_SELF_INITIALIZE=1} - -# -# File to write when f_dump_variables() is called. -# -: ${VARIABLE_DUMPFILE:=/etc/bsdconfig.vars} - -############################################################ FUNCTIONS - -# f_variable_new $handle $variable -# -# Register a new variable named $variable with the given reference-handle -# $handle. The environment variable $handle is set to $variable allowing you to -# use the f_getvar() function (from common.subr) with $handle to get the value -# of environment variable $variable. For example: -# -# f_variable_new VAR_ABC abc -# -# allows the later indirection: -# -# f_getvar $VAR_ABC -# -# to return the value of environment variable `abc'. Variables registered in -# this manner are recorded in the $VARIABLES environment variable for later -# allowing dynamic enumeration of so-called `registered/advertised' variables. -# -f_variable_new() -{ - local handle="$1" variable="$2" - [ "$handle" ] || return $FAILURE - f_dprintf "variable.subr: New variable %s -> %s" "$handle" "$variable" - setvar $handle $variable - VARIABLES="$VARIABLES${VARIABLES:+ }$handle" -} - -# f_variable_get_value $var [ $fmt [ $opts ... ] ] -# -# Unless nonInteractive is set, prompt the user with a given value (pre-filled -# with the value of $var) and give them the chance to change the value. -# -# Unlike f_getvar() (from common.subr) which can return a variable to the -# caller on standard output, this function has no [meaningful] output. -# -# Returns success unless $var is either NULL or missing. -# -f_variable_get_value() -{ - local var="$1" cp - - [ "$var" ] || return $FAILURE - - if ! { f_getvar $var cp && ! f_interactive; }; then - shift 1 # var - f_dialog_input cp "$( printf "$@" )" "$cp" && setvar $var "$cp" - fi - - return $SUCCESS -} - -# f_variable_set_defaults -# -# Installs sensible defaults for registered/advertised variables. -# -f_variable_set_defaults() -{ - f_dprintf "f_variable_set_defaults: Initializing defaults..." - - # - # Initialize various user-edittable values to their defaults - # - setvar $VAR_EDITOR "${EDITOR:-/usr/bin/ee}" - setvar $VAR_FTP_STATE "auto" - setvar $VAR_FTP_USER "ftp" - setvar $VAR_HOSTNAME "$( hostname )" - setvar $VAR_MEDIA_TIMEOUT "300" - setvar $VAR_NFS_SECURE "NO" - setvar $VAR_NFS_TCP "NO" - setvar $VAR_NFS_V3 "YES" - setvar $VAR_PKG_TMPDIR "/var/tmp" - setvar $VAR_RELNAME "$UNAME_R" - - # - # Debugging - # - if f_debugging; then - local var - for var in \ - $VAR_EDITOR \ - $VAR_FTP_STATE \ - $VAR_FTP_USER \ - $VAR_HOSTNAME \ - $VAR_MEDIA_TIMEOUT \ - $VAR_NFS_SECURE \ - $VAR_NFS_TCP \ - $VAR_NFS_V3 \ - $VAR_PKG_TMPDIR \ - $VAR_RELNAME \ - ; do - f_quietly f_getvar $var - done - fi - - f_dprintf "f_variable_set_defaults: Defaults initialized." -} - -# f_dump_variables -# -# Dump a list of registered/advertised variables and their respective values to -# $VARIABLE_DUMPFILE. Returns success unless the file couldn't be written. If -# an error occurs, it is displayed using f_dialog_msgbox() (from dialog.subr). -# -f_dump_variables() -{ - local err - if ! err=$( - ( for handle in $VARIABLES; do - f_getvar $handle var || continue - f_getvar $var value || continue - f_shell_escape "$value" value - printf "%s='%s'\n" "$var" "$value" - done > "$VARIABLE_DUMPFILE" ) 2>&1 - ); then - f_dialog_msgbox "$err" - return $FAILURE - fi -} - -# f_debugging -# -# Are we in debug mode? Returns success if extra DEBUG information has been -# requested (by setting $debug to non-NULL), otherwise false. -# -f_debugging() -{ - local value - f_getvar $VAR_DEBUG value && [ "$value" ] -} - -# f_interactive -# -# Are we running interactively? Return error if $nonInteractive is set and non- -# NULL, otherwise return success. -# -f_interactive() -{ - local value - ! f_getvar $VAR_NONINTERACTIVE value || [ ! "$value" ] -} - -# f_netinteractive -# -# Has the user specifically requested the network-portion of configuration and -# setup to be performed interactively? Returns success if the user has asked -# for the network configuration to be done interactively even if perhaps over- -# all non-interactive mode has been requested (by setting nonInteractive). -# -# Returns success if $netInteractive is set and non-NULL. -# -f_netinteractive() -{ - local value - f_getvar $VAR_NETINTERACTIVE value && [ "$value" ] -} - -# f_zfsinteractive -# -# Has the user specifically requested the ZFS-portion of configuration and -# setup to be performed interactively? Returns success if the user has asked -# for the ZFS configuration to be done interactively even if perhaps overall -# non-interactive mode has been requested (by setting nonInteractive). -# -# Returns success if $zfsInteractive is set and non-NULL. -# -f_zfsinteractive() -{ - local value - f_getvar $VAR_ZFSINTERACTIVE value && [ "$value" ] -} - -############################################################ MAIN - -# -# Variables that can be tweaked from config files -# -# Handle Variable Name -f_variable_new VAR_CONFIG_FILE configFile -f_variable_new VAR_DEBUG debug -f_variable_new VAR_DEBUG_FILE debugFile -f_variable_new VAR_DIRECTORY_PATH _directoryPath -f_variable_new VAR_DOMAINNAME domainname -f_variable_new VAR_EDITOR editor -f_variable_new VAR_EXTRAS ifconfig_ -f_variable_new VAR_FTP_DIR ftpDirectory -f_variable_new VAR_FTP_HOST ftpHost -f_variable_new VAR_FTP_PASS ftpPass -f_variable_new VAR_FTP_PATH _ftpPath -f_variable_new VAR_FTP_PORT ftpPort -f_variable_new VAR_FTP_STATE ftpState -f_variable_new VAR_FTP_USER ftpUser -f_variable_new VAR_GATEWAY defaultrouter -f_variable_new VAR_GROUP group -f_variable_new VAR_GROUP_GID groupGid -f_variable_new VAR_GROUP_MEMBERS groupMembers -f_variable_new VAR_GROUP_PASSWORD groupPassword -f_variable_new VAR_HOSTNAME hostname -f_variable_new VAR_HTTP_DIR httpDirectory -f_variable_new VAR_HTTP_FTP_MODE httpFtpMode -f_variable_new VAR_HTTP_HOST httpHost -f_variable_new VAR_HTTP_PATH _httpPath -f_variable_new VAR_HTTP_PORT httpPort -f_variable_new VAR_HTTP_PROXY httpProxy -f_variable_new VAR_HTTP_PROXY_HOST httpProxyHost -f_variable_new VAR_HTTP_PROXY_PATH _httpProxyPath -f_variable_new VAR_HTTP_PROXY_PORT httpProxyPort -f_variable_new VAR_IFCONFIG ifconfig_ -f_variable_new VAR_IPADDR ipaddr -f_variable_new VAR_IPV6ADDR ipv6addr -f_variable_new VAR_IPV6_ENABLE ipv6_activate_all_interfaces -f_variable_new VAR_KEYMAP keymap -f_variable_new VAR_MEDIA_TIMEOUT MEDIA_TIMEOUT -f_variable_new VAR_MEDIA_TYPE mediaType -f_variable_new VAR_NAMESERVER nameserver -f_variable_new VAR_NETINTERACTIVE netInteractive -f_variable_new VAR_NETMASK netmask -f_variable_new VAR_NETWORK_DEVICE netDev -f_variable_new VAR_NFS_HOST nfsHost -f_variable_new VAR_NFS_PATH nfsPath -f_variable_new VAR_NFS_SECURE nfs_reserved_port_only -f_variable_new VAR_NFS_TCP nfs_use_tcp -f_variable_new VAR_NFS_V3 nfs_use_v3 -f_variable_new VAR_NONINTERACTIVE nonInteractive -f_variable_new VAR_NO_CONFIRM noConfirm -f_variable_new VAR_NO_ERROR noError -f_variable_new VAR_NO_INET6 noInet6 -f_variable_new VAR_PACKAGE package -f_variable_new VAR_PKG_TMPDIR PKG_TMPDIR -f_variable_new VAR_PORTS_PATH ports -f_variable_new VAR_RELNAME releaseName -f_variable_new VAR_SLOW_ETHER slowEthernetCard -f_variable_new VAR_TRY_DHCP tryDHCP -f_variable_new VAR_TRY_RTSOL tryRTSOL -f_variable_new VAR_UFS_PATH ufs -f_variable_new VAR_USER user -f_variable_new VAR_USER_ACCOUNT_EXPIRE userAccountExpire -f_variable_new VAR_USER_DOTFILES_CREATE userDotfilesCreate -f_variable_new VAR_USER_GECOS userGecos -f_variable_new VAR_USER_GID userGid -f_variable_new VAR_USER_GROUPS userGroups -f_variable_new VAR_USER_GROUP_DELETE userGroupDelete -f_variable_new VAR_USER_HOME userHome -f_variable_new VAR_USER_HOME_CREATE userHomeCreate -f_variable_new VAR_USER_HOME_DELETE userHomeDelete -f_variable_new VAR_USER_LOGIN_CLASS userLoginClass -f_variable_new VAR_USER_PASSWORD userPassword -f_variable_new VAR_USER_PASSWORD_EXPIRE userPasswordExpire -f_variable_new VAR_USER_SHELL userShell -f_variable_new VAR_USER_UID userUid -f_variable_new VAR_ZFSINTERACTIVE zfsInteractive - -# -# Self-initialize unless requested otherwise -# -f_dprintf "%s: VARIABLE_SELF_INITIALIZE=[%s]" \ - variable.subr "$VARIABLE_SELF_INITIALIZE" -case "$VARIABLE_SELF_INITIALIZE" in -""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;; -*) f_variable_set_defaults -esac - -f_dprintf "%s: Successfully loaded." variable.subr - -fi # ! $_VARIABLE_SUBR |