Cisco WS-C2950 errdisable recovery

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;

Leave a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *