#!/usr/bin/python
# -*- coding: utf-8 -*-

# XMPP message processor
#
# Marcelo H. Terres <mhterres@gmail.com>
# 2014-05-29
#
# Versao 0.2

import sys
import os
import subprocess
import socket
import time
import re
import psycopg2
import psycopg2.extras
import ConfigParser

from asterisk import agi

from subprocess import Popen
from subprocess import PIPE

log = open('/tmp/process_xmpp_msg.agi.log', 'a')
sys.stderr = log
#sys.stdout = log

agi = agi.AGI()

myConfigs = Config()
myConfigs.initvars('mos')

# Pega dados
xmppdomain = agi.get_variable('XMPPDOMAIN')
xmppresource = agi.get_variable('XMPPRESOURCE')

jid = ((((agi.get_variable('MESSAGE(from)')).split(":"))[1]).split("/"))[0]

message = agi.get_variable('MESSAGE(body)')

cmds = message.split()

cmdini = cmds[0]

extens=getExten(jid,myConfigs.db_table_sip,myConfigs.db_table_sip_field_jid)

extenjid = extens[0][0]

if cmdini == "msg": 

	# Get extension
	try:
		extension = cmds[1];
	except:
		# Extension not informed
			returnmsg = "You need to inform extension.\r";
			returnmsg += "Syntax: msg <extension> <message>";
	else:

		# Get message
		try:
			message = cmds[2];
		except:
			# Message not informed
			returnmsg = "You need to inform message.\r";
			returnmsg += "Syntax: msg <extension> <message>";
		else:

			# Set variables
			agi.set_variable("XMPP_SIPORIG", extenjid)
			agi.set_variable("XMPP_SIPDEST", extension)

			i=0;

			for item in cmds:

				if (i > 2):
					message += " " + item;
					
				i+=1;

			agi.set_variable("XMPP_MSG", message)
				
			returnmsg = "Message sent."

else:
	returnmsg = "Command " + cmdini + " not available."
	
agi.set_variable("RETURN_MSG", returnmsg)

def getExten(jid,table,field):

	# Read PGSql configuration and connect to there
	config = ConfigParser.RawConfigParser()
	config.read('/etc/asterisk/res_pgsql.conf')
	dsn = 'dbname=%s host=%s user=%s password=%s' % (config.get('general','dbname'), config.get('general', 'dbhost'), config.get('general', 'dbuser'),config.get('general', 'dbpass'))

	conn = psycopg2.connect(dsn)
	curs = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

	activeLogs('/tmp','xmpp_defs','err')

	sql = 'SELECT name FROM ' + table + ' WHERE ' + field + ' = %s'
	curs.execute(sql, (jid,))

	extens=[]

	for linha in curs.fetchall():

		extens.append(linha)

	return (extens)

class Config:

	def __init__(self):

		self.description = 'configuration'

	def initvars(self,srv):

		# Read PGSql configuration and connect to there
		configuration = ConfigParser.RawConfigParser()
		configuration.read('/var/lib/asterisk/agi-bin/config.ini')

		# script
		self.version=configuration.get('general','version')
		self.smsdevice=configuration.get('general','smsdevice')

		# xmpp
		self.jid_auth=configuration.get(srv,'jid_auth')
		self.jid_pwd=configuration.get(srv,'jid_pwd')

		# voip
		self.voip_manager_srv=configuration.get(srv,'voip_manager_srv')
		self.voip_manager_usr=configuration.get(srv,'voip_manager_usr')
		self.voip_manager_pwd=configuration.get(srv,'voip_manager_pwd')

		# db
		self.db_table_sip=configuration.get(srv,'db_table_sip')
		self.db_table_sip_field_jid=configuration.get(srv,'db_table_sip_field_jid')
		self.db_table_sip_field_email=configuration.get(srv,'db_table_sip_field_email')



#
# config.ini example
#
#[general]
## script information
#version=0.2.3
#smsdevice=b0
#
#[mos]
## xmpp
#jid_auth=asterisk@yourjabberdomain
#jid_pwd=secret
#
## voip
#voip_manager_srv=voip.yourdomain.com
#voip_manager_usr=manager
#voip_manager_pwd=secret
#
## db 
#db_table_sip=sip
#db_table_sip_field_jid=extension_jid
#db_table_sip_field_email=extension_email
#
