#!/usr/bin/python
#############################################
#											#
#	Plugin que realiza scan com nmap e 		#
#	checa Macs novos. 						#
#	Autores:								#
#	Danilo Camossi - dmc.cpv@gmail.com 		#
#	Kurt Eugenio - kurteugenio@gmail.com 	#
#											#
#	Testado com Nmap 5.0 - Para outras 		#
#	versões devem ser feitos ajustes. 		#
#############################################	



import subprocess
import commands
import sys
import os

#Executa chamada sistema Nmap
output = subprocess.check_output(['sudo', 'nmap', '-sP', '10.30.1.*'])
outputNmap = output.split('\n')

#Limpa IP
def limpaIps(outputNmap):
	listaIpLimpo = []
	for palavra in outputNmap:
		ipLimpo = palavra.replace('Host', 'IP: ')
		listaIpLimpo.append(ipLimpo) 
	return listaIpLimpo

#Retira quebra linha arquivo de MAcs cadastrados
def retiraQuebraLinha(lista):
	listaSemQuebraLinha = []
	for palavra in lista:
		palavraSemQuebra = palavra.replace('\n', '')
		listaSemQuebraLinha.append(palavraSemQuebra) 
	return listaSemQuebraLinha

#Cria lista apenas com os MACs da saida do Nmap
def startsWithMAC():
	listaMac = []
	for palavra in outputNmap:
		if palavra.startswith("MAC"):
			listaMac.append(palavra)
	return listaMac

#Compara lista de MACs cadastrados com a saida do Nmap
def comparaListas(listaSaidaNMap, listaMACCadastrados):
	listaMACNovos = [item for item in listaSaidaNMap if not item in listaMACCadastrados]
	return listaMACNovos

#Atribui respectivo IP a cada MAC novo
def comparaIps(listaIpLimpo, listaMACNovos):
	listaIps = []
	i = 0
	if len(listaMACNovos) >= 1:
		for cont in listaIpLimpo:
			i = i+1
			for item in listaMACNovos:
				if item == cont:
					listaIps.append(listaIpLimpo[i-2]) #Para Nmap 5.21 alterar valor para [i-3]
	return listaIps

#Le arquivo de MACs cadastrados e salva em uma lista
arquivoMacCadastrados = open('/usr/local/macs', 'r') #Arquivo de macs conhecidos cadastrados no formato de saida do Nmap (ex: MAC Address: AA:AA:00:00:AA:AA (Unknown))
listaMacCadastradosLidos = arquivoMacCadastrados.readlines()
arquivoMacCadastrados.close()

#Chama funcoes do programa
listaMACCadastrados = retiraQuebraLinha(listaMacCadastradosLidos)
listaSaidaNMap = startsWithMAC()
listaMACNovos = comparaListas(listaSaidaNMap, listaMACCadastrados)
listaIpLimpo = limpaIps(outputNmap)
listaIps = comparaIps(listaIpLimpo, listaMACNovos)



#Saida do programa
if len(listaMACNovos) == 0:
        print 'OK - Nenhum MAC novo'
        sys.exit(0)
else:
        for mac, item in zip(listaMACNovos, listaIps):
		print 'WARNING - ', mac + ' - ' + item
      	sys.exit(2)

	
