#! /usr/bin/python
# -*- coding: iso-8859-1 -*-

#####################################################
#    Copyright (C) 2006 by Cesar Kallas   	
#    cesarkallas@soulivre.org   
#    http://cesarkallas.soulivre.org
#                                                                          
#    This program is free software; you can redistribute it and#or modify  
#    it under the terms of the GNU General Public License as published by 
#    the Free Software Foundation; either version 2 of the License, or     
#    (at your option) any later version.                                   
#                                                                          
#    This program is distributed in the hope that it will be useful,       
#    but WITHOUT ANY WARRANTY; without even the implied warranty of        
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         
#    GNU General Public License for more details.                          
#                                                                          
#    You should have received a copy of the GNU General Public License     
#    along with this program; if not, write to the                         
#    Free Software Foundation, Inc.,                                       
#    59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             
#####################################################

import MySQLdb
import MySQLdb.cursors
import Log
import Ambiente

class Softwares(object):
	
	def adicionaSoftware(self, acao, mac_address, md5):
		try:
			self.db.execute("INSERT INTO agentes_softwares \
				(acoes_id, softwares_md5, agentes_mac_address) \
				values (%s, %s, %s)", (acao, md5, mac_address))
			return 1
		except MySQLdb.Error, e:
			mysql_erro = "%d: %s" % (e.args[0], e.args[1])
			self.log.error(mysql_erro)
			return -2
		return -3
		
	def removeSoftware(self, mac_address, md5):
		try:
			self.db.execute("DELETE FROM agentes_softwares where agentes_mac_address = %s and softwares_md5=%s",( mac_address, md5))
			return 1
		except MySQLdb.Error, e:
			self.log.error("%d: %s" % (e.args[0], e.args[1]))
			return -2


