você está aqui: Home  → Arquivo de Mensagens Programação Shell Linux: Inscrições Abertas

Script para definir rotas para operadoras

Colaboração: Anderson J. de Souza

Data de Publicação: 05 de Abril de 2007

Este script define automaticamente as rotas para as redes de uma operador como embratel, brasiltelecom, gvt ou outras,...

Apenas se vc utiliza dois links de operadoras diferentes.

#!/bin/sh
#
# Agentroute
# Mini agente de configuração de rotas
#
#  Captura as os ips das placas de rede e define as rotas para as operadoras (brt,gvt,...) conforme for melhor
#
#  Por Anderson J. de Souza ( 14/02/07 )
#  anjoel.s@gmail.com
#  +55 (54) 9115.13.15
#

WHOIS="whois"
GREP="grep"
AWK="awk"
IFCONFIG="ifconfig"
PIDFILE="/var/run/agentroute.pid"

TIMECHECK=360;          # fazer rechecagem a cada n minutos (360=6horas)

GATEWAYS="10.1.1.1 200.xxx.xxx.xxx 192.168.1.1" # gateways, favor informar todos

#####################################
## Não alterar apartir deste ponto ##
#####################################

###########################
## Dont change from here ##
###########################

COUNTRY="BR"
ERautnum='^aut-num:[[:space:]]+AS[0-9]+$'
ERinetnum='^inetnum:[[:space:]]+[0-9][0-9./]+[0-9]$'
ERinet='^[[:space:]]+inet[[:space:]][0-9][0-9.]+[0-9].*$'
ERnetInvalid='^(10|127|192[.]168)[.].*$';

getForeignIP() {
       fetch -q -o /dev/stdout http://www.whatismyip.com | grep '<TITLE>' | grep -oE '([0-9]{1,3}[.]){3}[0-9]{1,3}';
}

doHelp() {
 f=`basename $0`;
echo "
Agente de descoberta de rotas da operadora para definilas pelo melhor gateway.

       $f              Faz leitura das redes da operadora e insere elas na tabela de roteamento.
       $f makeRoutes   Mesmo acima.
       $f start        Inicia o programa como um daemon dele mesmo para parar use stop.
       $f stop         Para o programa iniciado com start.
       $f loop         Inicia o programa como um daemon em foreground.
       $f cleanpid     Apaga arquivo de pid que nao eh apagado no modo loop.

OBS.: Este agente deve ser usado com dois links de operadoras diverentes.

OBS.: Este agente nao remove rotas colocadas.

Por Anderson J. de Souza 14/02/2007
       anjoel.s@gmail.com
       +55 (54) 9115.13.15
"
}

getIPs() {
       ${IFCONFIG} | ${GREP} -E ${ERinet} | ${AWK} '{print $2}' | ${GREP} -Ev ${ERnetInvalid};
       return $?;
}

checkIP() {
       # deveria capturar o coutry,... mas nao funciona em todos os casos
       ${WHOIS} $1 | ${GREP} -E ${ERautnum} | ${AWK} '{print $2}'
       return $?;
}

getASNets() {
       ${WHOIS} -c $1 $2 | ${GREP} -E ${ERinetnum} | ${AWK} '{print $2}'
       return $?;
}

netsToIP() {
       AS=`checkIP $1`
       [ $? ] || exit $?;
       getASNets ${COUNTRY} ${AS}
       return $?
}

setRoute() {
       route add ${1} ${2}
}

rmRoute() {
       route delete ${1}
}

setParenNets() {
       NETS=`netsToIP $1`;
       for n in ${NETS} ; do
               setRoute ${n} ${1}
       done;
}

setParentNetsForGateWays() {
       nets=`host www.whatismyip.com | cut -d' ' -f4`
       default=`netstat -rn | grep -E '^default[[:space:]]+.*$' | awk '{print $2}'`
       for gw in ${GATEWAYS} ; do
        ping -Q -m 1 -o -c 1 ${gw} > /dev/null # garante que tem o arp do gw
        [ ${gw} != ${default} ] && # se nao for o gw default
        [ arp ${gw} > /dev/null ] && # se o gw existe e esta na mesma rede
        {
               for n in $nets ; do
                       setRoute $n ${gw};
               done;
               ForeignIP=`getForeignIP`
               for n in $nets ; do
                       rmRoute $n;
               done;
               NETS=`netsToIP ${ForeignIP}`;
               for n in ${NETS} ; do
                       setRoute ${n} ${gw}
               done;
               sleep 10;
       } done;
}

makeRoutes() {
       setParentNetsForGateWays;
}

makeLoop() {
       echo "makeLoop $$"
       [ ${TIMECHECK} -lt 10 ] && TIMECHECK=360;
       sleep 10;
       time=${TIMECHECK};
       time=$(( ${time} * 60 ));
       [ -f ${PIDFILE} ] || echo $$ > ${PIDFILE};
       while [ -f ${PIDFILE} ] && [ "`cut -d' ' -f1 ${PIDFILE}`" = "$$" ] ; do
       echo "makeLoop while $$"
               makeRoutes;
               sleep ${time};
       done;
}

cleanPid() {
       rm -f ${PIDFILE};
}

## Execução do programa
case ${1} in
       [sS][tT][aA][rR][tT])
               [ -f ${PIDFILE} ] || {
                       makeLoop &
                       echo "$$ $!" >> ${PIDFILE};
                       sleep 1;
               }
               ;;
       [sS][tT][oO][pP])
               [ -f ${PIDFILE} ] && {
                       kill `cut -d' ' -f2 ${PIDFILE}`;
                       sleep 2;
                       cleanPid;
               }
               ;;
       [rR][eE][sS][tT][aA][rR][tT])
               $0 stop;
               $0 start;
               ;;
       [lL][oO][oO][pP])
               makeLoop;
               ;;
       cleanpid)
               cleanPid;
               ;;
       makeRoutes)
               makeRoutes;
               ;;
       -[hH])
               doHelp;
               ;;
       *)
               makeRoutes;
               ;;
esac

exit 0;

Por Anderson J. de Souza ( 14/02/07 )
anjoel.s@gmail.com
+55 (54) 9115.13.15


Veja a relação completa dos artigos de Anderson J. de Souza