diff --git a/second.py b/second.py index 11a5c81..2bc9599 100644 --- a/second.py +++ b/second.py @@ -1,10 +1,13 @@ """Less flashy version. More hard-coding.""" +from json import dumps, loads +from os import environ +from os.path import exists from pathlib import Path from shlex import split from subprocess import run -from flask import Flask, render_template +from flask import Flask, render_template, request from flask_wtf import FlaskForm from ruamel.yaml import YAML from wtforms import PasswordField, StringField @@ -43,17 +46,49 @@ def clone_app_template(app_name): run(split(f"git clone {clone_url} {clone_path}")) +def dump_db(db): + """Dump the database.""" + with open(DATA_DIR / "db.json", "w") as handle: + return handle.write(dumps(db)) + + +def load_db(): + """Load the database.""" + db_path = DATA_DIR / "db.json" + if exists(db_path): + with open(db_path, "r") as handle: + return loads(handle.read()) + return {} + + @app.route("/") def index(): return render_template("second/index.html", apps=[app for app in APPS]) @app.route("/config/") -def app_config(app_name): +def config(app_name): if app_name == "gitea": + # Note(decentral1se): load db.json and pre-populate the form? form = GiteaConfigForm() return render_template("second/config.html", app_name=app_name, form=form) +@app.route("/deploy/", methods=["POST"]) +def deploy(app_name): + environment = environ.copy() + for key in request.form.keys(): + environment[key.upper()] = request.form[key] + + # Note(decentral1se): how to handle the following? + # configs -> ${STACK_NAME}_app_ini_${APP_INI_VERSION} + # secrets -> ${STACK_NAME}_db_passwd_${DB_PASSWD_VERSION} + # and dump it all to the db.json when we're done here too + + compose_yml = DATA_DIR / app_name / "compose.yml" + command = f"docker stack deploy -c {compose_yml} {app_name}" + run(split(command), env=environment) + + if __name__ == "__main__": app.run(debug=True, host="0.0.0.0") diff --git a/templates/second/config.html b/templates/second/config.html index b09156f..82a3e59 100644 --- a/templates/second/config.html +++ b/templates/second/config.html @@ -7,7 +7,7 @@

Install {{ app_name }}

-
+ {% for field in form %}
{{ field.label() }}