Administração de switch Cisco

Publicado por Ricardo Lino Olonca (última atualização em 25/10/2017)

[ Hits: 6.061 ]

Homepage: ricardoolonca.blogspot.com.br

Download sw.sh




Esse script é uma amostra de como é possível administrar uma grupo de switchs Cisco através do Bash Script. Ele usa o programa sshpass para se conectar aos equipamentos. Ele ainda não está terminado, mas decidi publicá-lo por que estou meio sem tempo de trabalhar nele.

Com ele já é possível:

- trazer o número de portas 10giga, giga, fast e ethernet geral e por equipamento;
- quantas portas estão em up, down, desconectadas, com erros, em cada equipamento e o total geral;
- criar, alterar e copiar vlans;
- descobrir em qual porta de qual switch um equipamento está, possibilitando derrubar a porta em questão;
- configurar um ip no switch;
- acessar o switch;
- configurar uma interface do switch como acesso, trunk ou voip;
- associar uma interface a uma ou mais vlans.

  



Esconder código-fonte

#!/bin/bash
# Gerencia os switchs e roteadores da empresa
# Feito por Ricardo Lino Olonca em 11/10/2017
# Versão Alfa 0.13.1
  
#set -x

# Variáveis
# Local de armazemanento das informações.
BASE=".sw"
DB="sw.dat"
DBDETALHES="swdetalhes.dat"
DBPORTAS="swportas.dat"
DBVLANS="swvlans.dat"
DBMAC="swmac.dat"
DBIP="swip.dat"

# Checa se a pasta existe
checa_arquivos(){
  cd
  if [ ! -d $BASE ]
  then
    mkdir $BASE
    echo "Pasta criada"
  fi
  # Checa se o banco de dados existe
  if [ ! -f $BASE/$DB ]
  then
    touch $BASE/$DB
  elif [ ! -w $BASE/$DB ]
  then
    chmod +w $BASE/$DB
  fi
  if [ ! -f $BASE/$DBDETALHES ]
  then
    touch $BASE/$DBDETALHES
  elif [ ! -w $BASE/$DBDETALHES ]
  then
    chmod +w $BASE/$DBDETALHES
  fi
  if [ ! -f $BASE/$DBPORTAS ]
  then
    touch $BASE/$DBPORTAS
  elif [ ! -w $BASE/$DBPORTAS ]
  then
    chmod +w $BASE/$DBPORTAS
  fi
  if [ ! -f $BASE/$DBVLANS ]
  then
    touch $BASE/$DBVLANS
  elif [ ! -w $BASE/$DBVLANS ]
  then
    chmod +w $BASE/$DBVLANS
  fi
  if [ ! -f $BASE/$DBMAC ]
  then
    touch $BASE/$DBMAC
  elif [ ! -w $BASE/$DBMAC ]
  then
    chmod +w $BASE/$DBMAC
  fi
  if [ ! -f $BASE/$DBIP ]
  then
    touch $BASE/$DBIP
  elif [ ! -w $BASE/$DBIP ]
  then
    chmod +w $BASE/$DBIP
  fi
}

# Atualiza os dados de contiguração do switch. Devem ser passados o nome, ip, usuário, senha e senhaconfig como parâmetros.
atualiza_conf(){
  nome=$1
  ip=$2
  usuario=$3
  senha=$4
  senhaconfig=$5
  echo $senha > /dev/shm/$$.pass
  echo "enable" > /dev/shm/$$
  echo $senhaconfig >> /dev/shm/$$
  echo "terminal length 0" >> /dev/shm/$$
  echo "show running-config" >> /dev/shm/$$
  echo "end" >> /dev/shm/$$
  echo "exit" >> /dev/shm/$$
  echo -n "$nome : "
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip > $BASE/$nome 2>/dev/null
  if [ $? -ne 0 ]
  then
    echo -n "Não consegui conexão com o equipamento."
  else
    echo -n "Ok. "
  fi
}

# Atualiza os detalhes do switch. Devem ser passados o nome, ip, usuário, senha e senhaconfig como parâmetros.
atualiza_detalhes(){
  nome=$1
  ip=$2
  usuario=$3
  senha=$4
  senhaconfig=$5
  echo "enable" > /dev/shm/$$
  echo $senhaconfig >> /dev/shm/$$
  echo "terminal length 0" >> /dev/shm/$$
  echo "show version" >> /dev/shm/$$
  echo "end" >> /dev/shm/$$
  echo "exit" >> /dev/shm/$$
  echo -n "Detalhes: "
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip > $BASE/$nome.versao 2>/dev/null
  if [ $? -ne 0 ]
  then
    echo -n "Não consegui listar a versão do equipamento."
  else
    rom=`grep ROM $BASE/$nome.versao | head -1 | cut -d" " -f2-`
    uptime=`grep uptime $BASE/$nome.versao | cut -d" " -f4-`
    cpu=`grep -i cpu $BASE/$nome.versao| cut -d" " -f4-`
    ethernet=`grep Ethernet $BASE/$nome.versao | grep -v Virtual | grep -v Giga | cut -d" " -f1`
    giga=`grep Giga $BASE/$nome.versao | grep -v Ten | cut -d" " -f1`
    ten=`grep Giga $BASE/$nome.versao | grep Ten | cut -d" " -f1`
    ram=`grep memory $BASE/$nome.versao | grep volatile | cut -d" " -f1`
    grep -v $nome $BASE/$DBDETALHES > /dev/shm/$$
    echo $nome:$rom:$uptime:$cpu:$ethernet:$giga:$ten:$ram >> /dev/shm/$$
    sort /dev/shm/$$ -o $BASE/$DBDETALHES
    echo -n "Ok. "
  fi
}

# Atualiza os detalhes das portas do switch. Devem ser passados o nome, ip, usuário, senha e senhaconfig como parâmetros.
atualiza_portas(){
  nome=$1
  ip=$2
  usuario=$3
  senha=$4
  senhaconfig=$5
  echo "enable" > /dev/shm/$$
  echo $senhaconfig >> /dev/shm/$$
  echo "terminal length 0" >> /dev/shm/$$
  echo "show interface status" >> /dev/shm/$$
  echo "end" >> /dev/shm/$$
  echo "exit" >> /dev/shm/$$
  echo -n "Portas: "
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip > $BASE/$nome.portas 2>/dev/null
  if [ $? -ne 0 ]
  then
    echo -n "Não consegui listar as portas do equipamento."
  else
    grep -v ^$nome: $BASE/$DBPORTAS > /dev/shm/$$
    mv /dev/shm/$$ $BASE/$DBPORTAS
    grep '/' $BASE/$nome.portas >/dev/shm/$$.$nome.portas
    linhas=`wc -l /dev/shm/$$.$nome.portas | cut -d" " -f1`
    for i in `seq $linhas`
    do
      linha=`head -$i /dev/shm/$$.$nome.portas | tail -1`
      porta=`echo "$linha" | cut -c1-10`
      descricao=`echo "$linha" | cut -c11-29`
      status=`echo "$linha" | cut -c30-42`
      vlan=`echo "$linha" | cut -c43-53`
      echo $nome:$porta:$descricao:$status:$vlan >> /dev/shm/$$.porta
    done
    cat /dev/shm/$$.porta >> $BASE/$DBPORTAS
    sort $BASE/$DBPORTAS | uniq > /dev/shm/$$.porta
    mv /dev/shm/$$.porta $BASE/$DBPORTAS
    echo -n "Ok. "
  fi
}

