rcconf revision 252987
1185377Ssam#!/bin/sh 2187831Ssam#- 3185377Ssam# Copyright (c) 2012-2013 Devin Teske 4185377Ssam# All rights reserved. 5185377Ssam# 6185377Ssam# Redistribution and use in source and binary forms, with or without 7185377Ssam# modification, are permitted provided that the following conditions 8185377Ssam# are met: 9185377Ssam# 1. Redistributions of source code must retain the above copyright 10185377Ssam# notice, this list of conditions and the following disclaimer. 11185377Ssam# 2. Redistributions in binary form must reproduce the above copyright 12185377Ssam# notice, this list of conditions and the following disclaimer in the 13185377Ssam# documentation and/or other materials provided with the distribution. 14185377Ssam# 15185377Ssam# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16185377Ssam# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17187831Ssam# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18185377Ssam# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19185377Ssam# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20185377Ssam# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21185377Ssam# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22185377Ssam# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23185377Ssam# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24185377Ssam# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25185377Ssam# SUCH DAMAGE. 26185377Ssam# 27185377Ssam# $FreeBSD: head/usr.sbin/bsdconfig/startup/rcconf 252987 2013-07-07 18:51:44Z dteske $ 28185377Ssam# 29185377Ssam############################################################ INCLUDES 30185377Ssam 31185377SsamBSDCFG_SHARE="/usr/share/bsdconfig" 32185377Ssam. $BSDCFG_SHARE/common.subr || exit 1 33185377Ssamf_dprintf "%s: loading includes..." "$0" 34185377Ssamf_include $BSDCFG_SHARE/dialog.subr 35185377Ssamf_include $BSDCFG_SHARE/mustberoot.subr 36185377Ssamf_include $BSDCFG_SHARE/sysrc.subr 37185377Ssamf_include $BSDCFG_SHARE/startup/rcconf.subr 38185377Ssam 39185377SsamBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="140.startup" 40185377Ssamf_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr 41185377Ssam 42185377Ssamipgm=$( f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" ) 43185377Ssam[ $? -eq $SUCCESS -a "$ipgm" ] && pgm="$ipgm" 44185377Ssam 45185377Ssam############################################################ GLOBALS 46185377Ssam 47185377Ssam# 48185377Ssam# Global map/menu-list for the main menu 49185377Ssam# 50185377SsamRCCONF_MAP= 51185377Ssam_RCCONF_MAP= 52185377Ssam 53185377Ssam# 54185377Ssam# Options 55185377Ssam# 56185377Ssam# Inherit SHOW_DESC value if set, otherwise default to 1 57185377Ssam[ "${SHOW_DESC+set}" ] || SHOW_DESC=1 58185377Ssam# Selectively inherit SHOW_* value (in order of preference) 59185377Ssamif [ "$SHOW_DEFAULT_VALUE" ]; then 60185377Ssam SHOW_DEFAULT_VALUE=1 61185377Ssam SHOW_CONFIGURED= 62185377Ssam SHOW_VALUE= 63185377Ssamelif [ "$SHOW_CONFIGURED" ]; then 64185377Ssam SHOW_DEFAULT_VALUE= 65185377Ssam SHOW_CONFIGURED=1 66185377Ssam SHOW_VALUE= 67185377Ssamelse 68185377Ssam SHOW_DEFAULT_VALUE= 69185377Ssam SHOW_CONFIGURED= 70185377Ssam SHOW_VALUE=1 71185377Ssamfi 72185377Ssam 73185377Ssam############################################################ FUNCTIONS 74185377Ssam 75185377Ssam# dialog_menu_main 76185377Ssam# 77185377Ssam# Display the dialog(1)-based application main menu. 78185377Ssam# 79185377Ssamdialog_menu_main() 80185377Ssam{ 81185377Ssam local prompt= 82185377Ssam local menu_list=" 83185377Ssam 'X $msg_exit' '$msg_exit_desc' 84185377Ssam ${SHOW_DESC:+'$msg_exit_this_menu'} 85185377Ssam '> $msg_add_new' '$msg_add_new_desc' 86185377Ssam ${SHOW_DESC:+'$msg_add_new_help'} 87185377Ssam '> $msg_delete' '$msg_delete_desc' 88185377Ssam ${SHOW_DESC:+'$msg_delete_help'} 89185377Ssam ${USE_XDIALOG:+ 90185377Ssam '> $msg_view_details' '$msg_view_details_desc' 91185377Ssam ${SHOW_DESC:+'$msg_view_details_help'} 92185377Ssam } 93185377Ssam " # END-QUOTE 94185377Ssam local defaultitem= # Calculated below 95185377Ssam local hline="$hline_arrows_tab_enter" 96185377Ssam 97185377Ssam if [ ! "$_RCCONF_MAP" ]; then 98185377Ssam # Genreate RCCONF_MAP of `var desc ...' per-line 99185377Ssam f_dialog_info "$msg_creating_rcconf_map" 100185377Ssam f_startup_rcconf_map RCCONF_MAP 101185377Ssam export RCCONF_MAP 102185377Ssam # Generate _${var}_desc variables from $RCCONF_MAP 103185377Ssam f_startup_rcconf_map_expand RCCONF_MAP 104185377Ssam export _RCCONF_MAP=1 105185377Ssam fi 106185377Ssam 107185377Ssam # Show infobox for modes that take a while to calculate/display 108185377Ssam [ "$SHOW_DEFAULT_VALUE" -o "$SHOW_CONFIGURED" ] && 109185377Ssam f_dialog_info "$msg_creating_menu_list" 110185377Ssam 111185377Ssam menu_list="$menu_list $( 112185377Ssam . "$RC_DEFAULTS" > /dev/null 113185377Ssam source_rc_confs > /dev/null 114185377Ssam var_list=$( f_startup_rcconf_list ) 115185377Ssam for var in $var_list; do 116185377Ssam eval export $var 117185377Ssam [ "$SHOW_DEFAULT_VALUE" ] && export \ 118185377Ssam _${var}_default="$( f_sysrc_get_default $var )" 119185377Ssam [ "$SHOW_CONFIGURED" ] && export \ 120185377Ssam _${var}_file="$( f_sysrc_find $var )" 121185377Ssam done 122185377Ssam export SHOW_VALUE SHOW_DESC SHOW_DEFAULT_VALUE SHOW_CONFIGURED 123185377Ssam export msg_default_value 124185377Ssam echo "$var_list" | awk ' 125185377Ssam BEGIN { 126185377Ssam prefix = "" 127185377Ssam } 128185377Ssam { 129185377Ssam cur_prefix = tolower(substr($1, 1, 1)) 130185377Ssam printf "'\''" 131185377Ssam if ( prefix != cur_prefix ) 132185377Ssam prefix = cur_prefix 133185377Ssam else 134185377Ssam printf " " 135185377Ssam var = $1 136185377Ssam printf "%s'\'' '\''", var 137185377Ssam if ( ENVIRON["SHOW_DEFAULT_VALUE"] ) { 138185377Ssam default = ENVIRON["_" var "_default"] 139185377Ssam gsub(/'\''/, "'\''\\'\'\''", default) 140185377Ssam value = ENVIRON[var] 141185377Ssam gsub(/'\''/, "'\''\\'\'\''", value) 142185377Ssam printf ENVIRON["msg_default_value"] "; %s", 143185377Ssam default, value 144185377Ssam } else if ( ENVIRON["SHOW_CONFIGURED"] ) { 145185377Ssam printf "%s", ENVIRON["_" var "_file"] 146185377Ssam } else { # SHOW_VALUE (default behavior) 147185377Ssam value = ENVIRON[var] 148185377Ssam gsub(/'\''/, "'\''\\'\'\''", value) 149185377Ssam printf "%s", value 150185377Ssam } 151185377Ssam printf "'\''" 152185377Ssam if ( ENVIRON["SHOW_DESC"] ) { 153185377Ssam desc = ENVIRON["_" var "_desc"] 154185377Ssam gsub(/'\''/, "'\''\\'\'\''", desc) 155185377Ssam printf " '\''%s'\''", desc 156185377Ssam } 157185377Ssam printf "\n" 158185377Ssam }' 159185377Ssam )" 160185377Ssam 161185377Ssam set -f # set noglob because descriptions in the $menu_list may contain 162185377Ssam # `*' and get expanded by dialog(1) (doesn't affect Xdialog(1)). 163185377Ssam # This prevents dialog(1) from expanding wildcards in help line. 164185377Ssam 165185377Ssam local height width rows 166185377Ssam eval f_dialog_menu${SHOW_DESC:+_with_help}_size \ 167185377Ssam height width rows \ 168185377Ssam \"\$DIALOG_TITLE\" \ 169185377Ssam \"\$DIALOG_BACKTITLE\" \ 170185377Ssam \"\$prompt\" \ 171185377Ssam \"\$hline\" \ 172185377Ssam $menu_list 173185377Ssam 174185377Ssam # Obtain default-item from previously stored selection 175185377Ssam f_dialog_default_fetch defaultitem 176185377Ssam 177185377Ssam local menu_choice 178185377Ssam menu_choice=$( eval $DIALOG \ 179185377Ssam --title \"\$DIALOG_TITLE\" \ 180185377Ssam --backtitle \"\$DIALOG_BACKTITLE\" \ 181185377Ssam --hline \"\$hline\" \ 182185377Ssam --ok-label \"\$msg_ok\" \ 183185377Ssam --cancel-label \"\$msg_cancel\" \ 184185377Ssam --help-button \ 185185377Ssam --help-label \"\$msg_details\" \ 186185377Ssam ${SHOW_DESC:+--item-help} \ 187185377Ssam --default-item \"\$defaultitem\" \ 188185377Ssam --menu \"\$prompt\" \ 189185377Ssam $height $width $rows \ 190185377Ssam $menu_list \ 191185377Ssam 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 192185377Ssam ) 193185377Ssam local retval=$? 194185377Ssam f_dialog_data_sanitize menu_choice 195185377Ssam f_dialog_menutag_store "$menu_choice" 196185377Ssam 197185377Ssam # Only update default-item on success 198185377Ssam [ $retval -eq 0 ] && f_dialog_default_store "$menu_choice" 199185377Ssam 200185377Ssam return $retval 201185377Ssam} 202185377Ssam 203185377Ssam############################################################ MAIN 204185377Ssam 205185377Ssam# Incorporate rc-file if it exists 206185377Ssam[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc" 207185377Ssam 208185377Ssam# 209185377Ssam# Process command-line arguments 210185377Ssam# 211185377Ssamwhile getopts h$GETOPTS_STDARGS flag; do 212185377Ssam case "$flag" in 213185377Ssam h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm" ;; 214185377Ssam esac 215185377Ssamdone 216185377Ssamshift $(( $OPTIND - 1 )) 217185377Ssam 218185377Ssam# 219185377Ssam# Initialize 220185377Ssam# 221185377Ssamf_dialog_title "$msg_view_edit_startup_configuration" 222185377Ssamf_dialog_backtitle "${ipgm:+bsdconfig }$pgm" 223185377Ssamf_mustberoot_init 224185377Ssam 225185377Ssam# 226185377Ssam# Launch application main menu 227185377Ssam# 228185377Ssamwhile :; do 229185377Ssam dialog_menu_main 230185377Ssam retval=$? 231185377Ssam f_dialog_menutag_fetch mtag 232185377Ssam 233185377Ssam if [ "$USE_XDIALOG" ]; then 234185377Ssam case "$mtag" in 235185377Ssam "> $msg_view_details") 236187831Ssam f_dialog_input_view_details 237185377Ssam continue 238185377Ssam esac 239185377Ssam elif [ $retval -eq 2 ]; then 240185377Ssam # The ``Help'' button (labeled "Details") was pressed 241185377Ssam f_dialog_input_view_details 242185377Ssam continue 243185377Ssam fi 244185377Ssam 245185377Ssam [ $retval -eq 0 ] || f_die 246185377Ssam 247185377Ssam case "$mtag" in 248185377Ssam "X $msg_exit") break ;; 249185377Ssam "> $msg_add_new") $BSDCFG_LIBE/$APP_DIR/rcadd ${USE_XDIALOG:+-X} ;; 250185377Ssam "> $msg_delete") 251185377Ssam # rcdelete has a similar interface that can inherit the below: 252185377Ssam export SHOW_VALUE SHOW_DESC SHOW_DEFAULT_VALUE SHOW_CONFIGURED 253185377Ssam $BSDCFG_LIBE/$APP_DIR/rcdelete ${USE_XDIALOG:+-X} 254185377Ssam ;; 255185377Ssam *) # Anything else is a variable to edit 256185377Ssam $BSDCFG_LIBE/$APP_DIR/rcedit ${USE_XDIALOG:+-X} "${mtag# }" 257187831Ssam esac 258185377Ssamdone 259185377Ssam 260185377Ssamexit $SUCCESS 261185377Ssam 262185377Ssam################################################################################ 263185377Ssam# END 264185377Ssam################################################################################ 265185377Ssam