Just a small nitpick. Otherwise:

Reviewed-by: Nicholas Pratte <npra...@iol.unh.edu>

<snip>
>  class QuittableXMLRPCServer(SimpleXMLRPCServer):
> -    """Basic XML-RPC server.
> +    r"""Basic XML-RPC server.
>
>      The server may be augmented by functions serializable by the 
> :mod:`marshal` module.
> +
> +    Example:
> +        ::
> +
> +            def hello_world():
> +                # to be sent to the XML-RPC server
> +                print("Hello World!")
> +
> +            # start the XML-RPC server on the remote node
> +            # the example assumes you're already connect to a tg_node

This just a very small nitpick, but you wrote 'connect' when it should
be 'connected.'

> +            # this is done by starting a Python shell on the remote node
> +            from framework.remote_session import PythonShell

This comment is related to the one I made above, but maybe you could
move the above comment 'assumes you're already connected to a tg_node'
on this line instead of where it is right now. I had to rescan this a
couple times when reading. Again, this is just an extremely minuscule
nitpick, but I figured I'd bring it up, in any case.

> +            session = tg_node.create_interactive_shell(PythonShell, 
> timeout=5, privileged=True)
> +
> +            # then importing the modules needed to run the server
> +            # and the modules for any functions later added to the server
> +            session.send_command("import xmlrpc")
> +            session.send_command("from xmlrpc.server import 
> SimpleXMLRPCServer")
> +
> +            # sending the source code of this class to the Python shell
> +            from xmlrpc.server import SimpleXMLRPCServer
> +            src = inspect.getsource(QuittableXMLRPCServer)
> +            src = "\n".join([l for l in src.splitlines() if not l.isspace() 
> and l != ""])
> +            spacing = "\n" * 4
> +            session.send_command(spacing + src + spacing)
> +
> +            # then starting the server with:
> +            command = "s = QuittableXMLRPCServer(('0.0.0.0', 
> {listen_port}));s.serve_forever()"
> +            session.send_command(command, "XMLRPC OK")
> +
> +            # now the server is running on the remote node and we can add 
> functions to it
> +            # first connect to the server from the execution node
> +            import xmlrpc.client
> +            server_url = f"http://{tg_node.config.hostname}:8000";
> +            rpc_server_proxy = xmlrpc.client.ServerProxy(server_url)
> +
> +            # get the function bytes to send
> +            import marshal
> +            function_bytes = marshal.dumps(hello_world.__code__)
> +            rpc_server_proxy.add_rpc_function(hello_world.__name__, 
> function_bytes)
> +
> +            # now we can execute the function on the server
> +            xmlrpc_binary_recv: xmlrpc.client.Binary = 
> rpc_server_proxy.hello_world()
> +            print(str(xmlrpc_binary_recv))
>      """
>
>      def __init__(self, *args, **kwargs):
> --
> 2.45.1
>

Reply via email to