Exemple #1
0
def logfed_list():
    kwargs = {}
    resp = ntwrk.get('api_1_0.loglist',
                     view_data={'params': 'human'},
                     **kwargs)
    dprint(resp.msg if resp.code else str(resp.exception)
           if str(resp.exception) else resp.exception.__class__.__name__)
Exemple #2
0
def action_list(ident=None,
                name=None,
                version=None,
                like: str = None,
                last: int = None):
    kwargs = {}
    view_data = dict()
    if ident:
        view_data.update({'filter[id]': ident})
    if name:
        view_data.update({'filter[name]': name})
    if version:
        view_data.update({'filter[version]': version})
    view_data.update(params='split_lines')
    resp = ntwrk.get('api_1_0.actiontemplatelist',
                     view_data=view_data,
                     **kwargs)
    if resp.code == 200:
        data = resp.msg or []
        # post process
        filtered_data = []
        if like:
            for server in data:
                if like in server.get('name'):
                    filtered_data.append(server)
        else:
            filtered_data = data
        dprint(filtered_data)
    else:
        dprint(resp)
Exemple #3
0
def logfed_subscribe(src_server_id,
                     target,
                     dst_server_id,
                     include=None,
                     exclude=None,
                     dest_folder=None,
                     recursive=None,
                     mode=None):
    if not is_valid_uuid(src_server_id):
        _src_server_id = name2id('api_1_0.serverlist', src_server_id)
    else:
        _src_server_id = src_server_id
    if not is_valid_uuid(dst_server_id):
        _dst_server_id = name2id('api_1_0.serverlist', dst_server_id)
    else:
        _dst_server_id = dst_server_id
    kwargs = {}
    json_data = dict(src_server_id=_src_server_id,
                     target=target,
                     dst_server_id=_dst_server_id,
                     include=include,
                     exclude=exclude,
                     dest_folder=dest_folder,
                     recursive=recursive,
                     mode=mode)
    json_data = clean_none(json_data)
    resp = ntwrk.post('api_1_0.loglist', json=json_data, **kwargs)
    dprint(resp)
Exemple #4
0
def software_add(name, version, file, family=None):
    kwargs = {}
    json_data = dict(name=name, version=version, file=file)
    if family is not None:
        json_data.update(family=family)
    resp = ntwrk.post(view='api_1_0.softwarelist', json=json_data, **kwargs)
    dprint(resp)
Exemple #5
0
def orch_load(file):
    try:
        orch = json.load(file)
    except Exception as e:
        dprint(e)
    else:
        orch_prompt(orch, parent_prompt='Δ ')
Exemple #6
0
def server_routes(node, refresh=False):
    resp = None
    if not node:
        node = ['localhost']
    for n in node:
        dprint(f"### {n}:") if len(node) > 1 else None
        if n == 'localhost':
            node_id = None
        else:
            node_id = normalize2id(n)

        kwargs = {}
        if node_id:
            kwargs.update(headers={'D-Destination': node_id})

        if refresh:
            resp = ntwrk.post('api_1_0.routes',
                              json={
                                  "discover_new_neighbours": True,
                                  "check_current_neighbours": True
                              },
                              **kwargs)
        else:
            resp = ntwrk.get('api_1_0.routes',
                             view_data={'params': 'human'},
                             **kwargs)
        dprint(resp)
Exemple #7
0
def sync_add_file(server: str,
                  file: str,
                  destinations: t.List,
                  dest_folder: str = None):
    server_id = normalize2id(server)
    json_data = {
        'src_server_id': server_id,
        'target': file,
        'destinations': []
    }
    if dest_folder:
        json_data.update(dest_folder=dest_folder)
    for dest in destinations:
        if ':' in dest:
            server, d_folder = dest.split(':', 1)
        else:
            server, d_folder = dest, None
        s_id = normalize2id(server)
        aux = {'dst_server_id': s_id}
        if d_folder:
            aux.update(dest_folder=d_folder)
        json_data['destinations'].append(aux)

    resp = ntwrk.post('api_1_0.filelist', json=json_data)
    dprint(resp)
