import sys import string import pjsua as pj import ServerClass import LogFileClass import setproctitle from time import sleep import csv def log_cb(level, str, len): print "" # Receive events from incoming Call class Account(pj.AccountCallback): def __init__(self, account=None): pj.AccountCallback.__init__(self, account) def on_incoming_call(self, call): global current_call #print 'Incoming Call' current_call = call call_cb = Calling(current_call) current_call.set_callback(call_cb) logger.logEvent('Incoming Call') call.answer(200) sleep(2) logger.logEvent('CALL OK') #creating object for calling class Calling(pj.CallCallback): def __init__(self, call=None): pj.CallCallback.__init__(self, call) def on_state(self): global current_call if self.call.info().state <> pj.CallState.DISCONNECTED: if self.call.info().state_text == "CONNECTING": logger.logEvent("Call Connecting") try: logger.logEvent('Try to hangup the call') self.call.hangup() logger.logEvent('Hangup OK') except ValueError: logger.logEvent('hangup failed, waiting destination hangup the call') server.sendData('CALL OK') if self.call.info().last_reason == "Busy Here": logger.logEvent('Number busy or Offline') server.sendData('CALL NOT OK') logger.logEvent('CALL NOT OK') if self.call.info().state == pj.CallState.DISCONNECTED: logger.logEvent('Call Disconnected') current_call = None #function to make a call def make_call(uri): try: cb=Calling() return acc.make_call(uri, cb) except pj.Error, e: logger.logEvent('Error when trying to call, 408') server.sendData('CALL NOT OK') return None def writeToFile(): try: string = '--' with open('handler.txt', 'w') as F: writer = csv.writer(F) writer.writerow([string]) F.close() except ValueError: print "can't write to file" def openFile(): global sipServer, username, password, ip, portadd global port #file format: 'Account:username:password:server:handler:PortName:portCommunication File = open('handler.txt') reader = csv.reader(File, delimiter=':') for row in reader: if str(row[0]) == 'Account': username = str(row[1]) password = str(row[2]) sipServer = str(row[3]) port = int(row[6]) File.close() writeToFile() #send greeting message to the controller def greeting(): global server server = None # create socket communication object server = ServerClass.ServerHandler(port) logger.logEvent('try to Connect to Controller') conn = server.openSocket() if server.connected == 1: #connection to the controller establish logger.logEvent('Connection Establish') if server.receiveData(25) == 'HELLO HANDLER': server.sendData('HELLO CONTROLLER') return 1 else: logger.logEvent('Cant connect to Controller') del server return 0 def initLogFile(sipServer): global logger if sipServer == '132.230.4.8': nameOfLogFile = 'SIP handler.log' #print '--SIP Asterisk--' elif sipServer == 'sipgate.de': nameOfLogFile = 'Landline handler.log' #print '--Landline--' elif sipServer == '132.230.252.228': nameOfLogFile = 'University SIP handler.log' #print '--university tephone network--' logger = LogFileClass.Logging(nameOfLogFile) def initState(): global message global state global num logger.logEvent('init state') message = server.receiveData(30) if message == 'RECEIVER': state = 'RECEIVER' elif message[0:6] == 'CALLER': state = 'CALLER' no = message[7:] # need special handle for calling from unisip account if sipServer == '132.230.252.228': num = no[7:] else: num = no lib = pj.Lib() stop = False print 'INIT SYSTEM' openFile() setproctitle.setproctitle('SIP Handler') initLogFile(sipServer) logger.logEvent('') while stop <> True: acc_cfg = None lib.init(log_cfg = pj.LogConfig(level=1, callback=log_cb)) transport = lib.create_transport(pj.TransportType.UDP, pj.TransportConfig(0)) lib.start() lib.set_null_snd_dev() if greeting() != 1: lib.destroy() break try: initState() acc_cfg = pj.AccountConfig(str(sipServer),str(username),str(password)) logger.logEvent('Register Account to SIP server') acc = lib.create_account(acc_cfg, cb=Account()) if acc.info().reg_status < 700: # being receiver state if state =='RECEIVER': logger.logEvent(acc.info().reg_status) server.sendData('RECEIVER READY') logger.logEvent('Receiver Handler Ready') #waiting state while 1: data = server.receiveData(1) if data == 'RECEIVE START': print data logger.logEvent(data) #get shutting down message if data == 'TERMINATE CONNECTION': print data logger.logEvent('Terminate') stop = True break #being caller state elif state =='CALLER': logger.logEvent(acc.info().reg_status) server.sendData('CALLER READY') logger.logEvent('Caller Handler Ready') while 1: data = server.receiveData(1) #start the call if data == 'CALL START': #print data if num <> '': sleep(3) logger.logEvent(data) logger.logEvent('Make a call to: ' + num) number = "sip:"+num+"@"+sipServer make_call(number) else: logger.logEvent('No number to call') logger.logEvent('CALL NOT OK') #shutting down message if data == 'TERMINATE CONNECTION': #print data stop = True logger.logEvent('Terminate') break else: logger.logEvent('Unknow Message') server.sendData('Unknow Message') break else: logger.logEvent("488 Not Acceptable Here") server.sendData('DEVICE NOT READY') break except ValueError: logger.logEvent("401 Unauthorized ") break logger.logEvent("Goodbye") logger.closeLogging() # trying to clean everything before shutting down try: acc.delete() lib.destroy() lib = None acc = None server.closeConnection() del server except ValueError: message = 'trying failure'