Next Previous Contents

3. Protocolo

ahora presentaremos los diferentes comandos tratados por el script. Estos comandos se dividen por tareas.

3.1 Esquema de comandos y comillas

Todos los comandos enviados a shellmod se hacen a parir del comando de shell echo (mostrar). Siempre tienen este aspecto:

        echo command arg1 arg2 arg3
        

Los argumentos son tanto simples como múltiples palabras (separadas por blancos). Para agrupar múltiples palabras como un único argumento, se puede utilizar las comillas. Aunque ésta sea la práctica estándar de dicha línea de comando, tiene un inconveniente: usar comillas sólo afectará al argumento tal y como se ve mediante el comando echo. Una vez procesado, la línea entera se recibirá como una cadena de palabras separadas por blancos y las comillas desaparecerán. Las comillas deben ser parte de la línea recibida por shellmod. Aquí hay un ejemplo:

        echo newf_str name \"Introduzca su nombre\" \"Tux el pingüino\"
        

shellmod-lib.sh define la función de ayuda qecho que puede usar para obtener un comportamiento más estándar de las comillas de shell. Aquí aparece el mismo ejemplo reescrito pero conqecho.

        qecho newf_str name "Introduzca su nombre" 'Tux el pingüino'
        

Como puede observar, con qecho puede mezclar las distintas sintaxis de comillas de shell. La función qecho se asegura de que tenga las comillas dobles correspondientes en todos los argumentos.

3.2 Enviando parámetros multi-líneas

Los scripts de shell no son tan buenos soportando y pasando texto en formato multi-línea. El comando defval se creó para corregir este defecto. Aquí tenemos un uso típico:

        echo var1 "Esta es la primera línea"
        echo var1 "Esta es la segunda línea"
        echo error =var1
        

Ésto crea un mensaje emergente de error con dos líneas. "defval"se usa repetidamente para definir el texto multi-línea y se relaciona como un argumento, usando el signo =. El argumento no deber estar entre comillas, así que no puede usar la función de ayuda qecho cuando utilice un parámetro defvar, ya que, qecho se asegura de todos los parámetros estén entre comillas.

3.3 Contruir un cuadro de diálogo

echo DIALOG

Un diálogo siempre empieza con este comando. No requiere muchos argumentos. Después lo arregla con definiciones de campo, añade botones opcionales y entonces llama a la función edit. Aquí hay un ejemplo:

        echo DIALOG
        echo newf_str var \"Campo de título\" value
        edho edit \"Título de diálogo\" \"Introducción de diálogo\"
        dispatch
        echo end
        

echo show \"título\" \"Introducción\"

Esto funciona como "edit", muestra diálogos con los mismos argumentos. Pero termina inmediatamente. Esto se usa generalmente con el comando newf_gauge.

dispatch

Ésto cede el control a Linuxconf/shellmod y espera los resultados. Las variables de campo son traducidas y actualizadas y la variable CODE se configura con el valor del botón seleccionado por el usuario, ya sea "Aceptar"o "Cancelar".

echo end

Ésto elmina el cuadro. Se borra de la pantalla y se olvida. A veces usamos el comando end justo después del comando dispatch, pero en cuadros más complicados puede usar el comando end después de un bucle de verificación.

Un ejemplo completo

#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
main(){
        echo DIALOG
        echo newf_str name \"Nombre de usuario\"
        while true
        do
                echo edit \"Pregunta de usuario\" \"Introduzca su nombre de usuario\"
                dispatch
                if [ "$CODE" = "cancelar" ] ; then
                        break
                elif [ "$name" = "" ] ; then
                        echo error \"Por favor, introduzca un nombre\"
                else
                        echo notice \"Haciendo lo que sea con la cuenta de usuario\"
                        break
                fi
        done
        echo end
}
dispatch
        

3.4 Construyendo un menú

Esto está contemplado por DIALOG_MENU y por los comandos new_menuitem.

echo DIALOG_MENU

No requiere ningún argumento.

función prompt title de echo new_menuitem

Esto almacena una entrada de menú. Cada entrada del menú se asocia a una función script (que debe estar definida). La señal es generalmente una clave. El título es el resto de la entrada del menú.

echo editmenu \"Título de menú\" \"Introducción\"

