diff --git a/index.py b/index.py index ec4f6d4..3d486e3 100644 --- a/index.py +++ b/index.py @@ -1,87 +1,136 @@ from dotenv import load_dotenv -from flask import Flask, render_template +from flask import Flask, render_template, request, session, redirect, url_for, abort from flask_apscheduler import APScheduler -from flask_login import LoginManager +from flask_migrate import Migrate +from flask_sqlalchemy import SQLAlchemy import docker +import pyjokes import time import os +from datetime import timedelta -#DEBUG +# DEBUG from pprint import pprint + def calculate_cpu_percent(stats, status): if (status != "running"): return 0 - + cpu_count = len(stats["cpu_stats"]["cpu_usage"]["percpu_usage"]) cpu_percent = 0.0 cpu_delta = float(stats["cpu_stats"]["cpu_usage"]["total_usage"]) - \ - float(stats["precpu_stats"]["cpu_usage"]["total_usage"]) + float(stats["precpu_stats"]["cpu_usage"]["total_usage"]) system_delta = float(stats["cpu_stats"]["system_cpu_usage"]) - \ - float(stats["precpu_stats"]["system_cpu_usage"]) - + float(stats["precpu_stats"]["system_cpu_usage"]) + if system_delta > 0.0: cpu_percent = cpu_delta / system_delta * 100.0 * cpu_count return round(cpu_percent, 2) + def calculate_ram_percent(stats, status): if (status != "running"): return 0 - mem_used = stats["memory_stats"]["usage"] - stats["memory_stats"]["stats"]["cache"] + stats["memory_stats"]["stats"]["active_file"] + mem_used = stats["memory_stats"]["usage"] - stats["memory_stats"]["stats"]["cache"] + \ + stats["memory_stats"]["stats"]["active_file"] limit = stats['memory_stats']['limit'] - return round(mem_used / limit * 100, 2) + return round(mem_used / limit * 100, 2) + -client = docker.from_env() -#login_manager = LoginManager() -app = Flask(__name__) -scheduler = APScheduler() load_dotenv() -#login_manager.init_app(app) -#https://flask-login.readthedocs.io/en/latest/ +scheduler = APScheduler() +app = Flask(__name__) +app.secret_key = "sdasdsadasdasdasdadadaasd53563da" +app.permanent_session_lifetime = timedelta(days=1) +client = docker.from_env() + + +# db = SQLAlchemy(app) +# migrate = Migrate(app, db) + +# login_manager.init_app(app) +# https://flask-login.readthedocs.io/en/latest/ + + +@app.route("/login", methods=["POST", "GET"]) +def login(): + if (request.method == "POST"): + user = request.form["email"] + + #TODO: Validation + session.permanent = True + session['user'] = user + return redirect(url_for("index")) + else: + if "user" in session: + return redirect(url_for("index")) + return render_template("login.html") + + +@app.route("/logout", methods=['GET', 'POST']) +def logout(): + session.pop("user", None) + return redirect(url_for("login")) + @app.route("/", methods=['GET']) def index(): + if "user" not in session: + return redirect(url_for("login")) + containers = client.containers.list(all=True) - return render_template("index.html", title="test", containers_len=len(containers), containers=containers) + punchline = pyjokes.get_joke(language="en", category="neutral") + return render_template("index.html", title="test", subtitle=punchline, containers_len=len(containers), containers=containers) + @app.route("/parts/modal/container/", methods=['GET']) def parts_container_modal(container_id): + if "user" not in session: + abort(401) + container = client.containers.get(container_id) stats = container.stats(stream=False) - #com.docker.extension.detailed-description + # com.docker.extension.detailed-description project = '' - if('com.docker.compose.project' in container.attrs['Config']['Labels']): + + pprint(container.attrs) + if ('com.docker.compose.project' in container.attrs['Config']['Labels']): project = container.attrs['Config']['Labels']['com.docker.compose.project'] - return render_template("container_modal.html", name=container.name, project=project, ports=container.attrs['NetworkSettings']['Ports'], status=container.status, CPU=calculate_cpu_percent(stats, container.status) ,RAM =calculate_ram_percent(stats, container.status) ) + return render_template("container_modal.html", name=container.name, project=project, ports=container.attrs['NetworkSettings']['Ports'], status=container.status, CPU=calculate_cpu_percent(stats, container.status), RAM=calculate_ram_percent(stats, container.status)) + @app.route("/api//", methods=['DELETE', 'POST']) def api_stop_container(container_id, action): + if "user" not in session: + abort(401) + container = client.containers.get(container_id) - #pprint(vars(container)) + try: match action: case 'stop': container.stop() + case 'restart': + container.restart() case 'start': container.start() case _: return 'False' - + container = client.containers.get(container_id) return container.status except: return 'False' - - def scheduleTasks(): print("This test runs every 3 seconds") if __name__ == '__main__': - #scheduler.add_job(id = 'scheduled_tasks', func=scheduleTasks, trigger="interval", seconds=3) - #scheduler.start() + # scheduler.add_job(id = 'scheduled_tasks', func=scheduleTasks, trigger="interval", seconds=60) + # scheduler.start() app.run(host=os.getenv('IP'), port=os.getenv('port'), debug=True) diff --git a/templates/index.html b/templates/index.html index a9512f2..23dd15c 100644 --- a/templates/index.html +++ b/templates/index.html @@ -7,13 +7,20 @@ {{title}} +
-

Containers

+ + +
+

Containers

+ {{subtitle}} +
+
{% for container in containers %}
@@ -28,7 +35,8 @@ - +

{{container.attrs['Config']['Labels']['com.docker.compose.project']}}

diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000..5e362fc --- /dev/null +++ b/templates/login.html @@ -0,0 +1,72 @@ + + + + + + + Signin Template for Bootstrap + + + + + + + + + + \ No newline at end of file