# Atualiza os detalhes das VLANS do switch. Devem ser passados o nome, ip, usuário, senha e senhaconfig como parâmetros.
atualiza_vlans(){
  nome=$1
  ip=$2
  usuario=$3
  senha=$4
  senhaconfig=$5
  echo "enable" > /dev/shm/$$
  echo $senhaconfig >> /dev/shm/$$
  echo "terminal length 0" >> /dev/shm/$$
  echo "show vlan" >> /dev/shm/$$
  echo "end" >> /dev/shm/$$
  echo "exit" >> /dev/shm/$$
  echo -n "Vlans: "
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip > $BASE/$nome.vlans 2>/dev/null
  if [ $? -ne 0 ]
  then
    echo -n "Não consegui listar as VLANS do equipamento."
  else
    grep -v ^$nome $BASE/$DBVLANS > /dev/shm/$$
    mv /dev/shm/$$ $BASE/$DBVLANS
    grep ^[0-9] $BASE/$nome.vlans | grep -v \ 1500\ | sort -k1 -t" " -n > /dev/shm/$$.$nome.vlans
    vlanslocais=`wc -l /dev/shm/$$.$nome.vlans | cut -d" " -f1`
    for x in `seq $vlanslocais`
    do
      linha=`head -$x /dev/shm/$$.$nome.vlans | tail -1`
      vlanlocais=`echo "$linha" | cut -c1-5`
      descricao=`echo "$linha" | cut -c6-38`
      echo $nome:$vlanlocais:$descricao >> /dev/shm/$$.vlans
    done
    cat /dev/shm/$$.vlans >> $BASE/$DBVLANS
    sort $BASE/$DBVLANS -o /dev/shm/$$.vlans
    uniq /dev/shm/$$.vlans > $BASE/$DBVLANS
    echo -n "Ok. "
  fi
}

# Atualiza os detalhes da tabela de mac-address do switch. Devem ser passados o nome, ip, usuário, senha e senhaconfig como parâmetros.
atualiza_macs(){
  nome=$1
  ip=$2
  usuario=$3
  senha=$4
  senhaconfig=$5
  echo "enable" > /dev/shm/$$
  echo $senhaconfig >> /dev/shm/$$
  echo "terminal length 0" >> /dev/shm/$$
  echo "show mac address-table" >> /dev/shm/$$
  echo "end" >> /dev/shm/$$
  echo "exit" >> /dev/shm/$$
  echo -n "Mac Address: "
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip > $BASE/$nome.mac 2>/dev/null
  if [ $? -ne 0 ]
  then
    echo -n "Não consegui listar a tabela de endereços MAC."
  else
    grep -v ^$nome: $BASE/$DBMAC > /dev/shm/$$
    mv /dev/shm/$$ $BASE/$DBMAC
    egrep '([0-9a-f]{4}\.){2}[0-9a-f]{4}' $BASE/$nome.mac> /dev/shm/$$.$nome.mac
    linhas=`wc -l /dev/shm/$$.$nome.mac | cut -d" " -f1`
    for i in `seq $linhas`
    do
      linha=`head -$i /dev/shm/$$.$nome.mac | tail -1`
      vlan=`echo "$linha" | cut -c1-8`
      macaddress=`echo "$linha" | cut -c9-22`
      porta=`echo "$linha" | cut -c38- | cut -d" " -f2 | grep -v ','`
      echo $nome:$vlan:$macaddress:$porta >> /dev/shm/$$.mac2
    done
    cat /dev/shm/$$.mac2 >> $BASE/$DBMAC
    sort $BASE/$DBMAC | uniq > /dev/shm/$$.mac2
    mv /dev/shm/$$.mac2 $BASE/$DBMAC
    echo -n "Ok. "
  fi
}

# Atualiza os dados referentes aos IP e Mac conectados aos switchs. Devem ser passados o nome, ip, usuário, senha e senhaconfig como parâmetros.
atualiza_ip(){
  nome=$1
  ip=$2
  usuario=$3
  senha=$4
  senhaconfig=$5
  echo "terminal length 0" > /dev/shm/$$
  echo "show ip arp" >> /dev/shm/$$
  echo "exit" >> /dev/shm/$$
  echo -n "IPs: "
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip > $BASE/$nome.ip 2>/dev/null
  if [ $? -ne 0 ]
  then
    echo -n "Não consegui listar os IP conectados no equipamento."
  else
    egrep '([0-9a-f]{4}\.){2}[0-9a-f]{4}' $BASE/$nome.ip >/dev/shm/$$.$nome.ip
    linhas=`wc -l /dev/shm/$$.$nome.ip | cut -d" " -f1`
    for i in `seq $linhas`
    do
      linha=`head -$i /dev/shm/$$.$nome.ip | tail -1`
      ips=`echo "$linha" | cut -c11-27`
      macaddress=`echo "$linha" | cut -c39-53`
      echo $ips:$macaddress >> /dev/shm/$$.ip
    done
    sort /dev/shm/$$.ip | uniq >> $BASE/$DBIP
    sort $BASE/$DBIP | uniq > /dev/shm/$$.ip
    mv /dev/shm/$$.ip $BASE/$DBIP
    echo "Ok. "
  fi
}

# Atualiza os dados do servidor. Sempre passar o nome do switch como primeiro parâmetro.
atualiza_dados(){
  nome=$1
  ip=`grep ^$nome: $BASE/$DB | cut -d":" -f2`
  usuario=`grep ^$nome: $BASE/$DB | cut -d":" -f4`
  senha=`grep ^$nome: $BASE/$DB | cut -d":" -f5`
  senhaconfig=`grep ^$nome: $BASE/$DB | cut -d":" -f6`
  atualiza_conf $nome $ip $usuario $senha $senhaconfig
  atualiza_detalhes $nome $ip $usuario $senha $senhaconfig
  atualiza_portas $nome $ip $usuario $senha $senhaconfig
  atualiza_vlans $nome $ip $usuario $senha $senhaconfig
  atualiza_macs $nome $ip $usuario $senha $senhaconfig
  atualiza_ip $nome $ip $usuario $senha $senhaconfig
}

# Atualiza todos os dados do switch. Sempre deve ser passado o nome do switch como primeiro parâmetro.
atualizar(){
  if [ $1 == "todos" ]
  then
    for i in `cut -d":" -f1 $BASE/$DB`
    do
      atualiza_dados $i
    done
  else
    nome=$1
    atualiza_dados $nome
  fi
  rm /dev/shm/$$* 2>/dev/null
}

# Inclui um switch no sistema e coleta suas informações.
incluir(){
  echo -n "Nome do dispositivo :"
  read nome
  nome=`echo $nome | sed 's/ //g'`
  grep ^$nome: $BASE/$DB 2>/dev/null >/dev/null
  if [ $? -eq 0 ]
  then
    echo "Equipamento já cadastrado."
    read
  else
    echo -n "IP do dispositivo :"
    read ip
    echo -n "Descrição :"
    read descricao
    echo -n "Usuário para conexão :"
    read usuario
    echo -n "Senha de acesso :"
    read -s senha
    echo -n -e "\n"
    echo -n "Senha de acesso para configuração global :"
    read -s senhaglobal
    echo "$nome:$ip:$descricao:$usuario:$senha:$senhaglobal" >> $BASE/$DB
    sort $BASE/$DB -o $BASE/$DB
    atualizar $nome
    echo "Equipamento cadastrado."
    read
  fi
}

# Lista os switchs.
listar(){
  opcaolistar=a
  while [ $opcaolistar != "s" ]
  do
      linhas=`wc -l $BASE/$DB | cut -d" " -f1`
      for i in `seq $linhas`
      do
        echo -n $i" - "
        linha=`head -$i $BASE/$DB | tail -1 | cut -d":" -f1-3 --output-delimiter=" "`
        nome=`echo $linha | cut -d" " -f1`
        ip=`echo $linha | cut -d" " -f2`
        descricao=`echo $linha | cut -d" " -f3-`
        echo "$nome $ip $descricao"
      done
      echo -n -e "\n"
      echo "0 - Sair"
      echo -n -e "\n"
      echo -n "Digite a opção: "
      read opcaolistar
      case $opcaolistar in
        0)
          return
          ;;
        *)
          echo $opcaolistar | grep -e [a-z] 2>/dev/null >/dev/null
          if [ $? -eq 0 ]
          then
            return
          else
            nome=`head -$opcaolistar $BASE/$DB | tail -1 | cut -d":" -f1`
            listardetalhes $nome
          fi
          ;;
      esac
  done
}

# Acessa o switch. Deve-se passar o nome do switch 
acessar(){
  nome=$1
  ip=`grep ^$nome $BASE/$DB | cut -d":" -f2`
  usuario=`grep ^$nome $BASE/$DB | cut -d":" -f4`
  senha=`grep ^$nome $BASE/$DB | cut -d":" -f5`
  echo $senha > /dev/shm/$$.pass
  sshpass -f/dev/shm/$$.pass ssh $usuario@$ip
  rm /dev/shm/$$*   
}

# Copia uma VLAN para outros switchs. Precisa passar o id da VLAN como parâmetro.
copiavlan(){
  vlan=$1
  cont=1
  unset switch
  echo -n -e '\n'
  echo "0 - Todos"
  for i in `cut -d":" -f1  $BASE/$DB`
  do
    echo "$cont - $i"
    let cont=cont+1
  done
  echo -n -e '\n'
  echo "Digite "c" para cancelar."
  echo -n -e '\n'
  while [ -z $switch ]
  do
    echo -n "Para qual switch você quer copiar a VLAN?: "
    read switch
    echo $switch | grep -v '[[:punct:]]' | grep -v '[[:alpha:]]' 2>/dev/null >/dev/null
    if [ $? -ne 0 ]
    then
      break
    elif [ $switch -ge $cont ]
    then
      break
    fi
    case $switch in
      0)
        unset nomelocal
        vlanlocal=$vlan
        for i in `cut -d":" -f1 $BASE/$DB`
        do
          grep :$vlanlocal\ : $BASE/$DBVLANS | grep $i 2>/dev/null >/dev/null
          if [ $? -ne 0 ]
          then
            nomelocal=$nomelocal" "$i
          fi
        done
        ;;
      *)
        nomelocal=`cut -d":" -f1  $BASE/$DB | head -$switch | tail -1`
        ;;
    esac
    for i in $nomelocal
    do
      ip=`grep ^$i: $BASE/$DB | cut -d":" -f2`
      usuario=`grep ^$i: $BASE/$DB | cut -d":" -f4`
      senha=`grep ^$i: $BASE/$DB | cut -d":" -f5`
      senhaconfig=`grep ^$i: $BASE/$DB | cut -d":" -f6`
      nomevlan=`grep :$vlanlocal\ : $BASE/$DBVLANS | head -1 | cut -d":" -f3`
      criacaovlan $i $ip $usuario $senha $senhaconfig $vlanlocal $nomevlan
    done
  done
}

# Exclui um IP do switch. O nome do switch e a VLAN precisaM se passado como parâmetro.
excluirip(){
  nome=$1
  vlan=$2
  ip=`grep ^$nome: $BASE/$DB | cut -d":" -f2`
  usuario=`grep ^$nome: $BASE/$DB | cut -d":" -f4`
  senha=`grep $nome: $BASE/$DB | cut -d":" -f5`
  senhaconfig=`grep $nome: $BASE/$DB | cut -d":" -f6`
  echo $senha > /dev/shm/$$.pass
  echo "Apagando o IP da vlan $vlan no switch $nome."
  echo "terminal length 0" > /dev/shm/$$
  echo "enable" >> /dev/shm/$$
  echo "$senhaconfig" >> /dev/shm/$$
  echo "configure terminal" >> /dev/shm/$$
  echo "no interface vlan $vlan" >> /dev/shm/$$
  echo "exit" >> /dev/shm/$$
  echo "copy running-config startup-config" >> /dev/shm/$$
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip >/dev/null 2>/dev/null
  echo "O IP foi apagado"
  read
 atualiza_ip $nome $ip $usuario $senha $senhaconfig
}

