| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 1 | #!/usr/bin/wish | 
|  | 2 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 3 | # This file provides many valuable validation procedures such as valid_value, valid_integer, etc. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 4 |  | 
|  | 5 | my_source [list print.tcl call_stack.tcl] | 
|  | 6 |  | 
|  | 7 |  | 
|  | 8 | proc valid_value { var_name { invalid_values {}} { valid_values {}} } { | 
|  | 9 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 10 | # If the value of the variable named in var_name is not valid, print an error message and exit the program | 
|  | 11 | # with a non-zero return code. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 12 |  | 
|  | 13 | # Description of arguments: | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 14 | # var_name                        The name of the variable whose value is to be validated. | 
|  | 15 | # invalid_values                  A list of invalid values.  If the variable value is equal to any value in | 
|  | 16 | #                                 the invalid_values list, it is deemed to be invalid.  Note that if you | 
|  | 17 | #                                 specify anything for invalid_values (below), the valid_values list is not | 
|  | 18 | #                                 even processed.  In other words, specify either invalid_values or | 
|  | 19 | #                                 valid_values but not both.  If no value is specified for either | 
|  | 20 | #                                 invalid_values or valid_values, invalid_values will default to a list | 
|  | 21 | #                                 with one blank entry.  This is useful if you simply want to ensure that | 
|  | 22 | #                                 your variable is non blank. | 
|  | 23 | # valid_values                    A list of invalid values.  The variable value must be equal to one of the | 
|  | 24 | #                                 values in this list to be considered valid. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 25 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 26 | # Call get_stack_var_level to relieve the caller of the need for declaring the variable as global. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 27 | set stack_level [get_stack_var_level $var_name] | 
|  | 28 | # Access the variable value. | 
|  | 29 | upvar $stack_level $var_name var_value | 
|  | 30 |  | 
|  | 31 | set len_invalid_values [llength $invalid_values] | 
|  | 32 | set len_valid_values [llength $valid_values] | 
|  | 33 |  | 
|  | 34 | if { $len_valid_values > 0 &&  $len_invalid_values > 0 } { | 
|  | 35 | append error_message "Programmer error - You must provide either an" | 
|  | 36 | append error_message " invalid_values list or a valid_values" | 
|  | 37 | append error_message " list but NOT both.\n" | 
|  | 38 | append error_message [sprint_list invalid_values "" "" 1] | 
|  | 39 | append error_message [sprint_list valid_values "" "" 1] | 
|  | 40 | print_error_report $error_message | 
|  | 41 | exit 1 | 
|  | 42 | } | 
|  | 43 |  | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 44 | set caller [get_stack_proc_name -2] | 
|  | 45 | if { $caller == "valid_list" } { | 
|  | 46 | set exit_on_fail 0 | 
|  | 47 | } else { | 
|  | 48 | set exit_on_fail 1 | 
|  | 49 | } | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 50 | if { $len_valid_values > 0 } { | 
|  | 51 | # Processing the valid_values list. | 
|  | 52 | if { [lsearch -exact $valid_values "${var_value}"] != -1 } { return } | 
|  | 53 | append error_message "The following variable has an invalid value:\n" | 
|  | 54 | append error_message [sprint_varx $var_name $var_value "" "" 1] | 
|  | 55 | append error_message "\nIt must be one of the following values:\n" | 
|  | 56 | append error_message [sprint_list valid_values "" "" 1] | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 57 | if { $exit_on_fail } { | 
|  | 58 | print_error_report $error_message | 
|  | 59 | exit 1 | 
|  | 60 | } else { | 
|  | 61 | error [sprint_error_report $error_message] | 
|  | 62 | } | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 63 | } | 
|  | 64 |  | 
|  | 65 | if { $len_invalid_values == 0 } { | 
|  | 66 | # Assign default value. | 
|  | 67 | set invalid_values [list ""] | 
|  | 68 | } | 
|  | 69 |  | 
|  | 70 | # Assertion: We have an invalid_values list.  Processing it now. | 
|  | 71 | if { [lsearch -exact $invalid_values "${var_value}"] == -1 } { return } | 
|  | 72 |  | 
|  | 73 | if { [lsearch -exact $valid_values "${var_value}"] != -1 } { return } | 
|  | 74 | append error_message "The following variable has an invalid value:\n" | 
|  | 75 | append error_message [sprint_varx $var_name $var_value "" "" 1] | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 76 | append error_message "\nIt must NOT be any of the following values:\n" | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 77 | append error_message [sprint_list invalid_values "" "" 1] | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 78 | if { $exit_on_fail } { | 
|  | 79 | print_error_report $error_message | 
|  | 80 | exit 1 | 
|  | 81 | } else { | 
|  | 82 | error [sprint_error_report $error_message] | 
|  | 83 | } | 
|  | 84 |  | 
|  | 85 | } | 
|  | 86 |  | 
|  | 87 |  | 
|  | 88 | proc valid_list { var_name args } { | 
|  | 89 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 90 | # If the value of the list variable named in var_name is not valid, print an error message and exit the | 
|  | 91 | # program with a non-zero return code. | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 92 |  | 
|  | 93 | # Description of arguments: | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 94 | # var_name                        The name of the variable whose value is to be validated.  This variable | 
|  | 95 | #                                 should be a list.  For each list alement, a call to valid_value will be | 
|  | 96 | #                                 done. | 
|  | 97 | # args                            args will be passed directly to valid_value.  Please see valid_value for | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 98 | #                                 details. | 
|  | 99 |  | 
|  | 100 | # Example call: | 
|  | 101 |  | 
|  | 102 | # set valid_procs [list "one" "two" "three"] | 
|  | 103 | # set proc_names [list "zero" "one" "two" "three" "four"] | 
|  | 104 | # valid_list proc_names {} ${valid_procs} | 
|  | 105 |  | 
|  | 106 | # In this example, this procedure will fail with the following message: | 
|  | 107 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 108 | ##(CDT) 2018/03/27 12:26:49.904870 - **ERROR** The following list has one or more invalid values (marked | 
|  | 109 | # #with "*"): | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 110 | # | 
|  | 111 | # proc_names: | 
|  | 112 | #   proc_names[0]:                                  zero* | 
|  | 113 | #   proc_names[1]:                                  one | 
|  | 114 | #   proc_names[2]:                                  two | 
|  | 115 | #   proc_names[3]:                                  three | 
|  | 116 | #   proc_names[4]:                                  four* | 
|  | 117 | # | 
|  | 118 | # It must be one of the following values: | 
|  | 119 | # | 
|  | 120 | # valid_values: | 
|  | 121 | #   valid_values[0]:                                one | 
|  | 122 | #   valid_values[1]:                                two | 
|  | 123 | #   valid_values[2]:                                three | 
|  | 124 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 125 | # Call get_stack_var_level to relieve the caller of the need for declaring the variable as global. | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 126 | set stack_level [get_stack_var_level $var_name] | 
|  | 127 | # Access the variable value. | 
|  | 128 | upvar $stack_level $var_name var_value | 
|  | 129 |  | 
|  | 130 | set ix 0 | 
|  | 131 | # Create a list of index values which point to invalid list elements. | 
|  | 132 | set invalid_ix_list [list] | 
|  | 133 | foreach list_entry $var_value { | 
|  | 134 | incr ix | 
|  | 135 | if { [catch {valid_value list_entry {*}$args} result] } { | 
|  | 136 | lappend invalid_ix_list ${ix} | 
|  | 137 | } | 
|  | 138 | } | 
|  | 139 |  | 
|  | 140 | # No errors found so return. | 
|  | 141 | if { [llength $invalid_ix_list] == 0 } { return } | 
|  | 142 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 143 | # We want to do a print_list on the caller's list but we want to put an asterisk by each invalid entry | 
|  | 144 | # (see example in prolog). | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 145 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 146 | # Make the caller's variable name, contained in $var_name, directly accessible to this procedure. | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 147 | upvar $stack_level $var_name $var_name | 
|  | 148 | # print_list the caller's list to a string. | 
|  | 149 | set printed_var [sprint_list $var_name "" "" 1] | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 150 | # Now convert the caller's printed var string to a list for easy manipulation. | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 151 | set printed_var_list [split $printed_var "\n"] | 
|  | 152 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 153 | # Loop through the erroneous index list and mark corresponding entries in printed_var_list with asterisks. | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 154 | foreach ix $invalid_ix_list { | 
|  | 155 | set new_value "[lindex $printed_var_list $ix]*" | 
|  | 156 | set printed_var_list [lreplace $printed_var_list ${ix} ${ix} $new_value] | 
|  | 157 | } | 
|  | 158 |  | 
|  | 159 | # Convert the printed var list back to a string. | 
|  | 160 | set printed_var [join $printed_var_list "\n"] | 
|  | 161 | append error_message "The following list has one or more invalid values" | 
|  | 162 | append error_message " (marked with \"*\"):\n\n" | 
|  | 163 | append error_message $printed_var | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 164 | # Determine whether the caller passed invalid_values or valid_values in order to create appropriate error | 
|  | 165 | # message. | 
| Michael Walsh | fdb4d99 | 2018-03-27 14:47:19 -0500 | [diff] [blame] | 166 | if { [lindex $args 0] != "" } { | 
|  | 167 | append error_message "\nIt must NOT be any of the following values:\n\n" | 
|  | 168 | set invalid_values [lindex $args 0] | 
|  | 169 | append error_message [sprint_list invalid_values "" "" 1] | 
|  | 170 | } else { | 
|  | 171 | append error_message "\nIt must be one of the following values:\n\n" | 
|  | 172 | set valid_values [lindex $args 1] | 
|  | 173 | append error_message [sprint_list valid_values "" "" 1] | 
|  | 174 | } | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 175 | print_error_report $error_message | 
|  | 176 | exit 1 | 
|  | 177 |  | 
|  | 178 | } | 
|  | 179 |  | 
|  | 180 |  | 
|  | 181 | proc valid_integer { var_name } { | 
|  | 182 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 183 | # If the value of the variable named in var_name is not a valid integer, print an error message and exit | 
|  | 184 | # the program with a non-zero return code. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 185 |  | 
|  | 186 | # Description of arguments: | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 187 | # var_name                        The name of the variable whose value is to be validated. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 188 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 189 | # Call get_stack_var_level to relieve the caller of the need for declaring the variable as global. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 190 | set stack_level [get_stack_var_level $var_name] | 
|  | 191 | # Access the variable value. | 
|  | 192 | upvar $stack_level $var_name var_value | 
|  | 193 |  | 
|  | 194 | if { [catch {format "0x%08x" "$var_value"} result] } { | 
|  | 195 | append error_message "Invalid integer value:\n" | 
|  | 196 | append error_message [sprint_varx $var_name $var_value] | 
|  | 197 | print_error_report $error_message | 
|  | 198 | exit 1 | 
|  | 199 | } | 
|  | 200 |  | 
|  | 201 | } | 
|  | 202 |  | 
|  | 203 |  | 
|  | 204 | proc valid_dir_path { var_name { add_slash 1 } } { | 
|  | 205 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 206 | # If the value of the variable named in var_name is not a valid directory path, print an error message and | 
|  | 207 | # exit the program with a non-zero return code. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 208 |  | 
|  | 209 | # Description of arguments: | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 210 | # var_name                        The name of the variable whose value is to be validated. | 
|  | 211 | # add_slash                       If set to 1, this procedure will add a trailing slash to the directory | 
|  | 212 | #                                 path value. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 213 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 214 | # Call get_stack_var_level to relieve the caller of the need for declaring the variable as global. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 215 | set stack_level [get_stack_var_level $var_name] | 
|  | 216 | # Access the variable value. | 
|  | 217 | upvar $stack_level $var_name var_value | 
|  | 218 |  | 
|  | 219 | expand_shell_string var_value | 
|  | 220 |  | 
|  | 221 | if { ![file isdirectory $var_value] } { | 
|  | 222 | append error_message "The following directory does not exist:\n" | 
|  | 223 | append error_message [sprint_varx $var_name $var_value "" "" 1] | 
|  | 224 | print_error_report $error_message | 
|  | 225 | exit 1 | 
|  | 226 | } | 
|  | 227 |  | 
|  | 228 | if { $add_slash } { add_trailing_string var_value / } | 
|  | 229 |  | 
|  | 230 | } | 
|  | 231 |  | 
|  | 232 |  | 
|  | 233 | proc valid_file_path { var_name } { | 
|  | 234 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 235 | # If the value of the variable named in var_name is not a valid file path, print an error message and exit | 
|  | 236 | # the program with a non-zero return code. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 237 |  | 
|  | 238 | # Description of arguments: | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 239 | # var_name                        The name of the variable whose value is to be validated. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 240 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 241 | # Call get_stack_var_level to relieve the caller of the need for declaring the variable as global. | 
| Michael Walsh | 768c130 | 2018-02-15 17:17:55 -0600 | [diff] [blame] | 242 | set stack_level [get_stack_var_level $var_name] | 
|  | 243 | # Access the variable value. | 
|  | 244 | upvar $stack_level $var_name var_value | 
|  | 245 |  | 
|  | 246 | expand_shell_string var_value | 
|  | 247 |  | 
|  | 248 | if { ![file isfile $var_value] } { | 
|  | 249 | append error_message "The following file does not exist:\n" | 
|  | 250 | append error_message [sprint_varx $var_name $var_value "" "" 1] | 
|  | 251 | print_error_report $error_message | 
|  | 252 | exit 1 | 
|  | 253 | } | 
|  | 254 |  | 
|  | 255 | } | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 256 |  | 
|  | 257 |  | 
|  | 258 | proc get_password { {password_var_name password} } { | 
|  | 259 |  | 
|  | 260 | # Prompt user for password and return result. | 
|  | 261 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 262 | # On error, print to stderr and terminate the program with non-zero return code. | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 263 |  | 
|  | 264 | set prompt\ | 
|  | 265 | [string trimright [sprint_varx "Please enter $password_var_name" ""] "\n"] | 
|  | 266 | puts -nonewline $prompt | 
|  | 267 | flush stdout | 
|  | 268 | stty -echo | 
|  | 269 | gets stdin password1 | 
|  | 270 | stty echo | 
|  | 271 | puts "" | 
|  | 272 |  | 
|  | 273 | set prompt [string\ | 
|  | 274 | trimright [sprint_varx "Please re-enter $password_var_name" ""] "\n"] | 
|  | 275 | puts -nonewline $prompt | 
|  | 276 | flush stdout | 
|  | 277 | stty -echo | 
|  | 278 | gets stdin password2 | 
|  | 279 | stty echo | 
|  | 280 | puts "" | 
|  | 281 |  | 
|  | 282 | if { $password1 != $password2 } { | 
|  | 283 | print_error_report "Passwords do not match.\n" | 
|  | 284 | gen_exit_proc 1 | 
|  | 285 | } | 
|  | 286 |  | 
|  | 287 | if { $password1 == "" } { | 
|  | 288 | print_error_report "Need a non-blank value for $password_var_name.\n" | 
|  | 289 | gen_exit_proc 1 | 
|  | 290 | } | 
|  | 291 |  | 
|  | 292 | return $password1 | 
|  | 293 |  | 
|  | 294 | } | 
|  | 295 |  | 
|  | 296 |  | 
|  | 297 | proc valid_password { var_name { prompt_user 1 } } { | 
|  | 298 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 299 | # If the value of the variable named in var_name is not a valid password, print an error message and exit | 
|  | 300 | # the program with a non-zero return code. | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 301 |  | 
|  | 302 | # Description of arguments: | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 303 | # var_name                        The name of the variable whose value is to be validated. | 
|  | 304 | # prompt_user                     If the variable has a blank value, prompt the user for a value. | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 305 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 306 | # Call get_stack_var_level to relieve the caller of the need for declaring the variable as global. | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 307 | set stack_level [get_stack_var_level $var_name] | 
|  | 308 | # Access the variable value. | 
|  | 309 | upvar $stack_level $var_name var_value | 
|  | 310 |  | 
|  | 311 | if { $var_value == "" && $prompt_user } { | 
|  | 312 | global $var_name | 
|  | 313 | set $var_name [get_password $var_name] | 
|  | 314 | } | 
|  | 315 |  | 
|  | 316 | if { $var_value == "" } { | 
|  | 317 | print_error_report "Need a non-blank value for $var_name.\n" | 
|  | 318 | gen_exit_proc 1 | 
|  | 319 | } | 
|  | 320 |  | 
|  | 321 | } | 
|  | 322 |  | 
|  | 323 |  | 
|  | 324 | proc process_pw_file_path {pw_file_path_var_name} { | 
|  | 325 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 326 | # Process a password file path parameter by setting or validating the corresponding password variable. | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 327 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 328 | # For example, let's say you have an os_pw_file_path parm defined.  This procedure will set the global | 
|  | 329 | # os_password variable. | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 330 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 331 | # If there is no os_password program parm defined, then the pw_file_path must exist and will be validated | 
|  | 332 | # by this procedure.  If there is an os_password program parm defined, then either the os_pw_file_path must | 
|  | 333 | # be valid or the os_password must be valid.  Again, this procedure will verify all of this. | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 334 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 335 | # When a valid pw_file_path exists, this program will read the password from it and set the global | 
|  | 336 | # password variable with the value. | 
|  | 337 | # Finally, this procedure will call valid_password which will prompt user if password has not been | 
|  | 338 | # obtained by this point. | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 339 |  | 
|  | 340 | # Description of argument(s): | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 341 | # pw_file_path_var_name           The name of a global variable that contains a file path which in turn | 
|  | 342 | #                                 contains a password value.  The variable name must end in "pw_file_path" | 
|  | 343 | #                                 (e.g. "os_pw_file_path"). | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 344 |  | 
|  | 345 | # Verify that $pw_file_path_var_name ends with "pw_file_path". | 
|  | 346 | if { ! [regexp -expanded "pw_file_path$" $pw_file_path_var_name] } { | 
|  | 347 | append message "Programming error - Proc [get_stack_proc_name] its" | 
|  | 348 | append message " pw_file_path_var_name parameter to contain a value that" | 
|  | 349 | append message "ends in \"pw_file_path\" instead of the current value:\n" | 
|  | 350 | append message [sprint_var pw_file_path_var_name] | 
|  | 351 | print_error $message | 
|  | 352 | gen_exit_proc 1 | 
|  | 353 | } | 
|  | 354 |  | 
|  | 355 | global $pw_file_path_var_name | 
|  | 356 | expand_shell_string $pw_file_path_var_name | 
|  | 357 |  | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 358 | # Get the prefix portion of pw_file_path_var_name which is obtained by stripping "pw_file_path" from the | 
|  | 359 | # end. | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 360 | regsub -expanded {pw_file_path$} $pw_file_path_var_name {} var_prefix | 
|  | 361 |  | 
|  | 362 | # Create password_var_name. | 
|  | 363 | set password_var_name ${var_prefix}password | 
|  | 364 | global $password_var_name | 
|  | 365 |  | 
|  | 366 | global longoptions pos_parms | 
|  | 367 | regsub -all ":" "${longoptions} ${pos_parms}" {} parm_names | 
|  | 368 | if { [lsearch -exact parm_names $password_var_name] == -1 } { | 
| Michael Walsh | 410b178 | 2019-10-22 15:56:18 -0500 | [diff] [blame] | 369 | # If no corresponding password program parm has been defined, then the pw_file_path must be valid. | 
| Michael Walsh | 05296fb | 2018-03-02 15:39:21 -0600 | [diff] [blame] | 370 | valid_file_path $pw_file_path_var_name | 
|  | 371 | } | 
|  | 372 |  | 
|  | 373 | if { [file isfile [set $pw_file_path_var_name]] } { | 
|  | 374 | # Read the entire password file into a list, filtering comments out. | 
|  | 375 | set file_descriptor [open [set $pw_file_path_var_name] r] | 
|  | 376 | set file_data [list_filter_comments [split [read $file_descriptor] "\n"]] | 
|  | 377 | close $file_descriptor | 
|  | 378 |  | 
|  | 379 | # Assign the password value to the global password variable. | 
|  | 380 | set $password_var_name [lindex $file_data 0] | 
|  | 381 | # Register the password to prevent printing it. | 
|  | 382 | register_passwords [set $password_var_name] | 
|  | 383 | } | 
|  | 384 |  | 
|  | 385 | # Validate the password, which includes prompting the user if need be. | 
|  | 386 | valid_password $password_var_name | 
|  | 387 |  | 
|  | 388 | } |