Example #1
0
class Server(Thread):
    def __init__(self,ip,port):
        Thread.__init__(self)
        self.__port = port
        self.__ip = ip
        self.webServer = SimpleXMLRPCServer((self.__ip, self.__port))
        print "server initialized"

        
    def stopServer(self):
        self.webServer.shutdown(self)
    

        
    def run(self):
        #server = SimpleXMLRPCServer(("localhost", self.__port))
        server = self.webServer
        server.register_introspection_functions()       
        #server.register_instance(NodeRPCHandler())
        server.register_function(add)
        server.register_function(delete)
        server.register_function(getActiveNodes)
        server.serve_forever()


    
    def test(a,b):
        print "test succeeded"
        print a+b    
Example #2
0
class RPCNativeBase(object):
    def __init__(self, nativeObject, binderPort):
        self.native = nativeObject
        self.server = SimpleXMLRPCServer(('localhost', binderPort))
        self.server.register_instance(self.native)
        self.__backThread = GEVP.Pool(1)

    def __runServer(self, name):
        try:
            print "Running " + name
            self.__name = name
            self.server.serve_forever()
        except (KeyboardInterrupt):
            self.server.server_close()
            print "Receive KeyboardInterrupt in " + name
        finally:
            self.server.server_close()

    def __del__(self):
        self.stopNative()

    # startNative will be blocked and wait
    def startNative(self):
        self.__backThread.spawn(self.__runServer, self.__class__.__name__)

    def stopNative(self):
        self.server.shutdown()
        self.__backThread.join()
        self.server.server_close()
        print "Stopped " + self.__class__.__name__
Example #3
0
class KeyValueServer:
    _rpc_methods_ = [
        'get_robot_state', 'get_laser_data', 'set_robot_pose',
        'set_target_pose', 'set_robot_cmd_vel'
    ]

    def __init__(self, address, index, sp):
        self.robot = Robot(config.player_port + index, index, sp)
        self._serv = SimpleXMLRPCServer(address, allow_none=True)
        for name in self._rpc_methods_:
            self._serv.register_function(getattr(self, name))

    def get_robot_state(self):
        return self.robot.get_robot_state()

    def get_laser_data(self):
        return self.robot.get_laser_data()

    def set_robot_pose(self, ppx, ppy, ppa):
        return self.robot.set_robot_pose(ppx, ppy, ppa)

    def set_target_pose(self, ppx, ppy):
        return self.robot.set_target_pose(ppx, ppy)

    def set_robot_cmd_vel(self, vx, vy, va):
        return self.robot.set_robot_cmd_vel(vx, vy, va)

    def serve_forever(self):
        self._serv.serve_forever()

    def close(self):
        self._serv.shutdown()
        self._serv.server_close()
Example #4
0
def main(*argv):
    """This script is used as i/o api for communication with exabgp

    Arguments:
        :*argv: unparsed cli arguments

    In a separate thread an rpc server is started. This server will be used as an api towards the user.
    Stdin and stdout are used for communication with exabgp.
    """

    parser = argparse.ArgumentParser(description="ExaBgp rpc server script")
    parser.add_argument(
        "--host",
        default="127.0.0.1",
        help="Host where exabgp is running (default is 127.0.0.1)",
    )
    parser.add_argument("--loglevel", default=logging.DEBUG, help="Log level")
    parser.add_argument(
        "--logfile",
        default="{}/exarpc.log".format(
            os.path.dirname(os.path.abspath(__file__))),
        help="Log file name.",
    )
    parser.add_argument("--encoder",
                        default="json",
                        help="Exabgp encoder type")
    in_args = parser.parse_args(*argv)
    logging.basicConfig(filename=in_args.logfile, level=in_args.loglevel)

    storage = ExaStorage()
    rpcserver = SimpleXMLRPCServer((in_args.host, 8000), allow_none=True)
    rpcserver.register_instance(Rpcs(storage))
    trpc = threading.Thread(target=rpcserver.serve_forever)
    trpc.start()

    epoll = select.epoll()

    epoll.register(sys.__stdin__,
                   select.EPOLLIN | select.EPOLLERR | select.EPOLLHUP)

    try:
        while True:
            logging.debug("Epoll loop")
            events = epoll.poll(10)
            for fd, event_type in events:
                logging.debug("Epoll returned: {},{}".format(fd, event_type))
                if event_type != select.EPOLLIN:
                    raise Exception("Unexpected epoll event")
                else:
                    data = sys.stdin.readline()
                    logging.debug(
                        "Data recevied from exabgp: {}.".format(data))
                    exa_msg_handler(storage, data, in_args.encoder)
    except Exception as e:
        logging.warn("Exception occured: {}".format(e))
    finally:
        rpcserver.shutdown()
        trpc.join()
Example #5
0
class ProntRPC(object):

    server = None

    def __init__(self, pronsole, port=RPC_PORT):
        self.pronsole = pronsole
        used_port = port
        while True:
            try:
                self.server = SimpleXMLRPCServer(("localhost", used_port),
                                                 allow_none=True,
                                                 logRequests=False)
                if used_port != port:
                    logging.warning(
                        _("RPC server bound on non-default port %d") %
                        used_port)
                break
            except socket.error as e:
                if e.errno == 98:
                    used_port += 1
                    continue
                else:
                    raise
        self.server.register_function(self.get_status, 'status')
        self.thread = Thread(target=self.run_server)
        self.thread.start()

    def run_server(self):
        self.server.serve_forever()

    def shutdown(self):
        self.server.shutdown()
        self.thread.join()

    def get_status(self):
        if self.pronsole.p.printing:
            progress = 100 * float(self.pronsole.p.queueindex) / len(
                self.pronsole.p.mainqueue)
        elif self.pronsole.sdprinting:
            progress = self.percentdone
        else:
            progress = None
        if self.pronsole.p.printing or self.pronsole.sdprinting:
            eta = self.pronsole.get_eta()
        else:
            eta = None
        if self.pronsole.tempreadings:
            temps = parse_temperature_report(self.pronsole.tempreadings)
        else:
            temps = None
        z = self.pronsole.curlayer
        return {
            "filename": self.pronsole.filename,
            "progress": progress,
            "eta": eta,
            "temps": temps,
            "z": z,
        }
Example #6
0
class RPCServer(threading.Thread):
    """
    The RPCServer thread provides an API for external programs to interact
    with MOM.
    """
    def __init__(self, config, momFuncs):
        threading.Thread.__init__(self, name="RPCServer")
        self.setDaemon(True)
        self.config = config
        self.momFuncs = momFuncs
        self.logger = logging.getLogger('mom.RPCServer')
        self.server = None
        self.start()

    def thread_ok(self):
        if self.server is None:
            return True
        return self.isAlive()

    def create_server(self):
        try:
            unix_port = None
            port = self.config.getint('main', 'rpc-port')
        except ValueError:
            port = None
            unix_port = self.config.get('main', 'rpc-port')
            self.logger.info("Using unix socket " + unix_port)

        if unix_port is None and (port is None or port < 0):
            return None

        if unix_port:
            self.server = UnixXmlRpcServer(unix_port)
        else:
            self.server = SimpleXMLRPCServer(("localhost", port),
                                             requestHandler=RequestHandler,
                                             logRequests=0)

        self.server.register_introspection_functions()
        self.server.register_instance(self.momFuncs)

    def shutdown(self):
        if self.server is not None:
            self.server.shutdown()

    def run(self):
        try:
            self.create_server()
            if self.server is not None:
                self.logger.info("RPC Server starting")
                self.server.serve_forever()
                self.logger.info("RPC Server ending")
            else:
                self.logger.info("RPC Server is disabled")
        except Exception as e:
            self.logger.error("RPC Server crashed", exc_info=True)
Example #7
0
class FuncionS():
    
    def abre(self,puerto=8000,IP='127.0.0.1'):
        self.server = SimpleXMLRPCServer((IP, puerto))
        self.server.register_instance(MyFuncs())
        self.server.serve_forever()

    def cerrar(self):
        self.server.shutdown()
        self.server.server_close()
Example #8
0
class RPCServer(threading.Thread):
    """
    The RPCServer thread provides an API for external programs to interact
    with MOM.
    """
    def __init__(self, config, momFuncs):
        threading.Thread.__init__(self, name="RPCServer")
        self.setDaemon(True)
        self.config = config
        self.momFuncs = momFuncs
        self.logger = logging.getLogger('mom.RPCServer')
        self.server = None
        self.start()

    def thread_ok(self):
        if self.server is None:
            return True
        return self.isAlive()

    def create_server(self):
        try:
            unix_port = None
            port = self.config.getint('main', 'rpc-port')
        except ValueError:
            port = None
            unix_port = self.config.get('main', 'rpc-port')
            self.logger.info("Using unix socket "+unix_port)

        if unix_port is None and (port is None or port < 0):
            return None

        if unix_port:
            self.server = UnixXmlRpcServer(unix_port)
        else:
            self.server = SimpleXMLRPCServer(("localhost", port),
                            requestHandler=RequestHandler, logRequests=0)

        self.server.register_introspection_functions()
        self.server.register_instance(self.momFuncs)

    def shutdown(self):
        if self.server is not None:
            self.server.shutdown()

    def run(self):
        try:
            self.create_server()
            if self.server is not None:
                self.logger.info("RPC Server starting")
                self.server.serve_forever()
                self.logger.info("RPC Server ending")
            else:
                self.logger.info("RPC Server is disabled")
        except Exception as e:
            self.logger.error("RPC Server crashed", exc_info=True)
class OmsSimulatorServer(object):
    """
    Dispatches an OmsSimulator with a SimpleXMLRPCServer. Normally,
    this is intended to be run outside of pyon.
    """

    def __init__(self, host, port, thread=False):
        """
        @param host   Hostname for the service
        @param port   Port for the service
        @param thread If True, a thread is launched to call serve_forever on
                      the server. Do not use this within a pyon-dominated
                      environment because of gevent monkey patching
                      behavior that doesn't play well with threading.Thread
                      (you'll likely see the thread blocked). By default False.
        """
        self._sim = OmsSimulator()
        self._server = SimpleXMLRPCServer((host, port), allow_none=True)
        self._server.register_introspection_functions()
        self._server.register_instance(self._sim, allow_dotted_names=True)
        log.info("OMS simulator xmlrpc server listening on %s:%s ..." % (host, port))
        if thread:
            self._check_pyon()
            runnable = Thread(target=self._server.serve_forever)
            runnable.start()
            log.info("started thread.")
        else:
            self._server.serve_forever()

    @property
    def methods(self):
        return self._server.system_listMethods()

    @property
    def oms_simulator(self):
        return self._sim

    def shutdown(self):
        log.info("_server.shutdown called.")
        if self._sim:
            self._sim = None
            self._server.shutdown()
            self._server = None

    @staticmethod
    def _check_pyon():
        """
        Prints a warning message if pyon is detected.
        """
        import sys

        if "pyon" in sys.modules:
            m = "!! WARNING: pyon in sys.modules !!"
            s = "!" * len(m)
            sys.stderr.write("\n%s\n%s\n%s\n\n" % (s, m, s))
Example #10
0
def execute_main(listen_port=None, spec_file=None, aut_file=None, show_gui=False):
    logging.info("Hello. Let's do this!")

    # Create the XML-RPC server
    if listen_port is None:
        # Search for a port we can successfully bind to
        while True:
            listen_port = random.randint(10000, 65535)
            try:
                xmlrpc_server = SimpleXMLRPCServer(("127.0.0.1", listen_port), logRequests=False, allow_none=True)
            except socket.error as e:
                pass
            else:
                break
    else:
        xmlrpc_server = SimpleXMLRPCServer(("127.0.0.1", listen_port), logRequests=False, allow_none=True)

    # Create the execution context object
    e = LTLMoPExecutor()

    # Register functions with the XML-RPC server
    xmlrpc_server.register_instance(e)

    # Kick off the XML-RPC server thread
    XMLRPCServerThread = threading.Thread(target=xmlrpc_server.serve_forever)
    XMLRPCServerThread.daemon = True
    XMLRPCServerThread.start()
    logging.info("Executor listening for XML-RPC calls on http://127.0.0.1:{} ...".format(listen_port))

    # Start the GUI if necessary
    if show_gui:
        # Create a subprocess
        logging.info("Starting GUI window...")
        p_gui = subprocess.Popen(
            ["python", "-u", os.path.join(project.get_ltlmop_root(), "lib", "simGUI.py"), str(listen_port)]
        )

        # Wait for GUI to fully load, to make sure that
        # to make sure all messages are redirected
        e.externalEventTargetRegistered.wait()

    if spec_file is not None:
        # Tell executor to load spec & aut
        # if aut_file is None:
        #    aut_file = spec_file.rpartition('.')[0] + ".aut"
        e.initialize(spec_file, aut_file, firstRun=True)

    # Start the executor's main loop in this thread
    e.run()

    # Clean up on exit
    logging.info("Waiting for XML-RPC server to shut down...")
    xmlrpc_server.shutdown()
    XMLRPCServerThread.join()
Example #11
0
class CIOMSSimulatorServer(object):
    """
    Dispatches an CIOMSSimulator with a SimpleXMLRPCServer. Normally,
    this is intended to be run outside of pyon.
    """
    def __init__(self, host, port, thread=False):
        """
        @param host   Hostname for the service
        @param port   Port for the service
        @param thread If True, a thread is launched to call serve_forever on
                      the server. Do not use this within a pyon-dominated
                      environment because of gevent monkey patching
                      behavior that doesn't play well with threading.Thread
                      (you'll likely see the thread blocked). By default False.
        """
        self._sim = CIOMSSimulator()
        self._server = SimpleXMLRPCServer((host, port), allow_none=True)
        self._server.register_introspection_functions()
        self._server.register_instance(self._sim, allow_dotted_names=True)
        log.info("OMS simulator xmlrpc server listening on %s:%s ..." %
                 (host, port))
        if thread:
            self._check_pyon()
            runnable = Thread(target=self._server.serve_forever)
            runnable.start()
            log.info("started thread.")
        else:
            self._server.serve_forever()

    @property
    def methods(self):
        return self._server.system_listMethods()

    @property
    def oms_simulator(self):
        return self._sim

    def shutdown(self):
        log.info("_server.shutdown called.")
        if self._sim:
            self._sim = None
            self._server.shutdown()
            self._server = None

    @staticmethod
    def _check_pyon():
        """
        Prints a warning message if pyon is detected.
        """
        import sys
        if 'pyon' in sys.modules:
            m = "!! WARNING: pyon in sys.modules !!"
            s = "!" * len(m)
            sys.stderr.write("\n%s\n%s\n%s\n\n" % (s, m, s))
Example #12
0
class CanapeXMLRPCServer(threading.Thread):
    def __init__(self, hostname='localhost', port=8080):
        threading.Thread.__init__(self)
        self.daemon = True
        self.server = SimpleXMLRPCServer((hostname, port), allow_none=True)

    def run(self):
        self.server.register_instance(CanapeInterface())
        self.server.serve_forever()

    def shutdown(self):
        self.server.shutdown()
