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
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']
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)