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.")
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"]