class Agentes(Softwares):
	"""
	Classe que gerencia agentes
	Data: 04/09/2006
	"""
	
	def __init__(self):
		self.db = Ambiente.db
		
		# Inicia Log do Repositorio
		#self.log = Log.Log("Agentes")
		#self.log = self.log.get()
		self.log = Ambiente.log


	def total(self):
		try:
			self.db.execute("SELECT count(*) as total FROM agentes")
			return self.db.fetchone()
		except MySQLdb.Error, e:
			mysql_erro = "%d: %s" % (e.args[0], e.args[1])
			self.log.error(mysql_erro)
			return mysql_erro
		except Exception:
			erro = "ao totalizar o numero de agentes"
			self.log.error(erro)
			return erro

	def informacao(self, agente_mac_address):
		"""
		Retorna todas as informacoes do agente
		Entrada: agente_mac_address (Mac Address do Agente)
		Saida:
			OK: Informacoes do agente
			Falha: exp (Dicionario com as falhas)
		"""
		try:
			self.db.execute("""SELECT * FROM agentes  where mac_address=%s""",  (str(agente_mac_address)))
			return  self.db.fetchone()
		except MySQLdb.Error, e:
			mysql_erro = "%d: %s" % (e.args[0], e.args[1])
			self.log.error(mysql_erro)
			return -1
		except Exception:
			erro = "ao buscar informacao de um agente: %s" % agente_mac_address
			self.log.error(erro)
			raise
			return -1


	def atualiza(self, dicNovoAgente):
		"""
		Inseri ou atualiza um novo agente na base de dados
		Entrada: dicNovoAgente = Dicionario com os campos de cadastro do agente
		Retorno: 
			 1: concluido com sucesso
			-1: paramentro invalido, nao eh do tipo dicionario
			outras msgs: falta de parametros, etc
			None: falha na insercao
		"""
		
		if isinstance(dicNovoAgente, dict) != True:
			return -1
			
		if dicNovoAgente.get("apelido") == None:
			return "falta parametro: 'apelido'"
			
		if dicNovoAgente.get("responsavel") == None:
			dicNovoAgente["responsavel"] = ""
			
		if dicNovoAgente.get("telefone") == None:
			dicNovoAgente["telefone"] = ""
			
		if dicNovoAgente.get("setor") == None:
			dicNovoAgente["setor"] = ""
			
		if dicNovoAgente.get("localizacao") == None:
			dicNovoAgente["localizacao"] = ""
			
		if dicNovoAgente.get("observacao") == None:
			dicNovoAgente["observacao"] = ""
			
		if dicNovoAgente.get("mac_address") == None:
			return "falta parametro: 'mac_address'"
			
		if dicNovoAgente.get("processador") == None:
			dicNovoAgente["processador"] = ""			
			
		if dicNovoAgente.get("disquete") == None:
			dicNovoAgente["disquete"] = ""			
			
		if dicNovoAgente.get("memoria_ram") == None:
			dicNovoAgente["memoria_ram"] = ""
			
		if dicNovoAgente.get("disco_rigido") == None:
			dicNovoAgente["disco_rigido"] = ""
			
		if dicNovoAgente.get("drive") == None:
			dicNovoAgente["drive"] = ""
			
		if dicNovoAgente.get("rede") == None:
			dicNovoAgente["rede"] = ""
			
		if dicNovoAgente.get("fabricante") == None:
			dicNovoAgente["fabricante"] = ""
		
		if dicNovoAgente.get("numero_serial") == None:
			dicNovoAgente["numero_serial"] = ""
			
		if dicNovoAgente.get("modelo") == None:
			dicNovoAgente["modelo"] = ""
			
		if dicNovoAgente.get("host") == None:
			return "falta parametro: 'host'"
			
		if dicNovoAgente.get("grupos_nome") == None:
			return "falta parametro: 'grupos_nome'"
		
		try:
			# Inseri novo agente
			self.db.execute("""UPDATE agentes SET \
				apelido = %s, responsavel = %s, telefone = %s, \
				setor = %s, localizacao = %s, observacao = %s, \
				processador = %s, disquete = %s, \
				memoria_ram = %s, disco_rigido = %s, drive = %s, rede = %s, \
				fabricante = %s, numero_serial = %s, modelo = %s, host = %s\
				where mac_address=%s """,  (dicNovoAgente["apelido"], dicNovoAgente["responsavel"], dicNovoAgente["telefone"], 
				dicNovoAgente["setor"], dicNovoAgente["localizacao"], dicNovoAgente["observacao"], 
				dicNovoAgente["processador"], dicNovoAgente["disquete"], 
				dicNovoAgente["memoria_ram"], dicNovoAgente["disco_rigido"], dicNovoAgente["drive"], 
				dicNovoAgente["rede"], dicNovoAgente["fabricante"], dicNovoAgente["numero_serial"], 
				dicNovoAgente["modelo"], dicNovoAgente["host"], dicNovoAgente["mac_address"]))
			return 1
		except MySQLdb.Error, e:
			mysql_erro = "%d: %s" % (e.args[0], e.args[1])
			self.log.error(mysql_erro)
			return mysql_erro
		except Exception:
			erro = "ao buscar inserir um novo agente: %s" % dicNovoAgente
			self.log.error(erro)
			return erro


	def inseri(self, dicNovoAgente):
		"""
		Inseri ou atualiza um novo agente na base de dados
		Entrada: dicNovoAgente = Dicionario com os campos de cadastro do agente
		Retorno: 
			 1: concluido com sucesso
			-1: paramentro invalido, nao eh do tipo dicionario
			outras msgs: falta de parametros, etc
			None: falha na insercao
		"""
		
		if isinstance(dicNovoAgente, dict) != True:
			return -1
			
		if dicNovoAgente.get("apelido") == None:
			return "falta parametro: 'apelido'"
			
		if dicNovoAgente.get("responsavel") == None:
			dicNovoAgente["responsavel"] = ""
			
		if dicNovoAgente.get("telefone") == None:
			dicNovoAgente["telefone"] = ""
			
		if dicNovoAgente.get("setor") == None:
			dicNovoAgente["setor"] = ""
			
		if dicNovoAgente.get("localizacao") == None:
			dicNovoAgente["localizacao"] = ""
			
		if dicNovoAgente.get("observacao") == None:
			dicNovoAgente["observacao"] = ""
			
		if dicNovoAgente.get("mac_address") == None:
			return "falta parametro: 'mac_address'"
			
		if dicNovoAgente.get("processador") == None:
			dicNovoAgente["processador"] = ""			
			
		if dicNovoAgente.get("disquete") == None:
			dicNovoAgente["disquete"] = ""			
			
		if dicNovoAgente.get("memoria_ram") == None:
			dicNovoAgente["memoria_ram"] = ""
			
		if dicNovoAgente.get("disco_rigido") == None:
			dicNovoAgente["disco_rigido"] = ""
			
		if dicNovoAgente.get("drive") == None:
			dicNovoAgente["drive"] = ""
			
		if dicNovoAgente.get("rede") == None:
			dicNovoAgente["rede"] = ""
			
		if dicNovoAgente.get("fabricante") == None:
			dicNovoAgente["fabricante"] = ""
		
		if dicNovoAgente.get("numero_serial") == None:
			dicNovoAgente["numero_serial"] = ""
			
		if dicNovoAgente.get("modelo") == None:
			dicNovoAgente["modelo"] = ""
			
		if dicNovoAgente.get("host") == None:
			return "falta parametro: 'host'"
			
		if dicNovoAgente.get("grupos_nome") == None:
			return "falta parametro: 'grupos_nome'"
		
		try:
			# Inseri novo agente
			self.db.execute("REPLACE INTO agentes \
				(apelido, responsavel, telefone, \
				setor, localizacao, observacao, \
				mac_address, processador, disquete, \
				memoria_ram, disco_rigido, drive, rede, \
				fabricante, numero_serial, modelo, host, grupos_nome, ativo) \
				values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
				(dicNovoAgente["apelido"], dicNovoAgente["responsavel"], dicNovoAgente["telefone"], 
				dicNovoAgente["setor"], dicNovoAgente["localizacao"], dicNovoAgente["observacao"], 
				dicNovoAgente["mac_address"], dicNovoAgente["processador"], dicNovoAgente["disquete"], 
				dicNovoAgente["memoria_ram"], dicNovoAgente["disco_rigido"], dicNovoAgente["drive"], 
				dicNovoAgente["rede"], dicNovoAgente["fabricante"], dicNovoAgente["numero_serial"], 
				dicNovoAgente["modelo"], dicNovoAgente["host"], dicNovoAgente["grupos_nome"], 's'))
			return 1
		except MySQLdb.Error, e:
			mysql_erro = "%d: %s" % (e.args[0], e.args[1])
			self.log.error(mysql_erro)
			return mysql_erro
		except Exception:
			erro = "ao buscar inserir um novo agente: %s" % dicNovoAgente
			self.log.error(erro)
			return erro



	def remove(self, agente_mac_address):
		"""
		Remove agente da base de dados
		Entrada: agente_mac_address (Mac Address)
		Retorno:
			 1: concluido com sucesso
			None: falha na remocao
		"""
		try:
			self.db.execute("""delete from agentes_softwares where agentes_mac_address=%s""", (agente_mac_address))
			self.db.execute("""delete from acoes where agentes_mac_address=%s""", (agente_mac_address))
			self.db.execute("""delete from agentes where mac_address=%s""", (agente_mac_address))
			return 1
		except MySQLdb.Error, e:
			self.log.error("%d: %s" % (e.args[0], e.args[1]))
			return -1



	def softwaresInstalados(self, agente_mac_address):
		"""
		Retorna todos os softwares instalados em um agente
		Entrada:
			Mac address do agente
		Saida:
			Dicionario com os campos dos softwares instalados
		"""
		try:
			self.db.execute("""SELECT * FROM agentes_softwares WHERE agentes_mac_address=%s""",  (agente_mac_address))
			return self.db.fetchall()
		except MySQLdb.Error, e:
			mysql_erro = "%d: %s" % (e.args[0], e.args[1])
			self.log.error(mysql_erro)
			return -1
		except Exception:
			erro = "ao buscar informacao de um agente: %s" % agente_mac_address
			self.log.error(erro)
			return -1

	def softwaresNaoInstalados(self, agente_mac_address):
		"""
		Retorna todos os softwares nao instalados em um agente
		Entrada:
			Mac address do agente
		Saida:
			Dicionario com os campos dos softwares nao instalados
		"""
		try:
			self.db.execute("""SELECT * FROM softwares WHERE md5 not in \
			(SELECT softwares_md5 FROM agentes_softwares WHERE agentes_mac_address=%s)""",  (agente_mac_address))
			return self.db.fetchall()
		except MySQLdb.Error, e:
			mysql_erro = "%d: %s" % (e.args[0], e.args[1])
			self.log.error(mysql_erro)
			return -1
		except Exception:
			erro = "ao buscar informacao de um agente: %s" % agente_mac_address
			self.log.error(erro)
			raise
			return -1
	