Skip to content

Instantly share code, notes, and snippets.

@tos-kamiya
Created November 3, 2019 09:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tos-kamiya/f7b0ed87f4e35f401d490f3245e4e82d to your computer and use it in GitHub Desktop.
Save tos-kamiya/f7b0ed87f4e35f401d490f3245e4e82d to your computer and use it in GitHub Desktop.
Alternative XMLRPCServer which can shutdown cleanly
# reference: http://code.activestate.com/recipes/114579-remotely-exit-a-xmlrpc-server-cleanly/
import xmlrpc.server
import socket
import signal
class AltXMLRPCServer(xmlrpc.server.SimpleXMLRPCServer):
def __init__(self, addr):
super().__init__(addr, allow_none=True)
self.finished = False
def register_signal(self, signum):
signal.signal(signum, self.signal_handler)
def signal_handler(self, signum, frame):
self.shutdown()
def shutdown(self):
self.finished = True
def serve_forever(self):
spr = super()
while not self.finished:
spr.handle_request()
def main():
import sys
from datetime import datetime
args = sys.argv[1:]
if not args or args[0] in ('-h', '--help'):
print("""Usage:
{argv0} run
{argv0} now
{argv0} shutdown
""".format(argv0=sys.argv[0]))
sys.exit()
assert len(args) == 1
cmd = args[0]
if cmd == 'run':
server = AltXMLRPCServer(('localhost', 8080))
def now():
return datetime.now().strftime('%Y/%m/%d %H:%M:%S')
def shutdown():
server.shutdown()
server.register_function(now)
server.register_function(shutdown)
print('> The `now` server is waiting on localhost:8080 ...')
server.serve_forever()
elif cmd in ('now', 'shutdown'):
import xmlrpc.client
proxy = xmlrpc.client.ServerProxy('http://localhost:8080')
if cmd == 'now':
print(proxy.now())
elif cmd == 'shutdown':
proxy.shutdown()
else:
assert False
else:
sys.exit('Error: invalid command/option')
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment