Desligar servidores quando o nobreak entra na bateria e envio de aviso por e-mail

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.

[ Hits: 15.315 ]

Por: Ricardo Rodrigues em 09/03/2016


Estrutura física



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"

sshpass -p $senha ssh root@$host 'shutdown -r now; exit'

   

Páginas do artigo
   1. Estrutura física
Outros artigos deste autor

Aviso de queda de Internet via Sendxmpp

Leitura recomendada

Receba seu IP externo via e-mail ou ensine o bash a ler e enviar e-mails

Apresentando o Yad - "zenity melhorado"

Assinatura de documentos PDF em lote via Bash

Simples sistema de backup com acesso remoto

cal2svg - brincando com shell script e arquivos vetoriais SVG

  
Comentários
[1] Comentário enviado por fabio em 09/03/2016 - 10:20h

Grande sacada! :)

[2] Comentário enviado por overdie em 09/03/2016 - 12:26h

Cara parabéns a simplicidade da solução é algo de alguém com uma inteligência grandiosa. Obrigado por compartilhar esta "Grande sacada".

[3] Comentário enviado por mebelin em 09/03/2016 - 13:01h

Muito bem pensado, meus parabéns!

[4] Comentário enviado por reng.unip em 09/03/2016 - 17:37h

Boa tarde ntserv, ótima dica, muito útil, sugiro apenas uma correção no script de desligar, ao invés do parâmetro -r, use -h de halt.

Obrigado

[5] Comentário enviado por ntserv em 09/03/2016 - 21:20h

Boa observação, era para ser -h mesmo, valeu reng.unip

[6] Comentário enviado por removido em 10/03/2016 - 08:42h

Genial. Sem mais.

[]'s

----------------------------------------------------------------------------------------------------------------
http://24.media.tumblr.com/tumblr_m62bwpSi291qdlh1io1_250.gif

# apt-get purge systemd (não é prá digitar isso!)

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

[7] Comentário enviado por 648trindade em 10/03/2016 - 14:52h

Uma boa ideia amigo, mas seu servidor está sujeito à um mau funcionamento do roteador

[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.

[9] Comentário enviado por thalesX em 10/03/2016 - 15:33h

Boa tarde, Devo criar uma rotina no crontab ou no boot do servidor?

[10] Comentário enviado por ntserv em 10/03/2016 - 15:36h

Boa tarde, eu esqueci de comentar sobre isso, eu coloco no crontab
0-59/15 * * * * root /usr/bin/energia.sh

[11] Comentário enviado por thalesX em 10/03/2016 - 17:13h


[10] Comentário enviado por ntserv em 10/03/2016 - 15:36h

Boa tarde, eu esqueci de comentar sobre isso, eu coloco no crontab
0-59/15 * * * * root /usr/bin/energia.sh


Vlw.. Muito obrigado.

[12] Comentário enviado por removido em 11/03/2016 - 12:34h

Muito interessante parabéns.

[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

[16] Comentário enviado por lucasvasconcelos em 18/03/2016 - 09:58h

muito bem pensado, e como dizia Platão:
" A necessidade é a mãe da invenção"
:D

[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.

[18] Comentário enviado por ntserv em 21/03/2016 - 09:21h

Otima sacada amigo ainda bem que seu trabalhar com arduino vou fazer em cliente com arduino, pos a ideia de religa-lo e bem interessante

[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.

[20] Comentário enviado por nariz em 25/04/2016 - 13:16h

Muito bom


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts