import sys import string import pjsua as pj import ServerClass import LogFileClass import setproctitle from time import sleep def log_cb(level, str, len): print "" # Receive events from incoming Call class Account(pj.AccountCallback): 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(current_call) call.answer(200) logger.logEvent("Answer call") print 'Answer Call' if current_call <> None: logger.logEvent("Hangup call") print 'Hangup Call' call.hangup() 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": print 'Call Connecting' logger.logEvent("Call Connecting") logger.logEvent('200') server.sendData('CALL OK') if self.call.info().last_reason == "Busy Here": print 'Number busy or offline' 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') print 'Call Discont' 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: print "408 " + str(e) logger.logEvent('408') return None #send greeting message to the controller def greeting(): global server global status global port port = sys.argv[2] server = None status = 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 esatablish if server.receiveData(25) == 'HELLO HANDLER': print 'GREETING' server.sendData('HELLO CONTROLLER') status = 'OK' else: status = 'NOT OK' logger.logEvent('Cant connect to Controller') sys.exit(1) 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 print 'INIT STATE', state def initHandler(): global sipServer global username global password accConf = sys.argv[1] username = accConf[0:accConf.find(':')] line = accConf[accConf.find(':')+1:] password = line[0:line.find(':')] newLine = line[line.find(':')+1:] sipServer = newLine[0:newLine.find(':')] lib = pj.Lib() stop = False print 'INIT SYSTEM' initHandler() 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() greeting() 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) #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 print number 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') server.closeConnection() sys.exit(0.5) else: logger.logEvent("488 Not Acceptable Here") lib.destroy() except ValueError: print "401 Unauthorized " + str(e) logger.logEvent("401 Unauthorized ") logger.logEvent("Goodbye") acc.delete() lib.destroy() server.closeConnection() lib = None acc = None