Your Name 4 years ago
parent
commit
c95e4fa6ec
4 changed files with 240 additions and 0 deletions
  1. 133 0
      servers/rpyc_classic.py
  2. 29 0
      servers/server.cer
  3. 51 0
      servers/server.key
  4. 27 0
      servers/server.req

+ 133 - 0
servers/rpyc_classic.py

@@ -0,0 +1,133 @@
+#!/usr/bin/env python
+"""
+classic rpyc server (threaded, forking or std) running a SlaveService
+usage:
+    rpyc_classic.py                         # default settings
+    rpyc_classic.py -m forking -p 12345     # custom settings
+
+    # ssl-authenticated server (keyfile and certfile are required)
+    rpyc_classic.py --ssl-keyfile keyfile.pem --ssl-certfile certfile.pem --ssl-cafile cafile.pem
+"""
+import sys
+import os
+import rpyc
+from plumbum import cli
+from rpyc.utils.server import ThreadedServer, ForkingServer, OneShotServer
+from rpyc.utils.classic import DEFAULT_SERVER_PORT, DEFAULT_SERVER_SSL_PORT
+from rpyc.utils.registry import REGISTRY_PORT
+from rpyc.utils.registry import UDPRegistryClient, TCPRegistryClient
+from rpyc.utils.authenticators import SSLAuthenticator
+from rpyc.lib import setup_logger
+from rpyc.core import SlaveService
+
+
+class ClassicServer(cli.Application):
+    mode = cli.SwitchAttr(["-m", "--mode"], cli.Set("threaded", "forking", "stdio", "oneshot"),
+                          default="threaded", help="The serving mode (threaded, forking, or 'stdio' for "
+                          "inetd, etc.)")
+
+    port = cli.SwitchAttr(["-p", "--port"], cli.Range(0, 65535), default=None,
+                          help="The TCP listener port (default = %s, default for SSL = %s)" %
+                          (DEFAULT_SERVER_PORT, DEFAULT_SERVER_SSL_PORT), group="Socket Options")
+    host = cli.SwitchAttr(["--host"], str, default="", help="The host to bind to. "
+                          "The default is localhost", group="Socket Options")
+    ipv6 = cli.Flag(["--ipv6"], help="Enable IPv6", group="Socket Options")
+
+    logfile = cli.SwitchAttr("--logfile", str, default=None, help="Specify the log file to use; "
+                             "the default is stderr", group="Logging")
+    quiet = cli.Flag(["-q", "--quiet"], help="Quiet mode (only errors will be logged)",
+                     group="Logging")
+
+    ssl_keyfile = cli.SwitchAttr("--ssl-keyfile", cli.ExistingFile,
+                                 help="The keyfile to use for SSL. Required for SSL", group="SSL",
+                                 requires=["--ssl-certfile"])
+    ssl_certfile = cli.SwitchAttr("--ssl-certfile", cli.ExistingFile,
+                                  help="The certificate file to use for SSL. Required for SSL", group="SSL",
+                                  requires=["--ssl-keyfile"])
+    ssl_cafile = cli.SwitchAttr("--ssl-cafile", cli.ExistingFile,
+                                help="The certificate authority chain file to use for SSL. "
+                                "Optional; enables client-side authentication",
+                                group="SSL", requires=["--ssl-keyfile"])
+
+    auto_register = cli.Flag("--register", help="Asks the server to attempt registering with "
+                             "a registry server. By default, the server will not attempt to register",
+                             group="Registry")
+    registry_type = cli.SwitchAttr("--registry-type", cli.Set("UDP", "TCP"),
+                                   default="UDP", help="Specify a UDP or TCP registry", group="Registry")
+    registry_port = cli.SwitchAttr("--registry-port", cli.Range(0, 65535), default=REGISTRY_PORT,
+                                   help="The registry's UDP/TCP port", group="Registry")
+    registry_host = cli.SwitchAttr("--registry-host", str, default=None,
+                                   help="The registry host machine. For UDP, the default is 255.255.255.255; "
+                                   "for TCP, a value is required", group="Registry")
+
+    def main(self):
+        if not self.host:
+            self.host = "::1" if self.ipv6 else "127.0.0.1"
+
+        if self.registry_type == "UDP":
+            if self.registry_host is None:
+                self.registry_host = "255.255.255.255"
+            self.registrar = UDPRegistryClient(ip=self.registry_host, port=self.registry_port)
+        else:
+            if self.registry_host is None:
+                raise ValueError("With TCP registry, you must specify --registry-host")
+            self.registrar = TCPRegistryClient(ip=self.registry_host, port=self.registry_port)
+
+        if self.ssl_keyfile:
+            self.authenticator = SSLAuthenticator(self.ssl_keyfile, self.ssl_certfile,
+                                                  self.ssl_cafile)
+            default_port = DEFAULT_SERVER_SSL_PORT
+        else:
+            self.authenticator = None
+            default_port = DEFAULT_SERVER_PORT
+        if self.port is None:
+            self.port = default_port
+
+        setup_logger(self.quiet, self.logfile)
+
+        if self.mode == "threaded":
+            self._serve_mode(ThreadedServer)
+        elif self.mode == "forking":
+            self._serve_mode(ForkingServer)
+        elif self.mode == "oneshot":
+            self._serve_oneshot()
+        elif self.mode == "stdio":
+            self._serve_stdio()
+
+    def _serve_mode(self, factory):
+        t = factory(SlaveService, hostname=self.host, port=self.port,
+                    reuse_addr=True, ipv6=self.ipv6, authenticator=self.authenticator,
+                    registrar=self.registrar, auto_register=self.auto_register)
+        t.start()
+
+    def _serve_oneshot(self):
+        t = OneShotServer(SlaveService, hostname=self.host, port=self.port,
+                          reuse_addr=True, ipv6=self.ipv6, authenticator=self.authenticator,
+                          registrar=self.registrar, auto_register=self.auto_register)
+        t._listen()
+        sys.stdout.write("rpyc-oneshot\n")
+        sys.stdout.write("%s\t%s\n" % (t.host, t.port))
+        sys.stdout.flush()
+        t.start()
+
+    def _serve_stdio(self):
+        origstdin = sys.stdin
+        origstdout = sys.stdout
+        sys.stdin = open(os.devnull, "r")
+        sys.stdout = open(os.devnull, "w")
+        sys.stderr = open(os.devnull, "w")
+        conn = rpyc.classic.connect_pipes(origstdin, origstdout)
+        try:
+            try:
+                conn.serve_all()
+            except KeyboardInterrupt:
+                print("User interrupt!")
+        finally:
+            conn.close()
+
+
+if __name__ == "__main__":
+    ClassicServer.run()
+
+#python rpyc_classic.py --host=0.0.0.0 -m threaded -p 12333 --ssl-keyfile=./server.key --ssl-certfile=./server.cer
+

+ 29 - 0
servers/server.cer

@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/jCCAuYCAWQwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV
+BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0
+ZDAeFw0yMTAzMjgwNzE1MjRaFw0yNTAzMjcwNzE1MjRaMEUxCzAJBgNVBAYTAkFV
+MRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRz
+IFB0eSBMdGQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2VWnpfMvK
+98ccnhSyQP8s8Aa89ay3WMyH64IwWjyHrropouxZdENfzWMNCziJggaOZCHjApWb
+Ajzf2EOZiWBrIOHxOySnfZ91o3OLlOnaZpMagoW7ZOt0T7tZzhkUhhlGdOpTGRFX
+4JqpIMY5uQXQt1tdEQ2e7vkjb7zx8ZuinGazAZHCUQVv9Sh5ipsdOgfCKho+CIz5
+niauKo+93rZ77ZpDiOiLU8zN1lzSiy6YsQxbnhRblapoPGFgp8d90GKruKkmwY+i
+KmhXLgdkFhm18SdEc6bxtuZxgIK2ooLKgnncYhliYSp6D5sEdCtLQCvEheqVs3MC
+ABcFKy5r/D9RgHRQjPVQ//8UXxKjHwFdTAH14Lrj+FQ4WMEdBYNoOxqHLdqA4Ogx
+hRprgt1977oaP7xvkXx07xyZf3uT9edYO6K67qCR4KOJiOkCARRyDQYfP8GDnFif
+/Nyqo2yCpT6l5are2g4F0DPCCzX2U79Ghr1IMkWGOikyyNv7drbbGeR1yczDZrQK
+hdQEtmfYN7hwBWNEC6LVwk6RgBAWrPlNlJlVnv6V23j/8s2IEmG7mXZhZj9iXYQj
+d3q34cZusQPdZDV3dptgOGgN2sFJIGJ38G1PLYoXI77EhCHHENN9OTJ2ZUQL+wk3
+pbQ3DR/xDKTdgvDFINH401UHasfFXATSFwIDAQABMA0GCSqGSIb3DQEBCwUAA4IC
+AQA6/uZyGl9lNRxAJfpomVauecATKC8CHrK7Z90D6MXvN85QruEbzIkLsGSGlQkY
+OxcTZKmn+Jimqrtu8twhRqhisIBQhjp81ppd6GEHg00ltjKo4keSQIV7noihZ4q1
+/+pIpEn7zi3+PJOj1J4i6yd1n0L34epUqhs6gY9OEhweHsZq1sjeGugjPCWtR5DI
+WZevDS4i6/WLEd3o8w7U7wKaBKUrO5ce9eqJU6CT1lZCszlwl3HSmp1H1ZfEp23i
+tO9wb2MwxZuC0BOIVD4cDuVkXXDvhDj4+13LH+/GxFIcOnG//sbPPtRrrKuTYcqm
+Yz///RvV5jpz0083DuqQ1YC3Miw39B/gR+Fs5mMng1grgcj4qUQ2G88AnQkbVD1p
+TJdk4pUV7btbhj9ySG5R35wJkrjGRpYGeO+Tse/5J/ao1B/tjfgSJiizGfJk6Rze
+AGqBRdKMea1/ae53ikx5y5anKjmN3Gox5Isv9RLvBa8BzHyZuAewUTekCo3bmc0p
+FNN7aVp47/zoMNWRFVnqgVLY8EYSv2ItYEE73BvE7SBbcGUe4atdNUpa+YGCj/3T
+VOW2Rf2u4swZuS+BmNA4+6Z9h4XWLTei7QMd6uMaO5EOIRZRuMNE72iQ4NnccinK
+XFV09dA7jU5Kx1i0FXJt5sr1gG7+ii1a+sF3kKbJyiVr7g==
+-----END CERTIFICATE-----

