def reindex(self, args, config): self.check_access(config=config) import omero.java server_dir = self.ctx.dir / "lib" / "server" log4j = "-Dlog4j.configuration=log4j-cli.properties" classpath = [file.abspath() for file in server_dir.files("*.jar")] xargs = [log4j, "-Xmx1024M", "-cp", os.pathsep.join(classpath)] cfg = config.as_map() config.close() # Early close. See #9800 for x in ("name", "user", "host", "port"): # NOT passing password on command-line k = "omero.db.%s" % x if k in cfg: v = cfg[k] xargs.append("-D%s=%s" % (k, v)) if "omero.data.dir" in cfg: xargs.append("-Domero.data.dir=%s" % cfg["omero.data.dir"]) for k, v in cfg.items(): if k.startswith("omero.search"): xargs.append("-D%s=%s" % (k, cfg[k])) cmd = ["ome.services.fulltext.Main"] if args.full: cmd.append("full") elif args.events: cmd.append("events") elif getattr(args, "class"): cmd.append("reindex") cmd.extend(getattr(args, "class")) else: self.ctx.die(502, "No valid action: %s" % args) debug = False if getattr(args, "jdwp"): debug = True self.ctx.dbg("Launching Java: %s, debug=%s, xargs=%s" % (cmd, debug, xargs)) p = omero.java.popen( cmd, debug=debug, xargs=xargs, stdout=sys.stdout, stderr=sys.stderr) # FIXME. Shouldn't use std{out,err} self.ctx.rv = p.wait()
def reindex(self, args, config): self.check_access(config=config) import omero.java server_dir = self.ctx.dir / "lib" / "server" log_config_file = self.ctx.dir / "etc" / "logback-indexing-cli.xml" logback = "-Dlogback.configurationFile=%s" % log_config_file classpath = [file.abspath() for file in server_dir.files("*.jar")] xargs = [logback, "-Xmx1024M", "-cp", os.pathsep.join(classpath)] cfg = config.as_map() config.close() # Early close. See #9800 for x in ("name", "user", "host", "port"): # NOT passing password on command-line k = "omero.db.%s" % x if k in cfg: v = cfg[k] xargs.append("-D%s=%s" % (k, v)) if "omero.data.dir" in cfg: xargs.append("-Domero.data.dir=%s" % cfg["omero.data.dir"]) for k, v in cfg.items(): if k.startswith("omero.search"): xargs.append("-D%s=%s" % (k, cfg[k])) cmd = ["ome.services.fulltext.Main"] if args.full: cmd.append("full") elif args.events: cmd.append("events") elif getattr(args, "class"): cmd.append("reindex") cmd.extend(getattr(args, "class")) else: self.ctx.die(502, "No valid action: %s" % args) debug = False if getattr(args, "jdwp"): debug = True self.ctx.dbg( "Launching Java: %s, debug=%s, xargs=%s" % (cmd, debug, xargs)) p = omero.java.popen( cmd, debug=debug, xargs=xargs, stdout=sys.stdout, stderr=sys.stderr) # FIXME. Shouldn't use std{out,err} self.ctx.rv = p.wait()
def check_access(self, mask=os.R_OK | os.W_OK, config=None): """Check that 'var' is accessible by the current user.""" var = self.ctx.dir / 'var' if not os.path.exists(var): print "Creating directory %s" % var os.makedirs(var, 0700) else: self.can_access(var, mask) if config is not None: omero_data_dir = '/OMERO' config = config.as_map() try: omero_data_dir = config['omero.data.dir'] except KeyError: pass self.can_access(omero_data_dir) for p in os.listdir(var): subpath = os.path.join(var, p) if os.path.isdir(subpath): self.can_access(subpath, mask)
def check_access(self, mask=os.R_OK|os.W_OK, config=None): """Check that 'var' is accessible by the current user.""" var = self.ctx.dir / 'var' if not os.path.exists(var): print "Creating directory %s" % var os.makedirs(var, 0700) else: self.can_access(var, mask) if config is not None: omero_data_dir = '/OMERO' config = config.as_map() try: omero_data_dir = config['omero.data.dir'] except KeyError: pass self.can_access(omero_data_dir) for p in os.listdir(var): subpath = os.path.join(var, p) if os.path.isdir(subpath): self.can_access(subpath, mask)
def diagnostics(self, args, config): self.check_access() config = config.as_map() omero_data_dir = '/OMERO' try: omero_data_dir = config['omero.data.dir'] except KeyError: pass self.ctx.out(""" %s OMERO Diagnostics %s %s """ % ("=" * 80, VERSION, "=" * 80)) def sz_str(sz): for x in ["KB", "MB", "GB"]: sz /= 1000 if sz < 1000: break sz = "%.1f %s" % (sz, x) return sz def item(cat, msg): cat = cat + ":" cat = "%-12s" % cat self.ctx.out(cat, False) msg = "%-30s " % msg self.ctx.out(msg, False) def exists(p): if p.isdir(): if not p.exists(): self.ctx.out("doesn't exist") else: self.ctx.out("exists") else: if not p.exists(): self.ctx.out("n/a") else: warn = 0 err = 0 for l in p.lines(): if l.find("ERROR") >= 0: err += 1 elif l.find("WARN") >= 0: warn += 1 msg = "" if warn or err: msg = " errors=%-4s warnings=%-4s" % (err, warn) self.ctx.out("%-12s %s" % (sz_str(p.size), msg)) def version(cmd): """ Returns a true response only if a valid version was found. """ item("Commands", "%s" % " ".join(cmd)) try: p = self.ctx.popen(cmd) except OSError: self.ctx.err("not found") return False rv = p.wait() io = p.communicate() try: v = io[0].split() v.extend(io[1].split()) v = "".join(v) m = re.match("^\D*(\d[.\d]+\d)\D?.*$", v) v = "%-10s" % m.group(1) self.ctx.out(v, False) try: where = whichall(cmd[0]) sz = len(where) if sz == 0: where = "unknown" else: where = where[0] if sz > 1: where += " -- %s others" % sz except: where = "unknown" self.ctx.out("(%s)" % where) return True except exceptions.Exception, e: self.ctx.err("error:%s" % e) return False
def diagnostics(self, args, config): self.check_access() config = config.as_map() omero_data_dir = '/OMERO' try: omero_data_dir = config['omero.data.dir'] except KeyError: pass self.ctx.out(""" %s OMERO Diagnostics %s %s """ % ("="*80, VERSION, "="*80)) def sz_str(sz): for x in ["KB", "MB", "GB"]: sz /= 1000 if sz < 1000: break sz = "%.1f %s" % (sz, x) return sz def item(cat, msg): cat = cat + ":" cat = "%-12s" % cat self.ctx.out(cat, False) msg = "%-30s " % msg self.ctx.out(msg, False) def exists(p): if p.isdir(): if not p.exists(): self.ctx.out("doesn't exist") else: self.ctx.out("exists") else: if not p.exists(): self.ctx.out("n/a") else: warn = 0 err = 0 for l in p.lines(): if l.find("ERROR") >= 0: err += 1 elif l.find("WARN") >= 0: warn += 1 msg = "" if warn or err: msg = " errors=%-4s warnings=%-4s" % (err, warn) self.ctx.out("%-12s %s" % (sz_str(p.size), msg)) def version(cmd): """ Returns a true response only if a valid version was found. """ item("Commands","%s" % " ".join(cmd)) try: p = self.ctx.popen(cmd) except OSError: self.ctx.err("not found") return False rv = p.wait() io = p.communicate() try: v = io[0].split() v.extend(io[1].split()) v = "".join(v) m = re.match("^\D*(\d[.\d]+\d)\D?.*$", v) v = "%-10s" % m.group(1) self.ctx.out(v, False) try: where = whichall(cmd[0]) sz = len(where) if sz == 0: where = "unknown" else: where = where[0] if sz > 1: where += " -- %s others" % sz except: where = "unknown" self.ctx.out("(%s)" % where) return True except exceptions.Exception, e: self.ctx.err("error:%s" % e) return False
def diagnostics(self, args, config): self.check_access() config = config.as_map() omero_data_dir = '/OMERO' try: omero_data_dir = config['omero.data.dir'] except KeyError: pass from omero.util.temp_files import gettempdir # gettempdir returns ~/omero/tmp/omero_%NAME/%PROCESS # To find something more generally useful for calculating # size, we go up two directories omero_temp_dir = gettempdir() omero_temp_dir = os.path.abspath( os.path.join(omero_temp_dir, os.path.pardir, os.path.pardir)) self.ctx.out(""" %s OMERO Diagnostics %s %s """ % ("="*80, VERSION, "="*80)) def sz_str(sz): for x in ["KB", "MB", "GB"]: sz /= 1000 if sz < 1000: break sz = "%.1f %s" % (sz, x) return sz def item(cat, msg): cat = cat + ":" cat = "%-12s" % cat self.ctx.out(cat, False) msg = "%-30s " % msg self.ctx.out(msg, False) def exists(p): if p.isdir(): if not p.exists(): self.ctx.out("doesn't exist") else: self.ctx.out("exists") else: if not p.exists(): self.ctx.out("n/a") else: warn = 0 err = 0 for l in p.lines(): # ensure errors/warnings search is case-insensitive lcl = l.lower() found_err = lcl.find("error") >= 0 found_warn = lcl.find("warn") >= 0 if found_err: err += 1 elif found_warn: warn += 1 msg = "" if warn or err: msg = " errors=%-4s warnings=%-4s" % (err, warn) self.ctx.out("%-12s %s" % (sz_str(p.size), msg)) def version(cmd): """ Returns a true response only if a valid version was found. """ item("Commands", "%s" % " ".join(cmd)) try: p = self.ctx.popen(cmd) except OSError: self.ctx.err("not found") return False p.wait() io = p.communicate() try: v = io[0].split() v.extend(io[1].split()) v = "".join(v) m = re.match("^\D*(\d[.\d]+\d)\D?.*$", v) v = "%-10s" % m.group(1) self.ctx.out(v, False) try: where = whichall(cmd[0]) sz = len(where) if sz == 0: where = "unknown" else: where = where[0] if sz > 1: where += " -- %s others" % sz except: where = "unknown" self.ctx.out("(%s)" % where) return True except Exception, e: self.ctx.err("error:%s" % e) return False
def startasync(self, args, config): """ First checks for a valid installation, then checks the grid, then registers the action: "node HOST start" """ self.check_access(config=config) self.checkice() self.check_node(args) if self._isWindows(): self.checkwindows(args) if 0 == self.status(args, node_only=True): self.ctx.die(876, "Server already running") self._initDir() # Do a check to see if we've started before. self._regdata() self.check([]) user = args.user pasw = args.password descript = self._descript(args) if self._isWindows(): svc_name = "OMERO.%s" % args.node output = self._query_service(svc_name) # Now check if the server exists if 0 <= output.find("DOESNOTEXIST"): binpath = """icegridnode.exe "%s" --deploy "%s" --service\ %s""" % (self._icecfg(), descript, svc_name) # By default: "NT Authority\Local System" if not user: try: user = config.as_map()["omero.windows.user"] except KeyError: user = None if user is not None and len(user) > 0: if "\\" not in user: computername = win32api.GetComputerName() user = "******".join([computername, user]) try: # See #9967, code based on http://mail.python.org/\ # pipermail/python-win32/2010-October/010791.html self.ctx.out("Granting SeServiceLogonRight to service" " user \"%s\"" % user) policy_handle = win32security.LsaOpenPolicy( None, win32security.POLICY_ALL_ACCESS) sid_obj, domain, tmp = \ win32security.LookupAccountName(None, user) win32security.LsaAddAccountRights( policy_handle, sid_obj, ('SeServiceLogonRight',)) win32security.LsaClose(policy_handle) except pywintypes.error, details: self.ctx.die(200, "Error during service user set up:" " (%s) %s" % (details[0], details[2])) if not pasw: try: pasw = config.as_map()["omero.windows.pass"] except KeyError: pasw = self._ask_for_password( " for service user \"%s\"" % user) else: pasw = None hscm = win32service.OpenSCManager( None, None, win32service.SC_MANAGER_ALL_ACCESS) try: self.ctx.out("Installing %s Windows service." % svc_name) hs = win32service.CreateService( hscm, svc_name, svc_name, win32service.SERVICE_ALL_ACCESS, win32service.SERVICE_WIN32_OWN_PROCESS, win32service.SERVICE_AUTO_START, win32service.SERVICE_ERROR_NORMAL, binpath, None, 0, None, user, pasw) self.ctx.out("Successfully installed %s Windows service." % svc_name) win32service.CloseServiceHandle(hs) finally: win32service.CloseServiceHandle(hscm) # Then check if the server is already running if 0 <= output.find("RUNNING"): self.ctx.die(201, "%s is already running. Use stop first" % svc_name) # Finally, try to start the service - delete if startup fails hscm = win32service.OpenSCManager( None, None, win32service.SC_MANAGER_ALL_ACCESS) try: try: hs = win32service.OpenService( hscm, svc_name, win32service.SC_MANAGER_ALL_ACCESS) win32service.StartService(hs, None) self.ctx.out("Starting %s Windows service." % svc_name) except pywintypes.error, details: self.ctx.out("%s service startup failed: (%s) %s" % (svc_name, details[0], details[2])) win32service.DeleteService(hs) self.ctx.die(202, "%s service deleted." % svc_name) finally: win32service.CloseServiceHandle(hs) win32service.CloseServiceHandle(hscm)
def diagnostics(self, args, config): self.check_access() config = config.as_map() omero_data_dir = '/OMERO' try: omero_data_dir = config['omero.data.dir'] except KeyError: pass from omero.util.temp_files import gettempdir # gettempdir returns ~/omero/tmp/omero_%NAME/%PROCESS # To find something more generally useful for calculating # size, we go up two directories omero_temp_dir = gettempdir() omero_temp_dir = os.path.abspath( os.path.join(omero_temp_dir, os.path.pardir, os.path.pardir)) self.ctx.out(""" %s OMERO Diagnostics %s %s """ % ("=" * 80, VERSION, "=" * 80)) def sz_str(sz): for x in ["KB", "MB", "GB"]: sz /= 1000 if sz < 1000: break sz = "%.1f %s" % (sz, x) return sz def item(cat, msg): cat = cat + ":" cat = "%-12s" % cat self.ctx.out(cat, False) msg = "%-30s " % msg self.ctx.out(msg, False) def exists(p): if p.isdir(): if not p.exists(): self.ctx.out("doesn't exist") else: self.ctx.out("exists") else: if not p.exists(): self.ctx.out("n/a") else: warn = 0 err = 0 for l in p.lines(): # ensure errors/warnings search is case-insensitive lcl = l.lower() found_err = lcl.find("error") >= 0 found_warn = lcl.find("warn") >= 0 if found_err: err += 1 elif found_warn: warn += 1 msg = "" if warn or err: msg = " errors=%-4s warnings=%-4s" % (err, warn) self.ctx.out("%-12s %s" % (sz_str(p.size), msg)) def version(cmd): """ Returns a true response only if a valid version was found. """ item("Commands", "%s" % " ".join(cmd)) try: p = self.ctx.popen(cmd) except OSError: self.ctx.err("not found") return False p.wait() io = p.communicate() try: v = io[0].split() v.extend(io[1].split()) v = "".join(v) m = re.match("^\D*(\d[.\d]+\d)\D?.*$", v) v = "%-10s" % m.group(1) self.ctx.out(v, False) try: where = whichall(cmd[0]) sz = len(where) if sz == 0: where = "unknown" else: where = where[0] if sz > 1: where += " -- %s others" % sz except: where = "unknown" self.ctx.out("(%s)" % where) return True except Exception, e: self.ctx.err("error:%s" % e) return False
def startasync(self, args, config): """ First checks for a valid installation, then checks the grid, then registers the action: "node HOST start" """ self.check_access(config=config) self.checkice() self.check_node(args) if self._isWindows(): self.checkwindows(args) if 0 == self.status(args, node_only=True): self.ctx.die(876, "Server already running") self._initDir() # Do a check to see if we've started before. self._regdata() self.check([]) user = args.user pasw = args.password descript = self._descript(args) if self._isWindows(): svc_name = "OMERO.%s" % args.node output = self._query_service(svc_name) # Now check if the server exists if 0 <= output.find("DOESNOTEXIST"): binpath = """icegridnode.exe "%s" --deploy "%s" --service\ %s""" % (self._icecfg(), descript, svc_name) # By default: "NT Authority\Local System" if not user: try: user = config.as_map()["omero.windows.user"] except KeyError: user = None if user is not None and len(user) > 0: if not "\\" in user: computername = win32api.GetComputerName() user = "******".join([computername, user]) try: # See #9967, code based on http://mail.python.org/\ # pipermail/python-win32/2010-October/010791.html self.ctx.out("Granting SeServiceLogonRight to service" " user \"%s\"" % user) policy_handle = win32security.LsaOpenPolicy( None, win32security.POLICY_ALL_ACCESS) sid_obj, domain, tmp = \ win32security.LookupAccountName(None, user) win32security.LsaAddAccountRights( policy_handle, sid_obj, ('SeServiceLogonRight', )) win32security.LsaClose(policy_handle) except pywintypes.error, details: self.ctx.die( 200, "Error during service user set up:" " (%s) %s" % (details[0], details[2])) if not pasw: try: pasw = config.as_map()["omero.windows.pass"] except KeyError: pasw = self._ask_for_password( " for service user \"%s\"" % user) else: pasw = None hscm = win32service.OpenSCManager( None, None, win32service.SC_MANAGER_ALL_ACCESS) try: self.ctx.out("Installing %s Windows service." % svc_name) hs = win32service.CreateService( hscm, svc_name, svc_name, win32service.SERVICE_ALL_ACCESS, win32service.SERVICE_WIN32_OWN_PROCESS, win32service.SERVICE_AUTO_START, win32service.SERVICE_ERROR_NORMAL, binpath, None, 0, None, user, pasw) self.ctx.out("Successfully installed %s Windows service." % svc_name) win32service.CloseServiceHandle(hs) finally: win32service.CloseServiceHandle(hscm) # Then check if the server is already running if 0 <= output.find("RUNNING"): self.ctx.die( 201, "%s is already running. Use stop first" % svc_name) # Finally, try to start the service - delete if startup fails hscm = win32service.OpenSCManager( None, None, win32service.SC_MANAGER_ALL_ACCESS) try: try: hs = win32service.OpenService( hscm, svc_name, win32service.SC_MANAGER_ALL_ACCESS) win32service.StartService(hs, None) self.ctx.out("Starting %s Windows service." % svc_name) except pywintypes.error, details: self.ctx.out("%s service startup failed: (%s) %s" % (svc_name, details[0], details[2])) win32service.DeleteService(hs) self.ctx.die(202, "%s service deleted." % svc_name) finally: win32service.CloseServiceHandle(hs) win32service.CloseServiceHandle(hscm)