summaryrefslogtreecommitdiffstats
path: root/usr.sbin/bsdconfig/usermgmt/share/user_input.subr
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/bsdconfig/usermgmt/share/user_input.subr')
-rw-r--r--usr.sbin/bsdconfig/usermgmt/share/user_input.subr1345
1 files changed, 829 insertions, 516 deletions
diff --git a/usr.sbin/bsdconfig/usermgmt/share/user_input.subr b/usr.sbin/bsdconfig/usermgmt/share/user_input.subr
index c95685c..39578c8 100644
--- a/usr.sbin/bsdconfig/usermgmt/share/user_input.subr
+++ b/usr.sbin/bsdconfig/usermgmt/share/user_input.subr
@@ -1,7 +1,7 @@
if [ ! "$_USERMGMT_USER_INPUT_SUBR" ]; then _USERMGMT_USER_INPUT_SUBR=1
#
# Copyright (c) 2012 Ron McDowell
-# Copyright (c) 2012-2013 Devin Teske
+# Copyright (c) 2012-2014 Devin Teske
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -48,39 +48,57 @@ f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
############################################################ FUNCTIONS
-# f_get_member_groups $user
+# f_get_member_groups $var_to_set $user
#
# Get a list of additional groups $user is a member of in group(5).
#
f_get_member_groups()
{
- echo $( pw groupshow -a | awk -F: "/[:,]$1(,|\$)/{print \$1}" )
+ f_replaceall "$( pw groupshow -a | awk -F: -v user="$2" '{
+ if (!split($4, users, /,/)) next
+ for (u in users) if (users[u] == user) { print $1; next }
+ }' )" "[$NL]" "," "$1"
}
# f_input_user $user
#
-# Given $user name or id, create the environment variables pw_name, pw_uid,
-# pw_gid, pw_class, pw_password_expire, pw_account_expire, pw_gecos,
-# pw_home_dir, pw_shell, and pw_member_groups (and pw_password is reset to
-# NULL).
+# Given $user name or id, create the environment variables user_name, user_uid,
+# user_gid, user_class, user_password_expire, user_account_expire, user_gecos,
+# user_home_dir, user_shell, and user_member_groups (and user_password is reset
+# to NULL).
#
f_input_user()
{
+ local funcname=f_input_user
local user="$1"
- eval $( pw usershow "$user" | awk -F: '
+
+ f_dprintf "$funcname: Getting info for user \`%s'" "$user"
+ eval "$( pw usershow "$user" 2> /dev/null | awk -F: '
+ function set_value(var, value) {
+ gsub(/'\''/, "'\''\\'\'\''", value)
+ printf "user_%s='\'%s\''\n", var, value
+ }
{
- printf "pw_name='\'%s\''\n", $1
- printf "pw_password=\n"
- printf "pw_uid='\'%s\''\n", $3
- printf "pw_gid='\'%s\''\n", $4
- printf "pw_class='\'%s\''\n", $5
- printf "pw_password_expire='\'%s\''\n", $6
- printf "pw_account_expire='\'%s\''\n", $7
- printf "pw_gecos='\'%s\''\n", $8
- printf "pw_home_dir='\'%s\''\n", $9
- printf "pw_shell='\'%s\''\n", $10
- }' )
- pw_member_groups=$( f_get_member_groups "$user" )
+ found = $1 != ""
+ set_value("name", $1 )
+ set_value("password", "" )
+ set_value("uid", $3 )
+ set_value("gid", $4 )
+ set_value("class", $5 )
+ set_value("password_expire", $6 )
+ set_value("account_expire", $7 )
+ set_value("gecos", $8 )
+ set_value("home_dir", $9 )
+ set_value("shell", $10)
+ exit
+ }
+ END { if (!found) print "false" }' )"
+ local retval=$?
+
+ f_dprintf "$funcname: Getting group memberships for user \`%s'" "$user"
+ f_get_member_groups user_member_groups "$user"
+
+ return $retval
}
# f_dialog_menu_user_list [$default]
@@ -99,10 +117,13 @@ f_dialog_menu_user_list()
# Add users from passwd(5)
menu_list="$menu_list $( pw usershow -a | awk -F: '
- !/^[[:space:]]*(#|$)/ {
- printf "'\'%s\'\ \'%s\''\n", $1, $8
- }'
- )"
+ function mprint(tag, item) {
+ gsub(/'\''/, "'\''\\'\'\''", tag)
+ gsub(/'\''/, "'\''\\'\'\''", item)
+ printf "'\'%s\'\ \'%s\''\n", tag, item
+ }
+ !/^[[:space:]]*(#|$)/ { mprint($1, $8) }
+ ' )"
local height width rows
eval f_dialog_menu_size height width rows \
@@ -130,760 +151,710 @@ f_dialog_menu_user_list()
return $retval
}
-# f_dialog_input_member_groups [$member_groups]
+# f_dialog_input_member_groups $var_to_set [$member_groups]
#
# Allows the user to edit group memberships for a given user. If the user does
-# not cancel or press ESC, the $pw_member_groups variable will hold the newly-
+# not cancel or press ESC, the $var_to_set variable will hold the newly-
# configured value upon return.
#
f_dialog_input_member_groups()
{
- local _member_groups="$1"
- local prompt="$msg_member_of_groups"
- local check_list= # Calculated below
- local hline="$hline_alnum_space_tab_enter"
- local group
+ local __var_to_set="$1" __input="$2"
+ local __prompt="$msg_member_of_groups"
+ local __menu_list="
+ 'X' '$msg_continue'
+ '1' '$msg_select_groups_from_list'
+ '2' '$msg_enter_groups_manually'
+ " # END-QUOTE
+ local __defaultitem=
+ local __hline="$hline_alnum_space_tab_enter"
- #
- # Generate the checklist menu
- #
- for group in $(
- pw groupshow -a | awk -F: '!/^[[:space:]]*(#|$)/{print $1}'
- ); do
- # Format of a checklist menu entry is "tag item status"
- # (setting both tag and item to the group name below).
- if echo "$_member_groups" | grep -q "\<$group\>"; then
- check_list="$check_list $group $group on"
- else
- check_list="$check_list $group $group off"
- fi
- done
+ local __mheight __mwidth __mrows
+ eval f_dialog_menu_size __mheight __mwidth __mrows \
+ \"\$DIALOG_TITLE\" \
+ \"\$DIALOG_BACKTITLE\" \
+ \"\$__prompt\" \
+ \"\$__hline\" \
+ $__menu_list
- #
- # Loop until the user provides taint-free/valid input
- #
- local height width rows
+ local __menu_choice __retval
while :; do
- eval f_dialog_checklist_size height width rows \
- \"\$DIALOG_TITLE\" \
- \"\$DIALOG_BACKTITLE\" \
- \"\$prompt\" \
- \"\$hline\" \
- $check_list
- _member_groups=$( eval $DIALOG \
+ __menu_choice=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
- --separate-output \
- --hline \"\$hline\" \
+ --hline \"\$__hline\" \
--ok-label \"\$msg_ok\" \
--cancel-label \"\$msg_cancel\" \
- --checklist \"\$prompt\" \
- $height $width $rows \
- $check_list \
+ --default-item \"\$__defaultitem\" \
+ --menu \"\$__prompt\" \
+ $__mheight $__mwidth $__mrows \
+ $__menu_list \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
- ) || return $?
- # Return if user either pressed ESC or chose Cancel/No
- f_dialog_data_sanitize _member_groups
-
- #
- # Validate each of the groups the user has entered
- #
- local all_groups_valid=1
- for group in $_member_groups; do
- if ! f_quietly pw groupshow -n "$group"; then
- f_show_msg "$msg_group_not_found" "$group"
- all_groups_valid=
- break
- fi
- done
- [ "$all_groups_valid" ] || continue
+ )
+ __retval=$?
+ f_dialog_data_sanitize __menu_choice
+ __defaultitem="$__menu_choice"
+ f_dprintf "retval=%u menu_choice=[%s]" \
+ $__retval "$__menu_choice"
- pw_member_groups="$_member_groups"
- break
- done
- save_flag=1
+ # Return if user has either pressed ESC or chosen Cancel/No
+ [ $__retval -eq $DIALOG_OK ] || return $__retval
- f_dprintf "pw_member_groups: [%s]->[%s]" \
- "$cur_pw_member_groups" "$pw_member_groups"
+ local __member_groups
+ case "$__menu_choice" in
+ X) # Exit
+ break ;;
+ 1) # Select Groups from a list
+ local __check_list= # Calculated below
+ local __group_list __g __grp __length=0
+ __group_list=$( pw groupshow -a |
+ awk -F: '!/^[[:space:]]*(#|$)/{print $1}' )
+ while [ $__length -ne ${#__group_list} ]; do
+ __g="${__group_list%%$NL*}" # First line
+ f_shell_escape "$__g" __grp
+
+ # Format of a checklist entry: tag item status
+ # NB: Setting both tag/item to group name below
+ __check_list="$__check_list '$__grp' '$__grp'"
+ case "$__input" in
+ "$__g"|"$__g",*|*,"$__g",*|*,"$__g")
+ __check_list="$__check_list on" ;;
+ *)
+ __check_list="$__check_list off"
+ esac
+
+ __length=${#__group_list}
+ __group_list="${__group_list#*$NL}" # Kill line
+ done
+
+ local __cheight __cwidth __crows
+
+ eval f_dialog_checklist_size \
+ __cheight __cwidth __crows \
+ \"\$DIALOG_TITLE\" \
+ \"\$DIALOG_BACKTITLE\" \
+ \"\$__prompt\" \
+ \"\$__hline\" \
+ $__check_list
+ __member_groups=$( eval $DIALOG \
+ --title \"\$DIALOG_TITLE\" \
+ --backtitle \"\$DIALOG_BACKTITLE\" \
+ --separate-output \
+ --hline \"\$__hline\" \
+ --ok-label \"\$msg_ok\" \
+ --cancel-label \"\$msg_cancel\" \
+ --checklist \"\$__prompt\" \
+ $__cheight $__cwidth $__crows \
+ $__check_list \
+ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
+ ) || continue
+ # Return to previous menu if user either
+ # pressed ESC or chose Cancel/No
+ f_dialog_data_sanitize __member_groups
+
+ #
+ # Convert the newline separated list into a comma-
+ # separated one so that if the user switches over to
+ # manual editing, list reflects checklist selections
+ #
+ f_replaceall "$__member_groups" "[$NL]" "," __input
+ ;;
+ 2) # Enter Groups manually
+ local __prompt2="$msg_groups"
+ __prompt2="$__prompt2 ($msg_separated_by_commas)"
+
+ f_dialog_input __member_groups \
+ "$__prompt2" "$__input" \
+ "$hline_num_tab_enter" || continue
+ # Return to previous menu if user either
+ # pressed ESC or chose Cancel/No
+
+ #
+ # Validate each of the groups the user has entered
+ #
+ local __all_groups_valid=1 __grp __grp_list
+ f_replaceall "$__member_groups" "," " " __grp_list
+ for __grp in $__grp_list; do
+ if ! f_quietly pw groupshow -n "$__grp"; then
+ f_show_msg "$msg_group_not_found" \
+ "$__grp"
+ __all_groups_valid=
+ break
+ fi
+ done
+ [ "$__all_groups_valid" ] || continue
+
+ __input="$__member_groups"
+ ;;
+ esac
+ done
+ setvar "$__var_to_set" "$__input"
return $DIALOG_OK
}
-# f_dialog_input_name [$name]
+# f_dialog_input_name $var_to_set [$name]
#
# Allows the user to enter a new username for a given user. If the user does
-# not cancel or press ESC, the $pw_name variable will hold the newly-configured
-# value upon return.
-#
-# If $cur_pw_name is defined, the user can enter that and by-pass error-
-# checking (allowing the user to "revert" to an old value without, for example,
-# being told that the username already exists).
+# not cancel or press ESC, the $var_to_set variable will hold the newly-
+# configured value upon return.
#
f_dialog_input_name()
{
+ local __var_to_set="$1" __name="$2"
+
#
# Loop until the user provides taint-free/valid input
#
- local _name="$1" _input="$1"
+ local __input="$__name"
while :; do
-
# Return if user has either pressed ESC or chosen Cancel/No
- f_dialog_input _input "$msg_login" "$_input" \
+ f_dialog_input __input "$msg_login" "$__input" \
"$hline_alnum_tab_enter" || return $?
# Check for no-change
- [ "$_input" = "$_name" ] && return $DIALOG_OK
-
- # Check for reversion
- if [ "$_input" = "$cur_pw_name" ]; then
- pw_name="$cur_pw_name"
+ if [ "$__input" = "$__name" ]; then
+ setvar "$__var_to_set" "$__input"
return $DIALOG_OK
fi
# Check for NULL entry
- if [ ! "$_input" ]; then
+ if [ ! "$__input" ]; then
f_show_msg "$msg_login_is_empty"
continue
fi
# Check for invalid entry
- if ! echo "$_input" | grep -q "^[[:alpha:]]"; then
+ case "$__input" in [!a-zA-Z]*)
f_show_msg "$msg_login_must_start_with_letter"
continue
- fi
+ esac
# Check for duplicate entry
- if f_quietly pw usershow -n "$_input"; then
- f_show_msg "$msg_login_already_used" "$_input"
+ if f_quietly pw usershow -n "$__input"; then
+ f_show_msg "$msg_login_already_used" "$__input"
continue
fi
- pw_name="$_input"
+ setvar "$__var_to_set" "$__input"
break
done
- save_flag=1
-
- f_dprintf "pw_name: [%s]->[%s]" "$cur_pw_name" "$pw_name"
return $DIALOG_OK
}
-# f_dialog_input_password
+# f_dialog_input_password $var_to_set $dvar_to_set
#
-# Prompt the user to enter a password (twice).
+# Prompt the user to enter a password (twice). If the user does not cancel or
+# press ESC, $var_to_set will hold the confirmed user entry. Otherwise, if the
+# user cancels or enters a NULL password (twice), they are given the choice to
+# disable password authentication for the given login, wherein $dvar_to_set has
+# a value of 1 to indicate password authentication should be disabled.
#
f_dialog_input_password()
{
- local prompt1="$msg_password"
- local prompt2="$msg_reenter_password"
- local hline="$hline_alnum_punc_tab_enter"
+ local __var_to_set="$1" __dvar_to_set="$2"
+ local __prompt1="$msg_password"
+ local __prompt2="$msg_reenter_password"
+ local __hline="$hline_alnum_punc_tab_enter"
- local height1 width1
- f_dialog_inputbox_size height1 width1 \
+ local __height1 __width1
+ f_dialog_inputbox_size __height1 __width1 \
"$DIALOG_TITLE" \
"$DIALOG_BACKTITLE" \
- "$prompt1" \
+ "$__prompt1" \
"" \
- "$hline"
- local height2 width2
- f_dialog_inputbox_size height2 width2 \
+ "$__hline"
+ local __height2 __width2
+ f_dialog_inputbox_size __height2 __width2 \
"$DIALOG_TITLE" \
"$DIALOG_BACKTITLE" \
- "$prompt2" \
+ "$__prompt2" \
"" \
- "$hline"
+ "$__hline"
#
# Loop until the user provides taint-free/valid input
#
- local _password1 _password2
+ local __retval __password1 __password2
while :; do
- _password1=$( $DIALOG \
+ __password1=$( $DIALOG \
--title "$DIALOG_TITLE" \
--backtitle "$DIALOG_BACKTITLE" \
- --hline "$hline" \
+ --hline "$__hline" \
--ok-label "$msg_ok" \
--cancel-label "$msg_cancel" \
--insecure \
- --passwordbox "$prompt1" \
- $height1 $width1 \
+ --passwordbox "$__prompt1" \
+ $__height1 $__width1 \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
) || return $?
# Return if user either pressed ESC or chose Cancel/No
- debug= f_dialog_line_sanitize _password1
+ debug= f_dialog_line_sanitize __password1
- _password2=$( $DIALOG \
+ __password2=$( $DIALOG \
--title "$DIALOG_TITLE" \
--backtitle "$DIALOG_BACKTITLE" \
- --hline "$hline" \
+ --hline "$__hline" \
--ok-label "$msg_ok" \
--cancel-label "$msg_cancel" \
--insecure \
- --passwordbox "$prompt2" \
- $height2 $width2 \
+ --passwordbox "$__prompt2" \
+ $__height2 $__width2 \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
) || return $?
# Return if user either pressed ESC or chose Cancel/No
- debug= f_dialog_line_sanitize _password2
+ debug= f_dialog_line_sanitize __password2
# Check for password mismatch
- if [ "$_password1" != "$_password2" ]; then
+ if [ "$__password1" != "$__password2" ]; then
f_show_msg "$msg_passwords_do_not_match"
continue
fi
# Check for NULL entry
- if [ ! "$_password1" ]; then
+ if [ ! "$__password1" ]; then
f_dialog_yesno "$msg_disable_password_auth_for_account"
- local retval=$?
- if [ $retval -eq $DIALOG_ESC ]; then
- return $retval
- elif [ $retval -eq $DIALOG_OK ]; then
- pw_password_disable=1
+ __retval=$?
+ if [ $__retval -eq $DIALOG_ESC ]; then
+ return $__retval
+ elif [ $__retval -eq $DIALOG_OK ]; then
+ setvar "$__dvar_to_set" 1
else
continue # back to password prompt
fi
else
- pw_password_disable=
+ setvar "$__dvar_to_set" ""
fi
- pw_password="$_password1"
+ setvar "$__var_to_set" "$__password1"
break
done
- save_flag=1
-
- f_dprintf "pw_password: [%s]->[%s]" "$cur_pw_password" "$pw_password"
return $DIALOG_OK
}
-# f_dialog_input_gecos [$gecos]
+# f_dialog_input_gecos $var_to_set [$gecos]
#
# Allow the user to enter new GECOS information for a given user. This
# information is commonly used to store the ``Full Name'' of the user. If the
-# user does not cancel or press ESC, the $pw_gecos variable will hold the
+# user does not cancel or press ESC, the $var_to_set variable will hold the
# newly-configured value upon return.
#
f_dialog_input_gecos()
{
- local _input="$1"
+ local __var_to_set="$1" __input="$2"
# Return if user has either pressed ESC or chosen Cancel/No
- f_dialog_input _input "$msg_full_name" "$_input" \
+ f_dialog_input __input "$msg_full_name" "$__input" \
"$hline_alnum_punc_tab_enter" || return $?
- pw_gecos="$_input"
- save_flag=1
-
- f_dprintf "pw_gecos: [%s]->[%s]" "$cur_pw_gecos" "$pw_gecos"
-
+ setvar "$__var_to_set" "$__input"
return $DIALOG_OK
}
-# f_dialog_input_uid [$uid]
+# f_dialog_input_uid $var_to_set [$uid]
#
# Allow the user to enter a new UID for a given user. If the user does not
-# cancel or press ESC, the $pw_uid variable will hold the newly-configured
+# cancel or press ESC, the $var_to_set variable will hold the newly-configured
# value upon return.
#
f_dialog_input_uid()
{
- local _input="$1"
+ local __var_to_set="$1" __input="$2"
# Return if user has either pressed ESC or chosen Cancel/No
- f_dialog_input _input "$msg_user_id_leave_empty_for_default" \
- "$_input" "$hline_num_tab_enter" || return $?
-
- pw_uid="$_input"
- save_flag=1
-
- f_dprintf "pw_uid: [%s]->[%s]" "$cur_pw_uid" "$pw_uid"
+ f_dialog_input __input "$msg_user_id_leave_empty_for_default" \
+ "$__input" "$hline_num_tab_enter" || return $?
+ setvar "$__var_to_set" "$__input"
return $DIALOG_OK
}
-# f_dialog_input_gid [$gid]
+# f_dialog_input_gid $var_to_set [$gid]
#
# Allow the user to enter a new primary GID for a given user. If the user does
-# not cancel or press ESC, the $pw_gid variable will hold the newly-configured
-# value upon return.
+# not cancel or press ESC, the $var_to_set variable will hold the newly-
+# configured value upon return.
#
f_dialog_input_gid()
{
- local _input="$1"
+ local __var_to_set="$1" __input="$2"
# Return if user has either pressed ESC or chosen Cancel/No
- f_dialog_input _input "$msg_group_id_leave_empty_for_default" \
- "$_input" "$hline_num_tab_enter" || return $?
-
- pw_gid="$_input"
- save_flag=1
-
- f_dprintf "pw_gid: [%s]->[%s]" "$cur_pw_gid" "$pw_gid"
+ f_dialog_input __input "$msg_group_id_leave_empty_for_default" \
+ "$__input" "$hline_num_tab_enter" || return $?
+ setvar "$__var_to_set" "$__input"
return $DIALOG_OK
}
-# f_dialog_input_class [$class]
+# f_dialog_input_class $var_to_set [$class]
#
# Allow the user to enter a new login class for a given user. If the user does
-# not cancel or press ESC, the $pw_class variable will hold the newly-
+# not cancel or press ESC, the $var_to_set variable will hold the newly-
# configured value upon return.
#
f_dialog_input_class()
{
- local _input="$1"
+ local __var_to_set="$1" __input="$2"
# Return if user has either pressed ESC or chosen Cancel/No
- f_dialog_input _input "$msg_login_class" "$_input" \
+ f_dialog_input __input "$msg_login_class" "$__input" \
"$hline_alnum_tab_enter" || return $?
- pw_class="$_input"
- save_flag=1
-
- f_dprintf "pw_class: [%s]->[%s]" "$cur_pw_class" "$pw_class"
-
+ setvar "$__var_to_set" "$__input"
return $DIALOG_OK
}
-# f_dialog_input_expire_password [$seconds]
+# f_dialog_input_expire_password $var_to_set [$seconds]
#
# Allow the user to enter a date/time (in number-of-seconds since the `epoch')
# for when a given user's password must be changed. If the user does not cancel
-# or press ESC, the $pw_password_expire variable will hold the newly-
-# configured value upon return.
+# or press ESC, the $var_to_set variable will hold the newly-configured value
+# upon return.
#
f_dialog_input_expire_password()
{
- local prompt="$msg_password_expires_on"
- local menu_list="
+ local __var_to_set="$1" __input="$2"
+ local __prompt="$msg_password_expires_on"
+ local __menu_list="
'1' '$msg_password_does_not_expire'
'2' '$msg_edit_date_time_with_a_calendar'
- '3' '$msg_enter_number_of_days_into_the_future'
- '4' '$msg_enter_value_manually'
+ '3' '$msg_enter_value_manually'
" # END-QUOTE
- local hline="$hline_num_arrows_tab_enter"
- local retval _input="$1"
+ local __defaultitem= # Calculated below
+ local __hline="$hline_num_arrows_tab_enter"
- local mheight mwidth mrows
- eval f_dialog_menu_size mheight mwidth mrows \
+ local __mheight __mwidth __mrows
+ eval f_dialog_menu_size __mheight __mwidth __mrows \
\"\$DIALOG_TITLE\" \
\"\$DIALOG_BACKTITLE\" \
- \"\$prompt\" \
- \"\$hline\" \
- $menu_list
- local cheight cwidth
- f_dialog_calendar_size cheight cwidth \
+ \"\$__prompt\" \
+ \"\$__hline\" \
+ $__menu_list
+ local __cheight __cwidth
+ f_dialog_calendar_size __cheight __cwidth \
"$DIALOG_TITLE" \
"$DIALOG_BACKTITLE" \
- "$prompt" \
- "$hline"
- local theight twidth
- f_dialog_timebox_size theight twidth \
+ "$__prompt" \
+ "$__hline"
+ local __theight __twidth
+ f_dialog_timebox_size __theight __twidth \
"$DIALOG_TITLE" \
"$DIALOG_BACKTITLE" \
- "$prompt" \
- "$hline"
+ "$__prompt" \
+ "$__hline"
#
# Loop until the user provides taint-free/cancellation-free input
#
- local date_type defaultitem=
+ local __retval __date_type
while :; do
- date_type=$( eval $DIALOG \
+ __date_type=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
- --hline \"\$hline\" \
- --default-item \"\$defaultitem\" \
+ --hline \"\$__hline\" \
+ --default-item \"\$__defaultitem\" \
--ok-label \"\$msg_ok\" \
--cancel-label \"\$msg_cancel\" \
- --menu \"\$prompt\" \
- $mheight $mwidth $mrows \
- $menu_list \
+ --menu \"\$__prompt\" \
+ $__mheight $__mwidth $__mrows \
+ $__menu_list \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
- retval=$?
- f_dialog_data_sanitize date_type
- defaultitem="$date_type"
- f_dprintf "retval=%u date_type=[%s]" $retval "$date_type"
+ __retval=$?
+ f_dialog_data_sanitize __date_type
+ __defaultitem="$__date_type"
+ f_dprintf "retval=%u date_type=[%s]" $__retval "$__date_type"
# Return if user has either pressed ESC or chosen Cancel/No
- [ $retval -eq $DIALOG_OK ] || return $retval
+ [ $__retval -eq $DIALOG_OK ] || return $__retval
- case "$date_type" in
+ case "$__date_type" in
1) # Password does not expire
- _input=""
- break ;;
+ __input= break ;;
2) # Edit date/time with a calendar
- local _input_date _input_time ret_date ret_time
+ local __input_date __input_time __ret_date __ret_time
- local secs="$_input"
- { f_isinteger "$secs" && [ $secs -gt 0 ]; } || secs=
- _input_date=$( date -j -f "%s" -- "$secs" \
+ local __seconds="$__input"
+ { f_isinteger "$__seconds" && [ $__seconds -gt 0 ]; } ||
+ __seconds=
+ __input_date=$( date -j -f "%s" -- "$__seconds" \
"+%d %m %Y" 2> /dev/null )
- ret_date=$( eval $DIALOG \
+ __ret_date=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
- --hline \"\$hline\" \
+ --hline \"\$__hline\" \
--ok-label \"\$msg_ok\" \
--cancel-label \"\$msg_cancel\" \
- --calendar \"\$prompt\" \
- $cheight $cwidth \
- $_input_date \
+ --calendar \"\$__prompt\" \
+ $__cheight $__cwidth \
+ $__input_date \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
- retval=$?
- f_dialog_data_sanitize ret_date
- f_dprintf "retval=%u ret_date=[%s]" $retval "$ret_date"
+ __retval=$?
+ f_dialog_data_sanitize __ret_date
+ f_dprintf "retval=%u ret_date=[%s]" \
+ $__retval "$__ret_date"
# Return to menu if either ESC or Cancel/No
- [ $retval -eq $DIALOG_OK ] || continue
+ [ $__retval -eq $DIALOG_OK ] || continue
- _input_time=
- [ "$secs" ] && _input_time=$( date -j \
- -f %s -- "$_input" "+%H %M %S" 2> /dev/null )
- ret_time=$( eval $DIALOG \
+ __input_time=
+ [ "$__seconds" ] && __input_time=$( date -j \
+ -f %s -- "$__input" "+%H %M %S" 2> /dev/null )
+ __ret_time=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
- --hline \"\$hline\" \
+ --hline \"\$__hline\" \
--ok-label \"\$msg_ok\" \
--cancel-label \"\$msg_cancel\" \
- --timebox \"\$prompt\" \
- $theight $twidth \
- $_input_time \
+ --timebox \"\$__prompt\" \
+ $__theight $__twidth \
+ $__input_time \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
- retval=$?
- f_dialog_data_sanitize ret_time
- f_dprintf "retval=%u ret_time=[%s]" $retval "$ret_time"
+ __retval=$?
+ f_dialog_data_sanitize __ret_time
+ f_dprintf "retval=%u ret_time=[%s]" \
+ $__retval "$__ret_time"
# Return to menu if either ESC or Cancel/No
- [ $retval -eq $DIALOG_OK ] || continue
+ [ $__retval -eq $DIALOG_OK ] || continue
- _input=$( date \
- -j -f "%d/%m/%Y %T" \
- -- "$ret_date $ret_time" \
- +%s 2> /dev/null )
- f_dprintf "_input=[%s]" "$_input"
+ __input=$( date -j -f "%d/%m/%Y %T" -- \
+ "$__ret_date $__ret_time" +%s 2> /dev/null )
+ f_dprintf "input=[%s]" "$__input"
break ;;
- 3) # Enter number of days into the future
- local ret_days seconds="$( date +%s )"
-
- f_isinteger "$_input" || _input=0
- [ $_input -gt 0 -a $_input -gt $seconds ] &&
- ret_days=$(( ( $_input - $seconds ) / 86400 ))
- f_isinteger "$ret_days" &&
- ret_days=$(( $ret_days + 1 ))
+ 3) # Enter value manually
+ local __msg __new_input
+ f_sprintf __msg "$msg_password_expire_manual_edit" \
+ "$( date -r 0 "+%c %Z" )"
# Return to menu if either ESC or Cancel/No
- f_dialog_input ret_days \
- "$msg_password_expires_in_how_many_days" \
- "$ret_days" "$hline" || continue
-
- # Taint-check the user's input
- if ! f_isinteger "$ret_days"; then
- f_show_msg "$msg_invalid_number_of_days"
- continue
- fi
+ f_dialog_input __new_input \
+ "$__msg" "$__input" "$__hline" || continue
- f_dprintf "ret_days=[%s]" "$ret_days"
- case "$ret_days" in
- [-+]*) _input=$( date -v${ret_days}d +%s ) ;;
- 0) _input=$( date +%s ) ;;
- *) _input=$( date -v+${ret_days}d +%s ) ;;
- esac
- f_dprintf "_input=[%s]" "$_input"
- break ;;
-
- 4) # Enter value manually
- local msg ret_secs
- f_sprintf msg "$msg_number_of_seconds_since_epoch" \
- "$( date -r 1 "+%c %Z" )"
-
- # Return to menu if either ESC or Cancel/No
- f_dialog_input ret_secs \
- "$msg" "$_input" "$hline" || continue
-
- _input="$ret_secs"
-
- # Taint-check the user's input
- if ! f_isinteger "${_input:-0}"; then
- f_show_msg "$msg_invalid_number_of_seconds"
- continue
- fi
-
- f_dprintf "_input=[%s]" "$_input"
+ __input="$__new_input"
+ f_dprintf "input=[%s]" "$__input"
break ;;
esac
done # Loop forever
- pw_password_expire="$_input"
- save_flag=1
-
- f_dprintf "pw_password_expire: [%s]->[%s]" \
- "$cur_pw_password_expire" "$pw_password_expire"
-
+ setvar "$__var_to_set" "$__input"
return $DIALOG_OK
}
-# f_dialog_input_expire_account [$seconds]
+# f_dialog_input_expire_account $var_to_set [$seconds]
#
# Allow the user to enter a date/time (in number-of-seconds since the `epoch')
# for when a given user's account should become expired. If the user does not
-# cancel or press ESC, the $pw_account_expire variable will hold the newly-
-# configured value upon return.
+# cancel or press ESC, the $var_to_set variable will hold the newly-configured
+# value upon return.
#
f_dialog_input_expire_account()
{
- local prompt="$msg_account_expires_on"
- local menu_list="
+ local __var_to_set="$1" __input="$2"
+ local __prompt="$msg_account_expires_on"
+ local __menu_list="
'1' '$msg_account_does_not_expire'
'2' '$msg_edit_date_time_with_a_calendar'
- '3' '$msg_enter_number_of_days_into_the_future'
- '4' '$msg_enter_value_manually'
+ '3' '$msg_enter_value_manually'
" # END-QUOTE
- local hline="$hline_num_arrows_tab_enter"
- local retval _input="$1"
+ local __defaultitem= # Calculated below
+ local __hline="$hline_num_arrows_tab_enter"
- local mheight mwidth mrows
- eval f_dialog_menu_size mheight mwidth mrows \
+ local __mheight __mwidth __mrows
+ eval f_dialog_menu_size __mheight __mwidth __mrows \
\"\$DIALOG_TITLE\" \
\"\$DIALOG_BACKTITLE\" \
- \"\$prompt\" \
- \"\$hline\" \
- $menu_list
- local cheight cwidth
- f_dialog_calendar_size cheight cwidth \
+ \"\$__prompt\" \
+ \"\$__hline\" \
+ $__menu_list
+ local __cheight __cwidth
+ f_dialog_calendar_size __cheight __cwidth \
"$DIALOG_TITLE" \
"$DIALOG_BACKTITLE" \
- "$prompt" \
- "$hline"
- local theight twidth
- f_dialog_timebox_size theight twidth \
+ "$__prompt" \
+ "$__hline"
+ local __theight __twidth
+ f_dialog_timebox_size __theight __twidth \
"$DIALOG_TITLE" \
"$DIALOG_BACKTITLE" \
- "$prompt" \
- "$hline"
+ "$__prompt" \
+ "$__hline"
#
# Loop until the user provides taint-free/cancellation-free input
#
- local date_type defaultitem=
+ local __retval __date_type
while :; do
- date_type=$( eval $DIALOG \
+ __date_type=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
- --hline \"\$hline\" \
- --default-item \"\$defaultitem\" \
+ --hline \"\$__hline\" \
+ --default-item \"\$__defaultitem\" \
--ok-label \"\$msg_ok\" \
--cancel-label \"\$msg_cancel\" \
- --menu \"\$prompt\" \
- $mheight $mwidth $mrows \
- $menu_list \
+ --menu \"\$__prompt\" \
+ $__mheight $__mwidth $__mrows \
+ $__menu_list \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
- retval=$?
- f_dialog_data_sanitize date_type
- defaultitem="$date_type"
- f_dprintf "retval=%u date_type=[%s]" $retval "$date_type"
+ __retval=$?
+ f_dialog_data_sanitize __date_type
+ __defaultitem="$__date_type"
+ f_dprintf "retval=%u date_type=[%s]" $__retval "$__date_type"
# Return if user has either pressed ESC or chosen Cancel/No
- [ $retval -eq $DIALOG_OK ] || return $retval
+ [ $__retval -eq $DIALOG_OK ] || return $__retval
- case "$date_type" in
+ case "$__date_type" in
1) # Account does not expire
- _input=""
- break ;;
+ __input= break ;;
2) # Edit date/time with a calendar
- local _input_date _input_time ret_date ret_time
+ local __input_date __input_time __ret_date __ret_time
- local secs="$_input"
- { f_isinteger "$secs" && [ $secs -gt 0 ]; } || secs=
- _input_date=$( date -j -f "%s" -- "$secs" \
+ local __seconds="$__input"
+ { f_isinteger "$__seconds" && [ $__seconds -gt 0 ]; } ||
+ __seconds=
+ __input_date=$( date -j -f "%s" -- "$__seconds" \
"+%d %m %Y" 2> /dev/null )
- ret_date=$( eval $DIALOG \
+ __ret_date=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
- --hline \"\$hline\" \
+ --hline \"\$__hline\" \
--ok-label \"\$msg_ok\" \
--cancel-label \"\$msg_cancel\" \
- --calendar \"\$prompt\" \
- $cheight $cwidth \
- $_input_date \
+ --calendar \"\$__prompt\" \
+ $__cheight $__cwidth \
+ $__input_date \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
- retval=$?
- f_dialog_data_sanitize ret_date
- f_dprintf "retval=%u ret_date=[%s]" $retval "$ret_date"
+ __retval=$?
+ f_dialog_data_sanitize __ret_date
+ f_dprintf "retval=%u ret_date=[%s]" \
+ $__retval "$__ret_date"
# Return to menu if either ESC or Cancel/No
- [ $retval -eq $DIALOG_OK ] || continue
+ [ $__retval -eq $DIALOG_OK ] || continue
- _input_time=
- [ "$secs" ] && _input_time=$( date -j \
- -f %s -- "$_input" "+%H %M %S" 2> /dev/null )
- ret_time=$( eval $DIALOG \
+ __input_time=
+ [ "$__seconds" ] && __input_time=$( date -j \
+ -f %s -- "$__input" "+%H %M %S" 2> /dev/null )
+ __ret_time=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
- --hline \"\$hline\" \
+ --hline \"\$__hline\" \
--ok-label \"\$msg_ok\" \
--cancel-label \"\$msg_cancel\" \
- --timebox \"\$prompt\" \
- $theight $twidth \
- $_input_time \
+ --timebox \"\$__prompt\" \
+ $__theight $__twidth \
+ $__input_time \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
)
- retval=$?
- f_dialog_data_sanitize ret_time
- f_dprintf "retval=%u ret_time=[%s]" $retval "$ret_time"
-
- # Return to menu if either ESC or Cancel/No
- [ $retval -eq $DIALOG_OK ] || continue
-
- _input=$( date \
- -j -f "%d/%m/%Y %T" \
- -- "$ret_date $ret_time" \
- +%s 2> /dev/null )
- f_dprintf "_input=[%s]" "$_input"
- break ;;
-
- 3) # Enter number of days into the future
- local ret_days seconds="$( date +%s )"
-
- f_isinteger "$_input" || _input=0
- [ $_input -gt 0 -a $_input -gt $seconds ] &&
- ret_days=$(( ( $_input - $seconds ) / 86400 ))
- f_isinteger "$ret_days" &&
- ret_days=$(( $ret_days + 1 ))
+ __retval=$?
+ f_dialog_data_sanitize __ret_time
+ f_dprintf "retval=%u ret_time=[%s]" \
+ $__retval "$__ret_time"
# Return to menu if either ESC or Cancel/No
- f_dialog_input ret_days \
- "$msg_account_expires_in_how_many_days" \
- "$ret_days" "$hline" || continue
-
- # Taint-check the user's input
- if ! f_isinteger "$ret_days"; then
- f_show_msg "$msg_invalid_number_of_days"
- continue
- fi
+ [ $__retval -eq $DIALOG_OK ] || continue
- f_dprintf "ret_days=[%s]" "$ret_days"
- case "$ret_days" in
- [-+]*) _input=$( date -v${ret_days}d +%s ) ;;
- 0) _input=$( date +%s ) ;;
- *) _input=$( date -v+${ret_days}d +%s ) ;;
- esac
- f_dprintf "_input=[%s]" "$_input"
+ __input=$( date -j -f "%d/%m/%Y %T" -- \
+ "$ret_date $ret_time" +%s 2> /dev/null )
+ f_dprintf "input=[%s]" "$__input"
break ;;
- 4) # Enter value manually
- local msg ret_secs
- f_sprintf msg "$msg_number_of_seconds_since_epoch" \
- "$( date -r 1 "+%c %Z" )"
+ 3) # Enter value manually
+ local __msg __new_input
+ f_sprintf __msg "$msg_account_expire_manual_edit" \
+ "$( date -r 0 "+%c %Z" )"
# Return to menu if either ESC or Cancel/No
- f_dialog_input ret_secs "$msg" \
- "$_input" "$hline" || continue
-
- _input="$ret_secs"
-
- # Taint-check the user's input
- if ! f_isinteger "${_input:-0}"; then
- f_show_msg "$msg_invalid_number_of_seconds"
- continue
- fi
+ f_dialog_input __new_input \
+ "$__msg" "$__input" "$__hline" || continue
- f_dprintf "_input=[%s]" "$_input"
+ __input="$__new_input"
+ f_dprintf "input=[%s]" "$__input"
break ;;
esac
done # Loop forever
- pw_account_expire="$_input"
- save_flag=1
-
- f_dprintf "pw_account_expire: [%s]->[%s]" \
- "$cur_pw_account_expire" "$pw_account_expire"
-
+ setvar "$__var_to_set" "$__input"
return $DIALOG_OK
}
-# f_dialog_input_home_dir [$home_dir]
+# f_dialog_input_home_dir $var_to_set [$home_dir]
#
-# Allow the user to enter a new home directory for a given user. If the user
-# does not cancel or press ESC, the $pw_home_dir variable will hold the newly-
+# Allow the user to enter a new home directory for a given login. If the user
+# does not cancel or press ESC, the $var_to_set variable will hold the newly-
# configured value upon return.
#
f_dialog_input_home_dir()
{
- local _input="$1"
+ local __var_to_set="$1" __input="$2"
# Return if user has either pressed ESC or chosen Cancel/No
- f_dialog_input _input "$msg_home_directory" "$_input" \
+ f_dialog_input __input "$msg_home_directory" "$__input" \
"$hline_alnum_punc_tab_enter" || return $?
- pw_home_dir="$_input"
- save_flag=1
-
- f_dprintf "pw_home_dir: [%s]->[%s]" "$cur_pw_home_dir" "$pw_home_dir"
-
+ setvar "$__var_to_set" "$__input"
return $DIALOG_OK
}
-# f_dialog_input_home_create
+# f_dialog_input_home_create $var_to_set
#
-# Prompt the user to confirm creation of a given user's home directory. If the
-# user does not cancel (by choosing "No") or press ESC, the $pw_home_create
+# Prompt the user to confirm creation of a given login's home directory. If the
+# user does not cancel (by choosing "No") or press ESC, the $var_to_set
# variable will hold $msg_yes upon return, otherwise $msg_no. Use these return
# variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible.
#
f_dialog_input_home_create()
{
- local retval
+ local __var_to_set="$1"
f_dialog_yesno "$msg_create_home_directory"
- retval=$?
+ local __retval=$?
- if [ $retval -eq $DIALOG_OK ]; then
- pw_home_create="$msg_yes"
+ if [ $__retval -eq $DIALOG_OK ]; then
+ setvar "$__var_to_set" "$msg_yes"
else
- pw_home_create="$msg_no"
+ setvar "$__var_to_set" "$msg_no"
fi
- save_flag=1
- f_dprintf "pw_home_create: [%s]->[%s]" \
- "$cur_pw_home_create" "$pw_home_create"
-
- [ $retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
+ [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
}
-# f_dialog_input_group_delete
+# f_dialog_input_group_delete $var_to_set [$group]
#
-# Prompt the user to confirm deletion of a given user's primary group. If the
-# user does not cancel (by choosing "No") or press ESC, the $pw_group_delete
+# Prompt the user to confirm deletion of a given login's primary group. If the
+# user does not cancel (by choosing "No") or press ESC, the $var_to_set
# variable will hold $msg_yes upon return, otherwise $msg_no. Use these return
# variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible.
#
f_dialog_input_group_delete()
{
- local retval
+ local __var_to_set="$1" __group="$2"
- if f_isinteger "$pw_gid"; then
- if [ $pw_gid -lt 1000 ]; then
+ if f_isinteger "$__group"; then
+ if [ $__group -lt 1000 ]; then
f_dialog_noyes "$msg_delete_primary_group"
else
f_dialog_yesno "$msg_delete_primary_group"
fi
- elif [ "$pw_gid" ]; then
- local gid=0
- gid=$( pw groupshow "$pw_gid" | awk -F: '{print $3}' )
- if f_isinteger "$gid" && [ $gid -lt 1000 ]; then
+ elif [ "$__group" ]; then
+ local __gid=0
+ __gid=$( pw groupshow "$__group" | awk -F: '{print $3}' )
+ if f_isinteger "$__gid" && [ $__gid -lt 1000 ]; then
f_dialog_noyes "$msg_delete_primary_group"
else
f_dialog_yesno "$msg_delete_primary_group"
@@ -891,131 +862,473 @@ f_dialog_input_group_delete()
else
f_dialog_yesno "$msg_delete_primary_group"
fi
- retval=$?
+ local __retval=$?
- if [ $retval -eq $DIALOG_OK ]; then
- pw_group_delete="$msg_yes"
+ if [ $__retval -eq $DIALOG_OK ]; then
+ setvar "$__var_to_set" "$msg_yes"
else
- pw_group_delete="$msg_no"
+ setvar "$__var_to_set" "$msg_no"
fi
- save_flag=1
-
- f_dprintf "pw_group_delete: [%s]->[%s]" \
- "$cur_pw_group_delete" "$pw_group_delete"
- [ $retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
+ [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
}
-# f_dialog_input_home_delete
+# f_dialog_input_home_delete $var_to_set
#
-# Prompt the user to confirm deletion of a given user's home directory. If the
-# user does not cancel (by choosing "No") or press ESC, the $pw_home_delete
+# Prompt the user to confirm deletion of a given login's home directory. If the
+# user does not cancel (by choosing "No") or press ESC, the $var_to_set
# variable will hold $msg_yes upon return, otherwise $msg_no. Use these return
# variables ($msg_yes and $msg_no) for comparisons to be i18n-compatible.
#
f_dialog_input_home_delete()
{
- local retval
+ local __var_to_set="$1"
f_dialog_yesno "$msg_delete_home_directory"
- retval=$?
+ local __retval=$?
- if [ $retval -eq $DIALOG_OK ]; then
- pw_home_delete="$msg_yes"
+ if [ $__retval -eq $DIALOG_OK ]; then
+ setvar "$__var_to_set" "$msg_yes"
else
- pw_home_delete="$msg_no"
+ setvar "$__var_to_set" "$msg_no"
fi
- save_flag=1
- f_dprintf "pw_home_delete: [%s]->[%s]" \
- "$cur_pw_home_delete" "$pw_home_delete"
-
- [ $retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
+ [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
}
-# f_dialog_input_dotfiles_create
+# f_dialog_input_dotfiles_create $var_to_set
#
-# Prompt the user to confirm population of a given user's home directory with
+# Prompt the user to confirm population of a given login's home directory with
# sample dotfiles. If the user does not cancel (by choosing "No") or press ESC,
-# the $pw_dotfiles_create variable will hold $msg_yes upon return, otherwise
-# $msg_no. Use these return variables ($msg_yes and $msg_no) for comparison to
-# be i18n-compatible.
+# the $var_to_set variable will hold $msg_yes upon return, otherwise $msg_no.
+# Use these return variables ($msg_yes and $msg_no) for comparison to be i18n-
+# compatible.
#
f_dialog_input_dotfiles_create()
{
- local retval
+ local __var_to_set="$1"
f_dialog_yesno "$msg_create_dotfiles"
- retval=$?
+ local __retval=$?
- if [ $retval -eq $DIALOG_OK ]; then
- pw_dotfiles_create="$msg_yes"
+ if [ $__retval -eq $DIALOG_OK ]; then
+ setvar "$__var_to_set" "$msg_yes"
else
- pw_dotfiles_create="$msg_no"
+ setvar "$__var_to_set" "$msg_no"
fi
- save_flag=1
-
- f_dprintf "pw_dotfiles_create: [%s]->[%s]" \
- "$cur_pw_dotfiles_create" "$pw_dotfiles_create"
- [ $retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
+ [ $__retval -ne $DIALOG_ESC ] # return failure if user pressed ESC
}
-# f_dialog_input_shell [$shell]
-#
-# Allow the user to select a new login shell for a given user. If the user does
-# not cancel or press ESC, the $pw_home_dir variable will hold the newly-
-# configured value upon return.
+# f_dialog_input_shell $var_to_set [$shell]
#
+# Allow the user to select a new shell for a given login. If the user does not
+# cancel or press ESC, the $var_to_set variable will hold the newly-configured
+# value upon return.
#
f_dialog_input_shell()
{
- local _input="$1"
- local prompt="$msg_select_login_shell"
- local radio_list= # Calculated below
- local hline="$hline_arrows_space_tab_enter"
+ local __funcname=f_dialog_input_shell
+ local __var_to_set="$1" __input="$2"
+ local __prompt="$msg_select_login_shell"
+ local __radio_list= # Calculated below
+ local __defaultitem="$2"
+ local __hline="$hline_arrows_space_tab_enter"
#
# Generate the radiolist of shells
#
- local shell
- for shell in $( awk '!/^[[:space:]]*(#|$)/{print}' "$ETC_SHELLS" ); do
- # Format of a radiolist menu entry is "tag item status"
- if [ "$shell" = "$_input" ]; then
- radio_list="$radio_list '$shell' '' 'on'"
+ local __shell_list __s __shell __length=0
+ f_eval_catch -k __shell_list $__funcname awk "awk '%s' \"%s\"" \
+ '!/^[[:space:]]*(#|$)/{print}' "$ETC_SHELLS" || return $FAILURE
+ while [ $__length -ne ${#__shell_list} ]; do
+ __s="${__shell_list%%$NL*}" # First line
+ f_shell_escape "$__s" __shell
+
+ # Format of a radiolist entry: tag item status
+ if [ "$__s" = "$__input" ]; then
+ __radio_list="$__radio_list '$__shell' '' 'on'"
else
- radio_list="$radio_list '$shell' '' 'off'"
+ __radio_list="$__radio_list '$__shell' '' 'off'"
fi
+
+ __length=${#__shell_list}
+ __shell_list="${__shell_list#*$NL}" # Kill line
done
- local height width rows
- eval f_dialog_radiolist_size height width rows \
+ local __height __width __rows
+ eval f_dialog_radiolist_size __height __width __rows \
\"\$DIALOG_TITLE\" \
\"\$DIALOG_BACKTITLE\" \
- \"\$prompt\" \
- \"\$hline\" \
- $radio_list
+ \"\$__prompt\" \
+ \"\$__hline\" \
+ $__radio_list
- _input=$( eval $DIALOG \
+ __input=$( eval $DIALOG \
--title \"\$DIALOG_TITLE\" \
--backtitle \"\$DIALOG_BACKTITLE\" \
- --hline \"\$hline\" \
+ --hline \"\$__hline\" \
--ok-label \"\$msg_ok\" \
--cancel-label \"\$msg_cancel\" \
- --radiolist \"\$prompt\" \
- $height $width $rows \
- $radio_list \
+ --default-item \"\$__defaultitem\" \
+ --radiolist \"\$__prompt\" \
+ $__height $__width $__rows \
+ $__radio_list \
2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
) || return $?
# Return if user either pressed ESC or chose Cancel/No
- f_dialog_data_sanitize _input
+ f_dialog_data_sanitize __input
- pw_shell="$_input"
- save_flag=1
+ setvar "$__var_to_set" "$__input"
+ return $DIALOG_OK
+}
- f_dprintf "pw_shell: [%s]->[%s]" "$cur_pw_shell" "$pw_shell"
+# f_dialog_menu_user_add [$defaultitem]
+#
+# Present a menu detailing the properties of a login that is about to be added.
+# The user's menu choice is available using f_dialog_menutag_fetch(). Returns
+# success unless the user chose Cancel or pressed ESC. Data to display is taken
+# from environment variables user_account_expire, user_class,
+# user_dotfiles_create, user_gecos, user_gid, user_home_create, user_home_dir,
+# user_member_groups, user_name, user_password_expire, user_shell, and
+# user_uid. If $defaultitem is present and non-NULL, initially highlight the
+# item in the menu.
+#
+f_dialog_menu_user_add()
+{
+ local funcname=f_dialog_menu_user_add
+ local prompt="$msg_save_exit_or_cancel"
+ local menu_list # Calculated below
+ local defaultitem="$1"
+ local hline="$hline_arrows_tab_enter"
- return $DIALOG_OK
+ # Attempt to convert numeric UNIX time to calendar date/time
+ local user_account_expires_on=
+ if f_isinteger "$user_account_expire"; then
+ [ "$user_account_expire" -ne 0 ] && user_account_expires_on=$(
+ date -r "$user_account_expire" "+%F %T %Z"
+ )
+ else
+ user_account_expires_on="$user_account_expire"
+ fi
+ local user_password_expires_on=
+ if f_isinteger "$user_password_expire"; then
+ [ $user_password_expire -ne 0 ] && user_password_expires_on=$(
+ date -r "$user_password_expire" "+%F %T %Z"
+ )
+ else
+ user_password_expires_on="$user_password_expire"
+ fi
+
+ # Attempt to translate a numeric GID into `number (name)'
+ if f_isinteger "$user_gid"; then
+ local user_group
+ user_group=$( pw groupshow -g "$user_gid" 2> /dev/null ) &&
+ user_gid="$user_gid (${user_group%%:*})"
+ fi
+
+ # Localize potentially hostile variables and escape their values
+ # to the local variable (see f_shell_escape() of `strings.subr')
+ local var
+ for var in account_expires_on class dotfiles_create gecos gid \
+ home_create home_dir member_groups name password_expires_on \
+ shell uid \
+ ; do
+ local _user_$var
+ eval f_shell_escape \"\$user_$var\" _user_$var
+ done
+
+ menu_list="
+ 'X' '$msg_add/$msg_exit'
+ '1' '$msg_login: $_user_name'
+ '2' '$msg_full_name: $_user_gecos'
+ '3' '$msg_password: -----'
+ '4' '$msg_user_id: $_user_uid'
+ '5' '$msg_group_id: $_user_gid'
+ '6' '$msg_member_of_groups: $_user_member_groups'
+ '7' '$msg_login_class: $_user_class'
+ '8' '$msg_password_expires_on: $_user_password_expires_on'
+ '9' '$msg_account_expires_on: $_user_account_expires_on'
+ 'A' '$msg_home_directory: $_user_home_dir'
+ 'B' '$msg_shell: $_user_shell'
+ " # END-QUOTE
+ case "$user_home_dir" in
+ /|/nonexistent|/var/empty) menu_list="$menu_list
+ '-' '$msg_create_home_directory: $msg_n_a'
+ '-' '$msg_create_dotfiles: $msg_n_a'
+ " # END-QUOTE
+ ;;
+ *) if [ -d "$user_home_dir" ]; then menu_list="$menu_list
+ '-' '$msg_create_home_directory: $msg_n_a'
+ 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}'
+ " # END-QUOTE
+ else menu_list="$menu_list
+ 'C' '$msg_create_home_directory: ${_user_home_create:-$msg_no}'
+ 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}'
+ " # END-QUOTE
+ fi
+ esac
+
+ 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_ok\" \
+ --cancel-label \"\$msg_cancel\" \
+ --default-item \"\$defaultitem\" \
+ --keep-tite \
+ --menu \"\$prompt\" \
+ $height $width $rows \
+ $menu_list \
+ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
+ )
+ local retval=$?
+ f_dialog_data_sanitize menu_choice
+ f_dialog_menutag_store "$menu_choice"
+ return $retval
+}
+
+# f_dialog_menu_user_delete $user [$defaultitem]
+#
+# Present a menu detailing the properties of a login that is about to be
+# deleted. The user's menu choice is available using f_dialog_menutag_fetch().
+# Returns success unless the user chose Cancel or pressed ESC. Data to display
+# is populated automatically from the system accounting database for the given
+# $user argument with the exception of two environment variables:
+# user_group_delete and user_home_delete. If $defaultitem is present and non-
+# NULL, initially highlight the item in the menu.
+#
+f_dialog_menu_user_delete()
+{
+ local prompt="$msg_delete_exit_or_cancel"
+ local menu_list # Calculated below
+ local defaultitem="$2"
+ local hline="$hline_arrows_tab_enter"
+
+ local user_name user_password user_uid user_gid user_class
+ local user_password_expire user_account_expire user_gecos
+ local user_home_dir user_shell user_member_groups
+ f_input_user "$1"
+
+ # Attempt to convert numeric UNIX time to calendar date/time
+ local user_account_expires_on=
+ if f_isinteger "$user_account_expire"; then
+ [ "$user_account_expire" -ne 0 ] && user_account_expires_on=$(
+ date -r "$user_account_expire" "+%F %T %Z"
+ )
+ else
+ user_account_expires_on="$user_account_expire"
+ fi
+ local user_password_expires_on=
+ if f_isinteger "$user_password_expire"; then
+ [ $user_password_expire -ne 0 ] && user_password_expires_on=$(
+ date -r "$user_password_expire" "+%F %T %Z"
+ )
+ else
+ user_password_expires_on="$user_password_expire"
+ fi
+
+ # Attempt to translate a numeric GID into `number (name)'
+ if f_isinteger "$user_gid"; then
+ local user_group
+ user_group=$( pw groupshow -g "$user_gid" 2> /dev/null ) &&
+ user_gid="$user_gid (${user_group%%:*})"
+ fi
+
+ # Localize potentially hostile variables and escape their values
+ # to the local variable (see f_shell_escape() of `strings.subr')
+ local var
+ for var in account_expires_on class gecos gid group_delete \
+ home_delete home_dir member_groups name password_expires_on \
+ shell uid \
+ ; do
+ local _user_$var
+ eval f_shell_escape \"\$user_$var\" _user_$var
+ done
+
+ menu_list="
+ 'X' '$msg_delete/$msg_exit'
+ '1' '$msg_login: $_user_name'
+ '-' '$msg_full_name: $_user_gecos'
+ '-' '$msg_password: -----'
+ '-' '$msg_user_id: $_user_uid'
+ '-' '$msg_group_id: $_user_gid'
+ '-' '$msg_group_members: $_user_member_groups'
+ '-' '$msg_login_class: $_user_class'
+ '-' '$msg_password_expires_on: $_user_password_expires_on'
+ '-' '$msg_account_expires_on: $_user_account_expires_on'
+ '-' '$msg_home_directory: $_user_home_dir'
+ '-' '$msg_shell: $_user_shell'
+ " # END-QUOTE
+ if f_quietly pw groupshow -g "$user_gid"; then menu_list="$menu_list
+ 'C' '$msg_delete_primary_group: ${_user_group_delete:-$msg_no}'
+ " # END-QUOTE
+ else menu_list="$menu_list
+ '-' '$msg_delete_primary_group: $msg_n_a'
+ " # END-QUOTE
+ fi
+ case "$user_home_dir" in
+ /|/nonexistent|/var/empty) menu_list="$menu_list
+ '-' '$msg_delete_home_directory: $msg_n_a'
+ " # END-QUOTE
+ ;;
+ *) if [ -d "$user_home_dir" ]; then menu_list="$menu_list
+ 'D' '$msg_delete_home_directory: ${_user_home_delete:-$msg_no}'
+ " # END-QUOTE
+ else menu_list="$menu_list
+ '-' '$msg_delete_home_directory: $msg_n_a'
+ " # END-QUOTE
+ fi
+ esac
+
+ 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_ok\" \
+ --cancel-label \"\$msg_cancel\" \
+ --default-item \"\$defaultitem\" \
+ --keep-tite \
+ --menu \"\$prompt\" \
+ $height $width $rows \
+ $menu_list \
+ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
+ )
+ local retval=$?
+ f_dialog_data_sanitize menu_choice
+ f_dialog_menutag_store "$menu_choice"
+ return $retval
+}
+
+# f_dialog_menu_user_edit [$defaultitem]
+#
+# Present a menu detailing the properties of a login that is about to be
+# modified. The user's menu choice is available using f_dialog_menutag_fetch().
+# Returns success unless the user chose Cancel or pressed ESC. Data to display
+# is taken from environment variables user_account_expire, user_class,
+# user_dotfiles_create, user_gecos, user_gid, user_home_create, user_home_dir,
+# user_member_groups, user_name, user_password_expire, user_shell, and
+# user_uid. If $defaultitem is present and non-NULL, initially highlight the
+# item in the menu.
+#
+f_dialog_menu_user_edit()
+{
+ local prompt="$msg_save_exit_or_cancel"
+ local menu_list # Calculated below
+ local defaultitem="$1"
+ local hline="$hline_arrows_tab_enter"
+
+ # Attempt to convert numeric UNIX time to calendar date/time
+ local user_account_expires_on=
+ if f_isinteger "$user_account_expire"; then
+ [ "$user_account_expire" -ne 0 ] && user_account_expires_on=$(
+ date -r "$user_account_expire" "+%F %T %Z"
+ )
+ else
+ user_account_expires_on="$user_account_expire"
+ fi
+ local user_password_expires_on=
+ if f_isinteger "$user_password_expire"; then
+ [ $user_password_expire -ne 0 ] && user_password_expires_on=$(
+ date -r "$user_password_expire" "+%F %T %Z"
+ )
+ else
+ user_password_expires_on="$user_password_expire"
+ fi
+
+ # Attempt to translate a numeric GID into `number (name)'
+ if f_isinteger "$user_gid"; then
+ local user_group
+ user_group=$( pw groupshow -g "$user_gid" 2> /dev/null ) &&
+ user_gid="$user_gid (${user_group%%:*})"
+ fi
+
+ # Localize potentially hostile variables and escape their values
+ # to the local variable (see f_shell_escape() of `strings.subr')
+ local var
+ for var in account_expires_on class dotfiles_create gecos gid \
+ home_create home_dir member_groups name password_expires_on \
+ shell uid \
+ ; do
+ local _user_$var
+ eval f_shell_escape \"\$user_$var\" _user_$var
+ done
+
+ menu_list="
+ 'X' '$msg_save/$msg_exit'
+ '1' '$msg_login: $_user_name'
+ '2' '$msg_full_name: $_user_gecos'
+ '3' '$msg_password: -----'
+ '4' '$msg_user_id: $_user_uid'
+ '5' '$msg_group_id: $_user_gid'
+ '6' '$msg_member_of_groups: $_user_member_groups'
+ '7' '$msg_login_class: $_user_class'
+ '8' '$msg_password_expires_on: $_user_password_expires_on'
+ '9' '$msg_account_expires_on: $_user_account_expires_on'
+ 'A' '$msg_home_directory: $_user_home_dir'
+ 'B' '$msg_shell: $_user_shell'
+ " # END-QUOTE
+ case "$user_home_dir" in
+ /|/nonexistent|/var/empty) menu_list="$menu_list
+ '-' '$msg_create_home_directory: $msg_n_a'
+ '-' '$msg_create_dotfiles: $msg_n_a'
+ " # END-QUOTE
+ ;;
+ *) if [ -d "$user_home_dir" ]; then menu_list="$menu_list
+ '-' '$msg_create_home_directory: $msg_n_a'
+ 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}'
+ " # END-QUOTE
+ else menu_list="$menu_list
+ 'C' '$msg_create_home_directory: ${_user_home_create:-$msg_no}'
+ 'D' '$msg_create_dotfiles: ${_user_dotfiles_create:-$msg_no}'
+ " # END-QUOTE
+ fi
+ esac
+
+ 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_ok\" \
+ --cancel-label \"\$msg_cancel\" \
+ --default-item \"\$defaultitem\" \
+ --keep-tite \
+ --menu \"\$prompt\" \
+ $height $width $rows \
+ $menu_list \
+ 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
+ )
+ local retval=$?
+ f_dialog_data_sanitize menu_choice
+ f_dialog_menutag_store "$menu_choice"
+ return $retval
}
############################################################ MAIN
OpenPOWER on IntegriCloud