# -*- coding: utf-8 -*- # ***************************************************************************** # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Module authors: # Markus Zolliker # # ***************************************************************************** import sys import time import termios import subprocess import os from servicemanager.base import ServiceManager, ServiceDown, UsageError from servicemanager.sicsclient import sics_client def run_command(cmd, wait=False): if wait: old = termios.tcgetattr(sys.stdin) proc = subprocess.Popen(cmd.split()) try: proc.wait() except KeyboardInterrupt: proc.terminate() finally: # in case cmd changed tty attributes termios.tcsetattr(sys.stdin, termios.TCSAFLUSH, old) print('') else: subprocess.Popen(cmd.split(), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) class SeaManager(ServiceManager): group = 'sea' services = ('sea', 'graph') USAGE = """ Usage: sea gui sea # the same as sea gui sea cli # the same as old seacmd sea start [] * # the same as old 'monit start sea' sea restart [] * sea stop [] * sea list [] * is one of sea, graph %s * wildcards allowed, using '.' to replace 0 or more arbitrary characters in """ def do_cli(self, ins): if self.wildcard(ins): raise UsageError('wildcards not allowed in sea cli') try: self.check_running(ins, 'sea') except ServiceDown as e: self.do_help() print(str(e)) except KeyError: # running on an other machine? self.do_help() run_command('six -sea %s' % ins, wait=True) def do_gui(self, ins='', *args): if ins and self.wildcard(ins): raise UsageError('wildcards not allowed in sea gui') if ins: args = (ins,) + args if '-q' not in args: try: self.check_running(ins, 'sea') except ServiceDown as e: self.do_help() print(str(e)) return except KeyError: # running on an other machine? self.do_help() run_command('SeaClient %s' % ' '.join(args)) print('starting sea gui %s' % ' '.join(args)) time.sleep(5) def get_cfg(self, ins, service): """return cfg info about running programs, if relevant return samenv name """ if service != 'sea': # ignore when service == 'graph' return '' try: return sics_client(('localhost', self.info[ins]['sea']), 'samenv name') except Exception as e: return repr(e) def treat_args(self, argdict, unknown=(), extra=()): extra = list(extra) for arg in unknown: if arg == '-q' and arg not in extra: extra.append(arg) continue if argdict.get('ins'): raise UsageError('superflous argument: %s' % arg) insts = set() filename = os.environ.get('InstrumentHostList') if filename: with open(filename) as fil: for line in fil: inst = '' sea = False for item in line.split(): key, _, value = item.partition('=') if key == 'instr': inst = value elif key == 'sea': sea = True if inst and sea: insts.add(inst) if arg in insts: argdict['ins'] = arg else: raise UsageError('unknown argument: %s' % arg) return [argdict.pop('ins', '')] + extra