Next Previous Contents

3. Protocolo

Nós agora apresentamos os vários comandos editados pelo script. Estes commandos são divididos por tarefa.

3.1 Estrutura de comandos e colocação de aspas

Todos os comandos são enviados ao shellmod através do comando echo. Eles sempre se parecem com:

        echo command arg1 arg2 arg3
        

Os argumentos podem ser palavras simples, ou várias palavras separadas por espaços. Para agrupar múltiplas palavras como um argumento simples, deve-se usar aspas. Apesar de isto ser uma prática comum em linhas de commando, existe um detalhe: as aspas irão afetar apenas o argumento conforme visto pelo comando echo. Uma vez processada, a linha inteira será recebida como um fluxo simples de palavras separadas por espaços e as aspas desaparecerão. As aspas devem ser parte da linha recebida pelo shellmod. Veja um exemplo:

        echo newf_str name \"Digite seu nome\" \"Tux, o pingüim\"
        

A biblioteca shellmod-lib.sh define a função qecho que ajudará você a ter um comportamento de aspas padrão. O seguinte é um exemplo reescrito com qecho.

        qecho newf_str name "Digite seu nome" 'Tux, o pingüim'
        

Como você pode ver, com qecho você pode misturar as diferentes sintaxes de aspas do shell. A função qecho assegura que as aspas agregam todos os argumentos.

3.2 Enviando parâmetros em várias linhas

Scripts shell não são tão bons em manipular e entregar texto em várias linhas. O comando "defval" foi criado para consertar isso. Eis aqui uma forma típica de utlização:

        echo var1 "Esta é a primeira linha"
        echo var1 "Esta é a segunda linha"
        echo error =var1
        

Isto cria uma mensagem popup de erro com duas linhas. "defval" é usado repetidamente para definir o texto em várias linhas e é referenciado como um argumento utilizando o sinal = . O argumento não pode estar entre aspas. Deste modo, você não pode utilizar a função qecho usando um parâmetro defvar parameter, porque qecho necessita de aspas fechando todos os parâmetros.

3.3 Construindo um diálogo.

echo DIALOG

Um diálogo sempre inicia com este comando. Ele não requere nenhum argumento a mais. Depois você acrescenta definições de campos, adiciona botões opcionais e então você chama a função edit. Eis aqui um exemplo:

        echo DIALOG
        echo newf_str var \"título do campo\" value
        edho edit \"Título do diálogo\" \"Introdução do Diálogo\"
        dispatch
        echo end
        

echo show \"título\" \"Introdução\"

Isto funciona do mesmo modo que o edit. Ele apresenta o diálogo com os mesmos argumentos, mas retorna imediatamente. Geralmente é usado com o comando newf_gauge.

dispatch

Passa o controle para Linuxconf/shellmod e espera pelos resultados. As variáveis de campo são atualizadas e a variável CODE recebe o valor do botão selecionado pelo usuário: Pode ser tanto "accept" (aceitar) como "cancel" (cancelar).

echo end

Isto apaga o diálogo. Ele é removido da tela e esquecido. Nós editamos freqüentemente o comando end logo após o comando dispatch. Mas diálogos mais complexos podem utilizar o comando end após um loop de validação.

Um exemplo completo

#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
main(){
        echo DIALOG
        echo newf_str name \"Nome de Usuário\"
        while true
        do
                echo edit \"Perguntas ao usuário\" \"Entre com o nome de usuário\"
                dispatch
                if [ "$CODE" = "cancel" ] ; then
                        break
                elif [ "$name" = "" ] ; then
                        echo error \"Por favor entre com um nome\"
                else
                        echo notice \"Fazendo algo com a conta do usuário\"
                        break
                fi
        done
        echo end
}
dispatch
        

3.4 Construindo um menu

Isto é manipulado pelos comandos DIALOG_MENU e new_menuitem.

echo DIALOG_MENU

Não requere nenhum argumento.

echo new_menuitem function prompt titulo

Isto registra mais uma entrada no menu. Cada entrada de menu é associada com uma função de script (que deve ser definida). O prompt geralmente é uma palavra-chave. O título é o restante da entrada do menu.

echo editmenu \"Título do Menu\" \"Introdução\"

