return render_to_response( ’tela_principal.html’, locals(), context_instance=RequestContext(request), )
D.3
Configuração do arquivo core
Dentro da subpasta core, ficam armazenados os arquivos específicos de configuração dos switches que o software é capaz de configurar assim como o arquivo que executa funções do framework PySNMP.
O arquivo abaixo é o de configuração do PySNMP dentro da pasta core: #Código arquivo views_snmp.py
# -*- coding: utf-8 -*-
import string
from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.proto import rfc1902
def func_string_tuple(numero):
’’’
Função que recebe uma string de oid e retorna uma tupla.
Ex: "1.6.1.3.2.2" -> (1,6,1,3,2,2)
’’’
aux = numero.split(’.’)
def get_cmd(address,oid):
’’’
Função que recebe duas strings, a primeira do endereco do
dispositivo e outra do oid e retorna o valor
’’’
errorIndication, errorStatus, errorIndex, varBinds =
cmdgen.CommandGenerator().getCmd( cmdgen.CommunityData(’my-agent’, ’public’, 0), cmdgen.UdpTransportTarget((address, 161)), func_string_tuple(oid) ) return varBinds
def next_cmd(address,oid, comunidade_escrita):
’’’
Função que recebe duas strings, a primeira do endereco
do dispositivo e outra do oid e retorna uma tabela de valores
’’’
errorIndication, errorStatus, errorIndex, varBindTable =
cmdgen.CommandGenerator().nextCmd( cmdgen.CommunityData(’my-agent’, comunidade_escrita, 1), cmdgen.UdpTransportTarget((address, 161)), func_string_tuple(oid) ) print errorIndication print errorStatus
91 D.3. Configuração do arquivo core print errorIndex
return varBindTable
def set_cmd(address,oid,tipo,parametro,comunidade_escrita):
’’’
Função que pega o endereço, oid junto com o tipo do parametro
e mais o parametro que se quer configurar e a comunidade
de escrita do switch
’’’
errorIndication, errorStatus, errorIndex, varBinds =
cmdgen.CommandGenerator().setCmd(
cmdgen.CommunityData(’my-agent’, comunidade_escrita, 1),
cmdgen.UdpTransportTarget((address, 161)),
(func_string_tuple(oid), getattr(rfc1902, tipo)(parametro))
)
print errorIndication
print errorStatus.prettyPrint()
print errorIndex
return varBinds
O arquivo abaixo é o de configuração em switches Cisco: #Código do arquivo cisco.py
# -*- coding: utf-8 -*-
import string
from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.proto import rfc1902
from binascii import unhexlify #Faz a conversão do endereço
do Octet String hexadecimal
from operator import itemgetter #Grupamento de dados
from itertools import groupby
def criar_vlan_Cisco(address,numero_vlan,comunidade_escrita):
’’’
Função que cria uma vlan no switch cisco a partir do endereço, o número da vlan
’’’
views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.1.1.1.1’,
’Integer’,2, comunidade_escrita)#Permitindo a criação da VLan
views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.1.1.3.1’,
’OctetString’,’Vix’, comunidade_escrita)#Fazendo a edição do dono atual ser visível
#Editando a VLAN views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.2.1.11.1.’ + str(numero_vlan),’Integer’,4, comunidade_escrita) views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.2.1.3.1.’ + str(numero_vlan),’Integer’,1, comunidade_escrita) views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.2.1.4.1.’
+ str(numero_vlan),’OctetString’,’Vix’ + str(numero_vlan), comunidade_escrita)
#Cisco sempre faz 100000 + numero da vlan = resultado
transforma em octeto hexadecimal
hexadecimal = 100000 + numero_vlan
hexadecimal = hex(hexadecimal)
while len(hexadecimal)<9:#Acrescenta os zeros necessários para
completar oito bits e retira o x
93 D.3. Configuração do arquivo core hexadecimal = hexadecimal.replace(’x’,’’)
hexadecimal = unhexlify(hexadecimal)#Converte para Octet String
views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.2.1.6.1.’ + str(numero_vlan),’OctetString’,hexadecimal, comunidade_escrita) views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.1.1.1.1’, ’Integer’,3, comunidade_escrita) views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.1.1.1.1’, ’Integer’,4, comunidade_escrita)
def deletar_vlan_Cisco(address,numero_vlan, comunidade_escrita):
’’’
Função que deleta uma vlan no switch cisco a partir do endereço
e o número da vlan
’’’
views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.1.1.1.1’,’Integer’,
2,comunidade_escrita)#Permitindo a criação da Vlan
views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.1.1.3.1’,’OctetString’,
’Vix’, comunidade_escrita)#Fazendo a edição do dono atual ser visível
#Deletando a VLAN views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.2.1.11.1.’ + str(numero_vlan),’Integer’,6, comunidade_escrita) views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.1.1.1.1’, ’Integer’,3, comunidade_escrita) views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.4.1.1.1.1’, ’Integer’,4, comunidade_escrita) def tipo_interface_Cisco(address,comunidade_escrita):
’’’
Função que avalia se a interface é FasEthernet, GigabitEthernet
ou qualquer outra que possa vir
’’’ interfaces=views_snmp.next_cmd(address,’1.3.6.1.2.1.2.2.1.2’, comunidade_escrita) for x in interfaces: for y,z in x: if ’FastEthernet0/1’ in str(z): return ’100’ if ’GigabitEthernet0/1’ in str(z): return ’101’ def ligar_porta_Cisco(address,porta,comunidade_escrita): ’’’
Função que liga a porta dada do switch assinalado
’’’
porta = str(porta)
while len(porta)<2:#Acrescenta os zeros necessários para completar
dois digitos porta = ’0’+porta views_snmp.set_cmd(address,’1.3.6.1.2.1.2.2.1.7.’ + tipo_interface_Cisco(address,comunidade_escrita) + porta,’Integer’, 1,comunidade_escrita)#Ligando a porta def desligar_porta_Cisco(address,porta,comunidade_escrita): ’’’
95 D.3. Configuração do arquivo core Função que desliga a porta dada do switch assinalado
’’’
porta = str(porta)
while len(porta)<2:#Acrescenta os zeros necessários para completar
dois digitos porta = ’0’+porta views_snmp.set_cmd(address,’1.3.6.1.2.1.2.2.1.7.’ + tipo_interface_Cisco(address,comunidade_escrita) + porta,’Integer’, 2,comunidade_escrita)#Ligando a porta def vlan_existe_Cisco(address,numero_vlan,comunidade_escrita): ’’’
Função que verifica se a vlan a ser deletada realmente existe
’’’ vlans=views_snmp.next_cmd(address,’1.3.6.1.4.1.9.9.46.1.3.1.1.2’, comunidade_escrita) for x in vlans: for y,z in x: if y[-1] == numero_vlan: return True return False
def adicionar_vlan_porta_Cisco(address,numero_vlan,porta, comunidade_escrita):
’’’
Função que adiciona a porta a uma vlan se esta existe e ainda
trata se a interface é Ethernet ou GigabitEthernet
porta = str(porta)
while len(porta)<2:#Acrescenta os zeros necessários para completar
dois digitos porta = ’0’+porta if vlan_existe_Cisco(address,numero_vlan,comunidade_escrita): views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.68.1.2.2.1.2.’ + tipo_interface_Cisco(address,comunidade_escrita) + porta,’Integer’, str(numero_vlan), comunidade_escrita) def retirar_vlan_porta_Cisco(address,numero_vlan,porta,comunidade_escrita): ’’’
Faz a porta ficar com a vlan default 1
’’’
porta = str(porta)
while len(porta)<2:#Acrescenta os zeros necessários para completar
dois digitos porta = ’0’+porta views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.68.1.2.2.1.2.’ + tipo_interface_Cisco(address,comunidade_escrita) + porta,’Integer’, 1, comunidade_escrita) def adicionar_native_vlan_trunk_porta_Cisco(address,numero_vlan, porta,comunidade_escrita): ’’’
Função que adiciona a porta a uma vlan se esta existe
’’’
97 D.3. Configuração do arquivo core while len(porta)<2:#Acrescenta os zeros necessários para completar
dois digitos porta = ’0’+porta if vlan_existe_Cisco(address,numero_vlan,comunidade_escrita): views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.6.1.1.5.’ + tipo_interface_Cisco(address,comunidade_escrita) + porta,’Integer’, str(numero_vlan), comunidade_escrita)
return ’Trunk adicionado’
else:
return ’Vlan nao existe’
def criar_interface_mode_trunk_Cisco(address,porta,comunidade_escrita):
’’’
Função que configura a porta para virar trunk
’’’
porta = str(porta)
while len(porta)<2:#Acrescenta os zeros necessários para completar
dois digitos
porta = ’0’+porta
views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.6.1.1.3.’+
tipo_interface_Cisco(address,comunidade_escrita) + porta,’Integer’,
4, comunidade_escrita)#Criando o encapsulamento dot1q
views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.6.1.1.13.’+
tipo_interface_Cisco(address,comunidade_escrita) + porta,’Integer’,
1, comunidade_escrita)#Criando o switchport mode trunk
’’’
Função que desconfigura a porta para não ser mais trunk
’’’
porta = str(porta)
while len(porta)<2:#Acrescenta os zeros necessários para completar
dois digitos
porta = ’0’+porta
views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.6.1.1.13.’+
tipo_interface_Cisco(address,comunidade_escrita) + porta,’Integer’,
2, comunidade_escrita)#Retirando switchport mode trunk
views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.6.1.1.3.’+
tipo_interface_Cisco(address,comunidade_escrita) + porta,’Integer’,
5, comunidade_escrita)#Tirando o encapsulamento dot1q
#--- Funções para Trunk na Porta ---
def criar_vlan_trunk_porta_Cisco(address,string,chunk,porta,comunidade_escrita):
’’’
Função que cria a vlans trunks que serão permitidas em uma porta trunk
’’’
porta = str(porta)
while len(porta)<2:#Acrescenta os zeros necessários para completar
dois digitos porta = ’0’+porta print type(string) if chunk == ’1024’: views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.6.1.1.4.’+ tipo_interface_Cisco(address,comunidade_escrita) + porta,’OctetString’, string, comunidade_escrita)
99 D.3. Configuração do arquivo core if chunk == ’2048’: views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.6.1.1.17.’+ tipo_interface_Cisco(address,comunidade_escrita) + porta,’OctetString’, string, comunidade_escrita) if chunk == ’3072’: views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.6.1.1.18.’+ tipo_interface_Cisco(address,comunidade_escrita) + porta,’OctetString’, string, comunidade_escrita) if chunk == ’4096’: views_snmp.set_cmd(address,’1.3.6.1.4.1.9.9.46.1.6.1.1.19.’+ tipo_interface_Cisco(address,comunidade_escrita) + porta,’OctetString’, string, comunidade_escrita) def vlan_trunk_octeto_Cisco(lista): ’’’
Função que recebe uma lista com a posição e o valor do octeto e
devolve toda a string que deve ser colocada no cisco para setar as
vlans trunks
’’’
octeto="".join(256*[’0’])
for i in lista:
if i[0] == 0:
octeto = i[1] + octeto[1:]
else:
octeto = octeto[:i[0]] + i[1] + octeto[i[0]+1:]
def vlan_lista_posicao(lista):
’’’
Função que recebe uma lista e devolve a posição e soma de bits no
quarteto de bits em que deve ficar e convertido para o valor hexadecimal
obs: 3-i%4 já dá o indice dentro do bloco de 4 bits em que o bit está posicionado
’’’ lista_aux=[] for i in lista: lista_aux.append([i,i/4,3-i%4]) lista=groupby(lista_aux, itemgetter(1)) lista_valor=[]
for i,items in groupby(lista_aux,itemgetter(1)):
valor=0
for x in items:
valor=valor+pow(2,x[2])#Faz a soma dos bits na posição que
se encontram dentro do quarteto de bits
lista_valor.append([i,str(valor)]) for i in lista_valor: if i[1] == ’10’: i[1] = ’a’ if i[1] == ’11’: i[1] = ’b’ if i[1] == ’12’: i[1] = ’c’ if i[1] == ’13’: i[1] = ’d’ if i[1] == ’14’:
101 D.3. Configuração do arquivo core i[1] = ’e’ if i[1] == ’15’: i[1] = ’f’ return lista_valor def vlan_trunk_Cisco(address,lista_vlans,porta,comunidade_escrita): ’’’
Função que recebe uma lista de numeros de vlans e a transforma nos
octetos que o cisco permite na configuração de vlans trunks e configura as vlans
trunks na porta do switch de endereço address e com permissão de escrita
’’’
lista1024 =[]
lista2048 =[]
lista3072 =[]
lista4096 =[]#Necessário para dividir as vlans nos quatro grupos
do padrão da Cisco
for numero in lista_vlans:
if numero < 4096: if numero >= 3072: lista4096.append(numero) else: if numero >= 2048: lista3072.append(numero) else: if numero >= 1024: lista2048.append(numero) else:
lista1024.append(numero)
lista1024 = sorted(lista1024)#Ordenando as listas
lista2048 = sorted(lista2048)
lista3072 = sorted(lista3072)
lista4096 = sorted(lista4096)
print lista1024
lista2048 = [numero-1024 for numero in lista2048]#Trazendo para a
divisão padrão da Cisco
lista3072 = [numero-2048 for numero in lista3072]
lista4096 = [numero-3072 for numero in lista4096]
lista1024 = vlan_lista_posicao(lista1024)#Criando o mapeamento
de bits padrão da Cisco
- http://www.ciscopress.com/articles/article.asp?p=29803&seqNum=2
lista2048 = vlan_lista_posicao(lista2048)
lista3072 = vlan_lista_posicao(lista3072)
lista4096 = vlan_lista_posicao(lista4096)
lista1024 = vlan_trunk_octeto_Cisco(lista1024)#Gerando o octeto
string que é necessário para setar as trunks vlan
lista2048 = vlan_trunk_octeto_Cisco(lista2048) lista3072 = vlan_trunk_octeto_Cisco(lista3072) lista4096 = vlan_trunk_octeto_Cisco(lista4096) print lista1024 print type(lista1024) criar_vlan_trunk_porta_Cisco(address,lista1024,’1024’,porta,
comunidade_escrita)#Fazendo a configuração no switch
criar_vlan_trunk_porta_Cisco(address,lista2048,’2048’,porta,
103 D.4. Configuração da Aplicação