Example #1
0
    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()
Example #2
0
            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)
Example #3
0
 def sigin(self):
     Timeout(self.done, 0.125)
Example #4
0
 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)
Example #5
0
            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)
Example #6
0
 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)
Example #7
0
 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)
Example #8
0
            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()
Example #9
0
 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)
Example #10
0
 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)