diff options
author | Alejandro Sirgo Rica <asirgo@soleta.eu> | 2024-11-26 11:26:22 +0100 |
---|---|---|
committer | Alejandro Sirgo Rica <asirgo@soleta.eu> | 2024-11-27 14:45:34 +0100 |
commit | 76fe1b775a2fdad4ee7b8d04f2a71778f693d8e4 (patch) | |
tree | f9dbe020973ad8f242c57231d5861a05c76733bc /ogcp/views.py | |
parent | 92ab31650c60163607ea5b00c57a7b223ef49bd4 (diff) |
views: add direct cmd execution view
Reorganize "Run" section of Commands view as follows:
Commands
└── Run
├── Script: run script from folder
├── Cmd: direct command execution
└── Display output: results of last execution
Adapt API REST call to the new interface. Remove strange legacy
;|\n\r terminator. Remove "echo" field and add "inline" field.
Diffstat (limited to 'ogcp/views.py')
-rw-r--r-- | ogcp/views.py | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/ogcp/views.py b/ogcp/views.py index d6fc67c..a583dfa 100644 --- a/ogcp/views.py +++ b/ogcp/views.py @@ -15,7 +15,7 @@ from ogcp.forms.action_forms import ( GenericForm, SelectClientForm, ImageUpdateForm, ImportClientsForm, ServerForm, DeleteRepositoryForm, RepoForm, FolderForm, CacheForm, ClientMoveForm, RunScriptForm, ImageConfigForm, ImageFetchForm, - ServerConfigurationForm, SetRepoForm + ServerConfigurationForm, SetRepoForm, RunCmdForm ) from flask_login import ( current_user, LoginManager, @@ -2218,6 +2218,42 @@ def action_client_delete(): else: return redirect(url_for('scopes')) +@app.route('/action/cmd/run', methods=['GET', 'POST']) +@login_required +def action_run_cmd(): + form = RunCmdForm(request.form) + if request.method == 'POST': + ips = form.ips.data.split(' ') + if not validate_elements(ips): + return redirect(url_for('commands')) + + payload = { + 'clients': ips, + 'run': form.command.data, + 'inline': True + } + server = get_server_from_clients(ips) + r = server.post('/shell/run', payload) + + if not r: + return ogserver_down('commands') + if r.status_code != requests.codes.ok: + return ogserver_error('commands') + + flash(_('Command sent successfully'), category='info') + return redirect(url_for('commands')) + else: + ips = parse_elements(request.args.to_dict()) + form.ips.data = " ".join(ips) + if not validate_elements(ips): + return redirect(url_for('commands')) + + scopes, clients = get_scopes(set(ips)) + selected_clients = list(get_selected_clients(scopes['scope']).items()) + return render_template('actions/script_run.html', form=form, + selected_clients=selected_clients, + scopes=scopes) + @app.route('/action/script/run', methods=['GET', 'POST']) @login_required def action_run_script(): @@ -2232,8 +2268,8 @@ def action_run_script(): payload = { 'clients': ips, - 'run': ';|\n\r'.join(cmd_elems), - 'echo': True + 'run': ' '.join(cmd_elems), + 'inline': False } server = get_server_from_clients(ips) r = server.post('/shell/run', payload) |