[MODIFIED] Se agrega libreria bash console.lib para manejo de dialgo de entrada
This commit is contained in:
		
							parent
							
								
									39c7aecbae
								
							
						
					
					
						commit
						f2b042f42d
					
				
					 1 changed files with 348 additions and 0 deletions
				
			
		
							
								
								
									
										348
									
								
								bin/lib/console.lib
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										348
									
								
								bin/lib/console.lib
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,348 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | # | ||||||
|  | # Library: console.lib | ||||||
|  | # Modified: 2024/12/04 12:27:00 | ||||||
|  | # Derechos de Autor (C) [2024] [Mauro Rosero P. <mauro@roser.one>] | ||||||
|  | # | ||||||
|  | # Este programa es software libre: usted puede redistribuirlo y/o modificarlo | ||||||
|  | # bajo los términos de la Licencia Pública Affero General de GNU tal como | ||||||
|  | # lo publica la Free Software Foundation, ya sea la versión 3 de la licencia, | ||||||
|  | # o (a su elección) cualquier versión posterior. | ||||||
|  | # | ||||||
|  | # Este programa se distribuye con la esperanza de que sea útil, | ||||||
|  | # pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de | ||||||
|  | # COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la | ||||||
|  | # Licencia Pública Affero General de GNU para obtener más detalles. | ||||||
|  | # | ||||||
|  | # Debería haber recibido una copia de la Licencia Pública Affero General | ||||||
|  | # junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | # Global Default Variables | ||||||
|  | CWIDTH=70 | ||||||
|  | CROWS=8 | ||||||
|  | CX=4 | ||||||
|  | CY=2 | ||||||
|  | 
 | ||||||
