quarta-feira, 10 de fevereiro de 2010

Configurando Bash Completion no Debian



O bash completion é uma poderosa ferramenta para administradores Linux que utilizam o shell para realizar suas tarefas, permitindo com que comandos, caminhos de arquivos e mesmo parâmetros específicos sejam autocompletados. Em geral essa feature é habilitada por padrão no Linux, porém em algumas distribuições, tal como no Debian, é preciso configurá-la manualmente. Este é justamente o tema do artigo em questão.

Antes de qualquer coisa, certifique-se de que o pacote bash-completion esteja instalado, executando a instrução a seguir:


# apt-get install bash-completion

Em seguida, é preciso indicar a utilização do bash-completion no perfil do bash. Isso pode ser feito individualmente para cada usuário, através do arquivo ~/.bash_profile, ou para todo o sistema. Para essa segunda opção, modifique o arquivo /etc/bash.bashrc, usando um editor qualquer:


# vi /etc/bash.bashrc

Verifique se as seguintes linhas estão incluídas no arquivo de configurações. Inicialmente elas já existem, porém estão comentadas (i.e. iniciadas com o caracter "#"):


# enable bash completion in interactive shells
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi

A última etapa consiste em testar se o mecanismo de autocomplemento está funcionando. Para isso, é preciso sair da sessão (i.e. fazer um log out do terminal) e iniciar um novo login. Feito isso, tente digitar a inicial de algum comando (ex: service) e em seguida pressionar a tecla TAB uma vez:


# serv<TAB>

Agora que o comando "service" foi autocompletado, pressione a tecla TAB mais duas vezes para que a respectiva lista de seus possíveis parâmetros seja exibida na tela:


# service <TAB>
hwclock networking skeleton udevtrigger
apache2 hwclock-save ondemand umountfs
bootlogd keyboard-setup postfix rsyslog
console-setup procps udev umountroot
dmesg rc sendsigs urandom
halt nagios3 rc.local single

Caso o comando possua múltiplos argumentos, como é o caso do "service", podemos utilizar o TAB mais uma vez, o que fará com que apenas instruções que façam sentido sejam listadas:


# service nagios3 <TAB>
force-reload reload restart start status stop

Agora é só digitar a inicial do argumento, pressionar TAB mais uma vez e executar de vez a instrução completa:


# service nagios3 status
* checking /usr/sbin/nagios3... [OK]

Pronto! Bem fácil, né?


sexta-feira, 5 de fevereiro de 2010

Reading stdin on scripts for handling SNMP traps



In a shell, sometimes data are read through standard input (i.e STDIN) rather than arguments, which are most commonly used. For that reading purpose there is an instruction named "read", whose syntax is exemplified below:


$ read var
123

$ echo "var: $var"
var: 123

Today I was wondering how could I retrieve all values passed to a given Shell script considering that one does not know how many items are available. There are a lot of script samples of reading regular files, line by line, using "while" loop along with "read" command. But what if one needs to read the standard input?

Fortunately, there is a special device on Linux called /dev/stdin, which promised to give the expected outcome. And here's a testing script based on that assertion:


#!/bin/bash
while read s
do
echo "s = $s"
done < /dev/stdin

And it works perfectly! Well, but.. is there any real application for such trick?

Yes, indeed! My real motivation was to debug and understand why the integration between Net-SNMP (i.e. snmptrapd service) and ZABBIX was not working when SNMP traps were received by the server. Those traps were supposed to be forwarded by snmptrapd to a Shell script called snmptrap.sh, which invoked zabbix_sender along with the received arguments.

Thus, in order to fine-grained debbuging, I created another script, named snmptrapdebug.sh with the contents below:


#!/bin/bash

echo "Request received: $0"
echo "--------------------------------------------------"

while read param
do
echo -e "$param "
done < /dev/stdin

echo "--------------------------------------------------"
echo

exit 0


On the configuration file snmptrapd.conf the following line was appended:


traphandle default /bin/bash /home/zabbix/snmptrapdebug.sh

In order to send a simple SNMP trap the following command was issued:


$ snmptrap -v 1 -c public localhost .1.3.6.1.4.1.24.0 localhost 6 12345678 8 .1.3.6.1.4.1.24.12.10.22.64 s "2010-02-04 17:03:18,352,DEBUG,main,SimpleTest,This is a Debug Message"

So, here are the LOG results after receiving a SNMP trap by the server:


2010-02-05 11:48:32 localhost [127.0.0.1] (via UDP: [127.0.0.1]:40338) TRAP, SNMP v1, community public
SNMPv2-SMI::enterprises.24.0 Enterprise Specific Trap (12345678) Uptime: 0:00:00.08
SNMPv2-SMI::enterprises.24.12.10.22.64 = STRING: "2010-02-04 17:03:18,352,DEBUG,main,SimpleTest,This is a Debug Message"
Request received: /home/zabbix/snmptrapdebug.sh
--------------------------------------------------
localhost
UDP: [127.0.0.1]:40338
DISMAN-EVENT-MIB::sysUpTimeInstance 0:0:00:00.08
SNMPv2-MIB::snmpTrapOID.0 SNMPv2-SMI::enterprises.24.0.0.12345678
SNMPv2-SMI::enterprises.24.12.10.22.64 "2010-02-04 17:03:18,352,DEBUG,main,SimpleTest,This is a Debug Message"
SNMP-COMMUNITY-MIB::snmpTrapAddress.0 127.0.0.1
SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 "public"
SNMPv2-MIB::snmpTrapEnterprise.0 SNMPv2-SMI::enterprises.24.0
--------------------------------------------------

That's it! I hope that tip is worthful for someone else. :)

References:

segunda-feira, 1 de fevereiro de 2010

Pastis: orgulho do sul da França



Para abrir o apetite ou simplesmente para degustar, nada como um bom pastis, uma das bebidas mais apreciadas na França, especialmente no sul do país. Trata-se de um licor a base de anis, de coloração clara e que se torna cáqui com a adição de água.

O pastis foi criado na cidade de Marselha como um substituto para o absinto, o qual havia sido banido pelo governo francês em 1915. O absinto era uma bebida popular na época, e a sua proibição levou as pessoas a experimentarem diferentes combinações de ervas e álcool em um esforço para produzir uma bebida que não levava o seu ingrediente banido, o funcho (anis-doce). Mais anis e açúcar foram adicionados a uma menor concentração de álcool e assim surgiu o pastis. Um desse destiladores de fundo de quintal foi Paul Ricard. Ele levava suas misturas a bares ao redor da cidade pedindo para as pessoas a experimentarem a fim de que a sua respectiva fórmula pudesse ser aperfeiçoada. Ele iniciou a produção comercial do Ricard em 1932, conhecido sobretudo pelo slogan "Le Vrai Pastis de Marseille" (o Verdadeiro Pastis de Marselha).

Em geral devemos colocar cinco partes de água para cada parte de pastis, não esquecendo do gelo. Devo lembrar que uma bebida semelhante ao pastis supostamente embriagou van Gogh quando ele cortou a orelha...

O pastis permanece como um dos mais populares aperitivos na França, além de acompanhar muito bem pratos como peixes, frutos do mar, porco e frango.

Pastis 51 (número ironicamente igual à nossa "caninha" de Pirassununga) é a marca líder na França, porém Ricard e Pernod são provavelmente as marcas mais conhecidas fora do país. Ao pedir um pastis em um bar ou restaurante, simplesmente diga "Du Ricard, s.v.p !". Ou faça como Serge Gainsbourg e peça um "102" (i.e. um 51 duplo).. :D

Referências:
http://fr.wikipedia.org/wiki/Pastis