Example #13
0
class ProntRPC(object):

    server = None

    def __init__(self, pronsole, port = RPC_PORT):
        self.pronsole = pronsole
        used_port = port
        while True:
            try:
                self.server = SimpleXMLRPCServer(("localhost", used_port),
                                                 allow_none = True,
                                                 logRequests = False)
                if used_port != port:
                    logging.warning(_("RPC server bound on non-default port %d") % used_port)
                break
            except socket.error as e:
                if e.errno == 98:
                    used_port += 1
                    continue
                else:
                    raise
        self.server.register_function(self.get_status, 'status')
        self.thread = Thread(target = self.run_server)
        self.thread.start()

    def run_server(self):
        self.server.serve_forever()

    def shutdown(self):
        self.server.shutdown()
        self.thread.join()

    def get_status(self):
        if self.pronsole.p.printing:
            progress = 100 * float(self.pronsole.p.queueindex) / len(self.pronsole.p.mainqueue)
        elif self.pronsole.sdprinting:
            progress = self.percentdone
        else: progress = None
        if self.pronsole.p.printing or self.pronsole.sdprinting:
            eta = self.pronsole.get_eta()
        else:
            eta = None
        if self.pronsole.tempreadings:
            temps = parse_temperature_report(self.pronsole.tempreadings)
        else:
            temps = None
        z = self.pronsole.curlayer
        return {"filename": self.pronsole.filename,
                "progress": progress,
                "eta": eta,
                "temps": temps,
                "z": z,
                }
Example #14
0
class XMLRPCHarness(object):
    """
    A setUp/tearDown harness that will provide an XMLRPC Server for us
    to test against.
    """

    HOST = "localhost"
    PORT = 8999


    def __init__(self, *args, **kwds):
        super(XMLRPCHarness, self).__init__(*args, **kwds)
        self.server = None
        self.thread = None
        self.dummy = None


    def setUp(self):
        assert(self.server is None)
        assert(self.thread is None)

        self.dummy = Dummy()

        self.server = SimpleXMLRPCServer((self.HOST, self.PORT),
                                         logRequests=False)
        self.server.register_function(self.dummy.get, "get")
        self.server.register_function(self.dummy.steal, "steal")
        self.server.register_multicall_functions()

        self.thread = Thread(target=self.server.serve_forever,
                             kwargs={"poll_interval":0.2})
        self.thread.start()


    def tearDown(self):
        assert(self.server is not None)
        assert(self.thread is not None)

        self.server.shutdown()
        self.server.socket.close()
        self.server = None

        self.dummy = None

        self.thread.join()
        self.thread = None


    def get_client(self):
        assert(self.server is not None)
        assert(self.thread is not None)

        return ServerProxy("http://%s:%i" % (self.HOST, self.PORT))
Example #15
0
class ExecutorServer(object):
    """ExecutorServer"""
    def __init__(self, conf):
        self._conf = conf

        self._listen_host = conf.get("listen_host", "0.0.0.0")
        self._listen_port = int(conf.get("listen_port", 51290))
        self._listen_addr = (self._listen_host, self._listen_port)

        self._executor = Executor(conf)

        self._rpc_server = SimpleXMLRPCServer(self._listen_addr,
                                              logRequests=False,
                                              allow_none=True)
        self._rpc_server.register_introspection_functions()
        self._rpc_server.register_function(self._executor.execute, "execute")

        self._quit = False
        pass

    def _rpc_tf(self):
        logger.info("rpc thread started")
        logger.info("rpc server starting [host:%s] [port:%d]" %
                    (self._listen_host, self._listen_port))
        try:
            self._rpc_server.serve_forever()
        except Exception as e:
            logger.error("Exception: %s\n%s" %
                         (str(e), traceback.format_exc()))
        logger.info("rpc thread exited")
        pass

    def start(self):
        logger.info("executor started")

        rpc_thread = threading.Thread(target=self._rpc_tf)
        rpc_thread.setDaemon(True)
        rpc_thread.start()

        # Glances in the past 500 years, an encounter this life. ~.~ . Not supported. #
        while not self._quit:
            time.sleep(500 * 365 * 24 * 60 * 60 / 500)

        logger.info("executor exited")
        pass

    def stop(self):
        logger.info("stop executor")
        self._executor.stop()
        self._quit = True
        self._rpc_server.shutdown()
        pass
Example #16
0
class XmlRpcServer(object):
	"""
		XMLRPC service, exported functions are in class _RpcFuncs
	"""
	def __init__(self, host, port):
		self._server = SimpleXMLRPCServer((host, port))
		self._server.register_introspection_functions()
		self._server.register_instance(_RpcFuncs())
		logger.info('Listening for XMLRPC clients on %s:%d', host, port)
		self._server.serve_forever()

	def shutdown(self):
		self._server.shutdown()
Example #17
0
class Server(object):
    """ A general purpose XML-RPC-exposing server.
    """

    def __init__(self, listen_ip='0.0.0.0'):
        """ Prepare the XML-RPC server, map the exposed functions.
        """
        self.server = SimpleXMLRPCServer((listen_ip, PORT), logRequests=False)
        self.server.register_function(self._init, 'init')
        self.server.register_function(self._call, 'call')
        self.server.register_function(self._get, 'get')
        self.server.register_function(self._set, 'set')
        self.cls = {}

    def start(self):
        """ Start the server.
        """
        self.server.serve_forever()

    def stop(self):
        """ Stop the server.
        """
        self.server.shutdown()

    def _init(self, cls_src, *args):
        """ Register and initialise a class, class id. Only to be called via
            XML-RPC.
        """
        existing_classes = dir()
        exec(cls_src)
        new_class = [c for c in dir() if c not in existing_classes][0]
        next_id = len(self.cls)
        self.cls[next_id] = eval(new_class)(*args)
        return next_id

    def _call(self, cls_id, method, *args):
        """ Call a method. Only to be called via XML-RPC.
        """
        return getattr(self.cls[cls_id], method)(*args)

    def _get(self, cls_id, attr):
        """ Return the value of an attribute. Only to be called via XML-RPC.
        """
        return getattr(self.cls[cls_id], attr)

    def _set(self, cls_id, attr, val):
        """ Set the value of an attribute. Only to be called via XML-RPC.
        """
        setattr(self.cls[cls_id], attr, val)
        return 0
Example #18
0
class Server:
    """It's a server"""

    #----------------------------------------------------------------------
    def __init__(self, port=7777):

        # Create server
        hostname = socket.gethostname()
        self.server = SimpleXMLRPCServer((hostname, port),
                                         requestHandler=RequestHandler,
                                         allow_none=True)
        self.server.register_introspection_functions()

        self.server.register_function(self.StopServer, 'shutdown')

    # Register pow() function; this will use the value of
    # pow.__name__ as the name, which is just 'pow'.
    #server.register_function(pow)

    # Register a function under a different name
    #def adder_function(x,y):
    #return x + y

    # Register an instance; all the methods of the instance are
    # published as XML-RPC methods (in this case, just 'div').

# class MyFuncs:
#   def div(self, x, y):
#      return x // y

#server.register_instance(MyFuncs())

    def Start(self):
        # Run the server's main loop
        print 'start'
        self.server.serve_forever()

    def StopServer(self):
        # Run the server's main loop
        print 'stop'
        self.server.shutdown()

    def GetServer(self):
        return self.server

    def RegisterFunction(self, function, function_name):
        self.server.register_function(function, function_name)

    def RegisterInstance(self, instance):
        self.server.register_instance(instance)
class CVManager(object, SimpleXMLRPCRequestHandler):
    def __init__(self, engines):
        self.logger = getLogger("CVWorker")

        rpc_paths = ("/RPC2",)
        # Create server
        self.server = SimpleXMLRPCServer(("localhost", 8000))
        self.server.register_introspection_functions()
        self.engines = engines
        self.cur_id = 0
        self.cv_workers = []
        # message queue to communicate with controller thread
        self.msgqueue = None

        # register cv vm workers into its corresponding
        # engines
        # somehow the logger will output msgs twice for each debug call
        def register_vm(ip_addr, category):
            for engine in self.engines:
                if category == engine.type:
                    worker = CVWorker(ip_addr, category, self.cur_id)
                    engine.register(worker)
                    self.cv_workers.append(worker)
                    self.cur_id += 1
                    self.logger.debug("current worker list: ")
                    for worker in self.cv_workers:
                        self.logger.debug(worker)
                    self.logger.debug("worker list len: " + str(len(self.cv_workers)))
                    return True
            self.logger.debug("{} failed to register. Invalid category".format(ip_addr))
            return False

        self.server.register_function(register_vm, "register_vm")

        def hello(name):
            return "{}, server is live and well!\n".format(name)

        self.server.register_function(hello, "hello")

        self.logger.info("server started!")

    def shutdown(self):
        self.server.shutdown()

    def run(self, msgqueue):
        self.msgqueue = msgqueue
        self.server.serve_forever()

    def getAllWorkers(self):
        return self.cv_workers
Example #20
0
def main():

    ## Cmd line parameters
    parser = argparse.ArgumentParser(
        description='MyOffice Document API. Сервер генерации документов.')
    parser.add_argument('-p', action="store", dest="port", \
                        default='8000', type=int, \
                        help='Порт. Значение по умолчанию 8000')
    parser.add_argument('-s', action="store", dest="host", default='127.0.0.1', \
                        help='Хост. Значение по умолчанию 127.0.0.1')
    parser.add_argument('-t', action="store", dest="folder_templ", default='./template', \
                        help='Путь к каталогу шаблонов. Значение по умолчанию ./template')
    parser.add_argument('-o', action="store", dest="folder_out", default='./out', \
                        help='Путь к каталогу целевых документов. Значение по умоланию ./out')
    #parser.add_argument('-d', '--debug', action='store_true',        help='Enable debug mode with debug output')
    parser.add_argument('-f', action="append", dest="formats", default=["XODT", "PDF"], \
                        help='Форматы документов-шаблонов. Используйте несколько ключей чтобы перечислить все необходимые форматы',)

    args = parser.parse_args()

    logger = logging.getLogger('mofserver')

    server = SimpleXMLRPCServer((args.host, args.port),
                                allow_none=True,
                                logRequests=True)
    server.register_introspection_functions(
    )  # для удаленных вызовов listMethods, methodHelp
    #
    config = {}
    config["folder_templ"] = args.folder_templ
    config["folder_out"] = args.folder_out
    config["formats"] = []
    #config["log"]          = logging

    for p in args.formats:
        config["formats"].append(p.upper())

    if len(config["formats"]) < 1:
        logger.warning('Форматы для обработки не указаны.')

    server.register_instance(RPCDispatcher(config))
    #
    try:
        logger.info('Для завершения работы сервера нажмите Ctrl-C')
        server.serve_forever()
    except KeyboardInterrupt:
        logger.info("Сервер завершает работу...")

    logging.shutdown()
    server.shutdown()
Example #21
0
class RpcThread(threading.Thread):
    def __init__(self, simulator):
        super(RpcThread, self).__init__()
        self.simulator = simulator

    def run(self):
        self.server = SimpleXMLRPCServer(('localhost', SIMULATOR_PORT),
                                         allow_none=True)
        self.server.register_instance(self.simulator)

        log.info("Listening on %s" % SIMULATOR_PORT)
        self.server.serve_forever()

    def stop(self):
        self.server.shutdown()
Example #22
0
class Server:
    """It's a server"""
    #----------------------------------------------------------------------
    def __init__(self, port=7777):
    
        # Create server
        hostname = socket.gethostname()
        self.server = SimpleXMLRPCServer((hostname, port),
                                    requestHandler=RequestHandler, allow_none=True)
        self.server.register_introspection_functions()
        
        self.server.register_function(self.StopServer, 'shutdown')

    # Register pow() function; this will use the value of
    # pow.__name__ as the name, which is just 'pow'.
    #server.register_function(pow)

    # Register a function under a different name
    #def adder_function(x,y):
        #return x + y
    

    # Register an instance; all the methods of the instance are
    # published as XML-RPC methods (in this case, just 'div').
   # class MyFuncs:
     #   def div(self, x, y):
      #      return x // y

    #server.register_instance(MyFuncs())
    def Start(self):
        # Run the server's main loop
        print 'start'
        self.server.serve_forever()
        
    def StopServer(self):
        # Run the server's main loop
        print 'stop'
        self.server.shutdown()
        
    def GetServer(self):
        return self.server
    
    def RegisterFunction(self, function, function_name):
        self.server.register_function(function, function_name)
        
    def RegisterInstance(self, instance):
        self.server.register_instance(instance)
