Redundância de links dedicados

Eu não gosto de pegar as coisas prontas na Internet. Devem ter milhares de scripts que fazem redundância de links por aí, mas eu gosto de criar os meus. No máximo busco informações sobre comandos ou coisas do tipo. Esse script foi criado a partir da necessidade de haver redundância entre os links dedicados que interligam as unidades da empresa em que eu trabalho. Sei que existem muitas formas de se fazer isso, talvez até mais fáceis, mas essa foi a minha maneira.

Esse script trabalha o shell e o “awk”, e utiliza basicamente os comandos ping e route para controlar os links. Ele captura a rota padrão atual e compara com a variável do gw primário, se ambos forem idênticos, então ele testa os ips de teste pre definidos no próprio script.

Caso haja resposta do primeiro ip de teste, ele simplesmente não faz mais nada. Caso não haja, ele faz o teste com o segundo ip. Se esse também não responder, ele troca o gateway padrão para o gateway secundário, conforme é demonstrado no função “GATEWAY()”, e gera uma saída para o arquivo “gateway.log”. Além de trocar o gateway padrão, ele troca todas as rotas que saem pelo gateway primário para saírem pelo gateway secundário e vice-versa.

Se no momento da comparação do gateway atual com o gateway primário eles não forem idênticos, então ele vai comparar o gateway atual com o secundário e o processo continua o mesmo. Daí é necessário agendar a execução do script para que a verificação seja contínua e automatizada.

Espero que gostem e que seja bem útil!

#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin
# Informe abaixo o gateway primario
GW_PRIMARIO=""
# Informe abaixo os IPs de teste do gateway primario
IP_TESTE_PRIMARIO1=""
IP_TESTE_PRIMARIO2=""
# Informe abaixo o gateway secundario
GW_SECUNDARIO=""
# Informe abaixo os IPs de teste do gateway secundario
IP_TESTE_SECUNDARIO1=""
IP_TESTE_SECUNDARIO2=""
# Armazenar gateway padrao na variavel GW_ATUAL
GW_ATUAL=`netstat -nr | awk '$1 ~ /^[0.0.0.0]/ {print $2}'`
# ATENCAO!!! A secao abaixo so deve ser alterada com absoluta certeza de que sabe o que esta fazendo!!!
# Funcao para troca do gateway
function GATEWAY()
{
        netstat -nr | awk -v gw2="$GW2" -v gw="$GW" 'NR >= 2 {if ($2 == gw2) print "route add -net " $1 FS "netmask " $3 " gw " gw > "/etc/network/gateway";}'
        netstat -nr | awk -v gw2="$GW2" 'NR >= 3 {if ($2 == gw2) print "route del -net " $1 FS "netmask " $3 " gw " gw2 > "/etc/network/gateway_del";}'
   while read ROTA2
        do
                echo -e "`$ROTA2`"
        done /etc/network/gateway_del
   while read ROTA
        do
                echo -e "`$ROTA`"
        done /etc/network/gateway
}
# Backup das rotas existentes
echo "#!/bin/bash" /etc/network/rotas.sh
echo "# Rotas Atuais coletadas pelo /etc/init.d/roteamento.sh" >> /etc/network/rotas.sh
netstat -nr | awk 'length($2) > 7' awk 'NR > 2 {print "route add -net " $1 FS "netmask " $3 " gw " $2}' >> /etc/network/rotas.sh
# Teste das redes
if [ $GW_ATUAL = $GW_PRIMARIO ]
   then
      ping -c4 $IP_TESTE_PRIMARIO1 >> /dev/null
      if [ $? = "0" ]
         then
            echo `date"Rede Primaria OK" >> /etc/network/gateway.log
         else
            ping -c4 $IP_TESTE_PRIMARIO2 >> /dev/null
            if [ $? = "0" ]
               then
                  echo `date"Rede Primaria OK" >> /etc/network/gateway.log
               else   # Troca de Gateway   
                  GW=$GW_SECUNDARIO
                  GW2=$GW_PRIMARIO
                  GATEWAY
                  echo `date"Rede Secundaria Ativada" >> /etc/network/gateway.log
                  exit
            fi
      fi
   elif [ $GW_ATUAL = $GW_SECUNDARIO ]; then
      ping -c4 $IP_TESTE_SECUNDARIO1 >> /dev/null
      if [ $? = "0" ]
         then
            echo `date"Rede Secundaria OK" >> /etc/network/gateway.log
         else
            ping -c4 $IP_TESTE_SECUNDARIO2 >> /dev/null
            if [ $? = "0" ]
               then
                  echo `date"Rede Secundaria OK" >> /etc/network/gateway.log
               else   # Troca de Gateway
                  GW=$GW_PRIMARIO
                  GW2=$GW_SECUNDARIO
                  GATEWAY
                  echo `date"Rede Primaria Ativada" >> /etc/network/gateway.log
                  exit
            fi
      fi
fi

Deixe um comentário