Source code for plugins.node

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# Copyright 2008, 2016 Glencoe Software, Inc.  All Rights Reserved.
# Use is subject to license terms supplied in LICENSE.txt
# Josh Moore, josh at glencoesoftware.com

"""
OMERO Grid node controller

This is a python wrapper around icegridnode.
"""

from omero.cli import BaseControl, CLI, NonZeroReturnCode
from omero.util import tail_lines
import os
import sys
import signal
import platform
from omero_ext.path import path

from omero.install.windows_warning import windows_warning, WINDOWS_WARNING

HELP = """Control icegridnode.

           start       -- Start the node via icegridnode. With sync doesn't \
return until reachable.
           stop        -- Stop the node via icegridadmin. With sync doesn't \
return until stopped.
           status      -- Prints a status message. Return code is non-zero if\
 there is a problem.
           restart     -- Calls "sync start" then "stop" ("sync stop" if sync\
 is specified)

        node-name cannot be "start", "stop", "restart", "status", or "sync".
"""

if platform.system() == 'Windows':
    HELP += ("\n\n%s" % WINDOWS_WARNING)


[docs] class NodeControl(BaseControl): def _configure(self, parser): parser.add_argument( "name", nargs="?", help="Optional name of this node.", default=self._node()) parser.add_argument( "sync", nargs="?", choices=("sync",), help="Whether or not to call wait on results") parser.add_argument( "command", nargs="+", choices=("start", "stop", "status", "restart")) parser.add_argument( "--foreground", action="store_true", help="Start in foreground mode (no daemon/service)") parser.set_defaults(func=self.__call__) def __call__(self, args): self._node(args.name) # Set environment value for act in args.command: c = getattr(self, act) c(args) def _handleNZRC(self, nzrc): """ Set the return value from nzrc on the context, and print out the last two lines of any error messages if present. """ props = self._properties() self.ctx.rv = nzrc.rv myoutput = self.dir / path(props["Ice.StdErr"]) if not myoutput.exists(): pass else: print("from %s:" % str(myoutput)) print(tail_lines(str(myoutput), 2)) @windows_warning def start(self, args): self.ctx.invoke(["admin", "rewrite"]) self._initDir() try: command = ["icegridnode", self._icecfg()] if self._isWindows(): self.ctx.die(128, "Not implemented") # The following code clearly hasn't been tested. # TODO: Fix this or remove it completely command = command + ["--install", "OMERO."+args.node] self.ctx.call(command) self.ctx.call(["icegridnode", "--start", "OMERO."+args.node]) else: if args.foreground: command = command + ["--nochdir"] else: command = command + ["--daemon", "--pidfile", str(self._pid()), "--nochdir"] self.ctx.call(command) except OSError as o: msg = """%s\nPossibly an error finding "icegridnode". Try \ "icegridnode -h" from the command line.""" % o raise Exception(msg) except NonZeroReturnCode as nzrc: self._handleNZRC(nzrc)
[docs] def status(self, args): self.ctx.invoke(["admin", "status", args.name])
@windows_warning def stop(self, args): if self._isWindows(): try: command = ["icegridnode", "--stop", "OMERO."+args.name] self.ctx.call(command) command = ["icegridnode", "--uninstall", "OMERO."+args.name] self.ctx.call(command) except NonZeroReturnCode as nzrc: self._handleNZRC(nzrc) else: pid = open(self._pid(), "r").readline() os.kill(int(pid), signal.SIGTERM) # command = ["icegridadmin"] + [self._intcfg()] + ["-c", "node # shutdown %s" % args.name] # self.ctx.call(command) @windows_warning def kill(self, args): pid = open(self._pid(), "r").readline() os.kill(int(pid), signal.SIGKILL)
try: register("node", NodeControl, HELP) except NameError: if __name__ == "__main__": cli = CLI() cli.loadplugins() cli.invoke(sys.argv[1:])