Esto muestra el menú seguida de una llamada a dispatch.

dispatch

Aquí es donde se acaba todo lo relacionado con el menú. La función duspatch se ejecutará hasta que el usuario aprete el botón "salir" (quit). La correspondiente función será llamada en el momento que se selecciones una entrada de menú, cosa que se realiza de forma transparente por dicha función.

Nótese que la función dispatch también termina si el usuario selecciona botones opcionales (añadidos con el comando button). Así que es posible gestionar esto en un bucle como el anterior.

echo end

Esto borra el menú.

Un ejemplo completo

#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
menufunc1(){
        echo notice \"menufunc1 seleccionado\"
}
menufunc2(){
        echo notice \"menufunc2 seleccionado\"
}
main(){
        echo DIALOG_MENU
        echo new_menuitem menufunc1 Select \"Primera opción\"
        echo new_menuitem menufunc2 \"\" \"Segunda opción\"
        echo editmenu \"Main menu\" \"Elegir una opción\"
        dispatch
        echo end
}
dispatch
        

3.5 Gestionando una lista de copias

echo DIALOG_LIST

Un DIALOG_LIST es sólo una variación de un menú. La diferencia principal estriba en que el número de la entrada puede ser muy largo. En tal caso un diálogo de filtro aparecerá y restringirá la cantidad de copias mostrada. Puede llegar a tener listas enormes de items.

DIALOG_LIST no requiere ningún argumento.

echo newf_head \"Column1 título\" \"Column2 título\" ...

Puede definir el encabezado de la lista. Esto es opcional pero es resultón.

echo new_menuitem \"args de la función\" \"Column1 valor\" \"Column2 valor\" ...

Funciona como DIALOG_MENU salvo que se suelen proporcionar más columnas. Existe otra variación ya que la función está definida con argumentos. Nótese que esto puede ser usado con DIALOG_MENU también. Generalmente definimos una función por entrada de menú y una única función para procesar cada copia de la lista, usando el argumento para diferenciar el proceso.

Nótese también que se puede usar una solución mixta dentro del mismo DIALOG_MENU o DIALOG_LIST: puede usar una única función para proveer un proceso común para algunas copias y diferentes funciones para gestionar cada excepción.

echo editmenu \"Título de lista\" \"Introducción\"

Lo mismo que con DIALOG_MENU.

dispatch

Se comporta como DIALOG_MENU.

echo end

Borra la lista.

Un ejemplo completo

Aquí hay un verdadero ejemplo donde se muestra un directorio y se permite al usuario elegir un archivo y hacer algo con él. Vemos en el ejemplo cúan sencillo es analizar la salida del comando "ls -l" y presentar el nombre de archivo, el tamaño y la data de revisión en tres columnas con formato.

#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
fileshow(){
        echo notice \"Procesando archivo $1\"
}
main(){
        echo DIALOG_LIST
        echo newf_head \"Nombre de archivo\" Tamaño \"Fecha de revisión\"
        ls -l $1 | \
                (
                read total
                while read perm count user group size month day hour name
                do
                        echo new_menuitem \"fileshow $name\" $name $size \"$month $day $hour\"
                done
                )
        echo editmenu \"Directorio Actual\" \"Esto muestra todos los archivos en el directorio actual\"
        dispatch
        echo end
}
dispatch

3.6 Definiendo campos

Todos los comandos que definen un campo de diálogo empiezan con el prefijo newf_. Hemos usado el mismo nombre y el mismo orden de parámetros (cuando ha sido posible) como en el módulo de C++ API.

El primer argumento es siempre el nombre de la variable shell que recibirá el valor introducido por el usuario. A menudo se usará el siguiente contructor para editar (corregir el valor actual) de una variable dada.

        qecho newf_str var "título" "$var"
        .
        qecho edit ...
        dispatch
        if [ "$CODE" = "aceptar" ] ; then
                if [ "$var" = "..." ] ;then
                        .
                        .
                fi
        fi
        

3.7 Lista de comandos

Aquí hay una lista de todos los comandos de campos de definición:

echo newf_chk var \"título del campo\" \"Valor inicial 0 o 1\" \"título de sufijo\"

