diff --git a/server.py b/server.py index 996e137..623c157 100755 --- a/server.py +++ b/server.py @@ -1,5 +1,6 @@ #!/usr/bin/python3 +import time import flask import json import argparse @@ -7,6 +8,12 @@ import os import datetime import pytimeparse.timeparse as timeparse import sys +import secrets + +import flask_wtf +from flask_wtf import FlaskForm, CSRFProtect +from wtforms import StringField, SubmitField, BooleanField, DecimalField +from wtforms.validators import DataRequired, Length from sqlalchemy import Column, Integer, String, Boolean, or_, and_ from sqlalchemy.orm import sessionmaker @@ -17,6 +24,9 @@ from flask_sqlalchemy import SQLAlchemy from sqlalchemy.sql.expression import func app = flask.Flask("Icinga Report In Gateway") +CSRFProtect(app) + + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.sqlite' app.config['JSON_CONFIG_FILE'] = 'services.json' app.config['JSON_CONFIG_DIR'] = 'config' @@ -40,6 +50,10 @@ class Status(db.Model): status = Column(String) info_text = Column(String) + def human_date(self): + dt = datetime.datetime.fromtimestamp(self.timestamp) + return dt.strftime("%d-%m%-%y %H:%M") + def buildReponseDict(status, service=None): if not status: @@ -56,6 +70,8 @@ def buildReponseDict(status, service=None): @app.route('/overview') def overview(): + user = flask.request.headers.get("X-Preferred-Username") + # query all services # services = db.session.query(Service).all() @@ -83,7 +99,54 @@ def overview(): status_unique_results.append(status) return flask.render_template("overview.html", status_list=status_unique_results, - datetime=datetime.datetime) + datetime=datetime.datetime, user=user) + +class EntryForm(FlaskForm): + + service = StringField("Service Name", validators=[DataRequired()]) + timeout = DecimalField("Timeout in days", default=30) + +def create_entry(form, user): + + # TODO add entry to icinga + token = secrets.token_urlsafe(16) + print(form.timeout.data) + service = Service(service=form.service.data, timeout=int(form.timeout.data), + owner=user, token=token) + db.session.merge(service) + db.session.commit() + +@app.route("/service-details") +def service_details(): + + user = flask.request.headers.get("X-Preferred-Username") + service = flask.request.args.get("service") + + # query service # + service = db.session.query(Service).filter(Service.service==service).first() + + # validate # + if not service: + return ("{} not found".format("service"), 404) + if service.owner and service.owner != user: + return ("Services is not owned by {}".format(user)) + + status_list = db.session.query() + + return flask.render_template("service_info.html", service=service, flask=flask, + user=user) + + +@app.route("/entry-form", methods=["GET", "POST"]) +def create_interface(): + + user = flask.request.headers.get("X-Preferred-Username") + + form = EntryForm() + if form.validate_on_submit(): + create_entry(form, user) + return flask.redirect('/service-details?service={}'.format(form.service.data)) + return flask.render_template('add_modify_service.html', form=form) @app.route('/alive') def alive(): @@ -188,6 +251,8 @@ def create_app(): db.create_all() config = {} + app.config["SECRET_KEY"] = secrets.token_urlsafe(64) + if os.path.isfile(app.config["JSON_CONFIG_FILE"]): with open(app.config["JSON_CONFIG_FILE"]) as f: config |= json.load(f) diff --git a/static/site.css b/static/site.css new file mode 100644 index 0000000..8423245 --- /dev/null +++ b/static/site.css @@ -0,0 +1,79 @@ +body{ + background: radial-gradient(ellipse at center, #47918a 0%, #0b3161 100%); + color: aliceblue !important; +} + +.navbar{ + width: 100%; + background: rgba(0,0,0,0); + display: block; + box-shadow: none; + padding: 20px; +} + +.navbar-el{ + float: right; + display: inline-block; + background: rgba(0,0,0,0); + color: aliceblue; +} + +.navbar-el:hover{ + color: darkgray; +} + +.overview-tile{ + color: black; +} + +.last-status{ + margin-top: 10px; + box-shadow: 0px 0px 4px 3px rgba(0,0,0,0.5); + background: linear-gradient(to top, #cfc6b054 0%, #cfcfcfc4 100%); + padding: 8px; + width: fit-content; + font-family: monospace; + font-weight: 500; +} + +.last-status p{ + margin-bottom: 0; +} + +.service-name{ + margin: auto; + max-width: 1000px; + width: fit-content; + padding-top: 30px; + padding-bottom: 30px; +} + +.service-timeout{ + +} + +.service-token{ + +} + +.example{ + font-family: monospace; + font-size: 12px; + border-style: solid; + border-width: 1px; + padding: 10px; +} + +.example-indent{ + padding-left: 20px; +} + +.example-indent-double{ + padding-left: 50px; +} + +.status-table{ + margin: auto; + width: 100%; + text-align: center; +} diff --git a/templates/add_modify_service.html b/templates/add_modify_service.html new file mode 100644 index 0000000..a440c1c --- /dev/null +++ b/templates/add_modify_service.html @@ -0,0 +1,24 @@ +{% include "head.html" %} +
+