Source code for examples.datastore_config_server
#!/usr/local/bin/python
"""Simple XML-RPC Server to run on the datastore server.
This daemon should be run on HiSPARC's datastore server. It will
handle the cluster layouts and station passwords. When an update is
necessary, it will reload the HTTP daemon.
The basis for this code was ripped from the python SimpleXMLRPCServer
library documentation and extended.
"""
import hashlib
import os
import urllib.error
import urllib.parse
import urllib.request
from xmlrpc.server import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer
HASH = '/tmp/hash_datastore'
DATASTORE_CFG = '/databases/frome/station_list.csv'
CFG_URL = 'https://data.hisparc.nl/config/datastore'
DATASTORE_XMLRPC_SERVER = ('192.168.99.13', 8001)
RELOAD_PATH = '/tmp/uwsgi-reload.me'
[docs]
def reload_datastore():
"""Load datastore config and reload datastore, if necessary"""
datastore_cfg = urllib.request.urlopen(CFG_URL).read()
new_hash = hashlib.sha1(datastore_cfg).hexdigest()
try:
with open(HASH) as file:
old_hash = file.readline()
except OSError:
old_hash = None
if new_hash == old_hash:
return True
else:
with open(DATASTORE_CFG, 'w') as file:
file.write(datastore_cfg)
# reload uWSGI
with open(RELOAD_PATH, 'a'):
os.utime(RELOAD_PATH, None)
with open(HASH, 'w') as file:
file.write(new_hash)
return True
if __name__ == '__main__':
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
# Create server
server = SimpleXMLRPCServer(DATASTORE_XMLRPC_SERVER, requestHandler=RequestHandler)
server.register_introspection_functions()
server.register_function(reload_datastore)
# Run the server's main loop
server.serve_forever()