+ # jobs ------------------------
+
+ @staticmethod
+ @_RequireJobQueueLock
+ def perspective_jobqueue_update(params):
+ """Update job queue.
+
+ """
+ (file_name, content) = params
+ return backend.JobQueueUpdate(file_name, content)
+
+ @staticmethod
+ @_RequireJobQueueLock
+ def perspective_jobqueue_purge(params):
+ """Purge job queue.
+
+ """
+ return backend.JobQueuePurge()
+
+ @staticmethod
+ @_RequireJobQueueLock
+ def perspective_jobqueue_rename(params):
+ """Rename a job queue file.
+
+ """
+ (old, new) = params
+
+ return backend.JobQueueRename(old, new)
+
+
+class NodeDaemonHttpServer(http.HTTPServer):
+ def __init__(self, server_address):
+ http.HTTPServer.__init__(self, server_address, NodeDaemonRequestHandler)
+ self.noded_pid = os.getpid()
+
+ def serve_forever(self):
+ """Handle requests until told to quit."""
+ sighandler = utils.SignalHandler([signal.SIGINT, signal.SIGTERM])
+ try:
+ while not sighandler.called:
+ self.handle_request()
+ # TODO: There could be children running at this point
+ finally:
+ sighandler.Reset()
+
+
+class ForkingHTTPServer(SocketServer.ForkingMixIn, NodeDaemonHttpServer):
+ """Forking HTTP Server.
+
+ This inherits from ForkingMixIn and HTTPServer in order to fork for each
+ request we handle. This allows more requests to be handled concurrently.
+
+ """
+