rcdelete revision 240684
1238438Sdteske#!/bin/sh 2238438Sdteske#- 3238438Sdteske# Copyright (c) 2012 Devin Teske 4238438Sdteske# All Rights Reserved. 5238438Sdteske# 6238438Sdteske# Redistribution and use in source and binary forms, with or without 7238438Sdteske# modification, are permitted provided that the following conditions 8238438Sdteske# are met: 9238438Sdteske# 1. Redistributions of source code must retain the above copyright 10238438Sdteske# notice, this list of conditions and the following disclaimer. 11238438Sdteske# 2. Redistributions in binary form must reproduce the above copyright 12238438Sdteske# notice, this list of conditions and the following disclaimer in the 13238438Sdteske# documentation and/or other materials provided with the distribution. 14238438Sdteske# 15238438Sdteske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16238438Sdteske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE 17238438Sdteske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18238438Sdteske# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19238438Sdteske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20238438Sdteske# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21238438Sdteske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22238438Sdteske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23238438Sdteske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24238438Sdteske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25238438Sdteske# SUCH DAMAGE. 26238438Sdteske# 27238438Sdteske# $FreeBSD: head/usr.sbin/bsdconfig/startup/rcdelete 240684 2012-09-18 22:28:42Z dteske $ 28238438Sdteske# 29238438Sdteske############################################################ INCLUDES 30238438Sdteske 31240684SdteskeBSDCFG_SHARE="/usr/share/bsdconfig" 32240684Sdteske. $BSDCFG_SHARE/common.subr || exit 1 33240684Sdteskef_include $BSDCFG_SHARE/dialog.subr 34240684Sdteskef_include $BSDCFG_SHARE/mustberoot.subr 35240684Sdteskef_include $BSDCFG_SHARE/sysrc.subr 36240684Sdteskef_include $BSDCFG_SHARE/startup/rcconf.subr 37238438Sdteske 38240684SdteskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="140.startup" 39238438Sdteskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr 40238438Sdteske 41238438Sdteskeipgm=$( f_index_menu_selection $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" ) 42238438Sdteske[ $? -eq $SUCCESS -a "$ipgm" ] && pgm="$ipgm" 43238438Sdteske 44238438Sdteske############################################################ GLOBALS 45238438Sdteske 46238438Sdteske# 47238438Sdteske# Global map/menu-list for the main menu 48238438Sdteske# 49238438SdteskeRCCONF_MAP= 50238438Sdteske_RCCONF_MAP= 51238438SdteskeRCCONF_MENU_LIST= 52238438Sdteske 53238438Sdteske# 54238438Sdteske# Options 55238438Sdteske# 56238438Sdteske# Inherit SHOW_DESC value if set, otherwise default to 1 57238438Sdteske( : ${SHOW_DESC?} ) > /dev/null 2>&1 || SHOW_DESC=1 58238438Sdteske# Selectively inherit SHOW_* value (in order of preference) 59238438Sdteskeif [ "$SHOW_DEFAULT_VALUE" ]; then 60238438Sdteske SHOW_DEFAULT_VALUE=1 61238438Sdteske SHOW_CONFIGURED= 62238438Sdteske SHOW_VALUE= 63238438Sdteskeelif [ "$SHOW_CONFIGURED" ]; then 64238438Sdteske SHOW_DEFAULT_VALUE= 65238438Sdteske SHOW_CONFIGURED=1 66238438Sdteske SHOW_VALUE= 67238438Sdteskeelse 68238438Sdteske SHOW_DEFAULT_VALUE= 69238438Sdteske SHOW_CONFIGURED= 70238438Sdteske SHOW_VALUE=1 71238438Sdteskefi 72238438Sdteske 73238438Sdteske############################################################ FUNCTIONS 74238438Sdteske 75238438Sdteske# dialog_menu_main 76238438Sdteske# 77238438Sdteske# Display the dialog(1)-based application main menu. 78238438Sdteske# 79238438Sdteskedialog_menu_main() 80238438Sdteske{ 81238438Sdteske local size 82238438Sdteske local hline="$hline_arrows_tab_enter" 83238438Sdteske local prompt="" 84238438Sdteske 85238438Sdteske RCCONF_MENU_LIST=" 86238438Sdteske 'X $msg_exit_cancel' '$msg_exit_cancel_desc' 87238438Sdteske ${SHOW_DESC:+'$msg_exit_cancel_help'} 88238438Sdteske '> $msg_delete_selected' '$msg_delete_selected_desc' 89238438Sdteske ${SHOW_DESC:+'$msg_delete_selected_help'} 90238438Sdteske '> $msg_all' '$msg_all_desc' 91238438Sdteske ${SHOW_DESC:+'$msg_all_help'} 92238438Sdteske '> $msg_none' '$msg_none_desc' 93238438Sdteske ${SHOW_DESC:+'$msg_none_help'} 94238438Sdteske ${USE_XDIALOG:+ 95238438Sdteske '> $msg_view_details' '$msg_view_details_desc' 96238438Sdteske ${SHOW_DESC:+'$msg_view_details_help'} 97238438Sdteske } 98238438Sdteske " # END-QUOTE 99238438Sdteske 100238438Sdteske if [ ! "$_RCCONF_MAP" ]; then 101238438Sdteske # Genreate RCCONF_MAP of `var desc ...' per-line 102238438Sdteske f_dialog_info "$msg_creating_rcconf_map" 103238438Sdteske RCCONF_MAP=$( f_startup_rcconf_map ) 104238438Sdteske export RCCONF_MAP 105238438Sdteske # Generate _${var}_desc variables from $RCCONF_MAP 106238438Sdteske f_startup_rcconf_map_expand 107238438Sdteske export _RCCONF_MAP=1 108238438Sdteske fi 109238438Sdteske 110238438Sdteske # Show infobox for modes that take a while to calculate/display 111238438Sdteske [ "$SHOW_DEFAULT_VALUE" -o "$SHOW_CONFIGURED" ] && 112238438Sdteske f_dialog_info "$msg_creating_menu_list" 113238438Sdteske 114238438Sdteske RCCONF_MENU_LIST="$RCCONF_MENU_LIST $( 115238438Sdteske . "$RC_DEFAULTS" > /dev/null 116238438Sdteske source_rc_confs > /dev/null 117238438Sdteske var_list=$( f_startup_rcconf_list ) 118238438Sdteske for var in $var_list; do 119238438Sdteske eval export $var 120238438Sdteske [ "$SHOW_DEFAULT_VALUE" ] && export \ 121238438Sdteske _${var}_default="$( f_sysrc_get_default $var )" 122238438Sdteske [ "$SHOW_CONFIGURED" ] && export \ 123238438Sdteske _${var}_file="$( f_sysrc_find $var )" 124238438Sdteske done 125238438Sdteske export SHOW_VALUE SHOW_DESC SHOW_DEFAULT_VALUE SHOW_CONFIGURED 126238438Sdteske export msg_default_value 127238438Sdteske echo "$var_list" | awk ' 128238438Sdteske BEGIN { 129238438Sdteske prefix = "" 130238438Sdteske } 131238438Sdteske { 132238438Sdteske cur_prefix = tolower(substr($1, 1, 1)) 133238438Sdteske printf "'\''" 134238438Sdteske if ( prefix != cur_prefix ) 135238438Sdteske prefix = cur_prefix 136238438Sdteske else 137238438Sdteske printf " " 138238438Sdteske var = $1 139238438Sdteske printf "%s'\'' '\''[", var 140238438Sdteske if ( ENVIRON["_" var "_delete"] ) 141238438Sdteske printf "X" 142238438Sdteske else 143238438Sdteske printf " " 144238438Sdteske printf "] " 145238438Sdteske if ( ENVIRON["SHOW_DEFAULT_VALUE"] ) { 146238438Sdteske default = ENVIRON["_" var "_default"] 147238438Sdteske gsub(/'\''/, "'\''\\'\'\''", default) 148238438Sdteske value = ENVIRON[var] 149238438Sdteske gsub(/'\''/, "'\''\\'\'\''", value) 150238438Sdteske printf ENVIRON["msg_default_value"] "; %s", 151238438Sdteske default, value 152238438Sdteske } else if ( ENVIRON["SHOW_CONFIGURED"] ) { 153238438Sdteske printf "%s", ENVIRON["_" var "_file"] 154238438Sdteske } else { # SHOW_VALUE (default behavior) 155238438Sdteske value = ENVIRON[var] 156238438Sdteske gsub(/'\''/, "'\''\\'\'\''", value) 157238438Sdteske printf "%s", value 158238438Sdteske } 159238438Sdteske printf "'\''" 160238438Sdteske if ( ENVIRON["SHOW_DESC"] ) { 161238438Sdteske desc = ENVIRON["_" var "_desc"] 162238438Sdteske gsub(/'\''/, "'\''\\'\'\''", desc) 163238438Sdteske printf " '\''%s'\''", desc 164238438Sdteske } 165238438Sdteske printf "\n" 166238438Sdteske }' 167238438Sdteske )" 168238438Sdteske 169238438Sdteske set -f # noglob 170238438Sdteske 171238438Sdteske size=$( eval f_dialog_menu_${SHOW_DESC:+with_help_}size \ 172238438Sdteske \"\$DIALOG_TITLE\" \ 173238438Sdteske \"\$DIALOG_BACKTITLE\" \ 174238438Sdteske \"\$prompt\" \ 175238438Sdteske \"\$hline\" \ 176238438Sdteske $RCCONF_MENU_LIST ) 177238438Sdteske 178238438Sdteske eval $DIALOG \ 179238438Sdteske --clear --title \"\$DIALOG_TITLE\" \ 180238438Sdteske --backtitle \"\$DIALOG_BACKTITLE\" \ 181238438Sdteske --hline \"\$hline\" \ 182238438Sdteske --ok-label \"\$msg_ok\" \ 183238438Sdteske --cancel-label \"\$msg_cancel\" \ 184238438Sdteske --help-button \ 185238438Sdteske --help-label \"\$msg_details\" \ 186238438Sdteske ${SHOW_DESC:+--item-help} \ 187238438Sdteske --menu \"\$prompt\" $size \ 188238438Sdteske $RCCONF_MENU_LIST \ 189238438Sdteske 2> "$DIALOG_TMPDIR/dialog.menu.$$" 190238438Sdteske} 191238438Sdteske 192238438Sdteske# dialog_menu_delete $var1 [$var2 ...] 193238438Sdteske# 194238438Sdteske# Get the user's blessing to delete one or more variables. 195238438Sdteske# if (and only-if) the user confirms (does not press ESC or Cancel/NO). 196238438Sdteske# 197238438Sdteskedialog_menu_delete() 198238438Sdteske{ 199238438Sdteske local size 200238438Sdteske local hline="$hline_arrows_tab_enter" 201238438Sdteske local prompt="$msg_are_you_sure_you_want_delete_the_following" 202238438Sdteske local var_list menu_list 203238438Sdteske 204238438Sdteske [ $# -ge 1 ] || return $FAILURE 205238438Sdteske 206238438Sdteske if [ $# -eq 1 ]; then 207238438Sdteske msg=$( printf "$msg_are_you_sure_you_want_to_delete" \ 208238438Sdteske "$delete_vars" ) 209238438Sdteske f_dialog_noyes "$msg" 210238438Sdteske return $? 211238438Sdteske fi 212238438Sdteske 213238438Sdteske var_list=$( for var in $*; do echo "$var"; done | sort -u ) 214238438Sdteske menu_list=$( 215238438Sdteske . "$RC_DEFAULTS" 216238438Sdteske source_rc_confs 217238438Sdteske echo "$var_list" | awk ' 218238438Sdteske BEGIN { 219238438Sdteske prefix = "" 220238438Sdteske } 221238438Sdteske { 222238438Sdteske cur_prefix = tolower(substr($1, 1, 1)) 223238438Sdteske printf "'\''" 224238438Sdteske if ( prefix != cur_prefix ) 225238438Sdteske prefix = cur_prefix 226238438Sdteske else 227238438Sdteske printf " " 228238438Sdteske var = $1 229238438Sdteske printf "%s'\'' '\'\''\n", var 230238438Sdteske }' 231238438Sdteske ) 232238438Sdteske 233238438Sdteske size=$( eval f_dialog_menu_size \ 234238438Sdteske \"\$DIALOG_TITLE\" \ 235238438Sdteske \"\$DIALOG_BACKTITLE\" \ 236238438Sdteske \"\$prompt\" \ 237238438Sdteske \"\$hline\" \ 238238438Sdteske $menu_list ) 239238438Sdteske 240238438Sdteske local defaultno="defaultno" 241238438Sdteske [ "$USE_XDIALOG" ] && defaultno="default-no" 242238438Sdteske 243238438Sdteske eval $DIALOG \ 244238438Sdteske --clear --title \"\$DIALOG_TITLE\" \ 245238438Sdteske --backtitle \"\$DIALOG_BACKTITLE\" \ 246238438Sdteske --hline \"\$hline\" \ 247238438Sdteske --$defaultno \ 248238438Sdteske --ok-label \"\$msg_ok\" \ 249238438Sdteske --cancel-label \"\$msg_cancel\" \ 250238438Sdteske --menu \"\$prompt\" $size \ 251238438Sdteske $menu_list \ 252238438Sdteske 2> "$DIALOG_TMPDIR/dialog.menu.$$" 253238438Sdteske} 254238438Sdteske 255238438Sdteske############################################################ MAIN 256238438Sdteske 257238438Sdteske# Incorporate rc-file if it exists 258238438Sdteske[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc" 259238438Sdteske 260238438Sdteske# 261238438Sdteske# Process command-line arguments 262238438Sdteske# 263238438Sdteskewhile getopts hSX flag; do 264238438Sdteske case "$flag" in 265238438Sdteske h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm";; 266238438Sdteske esac 267238438Sdteskedone 268238438Sdteskeshift $(( $OPTIND - 1 )) 269238438Sdteske 270238438Sdteske# 271238438Sdteske# Initialize 272238438Sdteske# 273238438Sdteskef_dialog_init 274238438Sdteskef_dialog_title "$msg_delete_startup_directives" 275238438Sdteskef_dialog_backtitle "${ipgm:+bsdconfig }$pgm" 276238438Sdteskef_mustberoot_init 277238438Sdteske 278238438Sdteskewhile :; do 279238438Sdteske dialog_menu_main 280238438Sdteske retval=$? 281238438Sdteske mtag=$( f_dialog_menutag ) 282238438Sdteske 283238438Sdteske if [ "$USE_XDIALOG" ]; then 284238438Sdteske case "$mtag" in 285238438Sdteske "> $msg_view_details") 286238438Sdteske f_dialog_input_view_details 287238438Sdteske continue 288238438Sdteske esac 289238438Sdteske elif [ $retval -eq 2 ]; then 290238438Sdteske # The ``Help'' button (labeled "Details") was pressed 291238438Sdteske f_dialog_input_view_details 292238438Sdteske continue 293238438Sdteske fi 294238438Sdteske 295238438Sdteske [ $retval -eq 0 ] || f_die 296238438Sdteske 297238438Sdteske case "$mtag" in 298238438Sdteske "X $msg_exit_cancel") break ;; 299238438Sdteske "> $msg_delete_selected") 300238438Sdteske delete_vars= 301238438Sdteske for var in $( f_startup_rcconf_list ); do 302238438Sdteske [ "$( eval echo \$_${var}_delete )" ] || continue 303238438Sdteske delete_vars="$delete_vars${delete_vars:+ }$var" 304238438Sdteske done 305238438Sdteske unset var # no longer needed 306238438Sdteske if dialog_menu_delete $delete_vars; then 307238438Sdteske f_dialog_title "$msg_info" 308238438Sdteske f_dialog_info "$msg_deleting_selected_directives" 309238438Sdteske f_dialog_title_restore 310238438Sdteske for var in $delete_vars; do 311238438Sdteske err=$( f_sysrc_delete $var 2>&1 ) 312238438Sdteske if [ $? -ne $SUCCESS ]; then 313238438Sdteske f_show_msg "%s\n" "$err" 314238438Sdteske break 315238438Sdteske fi 316238438Sdteske done 317238438Sdteske unset var # no longer needed 318238438Sdteske fi 319238438Sdteske ;; 320238438Sdteske "> $msg_all") 321238438Sdteske for var in $( f_startup_rcconf_list ); do 322238438Sdteske setvar _${var}_delete 1 323238438Sdteske export _${var}_delete 324238438Sdteske done 325238438Sdteske unset var # no longer needed 326238438Sdteske ;; 327238438Sdteske "> $msg_none") 328238438Sdteske var_list=$( set | awk -F= " 329238438Sdteske /$STARTUP_RCCONF_REGEX/ { 330238438Sdteske if (\$1 ~ /^_[[:alpha:]_][[:alnum:]_]*_delete/) 331238438Sdteske print \$1 332238438Sdteske }" 333238438Sdteske ) 334238438Sdteske [ "$var_list" ] && unset $var_list 335238438Sdteske unset var_list # no longer needed 336238438Sdteske ;; 337238438Sdteske *) # Anything else is a variable to edit 338238438Sdteske var="${mtag# }" 339238438Sdteske 340238438Sdteske # Toggle the state-variable and loop back to menu 341238438Sdteske if ( eval : \${_${var}_delete?} ) > /dev/null 2>&1; then 342238438Sdteske unset _${var}_delete 343238438Sdteske else 344238438Sdteske setvar _${var}_delete 1 345238438Sdteske export _${var}_delete 346238438Sdteske fi 347238438Sdteske unset var # no longer needed 348238438Sdteske esac 349238438Sdteskedone 350238438Sdteske 351238438Sdteskeexit $SUCCESS 352238438Sdteske 353238438Sdteske################################################################################ 354238438Sdteske# END 355238438Sdteske################################################################################ 356