mirror of https://git.48k.eu/ogcp
Add WoL action
This action can be applied on one or multiple scopes. This implementation use Flask-WTF as a way to build and valdiate forms. As a side effect, this adds CSRF protection to all forms.multi-ogserver
parent
73a6e07b83
commit
d5eaf699a7
|
@ -1,6 +1,14 @@
|
|||
from flask_wtf.csrf import CSRFProtect
|
||||
from flask_bootstrap import Bootstrap
|
||||
from flask_babel import Babel
|
||||
from flask import Flask
|
||||
from os import urandom
|
||||
|
||||
app = Flask(__name__)
|
||||
babel = Babel(app)
|
||||
csrf = CSRFProtect(app)
|
||||
bootstrap = Bootstrap(app)
|
||||
|
||||
app.secret_key = urandom(16)
|
||||
|
||||
import ogcp.views
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
from wtforms import Form, SubmitField, HiddenField, SelectField
|
||||
from flask_wtf import FlaskForm
|
||||
from flask_babel import _
|
||||
|
||||
class WOLForm(FlaskForm):
|
||||
ips = HiddenField()
|
||||
wol_type = SelectField(label=_('Type'),
|
||||
choices=[('broadcast', 'Broadcast'),
|
||||
('unicast', 'Unicast')])
|
||||
submit = SubmitField(label=_('Submit'))
|
|
@ -0,0 +1,11 @@
|
|||
{% extends 'base.html' %}
|
||||
{% import "bootstrap/wtf.html" as wtf %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{{ wtf.quick_form(form,
|
||||
action=url_for('action_wol'),
|
||||
method='post',
|
||||
button_map={'submit': 'primary'}) }}
|
||||
|
||||
{% endblock %}
|
|
@ -21,7 +21,8 @@
|
|||
|
||||
{% block content %}
|
||||
|
||||
<form method="post">
|
||||
<form>
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
|
||||
{{ print_scopes_tree(scopes["scope"]) }}
|
||||
|
||||
<div class="dropdown">
|
||||
|
@ -31,10 +32,12 @@
|
|||
{{ _('Actions') }}
|
||||
</button>
|
||||
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
|
||||
<input class="dropdown-item" type="submit" value="{{ _('Run') }}"
|
||||
formaction="{{ url_for('action_wol') }}" formmethod="get">
|
||||
<input class="dropdown-item" type="submit" value="{{ _('Poweroff') }}"
|
||||
formaction="{{ url_for('action_poweroff') }}">
|
||||
formaction="{{ url_for('action_poweroff') }}" formmethod="post">
|
||||
<input class="dropdown-item" type="submit" value="{{ _('Reboot') }}"
|
||||
formaction="{{ url_for('action_reboot') }}">
|
||||
formaction="{{ url_for('action_reboot') }}" formmethod="post">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from flask import g, render_template, url_for, request, jsonify, make_response
|
||||
from ogcp.forms.action_forms import WOLForm
|
||||
from ogcp.og_server import OGServer
|
||||
from flask_babel import _
|
||||
from ogcp import app
|
||||
|
@ -49,6 +50,20 @@ def action_poweroff():
|
|||
g.server.post('/poweroff', payload)
|
||||
return make_response("200 OK", 200)
|
||||
|
||||
@app.route('/action/wol', methods=['GET', 'POST'])
|
||||
def action_wol():
|
||||
form = WOLForm(request.form)
|
||||
if request.method == 'POST' and form.validate():
|
||||
wol_type = form.wol_type.data
|
||||
ips = parse_ips(request.form.to_dict())
|
||||
payload = {'type': wol_type, 'clients': list(ips)}
|
||||
g.server.post('/wol', payload)
|
||||
return make_response("200 OK", 200)
|
||||
else:
|
||||
ips = parse_ips(request.args.to_dict())
|
||||
form.ips.data = " ".join(ips)
|
||||
return render_template('actions/wol.html', form=form)
|
||||
|
||||
@app.route('/action/reboot', methods=['POST'])
|
||||
def action_reboot():
|
||||
ips = parse_ips(request.form.to_dict())
|
||||
|
|
|
@ -2,8 +2,11 @@ Babel==2.8.0
|
|||
certifi==2020.6.20
|
||||
chardet==3.0.4
|
||||
click==7.1.2
|
||||
dominate==2.5.2
|
||||
Flask==1.1.2
|
||||
Flask-Babel==2.0.0
|
||||
Flask-Bootstrap==3.3.7.1
|
||||
Flask-WTF==0.14.3
|
||||
idna==2.10
|
||||
itsdangerous==1.1.0
|
||||
Jinja2==2.11.2
|
||||
|
@ -11,4 +14,6 @@ MarkupSafe==1.1.1
|
|||
pytz==2020.1
|
||||
requests==2.24.0
|
||||
urllib3==1.25.10
|
||||
visitor==0.1.3
|
||||
Werkzeug==1.0.1
|
||||
WTForms==2.3.3
|
||||
|
|
Loading…
Reference in New Issue