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.
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:
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.
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
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'
#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'