Raspberry

Uma introdução ao Dialog com Raspberry

Para usar bem os recursos do Raspberry, dominar Linux é indispensável. Mas se o caso for entregar uma interface para o usuário interagir, a solução mais rápida é, sem dúvidas, utilizar Dialog com Raspberry. O resultado será essa interface da imagem de destaque.

Shell script

O Linux é poderosíssimo. Já mostrei até como fazer comunicação socket por shell script, nesse outro artigo. O UNIX tem outro tipo de comunicação socket para IPC (inter-process communication), que é o UNIX sockets, sem a necessidade da pilha TCP/IP, descrito nesse outro artigo.

Utilizando shell script podemos fazer praticamente qualquer tarefa no sistema. Antigamente o Linux era praticamente um monte de shell script inicializando os processos de sistema. Hoje temos uma parte desses processos sendo executados de outra forma, mas sem dúvidas o shell estará lá, sempre. Até a Microsoft incluiu o bash no Windows 10.

O que é o Dialog

O Dialog é uma ferramenta utilizada para criar menus para scripts shell. Desse modo, uma interface amigável é disponibilizada para o usuário e evitamos que nossos clientes precisem digitar algum tipo de comando.

O Dialog oferece caixas de diálogos de diversos tipos; desde caixa de mensagem à calendário. Sua utilização é simples, não havendo impacto na implementação. Mas o Dialog não vem instalado por padrão, por essa razão deveremos instalá-lo previamente.

Instalação do Dialog

Para utilizar o código disposto aqui do Dialog com Raspberry, algumas ferramentas extras deverão ser instaladas. Instale tudo agora para evitar trabalho posteriormente:

O pacote dnsutils será utilizado para pegar o IP público sem que seja necessário recorrer a algum site como whatsmyip.com.

Exemplo básico com Dialog com Raspberry

Primeiramente, faça o teste. Use o comando abaixo para criar um diálogo de sim/não.

Esse comando abrirá uma caixa como essa:

Dialog com Raspberry - pegando IP

O Dialog devolverá um código de retorno, como qualquer programa. Para pegar o código de retorno basta analisar a variável do shell que guarda o último status:

Para yes o retorno é 0. Para no o retorno é 1. Mas não podemos apenas utilizar o dialog sem que haja uma rotina a ser executada em cada status. Bem, até podemos, mas não seria um programa ainda:

O código de saída 0 é saída considerada normal. Utilizando dois pipes (‘||’), dizemos que “a saída deve ser normal, ou então toma-se uma ação”. Sendo yes0, se escolhermos sim para catchup, nada acontece. De outro modo, um diálogo infobox devolverá a mensagem “Ok. Sem catchup.”:

Dialog com Raspberry - pegando IP
Dialog com Raspberry – catchup

Shell script básico

Recomendo fortemente o livro de Julio Cezar Neves para quem quer aprender shell script. Além de ser uma leitura muito divertida, o conteúdo é impecável. O primeiro livro dele eu comprei lá pro começo dos anos 2000.

O que vou colocar aqui é uma introdução parca conceitual, apenas para despertar o entendimento inicial de um script. Não tenho a menor intenção de escrever esse artigo para tornar alguém programador shell, até porque o assunto é tão extenso que somente um livro como o recomendado acima poderia ajudar.

O mínimo que precisamos escrever em um arquivo de texto plano é o header, depois dar permissão de execução para esse arquivo. Comumente chamamos um script shell de algumacoisa.sh. O .sh é apenas um identificador para o usuário, em Linux não precisamos de extensão para identificar tipos de arquivos.

Vamos apenas fazer o “Hello World”:

Para transformá-lo em executável, devemos mudar ao menos o primeiro octeto das permissões do arquivo.

E para executá-lo, podemos passar o caminho absoluto ou simplesmente:

Mas o que são esses “octetos”?

Permissão de arquivos Linux

O básico das permissões de arquivos em Linux são as permissões para ler, escrever e executar. Um octeto corresponde a 3 bits, indo de 0 à 7:

111

Sendo da esquerda para a direita:

4, 2, 1

Agora, da esquerda para a direita temos:

r – para leitura.

w – para escrita.

x – para execução.

Podemos simplesmente exeuctar:

Mas aí você estaria preso ao conhecimento superficial das permissões.

As permissões padrão do Linux tem 3 octetos; o primeiro é o proprietário do arquivo. O segundo é o grupo e o terceiro é outros. Vamos deixar que o grupo possa ler e modificar o nosso script e que os outros apenas possam ler o conteúdo. Para tal:

Para ver como estão as opções, basta utilizar o comando ls -l teste.sh:

Dialog com Raspberry - pegando IP
Dialog com Raspberry – chmod

Nessa última imagem temos as permissões, número de links, o proprietário, o grupo, o tamanho, mês, dia, hora e nome do arquivo. Nos atenhamos às permissões.

O primeiro campinho (“-“) muda quando se trata de diretório, link simbólico, dispositivo de bloco etc. Seguidamente, as permissões de proprietário, grupo e outros. O dono tem rwx, o grupo tem rw e outros não tem nada (). O proprietário é djames. Nesse caso específico, o grupo também se chama djames. Mas são coisas distintas. Os outros pode ser qualquer usuário cadastrado em /etc/passwd.

Com isso você já sabe criar o script shell, já sabe controlar as prmissões e já sabe executar. Agora vamos adicionar diálogo ao script para, por exemplo, pegar o IP da interface wireless, a wlan0. Mas para isso, vamos ver antes dois outros comandos.

egrep e awk

O comando egrep é um grep avançado, para utilizar com expressões regulares. Não vou escrever sobre expressões regulares, esse também é um assunto muito extenso e que varia até de um shell para outro, ainda mais em linguagens de programação como C++, Qt, Python etc.

O awk é um comando poderoso, que serve para uma enormidade de coisas, mas basicamente estou o utilizando aqui para capturar um determinado campo separado por espaços ou tabs.

O que vamos fazer aqui é listar a interface, pegar a linha que nos interessa, remover a linha que não nos interessa e exibir apenas o campo contendo o endereço IP. Veja na imagem a seguir essa série de passos:

Dialog com Raspberry - pegando IP
Dialog com Raspberry – pegando IP

Agora que já sabemos como pegar o IP, vamos guardá-lo em uma variável. Para isso, devemos utilizar a crase para proteger o comando. As crases indicarão que a variável conterá apenas o resultado da expressão utilizada acima:

Não devemos utilizar espaços precedentes ou procedentes ao sinal de igualdade. Obrigatoriamente deve-se “colar” a variável e o comando ao sinal de igualdade. Está claro? Ok, agora vamos compor um comando para pegar o IP público.

dig

Lembra que lá em cima instalamos o pacote dnsutils? Uma das ferramentas oferecidas nesse pacote é o comando dig. Aqui o utilizaremos para pegar o IP público que utilizamos para acessar a Internet através do Raspberry:

Mais uma vez, devemos guardar a saída em uma variável. Já temos os comandos para descobrir nossos IPs, sem precisar pedir ao usuário que faça o diagnóstico: “Seu Raspberry pegou IP na sua rede? Qual é seu IP público para que eu possa fazer acesso remoto?”.

Função em shell script

Para criar uma função em shell script, simplesmente a declaramos dessa maneira:

Para chamá-la, basta colocar seu nome, como exemplificado acima. Vamos fazer um menu com duas funções; mostrar o IP local e o IP público:

Acima, utilizei o comando wc, que serve para contar linhas ou caracteres. Estou considerando um número mínimo para indicar se há ou não um endereço IP. Claro que dá para melhorar a avaliação, mas isso é um exemplo básico, lembre-se.

As funções estão prontas. Agora vamos criar o menu e avaliar a escolha do usuário.

Menu em Dialog com Raspberry

Seguidamente às funções, criaremos o menu, que se executará em um loop infinito. Cada item é composto pelo par chave/info:

O loop em shell script é um pouquinho diferente do habitual em linguagens de programação, provavelmente causará estranheza. Mas basicamente é um conjunto while <condição>; do <faz algo>; done. Já para o case o formato é case <condição> in <opção>/ação; esac.

Colocando tudo junto temos:

O resultado é similiar à imagem de destaque (com bem menos recursos, claro). Pegue o código, brinque e estude um pouco de shell script e dialog. Em 2005 fiz um sistema operacional de clonagem chamado PhantomSystem, para substituir o então tradicional Ghost. O sistema fez um sucesso incrível, atendia melhor que o Ghost, quebrava senha de BIOS, de Windows, de Linux, clonava local, em sistema de arquivos em rede, fazia boot do pendrive, CD, pela rede e mais um monte de recursos que já não lembro mais. Suas versões iniciais eram totalmente em Dialog e o sistema operacional inteiro tinha apenas 7MB! Não subestime shell script, com certeza lhe fará economizar muitas horas de desenvolvimento para resolver tarefas complexas!