Configure un campo de una casilla de verificación (on/off o sí/no). La variable var se configurará a 0 o 1. Este campo tiene dos títulos. Uno a la izquierda de la casilla de comprobación y otro a la derecha. Esto a menudo se usa como sigue:

        La siguiente característica [] está seleccionada
        

Variación de la sintaxis de newf_chk syntax

Cuand use newf_chk, debe pasar 0 o 1 como valor. La variable edit recibirá el resultado como 0 o 1. Esto no es útil ya que a menudo los shell script trabajan con diferentes tipos de valores booleanos. Por ejemplo, un script que trata con un servidor SQL puede encontrar que debe lidiar con valores Y y N. Para evitar tener que traducir de un sistema a otro se amplió la sintaxis referente al valor inicial.

echo newf_chkm var \"Campo de título\" \"Valor numérico inical\" \"valor1\" \"valor2\" ...

Configurar múltiples campos de selección usando casillas de verificación. Las casillas se presentan horizontalmente. Aquí hay un ejemplo seguido del campo que produce en modo texto:

        echo newf_chkm sel \"Qué posición\" 1 left center right
        

Produciendo:

        Qué posición    ( ) left  (o) center ( ) right
        

La variable var tomará el índice numérico del item sleccionado, empezando desde 0.

echo newf_combo var \"Campo de título\" \"Valor inicial\"

Configurar una única línea + slector de campo. El usuario será capaz de elegir un valor de entre una lista o introducir uno a mano. La variable var contendrá el valor literal introducido o seleccionado.

newf_combo se usa con el comando comboitem. Primero debe configrar el campo de edición del combo y después pasar uno a uno los posibles valores usando comboitem. Nótese que los valores van seguidos de un texto explicativo (opcional). Aquí hay un ejemplo de código:

        echo newf_combo port \"Qúe puerto\" ttyS1
        echo comboitem ttyS0 \"COM1 en DOS\"
        echo comboitem ttyS1 \"COM2 en DOS\"
        echo comboitem ttyS2 \"COM3 en DOS\"
        

La variable $port tomará los valores ttyS0, ttyS1, ttyS2 o cualquier otro valor que el usuario quiera darle. Véase newf_enum y newf_list para una variación de este campo de entrada.

echo newf_dbl var \"Título del campo\" \"Valor numérico inicial\" número de decimales

Configurando un campo de entrada numérico con notación decimal. Se escribe así newf_num salvo por la coma decimal que está permitida. El número de parámetro decimal controla el número de dígitos decimales permitidos después de la coma así como el formato del campo.

echo newf_enum var \"Título de campo\" \"Valor numérico inicial\"

Configurando un selector de campo. El usuario puede elegir un valor de entre una lista. La variable var contendrá el índice del ítem seleccionado. El usario se limita a escoger un item de la lista.

newf_enum se usa con el comando menuitem. Primero configure el campo enum y entonces pase uno a uno los posibles valores usando enumitem. Aquí hay un ejemplo de código:

        echo newf_enum no \"Qué puerto\" 1
        echo enumitem ttyS0 \"COM1 en DOS\"
        echo enumitem ttyS1 \"COM2 en DOS\"
        echo enumitem ttyS2 \"COM3 en DOS\"
        

La variable $no tomará el valor 0, 1 o 2. Vea newf_combo y newf_list para variar un campo de entrada.

echo newf_gauge ID \"Título de campo\" \"Valor decimal inicial\" \"Valor máximo\"

Configurar un indicador gráfico, generalmente para mostrar el estado de progresión de un proceso (cargando, instalando). El estado del indicador se cambia utilizando de nuevo este comando. La primera llamada define el campo y la siguiente actualiza el indicador. Este widget se usa generalmente con el comando "show" para que el script nunca pare en el estado "edit". Aquí mostramos un pequeño ejemplo:

        echo DIALOG
        qecho newf_gauge ID "Estado" 0 10
        qecho show "Estado" ""
        i=0
        while [ "$i" != "10" ] ; do
            i=`expr $i + 1`
            sleep 1
            qecho newf_gauge ID "Estado" $i 10
            qecho show "Estado" ""
        done
        

echo newf_hexnum var \"Título de campo\" \"Valor inicial hexadecimal\"

Configurando un campo de entrada numérico (entero). Funciona así: newf_num pero acepta dígitos y dígitos hexadecimales.

echo newf_list var \"Título de campo\" \"Valor inicial\"

