Quem ainda usa os switches Cisco Catalyst 2950 e faz uso do storm-control com a opção de shutdown ja deve ter percebido que o IOS até a ultima versão ( 12.1(22)EA14 ) não consegue reabilitar a porta com o comando errdisable recovery cause all. Para solucionar esse problema pode ser usada a combinação de syslog-ng + cron + shell script + expect.
Primeiramente você precisa habilitar o log remoto dos switches através dos comandos abaixo ( troque o 10.1.1.10 pelo IP do host onde vai estar rodando o syslog-ng ):
service timestamps debug datetime localtime show-timezone service timestamps log datetime localtime show-timezone no logging rate-limit logging cns-events debugging logging trap debugging logging 10.1.1.10
Em seguida, em uma maquina Linux ou FreeBSD ( para essas coisas prefiro o FreeBSD ), instale e configure o syslog-ng. A configuração mínima está abaixo:
@version: 3.14 options { chain_hostnames(off); flush_lines(0); use_dns(no); use_fqdn(no); owner("root"); group("wheel"); perm(0644); stats_freq(0); threaded(yes); dir-perm(0755); create_dirs(yes); bad_hostname("^gconfd$"); }; source s_network { udp( port(514) ); tcp( port(514) ); }; destination d_network { file("/usr/local/www/syslog/$SOURCEIP/$YEAR/$MONTH/$SOURCEIP-$YEAR-$MONTH-$DAY.log"); }; destination d_storm { file("/root/cisco/tmp/$SOURCEIP-$UNIXTIME.log"); }; filter f_storm {match(".*STORM.*" value ("MESSAGE"));}; log { source(s_network); destination(d_network); }; log { source(s_network); filter(f_storm); destination(d_storm); };
Ajuste os diretórios onde serão gravados os logs. No caso são usados:
- /usr/local/www/syslog/ – caso queira acessar para consulta via o Apache, mas pode configurar qualquer outro. Esse serve apenas para ter um histórico diário do que o switch loga;
- /root/cisco/tmp/ – diretório temporário de onde o script que é executado pelo crontab vai procurar os arquivos com os dados necessários para reativar as portas;
Apos o switch configurado para enviar os logs para o servidor e o syslog-ng configurado, crie o script que vai fazer a verificação de acordo com o seu agendamento no crontab. Crie também o diretório /root/cisco/run/ :
#!/usr/local/bin/bash LS="/bin/ls" MV="/bin/mv" TMPDIR="/root/cisco/tmp/" WORKDIR="/root/cisco/run/" WC="/usr/bin/wc" PREFIX="10" PORT="23" USER="cisco" USERPW="cisco123!" ENABLEPW="enablepass" GREP="/usr/bin/grep" CAT="/bin/cat" CUT="/usr/bin/cut" ECHO="/bin/echo" RM="/bin/rm" ENABLE_SCRIPT="/root/bin/storm_control_enable.exp" DATA=`/bin/date +%Y-%m-%d-%H-%M` MAIL="/usr/bin/mail" MAILRCPT="[email protected]" cd $TMPDIR ARQUIVOS=`$LS -1 $PREFIX* 2>/dev/null | $WC -l 2>/dev/null` if [ "$ARQUIVOS" -gt 0 ]; then $ECHO "" $ECHO "" $ECHO "" $ECHO "" $ECHO "" $ECHO "run $DATA" $ECHO "" $LS -1 $PREFIX* $ECHO "" $ECHO "" $MAIL $MAILRCPT < $PREFIX* $MV $TMPDIR/$PREFIX* $WORKDIR cd $WORKDIR for i in $PREFIX* ; do IP=`$ECHO $i | $CUT -f 1 -d "-"` SHUTDOWNINTERFACE=`$CAT $i | $GREP SHUTDOWN | $CUT -f 5 -d ":" | $CUT -f 6 -d " "` if [ ! -z "$SHUTDOWNINTERFACE" ]; then $ENABLE_SCRIPT $IP $PORT $USER $USERPW $ENABLEPW $SHUTDOWNINTERFACE SAIDA="$?" if [ $SAIDA -eq 0 ]; then $RM $WORKDIR/$i fi fi done fi
Por fim crie o script que vai fazer o acesso ao switch e retirar o shutdown da interface:
#!/bin/sh # \ exec /usr/local/bin/expect -- "$0" ${1+"[email protected]"} exp_version -exit 5.0 if {$argc==0} { send_user "usage: $argv0 host port username password enable port\n\n" send_user "host - ip / dns hostname\n" send_user "port - telnet port\n" send_user "username - telnet username\n" send_user "password - telnet password\n" send_user "enable - enable password\n" send_user "interface - interface to enable\n\n" exit } set HOST [lindex $argv 0] set PORT [lindex $argv 1] set USERNAME [lindex $argv 2] set PASSWORD [lindex $argv 3] set ENAPASSWORD [lindex $argv 4] set INTERFACE [lindex $argv 5] spawn telnet $HOST $PORT expect "Username: " send "$USERNAME\r" expect "Password: " send "$PASSWORD\r" expect ">" send "enable\r" expect "Password: " send "$ENAPASSWORD\r" expect "#" send "conf term\r" expect "g)#" send "interface $INTERFACE\r" expect "if)#" send "no shut\r" expect "if)#" send "exit\r" expect "g)#" send "exit\r" expect "#" send "wr\r" expect "#" send "quit\r"
Dependências:
- expect;
- bash;
- postfix ou qualquer outro MTA ( se quiser receber emails de aviso );
Diretórios necessários:
- /usr/local/www/syslog/
- /root/cisco/tmp/
- /root/cisco/run/
Alterações necessárias:
- IP do servidor de syslog;
- PREFIX – prefixo do IP dos switches. Os arquivos de log gerados vão iniciar com o numero IP e o script de verificação vai usar o nome para compor as variáveis necessárias para a reativação ;
- USER – nome de usuário para acesso ao switch via telnet;
- USERPW – senha do usuário de acesso;
- ENABLEPW – senha de enable;
- ENABLE_SCRIPT – caminho completo do script de reativação das portas;
- MAILRCPT – endereço de e-mail para onde vai ser enviada notificação das portas que foram reativadas;