Next Previous Contents

2. Principios

En esta sección veremos el esquema básico de un script shellmod, cómo usarlo y cómo comunicarse con Linuxconf.

2.1 Componentes del paquete shellmod

El paquete shellmod proporciona las siguientes partes:

2.2 Cómo usar shellmod scripts

Un script puede usarse de manera autónoma o incluido en Linuxconf.

Como utlidad autónoma (stand-alone)...

Para ejecutarlo, haga:

        shellmod ruta_del_script [ argumentos ]
        

O si el script empieza con #!/usr/bin/shellmod, simplemente ejecútelo como cualquier otra utilidad. Nótese que en ambos casos, el script debe ser ejecutable (chmod +x script).

Como un módulo Linuxconf

Para usarlo de esta manera, debe ser registrado en Linuxconf. Esto se hace tanto interactivamente como usando una línea especial de comando. El módulo shellmod registra su menú de configuración en el menú Control de archivos y sistemas. Encontrará allí un cuadro de diálogo para registrar su script. Simplemente introduzca la ruta y éste estará visible en Linuxconf en la próxima ejecución.

El script se puede registrar usando la siguiente línea de comando. Ésta es especialmente útil si lo incluye en un paquete y quisiera registrarlo en Linuxconf en la instalación de paquetes (los empaquetadores RPM pueden tener en cuenta la utilidad de trigger para hacerlo).

        linuxconf --modulemain shellmod --setmod ruta_del_script
        

Nótese que el constructor linuxconf --modulemain es la manera normal de ceder el control a una línea de comando propia del módulo: en este aspecto shellmod no es diferente.

Puede darlo de baja de Linuxconf haciendo lo siguiente:

        linuxconf --modulemain shellmod --unsetmod ruta_del_script
        

Nótese que la sintaxis de arriba reproduce exactamente el funcionamiento normal (C++) de los módulos de Linuxconf deben ser registrados y dados de baja, mediante las líneas linuxconf --setmod y linuxconf --unsetmod .

2.3 Esquema de un script shellmod

Un script shellmod siempre tiene este aspecto:

        #!/usr/bin/shellmod
        . /usr/lib/linuxconf/lib/shellmod-lib.sh
        register(){
                # Poner las llamadas a regmenu y comanager aquí
        }
        # Poner las distintas funciones mencionadas arriba
        
        main(){
                # Definimos un submenú o un diálogo
        }
        # El script siempre termina con una llamada a la función dispatch. Siempre dispatch.
        

La librería de funciones shellmod-lib.sh

La función registro

Se necesita la función registro si el script es utilizado como un módulo Linuxconf, que llamará a la función que espera que el script le devuelva la lista del menú y el diálogo en el que se quiere registrar. Aquí tiene un ejemplo de una función de registro que instala dos submenús y un co-administrador:

        # Registrar el menú "miscellaneous service" 
        echo regmenu main MENU_MISCSERV \"menú principal del módulo\"
        # Registrar al final del menú de dnsconf 
        echo regmenu función2 dnsconf \"Algún título\"
        # Registrar como co-administradorr en el diálogo de cuentas de usuario
        echo comanager prefijo-función user
        

La función registro para módulos autónomos

La función registro no se necesita para módulos autónomos. Es buena idea proporcionar una función mínima similar en caso de que un usuario intentase registrar este módulo en Linuxconf. La siguiente lo aclara, aunque no se pretende que el script se use así:

        register(){
                echo error \"Este script shellmod no se puede registar\"
        }
        

La función principal (main)

Si el script se usa de forma autónoma, requiere de una función llamada main. La utilidad shellmod llamará ciegamente a esta función. Es necesario implementar siempre una función main. En la función register a menudo se añade una función main a los menús de Linuxconf. Hecho así, el script proporciona una interfaz consistente usado tanto de forma autónoma como en forma de módulo Linuxconf.

La función main generalmente definirá un menú o diálogo. Nótese que dicha función es la que recibe los argumentos del script, que a menudo se usan como valores por definición para los campos de diálogo. Aquí se presenta un pequeño ejemplo:

        main(){
                echo DIALOG
                echo newf_str path \"Ruta del documento\" $1
                echo newf_str mail \"Enviar este documento a\" $2
                echo newf_str fax \"Enviar por fax este documento a\" $3
                echo edit \"Administrador de documentos\" \"Rellene este formulario para enviar el documento\"
                dispatch
                echo end
                if [ "$CODE" = "aceptar" ] ; then
                        if [ "$mail" != "" ] ; then
                                cat $path | mail $mail
                        fi
                        if [ "$fax" != "" ] ; then
                                spoolfax $fax $path
                        fi
                fi
        }
        

La función dispatch

Un módulo siempre termina con una llamada a una función dispatch. Un script shellmod puede verse como un conjunto de funciones esperando a ser llamadas (una librería). Basado en este contexto, Linuxconf (o shellmod para scripts autónomos) llamará a la función apropiada.

Nótese que el script puede realizar algunas tareas previas de configuración antes de llamar a la función dispatch. Como se explicará posteriormente, un script puede verse como un pequeño servidor que mantiene su estado entre llamadas a sus distintas funciones.

2.4 Cómo funciona

Un script shellmod interactúa con shellmod o Linuxconf mostrando comandos por la salida estándar. La función dispatch se cuida de leer y procesar (dispatching) la petición que recibe. Podemos imaginarnos que el script es la parte del medio de un "sandwich" como este:

        shellmod | script | shellmod
        

Todo lo que muestra el script se capta mediante shellmod y se interpreta como comandos de protocolos. Es importante redirigir la salida del sub-comando que está utilizando tanto hacia el canal de error (command &2) como a /dev/null. La falta de ésto puede originar multitud de mensajes de error de shellmod.


Next Previous Contents