Script com SNMP, Resultado para Interface [RESOLVIDO]

1. Script com SNMP, Resultado para Interface [RESOLVIDO]

Roberto Costa
asparion

(usa Ubuntu)

Enviado em 09/11/2023 - 10:10h

Bom dia Amigos VOL, Seguindo a referencia abaixo:
https://www.vivaolinux.com.br/topico/Shell-Script/Script-com-SNMP/


Com o script abaixo:

#!/bin/bash
address="192.168.0.244"
index=$(snmpwalk -v2c -c public $address IF-MIB::ifName | awk '{ print $1 }' | sed -e 's/[^0-9 ]//ig')

for id in $index
do

# Capturar pacotes de entrada
interface=$(snmpwalk -v2c -c public $address IF-MIB::ifName.$id | awk '{ print $4 }')

entrada1=$(snmpget -v2c -c public $address IF-MIB::ifInOctets.$id |awk {'print $4'} )
sleep 5
entrada2=$(snmpget -v2c -c public $address IF-MIB::ifInOctets.$id |awk {'print $4'} )

# Capturar pacotes de Saida
saida1=$(snmpget -v2c -c public $address IF-MIB::ifOutOctets.$id |awk {'print $4'} )
sleep 5
saida2=$(snmpget -v2c -c public $address IF-MIB::ifOutOctets.$id |awk {'print $4'} )

# Calculo do tamanho dos pacotes
trafficIn=$(echo "$entrada2 - $entrada1 " | bc)
trafficOut=$(echo "$saida2 - $saida1 " | bc)


# Display do resultado
if [ $trafficIn -lt 2000 ] && [ $trafficOut -lt 2000 ] ; then
echo "OK : Interface $interface = Traffic In: $trafficIn, Traffic Out: $trafficOut"
exit 0;
else
echo "CRITICAL : Interface $interface = Traffic In: $trafficIn, Traffic Out: $trafficOut"
exit 1;
fi

done


Tenho o Seguinte Resultado

Critical : Interface Et0/0 = Traffic In: 384931, Traffic Out: 384641
Ok : Interface Et0/1 = Traffic In: 0, Traffic Out: 0
Ok : Interface Et0/2 = Traffic In: 0, Traffic Out: 0
Ok : Interface Et0/3 = Traffic In: 0, Traffic Out: 0


Como que faço por exemplo. se todas as interfaces estive ok, a saida do resultado seja uma so. Por exemplo:

se todas tiver ok a saida é
Ok : All Interfaces are OK 


Se alguma interface nao estiver ok a saida mostra quais ex:
Critical : Interface Et0/0 = Traffic In: 384931, Traffic Out: 384641 


Valeu Obrigado




  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 09/11/2023 - 23:48h

asparion escreveu:

Boa noite, essa parte do script esta ok, removi os logs e coloquei uma parenteses que faltou, ficando assim:

#!/bin/bash
address="192.168.0.244";

index=$(snmpwalk -v2c -c public $address IF-MIB::ifName | awk -F"[. ]" '{print $2}')
mresp='';


for id in $index;do
# Capturar pacotes de entrada
interface=$(snmpwalk -v2c -c public $address IF-MIB::ifName.$id | awk '{ print $4 }')
entrada1=$(snmpget -v2c -c public $address IF-MIB::ifInOctets.$id |awk {'print $4'} )
sleep 5
entrada2=$(snmpget -v2c -c public $address IF-MIB::ifInOctets.$id |awk {'print $4'} )

# Capturar pacotes de Saida
saida1=$(snmpget -v2c -c public $address IF-MIB::ifOutOctets.$id |awk {'print $4'} )
sleep 5
saida2=$(snmpget -v2c -c public $address IF-MIB::ifOutOctets.$id |awk {'print $4'} )

# Calculo do tamanho dos pacotes
In=$((entrada2 - entrada1))
Out=$((saida2 - saida1))


# Display do resultado
if [ $In -lt 200 -a $Out -lt 200 ] ; then
echo "OK : Interface $interface = Traffic In: $In, Traffic Out: $Out"
mresp+=("Ok");
else
echo "CRITICAL : Interface $interface = Traffic In: $In, Traffic Out: $Out"
mresp+=("Critical");
fi
done


preciso do complemento agora que é a parte fundamental ex:

if [ se todos estiver ok ] ; then
echo "All Interfaces are OK"
exit 0;
else --> se alguma estiver critical
echo "CRITICAL : Interface $interface = Traffic In: $In, Traffic Out: $Out" ---- echo so para as interface criticas
exit 1;
fi


Tenho o ambiente de teste se quiser olhar
IP: 34.95.165.137
Porta: 2222
Login: linux
Senha: 123456
sudo su

root@rca-monit-01:~# check_snmp_switch

Obs: preciso do exit 0 e o exit 1.

Valeu Abraço

Boa noite Asparion.
preciso do complemento agora que é a parte fundamental ex: ....
Note que enviei os "echo (Ok|CRITICAL) ..." para um arquivo.
echo "OK : Interface $interface = Traffic In: $In, Traffic Out: $Out" >> ${log}
echo "CRITICAL : Interface $interface = Traffic In: $In, Traffic Out: $Out" >> ${log}