+ 51 - 0
servers/server.key

@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----

+ 27 - 0
servers/server.req

@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIEozCCAosCAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx
+ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBALZVael8y8r3xxyeFLJA/yzwBrz1rLdYzIfrgjBa
+PIeuuimi7Fl0Q1/NYw0LOImCBo5kIeMClZsCPN/YQ5mJYGsg4fE7JKd9n3Wjc4uU
+6dpmkxqChbtk63RPu1nOGRSGGUZ06lMZEVfgmqkgxjm5BdC3W10RDZ7u+SNvvPHx
+m6KcZrMBkcJRBW/1KHmKmx06B8IqGj4IjPmeJq4qj73etnvtmkOI6ItTzM3WXNKL
+LpixDFueFFuVqmg8YWCnx33QYqu4qSbBj6IqaFcuB2QWGbXxJ0RzpvG25nGAgrai
+gsqCedxiGWJhKnoPmwR0K0tAK8SF6pWzcwIAFwUrLmv8P1GAdFCM9VD//xRfEqMf
+AV1MAfXguuP4VDhYwR0Fg2g7Goct2oDg6DGFGmuC3X3vuho/vG+RfHTvHJl/e5P1
+51g7orruoJHgo4mI6QIBFHINBh8/wYOcWJ/83KqjbIKlPqXlqt7aDgXQM8ILNfZT
+v0aGvUgyRYY6KTLI2/t2ttsZ5HXJzMNmtAqF1AS2Z9g3uHAFY0QLotXCTpGAEBas
++U2UmVWe/pXbeP/yzYgSYbuZdmFmP2JdhCN3erfhxm6xA91kNXd2m2A4aA3awUkg
+YnfwbU8tihcjvsSEIccQ0305MnZlRAv7CTeltDcNH/EMpN2C8MUg0fjTVQdqx8Vc
+BNIXAgMBAAGgGTAXBgkqhkiG9w0BCQcxCgwIY2hvb3ptbzkwDQYJKoZIhvcNAQEL
+BQADggIBAFXnPQpJDxOosROHiM46qdRq1KNG6tMn4rya9huP21/jyafyQEW3ndti
+ZDas2sQMTuO2okZQIpM9WA3GXNoaQXdZd52P2zuu4MH42RvJScEIGs3RihOfg/AB
+rF1T1222S8A0TBrpr6czqetY0oQlHVZRFRrY+MwTbZAspyGCDHwRUzNi3vuHZgYu
+hvhakt1DYXq2mqiaTN6XaOJTZHuCM2FETqDPXWBSRWDzfwOR8jlcj0iEt077pA8T
+eBSknTQOxD2oQe3+fpHrQkH/EJBBfOZV/PoFsNxA3iPL4N/SO0aVTtOVeXcXsMVS
+FBttayZ6qgTgwPm3o4bcRYUaFXdPdWQ4Z4Vi548Z9M60VttWAWIkiJHJQTAUSZcJ
+uif1MVaYjHYCUqEpJsuULVMiPYukcX3NZGBKQB0AwtEvejLYKxBzLDsXqnBrecj5
+8wiS70ORmZBeSLx78VfU9JnEE0vhI0VBwvkAP1G9qF/Gv+8cwNCWyO0rdUfBRmTW
+SouAq6QuxsywA51D3syrTtUgNJ0HtZb+jlHBtoEM6ws2ihPn6inB3jkfynko4gTT
+b9/FHp7YI75kQVvtmoYUkE/dOUPUEI5ybdNLx0Mf1h5enp8cnSpyiiIT2oFcJlMn
+wcc1HvdtdJeksnW9Wnf49MvTVmIRmuWUVQ9qXXxxtFk0aH+VUeTx
+-----END CERTIFICATE REQUEST-----