import sys, os
+import subprocess
-def usage():
- sys.stderr.write("%s version %s\n" % (sys.argv[0], __version__))
- sys.stderr.write("Usage: %s [force]\n" % sys.argv[0])
- sys.exit(0)
-
def error(error_str, error_code=1):
sys.stderr.write("%s: Error: %s\n" % (sys.argv[0], error_str))
sys.exit(error_code)
else:
min_delay = 3600*24 # 24 hours
+# httpd settings
+if config.has_option("httpd", "host"):
+ host = config.get("httpd", "host")
+else:
+ host = 'localhost'
+
+if config.has_option("httpd", "port"):
+ port = config.getint("httpd", "port")
+else:
+ error("Config must specify a port to listen. Abort.")
+
del config
error("No images found. Abort.")
-def run():
- if len(sys.argv) not in (1, 2):
- usage()
-
- force = False
- if len(sys.argv) == 2:
- if sys.argv[1] == "force":
- force = True
- else:
- usage()
+def published(func):
+ func._wsgi_published = True
+ return func
+@published
+def ping(force=False):
# Use the program's file as the lock file:
# lock it to prevent two processes run in parallel.
lock_file = open("xsetbg.py", 'r')
global_db = None
try:
- # Re-seed the RNG; this is neccessary because ReadyExecd forks
- # and RNG in a child process got the same seed from the parent
- # after every fork.
- random.seed()
-
# Reopen the global persistent dictionary
global_db = shelve.open(global_db_name, 'w')
# Flush and close the global persistent dictionary
if global_db: global_db.close()
- program_options = ["xli", "xli", "-onroot", "-quiet"] + \
+ program_options = ["xli", "-onroot", "-quiet"] + \
["-center", "-border", random.choice(borders), "-zoom", "auto",
image_name]
- os.execlp(*program_options)
- error("cannot execute xli!")
-
-
-if __name__ == "__main__":
- run()
+ rc = subprocess.call(program_options)
+ if rc:
+ error("cannot execute xli!")
+
+@published
+def force():
+ ping(force=True)
+
+@published
+def stop():
+ QuitWSGIServer._quit_flag = True
+
+
+from wsgiref.handlers import SimpleHandler
+from wsgiref import simple_server
+simple_server.ServerHandler = SimpleHandler # Stop logging to stdout
+from wsgiref.simple_server import WSGIServer, make_server
+
+g = globals().copy()
+commands = dict([(name, g[name]) for name in g
+ if getattr(g[name], '_wsgi_published', False)])
+del g
+
+class QuitWSGIServer(WSGIServer):
+ _quit_flag = False
+
+ def serve_forever(self):
+ while not self._quit_flag:
+ self.handle_request()
+
+def app(env, start_response):
+ command = env['PATH_INFO'][1:] # Remove the leading slash
+ if command not in commands:
+ status = '404 Not found'
+ response_headers = [('Content-type', 'text/plain')]
+ start_response(status, response_headers)
+ return ['The command was not found.\n']
+
+ try:
+ commands[command]()
+ except:
+ status = '500 Error'
+ response_headers = [('Content-type', 'text/plain')]
+ start_response(status, response_headers)
+ return ['Error occured!\n']
+
+ status = '200 OK'
+ response_headers = [('Content-type', 'text/plain')]
+ start_response(status, response_headers)
+ return ['Ok\n']
+
+httpd = make_server(host, port, app, server_class=QuitWSGIServer)
+httpd.serve_forever()