você está aqui: Home  → Arquivo de Mensagens

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
  
  < A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>#
  < A NAME="note Não alterar apartir deste ponto " HREF="#textnote Não alterar apartir deste ponto ">< SUP> Não alterar apartir deste ponto 
  < A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>#
  
  < A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>###
  < A NAME="note Dont change from here " HREF="#textnote Dont change from here ">< SUP> Dont change from here 
  < A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>< A NAME="note" HREF="#textnote">< SUP>###
  
  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

 

 

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script