Exemple #8
0
def call_func_with_signature(namespace):
    func = namespace.__dict__.pop('func')
    sig = inspect.signature(func)
    args = []
    kwargs = {}
    arg_sig = False
    kw_sig = False

    for param in sig.parameters.values():
        if param.kind == param.POSITIONAL_ONLY or (
                param.kind == param.POSITIONAL_OR_KEYWORD
                and param.default == param.empty):
            args.append(getattr(namespace, param.name, None))
        elif param.kind in (param.POSITIONAL_OR_KEYWORD, param.KEYWORD_ONLY):
            kwargs.update({param.name: getattr(namespace, param.name, None)})
        elif param.kind == param.VAR_POSITIONAL:
            arg_sig = True
        elif param.kind == param.VAR_KEYWORD:
            kw_sig = True

    if arg_sig and not kw_sig:
        arg_sig = list(args.__dict__.values())
        kw_sig = {}
    elif not arg_sig and kw_sig:
        arg_sig = []
        kw_sig = args.__dict__
    else:
        arg_sig = []
        kw_sig = {}
    args = args + arg_sig
    try:
        func(*args, **{**kwargs, **kw_sig})
    except Exception as e:
        dprint(e)
Exemple #9
0
def manager_locker_ignore(ignore: bool, nodes):
    server_ids = [normalize2id(n) for n in nodes]
    resp = ntwrk.post('api_1_0.manager_server_ignore_lock',
                      json={
                          'server_ids': server_ids,
                          'ignore_on_lock': ignore
                      })
    dprint(resp)
Exemple #10
0
def gate_list(dm: Dimensigon):
    dm.create_flask_instance()
    with dm.flask_app.app_context():
        dprint([
            f"{g.ip or g.dns}:{g.port}{' (hidden)' if g.hidden else ''}"
            for g in Gate.query.filter_by(
                server_id=Server.get_current().id).all()
        ])
Exemple #11
0
def transfer_cancel(transfer_id):
    kwargs = {}
    data = {'status': 'CANCELLED'}
    resp = ntwrk.patch('api_1_0.transferresource',
                       view_data={'transfer_id': transfer_id},
                       json=data,
                       **kwargs)
    dprint(resp)
Exemple #12
0
def ping(node):
    for n in node:
        dprint(f"### {n}:") if len(node) > 1 else None
        node_id = normalize2id(n)
        resp = ntwrk.post(
            'root.ping',
            headers={'D-Destination': node_id},
            json={'start_time': get_now().strftime(defaults.DATETIME_FORMAT)})
        dprint(resp)
Exemple #13
0
def env_set(key, value):
    if isinstance(value, list) and len(value) == 0:
        if '=' in key:
            key, value = key.split('=')
            environ.set(key, value)
        else:
            dprint('invalid value')
    else:
        environ.set(key, ' '.join(value))
Exemple #14
0
def sync_delete_destination(file_id: str, destinations: t.List):
    json_data = []
    for dest in destinations:
        s_id = normalize2id(dest)
        aux = {'dst_server_id': s_id}
        json_data.append(aux)
    resp = ntwrk.delete('api_1_0.fileserverassociationlist',
                        view_data={'file_id': file_id},
                        json=json_data)
    dprint(resp)
Exemple #15
0
def main(args):
    argv = docopt(__doc__, args)

    try:
        argv = action_template_schema.validate(argv)
    except SchemaError as e:
        exit(str(e))
    if argv['list']:
        action_list(ident=argv['--id'],
                    name=argv['--name'],
                    version=argv['--version'],
                    like=argv['--like'],
                    last=argv['--last'])
    elif argv['create']:
        if argv['-']:
            content = sys.stdin.read()
            part = json.loads(content)
            data = part if isinstance(part, list) else [part]
        elif argv['FILE']:
            data = []
            content = argv['FILE'].read()
            part = json.loads(content)
            data.extend(part) if isinstance(part, list) else data.append(part)
        else:
            if argv['--schema']:
                if os.path.isfile(argv['--schema']):
                    try:
                        content = open(argv['--schema'], 'r').read()
                        schema = yaml.load(content, Loader=yaml.SafeLoader)
                    except Exception as e:
                        exit(
                            f"Error while trying to load yaml file. Exception {e}"
                        )
                else:
                    schema = argv['--schema']
            data = {
                'name': argv['NAME'],
                'version': argv['--version'],
                'action_type': argv['ACTION_TYPE'],
                'code': argv['--code'],
                'schema': schema,
                'expected_stdout': argv['--expected-stdout'],
                'expected_stderr': argv['--expected-stderr'],
                'expected_rc': argv['--expected-rc'],
                'system_kwargs': argv['--system-kwargs'],
                'pre_process': argv['--pre-process'],
                'post_process': argv['--post-process']
            }
            data = clean_none(data)
        dprint(data)
        if data:
            resp = ntwrk.post(f'api_1_0.actiontemplatelist', json=data)
            dprint(resp)
        else:
            exit("No data found to create action template")
Exemple #16
0
def interactive():
    session = PromptSession(
        completer=DshellCompleter.from_nested_dict(nested_dict),
        history=get_history('main', InMemoryHistory()),
        clipboard=PyperclipClipboard(),
        enable_history_search=True,
        enable_suspend=True)

    parser = ArgumentParserRaise(allow_abbrev=False, prog='')
    parser = create_parser(nested_dict, parser)
    while True:
        message = [
            ('class:username', env._username if env._username else "?"),
            ('class:at', '@'),
            ('class:host', env.get("SERVER") if env.get("SERVER") else "?"),
            ('', ':'),
            ('class:path', 'dshell'),
            ('', '> '),
        ]
        try:
            text = session.prompt(message, style=style)
        except KeyboardInterrupt:
            continue  # Control-C pressed. Try again.
        except EOFError:
            exit_dshell()

        if text.startswith('!'):
            subprocess.call(text.lstrip('!'), shell=True)
        else:
            try:
                namespace = parser.parse_args(shlex.split(text))
            except (ValueError, argparse.ArgumentError) as e:
                dprint(e)
                continue
            except SystemExit:
                continue
            except Exception as e:
                dprint(e)
                continue
            else:
                cmd_params = vars(namespace)

            if not text:
                continue
            elif text == 'help':
                parser.print_usage()
            elif text and len(cmd_params) == 0:
                try:
                    parser.parse_args(shlex.split(text) + ['-h'])
                except SystemExit:
                    continue
            else:
                call_func_with_signature(cmd_params)
Exemple #17
0
def manager_locker_unlock(scope, node):
    for n in node:
        dprint(f"### {n}:") if len(node) > 1 else None
        node_id = normalize2id(n)
        resp = ntwrk.post('api_1_0.locker_unlock',
                          json={
                              'scope': scope,
                              'applicant': "",
                              'force': True
                          },
                          headers={'D-Destination': node_id})
        dprint(resp)
Exemple #18
0
def sync_list(ident, source_server, detail):
    kwargs = {}
    view_data = dict()
    if ident:
        view_data.update({'filter[id]': ident})
    if source_server:
        view_data.update(
            {'filter[src_server_id]': normalize2id(source_server)})
    if detail:
        view_data.update({'params': ['destinations', 'human']})
    else:
        view_data.update({'params': ['human']})
    resp = ntwrk.get('api_1_0.filelist', view_data=view_data, **kwargs)
    dprint(resp)
Exemple #19
0
def sync_add_destination(file_id: str, destinations: t.List):
    json_data = []
    for dest in destinations:
        if ':' in dest:
            server, d_folder = dest.split(':', 1)
        else:
            server, d_folder = dest, None
        s_id = normalize2id(server)
        aux = {'dst_server_id': s_id}
        if d_folder:
            aux.update(dest_folder=d_folder)
        json_data.append(aux)
    resp = ntwrk.post('api_1_0.fileserverassociationlist',
                      view_data={'file_id': file_id},
                      json=json_data)
    dprint(resp)
Exemple #20
0
def login(username=None, password=None, save=False):
    try:
        ntwrk.login(username, password)
    except requests.exceptions.ConnectionError as e:
        dprint(
            f"Unable to contact with {environ.get('SCHEME')}://{environ.get('SERVER')}:{environ.get('PORT')}/"
        )
    except Exception as e:
        dprint(str(e))
    else:
        if save:
            save_config_file(os.path.expanduser(env.get('CONFIG_FILE', None)),
                             username=env._username,
                             token=env._refresh_token,
                             server=env.get('SERVER'),
                             port=env.get('PORT'))
Exemple #21
0
def orch_copy(**params):
    resp = ntwrk.get('api_1_0.orchestrationresource',
                     view_data={
                         'orchestration_id': params.get('orchestration_id'),
                         'param': 'split_lines'
                     })

    if resp.ok:
        orch = resp.msg
        orch.pop('target', None)
        orch.pop('params', None)
        orch.pop('id', None)
        orch.pop('version', None)
        orch.pop('last_modified_at', None)
        resp = ntwrk.get('api_1_0.steplist',
                         view_data={
                             'filter[orchestration_id]':
                             params.get('orchestration_id'),
                             'params':
                             'split_lines'
                         })
        if resp.ok:
            orch['steps'] = resp.msg

            id2human = {}
            for s in orch['steps']:
                id2human[s.get('id')] = str(len(id2human) + 1)

            # remove unwanted parameters
            for s in orch['steps']:
                s.pop('last_modified_at', None)
                s.pop('created_on', None)
                s.pop('orchestration_id', None)
                s['id'] = id2human[s['id']]
                s['parent_step_ids'] = [
                    id2human[ps] for ps in s['parent_step_ids']
                ]

            orch_prompt(entity=orch, parent_prompt='Δ ')
        else:
            dprint(resp)
    else:
        dprint(resp)
Exemple #22
0
def cmd(command, target, timeout=None, input=None, shell=None):
    if shell:
        command_prompt({'target': target},
                       ask_all=False if target else True,
                       parent_prompt='Δ')
    else:
        if isinstance(command, list):
            command = ' '.join(command)
        if not command:
            raise ValueError('a command must be specified')
        if not target:
            raise ValueError('target must be specified')
        data = {'command': command, 'target': target}
        if timeout:
            data.update(timeout=timeout)
        if input:
            data.update(input=input.replace('\\n', '\n').replace('\\t', '\t'))
        resp = ntwrk.post('api_1_0.launch_command',
                          view_data={'params': 'human'},
                          json=data)
        dprint(resp)
Exemple #23
0
def orch_list(ident=None,
              name=None,
              version=None,
              detail=False,
              like=None,
              schema=False):
    kwargs = {}
    view_data = dict()
    if ident is not None:
        view_data.update({'filter[id]': ident})
    if name is not None:
        view_data.update({'filter[name]': name})
    if version is not None:
        view_data.update({'filter[version]': str(version)})
    if detail:
        view_data.update({
            'params':
            ['steps', 'vars', 'target', 'action', 'human', 'split_lines']
        })
    else:
        view_data.update(
            {'params': ['vars', 'target', 'human', 'split_lines']})
    if schema:
        view_data['params'].append('schema')
    resp = ntwrk.get('api_1_0.orchestrationlist',
                     view_data=view_data,
                     **kwargs)
    if resp.code == 200:
        data = resp.msg or []
        # post process
        filtered_data = []
        if like is not None:
            for server in data:
                if like in server.get('name'):
                    filtered_data.append(server)
        else:
            filtered_data = data
        dprint(filtered_data)
    else:
        dprint(resp)
