1ab2043b8SDevin Teskeif [ ! "$_USERMGMT_GROUP_INPUT_SUBR" ]; then _USERMGMT_GROUP_INPUT_SUBR=1 2ab2043b8SDevin Teske# 3ab2043b8SDevin Teske# Copyright (c) 2012 Ron McDowell 4d3a0f918SDevin Teske# Copyright (c) 2012-2013 Devin Teske 5ab2043b8SDevin Teske# All rights reserved. 6ab2043b8SDevin Teske# 7ab2043b8SDevin Teske# Redistribution and use in source and binary forms, with or without 8ab2043b8SDevin Teske# modification, are permitted provided that the following conditions 9ab2043b8SDevin Teske# are met: 10ab2043b8SDevin Teske# 1. Redistributions of source code must retain the above copyright 11ab2043b8SDevin Teske# notice, this list of conditions and the following disclaimer. 12ab2043b8SDevin Teske# 2. Redistributions in binary form must reproduce the above copyright 13ab2043b8SDevin Teske# notice, this list of conditions and the following disclaimer in the 14ab2043b8SDevin Teske# documentation and/or other materials provided with the distribution. 15ab2043b8SDevin Teske# 16ab2043b8SDevin Teske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17ab2043b8SDevin Teske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18ab2043b8SDevin Teske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19ab2043b8SDevin Teske# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20ab2043b8SDevin Teske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21ab2043b8SDevin Teske# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22ab2043b8SDevin Teske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23ab2043b8SDevin Teske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24ab2043b8SDevin Teske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25ab2043b8SDevin Teske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26ab2043b8SDevin Teske# SUCH DAMAGE. 27ab2043b8SDevin Teske# 28ab2043b8SDevin Teske# $FreeBSD$ 29ab2043b8SDevin Teske# 30ab2043b8SDevin Teske############################################################ INCLUDES 31ab2043b8SDevin Teske 32ab2043b8SDevin TeskeBSDCFG_SHARE="/usr/share/bsdconfig" 33ab2043b8SDevin Teske. $BSDCFG_SHARE/common.subr || exit 1 3456961fd7SDevin Teskef_dprintf "%s: loading includes..." usermgmt/group_input.subr 35ab2043b8SDevin Teskef_include $BSDCFG_SHARE/dialog.subr 36ab2043b8SDevin Teskef_include $BSDCFG_SHARE/strings.subr 37ab2043b8SDevin Teske 38ab2043b8SDevin TeskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="070.usermgmt" 39ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/include/messages.subr 40ab2043b8SDevin Teskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr 41ab2043b8SDevin Teske 42ab2043b8SDevin Teske############################################################ FUNCTIONS 43ab2043b8SDevin Teske 44ab2043b8SDevin Teske# f_input_group $group 45ab2043b8SDevin Teske# 46ab2043b8SDevin Teske# Given $group name or id, create the environment variables group_name, 47ab2043b8SDevin Teske# group_gid, and group_members (and group_password is reset to NULL). 48ab2043b8SDevin Teske# 49ab2043b8SDevin Teskef_input_group() 50ab2043b8SDevin Teske{ 51ab2043b8SDevin Teske eval $( pw groupshow "$1" | awk -F: ' 52ab2043b8SDevin Teske { 53ab2043b8SDevin Teske printf "group_name='\'%s\''\n", $1 54ab2043b8SDevin Teske printf "group_password=\n" 55ab2043b8SDevin Teske printf "group_gid='\'%s\''\n", $3 56ab2043b8SDevin Teske printf "group_members='\'%s\''\n", $4 57ab2043b8SDevin Teske exit 58ab2043b8SDevin Teske }' ) 59ab2043b8SDevin Teske} 60ab2043b8SDevin Teske 61d3a0f918SDevin Teske# f_dialog_menu_group_list [$default] 62ab2043b8SDevin Teske# 63d3a0f918SDevin Teske# Allows the user to select a group from a list. Optionally, if present and 64d3a0f918SDevin Teske# non-NULL, initially highlight $default group. 65ab2043b8SDevin Teske# 66ab2043b8SDevin Teskef_dialog_menu_group_list() 67ab2043b8SDevin Teske{ 68052f8969SDevin Teske local prompt= 69052f8969SDevin Teske local menu_list=" 70ab2043b8SDevin Teske 'X $msg_exit' '' 71ab2043b8SDevin Teske " # END-QUOTE 72052f8969SDevin Teske local defaultitem="$1" 73052f8969SDevin Teske local hline="$hline_alnum_punc_tab_enter" 74ab2043b8SDevin Teske 75ab2043b8SDevin Teske # Add groups from group(5) 76ab2043b8SDevin Teske menu_list="$menu_list $( pw groupshow -a | awk -F: ' 77ab2043b8SDevin Teske !/^[[:space:]]*(#|$)/ { 78ab2043b8SDevin Teske printf "'\'%s\'\ \'%s\''\n", $1, $1 79ab2043b8SDevin Teske }' 80ab2043b8SDevin Teske )" 81ab2043b8SDevin Teske 8274036c4dSDevin Teske local height width rows 8374036c4dSDevin Teske eval f_dialog_menu_size height width rows \ 84ab2043b8SDevin Teske \"\$DIALOG_TITLE\" \ 85ab2043b8SDevin Teske \"\$DIALOG_BACKTITLE\" \ 86052f8969SDevin Teske \"\$prompt\" \ 87ab2043b8SDevin Teske \"\$hline\" \ 8874036c4dSDevin Teske $menu_list 89ab2043b8SDevin Teske 90fd962ac6SDevin Teske local menu_choice 91fd962ac6SDevin Teske menu_choice=$( eval $DIALOG \ 92d3a0f918SDevin Teske --title \"\$DIALOG_TITLE\" \ 93ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 94ab2043b8SDevin Teske --hline \"\$hline\" \ 95ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 96ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 97d3a0f918SDevin Teske --default-item \"\$defaultitem\" \ 98052f8969SDevin Teske --menu \"\$prompt\" \ 9974036c4dSDevin Teske $height $width $rows \ 10074036c4dSDevin Teske $menu_list \ 10189498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 10289498fdfSDevin Teske ) 10389498fdfSDevin Teske local retval=$? 104fd962ac6SDevin Teske f_dialog_menutag_store -s "$menu_choice" 10589498fdfSDevin Teske return $retval 106ab2043b8SDevin Teske} 107ab2043b8SDevin Teske 108ab2043b8SDevin Teske# f_dialog_input_group_name [$group_name] 109ab2043b8SDevin Teske# 110ab2043b8SDevin Teske# Allows the user to enter a new groupname for a given group. If the user does 111ab2043b8SDevin Teske# not cancel or press ESC, the $group_name variable will hold the 112ab2043b8SDevin Teske# newly-configured value upon return. 113ab2043b8SDevin Teske# 114ab2043b8SDevin Teske# If $cur_group_name is defined, the user can enter that and by-pass error- 115ab2043b8SDevin Teske# checking (allowing the user to "revert" to an old value without, for example, 116ab2043b8SDevin Teske# being told that the groupname already exists). 117ab2043b8SDevin Teske# 118ab2043b8SDevin Teskef_dialog_input_group_name() 119ab2043b8SDevin Teske{ 120ab2043b8SDevin Teske # 121ab2043b8SDevin Teske # Loop until the user provides taint-free/valid input 122ab2043b8SDevin Teske # 123298cf604SDevin Teske local _name="$1" _input="$1" 124ab2043b8SDevin Teske while :; do 125ab2043b8SDevin Teske 126ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 127ec7120b5SDevin Teske f_dialog_input _input "$msg_group" "$_input" \ 128ec7120b5SDevin Teske "$hline_alnum_tab_enter" || return 129ab2043b8SDevin Teske 130ab2043b8SDevin Teske # Check for no-change 131ab2043b8SDevin Teske [ "$_input" = "$_name" ] && return $SUCCESS 132ab2043b8SDevin Teske 133ab2043b8SDevin Teske # Check for reversion 134ab2043b8SDevin Teske if [ "$_input" = "$cur_group_name" ]; then 135ab2043b8SDevin Teske group_name="$cur_group_name" 136ab2043b8SDevin Teske return $SUCCESS 137ab2043b8SDevin Teske fi 138ab2043b8SDevin Teske 139ab2043b8SDevin Teske # Check for NULL entry 140ab2043b8SDevin Teske if [ ! "$_input" ]; then 141db7b0ba7SDevin Teske f_dialog_msgbox "$msg_group_is_empty" 142ab2043b8SDevin Teske continue 143ab2043b8SDevin Teske fi 144ab2043b8SDevin Teske 145ab2043b8SDevin Teske # Check for invalid entry 146ab2043b8SDevin Teske if ! echo "$_input" | grep -q "^[[:alpha:]]"; then 147db7b0ba7SDevin Teske f_dialog_msgbox "$msg_group_must_start_with_letter" 148ab2043b8SDevin Teske continue 149ab2043b8SDevin Teske fi 150ab2043b8SDevin Teske 151ab2043b8SDevin Teske # Check for duplicate entry 152ab2043b8SDevin Teske if f_quietly pw groupshow -n "$_input"; then 153ab2043b8SDevin Teske f_show_msg "$msg_group_already_used" "$_input" 154ab2043b8SDevin Teske continue 155ab2043b8SDevin Teske fi 156ab2043b8SDevin Teske 157ab2043b8SDevin Teske group_name="$_input" 158ab2043b8SDevin Teske break 159ab2043b8SDevin Teske done 160ab2043b8SDevin Teske save_flag=1 161ab2043b8SDevin Teske 162526e1dc1SDevin Teske f_dprintf "group_name: [%s]->[%s]" "$cur_group_name" "$group_name" 163ab2043b8SDevin Teske 164ab2043b8SDevin Teske return $SUCCESS 165ab2043b8SDevin Teske} 166ab2043b8SDevin Teske 167ab2043b8SDevin Teske# f_dialog_input_group_password 168ab2043b8SDevin Teske# 169ab2043b8SDevin Teske# Prompt the user to enter a password (twice). 170ab2043b8SDevin Teske# 171ab2043b8SDevin Teskef_dialog_input_group_password() 172ab2043b8SDevin Teske{ 173052f8969SDevin Teske local prompt1="$msg_group_password" 174052f8969SDevin Teske local prompt2="$msg_reenter_group_password" 175ab2043b8SDevin Teske local hline="$hline_alnum_punc_tab_enter" 176ab2043b8SDevin Teske 17774036c4dSDevin Teske local height1 width1 17874036c4dSDevin Teske f_dialog_inputbox_size height1 width1 \ 179ab2043b8SDevin Teske "$DIALOG_TITLE" \ 180ab2043b8SDevin Teske "$DIALOG_BACKTITLE" \ 181052f8969SDevin Teske "$prompt1" \ 182ab2043b8SDevin Teske "" \ 18374036c4dSDevin Teske "$hline" 184ab2043b8SDevin Teske 18574036c4dSDevin Teske local height2 width2 18674036c4dSDevin Teske f_dialog_inputbox_size height2 width2 \ 187ab2043b8SDevin Teske "$DIALOG_TITLE" \ 188ab2043b8SDevin Teske "$DIALOG_BACKTITLE" \ 189052f8969SDevin Teske "$prompt2" \ 190ab2043b8SDevin Teske "" \ 19174036c4dSDevin Teske "$hline" 192ab2043b8SDevin Teske 193ab2043b8SDevin Teske # 194ab2043b8SDevin Teske # Loop until the user provides taint-free/valid input 195ab2043b8SDevin Teske # 196ab2043b8SDevin Teske local retval _password1 _password2 197ab2043b8SDevin Teske while :; do 198ec7120b5SDevin Teske _password1=$( $DIALOG \ 19974036c4dSDevin Teske --title "$DIALOG_TITLE" \ 20074036c4dSDevin Teske --backtitle "$DIALOG_BACKTITLE" \ 20174036c4dSDevin Teske --hline "$hline" \ 20274036c4dSDevin Teske --ok-label "$msg_ok" \ 20374036c4dSDevin Teske --cancel-label "$msg_cancel" \ 204ab2043b8SDevin Teske --insecure \ 205052f8969SDevin Teske --passwordbox "$prompt1" \ 20674036c4dSDevin Teske $height1 $width1 \ 20789498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 20889498fdfSDevin Teske ) 209ab2043b8SDevin Teske retval=$? 210ec7120b5SDevin Teske debug= f_dialog_line_sanitize _password1 211ab2043b8SDevin Teske 212ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 213ab2043b8SDevin Teske [ $retval -eq $SUCCESS ] || return $retval 214ab2043b8SDevin Teske 215ec7120b5SDevin Teske _password2=$( $DIALOG \ 21674036c4dSDevin Teske --title "$DIALOG_TITLE" \ 21774036c4dSDevin Teske --backtitle "$DIALOG_BACKTITLE" \ 21874036c4dSDevin Teske --hline "$hline" \ 21974036c4dSDevin Teske --ok-label "$msg_ok" \ 22074036c4dSDevin Teske --cancel-label "$msg_cancel" \ 221ab2043b8SDevin Teske --insecure \ 222052f8969SDevin Teske --passwordbox "$prompt2" \ 22374036c4dSDevin Teske $height2 $width2 \ 22489498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 22589498fdfSDevin Teske ) 226ab2043b8SDevin Teske retval=$? 227ec7120b5SDevin Teske debug= f_dialog_line_sanitize _password2 228ab2043b8SDevin Teske 229ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 230ab2043b8SDevin Teske [ $retval -eq $SUCCESS ] || return $retval 231ab2043b8SDevin Teske 232ab2043b8SDevin Teske # Check for password mismatch 233ab2043b8SDevin Teske if [ "$_password1" != "$_password2" ]; then 234db7b0ba7SDevin Teske f_dialog_msgbox "$msg_group_passwords_do_not_match" 235ab2043b8SDevin Teske continue 236ab2043b8SDevin Teske fi 237ab2043b8SDevin Teske 238ab2043b8SDevin Teske # Check for NULL entry 239ab2043b8SDevin Teske if [ ! "$_password1" ]; then 240*7ca5c4cbSDevin Teske f_dialog_yesno "$msg_disable_password_auth_for_group" 241*7ca5c4cbSDevin Teske local retval=$? 242*7ca5c4cbSDevin Teske [ $retval -eq 255 ] && return $retval # ESC was pressed 243*7ca5c4cbSDevin Teske [ $retval -eq $SUCCESS ] && pw_group_password_disable=1 244ab2043b8SDevin Teske else 245ab2043b8SDevin Teske pw_group_password_disable= 246ab2043b8SDevin Teske fi 247ab2043b8SDevin Teske 248ab2043b8SDevin Teske group_password="$_password1" 249ab2043b8SDevin Teske break 250ab2043b8SDevin Teske done 251ab2043b8SDevin Teske save_flag=1 252ab2043b8SDevin Teske 253526e1dc1SDevin Teske f_dprintf "group_password: [%s]->[%s]" \ 254526e1dc1SDevin Teske "$cur_group_password" "$group_password" 255ab2043b8SDevin Teske 256ab2043b8SDevin Teske return $SUCCESS 257ab2043b8SDevin Teske} 258ab2043b8SDevin Teske 259ab2043b8SDevin Teske# f_dialog_input_group_gid [$group_gid] 260ab2043b8SDevin Teske# 261ab2043b8SDevin Teske# Allow the user to enter a new GID for a given group. If the user does not 262ab2043b8SDevin Teske# cancel or press ESC, the $group_gid variable will hold the newly-configured 263ab2043b8SDevin Teske# value upon return. 264ab2043b8SDevin Teske# 265ab2043b8SDevin Teskef_dialog_input_group_gid() 266ab2043b8SDevin Teske{ 267298cf604SDevin Teske local _input="$1" 268ab2043b8SDevin Teske 269ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 270ec7120b5SDevin Teske f_dialog_input _input "$msg_group_id_leave_empty_for_default" \ 271ec7120b5SDevin Teske "$_input" "$hline_num_tab_enter" || return 272ab2043b8SDevin Teske 273ab2043b8SDevin Teske group_gid="$_input" 274ab2043b8SDevin Teske save_flag=1 275ab2043b8SDevin Teske 276526e1dc1SDevin Teske f_dprintf "group_gid: [%s]->[%s]" "$cur_group_gid" "$group_gid" 277ab2043b8SDevin Teske 278ab2043b8SDevin Teske return $SUCCESS 279ab2043b8SDevin Teske} 280ab2043b8SDevin Teske 281ab2043b8SDevin Teske# f_dialog_input_group_members [$group_members] 282ab2043b8SDevin Teske# 283f4844f65SDevin Teske# Allow the user to modify a list of members for a given group. If the user 284f4844f65SDevin Teske# does not cancel or press ESC, the $group_members variable will hold the 285f4844f65SDevin Teske# newly-configured value upon return. 286ab2043b8SDevin Teske# 287ab2043b8SDevin Teskef_dialog_input_group_members() 288ab2043b8SDevin Teske{ 289052f8969SDevin Teske local _input="$1" 290052f8969SDevin Teske local prompt="$msg_group_members:" 291052f8969SDevin Teske local menu_list=" 292ab2043b8SDevin Teske 'X' '$msg_continue' 293ab2043b8SDevin Teske '1' '$msg_select_group_members_from_list' 294ab2043b8SDevin Teske '2' '$msg_enter_group_members_manually' 295ab2043b8SDevin Teske " # END-QUOTE 296052f8969SDevin Teske local defaultitem= 297052f8969SDevin Teske local hline="$hline_num_arrows_tab_enter" 298ab2043b8SDevin Teske 29974036c4dSDevin Teske local mheight mwidth mrows 30074036c4dSDevin Teske eval f_dialog_menu_size mheight mwidth mrows \ 301ab2043b8SDevin Teske \"\$DIALOG_TITLE\" \ 302ab2043b8SDevin Teske \"\$DIALOG_BACKTITLE\" \ 303052f8969SDevin Teske \"\$prompt\" \ 304ab2043b8SDevin Teske \"\$hline\" \ 30574036c4dSDevin Teske $menu_list 30674036c4dSDevin Teske 307052f8969SDevin Teske local menu_choice retval 30874036c4dSDevin Teske while :; do 309fd962ac6SDevin Teske menu_choice=$( eval $DIALOG \ 310ab2043b8SDevin Teske --title \"\$DIALOG_TITLE\" \ 311ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 312ab2043b8SDevin Teske --hline \"\$hline\" \ 313ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 314ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 315d3a0f918SDevin Teske --default-item \"\$defaultitem\" \ 316052f8969SDevin Teske --menu \"\$prompt\" \ 31774036c4dSDevin Teske $mheight $mwidth $mrows \ 318ab2043b8SDevin Teske $menu_list \ 31989498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 32089498fdfSDevin Teske ) 321ab2043b8SDevin Teske retval=$? 322fd962ac6SDevin Teske f_dialog_data_sanitize menu_choice 323fd962ac6SDevin Teske defaultitem="$menu_choice" 324526e1dc1SDevin Teske f_dprintf "retval=%u menu_choice=[%s]" $retval "$menu_choice" 325ab2043b8SDevin Teske 326ab2043b8SDevin Teske # Return if user has either pressed ESC or chosen Cancel/No 327ab2043b8SDevin Teske [ $retval -eq $SUCCESS ] || return $retval 328ab2043b8SDevin Teske 329052f8969SDevin Teske local _group_members 330ab2043b8SDevin Teske case "$menu_choice" in 331ab2043b8SDevin Teske X) # Exit 332ab2043b8SDevin Teske break ;; 333ab2043b8SDevin Teske 1) # Select Group Members from a list 334052f8969SDevin Teske local user check_list= 335052f8969SDevin Teske for user in $( pw usershow -a | 336052f8969SDevin Teske awk -F: '!/^[[:space:]]*(#|$)/{print $1}' 337052f8969SDevin Teske ); do 338052f8969SDevin Teske # Format of a checklist entry: tag item status 339ab2043b8SDevin Teske if echo "$_input" | grep -q "\<$user\>"; then 340052f8969SDevin Teske check_list="$check_list $user '' on" 341ab2043b8SDevin Teske else 342052f8969SDevin Teske check_list="$check_list $user '' off" 343ab2043b8SDevin Teske fi 344ab2043b8SDevin Teske done 345ab2043b8SDevin Teske 34674036c4dSDevin Teske local cheight cwidth crows 34774036c4dSDevin Teske eval f_dialog_checklist_size cheight cwidth crows \ 348ab2043b8SDevin Teske \"\$DIALOG_TITLE\" \ 349ab2043b8SDevin Teske \"\$DIALOG_BACKTITLE\" \ 350052f8969SDevin Teske \"\$prompt\" \ 351ab2043b8SDevin Teske \"\$hline\" \ 352052f8969SDevin Teske $check_list 353fd962ac6SDevin Teske _group_members=$( eval $DIALOG \ 354ab2043b8SDevin Teske --title \"\$DIALOG_TITLE\" \ 355ab2043b8SDevin Teske --backtitle \"\$DIALOG_BACKTITLE\" \ 356ab2043b8SDevin Teske --separate-output \ 357ab2043b8SDevin Teske --hline \"\$hline\" \ 358ab2043b8SDevin Teske --ok-label \"\$msg_ok\" \ 359ab2043b8SDevin Teske --cancel-label \"\$msg_cancel\" \ 360052f8969SDevin Teske --checklist \"\$prompt\" \ 36174036c4dSDevin Teske $cheight $cwidth $crows \ 362052f8969SDevin Teske $check_list \ 36389498fdfSDevin Teske 2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD 364fd962ac6SDevin Teske ) || continue 365fd962ac6SDevin Teske # Return to previous menu if user either 366fd962ac6SDevin Teske # pressed ESC or chose Cancel/No 367fd962ac6SDevin Teske f_dialog_data_sanitize _group_members 368ab2043b8SDevin Teske 369fd962ac6SDevin Teske # Convert the newline separated list into a comma- 370fd962ac6SDevin Teske # separated one so that if the user switches over to 371fd962ac6SDevin Teske # manual editing, list reflects checklist selections 372fd962ac6SDevin Teske _group_members=$( echo "$_group_members" | 373fd962ac6SDevin Teske tr '\n' ' ' | 374fd962ac6SDevin Teske sed -e 's/[[:space:]]\{1,\}/,/g;s/^,//;s/,$//' 375fd962ac6SDevin Teske ) 376ab2043b8SDevin Teske 377ab2043b8SDevin Teske _input="$_group_members" 378ab2043b8SDevin Teske ;; 379ab2043b8SDevin Teske 2) # Enter Group Members manually 380052f8969SDevin Teske local p="$msg_group_members ($msg_separated_by_commas)" 381ab2043b8SDevin Teske 382052f8969SDevin Teske f_dialog_input _group_members "$p" "$_input" \ 383ec7120b5SDevin Teske "$hline_num_tab_enter" || continue 384ec7120b5SDevin Teske # Return to previous menu if user either 385ec7120b5SDevin Teske # pressed ESC or chose Cancel/No 386ab2043b8SDevin Teske 387ab2043b8SDevin Teske _input="$_group_members" 388ab2043b8SDevin Teske ;; 389ab2043b8SDevin Teske esac 390ab2043b8SDevin Teske done 391ab2043b8SDevin Teske 392ab2043b8SDevin Teske group_members="$_input" 393ab2043b8SDevin Teske save_flag=1 394526e1dc1SDevin Teske f_dprintf "group_members: [%s]->[%s]" \ 395526e1dc1SDevin Teske "$cur_group_members" "$group_members" 396ab2043b8SDevin Teske 397ab2043b8SDevin Teske return $SUCCESS 398ab2043b8SDevin Teske} 399ab2043b8SDevin Teske 40056961fd7SDevin Teske############################################################ MAIN 40156961fd7SDevin Teske 40256961fd7SDevin Teskef_dprintf "%s: Successfully loaded." usermgmt/group_input.subr 40356961fd7SDevin Teske 404ab2043b8SDevin Teskefi # ! $_USERMGMT_GROUP_INPUT_SUBR 405