• Nenhum resultado encontrado

Configuração do arquivo core

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

Documentos relacionados