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.
master
Alejandro Sirgo Rica 2024-11-26 11:26:22 +01:00
parent 92ab31650c
commit 76fe1b775a
3 changed files with 48 additions and 5 deletions

View File

@ -172,6 +172,11 @@ class RunScriptForm(FlaskForm):
arguments = StringField(label=_l('Arguments'))
submit = SubmitField(label=_l('Submit'))
class RunCmdForm(FlaskForm):
ips = HiddenField()
command = StringField(label=_l('Command'))
submit = SubmitField(label=_l('Submit'))
class ImportClientsForm(FlaskForm):
server = HiddenField()
room = SelectField(label=_l('Room'))

View File

@ -97,11 +97,13 @@
<div class="dropdown btn">
<button class="btn btn-secondary btn-light dropdown-toggle{% block nav_script %}{% endblock %}" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-expanded="false">
{{ _('Script') }}
{{ _('Run') }}
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<input class="btn btn-light dropdown-item{% block nav_run_script %}{% endblock %}" type="submit" value="{{ _('Run') }}"
<input class="btn btn-light dropdown-item{% block nav_run_script %}{% endblock %}" type="submit" value="{{ _('Script') }}"
form="scopesForm" formaction="{{ url_for('action_run_script') }}" formmethod="get">
<input class="btn btn-light dropdown-item{% block nav_run_cmd %}{% endblock %}" type="submit" value="{{ _('Cmd') }}"
form="scopesForm" formaction="{{ url_for('action_run_cmd') }}" formmethod="get">
<input class="btn btn-light dropdown-item{% block nav_display_output %}{% endblock %}" type="submit" value="{{ _('Display output') }}"
form="scopesForm" formaction="{{ url_for('action_script_display_output') }}" formmethod="get">
</div>

View File

@ -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)