Diversas vezes preciso gerar gráficos em meu trabalho diário. Uma excelente ferramenta, que nem sempre recebe os devidos créditos, é gnuplot . Entre as facilidades do gnuplot estão a forma de enviar comandos, que pode ser via batch, o que cria a possibilidade de utilização em scripts, e a leituras de dados em arquivo texto.
Num mundo cada vez mais sedento por dados e uso massivo de bancos de dados, pode parecer ridículo o uso de aquivos textos para guardá-los. Infelizmente vários scripts que desenvolvi e uso, alguns somente para ler a porcentagem de uso de CPU, salvam em formato texto. Parte poderia ser atribuída a minha mediocridade em programação, mas nem sempre tenho disponível os pacotes de integração para comunicação com BD nas plataformas que monitoro. ??s vezes nem BD pode ser instalado para isso. Nesses casos o arquivo texto serve muitíssimo bem.
Para quem já utilizou a solução de SSLVPN da Juniper, sabe que é preciso mapear as portas para seu uso (no meu FreeBSD não funciona o modo de tunelamento).
Como vários serviços são acessiveis via portas baixas, incluindo ssh, ftp, telnet, etc, existe a possibilidade de mapear as portas acima de 1024 nas portas baixas através de vários ips de loopback.
O script abaixo gera o arquivo rinetd.conf para as várias interfaces :-)
#! /bin/sh
CONF="/usr/local/etc/rinetd.conf"
PORTS="110:11000 25:2500 443:44300 80:8000 22:2200 23:2300 21:2100 20:2000"
### Commands here ###
TMSTAMP=`date "+%Y%m%d"`
if [ -f $CONF ]; then
mv $CONF $CONF-$TMSTAMP
fi
IPS=`ifconfig lo0 | grep netmask | awk '{print $2}'`
for ip in $IPS
do echo "Configuring: $ip"
for port in $PORTS
do
LOW_PORT=`echo $port | awk -F":" '{print $1}'`
HIGH_PORT=`echo $port | awk -F":" '{print $2}'`
echo -e "$ip $LOW_PORT \t $ip $HIGH_PORT" >> $CONF
done
done
Nada como os desafios para nos fazer acordar. Meu desafio foi criar um sistema de monitoração de performance para sistemas pré-pago. Com RRDTool na mão e perl na cabeça, lá fui eu. Não que eu seja exímio programador em Perl (ou qualquer outra linguagem), mas os sistemas de telefonia, principalmente na parte de pré-pago, usam sistemas Solaris 9.0, onde perl já vem instalado.
O resultado, já nesses gráficos, ficou além do esperado e pronto em 5 dias!!! Haja código... já sobre a documentação... essa virou parte das lendas como boi-tatá, saci pererê...
O primeiro gráfico mostra as verificações de crédito para liberar a chamada (First Interrogation), assim como os débitos (Final Report). O segundo, chamadas originadas (celular ligando para alguém) dentro da própria rede da operadora.
Dica retirada de http://www.network-theory.co.uk/docs/cvsmanual/cvs_53.html.
Em alguns trabalhos cooperativos, sempre que baixo uma versão específica do cvs, utilizando algo como "cvs checkout -r1.1 programa", acabou com um erro de "sticky tag" ao fazer o novo commit.
Pelo link acima vi que basta usar um "cvs update -A" para resolver isso.
De tempos em tempos é necessário fazer uma *faxina* na lista de discussão que administro, a [linux-br]. Alguns usuários saem da lista, outros ativam os famosos *anti-spam*, e coisas do gênero começam a atolar a lista em mensagens incômodas. Isso pode ser resolvido com uma pequena remoção desses usuários (assim que comunicados). Infelizmente alguns desses usuários optam por fazer a inscrição na lista com um mail qualquer, em geral gratuito como gmail, e fazem o redirecionamento do mesmo para seu mail de recebimento. O que ocorre é que as mensagens retornam com um mail não inscrito na lista. Para encontrar o dono da mensagem, criei alguns script, dois na realidade.
Uma vez que não sou administrador do servidor de listas, não consigo simplesmente conectar e buscar a base de assinantes. Preciso solicitar a quem tem acesso shell para fazer isso. Como a CIPSGA é mantida por trabalho voluntário, nem sempre isso é rápido. Então criei um script para buscar os assinantes da lista, via web, e salvar em um arquivo:
#! /bin/sh
pass_adm="senha_admin"
lynx_opts="-accept_all_cookies -cookie_file=cookie -post_data"
member_link="http://listas.cipsga.org.br/cgi-bin/mailman/admin/linux-br/members"
file_dst="/tmp/listagem"
for char in a b c d e f g h i j k l m n o p q r s t u v x y w z
do for id in 0 1 2
do echo "Char=$char and ID=$id"
echo "adminpw=$pass_adm" | \
lynx $lynx_opts "${member_link}?letter=$char&chunk=$id" | \
grep @ | grep "^.*\[" | sed 's/.*\]//' | \
grep -v "de .* para " >> $file_dst.$$
done
done
cat $file_dst.$$ | sort -u > $file_dst
Com isso cria-se a listagem de usuários.
Uma vez com a lista em mãos, falta enviar uma mensagem para cada assinante para verificar se o mesmo está ativo ou não. ?? interessante indexar o envio para saber quem é quem. O seguinte script faz o serviço:
#! /usr/bin/env python
server="mail.dominio.com.br"
port=25
mailfrom="Helio Loureiro"
rcptto="" subject="Checagem da linux-br"
import sys, smtplib
try:
file = open(sys.argv[1])
erro_f = open("/tmp/mail_err.lst","w")
except:
print "Use: %s [mails_list_file]" % sys.argv[0] sys.exit(0)
id=1
for line in file:
rcptto = line[:-1]
print "Sending for: " + rcptto + " [" + str(id) + "]"
msg = "From: " + mailfrom + "\r\n"
msg += "To: " + rcptto + "\r\n"
msg += "Subject: " + subject + "[" + str(id) + "]\r\n"
msg += """
Essa eh uma mensagem de verificacao de inscricao da linux-br.
Favor nao responder.
./helio (BOFH)
-= Developed in Python =-
"""
try:
mail = smtplib.SMTP(server,port)
mail.sendmail(mailfrom, rcptto, msg)
mail.quit()
except:
print "Error sending: " + rcptto
error_f.write(line)
error_f.flush()
id += 1
sys.exit(0)
Com isso tem-se uma forma de saber quem é quem na lista e remover os indesejados.