|  | # Dialog Yes/No Question | ||||||
|  | function dialog_yesno() { | ||||||
|  | 
 | ||||||
|  |   local label="$1" | ||||||
|  |   local rows="${2:-$CROWS}" | ||||||
|  |   local width="${3:-$CWIDTH}" | ||||||
|  | 
 | ||||||
|  |   dialog --keep-window --begin  ${CX} ${CY} --colors --no-shadow --backtitle "${title}" --title "${apps_title}" --yesno "\n${label}" ${rows} ${width} | ||||||
|  |   result=$? | ||||||
|  | 
 | ||||||
|  |   return ${result} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Dialog Input Box | ||||||
|  | function dialog_input_box() { | ||||||
|  | 
 | ||||||
|  |   local label="$1" | ||||||
|  |   local helper="$2" | ||||||
|  |   local v_default="$3" | ||||||
|  |   local rows="${4:-$CROWS}" | ||||||
|  |   local width="${5:-$CWIDTH}" | ||||||
|  | 
 | ||||||
|  |   exec 3>&1; | ||||||
|  |   value=$(dialog --keep-window --begin  ${CX} ${CY} --colors --no-shadow --backtitle "${title}" --title "${apps_title}" --inputbox "\n${label}\n${helper}" ${rows} ${width} "${v_default}" 2>&1 1>&3); | ||||||
|  |   codex=$?; | ||||||
|  |   exec 3>&-; | ||||||
|  | 
 | ||||||
|  |   return ${codex} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Dialog Password Box | ||||||
|  | function dialog_input_pass(){ | ||||||
|  | 
 | ||||||
|  |   local label="$1" | ||||||
|  |   local helper="$2" | ||||||
|  |   local v_default="$3" | ||||||
|  |   local rows="${4:-$CROWS}" | ||||||
|  |   local width="${5:-$CWIDTH}" | ||||||
|  | 
 | ||||||
|  |   exec 3>&1; | ||||||
|  |   value=$(dialog --keep-window --begin  ${CX} ${CY} --colors --no-shadow --backtitle "${title}" --title "${apps_title}" --passwordbox "\n${label}\n${helper}" ${rows} ${width} "${v_default}" 2>&1 1>&3); | ||||||
|  |   codex=$?; | ||||||
|  |   exec 3>&-; | ||||||
|  | 
 | ||||||
|  |   return ${codex} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Dialog Radio List | ||||||
|  | function dialog_input_radio() { | ||||||
|  | 
 | ||||||
|  |   local label="$1" | ||||||
|  |   local helper="$2" | ||||||
|  |   local options="$3" | ||||||
|  |   local rows="${4:-$CROWS}" | ||||||
|  |   local width="${5:-$CWIDTH}" | ||||||
|  | 
 | ||||||
|  |   # Calcular el número de elementos | ||||||
|  |   local elements=$(echo "$options" | awk '{print NF/3 + 1}') | ||||||
|  |   ((rows += elements)) | ||||||
|  | 
 | ||||||
|  |   exec 3>&1; | ||||||
|  |   value=$(dialog --keep-window --begin ${CX} ${CY} --colors --no-shadow --backtitle "${title}" --title "${apps_title}" --radiolist "\n${label}\n${helper}" ${rows} ${width} ${elements} ${options} 2>&1 1>&3) | ||||||
|  |   codex=$? | ||||||
|  |   exec 3>&-; | ||||||
|  | 
 | ||||||
|  |   return ${codex} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Dialog Menu Select | ||||||
|  | function dialog_input_menu() { | ||||||
|  | 
 | ||||||
|  |   local label="$1" | ||||||
|  |   local helper="$2" | ||||||
|  |   local options="$3" | ||||||
|  |   local rows="${4:-$CROWS}" | ||||||
|  |   local width="${5:-$CWIDTH}" | ||||||
|  | 
 | ||||||
|  |   # Calcular el número de elementos | ||||||
|  |   local elements=$(echo "$options" | awk '{print NF/2 + 1}') | ||||||
|  |   ((rows += elements)) | ||||||
|  | 
 | ||||||
|  |   exec 3>&1; | ||||||
|  |   value=$(dialog --keep-window --begin ${CX} ${CY} --colors --no-shadow --backtitle "${title}" --title "${apps_title}" --menu "\n${label}\n${helper}" ${rows} ${width} ${elements} ${options} 2>&1 1>&3) | ||||||
|  |   codex=$? | ||||||
|  |   exec 3>&-; | ||||||
|  | 
 | ||||||
|  |   return ${codex} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Dialog Select File Box Input | ||||||
|  | function dialog_input_filepath() { | ||||||
|  | 
 | ||||||
|  |   local valid_file="0" | ||||||
|  |   local file_path=$1 | ||||||
|  | 
 | ||||||
|  |   while [ "$valid_file" == "0" ] | ||||||
|  |   do | ||||||
|  |     exec 3>&1; | ||||||
|  |     result=$(dialog --begin 2 2 --title "${apps_title} - $2" --backtitle "${title}" --fselect ${file_path} 7 0 2>&1 1>&3); | ||||||
|  |     exitcode=$?; | ||||||
|  |     exec 3>&-; | ||||||
|  |     if [ "$exitcode" == "0" ] | ||||||
|  |     then | ||||||
|  |       if [ -f "$result" ] | ||||||
|  |       then | ||||||
|  |         file_path=${result} | ||||||
|  |         valid_file="1" | ||||||
|  |       fi | ||||||
|  |     else | ||||||
|  |       valid_file="2" | ||||||
|  |     fi | ||||||
|  |   done | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Dialog Error Box | ||||||
|  | function dialog_error_box() { | ||||||
|  | 
 | ||||||
|  |   local msgtype="$1" | ||||||
|  |   local message="$2" | ||||||
|  | 
 | ||||||
|  |   # Redirigir la salida de error al descriptor de archivo 3 | ||||||
|  |   exec 3>&1; | ||||||
|  | 
 | ||||||
|  |   # Mostrar el cuadro de diálogo | ||||||
|  |   dialog --backtitle "${title}" --title "${msgtype} - ${apps_title}" --msgbox "\n${message}" 8 ${CWIDTH} | ||||||
|  |   #dialog --and-widget --msgbox "\n${message}" | ||||||
|  | 
 | ||||||
|  |   exec 3>&-; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Dialog Validation for input | ||||||
|  | function dialog_validate_input() { | ||||||
|  | 
 | ||||||
|  |   local value="$2" | ||||||
|  |   local label="$3" | ||||||
|  |   local email_regex='^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' | ||||||
|  |   local gpg_duration_regex="^[0-9]+([dmy])?$" | ||||||
|  |   local domain_regex="^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9]+[a-zA-Z0-9-]*[a-zA-Z0-9]+))(\.([a-zA-Z]{2,})){1,}$" | ||||||
|  | 
 | ||||||
|  |   # Verificar si se proporcionó un argumento | ||||||
|  |   if [ $# -ne 0 ]; then | ||||||
|  |     # Convertir el argumento en un array | ||||||
|  |     arr=($1) | ||||||
|  | 
 | ||||||
|  |     # Iterar sobre el array y llamar a process_element para cada elemento | ||||||
|  |     for vcode in "${arr[@]}" | ||||||
|  |     do | ||||||
|  |       case ${vcode} in | ||||||
|  |         000) | ||||||
|  |           return 0 | ||||||
|  |           ;; | ||||||
|  |         001) | ||||||
|  |           if [ -z "${value}"  ] | ||||||
|  |           then | ||||||
|  |             dialog_error_box "${head_error}" "${label} ${vldt_001}" | ||||||
|  |             return 1 | ||||||
|  |           fi | ||||||
|  |           ;; | ||||||
|  |         010) | ||||||
|  |           if [[ ! "${value}" =~ ${email_regex} ]] | ||||||
|  |           then | ||||||
|  |             dialog_error_box "${head_error}" "${vldt_010}" | ||||||
|  |             return 1 | ||||||
|  |           fi | ||||||
|  |           ;; | ||||||
|  |         011) | ||||||
|  |           if [[ ! "${value}" =~ ${gpg_duration_regex} ]] | ||||||
|  |           then | ||||||
|  |             dialog_error_box "${head_error}" "${vldt_011}" | ||||||
|  |             return 1 | ||||||
|  |           fi | ||||||
|  |           ;; | ||||||
|  |         012) | ||||||
|  |           if [[ ! "${value}" =~ ${domain_regex} ]] | ||||||
|  |           then | ||||||
|  |             dialog_error_box "${head_error}" "${vldt_012}" | ||||||
|  |             return 1 | ||||||
|  |           fi | ||||||
|  |           ;; | ||||||
|  |       esac | ||||||
|  |     done | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   return 0 | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Dialog data input form | ||||||
|  | function dialog_form() { | ||||||
|  | 
 | ||||||
|  |   # Ciclo de captura de datos | ||||||
|  |   clear | ||||||
|  |   control=0 | ||||||
|  |   while [ ${control} -lt ${c_end} ] | ||||||
|  |   do | ||||||
|  |     case ${c_mod[control]} in | ||||||
|  |       1) | ||||||
|  |         dialog_input_box "[${control}] ${c_lbl[control]}" "${c_hlp[control]}" | ||||||
|  |         if [ ${codex} -eq 0 ] | ||||||
|  |         then | ||||||
|  |           dialog_validate_input "${c_val[control]}" "${value}" "${c_lbl[control]}" | ||||||
|  |           if [ $? -eq 0 ] | ||||||
|  |           then | ||||||
|  |             response[control]="${value}" | ||||||
|  |             ((control++)) | ||||||
|  |           fi | ||||||
|  |         else | ||||||
|  |           case ${codex} in | ||||||
|  |             1) | ||||||
|  |               if [ ${control} -gt 0 ] | ||||||
|  |               then | ||||||
|  |                 ((control--)) | ||||||
|  |               else | ||||||
|  |                 control=${c_end} | ||||||
|  |                 return 1 | ||||||
|  |               fi | ||||||
|  |               ;; | ||||||
|  |             255) | ||||||
|  |               return 1 | ||||||
|  |               control=${c_end} | ||||||
|  |               ;; | ||||||
|  |           esac | ||||||
|  |         fi | ||||||
|  |         ;; | ||||||
|  |       2) | ||||||
|  |         dialog_input_pass "[${control}] ${c_lbl[control]}" "${c_hlp[control]}" | ||||||
|  |         if [ ${codex} -eq 0 ] | ||||||
|  |         then | ||||||
|  |           response[control]="${value}" | ||||||
|  |           dialog_input_pass "[${control}] ${c_lbl[control]} ${head_confirm}" "${c_hlp[control]}" | ||||||
|  |           if [ ${codex} -eq 0 ] | ||||||
|  |           then | ||||||
|  |             if [ "${response[control]}" == "${value}" ] && [ ! -z "${response[control]}" ] | ||||||
|  |             then | ||||||
|  |               ((control++)) | ||||||
|  |               sleep 1 | ||||||
|  |             else | ||||||
|  |               dialog_error_box "${head_error}" "${vldt_002}" | ||||||
|  |             fi | ||||||
|  |           else | ||||||
|  |             if [ ${codex} -eq 255 ] | ||||||
|  |             then | ||||||
|  |               control=${c_end} | ||||||
|  |               return 1 | ||||||
|  |             fi | ||||||
|  |           fi | ||||||
|  |         else | ||||||
|  |           case ${codex} in | ||||||
|  |             1) | ||||||
|  |               if [ ${control} -gt 0 ] | ||||||
|  |               then | ||||||
|  |                 ((control--)) | ||||||
|  |               else | ||||||
|  |                 control=${c_end} | ||||||
|  |                 return 1 | ||||||
|  |               fi | ||||||
|  |               ;; | ||||||
|  |             255) | ||||||
|  |               return 1 | ||||||
|  |               control=${c_end} | ||||||
|  |               ;; | ||||||
|  |           esac | ||||||
|  |         fi | ||||||
|  |         ;; | ||||||
|  |       3) | ||||||
|  |         dialog_input_radio "[${control}] ${c_lbl[control]}" "${c_hlp[control]}" "${c_opt[control]}" | ||||||
|  |         if [ ${codex} -eq 0 ] | ||||||
|  |         then | ||||||
|  |           response[control]="${value}" | ||||||
|  |           ((control++)) | ||||||
|  |         else | ||||||
|  |           case ${codex} in | ||||||
|  |             1) | ||||||
|  |               if [ ${control} -gt 0 ] | ||||||
|  |               then | ||||||
|  |                 ((control--)) | ||||||
|  |               else | ||||||
|  |                 control=${c_end} | ||||||
|  |                 return 1 | ||||||
|  |               fi | ||||||
|  |               ;; | ||||||
|  |             255) | ||||||
|  |               return 1 | ||||||
|  |               control=${c_end} | ||||||
|  |               ;; | ||||||
|  |           esac | ||||||
|  |         fi | ||||||
|  |         ;; | ||||||
|  |       4) | ||||||
|  |         dialog_input_menu "[${control}] ${c_lbl[control]}" "${c_hlp[control]}" "${c_opt[control]}" | ||||||
|  |         if [ ${codex} -eq 0 ] | ||||||
|  |         then | ||||||
|  |           response[control]="${value}" | ||||||
|  |           ((control++)) | ||||||
|  |         else | ||||||
|  |           case ${codex} in | ||||||
|  |             1) | ||||||
|  |               if [ ${control} -gt 0 ] | ||||||
|  |               then | ||||||
|  |                 ((control--)) | ||||||
|  |               else | ||||||
|  |                 control=${c_end} | ||||||
|  |                 return 1 | ||||||
|  |               fi | ||||||
|  |               ;; | ||||||
|  |             255) | ||||||
|  |               return 1 | ||||||
|  |               control=${c_end} | ||||||
|  |               ;; | ||||||
|  |           esac | ||||||
|  |         fi | ||||||
|  |         ;; | ||||||
|  |     esac | ||||||
|  |   done | ||||||
|  | 
 | ||||||
|  | } | ||||||
		Loading…
	
		Reference in a new issue