Isto faz o menu aparecer. É seguido por uma chamada a dispatch.

dispatch

Aqui é onde tudo é realizado para o menu. A função dispatch será executada até que o usuário selecione o botão "quit". A função correspondente é chamada sempre que uma entrada de menu for selecionada. Isto é manipulado transparentemente pela função dispatch.

Observe que a função dispatch também termina se o usuário selecionar algum botão opcional (adicionados com o comando button). Deste modo é possível executar o controle em um loop como o diálogo do exemplo acima.

echo end

Apaga o menu.

Um exemplo completo

#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
menufunc1(){
        echo notice \"menufunc1 selecionado\"
}
menufunc2(){
        echo notice \"menufunc2 selecionado\"
}
main(){
        echo DIALOG_MENU
        echo new_menuitem menufunc1 Select \"Primeira opção\"
        echo new_menuitem menufunc2 \"\" \"Segunda opção\"
        echo editmenu \"Menu principal\" \"Escolha uma opção\"
        dispatch
        echo end
}
dispatch
        

3.5 Gerenciando uma lista de registros

echo DIALOG_LIST

DIALOG_LIST é apenas uma variação de um menu. A principal diferença é que o número da entrada pode ser bem longo. Nesse caso, um diálogo de filtro será apresentado para restringir o número de registros mostrados. Você pode então lidar com uma lista muito grande de itens.

DIALOG_LIST não requer nenhum argumento.

echo newf_head \"Título da Coluna 1\" \"Título da Coluna 2\" ...

Você pode definir o cabeçalho da lista. Isto é opcional, mas fica com um aspecto muito melhor.

echo new_menuitem \"Argumentos da função\" \"Valor da Coluna 1\" \"Valor da Coluna 2\" ...

Funciona como DIALOG_MENU, exceto por nós normalmente fornecermos mais colunas. Existe uma outra variação quando a função é definida com argumentos. Observe que este modo pode ser utilizado com DIALOG_MENU da mesma forma. Nós geralment definimos uma função por entrada de menu e uma função simples para processar cada registro da lista, usando o argumento para diferenciar o processamento.

Observe também que você pode usar uma solução mista com o mesmo DIALOG_MENU ou DIALOG_LIST: você pode utilizar uma função simples para fornecer um processamento comum para alguns registros e uma função diferente para gerenciar exceções.

echo editmenu \"Título da lista\" \"Introdução\"

Igual a DIALOG_MENU.

dispatch

Isto se comporta como DIALOG_MENU.

echo end

Isto apaga a lista.

Um exemplo completo

Eis aqui um exemplo real onde nós apresentamos um diretório e permitimos que o usuário escolha um arquivo para fazer algo com ele. Nós vemos neste exemplo como é fácil analisar a saída do comando "ls -l" e apresentar o nome do arquivo, o tamanho e a data de revisão em um formato de três colunas.

#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
fileshow(){
        echo notice \"Processando arquivo $1\"
}
main(){
        echo DIALOG_LIST
        echo newf_head \"Nome do Arquivo\" Size \"Data de Revisão\"
        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 \"Diretório Atual\" \"Mostra todos os arquivos no diretório atual\"
        dispatch
        echo end
}
dispatch

3.6 Definindo campos

Todos os comandos que definem um campo de diálogo iniciam com o prefixo newf_. Nós usamos a mesma ordem de nome e de parâmetro (quando possível) conforme a API do módulo C++.

O primeiro argumento é sempre o nome da variável shell a qual receberá o valor entrado pelo usuário. Você utilizará freqüentemente a seguinte construção para editar (corrigir o valor atual) de uma determinada variável.

        qecho newf_str var "title" "$var"
        .
        qecho edit ...
        dispatch
        if [ "$CODE" = "accept" ] ; then
                if [ "$var" = "..." ] ;then
                        .
                        .
                fi
        fi
        

3.7 Lista de comandos

Here is the list of all field definition commands:

echo newf_chk var \"Título do campo\" \"Valor inicial 0 ou 1\" \"Título do sufixo\"