Example #23
0
def main():
    """
    Example server for serving INFO of all locally running redis-servers via XML-RPC.
    Since it is based on the non-production-quality LocalShardWatcher, it might fail for
    Redis servers using non-standard configurations, and will not work for Redises that
    require authentication.
    """

    parser = argparse.ArgumentParser(
        description=main.__doc__,
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('-p',
                        '--port',
                        type=int,
                        default=50051,
                        help='the port on which the server should listen')
    parser.add_argument('-a',
                        '--address',
                        default='127.0.0.1',
                        help='the address on which the server should listen')

    args = parser.parse_args()

    # prevent KeyboardInterrupt thrown in a greenlet from causing a stack trace to be printed
    gevent.hub.Hub.NOT_ERROR = (KeyboardInterrupt, )

    # Python's xmlrpc module serializes integers as i4 (32-bits) out of the box. This line causes all ints to
    # be serialized as i8 (64-bits), as some Redis INFO values require the additional space.
    xmlrpclib.Marshaller.dispatch[int] = lambda _, value, write: write(
        '<value><i8>{}</i8></value>'.format(value))

    print('Starting INFO server on {}:{}...'.format(args.address, args.port))

    server = SimpleXMLRPCServer((args.address, args.port))
    server.register_instance(redis_info_provider.InfoProviderServicer())
    Thread(target=server.serve_forever).start()

    try:
        with redis_info_provider.LocalShardWatcher(
        ), redis_info_provider.InfoPoller():
            print('INFO server running.')
            gevent.sleep(float('inf'))
    except KeyboardInterrupt:
        print('INFO server stopping.')
    finally:
        server.shutdown()
        server.server_close()
Example #24
0
def main(*argv):
    """This script is used as i/o api for communication with exabgp

    Arguments:
        :*argv: unparsed cli arguments

    In a separate thread an rpc server is started. This server will be used as an api towards the user.
    Stdin and stdout are used for communication with exabgp.
    """

    parser = argparse.ArgumentParser(description='ExaBgp rpc server script')
    parser.add_argument('--host', default='127.0.0.1', help='Host where exabgp is running (default is 127.0.0.1)')
    parser.add_argument('--loglevel', default=logging.DEBUG, help='Log level')
    parser.add_argument('--logfile', default='{}/exarpc.log'.format(os.path.dirname(os.path.abspath(__file__))),
                        help='Log file name.')
    parser.add_argument('--encoder', default='json', help='Exabgp encoder type')
    in_args = parser.parse_args(*argv)
    logging.basicConfig(filename=in_args.logfile, level=in_args.loglevel)

    storage = ExaStorage()
    rpcserver = SimpleXMLRPCServer((in_args.host, 8000), allow_none=True)
    rpcserver.register_instance(Rpcs(storage))
    trpc = threading.Thread(target=rpcserver.serve_forever)
    trpc.start()

    epoll = select.epoll()

    epoll.register(sys.__stdin__, select.EPOLLIN | select.EPOLLERR | select.EPOLLHUP)

    try:
        while True:
            logging.debug('Epoll loop')
            events = epoll.poll(10)
            for fd, event_type in events:
                logging.debug('Epoll returned: {},{}'.format(fd, event_type))
                if event_type != select.EPOLLIN:
                    raise Exception('Unexpected epoll event')
                else:
                    data = sys.stdin.readline()
                    logging.debug('Data recevied from exabgp: {}.'.format(data))
                    exa_msg_handler(storage, data, in_args.encoder)
    except Exception as e:
        logging.warn('Exception occured: {}'.format(e))
    finally:
        rpcserver.shutdown()
        trpc.join()
Example #25
0
class servernode(threading.Thread):
    def __init__(self,ip,port):
        super(servernode,self).__init__()
        self.ip = ip
        self.port = port
        self.server = SimpleXMLRPCServer((ip, port))
        self.server.register_introspection_functions()

    def register_function(self, function):
        self.server.register_function(function)

    def run(self):
        self.server.serve_forever()

    def stop_server(self):
        self.server.shutdown()
        self.server.server_close()
Example #26
0
class RaidServer():
    def __init__(self, server_port):
        self.memory = Memory.Operations()
        self.server = SimpleXMLRPCServer(("localhost", server_port), allow_none=True, logRequests=False)
        print "Listening on localhost : port ", server_port
        #Register all functions required for RPC
        self.server.register_instance(self.memory)
        self.server.register_introspection_functions()
        return
        
    def start_server(self):
        #Start the server
        self.server.serve_forever()
        
    def shutdown_server(self):
        #Shutdown the server
        self.server.shutdown()
Example #27
0
class RTevald():
    def __init__(self, options, log):
        self.options = options
        self.log = log
        self.server = None
        self.config = RTevald_config()

    def __prepare_datadir(self):
        startdir = os.getcwd()
        for dir in self.config.datadir.split("/"):
            if dir is '':
                continue
            if not os.path.exists(dir):
                os.mkdir(dir, 0700)
            os.chdir(dir)
        if not os.path.exists('queue'):
            os.mkdir('queue', 0700)
        os.chdir(startdir)

    def StartServer(self):
        # Create server
        self.server = SimpleXMLRPCServer(
            (self.options.listen, self.options.port),
            requestHandler=RequestHandler)
        self.server.register_introspection_functions()

        # setup a class to handle requests
        self.server.register_instance(
            xmlrpc_API1.XMLRPC_API1(self.config, nodbaction=True, debug=True))

        # Run the server's main loop
        self.log.Log(
            "StartServer",
            "Listening on %s:%i" % (self.options.listen, self.options.port))
        try:
            self.__prepare_datadir()
            self.server.serve_forever()
        except KeyboardInterrupt:
            self.log.Log("StartServer", "Server caught SIGINT")
            self.server.shutdown()
        finally:
            self.log.Log("StartServer", "Server stopped")

    def StopServer(self):
        self.server.shutdown()
Example #28
0
class XMLRPCContainer( DaemonContainer ):
    
    def __init__(self, environment):
        super(XMLRPCContainer, self).__init__(environment)
        self.address = (environment.get("host","localhost"), environment.get("port", 9001))
        self.server = SimpleXMLRPCServer(self.address)
        self.server.register_introspection_functions()
        self.server.register_multicall_functions()
        self.server_thread = threading.Thread(self.server.serve_forever) 

    def on_start(self):
        self.server_thread.stop()
    
    def on_stop(self):
        self.server.shutdown()
        
    def register_service(self, name, method):
        pass
Example #29
0
File: rpc.py Project: ddfelts/ace
class RPCSink(Sink):
	"""
	RPC sink. This sink forwards events as Event instances and doesn't need a
	translator.

	Configuration options:
	 - address: determines, on which address the socket listens
	 - port: port of the RPC server
	"""
	def __init__(self, num, config, logger, queue):
		Sink.__init__(self, num, config, logger, queue)
		if not self.options.has_key("address"):
			self.raiseException("No 'address' specified in options.")
		if not self.options.has_key("port"):
			self.raiseException("No 'port' specified in options.")
		if not self.options['port'].isdigit():
			self.raiseException("Option 'port': must be a number.")
		self.address = self.options['address']
		self.port = int(self.options['port'])
		self.server = SimpleXMLRPCServer((self.address, self.port), logRequests=False, allow_none=True)
		self.server.register_function(self.getEvents)

	def finish(self):
		"""
		Stop the sink and shut the server down.
		"""
		Sink.finish(self)
		self.server.shutdown()

	def run(self):
		"""
		The main thread function.
		"""
		self.server.serve_forever()
	
	def getEvents(self):
		events = []
		while self.queue.qsize()>0:
			event = self.queue.get()
			events.append(dict([(k, event.__dict__[k])
			                    for k in constants.EVENT_FIELDS
			                    if event.__dict__.has_key(k)]))
			self.queue.task_done()
		return events
Example #30
0
class XmlRpcServer(object):
    """
    XMLRPC service, exported functions are in class _RpcFuncs
    """
    def __init__(self, root, host, port):
        self._root = root
        self.host = host
        self.port = port
        self._server = SimpleXMLRPCServer((self.host, self.port))
        self._server.register_introspection_functions()
        self._server.register_instance(_RpcFuncs(self._root))

    def start(self):
        logger.info('Listening for XMLRPC clients on %s:%d', self.host,
                    self.port)
        self._server.serve_forever()

    def shutdown(self):
        self._server.shutdown()
Example #31
0
class RTevald():
    def __init__(self, options, log):
        self.options = options
        self.log = log
        self.server = None
        self.config = RTevald_config()

    def __prepare_datadir(self):
        startdir = os.getcwd()
        for dir in self.config.datadir.split("/"):
            if dir is '':
                continue
            if not os.path.exists(dir):
                os.mkdir(dir, 0700)
            os.chdir(dir)
        if not os.path.exists('queue'):
            os.mkdir('queue', 0700)
        os.chdir(startdir)

    def StartServer(self):
        # Create server
        self.server = SimpleXMLRPCServer((self.options.listen, self.options.port),
                                         requestHandler=RequestHandler)
        self.server.register_introspection_functions()

        # setup a class to handle requests
        self.server.register_instance(xmlrpc_API1.XMLRPC_API1(self.config, nodbaction=True, debug=True))

        # Run the server's main loop
        self.log.Log("StartServer", "Listening on %s:%i" % (self.options.listen, self.options.port))
        try:
            self.__prepare_datadir()
            self.server.serve_forever()
        except KeyboardInterrupt:
            self.log.Log("StartServer", "Server caught SIGINT")
            self.server.shutdown()
        finally:
            self.log.Log("StartServer", "Server stopped")

    def StopServer(self):
        self.server.shutdown()
Example #32
0
class XMLRPCServerThread(object):
    def __init__(self, port):
        self.server = SimpleXMLRPCServer(("localhost", port),
                                         requestHandler=Handler,
                                         logRequests=False,
                                         allow_none=True)

    def add_instance(self, instance):
        for key in dir(instance):
            attr = getattr(instance, key)
            if isinstance(attr, self.__init__.__class__):
                self.server.register_function(
                    attr, instance.__class__.__name__ + "_" +
                    getattr(attr, "_real_name", attr.__name__))

    def __call__(self):
        self.server.serve_forever()

    def stop(self):
        self.server.shutdown()
        self.server.server_close()
Example #33
0
class LogServer(Thread):
    def __init__(self, ip, port, uri, output):
        super(LogServer, self).__init__()
        self.running = True
        rpc_paths = ('/RPC2', )
        # print ("impleXMLRPCServer({})..").format(iptuple)
        self.server = SimpleXMLRPCServer((ip, port),
                                         requestHandler=RequestHandler)
        self.server.register_introspection_functions()
        self.outputfile = output
        self.server.register_instance(MyFuncs(self.outputfile))

    def register_function(self, function):
        log.info("%s\r\nLogServer started".format("=" * 30, ))
        self.server.register_function(function)

    def run(self):
        self.server.serve_forever()

    def stop_server(self):
        self.server.shutdown()
        self.server.server_close()
Example #34
0
class ScriptServer(object):
    def __init__(self, port=default_port, methods={}):
        self.server = SimpleXMLRPCServer(
            ('localhost', port),
            requestHandler=RequestHandler,
            logRequests=False,
            allow_none=True)

        for name,func in methods.items():
            self.server.register_function(func, name)
        if 'python' not in methods:
            self.server.register_function(_python, 'python')

        self.server.register_function(lambda: os.getpid(), 'pid')

        server = self.server
        self.t = Thread(target=lambda: server.serve_forever())
        self.t.start()

    def __del__(self):
        print("Shutting down ScriptServer")
        self.server.shutdown()
Example #35
0
class RPCServer(threading.Thread):
    """
    The RPCServer thread provides an API for external programs to interact
    with MOM.
    """
    def __init__(self, config, host_monitor, guest_manager, policy_engine):
        threading.Thread.__init__(self, name="RPCServer")
        self.setDaemon(True)
        self.config = config
        self.threads = { 'host_monitor': host_monitor,
                         'guest_manager': guest_manager,
                         'policy_engine': policy_engine }
        self.logger = logging.getLogger('mom.RPCServer')
        self.start()
    
    def create_server(self):
        try:
            port = self.config.getint('main', 'rpc-port')
        except ValueError:
            return None
        if port is None or port < 0:
            return None
        self.server = SimpleXMLRPCServer(("localhost", port),
                            requestHandler=RequestHandler, logRequests=0)
        self.server.register_introspection_functions()
        self.server.register_instance(MOMFuncs(self.config, self.threads))
    
    def shutdown(self):
        if self.server is not None:
            self.server.shutdown()

    def run(self):
        self.create_server()
        if self.server is not None:
            self.logger.info("RPC Server starting")
            self.server.serve_forever()
            self.logger.info("RPC Server ending")
        else:
            self.logger.info("RPC Server is disabled")
class IpyServerXMLRPC(threading.Thread):
    def __init__(self, port=9876, logging = False):
        """ Simple creation of the XMLRPC server in a separate thread"""
        super(IpyServerXMLRPC, self).__init__()
        self.setDaemon(True)
        self.server = SimpleXMLRPCServer(("localhost",port),logRequests=logging)
        self.server.register_function(self.send)
        self.server.register_function(self.test_pylab)
        if logging:
            print "setup complete at: %s port %d" % self.get_socket_name()

    def run(self):
        """ The main worker of the threa. No separate loop as it is already present in serve_forever()""" 
        self.server.serve_forever()

    def send(self,data):
        """ Gets the data from vim and splits it in parts (just in case). Passes to ipython.
        Returns the number of lines being pasted to ipython"""
        data = data.split('\n')
        cmds = list()
        for line in data:
            cmds.append(line)
        ip=IPython.ipapi.get()
        ip.runlines(cmds)
        return len(cmds)
    def test_pylab(self):
        ip=IPython.ipapi.get()
        ip.runlines('a = logspace(1,10,101)')
        ip.runlines('print a')

    def kill(self):
        """ Kills the server. Should be run from a separate thread, such as the ipython thread.
        """
        print 'shutting down vim server'
        self.server.shutdown()
        raise IPython.ipapi.TryNext 
    def get_socket_name(self):
        return self.server.socket.getsockname()
Example #37
0
class Source(threading.Thread):
    ''' Facade for simple remote communication using XMLRPCServer.
    '''
    def __init__(self, addr):
        threading.Thread.__init__(self)
        ip, port = addr
        self.addr = addr

        self.server = SimpleXMLRPCServer((ip, port),
                                         requestHandler=RequestHandler,
                                         logRequests=False,
                                         allow_none=True)
        # self.server.register_introspection_functions()

    def register_function(self, func):
        self.server.register_function(func, 'send')

    def run(self):
        self.server.serve_forever()

    def stop(self):
        self.server.shutdown()
        self.server.server_close()
class LibvirtXMLRpcServer(object):

    def __init__(self, uri=None, host=HOSTNAME, port=PORT, all=False):
        """
        :param uri: Libvirt connection URI. see virsh(1) also.
        :param host: Host in which this server instance runs
        :param port: Listening port
        :param all: If True, all methods of libvirt connection object will be
                    registered and exported to clients.
        """
        self._server = SimpleXMLRPCServer((host, port))
        self._conn = libvirt.open(uri)

        if all:
            self.register_instance(self._conn)
        else:
            self.register_functions(self._conn)

        self._server.register_introspection_functions()

    def run(self):
        try:
            logging.info("Starting. (Exit with '^C')")
            self._server.serve_forever()

        except KeyboardInterrupt:
            logging.info("Exiting ...")
            self._server.shutdown()

    def register_instance(self, conn):
        self._server.register_instance(conn)

    def register_functions(self, conn):
        for fn in dir(conn):
            f = getattr(conn, fn)
            if f:
                self._server.register_function(f, fn)
class CIOMSSimulatorServer(object):
    """
    Dispatches an CIOMSSimulator with a SimpleXMLRPCServer.
    Intended to be run outside of pyon.
    """

    def __init__(self, host, port, inactivity_period=None):
        """
        Creates a SimpleXMLRPCServer and starts a Thread where serve_forever
        is called on the server.

        @param host   Hostname for the service
        @param port   Port for the service
        """
        self._running = True
        self._sim = CIOMSSimulatorWithExit(self)

        if log.isEnabledFor(logging.DEBUG):
            ser = NetworkUtil.serialize_network_definition(self._sim._ndef)
            log.debug("network serialization:\n   %s" % ser.replace('\n', '\n   '))
            log.debug("network.get_map() = %s\n" % self._sim.config.get_platform_map())

        self._server = SimpleXMLRPCServer((host, port), allow_none=True)

        actual_port = self._server.socket.getsockname()[1]
        uri = "http://%s:%s/" % (host, actual_port)

        # write the URI to a file for launching process to see it:
        with open("logs/rsn_oms_simulator.yml", 'w') as f:
            f.write("rsn_oms_simulator_uri=%s\n" % uri)

        self._server.register_introspection_functions()
        self._server.register_instance(self._sim, allow_dotted_names=True)

        log.info("Methods:\n\t%s", "\n\t".join(self._server.system_listMethods()))

        self._check_pyon()

        runnable = Thread(target=self._server.serve_forever)
        runnable.setDaemon(True)
        runnable.start()

        log.info("OMS simulator xmlrpc server listening on %s" % uri)

        if inactivity_period:
            self._sim.x_exit_inactivity(inactivity_period)

    def shutdown_server(self):
        self._running = False
        if self._sim:
            log.info("RSN OMS simulator exiting...")
            self._sim = None
            self._server.shutdown()
            self._server = None

    def wait_until_shutdown(self):
        while self._running:
            time.sleep(1)

        self.shutdown_server()

    @staticmethod
    def _check_pyon():
        """
        Prints a warning message if pyon is detected.
        """
        if 'pyon' in sys.modules:
            m = "!! WARNING: pyon in sys.modules !!"
            s = "!" * len(m)
            sys.stderr.write("\n%s\n%s\n%s\n\n" % (s, m, s))
Example #40
0
def execute_main(listen_port=None,
                 spec_file=None,
                 aut_file=None,
                 show_gui=False):
    logging.info("Hello. Let's do this!")

    # Create the XML-RPC server
    if listen_port is None:
        # Search for a port we can successfully bind to
        while True:
            listen_port = random.randint(10000, 65535)
            try:
                xmlrpc_server = SimpleXMLRPCServer(("127.0.0.1", listen_port),
                                                   logRequests=False,
                                                   allow_none=True)
            except socket.error as e:
                pass
            else:
                break
    else:
        xmlrpc_server = SimpleXMLRPCServer(("127.0.0.1", listen_port),
                                           logRequests=False,
                                           allow_none=True)

    # Create the execution context object
    e = LTLMoPExecutor()

    # Register functions with the XML-RPC server
    xmlrpc_server.register_instance(e)

    # Kick off the XML-RPC server thread
    XMLRPCServerThread = threading.Thread(target=xmlrpc_server.serve_forever)
    XMLRPCServerThread.daemon = True
    XMLRPCServerThread.start()
    logging.info(
        "Executor listening for XML-RPC calls on http://127.0.0.1:{} ...".
        format(listen_port))

    # Start the GUI if necessary
    if show_gui:
        # Create a subprocess
        logging.info("Starting GUI window...")
        p_gui = subprocess.Popen(
            [sys.executable, "-u", "-m", "lib.simGUI",
             str(listen_port)])

        # Wait for GUI to fully load, to make sure that
        # to make sure all messages are redirected
        e.externalEventTargetRegistered.wait()

    if spec_file is not None:
        # Tell executor to load spec & aut
        #if aut_file is None:
        #    aut_file = spec_file.rpartition('.')[0] + ".aut"
        e.initialize(spec_file, aut_file, firstRun=True)

    # Start the executor's main loop in this thread
    e.run()

    # Clean up on exit
    logging.info("Waiting for XML-RPC server to shut down...")
    xmlrpc_server.shutdown()
    XMLRPCServerThread.join()
    logging.info("XML-RPC server shutdown complete.  Goodbye.")
Example #41
0
        if success:
            CURRENT_STATUS = STATUS_COMPLETED
        else:
            if error:
                ERROR_MESSAGE = str(error)

            CURRENT_STATUS = STATUS_FAILED

        RESULTS_FOLDER = results

        return True

if __name__ == "__main__":
    try:
        if not BIND_IP:
            BIND_IP = socket.gethostbyname(socket.gethostname())

        print("[+] Starting agent on %s:%s ..." % (BIND_IP, BIND_PORT))

        # Disable DNS lookup, by Scott D.
        def FakeGetFQDN(name=""):
            return name
        socket.getfqdn = FakeGetFQDN

        server = SimpleXMLRPCServer((BIND_IP, BIND_PORT), allow_none=True)
        server.register_instance(Agent())
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()
class ServerThread(threading.Thread):
  def __init__(self, name):
    threading.Thread.__init__(self)
    self.name = name
    self.server = SimpleXMLRPCServer(("localhost", common.port), requestHandler=RequestHandler)

    class Functions:
      def getPeers(self, peers):
        for u in peers:
          if u not in common.known_urls:
            common.known_urls.append(u)
        return common.known_urls

      def getHashes(self):
        return common.hashes

      def ping(self, vector):
        common.updateVector(vector, 0)

        if common.write == True or common.read == True:
          common.updateMessageList(vector, common.message_type.PING)

        return 1

      def getPort(self):
        return common.port

      def sendPasswords(self, pow1, pow2, vector):
        if pow2[0] in known_pows2:
          return 0

        if md5(pow1[0]).hexdigest() != pow2[0]:
          return 0

        common.updateVector(vector, 0)

        common.m_pows.acquire()
        try:
          common.known_pows1.append(pow1[0])
          common.known_pows2.append(pow2[0])
        finally:
          common.m_pows.release()

        return 1

      def broadcastPOW(self, pow1, pow2, vector):
        common.updateVector(vector, 1)

        common.m_pows.acquire()
        try:
          for p in pow2:
            if p not in known_pows2:
              common.known_pows1.append(p)
              common.known_pows2.append(p)
        finally:
          common.m_pows.release()

        return 0

      def acquire(self, id_mutex, vector):
        enter = False

        common.updateVector(vector, 0)
        common.updateList()

        if common.acquire == True:
          common.updateMessageList(vector, message_type.ACQUIRE)

        common.m_list.acquire()
        try:
          for a in common.g_acquire_list:
            if a[1] == '1':
              enter = False
            else:
              enter = True
        finally:
          common.m_list.release()

        return enter

      def release(self, id_mutex, port):
        return common.release(port)

      def write(self, pos, value):
        common.m_shared.acquire()
        try:
          #common.g_acquire_list[pos][1] = value
          common.shared_list.append(value)
        finally:
          common.m_shared.release()

        return True

      def read(self, pos):
        common.m_shared.acquire()
        try:
          #pos = common.g_acquire_list.index(value)
          value = common.shared_list[pos]
        finally:
          common.m_shared.release()

        return value

      #value = [port, dest_port, pos, value, vector]
      def requestToWrite(self, vector, value):
        if common.write == True:
          common.updateMessageList(vector, common.message_type.WRITE)

        value.append(common.message_type.WRITE)
        common.m_list.acquire()
        try:
          common.control_list.append(value)
        finally:
          common.m_list.release()
        return True

      def requestToRead(self, vector, value):
        if common.read == True:
          common.updateMessageList(vector, common.message_type.READ)

        value.append(common.message_type.READ)
        common.m_list.acquire()
        try:
          common.control_list.append(value)
        finally:
          common.m_list.release()

        return True

    self.server.register_instance(Functions())

  def stop(self):
    self.server.shutdown()

  def run(self):
    print "Starting " + self.name
    self.server.serve_forever()
    print "Exiting " + self.name
Example #43
0
def main(args):

    parser = argparse.ArgumentParser()
    parser.add_argument("-H",
                        "--host",
                        default="",
                        help="interface to serve rpc from")
    parser.add_argument("-p",
                        "--port",
                        default=8000,
                        help="increase output verbosity")
    args = parser.parse_args()

    logger = logging.getLogger('xmlrpc')
    logger.setLevel(logging.ERROR)

    LOG_TO_FILE = False
    if LOG_TO_FILE:
        # create a file handler
        handler = logging.FileHandler('xmlrpc.log')
        handler.setLevel(logging.INFO)

        # create a logging format
        formatter = logging.Formatter(
            '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)

        # add the handlers to the logger
        logger.addHandler(handler)

    # Create server
    server = SimpleXMLRPCServer((args.host, args.port),
                                requestHandler=RequestHandler)
    server.register_introspection_functions()

    class MyListener(object):
        def __init__(self):
            self.directory = {}

        def remove_service(self, zeroconf, type, name):
            if name in self.directory:
                print("Service %s removed" % (name, ))
                del self.directory[name]

        def add_service(self, zeroconf, type, name):
            if 'axcend.bridge' in name:
                info = zeroconf.get_service_info(type, name)
                if info:
                    address = "{}".format(socket.inet_ntoa(info.address))
                    print("Service %s added (%s)" % (name, address))
                    self.directory[name] = {'addr': address, 'port': info.port}

    zero = zeroconf.Zeroconf()
    listener = MyListener()
    browser = zeroconf.ServiceBrowser(zero, '_http._tcp.local.', listener)

    class MyFuncs:
        def __init__(self):
            Controller.gotoApplication()
            self.ser = None
            path = '/dev/ttyACM.axcend'
            if os.path.exists(path):
                self.ser = serial.Serial(path, timeout=0, write_timeout=0)
            if self.ser is None:
                raise Exception('unable to locate /dev/ttyACM*')
            self.logger = logging.getLogger('xmlrpc')

        def reset(self):
            self.logger.info('RESET')
            self.ser.reset_input_buffer()
            self.ser.reset_output_buffer()
            return True

        def echo(self, data):
            return data

        def list(self):
            results = []
            for name in listener.directory:
                item = {
                    'name': name,
                    'addr': listener.directory[name]['addr'],
                    'port': listener.directory[name]['port']
                }
                results.append(item)
            return results

        def write(self, data):
            def bytes(s):
                return ''.join(chr(x) for x in s)

            self.logger.error('WRITE {}'.format(data))
            retries = 2
            while retries:
                try:
                    self.ser.write(b'{}'.format(bytes(data)))
                    self.ser.flush()
                except:
                    self.logger.info('WRITE failure')
                    if self.ser is not None:
                        self.ser.close()
                    self.__init__()
                else:
                    break
                finally:
                    retries -= 1
            return True

        def read(self):
            retries = 2
            while retries:
                try:
                    data = [ord(x) for x in self.ser.read(2048)]
                    self.logger.info('READ {}'.format(data))
                except:
                    self.logger.info('READ failure')
                    if self.ser is not None:
                        self.ser.close()
                    self.__init__()
                else:
                    return data
                finally:
                    retries -= 1
            return []

        def __enter__(self):
            return self

        def __exit__(self, exc_type, exc_value, traceback):
            self.ser.close()

    with MyFuncs() as myfuncs:
        try:
            server.register_instance(myfuncs)
        except serial.serialutil.SerialException, e:
            print(e)
            return -1

        # Run the server's main loop
        try:
            server.serve_forever()
        except KeyboardInterrupt:
            pass
        finally:
            server.shutdown()
            zeroconf.close()
Example #44
0
class MinionSim(threading.Thread):
    def __init__(self, config_dir, count, osds_per_host, port=8761, prefix=PREFIX, domain=DOMAIN):
        super(MinionSim, self).__init__()
        self._config_dir = config_dir
        self._count = count
        self._server = None
        self._server_available = threading.Event()
        self.minions = {}

        def get_dns(index):
            host = "{0}{1:03d}".format(prefix, index)
            return host, "{0}.{1}".format(host, domain)

        config_file = os.path.join(self._config_dir, 'cluster.json')
        self.cluster = CephCluster(config_file)
        if not os.path.exists(config_file):
            self.cluster.create([get_dns(i)[1] for i in range(0, self._count)], osds_per_host=osds_per_host)
            self.cluster.save()

        # An XMLRPC service for the minions' fake ceph plugins to
        # get their state
        self._server = SimpleXMLRPCServer(("localhost", port), allow_none=True)
        self._server.register_instance(self.cluster)

        rpc_url = "http://localhost:%s" % port

        for i in range(0, self._count):
            hostname, fqdn = get_dns(i)
            self.minions[fqdn] = MinionLauncher(rpc_url, self._config_dir, hostname, fqdn, self.cluster)

        # Quick smoke test that these methods aren't going
        # to throw exceptions (rather stop now than get exceptions
        # remotely)
        for minion in self.minions.values():
            self.cluster.get_stats(minion.fqdn)

    def get_minion_fqdns(self):
        return [m.fqdn for m in self.minions.values()]

    def start(self):
        super(MinionSim, self).start()
        self._server_available.wait()

    def run(self):
        # A thread to generate some synthetic activity on the synthetic cluster
        load_gen = LoadGenerator(self.cluster)
        load_gen.start()

        self.start_minions()

        self._server_available.set()

        log.debug("Starting XMLRPC server...")
        self._server.serve_forever()
        self._server.server_close()
        log.debug("XMLRPC server terminated, stopping threads")

        log.debug("Stopping load gen")
        load_gen.stop()
        load_gen.join()

        log.debug("Stopping minions")
        self.halt_minions()

        log.debug("Saving state")
        self.cluster.save()
        log.debug("Complete.")

    def stop(self):
        # FIXME should stop the minions before the XMLRPC server, because otherwise
        # minions start getting XMLRPC errors
        self._server.shutdown()

    def halt_minions(self):
        for minion in self.minions.values():
            minion.stop()
        for minion in self.minions.values():
            minion.join()

    def start_minions(self):
        for minion in self.minions.values():
            minion.start()

    def halt_minion(self, minion_id):
        self.minions[minion_id].stop()
        self.minions[minion_id].join()

    def start_minion(self, minion_id):
        self.minions[minion_id].start()
Example #45
0
class CIOMSSimulatorServer(object):
    """
    Dispatches an CIOMSSimulator with a SimpleXMLRPCServer.
    Intended to be run outside of pyon.
    """
    def __init__(self, host, port, inactivity_period=None):
        """
        Creates a SimpleXMLRPCServer and starts a Thread where serve_forever
        is called on the server.

        @param host   Hostname for the service
        @param port   Port for the service
        """
        self._running = True
        self._sim = CIOMSSimulatorWithExit(self)

        if log.isEnabledFor(logging.DEBUG):
            ser = NetworkUtil.serialize_network_definition(self._sim._ndef)
            log.debug("network serialization:\n   %s" %
                      ser.replace('\n', '\n   '))
            log.debug("network.get_map() = %s\n" %
                      self._sim.config.get_platform_map())

        self._server = SimpleXMLRPCServer((host, port), allow_none=True)

        actual_port = self._server.socket.getsockname()[1]
        uri = "http://%s:%s/" % (host, actual_port)

        # write the URI to a file for launching process to see it:
        with open("logs/rsn_oms_simulator.yml", 'w') as f:
            f.write("rsn_oms_simulator_uri=%s\n" % uri)

        self._server.register_introspection_functions()
        self._server.register_instance(self._sim, allow_dotted_names=True)

        log.info("Methods:\n\t%s",
                 "\n\t".join(self._server.system_listMethods()))

        self._check_pyon()

        runnable = Thread(target=self._server.serve_forever)
        runnable.setDaemon(True)
        runnable.start()

        log.info("OMS simulator xmlrpc server listening on %s" % uri)

        if inactivity_period:
            self._sim.x_exit_inactivity(inactivity_period)

    def shutdown_server(self):
        self._running = False
        if self._sim:
            log.info("RSN OMS simulator exiting...")
            self._sim = None
            self._server.shutdown()
            self._server = None

    def wait_until_shutdown(self):
        while self._running:
            time.sleep(1)

        self.shutdown_server()

    @staticmethod
    def _check_pyon():
        """
        Prints a warning message if pyon is detected.
        """
        if 'pyon' in sys.modules:
            m = "!! WARNING: pyon in sys.modules !!"
            s = "!" * len(m)
            sys.stderr.write("\n%s\n%s\n%s\n\n" % (s, m, s))
Example #46
0
class BattleNode(object):
    def __init__(self, addr):
        self.addr = addr
        self.position = random_pair()
        self._victim = None
        self._victim_addr = None
        self._victim_lock = Lock()
        self.lost = Event()
        self.server = RPCServer(addr,requestHandler=SilentRPCHandler)
        self.server.register_function(self.defend, 'defend')
        self.server.register_function(self.insert, 'insert')
        self.server.register_function(self.ping, 'ping')
        self.server_thread = Thread(target=self.server.serve_forever)
        self.server_thread.daemon = True
        self.server_thread.start()
        self.fail_over = None
        self.loop_event = Event()
        self.loop_thread = Thread(target=self.ping_loop)
        self.loop_thread.daemon = True
        self.loop_thread.start()

    def __eq__(self, other):
        return self.addr == other.addr

    def __ne__(self, other):
        return self.addr != other.addr

    def stop(self):
        self.loop_event.clear()
        self.loop_thread.join()
        self.server.shutdown()
        self.server_thread.join()

    @property
    def victim(self):
        return self._victim_addr

    @victim.setter
    def victim(self, val):
        self._victim_addr = val
        self._victim = ServerProxy('http://{}:{}'.format(*val))
        self.loop_event.set()

    def attack(self, pos=None):
        if pos is None:
            pos = random_pair()
        with self._victim_lock:
            new_victim = tuple(self._victim.defend(pos))
            if new_victim != self.victim:
                self.victim = new_victim
                return True
        return False

    def defend(self, pos):
        if tuple(pos) == self.position:
            self.lost.set()
            return self._victim_addr
        return self.addr

    def insert(self, addr):
        with self._victim_lock:
            old_victim = self._victim_addr
            self.victim = tuple(addr)
            return old_victim

    def join(self, addr):
        attacker = ServerProxy('http://{}:{}'.format(*addr))
        with self._victim_lock:
            self.victim = tuple(attacker.insert(self.addr))

    def ping(self):
        if self.victim:
            return self.victim
        return self.addr

    def ping_victim(self):
        if self.victim:
            try:
                fail_over = tuple(self._victim.ping())
                if fail_over != self.victim:
                    self.fail_over = fail_over
            except IOError:
                if self.loop_event.is_set():
                    self.victim = self.fail_over

    def ping_loop(self):
        self.loop_event.wait()
        while self.loop_event.is_set():
            time.sleep(0.1)
            with self._victim_lock:
                self.ping_victim()
Example #47
0
class LTLMoPClient(object):
    def __init__(self, handler_port, chat_callback):
        self.CONFIG = Config()
        self.handler_port = handler_port
        self.map_bitmap = None
        self.robot_pos = None
        self.fiducial_positions = {}
        self.chat_callback = chat_callback
        # To be set by load_project
        self.proj = None
        self.executor_proxy = None
        self.dialogue_manager = None
        self.load_project(False)

    def load_project(self, reloading):
        """Load a project from CONFIG.spec_file, reusing the proxy if reloading."""
        spec_file = self.CONFIG.get_spec_file()
        self.proj = project.Project()
        self.proj.loadProject(spec_file)
        # Set the compiler to give structured responses
        self.proj.compile_options["slurp_struct_responses"] = True
        if not reloading:
            self.executor_proxy = self.get_executor(spec_file)
        else:
            self.executor_proxy.initialize(spec_file, None)
        self.dialogue_manager = self.get_dialogue_manager()

    def get_dialogue_manager(self):
        # Start dialogue manager
        dialogue_manager = BarebonesDialogueManager(self, self.executor_proxy)

        self.user_name = "User"

        # Wait for executor to fully boot
        self.append_log(">> Please wait, initializing...")
        while not self.executor_ready_flag.wait(0.1):
            time.sleep(.1)
        self.append_log(">> Ready!")
        self.append_log("  ")

        # Tell the user we are ready
        self.append_log("Hello.", "System")

        return dialogue_manager

    def get_executor(self, spec_file):
        # Start execution context
        print "Starting executor..."
        self.executor_ready_flag = threading.Event()
        self.executor_port = find_port(self.CONFIG.executor_base_port)
        print "Using port {} for executor".format(self.executor_port)
        self.executor_process = multiprocessing.Process(
            target=execute.execute_main,
            args=(self.executor_port, spec_file, None, False, {
                'handler_port': self.handler_port
            }))
        self.executor_process.start()

        # Start our own xml-rpc server to receive events from execute
        self.server_port = find_port(self.CONFIG.ltlmop_base_port)
        print "Using port {} for LTLMoP client".format(self.server_port)
        self.xmlrpc_server = SimpleXMLRPCServer(
            ("127.0.0.1", self.server_port),
            logRequests=False,
            allow_none=True)

        # Register functions with the XML-RPC server
        self.xmlrpc_server.register_function(self.handleEvent)

        # Kick off the XML-RPC server thread
        self.xmlrpc_server_thread = threading.Thread(
            target=self.xmlrpc_server.serve_forever)
        self.xmlrpc_server_thread.daemon = True
        self.xmlrpc_server_thread.start()
        print "LTLMoPClient listening for XML-RPC calls on \
               http://127.0.0.1:{} ...".format(self.server_port)

        # Connect to executor
        print "Connecting to executor...",
        while True:
            try:
                executor_proxy = xmlrpclib.ServerProxy(
                    "http://127.0.0.1:{}".format(self.executor_port),
                    allow_none=True)

                # Register with executor for event callbacks
                executor_proxy.registerExternalEventTarget(
                    "http://127.0.0.1:{}".format(self.server_port))
            except socket.error:
                sys.stdout.write(".")
            else:
                break
        print
        return executor_proxy

    def set_project(self, specfile):
        """Set the project of this client via a new specfile"""
        self.CONFIG.base_spec = specfile
        self.load_project(True)

    def handleEvent(self, event_type, event_data):
        """Processes messages from the controller, and updates the GUI accordingly"""

        if event_type in ["FREQ"]:  # Events to ignore
            pass
        elif event_type == "POSE":
            self.robot_pos = event_data
        elif event_type == "FID":
            if event_data[1] is None:
                # Hide the fiducial
                del self.fiducial_positions[event_data[0]]
            else:
                # Update fiducial position
                self.fiducial_positions[event_data[0]] = event_data[1:]
        elif event_type == "MESSAGE":
            # Provide a way for any part of LTLMoP to give feedback
            self.append_log(event_data, "System")
        elif event_type == "READY":
            self.executor_ready_flag.set()
        else:
            print "[{}] {}".format(event_type, event_data)

    def shutdown(self):
        print "Shutting down executor..."
        try:
            self.executor_proxy.shutdown()
        except socket.error:
            # Executor probably crashed
            pass

        self.xmlrpc_server.shutdown()
        self.xmlrpc_server_thread.join()
        print "Waiting for executor to quit..."
        print "(If this takes more than 5 seconds it has crashed and \
                you will need to run `killall python` for now)"

        self.executor_process.join(5)
        # After ten seconds, just kill it
        if self.executor_process.is_alive():
            self.executor_process.terminate()
            print "Executor did not exit in time and was executed."
        else:
            print "Executor exited normally."

    def append_log(self, message, agent=None):
        message = str(message)
        if agent:
            print agent + " : " + message
        else:
            print message

    def get_pragbot_input(self,
                          user_text):  # wxGlade: LTLMoPClient.<event_handler>
        # echo
        self.append_log(user_text, self.user_name)
        # response
        if self.dialogue_manager is None:
            self.append_log("Dialogue manager not initialized", "!!! Error")
        else:
            try:
                reply = self.dialogue_manager.tell(user_text)
            except Parser.ParseErrors:
                self.append_log("LTLParser encountered an error.")
                reply = self.dialogue_manager.interpreter.CRASH
            except IOError:
                self.append_log("Could not connect to NLPipeline.")
                raise
            else:
                if type(reply) == list:
                    for w in reply:
                        self.on_receive_reply(w)
                else:
                    self.on_receive_reply(reply)

    def on_receive_reply(self, result):
        """ when the dialoguemanager has gotten back to us """
        if result:
            self.chat_callback(result)
            self.append_log(result, "System")
class RPCAdmin:
    # Threaded mix-in
    class AsyncXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer):
        pass

    admin_ip = "169.254.35.100"
    admin_port = 8000

    agents_wired = [[1, "169.254.35.101", 8000], [2, "169.254.35.102", 8000],
                    [3, "169.254.35.103", 8000], [4, "169.254.35.104", 8000],
                    [6, "169.254.35.105", 8000], [7, "169.254.35.106", 8000],
                    [8, "169.254.35.107", 8000], [10, "169.254.35.108", 8000],
                    [12, "169.254.35.109", 8000], [13, "169.254.35.110", 8000],
                    [14, "169.254.35.101", 8001], [15, "169.254.35.102", 8001],
                    [16, "169.254.35.103", 8001], [17, "169.254.35.104", 8001],
                    [18, "169.254.35.105", 8001], [19, "169.254.35.106", 8001],
                    [20, "169.254.35.107", 8001], [21, "169.254.35.109", 8001],
                    [22, "169.254.35.110", 8001], [23, "169.254.35.108", 8001],
                    [24, "169.254.35.101", 8002], [25, "169.254.35.102", 8002],
                    [26, "169.254.35.103", 8002], [27, "169.254.35.104", 8002],
                    [28, "169.254.35.106", 8002], [29, "169.254.35.105", 8002],
                    [30, "169.254.35.107", 8002], [31, "169.254.35.110", 8002]]
    #

    agents_wireless = [[1, "192.168.1.101", 8000], [2, "192.168.1.102", 8000],
                       [3, "192.168.1.103", 8000], [4, "192.168.1.104", 8000],
                       [6, "192.168.1.105", 8000], [7, "192.168.1.106", 8000],
                       [8, "192.168.1.107", 8000], [10, "192.168.1.108", 8000],
                       [12, "192.168.1.109",
                        8000], [13, "192.168.1.110", 8000],
                       [14, "192.168.1.101",
                        8001], [15, "192.168.1.102", 8001],
                       [16, "192.168.1.103",
                        8001], [17, "192.168.1.104", 8001],
                       [18, "192.168.1.105",
                        8001], [19, "192.168.1.106", 8001],
                       [20, "192.168.1.107",
                        8001], [21, "192.168.1.109", 8001],
                       [22, "192.168.1.110",
                        8001], [23, "192.168.1.108", 8001],
                       [24, "192.168.1.101",
                        8002], [25, "192.168.1.102", 8002],
                       [26, "192.168.1.103",
                        8002], [27, "192.168.1.104", 8002],
                       [28, "192.168.1.106",
                        8002], [29, "192.168.1.105", 8002],
                       [30, "192.168.1.107", 8002],
                       [31, "192.168.1.110", 8002]]

    #

    def __init__(self, ex):
        # keep a reference to the gui
        self.ex = ex

        # Create the RPC server for the admin
        # self.server = self.AsyncXMLRPCServer((self.admin_ip, self.admin_port), SimpleXMLRPCRequestHandler,
        #                                     logRequests=False)
        self.server = SimpleXMLRPCServer((self.admin_ip, self.admin_port),
                                         SimpleXMLRPCRequestHandler,
                                         logRequests=False)
        self.server.register_introspection_functions()
        # register the functions that can be called remotely
        self.server.register_function(self.agent_online, 'agent_online')
        self.server.register_function(self.agent_offline, 'agent_offline')
        self.server.register_function(self.agent_started_admm,
                                      'agent_started_admm')
        self.server.register_function(self.agent_finished_admm,
                                      'agent_finished_admm')
        self.server.register_function(self.agent_measurements,
                                      'agent_measurements')
        self.server.register_function(self.agent_general_use_message,
                                      'agent_general_use_message')
        # start the RPC server
        t = threading.Thread(target=self.server.serve_forever)
        t.start()
        # the communication scenario to be used by default by the agents
        self.comm_scenario = "wired_default"
        self.agents = self.agents_wired

    def agent_online(self, a_id):
        self.ex.agent_connected(a_id)
        return 1

    def agent_offline(self, a_id):
        self.ex.agent_disconnected(a_id)
        return 1

    def agent_started_admm(self, a_id):
        self.ex.agent_running_admm(a_id)
        self.v_opt = {}
        return 1

    def agent_finished_admm(self, ano, dt_opt, dt_rpc, v_ref, p_ref):
        self.ex.agent_finished_admm(ano, dt_opt, dt_rpc, v_ref, p_ref)
        self.v_opt[ano] = [v_ref, p_ref]
        return 1

    def print_results(self):
        s_keys = sorted(self.v_opt)
        volt = []
        power = []
        for key in s_keys:
            volt.append(self.v_opt[key][0])
            power.append(self.v_opt[key][1])
        return 'v_d = ' + str(volt) + "'; \n p_d = " + str(power) + "';"

    def agent_measurements(self, ano, dt_opal, v_meas, p_meas, trip):
        self.ex.agent_update_values(ano, dt_opal, v_meas, p_meas, trip)
        return 1

    def agent_general_use_message(self, ano, message):
        print("Agent " + str(ano) + ":" + message)
        return 1

    def disconnect(self):
        print("=====Shuting down RPC server")
        self.server.shutdown()

    def set_communication(self, comm_type):
        if "wired" in comm_type:
            self.agents = self.agents_wired
        else:
            self.agents = self.agents_wireless

    def say_to_agent(self, id, s):
        if s is "STOP":
            for a in self.agents:
                if a[0] == id:
                    srv_addr = "http://" + a[1] + ":" + str(a[2])
                    print("asking agent " + str(id) + " to shut down at " +
                          srv_addr)
                    agent = xmlrpclib.ServerProxy(srv_addr)
                    try:
                        agent.remote_shutdown()
                    except Exception as exc:
                        print("Cannot talk to agent " + str(id))

    def say_to_all_agents(self, s):
        if s is "STOP":
            for a in self.agents:
                srv_addr = "http://" + a[1] + ":" + str(a[2])
                agent = xmlrpclib.ServerProxy(srv_addr)
                try:
                    agent.remote_shutdown()
                except (socket_error, xmlrpclib.Fault, xmlrpclib.ProtocolError,
                        xmlrpclib.ResponseError), exc:
                    print("Cannot talk to agent " + str(a[0]))
        elif s is "START ADMM":
            # for a in self.agents:
            #     srv_addr = "http://" + a[1] + ":" + str(a[2])
            #     agent = xmlrpclib.ServerProxy(srv_addr)
            #     agent.start_admm()
            srv_addr = "http://" + self.agents[0][1] + ":" + str(
                self.agents[0][2])
            agent = xmlrpclib.ServerProxy(srv_addr)
            agent.start_admm()
Example #49
0
class SimGUI_Frame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: SimGUI_Frame.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.window_1 = wx.SplitterWindow(self, -1, style=wx.SP_3D|wx.SP_BORDER|wx.SP_LIVE_UPDATE)
        self.window_1_pane_2 = wx.Panel(self.window_1, -1)
        self.notebook_1 = wx.Notebook(self.window_1_pane_2, -1, style=0)
        self.notebook_1_pane_2 = wx.Panel(self.notebook_1, -1)
        self.notebook_1_pane_1 = wx.Panel(self.notebook_1, -1)
        self.window_1_pane_1 = wx.Panel(self.window_1, -1)
        self.text_ctrl_sim_log = wx.richtext.RichTextCtrl(self.notebook_1_pane_1, -1, "", style=wx.TE_MULTILINE|wx.TE_READONLY)
        self.text_ctrl_slurpout = wx.richtext.RichTextCtrl(self.notebook_1_pane_2, -1, "", style=wx.TE_MULTILINE|wx.TE_READONLY)
        self.text_ctrl_slurpin = wx.TextCtrl(self.notebook_1_pane_2, -1, "", style=wx.TE_PROCESS_ENTER)
        self.button_SLURPsubmit = wx.Button(self.notebook_1_pane_2, -1, "Submit")
        self.button_sim_startPause = wx.Button(self.window_1_pane_2, -1, "Start")
        self.button_sim_log_clear = wx.Button(self.window_1_pane_2, -1, "Clear Log")
        self.button_sim_log_export = wx.Button(self.window_1_pane_2, -1, "Export Log...")
        self.label_1 = wx.StaticText(self.window_1_pane_2, -1, "Show log messages for:")
        self.checkbox_statusLog_targetRegion = wx.CheckBox(self.window_1_pane_2, -1, "Target region announcements")
        self.checkbox_statusLog_propChange = wx.CheckBox(self.window_1_pane_2, -1, "System proposition changes")
        self.checkbox_statusLog_border = wx.CheckBox(self.window_1_pane_2, -1, "Region border crossings")
        self.checkbox_statusLog_other = wx.CheckBox(self.window_1_pane_2, -1, "Other debugging messages")

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_TEXT_ENTER, self.onSLURPSubmit, self.text_ctrl_slurpin)
        self.Bind(wx.EVT_BUTTON, self.onSLURPSubmit, self.button_SLURPsubmit)
        self.Bind(wx.EVT_BUTTON, self.onSimStartPause, self.button_sim_startPause)
        self.Bind(wx.EVT_BUTTON, self.onSimClear, self.button_sim_log_clear)
        self.Bind(wx.EVT_BUTTON, self.onSimExport, self.button_sim_log_export)
        self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED, self.onResize, self.window_1)
        # end wxGlade
        self.window_1_pane_1.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
        self.mapBitmap = None

        self.window_1_pane_1.Bind(wx.EVT_PAINT, self.onPaint)
        self.Bind(wx.EVT_ERASE_BACKGROUND, self.onEraseBG)

        self.proj = project.Project()
        self.proj.setSilent(True)

        # Make status bar at bottom.

        self.sb = wx.StatusBar(self)
        self.SetStatusBar(self.sb)
        self.sb.SetFieldsCount(1)
        self.sb.SetStatusText("PAUSED")

        self.button_sim_log_export.Enable(False)

        # Connect to executor
        try:
            executor_port = int(sys.argv[1])
        except ValueError:
            print "ERROR: Invalid port '{}'".format(arg)
            sys.exit(2)

        self.executorProxy = xmlrpclib.ServerProxy("http://127.0.0.1:{}".format(executor_port), allow_none=True)

        # Create the XML-RPC server
        # Search for a port we can successfully bind to
        while True:
            listen_port = random.randint(10000, 65535)
            try:
                self.xmlrpc_server = SimpleXMLRPCServer(("127.0.0.1", listen_port), logRequests=False, allow_none=True)
            except socket.error as e:
                pass
            else:
                break

        # Register functions with the XML-RPC server
        self.xmlrpc_server.register_function(self.handleEvent)

        # Kick off the XML-RPC server thread    
        self.XMLRPCServerThread = threading.Thread(target=self.xmlrpc_server.serve_forever)
        self.XMLRPCServerThread.daemon = True
        self.XMLRPCServerThread.start()
        print "SimGUI listening for XML-RPC calls on http://127.0.0.1:{} ...".format(listen_port)

        # Register with executor for event callbacks   
        self.executorProxy.registerExternalEventTarget("http://127.0.0.1:{}".format(listen_port))
 
        self.robotPos = None
        self.robotVel = (0,0)

        self.markerPos = None

        self.dialogueManager = None
        self.currentGoal = None

        self.Bind(wx.EVT_CLOSE, self.onClose)

    def loadRegionFile(self, filename):
        self.proj.rfi = regions.RegionFileInterface()
        self.proj.rfi.readFile(filename)

        self.Bind(wx.EVT_SIZE, self.onResize, self)
        self.onResize()

    def loadSpecFile(self, filename):
        self.proj.loadProject(filename)
        self.hsub = handlerSubsystem.HandlerSubsystem(None, self.proj.project_root)
        config, success = self.hsub.loadConfigFile(self.proj.current_config)
        if success: self.hsub.configs.append(config)
        self.hsub.setExecutingConfig(self.proj.current_config)

        self.Bind(wx.EVT_SIZE, self.onResize, self)

        if self.proj.compile_options["parser"] == "slurp":
            self.initDialogue()
        else:
            self.notebook_1.DeletePage(1)

        self.onResize()

    def handleEvent(self, eventType, eventData):
        """
        Processes messages from the controller, and updates the GUI accordingly
        """

        # Update stuff (should put these in rough order of frequency for optimal speed
        if eventType == "FREQ":
            wx.CallAfter(self.sb.SetStatusText, "Running at approximately {}Hz...".format(eventData), 0)
        elif eventType == "POSE":
            self.robotPos = eventData
            wx.CallAfter(self.onPaint)
        elif eventType == "MARKER":
            self.markerPos = eventData
            wx.CallAfter(self.onPaint)
        elif eventType == "VEL":
            # We can't plot anything before we have a map
            if self.mapBitmap is None:
                print "Received drawing command before map.  You probably have an old execute.py process running; please kill it and try again."
                return
            [x,y] = eventData
            [x,y] = map(int, (self.mapScale*x, self.mapScale*y)) 
            self.robotVel = (x, y)
        elif eventType == "PAUSE":
            wx.CallAfter(self.sb.SetStatusText, "PAUSED.", 0)
        elif eventType == "SPEC":
            wx.CallAfter(self.loadSpecFile, eventData)
        elif eventType == "REGIONS":
            wx.CallAfter(self.loadRegionFile, eventData)
        else:
            if isinstance(eventData, basestring):
                if eventData.startswith("Output proposition"):
                    if self.checkbox_statusLog_propChange.GetValue():
                        wx.CallAfter(self.appendLog, eventData + "\n", color="GREEN") 
                elif eventData.startswith("Heading to"):
                    if self.checkbox_statusLog_targetRegion.GetValue():
                        wx.CallAfter(self.appendLog, eventData + "\n", color="BLUE") 
                elif eventData.startswith("Crossed border"):
                    if self.checkbox_statusLog_border.GetValue():
                        wx.CallAfter(self.appendLog, eventData + "\n", color="CYAN") 
                    # Detect our current goal index
                elif eventData.startswith("Currently pursuing goal"):
                    m = re.search(r"#(\d+)", eventData)
                    if m is not None:
                        self.currentGoal = int(m.group(1))
                elif self.checkbox_statusLog_other.GetValue():
                    if eventData != "":
                        wx.CallAfter(self.appendLog, eventData + "\n", color="BLACK")
            elif self.checkbox_statusLog_other.GetValue():
                if eventData != "":
                    wx.CallAfter(self.appendLog, str(eventData) + "\n", color="BLACK") 

    def __set_properties(self):
        # begin wxGlade: SimGUI_Frame.__set_properties
        self.SetTitle("Simulation Status")
        self.SetSize((836, 713))
        self.button_SLURPsubmit.SetDefault()
        self.checkbox_statusLog_targetRegion.SetValue(1)
        self.checkbox_statusLog_propChange.SetValue(1)
        self.checkbox_statusLog_border.SetValue(1)
        self.checkbox_statusLog_other.SetValue(1)
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: SimGUI_Frame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_5 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_43_copy_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_3 = wx.BoxSizer(wx.VERTICAL)
        sizer_43_copy_copy = wx.BoxSizer(wx.VERTICAL)
        sizer_6 = wx.BoxSizer(wx.VERTICAL)
        sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_5.Add((5, 30), 0, 0, 0)
        sizer_43_copy_copy.Add((20, 5), 0, 0, 0)
        sizer_4.Add(self.text_ctrl_sim_log, 1, wx.ALL|wx.EXPAND, 5)
        self.notebook_1_pane_1.SetSizer(sizer_4)
        sizer_6.Add(self.text_ctrl_slurpout, 1, wx.ALL|wx.EXPAND, 5)
        sizer_7.Add(self.text_ctrl_slurpin, 1, wx.ALL|wx.EXPAND, 5)
        sizer_7.Add(self.button_SLURPsubmit, 0, wx.ALL, 5)
        sizer_6.Add(sizer_7, 0, wx.EXPAND, 0)
        self.notebook_1_pane_2.SetSizer(sizer_6)
        self.notebook_1.AddPage(self.notebook_1_pane_1, "Status Log")
        self.notebook_1.AddPage(self.notebook_1_pane_2, "SLURP Dialogue")
        sizer_43_copy_copy.Add(self.notebook_1, 1, wx.EXPAND, 0)
        sizer_43_copy_copy.Add((20, 5), 0, 0, 0)
        sizer_5.Add(sizer_43_copy_copy, 6, wx.EXPAND, 0)
        sizer_5.Add((20, 30), 0, 0, 0)
        sizer_43_copy_1.Add((20, 20), 0, 0, 0)
        sizer_43_copy_1.Add(self.button_sim_startPause, 0, wx.LEFT|wx.RIGHT|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 20)
        sizer_43_copy_1.Add((20, 10), 0, 0, 0)
        sizer_43_copy_1.Add(self.button_sim_log_clear, 0, wx.LEFT|wx.RIGHT|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 20)
        sizer_43_copy_1.Add((20, 10), 0, 0, 0)
        sizer_43_copy_1.Add(self.button_sim_log_export, 0, wx.LEFT|wx.RIGHT|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 20)
        sizer_43_copy_1.Add((20, 10), 0, 0, 0)
        sizer_3.Add((20, 20), 0, 0, 0)
        sizer_3.Add(self.label_1, 0, 0, 0)
        sizer_3.Add(self.checkbox_statusLog_targetRegion, 0, wx.TOP|wx.BOTTOM, 5)
        sizer_3.Add(self.checkbox_statusLog_propChange, 0, wx.TOP|wx.BOTTOM, 5)
        sizer_3.Add(self.checkbox_statusLog_border, 0, wx.TOP|wx.BOTTOM, 5)
        sizer_3.Add(self.checkbox_statusLog_other, 0, wx.TOP|wx.BOTTOM, 5)
        sizer_43_copy_1.Add(sizer_3, 1, wx.EXPAND, 0)
        sizer_5.Add(sizer_43_copy_1, 3, wx.EXPAND, 0)
        sizer_5.Add((20, 30), 0, 0, 0)
        self.window_1_pane_2.SetSizer(sizer_5)
        self.window_1.SplitHorizontally(self.window_1_pane_1, self.window_1_pane_2)
        sizer_2.Add(self.window_1, 1, wx.EXPAND, 0)
        sizer_2.Add((20, 20), 0, 0, 0)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        self.Layout()
        # end wxGlade

        self.window_1.SetSashPosition(self.GetSize().y/2)
        self.window_1_pane_1.SetBackgroundColour(wx.WHITE)   

    def onResize(self, event=None): # wxGlade: SimGUI_Frame.<event_handler>
        size = self.window_1_pane_1.GetSize()
        self.mapBitmap = wx.EmptyBitmap(size.x, size.y)
        self.mapScale = mapRenderer.drawMap(self.mapBitmap, self.proj.rfi, scaleToFit=True, drawLabels=mapRenderer.LABELS_ALL_EXCEPT_OBSTACLES, memory=True)

        self.Refresh()
        self.Update()

        if event is not None:
            event.Skip()

    def onEraseBG(self, event):
        # Avoid unnecessary flicker by intercepting this event
        pass

    def onPaint(self, event=None):
        if self.mapBitmap is None:
            return

        if event is None:
            dc = wx.ClientDC(self.window_1_pane_1)
        else:
            pdc = wx.AutoBufferedPaintDC(self.window_1_pane_1)
            try:
                dc = wx.GCDC(pdc)
            except:
                dc = pdc

        dc.BeginDrawing()

        # Draw background
        dc.DrawBitmap(self.mapBitmap, 0, 0)

        # Draw robot
        if self.robotPos is not None:
            [x,y] = map(lambda x: int(self.mapScale*x), self.robotPos) 
            dc.DrawCircle(x, y, 5)
        if self.markerPos is not None:
            [m,n] = map(lambda m: int(self.mapScale*m), self.markerPos) 
            dc.SetBrush(wx.Brush(wx.RED))
            dc.DrawCircle(m, n, 5)

        # Draw velocity vector of robot (for debugging)
        #dc.DrawLine(self.robotPos[0], self.robotPos[1], 
        #            self.robotPos[0] + self.robotVel[0], self.robotPos[1] + self.robotVel[1])

        dc.EndDrawing()
        
        if event is not None:
            event.Skip()

    def appendLog(self, text, color="BLACK"):
        # for printing everything on the log
            
        # annotate any pXXX region names with their human-friendly name
        # convert to set to avoid infinite explosion
        for p_reg in set(re.findall(r'\b(p\d+)\b',text)):
            for rname, subregs in self.proj.regionMapping.iteritems():
                if p_reg in subregs:
                    break
            text = re.sub(r'\b'+p_reg+r'\b', '%s (%s)' % (p_reg, rname), text)

        self.text_ctrl_sim_log.SetInsertionPointEnd()
        self.text_ctrl_sim_log.BeginTextColour(color)
        self.text_ctrl_sim_log.WriteText("["+time.strftime("%H:%M:%S")+"] "+text)
        self.text_ctrl_sim_log.EndTextColour()
        self.text_ctrl_sim_log.ShowPosition(self.text_ctrl_sim_log.GetLastPosition())
        self.text_ctrl_sim_log.Refresh()

    def onSimStartPause(self, event): # wxGlade: SimGUI_Frame.<event_handler>
        btn_label = self.button_sim_startPause.GetLabel()
        if btn_label == "Start" or btn_label == "Resume":
            self.button_sim_log_export.Enable(False)
            self.executorProxy.resume()
            self.appendLog("%s!\n" % btn_label,'GREEN')
            self.button_sim_startPause.SetLabel("Pause")
        else:
            self.executorProxy.pause()
            self.appendLog('Pause...\n','RED')
            self.button_sim_log_export.Enable(True)
            self.button_sim_startPause.SetLabel("Resume")

        self.Refresh()
        event.Skip()

    def onSimExport(self, event): # wxGlade: SimGUI_Frame.<event_handler>
        """
        Ask the user for a filename to save the Log as, and then save it.
        """
        default = 'StatusLog'
    
        # Get a filename
        fileName = wx.FileSelector("Save File As", 
                                    os.path.join(os.getcwd(),'examples'),
                                    default_filename=default,
                                    default_extension="txt",
                                    wildcard="Status Log files (*.txt)|*.txt",
                                    flags = wx.SAVE | wx.OVERWRITE_PROMPT)
        if fileName == "": return # User cancelled.

        # Force a .txt extension.  How mean!!!
        if os.path.splitext(fileName)[1] != ".txt":
            fileName = fileName + ".txt"
        

        # Save data to the file
        self.saveFile(fileName)
        event.Skip()

    def saveFile(self, fileName):
        """
        Write all data out to a file.
        """

        if fileName is None:
            return

        f = open(fileName,'w')

        print >>f, "Experiment Status Log"
        print >>f
        # write the log
        print >>f, str(self.text_ctrl_sim_log.GetValue())

        f.close()

    def onClose(self, event):
        msg = wx.BusyInfo("Please wait, shutting down...")

        try:
            self.executorProxy.shutdown()
        except socket.error:
            # Executor probably crashed
            pass

        self.xmlrpc_server.shutdown()
        self.XMLRPCServerThread.join()
        #time.sleep(2)
        event.Skip()

    def onSimClear(self, event): # wxGlade: SimGUI_Frame.<event_handler>
        self.text_ctrl_sim_log.Clear()
        event.Skip()

    def initDialogue(self):
        # Add SLURP to path for import
        p = os.path.dirname(os.path.abspath(__file__))
        sys.path.append(os.path.join(p, "..", "etc", "SLURP"))
        from ltlbroom.specgeneration import SpecGenerator
        _SLURP_SPEC_GENERATOR = SpecGenerator()
    
        # Filter out regions it shouldn't know about
        filtered_regions = [region.name for region in self.proj.rfi.regions 
                            if not (region.isObstacle or region.name.lower() == "boundary")]

        sensorList = copy.deepcopy(self.proj.enabled_sensors)
        robotPropList = self.proj.enabled_actuators + self.proj.all_customs
        
        text = self.proj.specText

        LTLspec_env, LTLspec_sys, self.proj.internal_props, internal_sensors, results, responses, traceback = \
            _SLURP_SPEC_GENERATOR.generate(text, sensorList, filtered_regions, robotPropList,
                                           self.hsub.executing_config.region_tags)

        from ltlbroom.dialog import DialogManager
        self.dialogueManager = DialogManager(traceback)

    def onSLURPSubmit(self, event): # wxGlade: SimGUI_Frame.<event_handler>
        if self.text_ctrl_slurpin.GetValue() == "":
            event.Skip()
            return
        
        user_text = self.text_ctrl_slurpin.GetValue()

        # echo
        self.text_ctrl_slurpout.BeginBold()
        self.text_ctrl_slurpout.AppendText("User: "******"\n")

        self.text_ctrl_slurpout.ShowPosition(self.text_ctrl_slurpout.GetLastPosition())
        self.text_ctrl_slurpout.Refresh()

        self.text_ctrl_slurpin.Clear()

        # response
        if self.dialogueManager is None:
            self.text_ctrl_slurpout.BeginBold()
            self.text_ctrl_slurpout.AppendText("Error: Dialogue Manager not initialized")
            self.text_ctrl_slurpout.EndBold()
        else:
            sys_text = self.dialogueManager.tell(user_text, self.currentGoal)
            self.text_ctrl_slurpout.BeginBold()
            self.text_ctrl_slurpout.AppendText("System: ")
            self.text_ctrl_slurpout.EndBold()
            self.text_ctrl_slurpout.AppendText(sys_text + "\n")

        self.text_ctrl_slurpout.ShowPosition(self.text_ctrl_slurpout.GetLastPosition())
        self.text_ctrl_slurpout.Refresh()

        event.Skip()
class Backdoor(threading.Thread):
    '''
      Sets up an xmlrpc server to handle requests from a concert master to joint.
      This will usually get installed directly into the app managers.
      
      Important variables that should be visible to users of this class
      
      @var concert_master - zeroconf details for the concert master
      @var robot_namespace - namespace that apps must be launched under
      @var port - port that the xmrpc backdoor is running on
      
      @arg platform_info : contains the platform-system-robot triple, key and suggested_name
      @arg whitelist/blacklist : internally to help the backdoor decide whether to serve a specific concert master or not
      @arg receive_invitation_callback : used when the backdoor receives an invitation.
    '''
    def __init__(self, platform_info, whitelist, blacklist, receive_invitation_callback):
        threading.Thread.__init__(self)
        
        # Visible variables
        self.concert_master = None
        self.robot_namespace = None
        self.port = 0
        self._server = None

        self._unique_names = {} # pairs concert masters with unique names provided by the concert masters
        
        # System-Platform-Robot triple : first and second are fixed, third is variable (ros.linux.*)
        # Key : unique id generated by uuid
        # Suggested Name : this is the hint given to the concert from which the concert will generate a
        #                   unique name and pass back
        self.platform_info = platform_info

        # These allow for some decision logic when accepting invitations from concert masters
        self._whitelist = whitelist
        self._blacklist = blacklist
        
        # Private variables
        self._receive_invitation_callback = receive_invitation_callback

        # Get server details and an unused port
        self.hostname = roslib.network.get_host_name()
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(("",0))  # The empty string is equivalent to socket.INADDR_ANY (any network interface on the computer)
        self.address,self.port = s.getsockname()
        s.close()
        # There is a small window here where someone else can grab the unused socket
        # so we should really put in checks below to make sure we don't get an error.
        
        # XmlRpc server setup
        self._server = SimpleXMLRPCServer(("", self.port)) # The empty hostname string is equivalent to socket.INADDR_ANY (any network interface on the computer)
        self._server.register_introspection_functions() # allows a client to do print s.system.listMethods()
        self._server.register_function(self.invite, 'invite')
        self._server.register_function(self.platform, 'platform')
        self._server.register_function(self.system, 'system')
        self._server.register_function(self.robot, 'robot')
        self._server.register_function(self.key, 'key')
        self._server.register_function(self.suggested_name, 'suggested_name')
        self._server.register_function(self.unique_name, 'unique_name')

        listen_for_concerts()
                
    def run(self): 
        self._server.serve_forever()
        
    def stop(self):
        '''
          Shutdown the xmlrpc server, also stop the zeroconf services.
        '''
        self._server.shutdown()
        if self.isAlive():
            self.join()
    
    ########################################################################
    # Backdoor XmlRpc Server Methods
    ########################################################################
    ############################
    # Platform Info
    ############################
    def system(self):
        return self.platform_info.system;
    def platform(self):
        return self.platform_info.platform;
    def robot(self):
        return self.platform_info.robot;
    def key(self):
        return self.platform_info.key;
    def suggested_name(self):
        return self.platform_info.suggested_name;

    def unique_name(self, concert_name, robot_namespace):
        '''
           Lets the app manager store a unique name to use (at some point in the future) 
           with the corresponding concert master.
            
           @param concert_name : the zeroconf name for the concert master (have to resolve ip, port against this)
           @param robot_namespace : the namespace to expose to the concert (must be unique!)
        '''
        self._unique_names[concert_name] = robot_namespace
        return True
        
    def invite(self, concert_name):
        '''
           Server's callback function for handling invitation requests.
           @param concert_name : the zeroconf name for the concert master (have to resolve ip, port against this)
        '''
        ######################
        # Whitelist/Blacklist
        ######################
        rospy.loginfo("App Manager: received an invitation from '%s'."%concert_name)
        if self._whitelist: # wwhitelists have priority
            if not concert_name in self._whitelist:
                rospy.loginfo("App Manager: refusing an invitation as we are using a whitelist and '%s' is not whitelisted."%concert_name)
                return False
        else:
            if self._blacklist:
                if concert_name in self._blacklist:
                    rospy.loginfo("App Manager: refusing an invitation as '%s' is blacklisted."%concert_name)
                    return False

        ######################
        # Discovery
        ######################
        concerts = discover_concerts()
        concert_master = None
        for concert in concerts:
            if concert.name == concert_name:
                # Do we need to debug this further (i.e. check its resolved?)
                rospy.logdebug("App Manager: found the concert")
                concert_master = concert
                break
    
        if concert_master is None:
            rospy.logwarn("App Manager: invitation was from an undiscovered concert [%s]"%concert_name)
            return False
        # ros masters are currently hooked into ipv4 only.
        if len(concert_master.ipv4_addresses) > 0:
            concert_address = concert_master.ipv4_addresses[0]
        else:
            rospy.logwarn("App Manager: invitation was from an unresolvable concert [%s]"%concert_name)
            return False

        try:
            self.robot_namespace = self._unique_names[concert_name];
        except KeyError:
            rospy.loginfo("App Manager: received invitation from %s, but haven't yet received a unique namespace to use"%concert_name)
        if self._receive_invitation_callback(concert_address, concert_master.port, self.robot_namespace):
            self.concert_master = concert_master
            return True
        else:
            return False
Example #51
0
File: rpc.py Project: andrmuel/ace
class RPCHandler(Thread):
	"""
	Provides functions for RPCs.
	"""

	def __init__(self, config, logger, master, core):
		Thread.__init__(self)
		self.config = config
		self.logger = logger
		self.master = master
		self.core = core
		self.rpcserver = SimpleXMLRPCServer((self.config.rpcserver_host, self.config.rpcserver_port),
		                                    logRequests=False,
		                                    allow_none=True)
		self.rpcserver.register_function(self.getStats, "getStats")
		self.rpcserver.register_function(self.getContent, "getContent")
		self.rpcserver.register_function(self.execAction, "execAction")
		self.actions = {
		  "show_event": {'args': ['event'], 'function': self.execActionShowEvent},
		  "show_ruletable": {'args': [], 'function': self.execActionShowRuletable},
		  "show_querytable": {'args': [], 'function': self.execActionShowQuerytable},
		  "show_rulegroup": {'args': ['group'], 'function': self.execActionShowRulegroup},
		  "show_rule": {'args': ['group', 'rule'], 'function': self.execActionShowRule},
		  "show_context": {'args': ['group', 'name'], 'function': self.execActionShowContext},
		  "delete_context": {'args': ['group', 'name'], 'function': self.execActionDeleteContext},
		  "reload_rules": {'args': [], 'function': self.execActionReloadRules},
		  "clear_cache": {'args': [], 'function': self.execActionClearCache},
		  "show_inputqueue": {'args': [], 'function': self.execActionShowInputQueue},
		  "show_outputqueue": {'args': ["num"], 'function': self.execActionShowOutputQueue},
		}


	def getStats(self):
		"""
		Returns a list with statistics. Each item in the list is a tuple
		representing a key/value pair.
		"""
		return [
		    ("Current tick", self.master.ticker.getTick()),
		    ("Time running", self.master.ticker.getTimeRunningString()),
		    ("Processed input events", self.core.input_processed),
		    ("Generated output events", self.core.output_generated),
		    ("Events in input queue", self.master.input_queue.qsize()),
		    ("Events in output queues", str([q.qsize() for q in self.master.output_queues])),
		    ("Events in cache", len(self.core.cache.getEvents())),
		    ("Current number of contexts", self.core.contextmanager.getNumberOfContexts()),
		    ("Number of rules", self.core.rulemanager.getNumberOfRules()),
		    ("Average event processing rate", "%3.2f events per minute" % (self.core.processingRate()*60))
		]

	def getContent(self, page):
		"""
		Returns the content of the given page.
		
		@param page: string describing the page
		"""
		self.logger.logDebug("Returning RPC content for page '%s'." % page)
		if page == 'home':
			return [{
			  'title': "Welcome",
			  'type': "text",
			  'content': "This is ace running on %s." % self.config.hostname
			}]
		elif page == 'master':
			return self.master.getContent()
		elif page == 'core':
			return self.core.getContent()
		elif page == 'cache':
			return self.core.cache.getContent()
		elif page == 'contexts':
			return self.core.contextmanager.getContent()
		elif page == 'rulebase':
			return self.core.rulemanager.getContent()
		else:
			return [{'title': "No such page exists", 'type': "text", 'content': page}]

	def execAction(self, action, kwargs):
		"""
		Executes an RPC action and returns the content.
		
		@param action: action
		@type  action: string
		@param kwargs: arguments
		@type  kwargs: dict
		"""
		self.logger.logDebug("Executing RPC action '%s' with args %s." % (action, str(kwargs)))
		if action in self.actions.keys():
			needed_args = self.actions[action]['args']
			for arg in needed_args:
				if not kwargs.has_key(arg):
					return [{
					  'title': "Error in execAction",
					  'type': "text",
					  'content': "Action '%s' needs argument '%s'." % (action, arg)
					}]
			kwargs = dict([kwarg for kwarg in kwargs.iteritems() if kwarg[0] in needed_args])
			return self.actions[action]['function'](**kwargs)
		else:
			return [{
			  'title': "Error in execAction",
			  'type': "text",
			  'content': "No such action: %s" % action
			}]

	def execActionShowEvent(self, event):
		"""
		Returns content for an event.
		"""
		event = self.core.cache.getEventByID(event)
		if event == None:
			return [{
			  'title': "Error in execAction",
			  'type': "text",
			  'content': "No event with ID '%s' in cache." % event
			}]
		else:
			return event.getContent() + [{
			  'title': "Relevant rules",
			  'type': 'list',
			  'content': [rule.getLink() for rule in self.core.rulemanager.getRelevantRules(event)]
			}]

	def execActionShowRuletable(self):
		"""
		Returns content for the rule table.
		"""
		def rulecontent(rules):
			"""Helper function."""
			if len(rules) < 1:
				return ""
			elif len(rules) == 1:
				return rules[0].getLink()
			else:
				return reduce(lambda a, b: a+[", "]+b, [rule.getLink() for rule in rules])
		table = self.core.rulemanager.ruletable
		types = constants.EVENT_TYPES_ANY
		return [{
		  'title': "Rules for events with any name and given type",
		  'type': 'table',
		  'headers': ["Type", "Rules"],
		  'content': [[etype, rulecontent([rule[2] for rule in sorted(table.when_any[etype])])]
		              for etype in types]
		},{
		  'title': "Rules for events with given class and type",
		  'type': 'table',
		  'headers': ["Class", "Type", "Rules"],
		  'content': reduce(
		    lambda a, b: a + b,
		    [
		      [
		        [name, etype, rulecontent([rule[2]
		          for rule in sorted(table.when_class[name][etype])])]
		        for etype in types if len(table.when_class[name][etype]) > 0]
		      for name in table.when_class.keys()]
		  )
		},{
		  'title': "Rules for events with given name and type",
		  'type': 'table',
		  'headers': ["Name", "Type", "Rules"],
		  'content': reduce(
		    lambda a,b: a+b,
		    [
		      [
		        [name, etype, rulecontent([rule[2]
		          for rule in sorted(table.when_event[name][etype])])]
		        for etype in types if len(table.when_event[name][etype]) > 0]
		      for name in table.when_event.keys()]
		  )
		}]

	def execActionShowQuerytable(self):
		"""
		Returns content for the query table.
		"""
		headers = ["Rule", "Query name", "Max age", "Time source", "Delay?"]
		def limits_entry(entry, time_source, delay):
			""" Returns a table row with delay/cache limits. """
			return [entry['rule'].getLink() if entry['rule'] != None else "n/a",
			        entry['name'],
			        entry['max_age'],
			        time_source,
			        delay]
		table = self.core.rulemanager.querytable
		eventnames = set()
		for delay in [True, False]:
			for time_source in  ['creation', 'arrival']:
				eventnames.update(table[delay][time_source]['by_event'].keys())
		eventnames = list(eventnames)
		eventnames.sort()
		content = [{
		  'title': "Default delay and cache times for any event",
		  'type': 'table',
		  'headers': headers,
		  'content': [limits_entry(table[delay][time_source]['any'], time_source, delay)
		              for time_source in ['creation', 'arrival'] for delay in [True, False]]
		},{
		  'title': "Queries applicable to any event",
		  'type': 'table',
		  'headers': headers,
		  'content': [[qdet['rule'].getLink(), qdet['name'], qdet['max_age'], time_source, delay]
		              for delay in [True, False]
		              for time_source in ['creation', 'arrival']
		              for qdet in table[delay][time_source]['any']['qdets']]
		  }
		]
		for name in eventnames:
			content.append({
			  'title': "Default delay and cache times for '%s'" % name,
			  'type': 'table',
			  'headers': headers,
			  'content': [limits_entry(table[delay][time_source]['by_event'][name], time_source, delay)
			              for delay in [True, False]
			              for time_source in ['creation', 'arrival']
			              if table[delay][time_source]['by_event'].has_key(name)]
			})
			content.append({
			  'title': "Queries for event '%s'" % name,
			  'type': 'table',
			  'headers': headers,
			  'content': [[qdet['rule'].getLink(), qdet['name'], qdet['max_age'], time_source, delay]
			              for delay in [True, False]
			              for time_source in ['creation', 'arrival']
			              if table[delay][time_source]['by_event'].has_key(name)
			              for qdet in table[delay][time_source]['by_event'][name]['qdets']
			              if table[delay][time_source]['by_event'][name].has_key('qdets')]
			})
		return content

	def execActionShowRulegroup(self, group):
		"""
		Returns the content of a rule group.
		"""
		if self.core.rulemanager.hasGroup(group):
			group = self.core.rulemanager.getGroup(group)
			return group.getContent()
		else:
			return [{
			  'title': "No such group",
			  'type': "text",
			  'content': "RuleManager has no group '%s'." % group
			}]

	def execActionShowRule(self, group, rule):
		"""
		Returns the content for a single rule.
		"""
		if self.core.rulemanager.hasGroup(group):
			group = self.core.rulemanager.getGroup(group)
			if group.hasRule(rule):
				rule = group.getRule(rule)
				return rule.getContent()
			else:
				return [{
				  'title': "No such rule",
				  'type': "text",
				  'content': "Group '%s' has no rule '%s'." % (group, rule)
				}]
		else:
			return [{
			  'title': "No such group",
			  'type': "text",
			  'content': "RuleManager has no group '%s'." % group
			}]

	def execActionShowContext(self, group, name):
		"""
		Returns the content of a context.
		"""
		if self.core.contextmanager.hasGroup(group):
			group = self.core.contextmanager.getGroup(group)
			if group.has_key(name):
				context = group[name]
				return context.getContent()
			else:
				return [{
				  'title': "No such context",
				  'type': "text",
				  'content': "Group '%s' has no context '%s'." % (group, name)
				}]
		else:
			return [{
			  'title': "No such group",
			  'type': "text",
			  'content': "ContextManager has no group '%s'." % group
			}]

	def execActionDeleteContext(self, group, name):
		"""
		Asks the context manager to delete the specified context.
		"""
		if self.core.contextmanager.hasGroup(group):
			contextgroup = self.core.contextmanager.getGroup(group)
			if contextgroup.has_key(name):
				self.core.contextmanager.triggerDeleteContext(group, name)
				return [{
				  'title': "Context scheduled for deletion",
				  'type': "text",
				  'content': "Context '%s' in group '%s' will be deleted."\
				             % (name, group)
				}]
			else:
				return [{
				  'title': "No such context",
				  'type': "text",
				  'content': "Group '%s' has no context '%s'." % (group, name)
				}]
		else:
			return [{
			  'title': "No such group",
			  'type': "text",
			  'content': "ContextManager has no group '%s'." % group
			}]

	def execActionReloadRules(self):
		"""
		Asks the core to reload the rules.
		"""
		self.core.reloadRules()
		return [{
		  'title': "Rule reload",
		  'type': "text",
		  'content': "Reload of correlation rules has been triggered."
		}]

	def execActionClearCache(self):
		"""
		Asks the core to delete all events from the cache.
		"""
		self.core.triggerClearCache()
		return [{
		  'title': "Cache cleanup",
		  'type': "text",
		  'content': "Cleanup of event cache has been triggered."
		}]

	def execActionShowInputQueue(self):
		"""
		Returns the content for the events in the input queue.
		"""
		self.master.input_queue.mutex.acquire()
		content = [{
		  'title': "Events in input queue:",
		  'type': 'table',
		  'headers': ["Name", "Type", "Status", "Host", "Description", "Arrival"],
		  'content': [[
		    e.getName(),
		    e.getType(),
		    e.getStatus(),
		    e.getHost(),
		    e.getDescription(),
		    e.getArrivalTime(),
		  ] for e in sorted(self.master.input_queue.queue, key=lambda e:e.getArrivalTime())]
		}]
		self.master.input_queue.mutex.release()
		return content

	def execActionShowOutputQueue(self, num):
		"""
		Returns the content for the events in the output queue.
		
		@param num: queue number
		"""
		if not num.isdigit():
			return [{
			  'title': "Show output queue",
			  'type': "text",
			  'content': "No valid queue number: %s." % num
			}]
		qnum = int(num)
		if not qnum < len(self.master.output_queues):
			return [{
			  'title': "Show output queue",
			  'type': "text",
			  'content': "No such output queue: %d." % qnum
			}]
		self.master.output_queues[qnum].mutex.acquire()
		content = [{
		  'title': "Events in output queue %d:" % qnum,
		  'type': 'table',
		  'headers': ["Name", "Type", "Status", "Host", "Description", "Arrival"],
		  'content': [[
		    e.getName(),
		    e.getType(),
		    e.getStatus(),
		    e.getHost(),
		    e.getDescription(),
		    e.getArrivalTime(),
		  ] for e in sorted(self.master.output_queues[qnum].queue, key=lambda e:e.getArrivalTime())]
		}]
		self.master.output_queues[qnum].mutex.release()
		return content

	def run(self):
		"""
		Main thread function.
		"""
		self.logger.logInfo("Calling SimpleXMLRPCServer.serve_forever().")
		try:
			self.rpcserver.serve_forever()
		except select.error as e:
			self.logger.logErr("Calling of SimpleXMLRPCServer.serve_forever() failed: %s" % e)

	def shutdown(self):
		"""
		Stops the server.
		"""
		self.logger.logInfo("Calling SimpleXMLRPCServer.shutdown().")
		self.rpcserver.shutdown()
