Nesta seção nós veremos o layout básico de um script shellmod, como usá-lo e como ele se comunica com o Linuxconf.
O pacote shellmod fornece as seguintes partes:
Um script pode ser utilizado sozinho ou juntamente com o Linuxconf. Pode ser utilizado de ambas as formas.
Para executar um script shellmod, você pode fazer
shellmod rota_do_script [ argumentos ]
Ou se o script iniciar com #!/usr/bin/shellmod
, você simplesmente
o executa como qualquer utilitário. Observe que em todos os casos, o script
deve ser executável (chmod +x script
).
Para ser utilizado desta forma, ele deve estar registrado no Linuxconf. Isto é feito
interativamente ou utilizando uma linha especial de comando. O módulo shellmod
registra seu menu de configuração no menu Sistemas e arquivos de controle
.
Você encontrará lá um diálogo para registrar seu script. Apenas entre com a rota
de seu script e mais nada. O script será visível ao Linuxconf a partir da próxima
execução.
O script pode ser registrado utilizando a seguinte linha de comando. Isto é útil especialmente se você incluir seu script em um pacote e desejar registrar o script no Linuxconf como instalação de pacote. (Empacotadores RPM devem considerar a grande facilidade em se fazer isto).
linuxconf --modulemain shellmod --setmod rota_do_script
Observe que a construção linuxconf --modulemain
é a forma normal
de ceder o controle à linha de comando de um módulo: o shellmod não é
diferente.
Você pode remover o registro de um script do Linuxconf da seguinte forma:
linuxconf --modulemain shellmod --unsetmod rota_do_script
Observe que a sintaxe acima replica a forma normal (C++) que os módulos Linuxconf
podem ser registrados ou removidos do registro, usando as linhas de comando
linuxconf --setmod
e linuxconf --unsetmod
.
Um script shellmod sempre terá este aspecto:
#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
register(){
# Coloque aqui as chamadas do regmenu e comanager
}
# Coloque aqui as várias funções referenciadas acima
main(){
# Nós definimos um sub-menu ou um diálogo
}
# O script sempre termina com a chamada da função dispatch function call. Sempre.
dispatch
A função register é necessária se o script for utilizado como um módulo do Linuxconf. Linuxconf chamará a função esperando que o script retorne a lista de menus e diálogos nos quais ele deseja registrar. Eis aqui um exemplo de uma função de registro instalando dois sub-menus e um co-administrador (co-manager).
# Registro no menu "miscellaneous service"
echo regmenu main MENU_MISCSERV \"menu principal do módulo\"
# Registro ao final do menu dnsconf
echo regmenu function2 dnsconf \"Qualquer título\"
# Registro como co-manager no diálogo de contas de usuário
echo comanager function-prefix user
A função register não é necessária para módulos isolados. É uma boa idéia fornecer um mínimo para o caso de o usuário tentar registrar o módulo no Linuxconf. As linhas seguintes tornarão claro que um determinado script não foi feito para ser executado desta forma:
register(){
echo error \"Este script shellmod não pode ser usado como um módulo\"
}
Se o script é usado sozinho, ele precisa de uma função chamada main. O utilitário shellmod chamará esta função cegamente. É uma boa idéia sempre fornecer uma. Na função register nós freqüentemente registramos a função main em um menu do Linuxconf. Desta forma, o script fornece uma interface consistente usada tanto sozinha como quando um módulo do Linuxconf.
A função main geralmente define um menu ou um diálogo. Observe que a função main é aquela que receberá os argumentos do script. Os argumentos freqüentemente serão usados como valores padrão para os campos do diálogo. Observe o exemplo a seguir:
main(){
echo DIALOG
echo newf_str path \"Rota do Documento\" $1
echo newf_str mail \"Enviar este documento por e-mail para\" $2
echo newf_str fax \"Enviar este documento por fax para\" $3
echo edit \"Gerenciador de documentos\" \"Preencha os campos para enviar o documento\"
dispatch
echo end
if [ "$CODE" = "accept" ] ; then
if [ "$mail" != "" ] ; then
cat $path | mail $mail
fi
if [ "$fax" != "" ] ; then
spoolfax $fax $path
fi
fi
}
Um módulo sempre termina com uma chamada à função dispatch. Um script shellmod pode ser visto como um conjunto de funções esperando ser chamado (uma biblioteca). Baseado neste contexto, o Linuxconf (ou shellmod para scripts sozinhos) chamará a função apropriada.
Observe que o script pode executar alguma inicialização antes de chamar a função dispatch. Como explicado a seguir, um script pode ser visto como um pequeno servidor que mantém seu estado entre chamadas a suas várias funções.
Um script shellmod interage com o shellmod ou Linuxconf ecoando comandos em sua saída padrão. Ele recebe instuções simplesmente lendo sua entrada padrão. A função dispatch cuida de ler e processar (dispatch) o pedido que ela recebe. Nós podemos pensar no script como sendo um sanduíche entre dois processos shellmod, como a seguir:
shellmod | script | shellmod
Tudo que é ecoado pelo script é captado pelo shellmod e interpretado como
comandos de protocolo. É importante redirecionar a saída do subcomando que
você estiver usando tanto para o canal de erros (command >&2
) ou
para /dev/null. Se isto não for feito, aparecerão muitas mensagens de erro
provenientes do shellmod.