Configurando un selector de campo. El usuario podrá escoger un valor de entre una lista. La variable var contendrá el valor literal seleccionado.

newf_list se usa con el comando listitem. Primero configure el campo de la lista y después pase uno a uno los posibles valores usando listitem. Nótese que los valores van seguidos de un texto explicativo (opcional). Aquí hay un ejemplo de código:

        echo newf_list port \"Qué puerto\" ttyS1
        echo listitem ttyS0 \"COM1 en DOS\"
        echo listitem ttyS1 \"COM2 en DOS\"
        echo listitem ttyS2 \"COM3 en DOS\"
        

La variable $port tomará los valores ttyS0, ttyS1 or ttyS2. Vea newf_enum y newf_combo para variar el campo de entrada.

echo newf_num var \"Título de campo\" \"Valor numérico inicial\"

Configurar un campo de entrada numérico (entero). Funciona como newf_str pero sólo acepta dígitos.

echo newf_pass var \"Título de campo\" \"Valor inicial\"

Configurando un campo de contraseña. Funciona como un campo newf_str pero la entrada no se muestra (escritura invisible).

echo newf_radio var \"Título de campo\" valor-numérico valor-ejemplo \"Título de sufijo\"

Configurando un campo de botón radio. Algunos campos de botones radio deben ser definidos para cada posible selección. Todos estos botones comparten las mismas variables de entrada (var de arriba) y operan conjuntamente. La variable var tomará el valor numérico del campo del botón radio seleccionado.

Los botones radio que estén relacionados pueden colocarse en cualquier lugar del diálogo. No necesitan estar de forma secuencial o incluso en la misma página del cuadro de diálogo de libreta.

echo newf_slider var \"Título de campo\" \"Valor decimal inicial\" \"valor mínimo\" \"valor máximo\"

Funciona como newf_num para editar un valor decimal, pero se muestra como un proyector de diapositivas gráfico. El valor máximo y mínimo representan el extremo izquierdo y el derecho del proyector.

        qecho newf_slider var "Hora de la cita" 15 9 16
        

echo newf_str var \"Título de campo\" \"Valor inicial\"

Configurar una entrada de línea de texto.

echo newf_title "Título del bloc" level "Título izquierdo" "Título del modo texto"

Esto no es un campo de entrada sinó una manera de organizar un diálogo grande en la sección. Es lresultado final es bien distinto en modo gráfico qu en texto y HTML. En el primero, creará un diálogo de bloc de notas y cada newf_title define una página de la libreta.

El primer argumento, título del bloc, sólo se usa en modo gráfico.

El segundo argumento es un número y representa el nivel del bloc de notas. Ésto permite diálogos muy complejos con bloc de notas dentro de los mismos. En modo texto y HTML, este argumento no tiene efecto.

El tercer argumento, título izquierdo, se usa sólo en modo texto y HTML. Coloca un pequeño título a la izquierda de los campos de entrada.

El último argumento, título en modo texto, aparece centrado entre dos campos de entrada.

3.8 Añadiendo botones

Puede añadir botones opcionales simplemente usando el comndo button. Requiere dos argumentos. El primero es la Id del botón que se pasará al script la variable CODE. El segundo es la etiqueta (título) del botón. Aquí hay un ejemplo:

        echo DIALOG
        echo newf_str name \"Nombre de usuario\" $name
        echo button Agregar \"Agregar un nuevo usuario\"
        echo edit "título" \"Gestión de usuarios\"
        dispatch
        echo end
        if [ "$CODE" = "Agregar" ] ; then
                # Añadir un nuevo usuario
        elif [ "$CODE" = "aceotar" ] ; then
                # Inspeccionar apariciones anteriores de  usuario
        fi
        

3.9 Ajustar el campo de entrada actual

El opcode "setcurfield" ajusta la zona activa del teclado hacia un determinado campo. Debe pasar la ID del campo como un único argumento. Aquí tiene un ejemplo:

        qecho DIALOG
        qecho newf_str uid "id de usuario" 
        qecho newf_str name "Nombre" 
        qecho newf_str phone "Nombre"
        qecho setcurfield name
        qecho edit "ejemplo" "La zona activa está sobre el nombre"
        dispatch
        echo end 
        


Next Previous Contents