Next Previous Contents

2. Princípios

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.

2.1 Componentes do pacote shellmod

O pacote shellmod fornece as seguintes partes:

2.2 Como usar scripts shellmod

Um script pode ser utilizado sozinho ou juntamente com o Linuxconf. Pode ser utilizado de ambas as formas.

Como um utilitário sozinho

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).

Como um módulo do Linuxconf

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.

2.3 Estrutura de um script shellmod

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 biblioteca de funções shellmod-lib.sh

A função register

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 para módulos isolados ou sozinhos (stand-alone)

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\"
        }
        

A função main

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
        }
        

A função dispatch

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.

2.4 Como funciona

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.


Next Previous Contents