Define um campo de caixa de verificação (lig/des ou sim/não). A variável var será definida como 0 ou 1. Este campo tem dois títulos. Um na esquerda da caixa de verificação e um na direita. No Linuxconf, isto é freqüentemente usado da seguinte maneira:

        A seguinte característica [ ] está selecionada
        

Variações da sintaxe de newf_chk

Quando você usar newf_chk, você deve passar valores 0 ou 1. A variável edit receberá esse valor como 0 ou 1. Isto não é muito útil, já que, com freqüência, scripts shell lidam com diferentes tipos de valores booleanos. Por exemplo, um script tratando com um servidor SQL pode se deparar com valores como Y e N. Para evitar a tradução de um sistema para o outro, a sintaxe do valor inicial foi expandida.

echo newf_chkm var \"título do campo\" \"valor numérico inicial\" \"valor1\" \"valor2\" ...

Configuração de campos de seleção múltipla utilizando caixas de verificação. As caixas são apresentadas horizontalmente. Eis um exemplo seguido do campo produzido em modo texto:

        echo newf_chkm sel \"Qual posição\" 1 esquerda centro direita
        

This produces:

        Qual posição    ( ) esquerda  (o) centro ( ) direita
        

A variável var conterá o índice numérico do item selecionado, iniciando em 0.

echo newf_combo var \"título do campo\" \"Valor inicial\"

Configura uma linha simples + campo seletor. O usuário será capaz de selecionar um valor dentre uma lista de valores ou entrar com um outro manualmente. A variável var irá conter o valor textual seja ele digitado ou selecionado.

newf_combo é usado com o comando comboitem. Você configura antes o campo combo e então você passa um por um os valores possíveis utilizando comboitem. Observe que os valores são seguidos por um texto descritivo (opcional). Segue abaixo um código exemplo:

        echo newf_combo port \"Qual porta\" ttyS1
        echo comboitem ttyS0 \"COM1 no DOS\"
        echo comboitem ttyS1 \"COM2 no DOS\"
        echo comboitem ttyS2 \"COM3 no DOS\"
        

A variável $port conterá o valor ttyS0, ttyS1, ttyS2 ou qualquer coisa que o usuário digite. Veja newf_enum e newf_list para variações deste campo de entrada.

echo newf_dbl var \"título do campo\" \"valor numérico inicial\" numero-de-casas

Configura um campo de entrada numérico com notação decimal. Funciona como newf_num exceto por permitir um ponto decimal. O parâmetro número-de-casas controla o número de dígitos permitidos após o ponto decimal bem como a formatação do campo.

echo newf_enum var \"título do campo\" \"Valor numérico inicial\"

Configura um campo seletor. O usuário será capaz de selecionar um valor dentre uma lista de seleção. A variável var conterá o índice dos itens selecionados. O usuário é limitado a escolher um único item da lista.

newf_enum é usado com o comando enumitem. Você configura primeiro o campo enum e então passa um por um os valores possíveis utilizando enumitem. Segue abaixo um código exemplo:

        echo newf_enum no \"Qual porta\" 1
        echo enumitem ttyS0 \"COM1 no DOS\"
        echo enumitem ttyS1 \"COM2 no DOS\"
        echo enumitem ttyS2 \"COM3 no DOS\"
        

A variável $no conterá o valor 0, 1 ou 2. Veja newf_combo e newf_list para variações deste campo de entrada.

echo newf_gauge ID \"título do campo\" \"Valor decimal inicial\" \"Valor máximo\"

Configura um indicador visual de medida, geralmente usada para mostrar o progresso de execução de um processo (carregamento, instalação). O estado do indicador é alterado à cada chamada a este comando. A primeira chamada define o campo, as próximas atualizam o indicador. Este widget é geralmente utilizado com o comando "show" de forma que o script nunca pára no estado "edit". Eis aqui um pequeno exemplo:

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

echo newf_hexnum var \"título do campo\" \"Valor hexadecimal inicial\"

Configura um campo de entrada numérico (inteiro). Funciona como newf_num mas aceita dígitos numéricos e hexadecimais.

echo newf_list var \"título do campo\" \"Valor inicial\"

Configura um campo seletor. O usuário poderá selecionar um valor dentre uma lista. A variável var irá conter o valor textual selecionado.

newf_list é utilizado com o comando listitem. Você primeiro configura o campo de lista e então você passa um por um todos os valores possíveis usando listitem. Observe que os valores são seguidos por um texto descritivo (opcional). Segue um código exemplo:

        echo newf_list port \"Qual porta\" ttyS1
        echo listitem ttyS0 \"COM1 no DOS\"
        echo listitem ttyS1 \"COM2 no DOS\"
        echo listitem ttyS2 \"COM3 no DOS\"
        

A variável $port conterá o valor ttyS0, ttyS1 ou ttyS2. Veja newf_enum e newf_combo para variações neste campo de entrada.

echo newf_num var \"título do campo\" \"Valor numérico inicial\"

Configura um campo de entrada numérico (inteiro). Funciona como newf_str mas aceita apenas um dígito.

echo newf_pass var \"título do campo\" \"Valor inicial\"

Configura um campo de senha. Funciona como o campo newf_str exceto pela entrada não ser ecoada (digitação invisível).

echo newf_radio var \"título do campo\" valor-numérico valor-da-instância \"título do sufixo\"

Configura um campo de botão de rádio. Vários campos de botão de rádio devem ser definidos para cada seleção possível. Todos os botões de rádio que compartilham a mesma variável de entrada (var, acima) operam juntos: ligar um desliga o outro e vice-versa. A variável var conterá o valor numérico do campo de botão de rádio selecionado.

Botões de rádio selecionados podem ser colocados em qualquer lugar em um diálogo. Eles não precisam estar em seqüência nem mesmo na mesma página do diálogo.

echo newf_slider var \"título do campo\" \"Valor decimal inicial\" \"Valor mínimo\" \"Valor máximo\"

Isto funciona como newf_num, para editar um valor decimal. Mas é mostrado como um botão deslizante. Os valores mínimo e máximo representam as margens esquerda e direita do botão deslizante.

        qecho newf_slider var "Hora de Reunião" 15 9 16
        

echo newf_str var \"título do campo\" \"Valor inicial\"

Configura uma entrada de texto de uma linha.

echo newf_title "Título da Página" level "Título Esquerdo" "Título em modo texto"

Isto não é um campo de entrada, mas é uma forma de organizar um grande diálogo em uma seção. O resultado final é bem diferente em modo gráfico do que em em texto ou HTML. Em modo gráfico, isto criará um diálogo em um bloco de notas e cada newf_title define uma página do bloco de notas.

O primeiro argumento, o título da página, é usado apenas em modo gráfico.

O segundo argumento é um número e representa o nível do bloco de notas. Isto permite diálogos muito complexos com blocos de notas dentro de blocos de notas. Em modos texto e HTML mode, este argumento não tem efeito.

O terceiro argumento, título esquerdo, é utilizado apenas em modo texto e HTML. Ele coloca um pequeno título à esquerda dos campos de entrada.

O último argumento, Título em modo texto, aparece centrado entre dois campos de entrada.

3.8 Adicionando botões

Você pode adicionar botões opcionais usando simplesmente o comando button. Ele requer dois argumentos. O primeiro é a ID (identificação) do botão que será passada ao script utilizando a variável CODE. O segundo é o rótulo (título) do botão. Segue abaixo um exemplo:

        echo DIALOG
        echo newf_str name \"Nome de usuárioe\" $name
        echo button Add \"Adicionar novo usuário\"
        echo edit "title" \"Gerenciamento de usuários\"
        dispatch
        echo end
        if [ "$CODE" = "Add" ] ; then
                # Adicionando um novo usuário
        elif [ "$CODE" = "accept" ] ; then
                # Inspecionando um registro de usuário
        fi
        

3.9 Configura o campo atual de entrada

O código de operação "setcurfield" coloca o foco do teclado em um campo específico. Você deve passar a ID (identificação) do campo como um argumento simples. Eis um exemplo:

        qecho DIALOG
        qecho newf_str uid "ID de Usuário" 
        qecho newf_str name "Nome" 
        qecho newf_str phone "Nome"
        qecho setcurfield name
        qecho edit "exemplo" "O foco agora está no nome"
        dispatch
        echo end 
        


Next Previous Contents