Source code for synapse.cmds.boss

import shlex
import synapse.exc as s_exc

import synapse.lib.cmd as s_cmd
import synapse.lib.cli as s_cli
import synapse.lib.time as s_time

[docs] class PsCmd(s_cli.Cmd): ''' List running tasks in the cortex. ''' _cmd_name = 'ps' _cmd_syntax = ( ('--verbose', {}), ('-v', {}), )
[docs] async def runCmdOpts(self, opts): core = self.getCmdItem() tasks = await core.ps() isverbose = opts.get('verbose') or opts.get('v') MAXFIELDLEN = 120 def clamp(field): if isinstance(field, dict): for key, valu in field.items(): field[key] = clamp(valu) elif isinstance(field, str) and len(field) > MAXFIELDLEN: field = field[:MAXFIELDLEN] + '...' return field for task in tasks: self.printf('task iden: %s' % (task.get('iden'),)) self.printf(' name: %s' % (task.get('name'),)) self.printf(' user: %r' % (task.get('user'),)) self.printf(' status: %r' % (task.get('status'),)) metadata = task.get('info') if metadata is not None and not isverbose: metadata = clamp(metadata) self.printf(' metadata: %r' % metadata) self.printf(' start time: %s' % (s_time.repr(task.get('tick', 0)),)) self.printf('%d tasks found.' % (len(tasks,)))
[docs] class KillCmd(s_cli.Cmd): ''' Kill a running task/query within the cortex. Syntax: kill <iden> Users may specify a partial iden GUID in order to kill exactly one matching process based on the partial guid. ''' _cmd_name = 'kill' _cmd_syntax = ( ('line', {'type': 'glob'}), ) def _make_argparser(self): parser = s_cmd.Parser(prog='kill', outp=self, description=self.__doc__) parser.add_argument('iden', help='Task iden to kill.', type=str) return parser
[docs] async def runCmdOpts(self, opts): line = opts.get('line') if line is None: self.printf(self.__doc__) return try: opts = self._make_argparser().parse_args(shlex.split(line)) except s_exc.ParserExit: return core = self.getCmdItem() match = opts.iden idens = [] for task in await core.ps(): iden = task.get('iden') if iden.startswith(match): idens.append(iden) if len(idens) == 0: self.printf('no matching process found.') return if len(idens) > 1: # pragma: no cover # this is a non-trivial situation to test since the # boss idens are random guids self.printf('multiple matching processes found. aborting.') return kild = await core.kill(idens[0]) self.printf('kill status: %r' % (kild,))