Example #1
0
def shell_manager(ip, port):
    db.load()

    ## start listener
    receiver = Receiver((ip, port))
    port = receiver.get_addr()[1]
        
    ## Do UPnP mapping
    try:
        from utility import UPNP
        u = UPNP()
        lan_addr = u.lan_addr()
        
        u.add_port_mapping(port, "UDP", lan_addr, port, "jolly desc", "")
        logging.info("Added port mapping to {0}:{1}".format(lan_addr, port))
        u.add_port_mapping(port + 1, "UDP", lan_addr, port + 1, "jolly+1", "")
        logging.info("Added port mapping to {0}:{1}".format(lan_addr, port+1))
        
        db.add("port_mappings", [(port, "UDP"), (port + 1, "UDP")])

        try:
            external_addr = u.external_addr()
        except Exception, e:
            logging.warning(
                "Cannot fetch external address via uPnP: {0}".format(e))
    except Exception, e:
        logging.error("Cannot import UPNP class or port map is busy -> audit.")
Example #2
0
def shell_client(sendto=db.get("shell_manager"), command_list=None):
    receiver = Receiver()
    cdb = yield db.load()

    logging.debug("UUID: {0}".format(db.get("uuid")))
    sender = Sender(sendto, receiver.get_addr(), db.get("uuid"))
   
    if command_list == None:
        input_ = lambda (host, port): (
            yield raw_input("{0}:{1} ~/ $: ".format(host, port))
        )
    elif type(command_list) == list:
        input_ = lambda (host, port): (
                yield command_list.pop() if len(command_list) > 0 else "quit" 
        )
    
    while True:
        command = input_(sendto).next()
        if not command:
            continue

        if command.startswith("@ping"):
            query = ("", "ping")
            resp, addr, rpc_no, uuid = yield rpc_call(query, sender, receiver)
            #print resp["data"]
            yield resp
            continue
 
        if command.startswith("upload"):
            try:
                filename = command.split()[1]
                yield sender.send_file(filename)
            except Exception, e:
                logging.error("No file specified, error: {0}".format(e))
            continue
                   
        if command.startswith("quit"):
            break
        
        ## RPC call!
        # yield sender.send_query(command, "shellcmd")
        # resp, addr = yield receiver.recv()
        
        query = (command, "shellcmd")
        resp, addr, rpc_no, uuid = yield rpc_call(query, sender, receiver) 

        #print resp["data"]
        yield resp["data"]