def incomingResponse(self, msg, t, checksum): # In those two states upper level already notified, only do ACK retransmit # if needed if t.state == TERMINATED: return if t.state == TRYING: # Stop timers if t.teA != None: t.teA.cancel() t.teA = None if t.state in (TRYING, RINGING): if t.teB != None: t.teB.cancel() t.teB = None if msg.getSCode()[0] < 200: # Privisional response - leave everything as is, except that # change state and reload timeout timer if t.state == TRYING: t.state = RINGING if t.cancelPending: self.newTransaction(t.cancel, userv=t.userv) t.cancelPending = False t.teB = Timeout(self.timerB, t.expires, 1, t) self.l1rcache[checksum] = SipTMRetransmitO() if t.resp_cb != None: if t.cb_ifver == 1: t.resp_cb(msg) else: t.resp_cb(msg, t) else: # Final response - notify upper layer and remove transaction if t.resp_cb != None: if t.cb_ifver == 1: t.resp_cb(msg) else: t.resp_cb(msg, t) if t.needack: # Prepare and send ACK if necessary fcode = msg.getSCode()[0] tag = msg.getHFBody('to').getTag() if tag != None: t.ack.getHFBody('to').setTag(tag) rAddr = None if msg.getSCode()[0] >= 200 and msg.getSCode()[0] < 300: # Some hairy code ahead if msg.countHFs('contact') > 0: rTarget = msg.getHFBody( 'contact').getUrl().getCopy() else: rTarget = None routes = [ x.getCopy() for x in msg.getHFBodys('record-route') ] routes.reverse() if len(routes) > 0: if not routes[0].getUrl().lr: if rTarget != None: routes.append( SipRoute(address=SipAddress( url=rTarget))) rTarget = routes.pop(0).getUrl() rAddr = rTarget.getAddr() else: rAddr = routes[0].getAddr() elif rTarget != None: rAddr = rTarget.getAddr() if rTarget != None: t.ack.setRURI(rTarget) if rAddr != None: t.ack.setTarget(rAddr) t.ack.delHFs('route') t.ack.appendHeaders( [SipHeader(name='route', body=x) for x in routes]) if fcode >= 200 and fcode < 300: t.ack.getHFBody('via').genBranch() if rAddr == None: rAddr = t.address if not t.uack: self.transmitMsg(t.userv, t.ack, rAddr, checksum, t.compact) if t.req_out_cb != None: t.req_out_cb(t.ack) else: t.state = UACK t.ack_rAddr = rAddr t.ack_checksum = checksum self.l1rcache[checksum] = SipTMRetransmitO() t.teG = Timeout(self.timerG, 64, 1, t) return else: self.l1rcache[checksum] = SipTMRetransmitO() del self.tclient[t.tid] t.cleanup()
continue if o == '-o': fname = a.strip() if fname == '-': file_out = sys.stdout else: file_out = open(fname, 'w') if o == '-t': timeout = float(a.strip()) continue if sippy_path != None: sys.path.insert(0, sippy_path) from sippy.CLIManager import CLIConnectionManager from sippy.Time.Timeout import Timeout from sippy.Core.EventDispatcher import ED2 ch = cli_handler(file_out) if stype == 'unix': rep = lambda x, y: ch.command_received(spath, x, y) cs = CLIConnectionManager(rep, spath, tcp=False) else: rep = lambda x, y: ch.command_received(spath[0], x, y) cs = CLIConnectionManager(rep, tuple(spath), tcp=True) if timeout != None: Timeout(ch.done, timeout) ED2.regSignal(SIGTERM, ch.sigin) ED2.loop() sys.exit(ch.rval)
def sigin(self): Timeout(self.done, 0.125)
def timerF(self, t): #print 'timerF', t.state t.teF = None if t.state == RINGING and self.provisional_retr > 0: self.transmitData(t.userv, t.data, t.address) t.teF = Timeout(self.timerF, self.provisional_retr, 1, t)
if fname == '-': file_out = sys.stdout else: file_out = open(fname, 'w') elif o == '-b': no_rtpp_version_check = True elif o == '-n': nwrks = int(a) elif o == '-t': timeout = float(a.strip()) if len(args) > 0: commands = args if sippy_path != None: sys.path.insert(0, sippy_path) from sippy.Rtp_proxy_client import Rtp_proxy_client from sippy.Time.Timeout import Timeout from sippy.Core.EventDispatcher import ED2 rc = Rtp_proxy_client(global_config, spath = spath, nworkers = nwrks, \ no_version_check = no_rtpp_version_check) #commands = ('VF 123456', 'G nsess_created', 'G ncmds_rcvd') crun = command_runner(rc, commands, file_in, file_out) if timeout != None: Timeout(crun.timeout, timeout) ED2.loop(freq=1000.0) rc.shutdown() sys.exit(crun.rval)
def incomingRequest(self, msg, checksum, tids, server): for tid in tids: if tid in self.tclient: t = self.tclient[tid] resp = msg.genResponse(482, 'Loop Detected') self.transmitMsg(server, resp, resp.getHFBody('via').getTAddr(), checksum, \ t.compact) return if msg.getMethod() != 'ACK': tid = msg.getTId(wBRN=True) else: tid = msg.getTId(wTTG=True) t = self.tserver.get(tid, None) if t != None: #print 'existing transaction' if msg.getMethod() == t.method: # Duplicate received, check that we have sent any response on this # request already if t.data != None: self.transmitData(t.userv, t.data, t.address, checksum) return elif msg.getMethod() == 'CANCEL': # RFC3261 says that we have to reply 200 OK in all cases if # there is such transaction resp = msg.genResponse(200, 'OK') self.transmitMsg(t.userv, resp, resp.getHFBody('via').getTAddr(), checksum, \ t.compact) if t.state in (TRYING, RINGING): self.doCancel(t, msg.rtime, msg) elif msg.getMethod() == 'ACK' and t.state == COMPLETED: t.state = CONFIRMED if t.teA != None: t.teA.cancel() t.teA = None t.teD.cancel() # We have done with the transaction, no need to wait for timeout del self.tserver[t.tid] if t.ack_cb != None: t.ack_cb(msg) t.cleanup() self.l1rcache[checksum] = SipTMRetransmitO() elif msg.getMethod() == 'ACK': # Some ACK that doesn't match any existing transaction. # Drop and forget it - upper layer is unlikely to be interested # to seeing this anyway. print(datetime.now(), 'unmatched ACK transaction - ignoring') sys.stdout.flush() self.l1rcache[checksum] = SipTMRetransmitO() elif msg.getMethod() == 'CANCEL': resp = msg.genResponse(481, 'Call Leg/Transaction Does Not Exist') self.transmitMsg(server, resp, resp.getHFBody('via').getTAddr(), checksum) else: #print 'new transaction', msg.getMethod() t = SipTransaction() t.tid = tid t.state = TRYING t.teA = None t.teD = None t.teE = None t.teF = None t.teG = None t.method = msg.getMethod() t.rtime = msg.rtime t.data = None t.address = None t.noack_cb = None t.ack_cb = None t.cancel_cb = None t.checksum = checksum if not server.uopts.isWildCard(): t.userv = server else: # For messages received on the wildcard interface find # or create more specific server. t.userv = self.l4r.getServer(msg.getSource()) if msg.getMethod() == 'INVITE': t.r487 = msg.genResponse(487, 'Request Terminated') t.needack = True t.branch = msg.getHFBody('via').getBranch() try: e = msg.getHFBody('expires').getNum() if e <= 0: e = 300 except IndexError: e = 300 t.teE = Timeout(self.timerE, e, 1, t) else: t.r487 = None t.needack = False t.branch = None self.tserver[t.tid] = t for consumer in self.req_consumers.get(t.tid[0], ()): cobj = consumer.cobj.isYours(msg) if cobj != None: t.compact = consumer.compact rval = cobj.recvRequest(msg, t) break else: if self.req_cb == None: self.l1rcache[checksum] = SipTMRetransmitO() return rval = self.req_cb(msg, t) if rval == None: if t.teA != None or t.teD != None or t.teE != None or t.teF != None: return if t.tid in self.tserver: del self.tserver[t.tid] t.cleanup() return resp, t.cancel_cb, t.noack_cb = rval if resp != None: self.sendResponse(resp, t)
def timerA(self, t): #print 'timerA', t self.transmitData(t.userv, t.data, t.address) t.tout *= 2 t.teA = Timeout(self.timerA, t.tout, 1, t)
ED2.callFromThread(self.delete) else: self.delete() if __name__ == '__main__': from sippy.Time.Timeout import Timeout from sippy.Rtp_proxy_client import Rtp_proxy_client def display(*args): print('got:', args) ED2.breakLoop() def waitonline(rpc): if rpc.online: ED2.breakLoop() gc = {'_sip_address':'1.2.3.4'} r = Rtp_proxy_client(gc) t = Timeout(waitonline, 0.1, 10, r) ED2.loop(2.0) assert(r.online) t.cancel() gc['rtp_proxy_client'] = r rs = Rtp_proxy_session(gc, 'call_id1', 'from_tag1', 'to_tag1') rs.version(display) ED2.loop() rs.start_recording('bogus', result_callback = display) print(1) ED2.loop() print(2) rs.play_callee('bogus', result_callback = display) ED2.loop()
def safeStop(self, signum): print('Signal %d received, scheduling safe stop' % signum) self.discAll(signum) self.safe_stop = True self.global_config['_executeStop_count'] = 0 self.er_timer = Timeout(self.executeStop, 0.5, -1)
def __init__(self, ua): UaStateGeneric.__init__(self, ua) ua.on_local_sdp_change = None ua.on_remote_sdp_change = None Timeout(self.goDead, ua.godead_timeout)