En esta sección veremos el esquema básico de un script shellmod, cómo usarlo y cómo comunicarse con Linuxconf.
El paquete shellmod proporciona las siguientes partes:
Un script puede usarse de manera autónoma o incluido en Linuxconf.
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
).
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
.
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.
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 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\"
}
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
}
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.
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.