summaryrefslogtreecommitdiffstats
path: root/ogcp/views.py
diff options
context:
space:
mode:
authorAlejandro Sirgo Rica <asirgo@soleta.eu>2024-11-26 11:26:22 +0100
committerAlejandro Sirgo Rica <asirgo@soleta.eu>2024-11-27 14:45:34 +0100
commit76fe1b775a2fdad4ee7b8d04f2a71778f693d8e4 (patch)
treef9dbe020973ad8f242c57231d5861a05c76733bc /ogcp/views.py
parent92ab31650c60163607ea5b00c57a7b223ef49bd4 (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.py42
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)