# Altera os dados de uma VLAN de um switch. É necessário passar o nome do swtich e o número da VLAN como parâmetros.
alterarvlan(){
  nome=$1
  vlan=$2
  echo "A VLAN está presente nos seguintes switchs"
  echo -n -e "\n"
  grep $vlan $BASE/$DBVLANS | cut -d":" -f1
  echo -n -e '\n'
  echo "1 - Mudar a descrição"
  echo "2 - Excluir"
  echo "3 - Copiar a VLAN para outros switchs"
  echo "4 - Configurar um IP"
  echo "5 - Excluir um IP"
  echo -n -e '\n'
  echo "0 - Voltar"
  echo -n -e '\n'
  echo -n "Digite a opção :"
  read opcaoalteravlan
  case $opcaoalteravlan in
    1)
      echo -n "Digite o nome da VLAN :"
      read descricao
      if [ 1 != 1$descricao ]
      then
        if [ $nome == "todos" ]
        then
          unset nome
          for i in `grep :$vlan\ : $BASE/$DBVLANS | cut -d":" -f1`
          do
            nome="$nome$i "
          done
        fi
        vlanlocal=$vlan
        descricaolocal=$descricao
        for i in $nome
        do
          echo $i
          ip=`grep ^$i: $BASE/$DB | cut -d":" -f2`
          usuario=`grep ^$i: $BASE/$DB | cut -d":" -f4`
          senha=`grep ^$i: $BASE/$DB | cut -d":" -f5`
          senhaconfig=`grep ^$i: $BASE/$DB | cut -d":" -f6`   
          echo $senha > /dev/shm/$$.pass
          echo "enable" > /dev/shm/$$
          echo $senhaconfig >> /dev/shm/$$
          echo "configure terminal" >> /dev/shm/$$
          echo "vlan $vlanlocal" >> /dev/shm/$$
          echo "name $descricaolocal" >> /dev/shm/$$
          echo "end" >> /dev/shm/$$
          echo "copy running-config startup-config" >>/dev/shm/$$
          echo "" >>/dev/shm/$$
          echo "exit" >> /dev/shm/$$
          cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip >/dev/null 2>/dev/null
          echo -n -e '\n'
          echo "Descrição alterada."
          linha=`grep -n ^$i: $BASE/$DB | cut -d":" -f1`
          atualiza_vlans $i $ip $usuario $senha $senhaconfig
          echo -n -e '\n'
        done
        rm /dev/shm/$$*
      fi
      ;;
    2)
      if [ $nome == "todos" ]
      then
        unset nome
        for i in `grep :$vlan\ : $BASE/$DBVLANS | cut -d":" -f1`
        do
          nome="$nome$i "
        done
      fi
      vlanlocal=$vlan
      for i in $nome
      do
        echo -n -e '\n'
        echo $i
        ip=`grep ^$i: $BASE/$DB | cut -d":" -f2`
        usuario=`grep ^$i: $BASE/$DB | cut -d":" -f4`
        senha=`grep ^$i: $BASE/$DB | cut -d":" -f5`
        senhaconfig=`grep ^$i: $BASE/$DB | cut -d":" -f6`   
        echo $senha > /dev/shm/$$.pass
        echo "enable" > /dev/shm/$$
        echo $senhaconfig >> /dev/shm/$$
        echo "terminal length 0" >> /dev/shm/$$
        echo "configure terminal" >> /dev/shm/$$
        echo "no vlan $vlanlocal" >> /dev/shm/$$
        echo "end" >> /dev/shm/$$
        echo "copy running-config startup-config" >>/dev/shm/$$
        echo "" >>/dev/shm/$$
        echo "exit" >> /dev/shm/$$
        cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip >/dev/null 2>/dev/null
        echo -n -e '\n'
        echo "VLAN $vlanlocal excluída"
        grep -v ^$i:$vlanlocal\ : $BASE/$DBVLANS | sort -o $BASE/$DBVLANS
        atualiza_vlans $i $ip $usuario $senha $senhaconfig
      done
      rm /dev/shm/$$*
      ;;
    3)
      copiavlan $vlan
      ;;
    4)
      echo -n "Digite o IP: "
      read iplocal
      echo $iplocal | sed 's/\.//g' | grep -v '[[:punct:]]' | grep -v '[[:alpha:]]' 2>/dev/null >/dev/null
      if [ $? -ne 0 ] 
      then
        echo "IP inválido."
      else
        erro=0
        for i in `echo $iplocal | sed 's/\./ /g'`
        do
          if [ $i -lt 0 ] && [ $i -gt 255 ]
          then
            erro=1
          fi
        done
        if [ $erro -eq 1 ] 2>/dev/null >/dev/null
        then
          echo "O IP é inválido."
        else
          echo -n "Digite a máscara de rede (255.255.255.0=24; 255.255.0.0=16, etc): "
          read mascara
          echo $mascara | sed 's/\.//g' | grep -v '[[:punct:]]' | grep -v '[[:alpha:]]' 2>/dev/null >/dev/null
          if [ $? -ne 0 ] || [ $mascara -lt 0 ] || [ $mascara -gt 32 ]
          then
            echo "Máscara de rede inválida."
          else
            configuraip $nome $vlan $iplocal $mascara
          fi
        fi
      fi
      read
      ;;
    5)
      excluirip $nome $vlan
      ;;
    *)
      return
      ;;
  esac
}

# Apenas listas as VLANs de um swithc. O nome do switch deve ser passado como parâmetro.
listarvlanswitch(){
  nome=$1
  echo -n -e '\n'
  linhas=`grep ^$nome: $BASE/$DBVLANS | wc -l`
  for i in `seq $linhas`
  do
    vlan=`grep ^$nome: $BASE/$DBVLANS | head -$i | tail -1 | cut -d":" -f2`
    desc=`grep ^$nome: $BASE/$DBVLANS | head -$i | tail -1 | cut -d":" -f3`
    echo "$vlan - $desc"
  done
  echo -n -e '\n'
}

# Lista as VLANs existentes no switch. É necessário passar o nome do switch como parâmetro.
listarvlans(){
  nome=$1
  listarvlanswitch $nome
  echo "0 - Voltar"
  echo -n -e '\n'
  echo -n "Qual vlan você quer alterar? :"
  read opcaovlan
  if [ $opcaovlan -ne 0 ]
  then
    alterarvlan $nome $opcaovlan
  fi
}

# Habilita mais uma VLAN em uma interface de acesso. Precisa passar como parâmetro o nome do switch, o nome da interface e o id da VLAN
habilitavlanacesso(){
  nome=$1
  interface=$2
  vlan=$3
  echo -n "Esta é uma VLAN de VOiP?: "
  read voip
  echo "Vou configura a interface $interface do switch $nome na VLAN $vlan"
  ip=`grep ^$nome: $BASE/$DB | cut -d":" -f2`
  usuario=`grep ^$nome: $BASE/$DB | cut -d":" -f4`
  senha=`grep $nome: $BASE/$DB | cut -d":" -f5`
  senhaconfig=`grep $nome: $BASE/$DB | cut -d":" -f6`
  echo $senha > /dev/shm/$$.pass
  echo "terminal length 0" > /dev/shm/$$
  echo "enable" >> /dev/shm/$$
  echo $senhaconfig >>/dev/shm/$$
  echo "configure terminal" >>/dev/shm/$$
  echo "interface $interface" >>/dev/shm/$$
  if [ $voip == "s" ] || [ $voip ==  "S" ]
  then
    echo "switchport voice vlan $vlan" >>/dev/shm/$$
  else
    echo "switchport access vlan $vlan" >>/dev/shm/$$
  fi
  echo "end" >>/dev/shm/$$
  echo "copy running-config startup-config" >>/dev/shm/$$
  echo "" >>/dev/shm/$$
  echo "exit" >> /dev/shm/$$
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip >/dev/shm/$$.trunk 2>/dev/null
}

# Habilita mais uma VLAN em uma interface em trunk. Precisa passar como parâmetro o nome do switch, o nome da interface e o id da VLAN
habilitavlantrunk(){
  nome=$1
  interface=$2
  vlan="$3"
  echo "terminal length 0" > /dev/shm/$$
  echo "enable" >> /dev/shm/$$
  echo $senhaconfig >>/dev/shm/$$
  echo "configure terminal" >>/dev/shm/$$
  echo "interface $interface" >>/dev/shm/$$
  echo "switchport trunk allowed vlan $vlan" >>/dev/shm/$$
  echo "end" >>/dev/shm/$$
  echo "copy running-config startup-config" >>/dev/shm/$$
  echo "" >>/dev/shm/$$
  echo "exit" >> /dev/shm/$$
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip >/dev/shm/$$.trunk 2>/dev/null
  atualiza_portas $nome $ip $usuario $senha $senhaconfig
}

