DESCRIÇÃO DO SCRIPT
Eu comecei a escrever scripts há muito pouco tempo, então, não sou muito bom em fazê-los, sou iniciante nessa área, portanto, podem haver coisas que vocês saibam fazer diferente e melhor.
Este script está funcionando perfeitamente nesse cliente, porém, caso vocês tenham novas ideias, novas formas de fazer as funções e processos aqui apresentados, conto com a ajuda e colaboração de vocês a fim de melhorar e aprimorar esse script.
Espero ajudar quem um dia vir a ter a mesma necessidade que eu tive.
Este script foi construído para suprir a necessidade de ter alta disponibilidade de internet. O mesmo está rodando em um servidor de firewall (CentOS 5).
O script é divido em dois arquivos, o link_rendundante e o monitor_link:
- link_redundante – esse arquivo contém todas as funções e a lógica do script.
- monitor_link – esse arquivo é o daemon, que roda e monitora o arquivo link_redundante.
Obs.: lembre-se de dar permissão de execução aos scripts:
# chmod +x link_redundate
# chmod +x monitor_link
Segue abaixo o script link_redundante. O mesmo deverá estar localizado em /etc/init.d/link_redundante:
#=============================================================================== #!/bin/bash #=============================================================================== # @author Edir Bonametti # @since 2015-07-03 # @version 1.0 # Description: Este script foi desenvolvido com o intuito de monitorar o link # de internet, e realizar a troca do gateway em caso de falha do link principal. #=============================================================================== #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Modo de Usar: # # Existe um daemon que roda e monitora esse script, o mesmo esta localizado em # # /etc/init.d/monitor_link ( status, stop, start, restart) # # Esse daemon, executa a função monitor, que faz a verificação de estado de # link a cada 10 segundos. # #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Início do Script (Declaração das Variáveis) # Verificação de qual gateway está ativado na tabela de roteamento. GWUP=`ip route show | grep ^default | cut -d " " -f 3` # Gateway Principal GW1=<IP DO GATEWAY PRINCIPAL> # Gateway backup GW2=<IP DO GATEWAY SECUNDÁRIO> #Interface da NET INTNET=eth2 #Interface Embratel INTEBT=eth3 # IP de teste de conexão IPTESTE=8.8.8.8 # Arquivo de log LOG=/var/log/redundancia.log COMANDO=$1 TEMPO=$2 # Função que gera os logs function log() { MSG="[`date`] $@" echo $MSG >> $LOG } # Função utilizada para testar a conectividade do link Principal (NET) function testa_NET () { route add $IPTESTE gw $GW1 # Adiciona rota para sair pelo link NET ping -I $INTNET $IPTESTE -c 10 -A > /dev/null # Pinga o IP de teste pingok=$? # Guarda o retorno do comando anterior. route del $IPTESTE gw $GW1 # Remove a rota do IP de teste [ $pingok -eq 0 ] && return 0 || return 1 # Retorna 0 se link NET OK OU 1 se Não OK } # Função para ativar o link 1 (NET) function ativa_link1() { log "Iniciando link Principal..." add_GW_NET # Chama a funcao add_GW_NET } # Função que adiciona rota para GATEWAY (NET) function add_GW_NET() { log "Removendo Rota da Embratel" route del default gw $GW2 # Remove rota para Embratel caso ela exista. log "Adicionando Rota para a NET" route add default gw $GW1 # Adiciona rota para NET } # Função que desativa link 1 function desativa_link1 () { #log "Removendo Rota da NET" route del default gw $GW1 # Remove gateway do link 1 } # Função que ativa link 2 function ativa_link2() { desativa_link1 # Chama função desativa_link1 route add default gw $GW2 # Adiciona rota para o link 2 ping -I $INTEBT $IPTESTE -c 5 -A > /dev/null # Testa conectividade do link Embratel if [[ $? -eq 0 ]]; then # Retorna 0 se o link OK OU 1 SE NÃO OK # log "Link EMBRATEL Ativo" return 0; fi return 1; } # Função que desativa link 2 function desativa_link2() { # log "Removendo Gateway da Embratel" route del default gw $GW2 # Remove Gateway da Embratel return 0; return 1; } # ATENÇÃO...!!! Função Principal do script, quaisquer alterações nessa função devem ser feitas com precaução, # caso contrario poderá comprometer o funcionamento do mesmo. function monitor() { while true # Enquanto as condições abaixo forem verdadeiras, ele vai executar. do #Busca o default gateway na tabela de rotas local GWUP=`ip route show | grep ^default | cut -d " " -f 3` # Verifica se o gateway atual e a NET if [ $GWUP == $GW1 ]; then # Se essa condição for verdadeira...continua no IF, se não entra no ELSE log "Gateway atual apontando para NET" # log "Realizando verificacao de estado do LINK" if( ! testa_NET); then # Se a função testa net retornar falha, entra IF log "Link NET indisponivel, ativando Gateway da EMBRATEL" if(ativa_link2); then # Se função ativa link retornar OK, entra no if, caso der falha, entra no ELSE. log "Link EMBRATEL ativado com Sucesso" else log "Problema ao ativar Gateway da Embratel" fi fi else log "Gateway atual apontando para EMBRATEL" # # Ativa rota NET se ela estiver disponível if(testa_NET ); then # Se link NET voltou, desativa o link 2 (EMBRATEL) log "Link NET disponivel, desativando GATEWAY da EMBRATEL e retornando para da NET" if( desativa_link2 ); then # ativa_link1 fi fi fi sleep $TEMPO done } case "$1" in monitor) echo "`date` - Monitorando Link Principal: intervalo $TEMPO segs" monitor ;; status) if [ $GWUP == $GW2 ]; then echo "Utilizando EMBRATEL" else echo "Utilizando NET" fi ;; link1) if [ $GWUP == $GW2 ]; then desativa_link2 ativa_link1 else echo "Link1 ja em uso" fi ;; link2) if [ $GWUP == $GW1 ]; then ativa_link2 else echo "Link2 ja em uso" fi ;; *) echo $"Usage: $prog { monitor + segundos | link1 | link2 | status }" exit 1 ;; esac exit $?
Abaixo, o script monitor_link:
#!/bin/bash #============================================================== # @author Edir Bonametti # @since 2015-07-03 # @version 1.0 # Description: Daemon do script link_redundante # process name: link_redundante #============================================================== # Source function library. . /etc/init.d/functions # Verifica se o arquivo de configuração existe [ -f /etc/init.d/link_redundante ] || exit 0 # Comando utilizado para rodar o script de monitoramento COMMAND="/etc/init.d/link_redundante" RETVAL=0 # função para pegar o PID do processo. getpid() { pid=`ps -eo pid,comm | grep link_redundante | awk '{ print $1 }'` } # Função para iniciar o script link_redundate start() { echo $"Iniciando o Monitoramento de LINK: " getpid if [ -z "$pid" ]; then rm -rf /var/run/link_redundate.sock # Caso o processo já exista limpa o sock # Inicializa o monitoramento no intervalo de 10 segundos $COMMAND monitor 10 & > /dev/null RETVAL=$? fi # Se o retorno do comando anterior for verdadeiro, cria o arquivo link_redundate if [ $RETVAL -eq 0 ]; then touch /var/lock/subsys/link_redundante echo_success else # Caso retorne falso echo_falhou fi echo # return $RETVAL } # Função que para o monitoramento' stop() { echo $"Parando Monitoramento do LINK: " getpid RETVAL=$? if [ -n "$pid" ]; then $COMMAND link1 > /dev/null kill -9 $pid sleep 2 getpid if [ -z "$pid" ]; then rm -f /var/lock/subsys/link_redundante echo_success else echo_failure fi else echo_failure fi echo return $RETVAL } case "$1" in start) start ;; stop) stop ;; status) getpid if [ -n "$pid" ]; then echo "Monitoramento de link (PID $pid) está Rodando...." $COMMAND status else RETVAL=1 echo "Monitoramento de link está parado...." fi ;; restart) stop start ;; *) echo $"Usage: $0 {start|stop|status|restart}" exit 1 ;; esac exit $RETVAL