Exemple #24
0
def transfer_list(iden=None, status=None, like=None, last=None):
    kwargs = {}
    view_data = dict()
    if iden:
        view_data.update({'filter[id]': iden})
    if status:
        view_data.update({'filter[status]': ','.join(status)})
    resp = ntwrk.get('api_1_0.transferlist', view_data=view_data, **kwargs)
    if resp.ok:
        data = resp.msg or []
        # post process
        filtered_data = []
        if like:
            for server in data:
                if like in server.get('name'):
                    filtered_data.append(server)
        else:
            filtered_data = data
        assert last is None or last > 0, f"Invalid value '{last}'"
        if last is not None and last > 0:
            dprint(filtered_data[-last:])
        else:
            dprint(filtered_data)
    else:
        dprint(resp)
Exemple #25
0
def server_list(name=None, ident=None, detail=None, like=None):
    kwargs = {}
    view_data = dict()
    if name is not None:
        view_data.update({'filter[name]': name})
    if ident:
        view_data.update({'filter[id]': ident})
    if detail:
        view_data.update(params='gates')
    resp = ntwrk.get('api_1_0.serverlist', view_data=view_data, **kwargs)
    if resp.code == 200:
        data = resp.msg or []
        # post process
        filtered_data = []
        if like:
            for server in data:
                if like in server.get('name'):
                    filtered_data.append(server)
        else:
            filtered_data = data
        dprint(filtered_data)
    else:
        dprint(resp)
Exemple #26
0
def orch_run(orchestration_id,
             target,
             params=None,
             background=False,
             scope=None,
             skip_validation=False):
    data = {}
    data.update(hosts=target, params=params, background=background)
    if scope:
        data.update(scope=scope)
    if skip_validation:
        data.update(skip_validation=skip_validation)

    if not target:
        dprint('No target specified')
    else:
        resp = ntwrk.post('api_1_0.launch_orchestration',
                          view_data={
                              'orchestration_id': orchestration_id,
                              'params': 'human'
                          },
                          json=data)
        dprint(resp)
Exemple #27
0
def software_list(name=None, version=None, detail=None, like=None):
    kwargs = {}
    view_data = dict()
    if name:
        view_data.update({'filter[name]': name})
    if version:
        view_data.update({'filter[version]': version})
    if detail:
        view_data.update(params='servers')
    resp = ntwrk.get('api_1_0.softwarelist', view_data=view_data, **kwargs)
    if resp.ok:
        data = resp.msg or []
        # post process
        filtered_data = []
        if like:
            for server in data:
                if like in server.get('name'):
                    filtered_data.append(server)
        else:
            filtered_data = data
        dprint(filtered_data)
    else:
        dprint(resp)
Exemple #28
0
def software_send(dest_server_id,
                  software_id=None,
                  software=None,
                  version=None,
                  file=None,
                  dest_path=None,
                  background=True,
                  force=False):
    kwargs = {}
    json_data = dict(dest_server_id=dest_server_id, force=force)
    if software_id:
        json_data.update(software_id=software_id)
    elif file:
        json_data.update(file=file)
    else:
        json_data.update(software=software, version=version)
    if dest_path is not None:
        json_data.update(dest_path=dest_path)

    json_data.update(background=background)
    if not background:
        json_data.update(include_transfer_data=True)
    resp = ntwrk.post('api_1_0.send', json=json_data, **kwargs)
    dprint(resp)
Exemple #29
0
def vault_list(scopes, scope='global'):
    if scopes:
        resp = ntwrk.get('api_1_0.vaultlist', dict(params='scopes'))
        dprint(resp)
    else:
        resp = ntwrk.get('api_1_0.vaultlist', {"filter[scope]": scope})
        if resp.ok:
            dprint({d['name']: d['value'] for d in resp.msg})
        else:
            dprint(resp)
Exemple #30
0
def manager_token(raw=False, expires_time=None):
    resp = ntwrk.get('api_1_0.join_token',
                     view_data=dict(expires_time=expires_time))
    if not raw:
        dprint(resp)
    else:
        if resp.ok:
            dprint(resp.msg['token'])
        else:
            dprint(resp)