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__)
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)
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)
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)
def orch_load(file): try: orch = json.load(file) except Exception as e: dprint(e) else: orch_prompt(orch, parent_prompt='Δ ')
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)
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)
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)
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)
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() ])
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)
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)
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))
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)
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")
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)
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)
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)
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)
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'))
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)