rcconf revision 260678
1303231Sdim#!/bin/sh 2303231Sdim#- 3303231Sdim# Copyright (c) 2012-2013 Devin Teske 4303231Sdim# All rights reserved. 5303231Sdim# 6303231Sdim# Redistribution and use in source and binary forms, with or without 7303231Sdim# modification, are permitted provided that the following conditions 8303231Sdim# are met: 9303231Sdim# 1. Redistributions of source code must retain the above copyright 10303231Sdim# notice, this list of conditions and the following disclaimer. 11303231Sdim# 2. Redistributions in binary form must reproduce the above copyright 12303231Sdim# notice, this list of conditions and the following disclaimer in the 13303231Sdim# documentation and/or other materials provided with the distribution. 14303231Sdim# 15303231Sdim# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16303231Sdim# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17303231Sdim# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18303231Sdim# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19314564Sdim# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20303231Sdim# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21314564Sdim# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22321369Sdim# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23314564Sdim# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24303231Sdim# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25314564Sdim# SUCH DAMAGE. 26314564Sdim# 27321369Sdim# $FreeBSD: stable/10/usr.sbin/bsdconfig/startup/rcconf 260678 2014-01-15 07:49:17Z dteske $ 28321369Sdim# 29321369Sdim############################################################ INCLUDES 30314564Sdim 31314564SdimBSDCFG_SHARE="/usr/share/bsdconfig" 32314564Sdim. $BSDCFG_SHARE/common.subr || exit 1 33303231Sdimf_dprintf "%s: loading includes..." "$0" 34303231Sdimf_include $BSDCFG_SHARE/dialog.subr 35303231Sdimf_include $BSDCFG_SHARE/mustberoot.subr 36314564Sdimf_include $BSDCFG_SHARE/sysrc.subr 37314564Sdimf_include $BSDCFG_SHARE/startup/rcconf.subr 38303231Sdim 39303231SdimBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="140.startup" 40303231Sdimf_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr 41314564Sdim 42314564Sdimf_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" ipgm && 43303231Sdim pgm="${ipgm:-$pgm}" 44303231Sdim 45303231Sdim############################################################ GLOBALS 46303231Sdim 47303231Sdim# 48303231Sdim# Global map/menu-list for the main menu 49303231Sdim# 50303231SdimRCCONF_MAP= 51303231Sdim_RCCONF_MAP= 52303231Sdim 53303231Sdim# 54303231Sdim# Options 55303231Sdim# 56303231Sdim# Inherit SHOW_DESC value if set, otherwise default to 1 57303231Sdim[ "${SHOW_DESC+set}" ] || SHOW_DESC=1 58303231Sdim# Selectively inherit SHOW_* value (in order of preference) 59303231Sdimif [ "$SHOW_DEFAULT_VALUE" ]; then 60303231Sdim SHOW_DEFAULT_VALUE=1 61303231Sdim SHOW_CONFIGURED= 62303231Sdim SHOW_VALUE= 63303231Sdimelif [ "$SHOW_CONFIGURED" ]; then 64314564Sdim SHOW_DEFAULT_VALUE= 65314564Sdim SHOW_CONFIGURED=1 66314564Sdim SHOW_VALUE= 67314564Sdimelse 68314564Sdim SHOW_DEFAULT_VALUE= 69314564Sdim SHOW_CONFIGURED= 70314564Sdim SHOW_VALUE=1 71314564Sdimfi 72314564Sdim 73321369Sdim############################################################ FUNCTIONS 74321369Sdim 75321369Sdim# dialog_menu_main 76321369Sdim# 77321369Sdim# Display the dialog(1)-based application main menu. 78314564Sdim# 79314564Sdimdialog_menu_main() 80314564Sdim{ 81314564Sdim local prompt= 82321369Sdim local menu_list=" 83314564Sdim 'X $msg_exit' '$msg_exit_desc' 84314564Sdim ${SHOW_DESC:+'$msg_exit_this_menu'} 85321369Sdim '> $msg_add_new' '$msg_add_new_desc' 86321369Sdim ${SHOW_DESC:+'$msg_add_new_help'} 87321369Sdim '> $msg_delete' '$msg_delete_desc' 88321369Sdim ${SHOW_DESC:+'$msg_delete_help'} 89314564Sdim ${USE_XDIALOG:+ 90314564Sdim '> $msg_view_details' '$msg_view_details_desc' 91314564Sdim ${SHOW_DESC:+'$msg_view_details_help'} 92314564Sdim } 93321369Sdim " # END-QUOTE 94321369Sdim local defaultitem= # Calculated below 95321369Sdim local hline="$hline_arrows_tab_enter" 96314564Sdim 97321369Sdim if [ ! "$_RCCONF_MAP" ]; then 98321369Sdim # Genreate RCCONF_MAP of `var desc ...' per-line 99314564Sdim f_dialog_info "$msg_creating_rcconf_map" 100321369Sdim f_startup_rcconf_map RCCONF_MAP 101321369Sdim export RCCONF_MAP 102321369Sdim # Generate _${var}_desc variables from $RCCONF_MAP 103314564Sdim f_startup_rcconf_map_expand RCCONF_MAP 104314564Sdim export _RCCONF_MAP=1 105314564Sdim fi 106314564Sdim 107314564Sdim # Show infobox for modes that take a while to calculate/display 108314564Sdim [ "$SHOW_DEFAULT_VALUE" -o "$SHOW_CONFIGURED" ] && 109321369Sdim f_dialog_info "$msg_creating_menu_list" 110321369Sdim 111321369Sdim menu_list="$menu_list $( 112314564Sdim . "$RC_DEFAULTS" > /dev/null 113314564Sdim source_rc_confs > /dev/null 114314564Sdim var_list=$( f_startup_rcconf_list ) 115321369Sdim for var in $var_list; do 116314564Sdim eval export $var 117321369Sdim [ "$SHOW_DEFAULT_VALUE" ] && export \ 118321369Sdim _${var}_default="$( f_sysrc_get_default $var )" 119321369Sdim [ "$SHOW_CONFIGURED" ] && export \ 120321369Sdim _${var}_file="$( f_sysrc_find $var )" 121321369Sdim done 122321369Sdim export SHOW_VALUE SHOW_DESC SHOW_DEFAULT_VALUE SHOW_CONFIGURED 123321369Sdim export msg_default_value 124321369Sdim echo "$var_list" | awk ' 125321369Sdim BEGIN { 126321369Sdim prefix = "" 127321369Sdim } 128321369Sdim { 129321369Sdim cur_prefix = tolower(substr($1, 1, 1)) 130314564Sdim printf "'\''" 131314564Sdim if ( prefix != cur_prefix ) 132321369Sdim prefix = cur_prefix 133321369Sdim else 134314564Sdim printf " " 135321369Sdim var = $1 136321369Sdim printf "%s'\'' '\''", var 137314564Sdim if ( ENVIRON["SHOW_DEFAULT_VALUE"] ) { 138314564Sdim default = ENVIRON["_" var "_default"] 139314564Sdim gsub(/'\''/, "'\''\\'\'\''", default) 140314564Sdim value = ENVIRON[var] 141321369Sdim gsub(/'\''/, "'\''\\'\'\''", value) 142321369Sdim printf ENVIRON["msg_default_value"] "; %s", 143321369Sdim default, value 144314564Sdim } else if ( ENVIRON["SHOW_CONFIGURED"] ) { 145321369Sdim printf "%s", ENVIRON["_" var "_file"] 146314564Sdim } else { # SHOW_VALUE (default behavior) 147314564Sdim value = ENVIRON[var] 148321369Sdim gsub(/'\''/, "'\''\\'\'\''", value) 149314564Sdim printf "%s", value 150314564Sdim } 151321369Sdim printf "'\''" 152321369Sdim if ( ENVIRON["SHOW_DESC"] ) { 153321369Sdim desc = ENVIRON["_" var "_desc"] 154321369Sdim gsub(/'\''/, "'\''\\'\'\''", desc) 155314564Sdim printf " '\''%s'\''", desc 156314564Sdim } 157314564Sdim printf "\n" 158314564Sdim }' 159314564Sdim )" 160314564Sdim 161314564Sdim set -f # set noglob because descriptions in the $menu_list may contain 162314564Sdim # `*' and get expanded by dialog(1) (doesn't affect Xdialog(1)). 163314564Sdim # This prevents dialog(1) from expanding wildcards in help line. 164314564Sdim 165314564Sdim local height width rows 166314564Sdim eval f_dialog_menu${SHOW_DESC:+_with_help}_size \ 167314564Sdim height width rows \ 168314564Sdim \"\$DIALOG_TITLE\" \ 169314564Sdim \"\$DIALOG_BACKTITLE\" \ 170314564Sdim \"\$prompt\" \ 171314564Sdim \"\$hline\" \ 172314564Sdim $menu_list 173314564Sdim 174314564Sdim # Obtain default-item from previously stored selection 175314564Sdim f_dialog_default_fetch defaultitem 176314564Sdim 177314564Sdim local menu_choice 178314564Sdim menu_choice=$( eval $DIALOG \ 179314564Sdim --title \"\$DIALOG_TITLE\" \ 180314564Sdim --backtitle \"\$DIALOG_BACKTITLE\" \ 181314564Sdim --hline \"\$hline\" \ 182314564Sdim --ok-label \"\$msg_ok\" \ 183314564Sdim --cancel-label \"\$msg_cancel\" \ 184314564Sdim --help-button \ 185314564Sdim --help-label \"\$msg_details\" \ 186314564Sdim ${SHOW_DESC:+--item-help} \ 187314564Sdim --default-item \"\$defaultitem\" \ 188314564Sdim --menu \"\$prompt\" \ 189314564Sdim $height $width $rows \ 190314564Sdim $menu_list \ 191314564Sdim 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 192314564Sdim ) 193314564Sdim local retval=$? 194314564Sdim f_dialog_data_sanitize menu_choice 195314564Sdim f_dialog_menutag_store "$menu_choice" 196314564Sdim 197314564Sdim # Only update default-item on success 198314564Sdim [ $retval -eq $DIALOG_OK ] && f_dialog_default_store "$menu_choice" 199314564Sdim 200314564Sdim return $retval 201314564Sdim} 202314564Sdim 203314564Sdim############################################################ MAIN 204314564Sdim 205314564Sdim# Incorporate rc-file if it exists 206314564Sdim[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc" 207314564Sdim 208314564Sdim# 209314564Sdim# Process command-line arguments 210314564Sdim# 211314564Sdimwhile getopts h$GETOPTS_STDARGS flag; do 212314564Sdim case "$flag" in 213314564Sdim h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm" ;; 214314564Sdim esac 215314564Sdimdone 216314564Sdimshift $(( $OPTIND - 1 )) 217314564Sdim 218314564Sdim# 219314564Sdim# Initialize 220314564Sdim# 221314564Sdimf_dialog_title "$msg_view_edit_startup_configuration" 222314564Sdimf_dialog_backtitle "${ipgm:+bsdconfig }$pgm" 223314564Sdimf_mustberoot_init 224314564Sdim 225314564Sdim# 226314564Sdim# Launch application main menu 227314564Sdim# 228314564Sdimwhile :; do 229314564Sdim dialog_menu_main 230314564Sdim retval=$? 231314564Sdim f_dialog_menutag_fetch mtag 232314564Sdim 233314564Sdim if [ "$USE_XDIALOG" ]; then 234314564Sdim case "$mtag" in 235314564Sdim "> $msg_view_details") 236314564Sdim f_dialog_input_view_details 237314564Sdim continue 238314564Sdim esac 239314564Sdim elif [ $retval -eq $DIALOG_HELP ]; then 240314564Sdim # The ``Help'' button (labeled "Details") was pressed 241314564Sdim f_dialog_input_view_details 242314564Sdim continue 243314564Sdim fi 244314564Sdim 245314564Sdim [ $retval -eq $DIALOG_OK ] || f_die 246314564Sdim 247314564Sdim case "$mtag" in 248314564Sdim "X $msg_exit") break ;; 249314564Sdim "> $msg_add_new") $BSDCFG_LIBE/$APP_DIR/rcadd ${USE_XDIALOG:+-X} ;; 250314564Sdim "> $msg_delete") 251314564Sdim # rcdelete has a similar interface that can inherit the below: 252314564Sdim export SHOW_VALUE SHOW_DESC SHOW_DEFAULT_VALUE SHOW_CONFIGURED 253314564Sdim $BSDCFG_LIBE/$APP_DIR/rcdelete ${USE_XDIALOG:+-X} 254314564Sdim ;; 255314564Sdim *) # Anything else is a variable to edit 256314564Sdim $BSDCFG_LIBE/$APP_DIR/rcedit ${USE_XDIALOG:+-X} "${mtag# }" 257314564Sdim esac 258314564Sdimdone 259314564Sdim 260314564Sdimexit $SUCCESS 261314564Sdim 262314564Sdim################################################################################ 263314564Sdim# END 264314564Sdim################################################################################ 265314564Sdim