async def main(argv): # pragma: no cover if len(argv) not in (1, 2): print( 'usage: python -m synapse.tools.cmdr <url> [<single quoted command>]' ) return 1 s_common.setlogging(logger, 'WARNING') # Ensure that SYN_DIR is available _ = s_common.getSynDir() async with await s_telepath.openurl(argv[0]) as item: try: s_version.reqVersion(item._getSynVers(), reqver) except s_exc.BadVersion as e: valu = s_version.fmtVersion(*e.get('valu')) print( f'Proxy version {valu} is outside of the cmdr supported range ({reqver}).' ) print( f'Please use a version of Synapse which supports {valu}; current version is {s_version.verstring}.' ) return 1 await runcmdr(argv, item) return 0
async def _main(argv, outp): async with await s_telepath.openurl(argv[0]) as prox: try: s_version.reqVersion(prox._getSynVers(), reqver) except s_exc.BadVersion as e: # pragma: no cover valu = s_version.fmtVersion(*e.get('valu')) outp.printf(f'Proxy version {valu} is outside of the aha supported range ({reqver}).') return 1 try: network = argv[1] except IndexError: network = None mesg = f"{'Service':<20s} {'network':<30s} {'online':<6} {'scheme':<6} {'host':<20} {'port':<5} connection opts" outp.printf(mesg) async for svc in prox.getAhaSvcs(network): svcname = svc.pop('svcname') svcnetw = svc.pop('svcnetw') svcinfo = svc.pop('svcinfo') urlinfo = svcinfo.pop('urlinfo') online = str(bool(svcinfo.pop('online', False))) host = urlinfo.pop('host') port = str(urlinfo.pop('port')) scheme = urlinfo.pop('scheme') mesg = f'{svcname:<20s} {svcnetw:<30s} {online:<6} {scheme:<6} {host:<20} {port:<5}' if svc: mesg = f'{mesg} {svc}' outp.printf(mesg) return 0
async def matches(self, vertup, reqstr): reqstr = await s_stormtypes.tostr(reqstr) vertup = tuple(await s_stormtypes.toprim(vertup)) try: s_version.reqVersion(vertup, reqstr) return True except s_exc.BadVersion: return False
async def main(argv, outp=s_output.stdout): pars = argparse.ArgumentParser( prog='synapse.tools.hive.load', description='Load data into a remote hive from a previous hivesave.') pars.add_argument('--trim', default=False, action='store_true', help='Trim all other hive nodes (DANGER!)') pars.add_argument('--path', default=None, help='A hive path string to use as the root.') pars.add_argument( '--yaml', default=False, action='store_true', help='Parse the savefile as a YAML file (default: msgpack)') pars.add_argument('hiveurl', help='The telepath URL for the remote hive.') pars.add_argument('filepath', help='The local file path to load.') opts = pars.parse_args(argv) if opts.yaml: tree = s_common.yamlload(opts.filepath) else: tree = s_msgpack.loadfile(opts.filepath) path = () if opts.path is not None: path = opts.path.split('/') async with await s_telepath.openurl(opts.hiveurl) as hive: classes = hive.sharinfo.get('classes', ()) try: s_version.reqVersion(hive._getSynVers(), reqver) if 'synapse.lib.hive.HiveApi' in classes: await hive.loadHiveTree(tree, path=path, trim=opts.trim) else: todo = s_common.todo('loadHiveTree', tree, path=path, trim=opts.trim) await hive.dyncall('cell', todo) except s_exc.BadVersion as e: valu = s_version.fmtVersion(*e.get('valu')) outp.printf( f'Hive version {valu} is outside of the hive.load supported range ({reqver}).' ) outp.printf( f'Please use a version of Synapse which supports {valu}; current version is {s_version.verstring}.' ) return 1
async def main(argv, outp=None): if outp is None: # pragma: no cover outp = s_output.OutPut() pars = makeargparser() opts = pars.parse_args(argv) if opts.offset: if len(opts.files) > 1: outp.printf( 'Cannot start from a arbitrary offset for more than 1 file.') return 1 outp.printf( f'Starting from offset [{opts.offset}] - it may take a while' f' to get to that location in the input file.') if opts.test: async with s_cortex.getTempCortex(mods=opts.modules) as prox: await addFeedData(prox, outp, opts.format, opts.debug, chunksize=opts.chunksize, offset=opts.offset, *opts.files) elif opts.cortex: async with await s_telepath.openurl(opts.cortex) as core: try: s_version.reqVersion(core._getSynVers(), reqver) except s_exc.BadVersion as e: valu = s_version.fmtVersion(*e.get('valu')) outp.printf( f'Cortex version {valu} is outside of the feed tool supported range ({reqver}).' ) outp.printf( f'Please use a version of Synapse which supports {valu}; ' f'current version is {s_version.verstring}.') return 1 await addFeedData(core, outp, opts.format, opts.debug, chunksize=opts.chunksize, offset=opts.offset, *opts.files) else: # pragma: no cover outp.printf('No valid options provided [%s]', opts) return 1 return 0
async def _main(argv): # pragma: no cover # Ensure that SYN_DIR is available _ = s_common.getSynDir() async with await s_telepath.openurl(argv[0]) as item: try: s_version.reqVersion(item._getSynVers(), reqver) except s_exc.BadVersion as e: valu = s_version.fmtVersion(*e.get('valu')) print( f'Proxy version {valu} is outside of the cmdr supported range ({reqver}).' ) print( f'Please use a version of Synapse which supports {valu}; current version is {s_version.verstring}.' ) return 1 await runcmdr(argv, item)
async def main(argv, outp=s_output.stdout): pars = argparse.ArgumentParser( prog='synapse.tools.hive.save', description='Save tree data from a remote hive to file.') pars.add_argument('--path', default=None, help='A hive path string to use as the root.') pars.add_argument( '--yaml', default=False, action='store_true', help='Parse the savefile as a YAML file (default: msgpack)') pars.add_argument('hiveurl', help='The telepath URL for the remote hive.') pars.add_argument('filepath', help='The local file path to save.') opts = pars.parse_args(argv) path = () if opts.path is not None: path = opts.path.split('/') async with await s_telepath.openurl(opts.hiveurl) as hive: try: s_version.reqVersion(hive._getSynVers(), reqver) except s_exc.BadVersion as e: valu = s_version.fmtVersion(*e.get('valu')) outp.printf( f'Hive version {valu} is outside of the hive.save supported range ({reqver}).' ) outp.printf( f'Please use a version of Synapse which supports {valu}; current version is {s_version.verstring}.' ) return 1 tree = await hive.saveHiveTree(path=path) if opts.yaml: s_common.yamlsave(tree, opts.filepath) else: s_msgpack.dumpfile(tree, opts.filepath) return 0
async def handleList(opts): try: async with await s_telepath.openurl(opts.cellurl) as cell: s_version.reqVersion(cell._getSynVers(), reqver) if opts.name: user = await cell.getAuthInfo(opts.name[0]) if user is None: outp.printf(f'no such user: {opts.name}') return 1 await printuser(user, cell=cell, details=opts.detail) return 0 outp.printf(f'getting users and roles') outp.printf('users:') for user in await cell.getAuthUsers(): outp.printf(f' {user.get("name")}') outp.printf('roles:') for role in await cell.getAuthRoles(): outp.printf(f' {role.get("name")}') except s_exc.BadVersion as e: valu = s_version.fmtVersion(*e.get('valu')) outp.printf( f'Cell version {valu} is outside of the cellauth supported range ({reqver}).' ) outp.printf( f'Please use a version of Synapse which supports {valu}; current version is {s_version.verstring}.' ) return 1 except (Exception, asyncio.CancelledError) as e: # pragma: no cover if opts.debug: traceback.print_exc() outp.printf(str(e)) return 1 else: return 0
def _runreqtest(self, valu, reqver, exp): if exp is None: self.none(s_version.reqVersion(valu, reqver)) else: with self.raises(exp): s_version.reqVersion(valu, reqver)
async def handleModify(opts): cell_supports_authgate = False if opts.object and not opts.addrule: outp.printf('--object option only valid with --addrule') return -1 try: async with await s_telepath.openurl(opts.cellurl) as cell: async def useriden(name): udef = await cell.getUserDefByName(name) return udef['iden'] async def roleiden(name): rdef = await cell.getRoleDefByName(name) return rdef['iden'] s_version.reqVersion(cell._getSynVers(), reqver) if cell._getSynVers() >= min_authgate_vers: cell_supports_authgate = True if opts.adduser: outp.printf(f'adding user: {opts.name}') user = await cell.addUser(opts.name) if opts.deluser: outp.printf(f'deleting user: {opts.name}') await cell.delUser(await useriden(opts.name)) if opts.addrole: outp.printf(f'adding role: {opts.name}') user = await cell.addRole(opts.name) if opts.delrole: outp.printf(f'deleting role: {opts.name}') await cell.delRole(await roleiden(opts.name)) if opts.passwd: outp.printf(f'setting passwd for: {opts.name}') await cell.setUserPasswd(await useriden(opts.name), opts.passwd) if opts.grant: outp.printf(f'granting {opts.grant} to: {opts.name}') await cell.addUserRole(await useriden(opts.name), await roleiden(opts.grant)) if opts.setroles: outp.printf(f'settings roles {opts.setroles} to: {opts.name}') roles = [await roleiden(role) for role in opts.setroles] await cell.setUserRoles(await useriden(opts.name), roles) if opts.revoke: outp.printf(f'revoking {opts.revoke} from: {opts.name}') await cell.delUserRole(await useriden(opts.name), await roleiden(opts.revoke)) if opts.admin: outp.printf(f'granting admin status: {opts.name}') await cell.setAuthAdmin(opts.name, True) if opts.noadmin: outp.printf(f'revoking admin status: {opts.name}') await cell.setAuthAdmin(opts.name, False) if opts.lock: outp.printf(f'locking user: {opts.name}') await cell.setUserLocked(await useriden(opts.name), True) if opts.unlock: outp.printf(f'unlocking user: {opts.name}') await cell.setUserLocked(await useriden(opts.name), False) if opts.addrule: text = opts.addrule # TODO: syntax for index... allow = True if text.startswith('!'): allow = False text = text[1:] rule = (allow, text.split('.')) outp.printf(f'adding rule to {opts.name}: {rule!r}') if cell_supports_authgate: await cell.addAuthRule(opts.name, rule, indx=None, gateiden=opts.object) else: await cell.addAuthRule(opts.name, rule, indx=None) if opts.delrule is not None: ruleind = opts.delrule outp.printf(f'deleting rule index: {ruleind}') user = await cell.getAuthInfo(opts.name) userrules = user.get('rules', ()) delrule = None delgate = None if ruleind < len(userrules): delrule = userrules[ruleind] else: i = len(userrules) for gateiden, gateinfo in user.get('authgates', {}).items(): for rule in gateinfo.get('rules', ()): if i == ruleind: delrule = rule delgate = gateiden i += 1 if delrule is not None: await cell.delAuthRule(opts.name, delrule, gateiden=delgate) else: outp.printf(f'rule index is out of range') try: user = await cell.getAuthInfo(opts.name) except s_exc.NoSuchName: outp.printf(f'no such user: {opts.name}') return 1 await printuser(user) except s_exc.BadVersion as e: valu = s_version.fmtVersion(*e.get('valu')) outp.printf( f'Cell version {valu} is outside of the cellauth supported range ({reqver}).' ) outp.printf( f'Please use a version of Synapse which supports {valu}; current version is {s_version.verstring}.' ) return 1 except (Exception, asyncio.CancelledError) as e: # pragma: no cover if opts.debug: traceback.print_exc() outp.printf(str(e)) return 1 else: return 0
async def main(argv, outp=s_output.stdout): pars = makeargparser() try: opts = pars.parse_args(argv) except s_exc.ParserExit as e: return e.get('status') with open(opts.stormfile, 'r', encoding='utf8') as fd: text = fd.read() if opts.export: if not opts.cortex: outp.printf('--export requires --cortex') return -1 if len(opts.csvfiles) != 1: outp.printf('--export requires exactly 1 csvfile') return -1 path = s_common.genpath(opts.csvfiles[0]) outp.printf(f'Exporting CSV rows to: {path}') async with await s_telepath.openurl(opts.cortex) as core: try: s_version.reqVersion(core._getSynVers(), reqver) except s_exc.BadVersion as e: valu = s_version.fmtVersion(*e.get('valu')) outp.printf( f'Cortex version {valu} is outside of the csvtool supported range ({reqver}).' ) outp.printf( f'Please use a version of Synapse which supports {valu}; ' f'current version is {s_version.verstring}.') return 1 with open(path, 'w') as fd: wcsv = csv.writer(fd) # prevent streaming nodes by limiting shown events opts = {'show': ('csv:row', 'print', 'warn', 'err')} count = 0 async for name, info in core.storm(text, opts=opts): if name == 'csv:row': count += 1 wcsv.writerow(info['row']) continue if name in ('init', 'fini'): continue outp.printf('%s: %r' % (name, info)) outp.printf(f'exported {count} csv rows.') return def iterrows(): for path in opts.csvfiles: with open(path, 'r', encoding='utf8') as fd: if opts.csv_header: fd.readline() def genr(): for row in csv.reader(fd): yield row for rows in s_common.chunks(genr(), 1000): yield rows rowgenr = iterrows() logfd = None if opts.logfile is not None: logfd = s_common.genfile(opts.logfile) logfd.seek(0, 2) async def addCsvData(core): nodecount = 0 for rows in rowgenr: stormopts = { 'vars': { 'rows': rows }, 'editformat': 'splices', } async for mesg in core.storm(text, opts=stormopts): if mesg[0] == 'node': nodecount += 1 elif mesg[0] == 'err' and not opts.debug: outp.printf(repr(mesg)) elif mesg[0] == 'print': outp.printf(mesg[1].get('mesg')) if opts.debug: outp.printf(repr(mesg)) if logfd is not None: byts = json.dumps(mesg).encode('utf8') logfd.write(byts + b'\n') if opts.cli: await s_cmdr.runItemCmdr(core, outp, True) return nodecount if opts.test: async with s_cortex.getTempCortex() as core: nodecount = await addCsvData(core) else: async with await s_telepath.openurl(opts.cortex) as core: try: s_version.reqVersion(core._getSynVers(), reqver) except s_exc.BadVersion as e: valu = s_version.fmtVersion(*e.get('valu')) outp.printf( f'Cortex version {valu} is outside of the csvtool supported range ({reqver}).' ) outp.printf( f'Please use a version of Synapse which supports {valu}; ' f'current version is {s_version.verstring}.') return 1 nodecount = await addCsvData(core) if logfd is not None: logfd.close() outp.printf('%d nodes.' % (nodecount, )) return 0
async def handleModify(opts): cell_supports_authgate = False if opts.object and not opts.addrule: outp.printf('--object option only valid with --addrule') return -1 try: async with await s_telepath.openurl(opts.cellurl) as cell: s_version.reqVersion(cell._getSynVers(), reqver) if cell._getSynVers() >= min_authgate_vers: cell_supports_authgate = True if opts.adduser: outp.printf(f'adding user: {opts.name}') user = await cell.addAuthUser(opts.name) if opts.deluser: outp.printf(f'deleting user: {opts.name}') await cell.delAuthUser(opts.name) if opts.addrole: outp.printf(f'adding role: {opts.name}') user = await cell.addAuthRole(opts.name) if opts.delrole: outp.printf(f'deleting role: {opts.name}') await cell.delAuthRole(opts.name) if opts.passwd: outp.printf(f'setting passwd for: {opts.name}') await cell.setUserPasswd(opts.name, opts.passwd) if opts.grant: outp.printf(f'granting {opts.grant} to: {opts.name}') await cell.addUserRole(opts.name, opts.grant) if opts.revoke: outp.printf(f'revoking {opts.revoke} from: {opts.name}') await cell.delUserRole(opts.name, opts.revoke) if opts.admin: outp.printf(f'granting admin status: {opts.name}') await cell.setAuthAdmin(opts.name, True) if opts.noadmin: outp.printf(f'revoking admin status: {opts.name}') await cell.setAuthAdmin(opts.name, False) if opts.lock: outp.printf(f'locking user: {opts.name}') await cell.setUserLocked(opts.name, True) if opts.unlock: outp.printf(f'unlocking user: {opts.name}') await cell.setUserLocked(opts.name, False) if opts.addrule: text = opts.addrule # TODO: syntax for index... allow = True if text.startswith('!'): allow = False text = text[1:] rule = (allow, text.split('.')) outp.printf(f'adding rule to {opts.name}: {rule!r}') if cell_supports_authgate: await cell.addAuthRule(opts.name, rule, indx=None, gateiden=opts.object) else: await cell.addAuthRule(opts.name, rule, indx=None) if opts.delrule is not None: outp.printf(f'deleting rule index: {opts.delrule}') user = await cell.getAuthInfo(opts.name) rule = user.get('rules')[opts.delrule] await cell.delAuthRule(opts.name, rule) try: user = await cell.getAuthInfo(opts.name) except s_exc.NoSuchName: outp.printf(f'no such user: {opts.name}') return 1 await printuser(user) except s_exc.BadVersion as e: valu = s_version.fmtVersion(*e.get('valu')) outp.printf( f'Cell version {valu} is outside of the cellauth supported range ({reqver}).' ) outp.printf( f'Please use a version of Synapse which supports {valu}; current version is {s_version.verstring}.' ) return 1 except Exception as e: # pragma: no cover if opts.debug: traceback.print_exc() outp.printf(str(e)) return 1 else: return 0