Ajuda com script monitor de rede.

1. Ajuda com script monitor de rede.

claiton a.da silva
cacaloco2

(usa Ubuntu)

Enviado em 06/06/2018 - 11:33h

Bom dia amigos.
Sou novo no grupo e esta é a primeira vez que posto alguma coisa. Depois de passar 19 anos trabalhando com Windows acabei migrando para o Linux, e acabei meio que caindo no meio de um fogo cruzado, pois de cara fui trabalhar no Paraguai, com um servidor linux.
Indo ao meu problema, quero monitorar minha rede elétrica, para quando faltar luz me avisar, então oque fiz foi o seguinte: instalei o ubuntu mate em um raspberry pi 3, conectei meu roteador wifi no ups, e um cabo de rede (que não esta no ups) no pi, assim quando não tivesse rede lan, o pi me envia um email pela wifi e salva a informacão em um arquivo de texto no pi.
Minha questão é a seguinte, criei o script abaixo:


#!/bin/bash

#--------------------------Parametros-------------------------
MSG="Tem luz no galpao"

ERRO="Nao tem luz no galpao"
#-------------------------------------------------------------------------

TEST_NET() {
NET_STATE=`(ping -c 2 192.168.xxx.xxx | grep -c time)`
if [ $NET_STATE -ne 3 ]; then
sudo sendEmail -f claiton@xxx.net -t claiton.a@xxx.com.br -u "Informativo xxx" -m "Email informativo xxx.
Estamos sem conexao, luz e sem papel no banheiro." -s mail.xxx.xxx:587 -xu claiton@xxx.net -xp senha1
echo "$(date +%d/%m/%y-%H:%M:%S) $ERRO" >> log_rede.txt
else
sudo sendEmail -f claiton@xxx.net -t claiton.a@xxx.com.br -u "Informativo xxx" -m "Email informativo xxx.
Ja estamos com conexao, luz e temos papel no banheiro." -s mail.xxx.xxx:587 -xu claiton@xxx.net -xp senha1
echo "$(date +%d/%m/%y-%H:%M:%S) $MSG" >> log_rede.txt

fi
}

TEST_NET # Chama a função


Esse script funciona, me envia email, só que oque o problema é que ele fica sempre mandando email, se ficar 5 minutos sem luz, ele fica 5 minutos me enviando email. Oque eu quero fazer e não estou conseguindo, é fazer com que ele me envie apenas o primeiro email avisando, e apenas siga salvando a informacão no arquivo de texto.
Quero uma ajuda do pessoal, para fazer com que esse script envie apenas o primeiro email, depois siga fazendo o ping na rede.


  


2. Re: Ajuda com script monitor de rede.

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 06/06/2018 - 12:08h

aqui no celular está embaçado de visualizar o script, mas em tese é o seguinte.

vc tem q desvincular o envio do e-mail com a geração do log.

tipo assim

se tiver energia
não faça nada
senão
mande email
enquanto sem energia
gere log
fim enquanto
fim se

------------------------------------------| Linux User #621728 |-----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------



3. Re: Ajuda com script monitor de rede.

Diego Mendes Rodrigues
diegomrodrigues

(usa Ubuntu)

Enviado em 06/06/2018 - 12:12h

Opa!

Você pode utilizar uma variável que controla o envio, ou não envio, dos e-mails.
O conteúdo dessa variável fica em uma arquivo chamado controle.txt.
Crie então uma arquivo chamado controle.txt com o conteúdo 0.

No script, recupero o conteúdo na linha: CONTROLE=`cat controle.txt`
Quando essa variável estiver com 0, significa que na execução anterior já existia luz no galpão.
Quando essa variável estiver com 1, significa que na execução anterior não existia luz no galpão.

Segue abaixo o script shell.

#!/bin/bash

#--------------------------Parametros-------------------------
MSG="Tem luz no galpao"
ERRO="Nao tem luz no galpao"
#-------------------------------------------------------------------------

TEST_NET() {
# 0 - Ja tinha luz no galpao
# 1 - Já não tinha luz no galpao
CONTROLE=`cat controle.txt`
#echo $CONTROLE

NET_STATE=`(ping -c 2 192.168.xxx.xxx | grep -c time)`

if [ $NET_STATE -ne 3 ]; then
# Existia luz no galpao, então envia e-mail e muda o conteudo do arquivo
if [ $CONTROLE == 0 ]; then
sudo sendEmail -f claiton@xxx.net -t claiton@xxx.net -u "Informativo xxx" -m "Email informativo xxx. Estamos sem conexao, luz e sem papel no banheiro." -s mail.xxx.xxx:587 -xu claiton@xxx.net -xp senha1
echo "1" > controle.txt
fi
echo "$(date +%d/%m/%y-%H:%M:%S) $ERRO" >> log_rede.txt
else
# Não existia luz no galpao, entao envia e-mail e altera o arquivo
if [ $CONTROLE == 1 ]; then
sudo sendEmail -f claiton@xxx.net -t claiton.a@xxx.com.br -u "Informativo xxx" -m "Email informativo xxx. Ja estamos com conexao, luz e temos papel no banheiro." -s mail.xxx.xxx:587 -xu claiton@xxx.net -xp senha1
echo "0" > controle.txt
fi
echo "$(date +%d/%m/%y-%H:%M:%S) $MSG" >> log_rede.txt

fi
}

TEST_NET # Chama a função


Abraço,
Diego M. Rodrigues


4. Boa tarde

Bruno Cavalcanti
Bruno_Cavalcanti

(usa CentOS)

Enviado em 06/06/2018 - 12:23h

Tenta assim, n sei se vai dar bom mas axo que da certo.


#--------------------------Parametros-------------------------
MSG="Tem luz no galpao"

ERRO="Nao tem luz no galpao"
#-------------------------------------------------------------------------

TEST_NET() {

NET_STATE=`(ping -c 2 192.168.xxx.xxx | grep -c time)`

if [ $NET_STATE -eq 3 ]; then

sudo sendEmail -f claiton@xxx.net -t claiton.a@xxx.com.br -u "Informativo xxx" -m "Email informativo xxx.
Ja estamos com conexao, luz e temos papel no banheiro." -s mail.xxx.xxx:587 -xu claiton@xxx.net -xp senha1
echo "$(date +%d/%m/%y-%H:%M:%S) $MSG" >> log_rede.txt

# Sempre zera o status da energia para ok
echo "ok" > /tmp/status-energia
else
# Escreve parametro d e erro no status-energia como incremento.
echo "erro" >> /tmp/status-energia

# Essa variavel recebe a quantidade de vezes que foi escrito erro
teste="$(cat /tmp/status-energia | grep erro | wc -l)

# Esta condicao so executara no primeiro incremento de erro.
if [ $teste -eq 1 ]; then
sudo sendEmail -f claiton@xxx.net -t claiton.a@xxx.com.br -u "Informativo xxx" -m "Email informativo xxx.
Estamos sem conexao, luz e sem papel no banheiro." -s mail.xxx.xxx:587 -xu claiton@xxx.net -xp senha1
fi
echo "$(date +%d/%m/%y-%H:%M:%S) $ERRO" >> log_rede.txt
fi


5. Re: Ajuda com script monitor de rede.

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 06/06/2018 - 18:18h

cacaloco2 escreveu:

Bom dia amigos.
Sou novo no grupo e esta é a primeira vez que posto alguma coisa. Depois de passar 19 anos trabalhando com Windows acabei migrando para o Linux, e acabei meio que caindo no meio de um fogo cruzado, pois de cara fui trabalhar no Paraguai, com um servidor linux.
Indo ao meu problema, quero monitorar minha rede elétrica, para quando faltar luz me avisar, então oque fiz foi o seguinte: instalei o ubuntu mate em um raspberry pi 3, conectei meu roteador wifi no ups, e um cabo de rede (que não esta no ups) no pi, assim quando não tivesse rede lan, o pi me envia um email pela wifi e salva a informacão em um arquivo de texto no pi.
Minha questão é a seguinte, criei o script abaixo:


#!/bin/bash

#--------------------------Parametros-------------------------
MSG="Tem luz no galpao"

ERRO="Nao tem luz no galpao"
#-------------------------------------------------------------------------

TEST_NET() {
NET_STATE=`(ping -c 2 192.168.xxx.xxx | grep -c time)`
if [ $NET_STATE -ne 3 ]; then
sudo sendEmail -f claiton@xxx.net -t claiton.a@xxx.com.br -u "Informativo xxx" -m "Email informativo xxx.
Estamos sem conexao, luz e sem papel no banheiro." -s mail.xxx.xxx:587 -xu claiton@xxx.net -xp senha1
echo "$(date +%d/%m/%y-%H:%M:%S) $ERRO" >> log_rede.txt
else
sudo sendEmail -f claiton@xxx.net -t claiton.a@xxx.com.br -u "Informativo xxx" -m "Email informativo xxx.
Ja estamos com conexao, luz e temos papel no banheiro." -s mail.xxx.xxx:587 -xu claiton@xxx.net -xp senha1
echo "$(date +%d/%m/%y-%H:%M:%S) $MSG" >> log_rede.txt

fi
}

TEST_NET # Chama a função
Esse script funciona, me envia email, só que oque o problema é que ele fica sempre mandando email, se ficar 5 minutos sem luz, ele fica 5 minutos me enviando email. Oque eu quero fazer e não estou conseguindo, é fazer com que ele me envie apenas o primeiro email avisando, e apenas siga salvando a informacão no arquivo de texto.
Quero uma ajuda do pessoal, para fazer com que esse script envie apenas o primeiro email, depois siga fazendo o ping na rede.

Boa noite Cacaloco.
Segue sugestão:
#!/bin/bash
CVM="\e[0;38;5;196m"
CVD="\e[0;38;5;2m"
FC="\e[m"
stt="0"

ENVIA_EMAIL() {
sudo sendEmail -f claiton@xxx.net -t claiton.a@xxx.com.br -u "Informativo xxx" -m "${mensagem}" -s mail.xxx.xxx:587 -xu claiton@xxx.net -xp senha1
}

while :;do
sleep 1.25 #defina o tempo de acordo com a necessidade
stt00="${stt}";
if (($(ping -c1 192.168.1.1|grep -c 'time') == 1));then
mensagem="$(printf "%(%x-%X.%s)T => Energia Elétrica ON")";
printf "${CVD} ${mensagem}${FC}\n"|tee -a log_rede.txt
stt="0"
else
mensagem="$(printf "%(%x-%X.%s)T => Energia Elétrica OFF")"
printf "${CVM} ${mensagem}${FC}\n"|tee -a log_rede.txt
stt="1"
fi
stt01="${stt}";
((${stt00} != ${stt01})) && ENVIA_EMAIL
done

Testei aqui e funcionou . . .

Att.:
Marcelo Oliver



6. Agradecimento

claiton a.da silva
cacaloco2

(usa Ubuntu)

Enviado em 07/06/2018 - 10:52h

Gostaria de agradecer a todos que responderam, pois obtive exito em todas as respostas, com pequenas alteracões, funcionaram perfeitamente. A cada resposta, um aprendizado a mais.

Agradeco novamente, e mando um abraco a todos.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts