Example #1
0
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
Example #2
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
Example #3
0
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
Example #4
0
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
Example #5
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)
Example #6
0
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
Example #7
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 test_version_fmt(self):

        s = s_version.fmtVersion(1)
        self.eq(s, '1')

        s = s_version.fmtVersion(1, 2)
        self.eq(s, '1.2')

        s = s_version.fmtVersion(1, 2, 3)
        self.eq(s, '1.2.3')

        s = s_version.fmtVersion(1, 2, 3)
        self.eq(s, '1.2.3')

        s = s_version.fmtVersion(1, 2, 3, 'b5cd5743f')
        self.eq(s, '1.2.3.b5cd5743f')

        s = s_version.fmtVersion(1, 2, 3, 'B5CD5743F')
        self.eq(s, '1.2.3.b5cd5743f')

        s = s_version.fmtVersion(2016, 2, 'sp3', 'RC1')
        self.eq(s, '2016.2.sp3.rc1')

        self.raises(s_exc.BadTypeValu, s_version.fmtVersion)
Example #9
0
    def test_version_fmt(self):

        s = s_version.fmtVersion(1)
        self.eq(s, '1')

        s = s_version.fmtVersion(1, 2)
        self.eq(s, '1.2')

        s = s_version.fmtVersion(1, 2, 3)
        self.eq(s, '1.2.3')

        s = s_version.fmtVersion(1, 2, 3)
        self.eq(s, '1.2.3')

        s = s_version.fmtVersion(1, 2, 3, 'b5cd5743f')
        self.eq(s, '1.2.3.b5cd5743f')

        s = s_version.fmtVersion(1, 2, 3, 'B5CD5743F')
        self.eq(s, '1.2.3.b5cd5743f')

        s = s_version.fmtVersion(2016, 2, 'sp3', 'RC1')
        self.eq(s, '2016.2.sp3.rc1')

        self.raises(s_exc.BadTypeValu, s_version.fmtVersion)
Example #10
0
 def repr(self, valu):
     major, minor, patch = s_version.unpackVersion(valu)
     valu = s_version.fmtVersion(major, minor, patch)
     return valu
Example #11
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:

            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
Example #12
0
 def repr(self, valu, defval=None):
     major, minor, patch = s_version.unpackVersion(valu)
     valu = s_version.fmtVersion(major, minor, patch)
     return valu
Example #13
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
Example #14
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