Administração de switch Cisco

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

[ Hits: 6.064 ]

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

script para travar usuario discado

Gerenciamento de clientes com cbq,squid e firewall no kurumin.

Script Firewall - Regras do Iptables

Scritp de Firewall com Iptables

Achar IP válido


  

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