# Altera a descrição de uma interface de rede. O nome do switch, a interface e a nova descrição devem ser passados como parâmetros.
alteradescricao(){
  nomelocal=$1
  interface=$2
  descricao="$3"
  echo "Vou alterar a descrição da interface $interface do switch $nomelocal para $descricao."
  ip=`grep ^$nomelocal: $BASE/$DB | cut -d":" -f2`
  usuario=`grep ^$nomelocal: $BASE/$DB | cut -d":" -f4`
  senha=`grep $nomelocal: $BASE/$DB | cut -d":" -f5`
  senhaconfig=`grep $nomelocal: $BASE/$DB | cut -d":" -f6`
  echo $senha >/dev/shm/$$.pass
  echo "enable" >/dev/shm/$$
  echo $senhaconfig >>/dev/shm/$$
  echo "terminal length 0" >>/dev/shm/$$
  echo "configure terminal" >>/dev/shm/$$
  echo "interface $interface" >>/dev/shm/$$
  echo "description $descricao" >>/dev/shm/$$
  echo "end" >>/dev/shm/$$
  echo "copy running-config startup-config" >>/dev/shm/$$
  echo "" >>/dev/shm/$$
  echo "exit" >> /dev/shm/$$
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip >/dev/shm/$$.trunk 2>/dev/null
  read
}

# Configura um endereço IPv4 na VLAN do switch. O nome do Switch, a VLAN, o IP e a máscara de rede precisam ser passados como parâmetros.
configuraip(){
  nomelocal=$1
  vlan=$2
  ip=$3
  case $4 in
    0)  mascara=0.0.0.0 ;;
    1)  mascara=128.0.0.0 ;;
    2)  mascara=192.0.0.0 ;;
    3)  mascara=224.0.0.0 ;;
    4)  mascara=240.0.0.0 ;;
    5)  mascara=248.0.0.0 ;;
    6)  mascara=252.0.0.0 ;;
    7)  mascara=254.0.0.0 ;;
    8)  mascara=255.0.0.0 ;;
    9)  mascara=255.128.0.0 ;;
    10) mascara=255.192.0.0 ;;
    11) mascara=255.224.0.0 ;;
    12) mascara=255.240.0.0 ;;
    13) mascara=255.248.0.0 ;;
    14) mascara=255.252.0.0 ;;
    15) mascara=255.254.0.0 ;;
    16) mascara=255.255.0.0 ;;
    17) mascara=255.255.128.0 ;;
    18) mascara=255.255.192.0 ;;
    19) mascara=255.255.224.0 ;;
    20) mascara=255.255.240.0 ;;
    21) mascara=255.255.248.0 ;;
    22) mascara=255.255.252.0 ;;
    23) mascara=255.255.254.0 ;;
    24) mascara=255.255.255.0 ;;
    25) mascara=255.255.255.128 ;;
    26) mascara=255.255.255.192 ;;
    27) mascara=255.255.255.224 ;;
    28) mascara=255.255.255.240 ;;
    29) mascara=255.255.255.248 ;;
    30) mascara=255.255.255.252 ;;
    31) mascara=255.255.255.254 ;;
    32) mascara=255.255.255.255 ;;
  esac  
  echo -n -e '\n'
  echo "Vou configurar o ip $ip/$mascara na VLAN $vlan do switch $nomelocal"
  iplocal=`grep ^$nomelocal: $BASE/$DB | cut -d":" -f2`
  usuario=`grep ^$nomelocal: $BASE/$DB | cut -d":" -f4`
  senha=`grep $nomelocal: $BASE/$DB | cut -d":" -f5`
  senhaconfig=`grep $nomelocal: $BASE/$DB | cut -d":" -f6`
  echo $senha >/dev/shm/$$.pass
  echo "enable" >/dev/shm/$$
  echo $senhaconfig >>/dev/shm/$$
  echo "terminal length 0" >>/dev/shm/$$
  echo "configure terminal" >>/dev/shm/$$
  echo "interface vlan$vlan" >>/dev/shm/$$
  echo "ip address $ip $mascara" >>/dev/shm/$$
  echo "end" >> /dev/shm/$$
  echo "copy running-config startup-config" >>/dev/shm/$$
  echo "" >>/dev/shm/$$
  echo "exit" >> /dev/shm/$$
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$iplocal >/dev/shm/$$ 2>/dev/null
  atualiza_ip $nomelocal $iplocal $usuario $senha $senhaconfig
}

#Mostra informações de uma interface de rede de um switch. É necessário passar no nome do switch e a interface como parâmetros
showinterface(){
  nomelocal=$1
  interface=$2
  iplocal=`grep ^$nomelocal: $BASE/$DB | cut -d":" -f2`
  usuario=`grep ^$nomelocal: $BASE/$DB | cut -d":" -f4`
  senha=`grep $nomelocal: $BASE/$DB | cut -d":" -f5`
  echo $senha >/dev/shm/$$.pass
  echo "show interface $interface" >/dev/shm/$$
  echo "exit" >> /dev/shm/$$
  cat /dev/shm/$$
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$iplocal | more
}

