3. Criando o script de checagem e envio
No Slackware para que um script seja executado por último lugar no boot, duas coisas são necessárias:
- Que ele seja chamado pelo /etc/rc.d/rc.local
- Que ele seja executável
Adicione as linhas abaixo em seu /etc/rc.d/rc.local como root:
if [ -x /etc/rc.d/rc.mailMyIp ]; then
. /etc/rc.d/rc.mailMyIp start
fi
E vamos criar o rc.mailMyIp. Há 3 técnicas que gostaria de mencionar:
- Na função MSG() envio os dados para um arquivo. Talvez você prefira comparar o IP atual com o que está no arquivo. No dia-a-dia achei mais fácil comparar sempre com o que está legível no e-mail, vai que você deleta a mensagem...
- Eu obtenho o IP externo na linha 45:
IP=`curl -s http://myip.com.br/index2.php | sed '/Seu IP/!d;s/.*IP://g;s/<.*//g;s/ //g'`
Basicamente uso o curl para acessar um site que informa meu IP e "parseio" o endereço da mesma forma que fizemos com o e-mail.
- A estratégia para enviar o e-mail é a seguinte:
(a) A placa de rede tem um endereço válido (em casa é 192.x.y.z, por isso a linha 52);
(b) Na linha 57 damos 3 tiros de ping para o google e contamos quantos chegam.
(b.1) Dê preferência a usar o IP, porque em caso de DNS inacessível, o tempo de espera cai bastante. Caso o DNS esteja DISPONÍVEL há um ganho de 17% (OK, 0.192s em média).
(b.2) Se nenhum ping chegar, não tem internet. Desencane do resto.
(c) Se o ping chegou, busque o IP externo.
(d) Pegue o IP lá do e-mail e compare os dois.
(e) Se forem iguais não há nada a fazer.
(f) Se forem diferentes envie o e-mail.
(g) A versão start é para ser usada no boot, a versão check pelo cron.
3.1. O script rc.mailMyIp
Preciso deixar colorido, o que é para mudar?
Comece pelo ADDRS.
Cheque a linha 24.
Onde você pôs seu naviip (linhas 80, 106)?
O que posso fazer para melhorar isso?
Uma cópia deste script está aqui:
http://pastebin.com/3m5zHPax
Se você prefere ele cru:
http://pastebin.com/raw.php?i=3m5zHPax
# cd /etc/rc.d; touch rc.mailMyIp; chmod 700 rc.mailMyIp;
# vim rc.mailMyIP
#!/bin/bash
###############
# DEFINITIONS #
###############
FILE=/tmp/.mailMyIP
DATE=`date +"%F %H:%M:%S"`
ADDRS="zeh@gmail.com"
MSMTP=`which msmtp`
PING=`which ping`
SED=`which sed`
PRINTF=`which printf`
IFCONFIG=`which ifconfig`
####################
# FUNCTIONS: BEGIN #
####################
MSG() {
BODY="Subject: NAVI has booted, check your IP
Date: $DATE
NAVI was booted at $DATE
NAVI IP=$IP
"
echo "$BODY" > $FILE
echo "$BODY" | $MSMTP -C /root/.msmtprc $ADDRS
}
mailMyIp() {
if [ -f $FILE ]; then
OLDIP=`cat $FILE | sed '/IP=/!d;s/.*=//g'`
[ "$IP" != "$OLDIP" ] && MSG
else
MSG
fi
}
OK() {
echo -e "\033[60G[ e[32;1mOKe[0m ]"
}
FAIL() {
echo -e "\033[60G[ e[31;1mFAILe[0m ]"
}
GET_IP() {
IP=`curl -s http://myip.com.br/index2.php | sed '/Seu IP/!d;s/.*IP://g;s/<.*//g;s/ //g'`
echo -n $IP
}
TEST_INET() {
ETH0=`$IFCONFIG eth0 | sed '/inet /!d;s/.*r://g;s/..*$//g'`
if [ $ETH0 -ne 192 ]; then
echo "Network not available"
exit -1
else
printf "%b" "Testing your Internet Connection:"
PING_COUNT=`$PING -l3 -w1 173.194.34.104 2> /dev/null | $SED '/rec/!d;s/.*ted, //g;s/ .*//g'`
fi
}
##################
# FUNCTIONS: END #
##################
case "$1" in
'start')
TEST_INET
if [ $PING_COUNT -eq 0 ]; then
FAIL
else
OK
echo -n " Retrieving external IP: "
GET_IP
if [ -n "$IP" ]; then
OK
echo -en " Retrieving IP from gmail: "
NAVI_IP=`$HOME/bin/naviip`
if [ -n "$NAVI_IP" ]; then
echo -n "$NAVI_IP"
OK
else
FAIL
fi
if [ "$IP" != "$NAVI_IP" ]; then
echo -en " Mailing the new IP to $ADDRS"
MSG
OK
else
echo " Nothing to do."
fi
else
FAIL
fi
fi
;;
'check')
TEST_INET > /dev/null
if [ $PING_COUNT -ne 0 ]; then
GET_IP >> /dev/null
if [ -n "$IP" ]; then
NAVI_IP=`/usr/local/bin/naviip`
[ "$IP" != "$NAVI_IP" ] && MSG
fi
fi
;;
*)
echo "usage $0 {start|check}"
esac