#Objetivo: Criar um script que crie um container e insira dentro dele objetos extraidos de um arquivo. Campos hard coded. (Em andamento)
#Fase 2: Usar input de arquivo generico, com certa padronizacao
#Fase 3: Passar como parametro o nome do container desejado
#Fase 4: Usar o input de um arquivo generico.
#
#Atual: O script cria um container com nome hardcoded (inserido no containerName) e entao
#le dados de um arquivo na forma NOMEORIP;10.32.8.21;COMMUNITY;public; (.....)  ;ADDRESSMODE;AUTOADDRESS 
#interpretando o significado de cada coluna e inserindo o valor na respectiva variavel.
#Depois de preenchidas as variaveis, cria um novo no com os dados lidos.

import csv
import org.netxms.client.objects

containerName = "Fontes"

jaExiste = 0
allContainers = filter(lambda f: isinstance(f, org.netxms.client.objects.Container), s.getAllObjects()) 

#Verifica se diretorio ja existia
for container in allContainers:
	if container.getObjectName() == containerName:
		containerId = container.getObjectId()
		jaExiste = 1
		print "Container %s ja existia, id=%d" % (containerName, containerId)
		break
		
#So cria um novo diretorio se ele nao existir anteriormente
if not jaExiste:	
	parentId = objects.GenericObject.SERVICEROOT 															#Diretorio pai - Infrastructure Services root
	cdContainer = NXCObjectCreationData(objects.GenericObject.OBJECT_CONTAINER, containerName, parentId)	#Cria o diretorio com o nome fontes
	containerId = session.createObject(cdContainer) 														#createObject retorna a ID do objeto que acabou de ser criado
	print "Container %s criado, id=%d" % (containerName, containerId) 										#Ate aqui tudo certo. Container criado com sucesso.

#Flags que serao usadas em todos os nos criados (no caso das fontes, MEDIDA TEMPORARIA)
flags = NXCObjectCreationData.CF_DISABLE_NXCP | NXCObjectCreationData.CF_DISABLE_SNMP
	
with open('input.csv', 'rb') as f:
    reader = csv.reader(f, delimiter=';') 						#Lemos um arquivo e reader contem todas as linhas dele.
    for line in reader:
		#Aqui comeca a extracao de variaveis, temos que ter em mente que nem todos os parametros
		#estao presentes em todas as linhas de descricao:
		#	collumn  0, 1: NAMEORIP, value
		#	collumn  2, 3: COMMUNITY, value		
		#	collumn  4, 5: SNMPPORT, value
		#	collumn  6, 7: SNMPVERSION, value
		#	collumn  8, 9: SEEDNAME, value
		#	collumn 10,11: ACCESSMODE, value
		#	collumn 12,13: ADDRESSFORMAT, value

		#Observe que como nem todos os parametros estao em todas as linhas, as posicoes podem nao coincidir, por isso
		#eh melhor varrer todas as colunas (duas a duas) e verificar qual representa o que:
		
		objectSnmpCommunity = ""
		objectSnmpPort = 161
		objectSnmpVersion = 1
		objectAccessMode = ""
		objectAddressFormat = ""
		
		i=0
		while i < len(line):
			if line[i] == 'NAMEORIP':
				objectIp = line[i+1]
			
			elif line[i] == 'COMMUNITY':
				objectSnmpCommunity = line[i+1]
				
			elif line[i] == 'SNMPPORT':
				objectSnmpPort = int(line[i+1])

			#Observacao: por algum motivoo bizarro nos parametros pra metodo setSnmpVersion as versoes 1 e 2 estao trocadas!
			#Por isso o script esta passando o numero 1 quando quer a v2 e o numero 2 quando quer a v1:
			elif line[i] == 'SNMPVERSION':
				objectSnmpVersion = line[i+1]
				if objectSnmpVersion == "V1":
					objectSnmpVersion = 2
				elif objectSnmpVersion == "V2C":
					objectSnmpVersion = 1
				elif objectSnmpVersion == "V3":
					objectSnmpVersion = 3

			elif line[i] == 'SEEDNAME':
				objectName = line[i+1]

			elif line[i] == 'ACCESSMODE':
				objectAccessMode = line[i+1]
			
			elif line[i] == 'ADDRESSFORMAT':
				objectAddressFormat = line[i+1]
			i=i+2 													#Contador para andar de 2 em 2
			

		#Verifica se o objeto com esse nome ja existe:
		objetos = filter(lambda f: isinstance(f, org.netxms.client.objects.AbstractObject) & (objectName == f.getObjectName()), s.getAllObjects())
		if len(objetos) != 0:
			print 'Objeto ja existe!'
			
		else:
			#criacao do no com o auxilio da classe NCXObjectCreationData	(utiliza o SEEDNAME)
			cd = NXCObjectCreationData(objects.GenericObject.OBJECT_NODE, objectName, containerId)	
			
			cd.setPrimaryName(objectIp) 							#Define o IP desse no (NAMEORIP)
			cd.setCreationFlags(flags)								#Define as flags usadas na criacao do objeto (ACCESSMODE)

			if objectSnmpPort != "":								#Define a porta para enviar/receber PDU's SNMP (SNMPPORT)
				cd.setSnmpPort(objectSnmpPort)
				
			nodeId = session.createObject(cd)

			md = NXCObjectModificationData(nodeId)
			md.setSnmpVersion(objectSnmpVersion)					#Define qual versao do protocolo SNMP deve ser usada (SNMPVERSION)
			
			if objectSnmpCommunity != "":
				md.setSnmpAuthName(objectSnmpCommunity)				#Define a SNMP Community para esse no (SNMPCOMMUNITY)
				
			session.modifyObject(md)
			
			print 'Objeto criado: ',
			print objectIp, objectSnmpCommunity, objectSnmpPort, objectSnmpVersion, objectName, objectAccessMode, objectAddressFormat