# Administra uma interface do switch. É necessário passar o nome do switch e o nome da interface
adminterfaces(){
  nomelocal=$1
  interfacelocal=$2
  unset opcao
  echo -n -e "\n"
  echo -e "Switch: $nomelocal" '\t' "Interface: $interfacelocal"
  echo -n -e "\n"
  echo "1 - Incluir em uma VLAN"
  echo "2 - Excluir de uma VLAN"
  echo "3 - Derrubar a interface"
  echo "4 - Levantar a interface"
  echo "5 - Alterar a descrição"
  echo "6 - Mais informações"
  echo -n -e "\n"
  echo -n "Digite a opção (0 para cancelar): "
  read opcao
  case $opcao in
    1)
      listarvlanswitch $nomelocal
      echo -n "Digite a VLAN :"
      read opcaovlan
      grep ^$nomelocal:$opcaovlan\ : $BASE/$DBVLANS >/dev/null
      if [ $? -eq 0 ]
      then
        grep ^$nomelocal:$interfacelocal\ : $BASE/$DBPORTAS | grep trunk >/dev/null
        if [ $? -eq 0 ]
        then
          echo "Vou configura a interface $interface do switch $nome na(s) VLAN(s) $vlan"
          ip=`grep ^$nomelocal: $BASE/$DB | cut -d":" -f2`
          usuario=`grep ^$nomelocal: $BASE/$DB | cut -d":" -f4`
          senha=`grep $nomelocal: $BASE/$DB | cut -d":" -f5`
          senhaconfig=`grep $nomelocal: $BASE/$DB | cut -d":" -f6`
          echo $senha > /dev/shm/$$.pass
          echo "terminal length 0" > /dev/shm/$$
          echo "show interface $interfacelocal trunk | begin Vlan" >> /dev/shm/$$
          echo "exit" >> /dev/shm/$$
          cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip >/dev/shm/$$.trunk 2>/dev/null
          vlanlocal=`head -4 /dev/shm/$$.trunk | tail -1 | awk '{print $2}'`
          echo $vlanlocal | grep none >/dev/null
          if [ $? -eq 0 ]
          then
            echo $opcaovlan
          else
            opcaovlan="$opcaovlan,$vlanlocal"
          fi
          habilitavlantrunk $nomelocal $interfacelocal $opcaovlan
        else
          habilitavlanacesso $nomelocal $interfacelocal $opcaovlan
        fi
      fi
      atualiza_portas $nomelocal $ip $usuario $senha $senhaconfig
      ;;
    2)
      grep ^$nomelocal:$interfacelocal $BASE/$DBPORTAS | grep trunk >/dev/null
      if [ $? -eq 0 ]
      then
        ip=`grep ^$nomelocal: $BASE/$DB | cut -d":" -f2`
        usuario=`grep ^$nomelocal: $BASE/$DB | cut -d":" -f4`
        senha=`grep $nomelocal: $BASE/$DB | cut -d":" -f5`
        senhaconfig=`grep $nomelocal: $BASE/$DB | cut -d":" -f6`
        echo $senha > /dev/shm/$$.pass
        echo "terminal length 0" > /dev/shm/$$
        echo "show interface $interfacelocal trunk | begin Vlan" >> /dev/shm/$$
        echo "exit" >> /dev/shm/$$
        cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip >/dev/shm/$$.trunk 2>/dev/null
        for i in `head -4 /dev/shm/$$.trunk | tail -1 | awk '{print $2}' | sed 's/,/ /g' `
        do
          grep ^$nomelocal:$i\ : $BASE/$DBVLANS | cut -d":" -f2-
        done
        echo -n -e "\n"
        echo -n "Qual VLAN você quer excluir da interface? (0 para cancelar): "
        read opcao
        if [ $opcao -eq 0 ]
        then
          return
        fi
        echo "Vou retirar a VLAN $opcao."
        unset x
        for i in `strings /dev/shm/$$.trunk | head -4 | tail -1 | awk '{print $2}' | sed 's/,/ /g'`
        do
          if [ $i -ne $opcao ]
          then
            x="$x $i"
          fi
        done
        echo $x
        read 
        habilitavlantrunk $nomelocal $interfacelocal "$x"
      else
        echo "Esta interface não está em trunk."
      fi
      atualiza_portas $nomelocal $ip $usuario $senha $senhaconfig
      ;;
    3|4)
      ip=`grep $nomelocal $BASE/$DB | cut -d":" -f2`
      usuario=`grep $nomelocal $BASE/$DB | cut -d":" -f4`
      senha=`grep $nomelocal $BASE/$DB | cut -d":" -f5`
      senhaconfig=`grep $nomelocal $BASE/$DB | cut -d":" -f6`
      echo "Alterando o status da porta."
      echo $senha > /dev/shm/$$.pass
      echo "enable" > /dev/shm/$$
      echo $senhaconfig >> /dev/shm/$$
      echo "terminal length 0" >> /dev/shm/$$
      echo "configure terminal" >> /dev/shm/$$
      echo "interface $interfacelocal" >> /dev/shm/$$
      if [ $opcao -eq 3 ]
      then
        echo "shutdown" >> /dev/shm/$$
      else
        echo "no shutdown" >> /dev/shm/$$
      fi
      echo "end" >> /dev/shm/$$
      echo "copy running-config startup-config" >>/dev/shm/$$
      echo "" >>/dev/shm/$$
      echo "exit" >> /dev/shm/$$
      cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip >/dev/null 2>/dev/null
      echo "Porta alterada."
      read
      atualiza_portas $nomelocal $ip $usuario $senha $senhaconfig
      ;;
    5)
      echo -n "Digite a descrição para a interface $interfacelocal (0 para cancelar): "
      read descricao
      if [ "$descricao" != "0" ]
      then
        alteradescricao $nomelocal $interfacelocal "$descricao"
        atualiza_portas $nomelocal $ip $usuario $senha $senhaconfig
      fi
      ;;
    6)
      showinterface $nomelocal $interfacelocal
      read
      ;;
    *)
      return
      ;;
  esac
  rm /dev/shm/$$*
}

# Lista as interfaces do switch. É necessário passar o nome do switch como parâmetro.
listarinterfaces(){
  nomelocal=$1
  unset interfacelocal
  echo -e "Switch"  '\t' "Porta" '\t' "Descrição" '\t' "Situação" '\t' "VLAN"
  grep ^$nomelocal $BASE/$DBPORTAS >/dev/shm/$$
  linhas=`wc -l /dev/shm/$$ | cut -d" " -f1`
  for i in `seq $linhas`
  do
    echo -n "$i - "
    head -$i /dev/shm/$$ | tail -1
  done
  echo -n -e "\n"
  while [ -z $interfacelocal ]
  do
    echo -n "Digite a interface (0 para sair): "
    read interfacelocal
  done
  if [ $interfacelocal != "0" ]
  then
    echo $interfacelocal | grep -v '[[:punct:]]' | grep -v '[[:alpha:]]' 2>/dev/null >/dev/null
    if [ $? -eq 0 ]
    then
      if [ $interfacelocal -le $linhas ] && [ $interfacelocal -gt 0 ]
      then
        interfacelocal=`head -$interfacelocal /dev/shm/$$ | tail -1 | cut -d":" -f2`
        adminterfaces $nomelocal $interfacelocal
      fi
    fi
  fi
  echo -n -e "\n"
}

# Altera os dados de um switch já cadastrado. O nome do equipamento deve ser passado como parâmetro.
alterarswitch(){
  nome=$1
  ip=`grep ^$nome: $BASE/$DB | cut -d":" -f2`
  descricao=`grep ^$nome: $BASE/$DB | cut -d":" -f3`
  usuario=`grep ^$nome: $BASE/$DB | cut -d":" -f4`
  echo -n "Nome do dispositivo ($nome):"
  read nomelocal
  if [ "a"$nomelocal != "a" ]
  then
    nomeantigo=$nome
    nome=$nomelocal
    grep ^$nome: $BASE/$DB 2>/dev/null >/dev/null
    if [ $? -eq 0 ]
    then
      echo "Esse nome de equipamento já existe no cadastrado."
      read
      return
    fi
  fi
  echo -n "IP do dispositivo ($ip): "
  read iplocal
  if [ "a"$iplocal != "a" ]
  then
    ip=$iplocal
  fi
  echo -n "Descrição ($descricao): "
  read descricaolocal
  if [ "a"$descricaolocal != "a" ]
  then
    descricao=$descricaolocal
  fi
  echo -n "Usuário para conexão ($usuario): "
  read usuariolocal
  if [ "a"$usuariolocal != "a" ]
  then
    usuario=$usuariolocal
  fi
  echo -n "Senha de acesso : "
  read -s senha
  echo -n -e "\n"
  echo -n "Senha de acesso para configuração global :"
  read -s senhaglobal
  grep -v ^$nomeantigo: $BASE/$DB | sort -o $BASE/$DB
  echo "$nome:$ip:$descricao:$usuario:$senha:$senhaglobal" >> $BASE/$DB
  echo -n -e "\n"
  sort $BASE/$DB -o $BASE/$DB
  sed s/$nomeantigo:/$nome:/ $BASE/$DBDETALHES | sort -o $BASE/$DBDETALHES
  sed s/$nomeantigo:/$nome:/ $BASE/$DBMAC | sort -o $BASE/$DBMAC
  sed s/$nomeantigo:/$nome:/ $BASE/$DBPORTAS | sort -o $BASE/$DBPORTAS
  sed s/$nomeantigo:/$nome:/ $BASE/$DBVLANS | sort -o $BASE/$DBVLANS
  echo "Equipamento atualizado."
  read
}

