def kill(signal=9): """ Kill zombie (unregistered) modules """ zombies = [] pids = set(m[1] for m in running_modules()) for line in shell('ps -e --no-headers -o pid,command').split('\n'): try: pid, name = re.match(r'\s*(\d+)\s+(.+)$', line).groups() except AttributeError: continue mob = re.search(r'app/(.*?)/main', name) if mob and pid not in pids: zombies.append((mob.group(1), pid)) if not zombies: puts(fore.green('No zombies detected')) else: puts(fore.green('Killing %d zombie modules' % len(zombies))) for name, pid in zombies: puts(' * Killing %-10s (pid: %s) ...' % (fore.cyan(name), fore.red(pid))) try: shell('kill -s %s %s' % (signal, pid), exception=RuntimeError) except RuntimeError as e: puts(fore.magenta(' Error: ') + e.args[0])
def println(line): # blank line if re.match(r'\s*$', line): return puts(line) # logfile header mobj = re.match(r'==> (.*) <==$', line) if mobj: return puts(style.bright(fore.black('==> ') + fore.white(mobj.group(1)) + fore.black(' <=='))) # exception line if re.match(EXCEPTION_PREFIX, line): return puts(fore.red(line)) # standard log line basic = r'(.*?\s+)' date = basic*3 time = basic type = basic file = '(\[.*?\s+)\])' mobj = re.match(basic*6 + r'(.*)', line) if not mobj: # non-conventional line return puts(line) else: groups = list(mobj.groups()) groups.insert(0, str(fore.cyan)) groups.insert(4, str(fore.blue)) groups.insert(6, str(style.bright)) groups.insert(8, str(style.reset_all)) groups.insert(9, str(fore.cyan)) groups.insert(11, str(style.reset_all)) for idx, string in enumerate(groups): string = re.sub(r'(STATUS)', fore.white(r'\1'), string) string = re.sub(r'(DEBUG)', fore.white(r'\1'), string) string = re.sub(r'(INFO)', fore.green(r'\1'), string) string = re.sub(r'(WARNING)', fore.yellow(r'\1'), string) string = re.sub(r'(ERROR)', fore.red(r'\1'), string) string = re.sub(r'(EXCEPT)', fore.red(r'\1'), string) groups[idx] = string groups[-1] = re.sub(r'\[', fore.cyan(r'['), groups[-1]) groups[-1] = re.sub(r'\]', fore.cyan(r']'), groups[-1]) groups[-1] = re.sub(r'~>', fore.blue(r'~>'), groups[-1]) groups[-1] = re.sub(r'<~', fore.yellow(r'<~'), groups[-1]) groups[-1] = re.sub(r'\(', fore.cyan(r'('), groups[-1]) groups[-1] = re.sub(r'\)', fore.cyan(r')'), groups[-1]) groups[-1] = re.sub(r"'", fore.cyan(r"'"), groups[-1]) groups[-1] = re.sub(r'"', fore.cyan(r'"'), groups[-1]) return puts(''.join(groups))
def ignore(dirname, names): common = osp.commonprefix([project, dirname]) puts( fore.green(' init ') + osp.join(projname, dirname[len(common) + 1:])) return []
def generate(modname): """ generate new module """ # check for valid name if modname.lower() in pydoc.Helper.keywords.keys(): raise PyscaleError('%s is a Python keyword.' % repr(modname.lower())) # go to project root root = find_project() if root != False: os.chdir(root) else: raise PyscaleError('Pyscale project not found (missing Cakefile?)') # create folder folder = 'app/%s' % modname if osp.isdir(folder): puts(fore.yellow(' exists ') + folder) else: puts(fore.green(' mkdir ') + folder) os.makedirs(folder) # create file modfile = 'app/%s/main' % modname tplfile = osp.join(pyscale.__path__[0], 'files', 'module') if osp.exists(modfile): raise PyscaleError('Module already exists. Aborting...') else: with open(tplfile) as f: tpl = jinja2.Template(f.read()) tpl = tpl.render(module=modname.title()) puts(fore.green(' create ') + modfile) with open(modfile, 'w') as f: f.write(tpl)
def api(modules): # ensure iterable if isinstance(modules, Socket): modules = [modules] # iterate list for module in modules: puts('= ' + fore.green(module.name)) for obj in module.help(): if isinstance(obj, list): # method puts(' * ' + fore.yellow(obj[0]) + ' ' + fore.white(obj[1])) if obj[2]: puts(' ' + fore.blue(obj[2]))
def status(): """ View running modules """ for module, pid, pidfile in running_modules(): if not osp.exists("/proc/%s" % pid): puts(fore.red("%s (pid %s) crashed" % (module, pid))) pids = map(operator.itemgetter(1), running_modules()) if pids: pscomm = "ps -p %s -o pid,user,command:50,pcpu,pmem,vsz,nice,start,time" % ','.join(pids) psinfo = shell(pscomm).split('\n') if len(psinfo) > 1 and psinfo[1]: puts(fore.green(psinfo[0])) for ps in psinfo[1:]: color = lambda mobj: re.sub(mobj.group(1), fore.cyan(mobj.group(1)), mobj.group(0)) puts(re.sub('app/(.*?)/main', color, ps))
def reinit(namespace, info=True): # clean sockets for sock in namespace.sockets: delattr(namespace, sock.name) # create sockets namespace.all = MultiSocket('*') namespace.sockets = namespace.all.objs for sock in namespace.sockets: setattr(namespace, sock.name, sock) # display info if info: puts('=== ' + fore.blue('PyScale Console') + ' =', padding='=') for sock in ['all'] + sorted([x.name for x in namespace.sockets]): puts(' ' + fore.green('>>> ') + sock) puts('=====================', padding='=')
def decorator(base): info = ': ' + arg if type(arg) is str else '' header = fore.green('** ' + fore.cyan(base.__name__) + info) def func(*args, **kwargs): sys.stdout.indent_level += 1 puts(header) base(*args, **kwargs) sys.stdout.indent_level -= 1 params = inspect.formatargspec(*inspect.getargspec(base))[1:-1] specformat = fore.cyan('%s') + ' ' + fore.white('%s') func._task = True func._spec = specformat % (base.__name__, params) func._desc = re.sub('\s+', ' ', inspect.getdoc(base) or '') return func
def status(): """ View running modules """ for module, pid, pidfile in running_modules(): if not osp.exists("/proc/%s" % pid): puts(fore.red("%s (pid %s) crashed" % (module, pid))) pids = map(operator.itemgetter(1), running_modules()) if pids: pscomm = "ps -p %s -o pid,user,command:50,pcpu,pmem,vsz,nice,start,time" % ','.join( pids) psinfo = shell(pscomm).split('\n') if len(psinfo) > 1 and psinfo[1]: puts(fore.green(psinfo[0])) for ps in psinfo[1:]: color = lambda mobj: re.sub(mobj.group( 1), fore.cyan(mobj.group(1)), mobj.group(0)) puts(re.sub('app/(.*?)/main', color, ps))
def println(line): # blank line if re.match(r'\s*$', line): return puts(line) # logfile header mobj = re.match(r'==> (.*) <==$', line) if mobj: return puts( style.bright( fore.black('==> ') + fore.white(mobj.group(1)) + fore.black(' <=='))) # exception line if re.match(EXCEPTION_PREFIX, line): return puts(fore.red(line)) # standard log line basic = r'(.*?\s+)' date = basic * 3 time = basic type = basic file = '(\[.*?\s+)\])' mobj = re.match(basic * 6 + r'(.*)', line) if not mobj: # non-conventional line return puts(line) else: groups = list(mobj.groups()) groups.insert(0, str(fore.cyan)) groups.insert(4, str(fore.blue)) groups.insert(6, str(style.bright)) groups.insert(8, str(style.reset_all)) groups.insert(9, str(fore.cyan)) groups.insert(11, str(style.reset_all)) for idx, string in enumerate(groups): string = re.sub(r'(STATUS)', fore.white(r'\1'), string) string = re.sub(r'(DEBUG)', fore.white(r'\1'), string) string = re.sub(r'(INFO)', fore.green(r'\1'), string) string = re.sub(r'(WARNING)', fore.yellow(r'\1'), string) string = re.sub(r'(ERROR)', fore.red(r'\1'), string) string = re.sub(r'(EXCEPT)', fore.red(r'\1'), string) groups[idx] = string groups[-1] = re.sub(r'\[', fore.cyan(r'['), groups[-1]) groups[-1] = re.sub(r'\]', fore.cyan(r']'), groups[-1]) groups[-1] = re.sub(r'~>', fore.blue(r'~>'), groups[-1]) groups[-1] = re.sub(r'<~', fore.yellow(r'<~'), groups[-1]) groups[-1] = re.sub(r'\(', fore.cyan(r'('), groups[-1]) groups[-1] = re.sub(r'\)', fore.cyan(r')'), groups[-1]) groups[-1] = re.sub(r"'", fore.cyan(r"'"), groups[-1]) groups[-1] = re.sub(r'"', fore.cyan(r'"'), groups[-1]) return puts(''.join(groups))
def ignore(dirname, names): common = osp.commonprefix([project, dirname]) puts(fore.green(' init ') + osp.join(projname, dirname[len(common)+1:])) return []