Este script tem a ideia de detectar que o nobreak está operando na bateria, e em alguns minutos se não retomar a energia principal, desliga o servidor de forma segura.
Antes de qualquer coisa vamos entender a minha ideia.
Através de um nobreak simples sem monitoramento via porta USB ou serial, não é possível o Linux saber se o nobreak está operando na bateria na rede, mas com esta ideia vem a possibilidade. Para isso vamos precisar de um IP onde poderemos monitorar quando a energia cair.
O meu projeto feito em um cliente fica da seguinte maneira, peguei um roteador wifi e liguei ele numa tomada fora do nobreak, assim quando a energia cair este roteador irá desligar, enquanto o servidor continua ligado na bateria do nobreak. Assim o script não consegue mais pingar no IP do roteador e entra em funcionamento.
Script:
#!/bin/bash
DATA=`date +%d/%m/%Y`
HORA=`date +%H:%M:%S`
EMPRESA=NOME DA EMPRESA
LOG=/var/log/energia.log
rm /var/log/caiuenergia.log
if [ -s /var/log/energiadesligada.log ];
then
echo "SERVIDORES RELIGADOS APOS RETORNO DA ENERGIA, PREPARANDO PARA ENVIO DE RELATÓRIO!"
echo "ENVIANDO RELATÓRIO"
echo "$DATA $HORA - ENVIANDO RELATÓRIO PARA O EMAIL DO ADMINISTRADOR DA REDE!" >> /var/log/energia.log
echo "-------------------------------------------------------------------------------------------------" >> $LOG
echo " $DATA $HORA - OS SERVIDORES FORAM RELIGADOS!" >> $LOG
echo "-------------------------------------------------------------------------------------------------" >> $LOG
mailx -r seu@email.com.br -s "$DATA $HORA - SERVIDORES RELIGADOS $EMPRESA" coloqueoemailaserenviado < $LOG
rm /var/log/energiadesligada.log
sleep 10
fi # Aqui vai o ip do roteador que esta fora do nobreak # nesta etapa aqui verifica se existe ping do roteador, caso não tenha sinal de ping ele enviar o primeiro aviso por email
ping -c 10 192.168.3.251 | grep -in ", 0 received" > /var/log/ping.txt
if [ -s /var/log/ping.txt ];
then
echo "A ENERGIA CAIU!"
echo "-----------------------------------------------------------------------------------------------" >> $LOG
echo "$DATA $HORA - O SERVIDOR ANALISOU E DETECTOU QUEDA DE ENERGIA $EMPRESA" >> $LOG
echo "-----------------------------------------------------------------------------------------------" >> $LOG
touch /var/log/caiuenergia.log
echo 'caiu' > /var/log/caiuenergia.log
echo "ENVIANDO RELATÓRIO"
echo "$DATA $HORA - ENVIANDO RELATÓRIO PARA O EMAIL DO ADMINISTRADOR DA REDE!" >> /var/log/energia.log
echo "-------------------------------------------------------------------------------------------------" >> $LOG
echo " $DATA $HORA - A ENERGIA CAIU! OS SERVIDORES NAO FORAM DESLIGADOS AINDA!" >> $LOG
echo "-------------------------------------------------------------------------------------------------" >> $LOG
mailx -r seu@email.com.br -s "$DATA $HORA - QUEDA DE ENERGIA $EMPRESA" emailaserenviado < $LOG #aqui neste ponto ele aguarda cerca de 5 min, ai começa novamente a verifica se a energia ainda esta fora tentando pigar no ip.
sleep 300
fi
if [ -s /var/log/caiuenergia.log ];
then
echo "VERIFICANDO SE VOLTOU A ENERGIA PARA ENVIO DE RELATÓRIO!"
ping -c 10 192.168.3.251 | grep -in ", 10 received" > /var/log/ping2.txt
if [ -s /var/log/ping2.txt ];
then
echo "ENVIANDO RELATÓRIO"
echo "$DATA $HORA - ENVIANDO RELATÓRIO PARA O EMAIL DO ADMINISTRADOR DA REDE!" >> /var/log/energia.log
echo "-------------------------------------------------------------------------------------------------" >> $LOG
echo " $DATA $HORA - A ENERGIA VOLTOU! OS SERVIDORES NÃO FORAM DESLIGADOS!" >> $LOG
echo "-------------------------------------------------------------------------------------------------" >> $LOG
mailx -r seu@email.com.br -s "$DATA $HORA - QUEDA DE ENERGIA $EMPRESA" emailsserenviado < $LOG
sleep 10
rm /var/log/caiuenergia.log # neste ponto aqui se houve ping no ip significa que voltou a energia finalizando o script, caso não haja ping o script continua.
fi
if [ -s /var/log/caiuenergia.log ];
then
echo "A ENERGIA NÃO VOLTOU! PREPARANDO PARA ENVIO DE RELATÓRIO!" #ping -c 10 192.168.3.251 | grep -in ", 10 received" > /var/log/ping3.txt #if [ -s /var/log/ping3.txt ]; # then
echo "ENVIANDO RELATÓRIO"
echo "$DATA $HORA - ENVIANDO RELATÓRIO PARA O EMAIL DO ADMINISTRADOR DA REDE!" >> /var/log/energia.log
echo "-------------------------------------------------------------------------------------------------" >> $LOG
echo " $DATA $HORA - A ENERGIA NÃO VOLTOU! OS SERVIDORES SERÃO DESLIGADOS EM BREVE!" >> $LOG
echo "-------------------------------------------------------------------------------------------------" >> $LOG
mailx -r seu@email.com.br -s "$DATA $HORA - QUEDA DE ENERGIA $EMPRESA" emailaserenviado < $LOG
touch /var/log/energiadesligada.log
echo 'religado' > /var/log/energiadesligada.log
sleep 120 # aqui neste ponto ele desliga meus servidores virtuais windows
net rpc shutdown -f -I 192.168.3.101 -U user%password
net rpc shutdown -f -I 192.168.3.100 -U user%password
rm /var/log/caiuenergia.log
sleep 60 # Aqui neste ponto desliga meu outro servidor linux (vou deixa abaixo este script)
desligaremoto.sh # Aqui ele desliga este servidor.
shutdown -h 10
fi
fi
No início do script tem uma rotina que envia um email informando o administrador que os servidores foram religados apos a volta da energia.
Desligar Remotamente
Neste script você desliga um servidor Linux a partir de outro:
#! /bin/bash #ip e senha do servidor a ser desligado
host="192.168.3.253"
senha="senha"
Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden
[13] Comentário enviado por lksmodos em 16/03/2016 - 20:26h
Achei muio leal seu artigo, infelizmente ainda não tenho um servidor que tenha essa necessidade para aplicar o que vi aqui, mas vou deixar esse script bem guardado aqui, a gente nunca sabe quando vai precisar.
[14] Comentário enviado por claushenrique em 17/03/2016 - 16:17h
Cara, gostei muito da solução. Testei aqui em um ambiente de teste e rodou sem erro porém, não recebi as notificações por e-mail.
Preciso ter configurado um MTA na máquina? Estou rodando ele no Debian. Abraço.
[15] Comentário enviado por ntserv em 17/03/2016 - 16:54h
Oi amigo então neste artigo não abordei a configuração do servidor para envio de email, mais tarde quando tive em casa eu posto aqui como fiz para o envio funcionar
[17] Comentário enviado por calebe1990 em 20/03/2016 - 18:25h
Legal, mas caso queira investir, ficaria mais interessante se ao invés de pingar um roteador, pingar um Arduino conectado em sua rede, aí quando a energia voltasse, esse arduino em conjunto com um sensor de medir a tensão, faria a medição da tensão, e se tudo estiversse certo, ele acionar os servidores novamente através de um wake on lan.
[19] Comentário enviado por Buckminster em 23/03/2016 - 00:47h
[8] Comentário enviado por ntserv em 10/03/2016 - 15:16h
Boa Tarde amigo, vc podia me dizer qual seria o mau funcionamento, eu utilizo isso em 4 clientes a 1 ano e não percebi problemas.
Acredito que ele quis dizer que se o roteador falhar (pifar, deixar de responder ao ping, etc) mesmo sem ter faltado a energia, teu script entrará em ação.
É claro que tendo aparelhos de boa qualidade isso acontecerá somente em casos extremos... ou por azar.
Mas a tua lógica é muito bem pensada, parabéns.