# Lista dos detalhes de um switch. Deve-se passar o nome do swtich como parâmetro
listardetalhes(){
  opcaoexec=a
  while [ $opcaoexec != "s" ]
  do
    nome="$1"
    linha=`grep ^$nome: $BASE/$DBDETALHES`
    hostname=`grep hostname $BASE/$nome | cut -d" " -f2`
    rom=`echo $linha | tail -1 | cut -d":" -f2`
    uptime=`echo $linha | tail -1 | cut -d":" -f3`
    cpu=`echo $linha | tail -1 | cut -d":" -f4`
    ethernet=`echo $linha | tail -1 | cut -d":" -f5`
    giga=`echo $linha | tail -1 | cut -d":" -f6`
    ten=`echo $linha | tail -1 | cut -d":" -f7`
    ram=`echo $linha | tail -1 | cut -d":" -f8`
    vlan=`grep ^$nome: $BASE/$DBVLANS | wc -l`
    echo "Nome do equipamento:                       $hostname"
    echo "Versão da ROM :                            $rom"
    echo "A quanto tempo está ligado:                $uptime"
    echo "Tipo de CPU:                               $cpu"
    echo "Quantidade de VLANs:                       $vlan"
    echo "Quantidade de interfaces Fast Ethernet:    $ethernet"
    echo "Quantidade de interfaces Giga Ethernet:    $giga"
    echo "Quantidade de interfaces 10 Giga Ethernet: $ten"
    echo "Memória Ram:                               $ram"
    echo -n -e "\n"
    echo "1 - Acessar"
    echo "2 - Atualizar"
    echo "3 - Listar VLANs"
    echo "4 - Criar VLAN"
    echo "5 - Listar interfaces"
    echo "6 - Alterar informações de acesso"
    echo "7 - Exclui"
    echo -n -e "\n"
    echo "0 - Sair"
    echo -n -e "\n"
    echo -n "Digite a opção: "
    read opcaoexec
    echo $opcaoexec | grep -e [a-z] 2>/dev/null >/dev/null
    case $opcaoexec in
      1)
        acessar $nome
        ;;
      2)
        atualizar $nome
        ;;
      3)
        listarvlans $nome
        ;;
      4)
        criarvlan $nome
        ;;
      5)
        listarinterfaces $nome
        ;;
      6)
        alterarswitch $nome
        ;;
      7)  
        excluir $nome
        read
        return
        ;;
      *)
        return
        ;;
    esac
  done
}

# Exclui um dispostivo.
excluir(){
  x=a$1
  if [ $x == "a" ]
  then
    echo -n -e "\n"
    cont=1
    for i in `cut -d":" -f1 $BASE/$DB`
    do
      echo "$cont - $i"
      let cont=$cont+1
    done
    echo -n -e "\n"
    echo "0 - Cancelar"
    echo -n -e "\n"
    echo -n "Qual equipamento você quer excluir? :"
    read excluir
  else
    excluir=`grep -n ^$nome: $BASE/$DB | cut -d":" -f1`
  fi
    if [ $excluir -ne 0 ]
    then
      erro=0
      equipamento=`head -$excluir $BASE/$DB | tail -1 | cut -d":" -f1 `
      grep -v ^$equipamento $BASE/$DB > /dev/shm/$$
      mv /dev/shm/$$ $BASE/$DB
      grep -v ^$equipamento $BASE/$DBDETALHES > /dev/shm/$$
      mv /dev/shm/$$ $BASE/$DBDETALHES
      grep -v ^$equipamento $BASE/$DBPORTAS > /dev/shm/$$
      mv /dev/shm/$$ $BASE/$DBPORTAS
      grep -v ^$equipamento $BASE/$DBVLANS > /dev/shm/$$
      mv /dev/shm/$$ $BASE/$DBVLANS
      grep -v ^$equipamento $BASE/$DBMAC > /dev/shm/$$
      mv /dev/shm/$$ $BASE/$DBMAC
      rm $BASE/$equipamento $BASE/$equipamento.*
      echo -n -e "\n"
      echo "Equipamento excluído."
  fi
}

# Cria uma VLAN. É necessário passar o nome, ip, usuário, senha, senha de config do switch, id e nome da VLAN
criacaovlan(){
  nome=$1
  ip=$2
  usuario=$3
  senha=$4
  senhaconfig=$5
  id=$6
  vlan=$7
  echo "$senha" >/dev/shm/$$.pass
  echo "terminal length 0" >/dev/shm/$$
  echo "enable" >>/dev/shm/$$
  echo "$senhaconfig" >>/dev/shm/$$
  echo "configure terminal" >>/dev/shm/$$
  echo "vlan $id" >>/dev/shm/$$
  echo "name $vlan" >>/dev/shm/$$
  echo "copy running-config startup-config" >>/dev/shm/$$
  echo "" >>/dev/shm/$$
  echo "exit" >> /dev/shm/$$
  cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip >/dev/null 2>/dev/null
  echo -n -e '\n'
  echo "VLAN criada."
  atualiza_vlans $nome $ip $usuario $senha $senhaconfig
  rm /dev/shm/$$*
}

# Criar uma VLAN no switch especificado. Precisa passar o nome do equipamento como parâmetro
criarvlan(){
  echo -n -e '\n'
  echo -n "Digite o ID da VLAN: "
  read id
  echo $id | grep -v '[[:punct:]]' | grep -v '[[:alpha:]]' 2>/dev/null >/dev/null
  if [ $? -ne 0 ]
  then
    echo "O ID precisa ser um número inteiro."
    read
  elif [ -z $id ]
  then
    return
  elif [ $id -lt 2 ] || [ $id -gt 4098 ]
  then
    echo "O ID é inválido"
    read
  else
    grep :$id\ : $BASE/$DBVLANS | grep -v ^$nome2 >/dev/null >/dev/null
    if [ $? -ne 0 ]
    then
      echo -n "Digite o nome da VLAN :"
      read nomevlan
      if [ -z $nomevlan ]
      then
        nomevlan="VLAN$id"
      fi
      ip=`grep ^$nome: $BASE/$DB | cut -d":" -f2`
      usuario=`grep ^$nome: $BASE/$DB | cut -d":" -f4`
      senha=`grep ^$nome: $BASE/$DB | cut -d":" -f5`
      senhaconfig=`grep ^$nome: $BASE/$DB | cut -d":" -f6`
      criacaovlan $nome $ip $usuario $senha $senhaconfig $id $nomevlan
      read
    else
      echo "A VLAN já existe."
      read
    fi
  fi
}

# Mostra a quantidade de equipamento em cada VLAN.
vlans(){
  somaportas=0
  somahosts=0
  echo -e Vlan '\t' Nome '\t\t' Portas'  'Hosts
  for i in `cut -d":" -f2 $BASE/$DBVLANS | sort -n | uniq`
  do
    desc=`grep :$i\ : $BASE/$DBVLANS | cut -d":" -f3- | head -1 | sed 's/://g'`
    portas=`cut -d":" -f5 $BASE/$DBPORTAS | grep ^$i$ | wc -l`
    hosts=`grep " $i " $BASE/$DBMAC | cut -d":" -f3 | sort | uniq | wc -l`
    echo -e $i '\t' $desc '\t' $portas '\t '$hosts
    let somahosts=$somahosts+$hosts
    let somaportas=$somaportas+$portas
  done
  echo -n -e '\n'
  echo -e '\t 'Portas = $somaportas '\t' Hosts = $somahosts
  echo -n -e "\n"
  echo "Opções"
  echo -n -e "\n"
  echo "0 - Sair"
  echo "Digite o número da VLAN para alterá-la."
  echo -n -e "\n"
  echo -n "Digite a opção: "
  read opcaovlan
  case $opcaovlan in
    0)
      echo "Você escolheu sair"
      ;;
    *)
      alterarvlan todos $opcaovlan
      ;;
  esac
}

# Mostra em qual porta de qual switch um determinado IP está, e permite derrubar a porta.
mac(){
  echo -n -e "\n"
  while [ -n $ip ]
  do
    echo -n "Digite o endereço IP (0 para cancelar): "
    read ip
    if [ -z $ip ]
    then
      ip=0
    elif [ $ip == "0" ]
    then
      return
    else
      break
    fi
  done
  mac=`grep $ip\ : $BASE/$DBIP | cut -d":" -f2 | head -1`
  if [ -z $mac ]
  then
    echo "Não encontrei o ip solicitado"
    read
    return
  fi
  linhas=`grep -i $mac $BASE/$DBMAC | wc -l`
  if [ $linhas -ne 0 ]
  then
    echo -n -e "\n"
    echo -e Switch '\t' VLAN '\t' Porta
    for i in `seq $linhas`
    do
      switch=`grep -i $mac $BASE/$DBMAC | head -$i | tail -1 | cut -d":" -f1`
      vlan=`grep -i $mac $BASE/$DBMAC | head -$i | tail -1 | cut -d":" -f2`
      porta=`grep -i $mac $BASE/$DBMAC | head -$i | tail -1 | cut -d":" -f4-`
      prob=`grep "$porta" $BASE/$DBMAC | wc -l` 
      echo -e $prob' '$i' '$switch' '$vlan' '$porta >> /dev/shm/$$
    done
    sort -n /dev/shm/$$ | head -1 | awk '{print $3"\t"$4"\t"$5}'
    echo -n -e "\n"
    echo -n "Devo derrubar a porta? : (s/n)"
    read opcaomac
    if [ $opcaomac == "s" ] || [ $opcao == "S" ]
    then
      switch=`sort -n /dev/shm/$$ | cut -d" " -f3 | head -1`
      porta=`sort -n /dev/shm/$$ | cut -d" " -f5 | head -1`
      ip=`grep $switch $BASE/$DB | cut -d":" -f2`
      usuario=`grep $switch $BASE/$DB | cut -d":" -f4`
      senha=`grep $switch $BASE/$DB | cut -d":" -f5`
      senhaconfig=`grep $switch $BASE/$DB | cut -d":" -f6`
      echo "Derrubando a porta."
      echo $senha > /dev/shm/$$.pass
      echo "enable" > /dev/shm/$$
      echo $senhaconfig >> /dev/shm/$$
      echo "terminal length 0" >> /dev/shm/$$
      echo "configure terminal" >> /dev/shm/$$
      echo "interface $porta" >> /dev/shm/$$
      echo "shutdown" >> /dev/shm/$$
      echo "end" >> /dev/shm/$$
      echo "copy running-config startup-config" >>/dev/shm/$$
      echo "" >>/dev/shm/$$
      echo "exit" >> /dev/shm/$$
      cat /dev/shm/$$ | sshpass -f/dev/shm/$$.pass ssh $usuario@$ip >/dev/null 2>/dev/null
      echo "Porta derrubada."
      read
      rm /dev/shm/$$*
    else
      echo -n -e "\n"
    fi
  else
    echo "Não encontrei o MAC solicitado."
    read
  fi
}

# Inicio do programa
# Menu principal
opcao=9
checa_arquivos
while [ $opcao -ne 0 ]
do
  echo -n -e "\n"
  echo "Total de equipamento cadastrados: "`wc -l $BASE/$DB | cut -d" " -f1`
  echo "Total de VLANS: "`cut -d":" -f2 $BASE/$DBVLANS | sort | uniq | wc -l`
  echo "Total de portas: "`wc -l $BASE/$DBPORTAS | cut -d" " -f1`
  echo "Total de portas em up : "`grep connect $BASE/$DBPORTAS | grep -v notconnect | wc -l`
  echo "Total de portas em down (sem cabo) : "`grep notconnect $BASE/$DBPORTAS | wc -l`
  echo "Total de portas inativas (sem configuração) : "`grep inactive $BASE/$DBPORTAS | wc -l`
  echo "Total de portas desabilitadas (shutdown) : "`grep disabled $BASE/$DBPORTAS | grep -v err-disabled | wc -l`
  echo "Total de portas com erro : "`grep err-disabled $BASE/$DBPORTAS | wc -l`
  echo "Total de portas em trunk : "`grep trunk $BASE/$DBPORTAS | wc -l`
  echo "Total de portas de acesso : "`grep -v trunk $BASE/$DBPORTAS | wc -l`
  echo "Total de dispositivo : "`cut -d":" -f3 $BASE/$DBMAC | sort | uniq | wc -l`
  echo -n -e "\n"
  echo "1 - Incluir dispositivos"
  echo "2 - Excluir dispositivos"
  echo "3 - Listar dispositivos"
  echo "4 - Atualizar banco de dados"
  echo "5 - Consulta de mac-address"
  echo "6 - VLANS"
  echo "0 - Sair"
  echo -n -e "\n"
  echo -n "Digite a opção: "
  read opcao
  echo $opcao | grep -e [a-z] 2>/dev/null >/dev/null
  if [ $? -eq 0 ]
  then
    opcao=0
  else
    case $opcao in
      1)
        incluir
        ;;
      2)
        excluir
        ;;
      3)
        listar
        ;;
      4)
   atualizar todos
   ;;
      5)
        mac
        ;;
      6)
        vlans
      ;;
      *)
   ;;
    esac
  fi
done

Scripts recomendados

Space invaders

Backup individual de contas no ZIMBRA MAIL

Script para criação de pacote rpm.

Bloquear ataques DDoS com bloqueio de range de IPs e avisar por e-mail

Filtrando trabalhos de impressão...


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts