Mercurial > repos > melissacline > ucsc_xena_platform
diff runXena.py @ 0:8bb037f88ed2
Uploaded
author | melissacline |
---|---|
date | Tue, 13 Jan 2015 23:37:23 -0500 |
parents | |
children | 14aaed60e07b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runXena.py Tue Jan 13 23:37:23 2015 -0500 @@ -0,0 +1,150 @@ +#!/usr/bin/env python +# To kick off the script, run the following from the python directory: +# PYTHONPATH=`pwd` python testdaemon.py start + +#standard python libs +import logging +import os +import signal +import subprocess +import sys +import time +import traceback +import xena_utils as xena + +#third party libs +from daemon import runner +from lockfile import LockTimeout + + +class App(): + + def __init__(self): + xenaBaseDir = xena.baseDir() + if not os.path.exists(xenaBaseDir): + os.mkdir(xenaBaseDir) + self.pidfile_path = xenaBaseDir + "/xena-daemon.pid" + + self.stdin_path = '/dev/null' + self.stdout_path = '/dev/null' + self.stderr_path = '/dev/null' + self.pidfile_timeout = 5 + + def run(self): + while True: + #Main code goes here ... + #Note that logger level needs to be set to logging.DEBUG before this shows up in the logs + xenaCmdline = "java -jar %s -r %s/files -d %s/db -t %s/tmp --logfile %s/xena.log -p %s -H 0.0.0.0 --no-auto" + xenaBaseDir = xena.baseDir() + xenaCmd = xenaCmdline % (xena.jarPath(), xenaBaseDir, + xenaBaseDir, xenaBaseDir, + xenaBaseDir, xena.port()) + logger.debug("Invoking Xena VM with command %s" % (xenaCmd)) + xenaVm = subprocess.call(xenaCmd, shell=True) + logger.info("Starting Xena VM") + #logger.warn("Warning message") + #logger.error("Error message") + + + +def processListeningOnPort(portID): + cmd = "lsof -t -i :%s -sTCP:LISTEN" % portID + pid = subprocess.check_output(cmd, shell=True).rstrip() + return(int(pid)) + + +fp = open(sys.argv[2], "w") + +app = App() +logger = logging.getLogger("DaemonLog") +logger.setLevel(logging.DEBUG) +formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") +handler = logging.FileHandler(xena.baseDir() + "/xena-daemon.log") +handler.setFormatter(formatter) +logger.addHandler(handler) + +hostname = subprocess.check_output("hostname -f", shell=True).rstrip() + +# +# Check if there has been a Xena running on this system, and +# what its port number is or was. +# +xenaPort = xena.port() +if xenaPort == None: + # In this case, no Xena has been running on this sytem. + xenaIsRunning = False +else: + xenaIsRunning = xena.isRunning(xenaPort) +#rint "xena running", xenaIsRunning, "port", xenaPort + + +if sys.argv[1] == "status": + # + # When checking status, if Xena is running, then report that it's running + # with hostname and port. If it's not running, then report as such. + # + if xenaIsRunning: + fp.write("Xena VM currently running on %s:%s\n" % (hostname, xenaPort)) + fp.write("You can add %s:%s to Xena Data Hub\n" % (hostname, xenaPort)) + else: + fp.write("Xena VM is not currently running on %s\n" % (hostname)) + +elif sys.argv[1] == "start": + # + # When a start command came in, allocate a new port and prepare to start + # xena if it's not already running. If it is already running, then + # report as such. In either case, close the output file before this + # process goes into daemon mode. + # + if not xenaIsRunning: + xenaPort = xena.port(testIfAvailable=True, findNewPort=True) + fp.write("Starting Xena VM on %s:%s\n" % (hostname, xenaPort)) + fp.write("You can add %s:%s to Xena Data Hub\n" % (hostname, xenaPort)) + else: + fp.write("Xena VM already running on %s:%s\n" % (hostname, xenaPort)) + fp.write("You can add %s:%s to Xena Data Hub\n" % (hostname, xenaPort)) + fp.close() + +elif sys.argv[1] == "stop": + # + # When stopping Xena, if it's currently running, report that Xena + # is being terminated and clean up the port. If it's not running, + # report as such. + # + if xenaIsRunning: + fp.write("Terminating Xena VM on %s:%s\n" % (hostname, xenaPort)) + else: + fp.write("Xena VM is not currently running on %s\n" % (hostname)) + +else: + fp.write(("Error: Unexpected command %s" % sys.argv[1])) + + +# +# Here is where the starting and stopping of the Xena daemon takes place. +# +if sys.argv[1] == "start" or (sys.argv[1] == "stop" and xenaIsRunning): + daemon_runner = runner.DaemonRunner(app) + # This ensures that the logger file handle does not get closed during daemonization + daemon_runner.daemon_context.files_preserve=[handler.stream] + try: + daemon_runner.do_action() + except LockTimeout: + # Xena is already running. No need to do anything special, but this + # should be separated from the other exceptions. + pass + except: + exc_type, exc_value, exc_traceback = sys.exc_info() + lines = traceback.format_exception(exc_type, exc_value, exc_traceback) + allLines = ''.join('!! ' + line for line in lines) + fp.write("Unsuccessful: error %s\n" % allLines) + if sys.argv[1] == "stop": + # + # If the Xena stop command has been issued, then kill the Xena + # process. + # + xenaPid = processListeningOnPort(xenaPort) + logger.debug("Attempting to kill process with PID %d" % xenaPid) + os.kill(xenaPid, signal.SIGTERM) +if sys.argv[1] != "start": + fp.close()