#-------------------------------------------------------------#
.........Essa parte fundamental
Tem duas opções: (na minha postagem anterior);
[01]
grep -Eq "^(ok[ ]?){$ttreg}" <<< ${mresp[@]} && { echo "OK: All Interfaces are OK";exit 0;} || { grep "CRITICAL" ${log};exit 1;}
#------------------------------------------------------------#
[02]
ttok=$(awk '{for(n=1;n<=NF;n++) if($n=="Ok") c++}END{print c}' <<< ${mresp[*]});
((${ttreg} == ${ttok})) && { echo "OK: All Interfaces are OK";exit 0;} || { grep "CRITICAL" ${log};exit 1;}
[+ Uma opção]:
grep -i 'CRITICAL' ${log} && exit 1 || { echo "OK: All Interfaces are OK";exit 0;}

É isso...

Att.: Marcelo Oliver


3. Re: Script com SNMP, Resultado para Interface

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 09/11/2023 - 16:38h

asparion escreveu:

Bom dia Amigos VOL, Seguindo a referencia abaixo:
https://www.vivaolinux.com.br/topico/Shell-Script/Script-com-SNMP/


Com o script abaixo:

#!/bin/bash
address="192.168.0.244"
index=$(snmpwalk -v2c -c public $address IF-MIB::ifName | awk '{ print $1 }' | sed -e 's/[^0-9 ]//ig')

for id in $index
do

# Capturar pacotes de entrada
interface=$(snmpwalk -v2c -c public $address IF-MIB::ifName.$id | awk '{ print $4 }')

entrada1=$(snmpget -v2c -c public $address IF-MIB::ifInOctets.$id |awk {'print $4'} )
sleep 5
entrada2=$(snmpget -v2c -c public $address IF-MIB::ifInOctets.$id |awk {'print $4'} )

# Capturar pacotes de Saida
saida1=$(snmpget -v2c -c public $address IF-MIB::ifOutOctets.$id |awk {'print $4'} )
sleep 5
saida2=$(snmpget -v2c -c public $address IF-MIB::ifOutOctets.$id |awk {'print $4'} )

# Calculo do tamanho dos pacotes
trafficIn=$(echo "$entrada2 - $entrada1 " | bc)
trafficOut=$(echo "$saida2 - $saida1 " | bc)


# Display do resultado
if [ $trafficIn -lt 2000 ] && [ $trafficOut -lt 2000 ] ; then
echo "OK : Interface $interface = Traffic In: $trafficIn, Traffic Out: $trafficOut"
exit 0;
else
echo "CRITICAL : Interface $interface = Traffic In: $trafficIn, Traffic Out: $trafficOut"
exit 1;
fi

done


Tenho o Seguinte Resultado

Critical : Interface Et0/0 = Traffic In: 384931, Traffic Out: 384641
Ok : Interface Et0/1 = Traffic In: 0, Traffic Out: 0
Ok : Interface Et0/2 = Traffic In: 0, Traffic Out: 0
Ok : Interface Et0/3 = Traffic In: 0, Traffic Out: 0


Como que faço por exemplo. se todas as interfaces estive ok, a saida do resultado seja uma so. Por exemplo:

se todas tiver ok a saida é
Ok : All Interfaces are OK 


Se alguma interface nao estiver ok a saida mostra quais ex:
Critical : Interface Et0/0 = Traffic In: 384931, Traffic Out: 384641 


Valeu Obrigado


Boa tarde Asparion.
Segue sugestão, com algumas alterações do seu script, por exemplo:
Se manter "exit 1;" no condicional, e a 1ª interface "cair" nessa condição, para tudo . . .

#!/bin/bash
address="192.168.0.244";
##index=$(snmpwalk -v2c -c public $address IF-MIB::ifName | awk '{ print $1 }' | sed -e 's/[^0-9 ]//ig')
#Otimizado, eliminei o sed#
index=$(snmpwalk -v2c -c public $address IF-MIB::ifName | awk -F"[. ]" '/Et/{print $2}'
mresp='';
log=resp.txt;
>${log}

for id in $index;do
# Capturar pacotes de entrada
interface=$(snmpwalk -v2c -c public $address IF-MIB::ifName.$id | awk '{ print $4 }')
entrada1=$(snmpget -v2c -c public $address IF-MIB::ifInOctets.$id |awk {'print $4'} )
sleep 5
entrada2=$(snmpget -v2c -c public $address IF-MIB::ifInOctets.$id |awk {'print $4'} )

# Capturar pacotes de Saida
saida1=$(snmpget -v2c -c public $address IF-MIB::ifOutOctets.$id |awk {'print $4'} )
sleep 5
saida2=$(snmpget -v2c -c public $address IF-MIB::ifOutOctets.$id |awk {'print $4'} )

# Calculo do tamanho dos pacotes
In=$((entrada2 - entrada1))
Out=$((saida2 - saida1))


# Display do resultado
if [ $In -lt 2000 -a $Out -lt 2000 ] ; then
echo "OK : Interface $interface = Traffic In: $In, Traffic Out: $Out" >> ${log}
mresp+=("Ok");
else
echo "CRITICAL : Interface $interface = Traffic In: $In, Traffic Out: $Out" >> ${log}
mresp+=("Critical");
fi
done

#Total de registros
ttreg=${#mresp[*]};

#Total de "Okays"
ttok=$(awk '{for(n=1;n<=NF;n++) if($n=="Ok") c++}END{print c}' <<< ${mresp[*]});
((${ttreg} == ${ttok})) && echo "OK: All Interfaces are OK" || grep "CRITICAL" ${log}
Ou: #DESATIVE as 2 linhas acima: ttok e o 'test aritmético' ((. . . ))
grep -Eq "^(ok[ ]?){$ttreg}" <<< ${mresp[@]} && echo "OK: All Interfaces are OK" || grep "CRITICAL" ${log}


Envia a saída do condicional para um arquivo, (pode ser uma var).
Armazena (Ok|Critical) na array "mresp".
Conta a qtdde de "Okays"
Se: total de registros na array == total de Ok ....
Ou...
Casa com o grep se tem somente ok em ${mresp[@]}


É isso
______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/ | sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
Att.: Marcelo Oliver
______________________________________________________________________



4. Re: Script com SNMP, Resultado para Interface

Roberto Costa
asparion

(usa Ubuntu)

Enviado em 09/11/2023 - 21:38h

Boa noite, essa parte do script esta ok, removi os logs e coloquei uma parenteses que faltou, ficando assim:

#!/bin/bash
address="192.168.0.244";

index=$(snmpwalk -v2c -c public $address IF-MIB::ifName | awk -F"[. ]" '{print $2}')
mresp='';


for id in $index;do
# Capturar pacotes de entrada
interface=$(snmpwalk -v2c -c public $address IF-MIB::ifName.$id | awk '{ print $4 }')
entrada1=$(snmpget -v2c -c public $address IF-MIB::ifInOctets.$id |awk {'print $4'} )
sleep 5
entrada2=$(snmpget -v2c -c public $address IF-MIB::ifInOctets.$id |awk {'print $4'} )

# Capturar pacotes de Saida
saida1=$(snmpget -v2c -c public $address IF-MIB::ifOutOctets.$id |awk {'print $4'} )
sleep 5
saida2=$(snmpget -v2c -c public $address IF-MIB::ifOutOctets.$id |awk {'print $4'} )

# Calculo do tamanho dos pacotes
In=$((entrada2 - entrada1))
Out=$((saida2 - saida1))


# Display do resultado
if [ $In -lt 200 -a $Out -lt 200 ] ; then
echo "OK : Interface $interface = Traffic In: $In, Traffic Out: $Out"
mresp+=("Ok");
else
echo "CRITICAL : Interface $interface = Traffic In: $In, Traffic Out: $Out"
mresp+=("Critical");
fi
done


preciso do complemento agora que é a parte fundamental ex:

if [ se todos estiver ok ] ; then
echo "All Interfaces are OK"
exit 0;
else --> se alguma estiver critical
echo "CRITICAL : Interface $interface = Traffic In: $In, Traffic Out: $Out" ---- echo so para as interface criticas
exit 1;
fi


Tenho o ambiente de teste se quiser olhar
IP: 34.95.165.137
Porta: 2222
Login: linux
Senha: 123456
sudo su

root@rca-monit-01:~# check_snmp_switch

Obs: preciso do exit 0 e o exit 1.

Valeu Abraço



5. Re: Script com SNMP, Resultado para Interface

Roberto Costa
asparion

(usa Ubuntu)

Enviado em 10/11/2023 - 15:28h

Boa tarde, consegui da forma que queria modificando um pouco, ficando da seguinta forma

# Contagem de OK's e CRITICAL's
if [ $In-lt $warning ] && [ $Out-lt $warning ]; then
mresp+=("Ok");
mresp+=("Count");

elif [ $In-gt $critical ] || [ $Out-gt $critical ]; then
echo "CRITICAL: $interface, Traffic In: $In Traffic Out: $Out"
mresp+=("Critical");
mresp+=("Count");
else
echo "WARNING: $interface, Traffic In: $In Traffic Out: $Out"
fi
done


# Resultado da contagem, de OK's e CRITICAL's
count=$(awk '{for(n=1;n<=NF;n++) if($n=="Count") c++}END{print c}' <<< ${mresp[*]});
ok=$(awk '{for(n=1;n<=NF;n++) if($n=="Ok") c++}END{print c}' <<< ${mresp[*]});
critical=$(awk '{for(n=1;n<=NF;n++) if($n=="Critical") c++}END{print c}' <<< ${mresp[*]});


# Display do resultado
if [ -z $ok ] ; then
exit 2;

elif [ $ok -eq $count ] ; then
echo "All Interfaces are OK"
exit 0;
else
exit 1;
fi
done


Valeu Obrigado






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts