Exemplo n.º 1
0
    def handle(self, cmd):
        """Handle command from CLI

            i.e:
                101 register
                101	dial 102
                101 ack 458d54ef452a
        """

        #NOTE: filter remove multi-spaces
        cmd = cmd.strip()
        if len(cmd) == 0:
            return True

        parts = filter(lambda x: len(x) > 0, cmd.split(' '))
        if parts[0] == 'help':
            return self.help(parts[1:])

        accnt = self.accounts.get(parts[0], None)
        if accnt is None:
            repl.error("Unknown *%s* account" % parts[0], place=repl.INBETWEEN); return False
        if len(parts) < 2:
            repl.error("No action specified", place=repl.INBETWEEN); return False

        action = parts[1].lower()
        if not hasattr(accnt, 'do_'+action):
            repl.error("Unknown '%s' action" % action, place=repl.INBETWEEN); return False

        repl.debug("", place=repl.INBETWEEN)
        try:
            return getattr(accnt, 'do_'+action)(*parts[2:])
        except TypeError:
            repl.error("Invalid number of arguments for '%s' action" % action, place=repl.INBETWEEN)
            return False
Exemplo n.º 2
0
    def do_request(self, action, server, mapping, callback=None):
        """Send request to SIP server
        """
        msg = self.patterns.get(action.lower(), None)
        if msg is None:
            return False

        mapping.update({
            'remote_ip'    : server.host,
            'remote_port'  : server.port,
            #TODO: should we use server.transport ?
            'transport'    : 'TCP',
            'branch'       : mapping.get('branch'  , self.uuid()),
            'from_tag'     : mapping.get('from_tag', self.uuid()),
            'to_tag'       : mapping.get('to_tag'  , self.uuid()),
            'call_id'      : mapping.get('call_id' , self.uuid()),
            'local_ip_type': 4,
            'media_ip_type': 4,
            'media_ip'     : mapping['local_ip'],
            'media_port'   : mapping.get('media_port', 0),
            'ua'           : 'epbxd-pytest 0.1',
        })

        self.transactions[mapping['call_id']] = [action, None, callback]

        def domap(m):
            if m.group(1) == 'len':
                return '[len]'

            return str(mapping.get(m.group(1), "NONE"))
        msg = re.sub("\[([^\]]+)\]", domap, msg)

        # compute payload length
        # payload length is only known after variables substitutions
        try:
            length = len(msg) - msg.index('\r\n\r\n') - 4
        except ValueError:
            length = 0

        msg = msg.replace('[len]', str(length))

        conn = self.get_connection(server)
        print 'CONN=',conn
        try:
            repl.debug("%s -> %s\n" % (conn.getsockname(), conn.getpeername()))
        except:
            # fail when using UDP transport
            pass
        repl.debug(msg[:-2] if msg.endswith('\r\n\r\n') else msg)
    
        ret  = conn.send(msg)
        return mapping['call_id']
Exemplo n.º 3
0
 def receive(self, sock, raw, extra):
     try:
         repl.debug("%s -> %s\n" % (sock.getpeername(), sock.getsockname()))
     except:
         # fail when using UDP transport
         pass
     repl.debug(raw[:-2] if raw.endswith('\r\n\r\n') else raw)
     for msg in self.decoder.decode(raw):
         repl.debug(str(msg)+'\n')
         getattr(self, 'handle_'+msg.__class__.__name__.lower())(msg)