Example #52
0
        if success:
            CURRENT_STATUS = STATUS_COMPLETED
        else:
            if error:
                ERROR_MESSAGE = str(error)

            CURRENT_STATUS = STATUS_FAILED

        RESULTS_FOLDER = results

        return True

if __name__ == "__main__":
    try:
        if not BIND_IP:
            BIND_IP = socket.gethostbyname(socket.gethostname())

        print("[+] Starting agent on %s:%s ..." % (BIND_IP, BIND_PORT))

        # Disable DNS lookup, by Scott D.
        def FakeGetFQDN(name=""):
            return name
        socket.getfqdn = FakeGetFQDN

        server = SimpleXMLRPCServer((BIND_IP, BIND_PORT), allow_none=True)
        server.register_instance(Agent())
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()
Example #53
0
class QarspDispatcher():
    """This class monitors the database, connects to devices, and dispatches orders to devices"""
    def __init__(self):
        self.dbconn = None
        self.cursor = None
        self.bonjour_thread = None
        self.xmlrpc_thread = None
        self.xmlrpc_server = None
        self.device_list = []
        self.device_addrs = []
        self.orders_list = []
        self.dispatched_orders = []
        self.connectToDatabase()
    
    def connectToDatabase(self):
        """Connects to the database"""
        self.dbconn = pymysql.connect(host='127.0.0.1', port=8889, user='******', passwd='syse2011', db='qarsp_db')
        self.cursor = self.dbconn.cursor()
    
    def setupXMLRPC(self):
        """Starts the XMLRPC Server for communicating with the QARSP's"""
        self.xmlrpc_server = SimpleXMLRPCServer(("", 8002), requestHandler=RequestHandler)
        
        self.xmlrpc_server.register_function(self.register_qarsp, 'register')
        self.xmlrpc_server.register_function(self.missionComplete_qarsp, 'missionComplete')
        self.xmlrpc_server.register_function(self.updateMap_qarsp, 'updateMap')
        
        self.xmlrpc_thread = threading.Thread(target=self.xmlrpc_server.serve_forever)
        self.xmlrpc_thread.start()
    
    def dnsregister_callback(self, sdRef, flags, errorCode, name, regtype, domain):
        if errorCode == pybonjour.kDNSServiceErr_NoError:
            print 'Registered service:'
            print '  name    =', name
            print '  regtype =', regtype
            print '  domain  =', domain
    
    def setupBonjour(self):
        """Registers the DNS service"""
        name = "QarspService"
        regtype = "_qarsp._tcp"
        port = 1234
        
        self.sdRef = \
            pybonjour.DNSServiceRegister(name = name, regtype = regtype, port = port, callBack = self.dnsregister_callback)
        self.bonjour_thread = threading.Thread(target=self.processBonjour)
        self.bonjour_thread.start()
    
    def shutdown(self):
        """Close open sockets"""
        self.running = False
        if(self.xmlrpc_server != None):
            self.xmlrpc_server.shutdown()
        if(self.cursor != None):
            self.cursor.close()
        if(self.dbconn != None):
            self.dbconn.close()
        if(self.bonjour_thread != None):
            self.bonjour_thread.join(1)
        if(self.xmlrpc_thread != None):
            self.xmlrpc_thread.join(1)
        self.sdRef.close()
    
    def processBonjour(self):
        """Waits for devices to connect"""
        while self.running:
            ready = select.select([self.sdRef], [], [], 1)
            if len(ready) != 0 and self.sdRef in ready[0]:
                pybonjour.DNSServiceProcessResult(self.sdRef)
    
    def monitorDatabase(self):
        """Periodically checks the database for updated orders and device positions"""
        self.running = True
        self.setupXMLRPC()
        self.setupBonjour()
        while self.running:
            # Grab the latest device and orders data
            self.cursor.execute("SELECT * FROM device_loc")
            self.device_list = []
            for device in self.cursor:
                device = Device(device)
                self.device_list.append(device)
            self.cursor.execute("SELECT * FROM orders_db")
            self.orders_list = []
            for order in self.cursor:
                order = Order(order)
                self.orders_list.append(order)
            
            # Look for devices with assignments and non-zero locations
            for device in self.device_list:
                if device.lat != 0 and device.long != 0 and device.status_code > 0:
                    try:
                        order = self.orders_list[self.orders_list.index(device.status_code)]
                    except ValueError as error:
                        pass
                    try:
                        self.dispatched_orders.index(order.id)
                    except ValueError as error:
                        if order.lat != 0 and order.long != 0:
                            # Dispatch the order
                            self.dispatchOrder(order, device)
                            self.dispatched_orders.append(order)
            time.sleep(1)
    
    def register_qarsp(self, addr, port):
        """Allows a qarsp to register itself"""
        self.device_addrs.append((addr, port))
        query = "INSERT INTO device_loc (type, lat, lng, heading, status_code) VALUES (1, 32.606216, -85.486671, 0, -1)"
        self.cursor.execute(query)
        print "Device added with address: %s:%d" % (addr,port)
        return True
    
    def missionComplete_qarsp(self, qarsp_id):
        """Allows a qarsp to notify the dispatcher of a mission completion"""
        return True
    
    def updateMap_qarsp(self, mode, size, str_im):
        """docstring for updateMap_qarsp"""
        from PIL import Image
        import base64
        str_im = base64.b64decode(str_im)
        im = Image.fromstring(mode, size, str_im)
        im.save("/Applications/MAMP/htdocs/map.jpeg", "JPEG")
        return True
    
    def dispatchOrder(self, order, device):
        """Dispatches an order to a given device"""
        try:
            s = xmlrpclib.ServerProxy('http://%s:%d' % self.device_addrs[self.device_list.index(device)])
            # Convert Lat to Long
            order_x, order_y = latlong2utm(order.lat, order.long)
            device_x, device_y = latlong2utm(device.lat, device.long)
            # s.dispatch(order_x-device_x, order_y-device_y)
            s.dispatch(0, 5)
            print "Dispatching device", device.id, "to", order.lat, order.long, "from", device.lat, device.long
        except Exception as error:
            print "Error dispatching qarsp:", str(error)
Example #54
0
File: server.py Project: mode89/vc
 def shutdown(self):
     SimpleXMLRPCServer.shutdown(self)
     SimpleXMLRPCServer.server_close(self)
Example #55
0
class GameServer:
    def __init__(self, game):
        self.__clients = []
        self.__game = game
        self.server_sock = None
        self.server = None

        # broadcast sender socket
        self.sender_sock = socket(AF_INET, SOCK_DGRAM)
        self.sender_sock.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)

        self.port = None
        self.ip = None

    def set_broadcast_port(self, port):
        self.__game.set_broadcast_port(port)

    def listen(self):
        # Create XML server
        if not self.port:
            logging.error("Serving port was not specified")
            return

        self.server_sock = (DEFAULT_HOSTING_ADDR, self.port)
        self.server = SimpleXMLRPCServer(self.server_sock,
                                         requestHandler=MyServerRequestHandler)
        LOG.debug('Server started listening RPC on %s:%s' % self.server_sock)
        self.server.register_introspection_functions()
        # Register all functions
        # Register server-side functions into RPC middleware
        self.server.register_instance(self.__game)
        # self.server.register_function(function_name)

    # def listen(self, sock_addr, backlog=1):
    #     self.__sock_addr = sock_addr
    #     self.__backlog = backlog
    #     self.__s = socket(AF_INET, SOCK_STREAM)
    #     self.__s.bind(self.__sock_addr)
    #     self.__s.listen(self.__backlog)
    #     LOG.debug('Socket %s:%d is in listening state' % self.__s.getsockname() )

    def broadcast_ip_loop(self):
        message = self.ip + MSG_FIELD_SEP + str(self.port)
        logging.debug("Broadcasting to %s:%s server address %s:%s" %
                      (DEFAULT_BROADCAST_ADDR, DEFAULT_BROADCAST_IP_PORT,
                       self.ip, self.port))
        while True:
            self.sender_sock.sendto(
                message, (DEFAULT_BROADCAST_ADDR, DEFAULT_BROADCAST_IP_PORT))
            time.sleep(0.5)

    def loop(self):
        LOG.info('Falling to serving loop, press Ctrl+C to terminate...')
        # clients = []
        # client_socket = None
        #
        # try:
        #     while True:
        #         client_socket = None
        #         LOG.info('Awaiting new clients ...')
        #         client_socket, client_addr = self.__s.accept()
        #         c = PlayerSession(client_socket, client_addr, self.__game)
        #         clients.append(c)
        #         c.start()
        # except KeyboardInterrupt:
        #     LOG.warn('Ctrl+C issued closing server ...')
        # finally:
        #     if client_socket is not None:
        #         client_socket.close()
        #     self.__s.close()
        # map(lambda x: x.join(), clients)

        # Start broadcasting my IP for automatic discovery
        broadcast_ip_thread = Thread(name='BroadcastIPThread',
                                     target=self.broadcast_ip_loop)
        broadcast_ip_thread.daemon = True  # Make this thread close with the main thread
        broadcast_ip_thread.start()

        try:
            self.server.serve_forever()
        except KeyboardInterrupt:
            print 'Ctrl+C issued, terminating ...'
        finally:
            self.server.shutdown()  # Stop the serve-forever loop
            self.server.server_close()  # Close the sockets
        print 'Terminating ...'