"""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, request from flask_wtf import FlaskForm from ruamel.yaml import YAML from wtforms import PasswordField, StringField from wtforms.validators import DataRequired app = Flask(__name__) app.secret_key = b'_5#y2L"F4Q8z\n\xec]/' yaml = YAML() APPS = {"gitea": "https://git.autonomic.zone/compose-stacks/gitea"} DATA_DIR = Path("./data") class GiteaConfigForm(FlaskForm): app_name = StringField("Application name", default="Gitea") db_host = StringField("Database host", default="mariadb:3306") db_name = StringField("Database name", default="gitea") db_passwd = PasswordField("Database password", validators=[DataRequired()]) db_root_passwd = PasswordField( "Root database password", validators=[DataRequired()] ) db_type = StringField("Database type", default="mysql") db_user = StringField("Database user", default="mysql") domain = StringField("Domain name", validators=[DataRequired()]) ssh_port = StringField("SSH port", default="2222") stack_name = StringField("Stack name", default="gitea") internal_token = PasswordField("Internal token", validators=[DataRequired()]) jwt_secret = PasswordField("JWT secret", validators=[DataRequired()]) def clone_app_template(app_name): """Git clone an app template repository.""" clone_path = DATA_DIR / app_name clone_url = apps[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 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")