From 1252d1651e809a7da85bef741163b89ced75bc20 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Wed, 16 Nov 2022 17:39:52 +0100 Subject: [PATCH] Add the jobs feature and add the link when using sqlite --- src/autoconf/Dockerfile | 4 +++- src/common/db/Database.py | 48 +++++++++++++++++++++++++++++++++++++ src/common/helpers/data.sh | 2 +- src/scheduler/Dockerfile | 5 ++-- src/scheduler/entrypoint.sh | 4 ++++ src/scheduler/main.py | 2 ++ src/ui/Dockerfile | 5 ++-- src/ui/main.py | 11 +++++++++ 8 files changed, 75 insertions(+), 6 deletions(-) diff --git a/src/autoconf/Dockerfile b/src/autoconf/Dockerfile index 6c22b03d3..d7f9464d7 100644 --- a/src/autoconf/Dockerfile +++ b/src/autoconf/Dockerfile @@ -32,9 +32,11 @@ RUN apk add --no-cache bash && \ addgroup -g 101 nginx && \ adduser -h /var/cache/nginx -g nginx -s /bin/sh -G nginx -D -H -u 101 nginx && \ cp /usr/share/bunkerweb/helpers/bwcli /usr/bin/ && \ - chown -R nginx:nginx /usr/share/bunkerweb && \ + mkdir -p /data/lib && ln -s /data/lib /var/lib/bunkerweb && \ + chown -R nginx:nginx /usr/share/bunkerweb /var/lib/bunkerweb && \ find /usr/share/bunkerweb -type f -exec chmod 0740 {} \; && \ find /usr/share/bunkerweb -type d -exec chmod 0750 {} \; && \ + chmod 770 /var/lib/bunkerweb && \ chmod 750 /usr/share/bunkerweb/cli/main.py /usr/share/bunkerweb/helpers/*.sh /usr/bin/bwcli /usr/share/bunkerweb/autoconf/main.py /usr/share/bunkerweb/deps/python/bin/* && \ chown root:nginx /usr/bin/bwcli diff --git a/src/common/db/Database.py b/src/common/db/Database.py index cc09061ee..f31a7810b 100644 --- a/src/common/db/Database.py +++ b/src/common/db/Database.py @@ -70,6 +70,8 @@ class Database: splitted = sqlalchemy_string.split("+") sqlalchemy_string = f"{splitted[0]}:{':'.join(splitted[1].split(':')[1:])}" + self.database_uri = sqlalchemy_string + try: self.__sql_engine = create_engine( sqlalchemy_string, @@ -115,6 +117,9 @@ class Database: bind=self.__sql_engine, autoflush=False, expire_on_commit=False ) + def get_database_uri(self) -> str: + return self.database_uri + def __del__(self) -> None: """Close the database""" if self.__sql_session: @@ -1184,3 +1189,46 @@ class Database: """Get plugins errors.""" with self.__db_session() as session: return session.query(Jobs).filter(Jobs.success == False).count() + + def get_jobs(self) -> Dict[str, Dict[str, Any]]: + """Get jobs.""" + jobs = {} + with self.__db_session() as session: + for job in ( + session.query(Jobs) + .with_entities( + Jobs.name, + Jobs.every, + Jobs.reload, + Jobs.success, + Jobs.last_run, + Jobs.cache, + ) + .all() + ): + jobs[job.name] = { + "every": job.every, + "reload": job.reload, + } + + if job.success is not None and job.last_run is not None: + jobs[job.name].update( + { + "success": job.success, + "last_run": job.last_run, + } + ) + + if job.cache is not None: + job["cache"] = [] + for cache in job.cache: + jobs[job.name]["cache"].append( + { + "service_id": cache.service_id, + "file_name": cache.file_name, + "data": cache.data.decode("utf-8"), + "last_update": cache.last_update, + } + ) + + return jobs diff --git a/src/common/helpers/data.sh b/src/common/helpers/data.sh index 7363b9ffa..1e98d477d 100644 --- a/src/common/helpers/data.sh +++ b/src/common/helpers/data.sh @@ -5,7 +5,7 @@ log "$1" "ℹ️" "Setup and check /data folder ..." # Create folders if missing and check permissions -rwx_folders=("cache" "cache/letsencrypt") +rwx_folders=("cache" "cache/letsencrypt" "lib") rx_folders=("configs" "configs/http" "configs/stream" "configs/server-http" "configs/server-stream" "configs/default-server-http" "configs/default-server-stream" "configs/modsec" "configs/modsec-crs" "plugins" "www") for folder in "${rwx_folders[@]}" ; do if [ ! -d "/data/${folder}" ] ; then diff --git a/src/scheduler/Dockerfile b/src/scheduler/Dockerfile index 01f403f3b..7568ec7b3 100644 --- a/src/scheduler/Dockerfile +++ b/src/scheduler/Dockerfile @@ -41,16 +41,17 @@ RUN apk add --no-cache bash libgcc libstdc++ openssl && \ mkdir -p /var/www && \ mkdir -p /etc/bunkerweb && \ mkdir -p /data/cache && ln -s /data/cache /var/cache/bunkerweb && \ + mkdir -p /data/lib && ln -s /data/lib /var/lib/bunkerweb && \ mkdir -p /data/cache/letsencrypt && ln -s /data/cache/letsencrypt /etc/letsencrypt && \ mkdir -p /data/www && ln -s /data/www /var/www/html && \ for dir in $(echo "configs plugins") ; do mkdir -p "/data/${dir}" && ln -s "/data/${dir}" "/etc/bunkerweb/${dir}" ; done && \ for dir in $(echo "configs/http configs/stream configs/server-http configs/server-stream configs/default-server-http configs/default-server-stream configs/modsec configs/modsec-crs") ; do mkdir "/data/${dir}" ; done && \ chown -R root:scheduler /data && \ chmod -R 770 /data && \ - chown -R root:scheduler /usr/share/bunkerweb /var/cache/bunkerweb /etc/bunkerweb /var/tmp/bunkerweb && \ + chown -R root:scheduler /usr/share/bunkerweb /var/cache/bunkerweb /var/lib/bunkerweb /etc/bunkerweb /var/tmp/bunkerweb && \ for dir in $(echo "/usr/share/bunkerweb /etc/bunkerweb") ; do find ${dir} -type f -exec chmod 0740 {} \; ; done && \ for dir in $(echo "/usr/share/bunkerweb /etc/bunkerweb") ; do find ${dir} -type d -exec chmod 0750 {} \; ; done && \ - chmod 770 /var/cache/bunkerweb /var/tmp/bunkerweb && \ + chmod 770 /var/cache/bunkerweb /var/lib/bunkerweb /var/tmp/bunkerweb && \ chmod 750 /usr/share/bunkerweb/gen/*.py /usr/share/bunkerweb/scheduler/main.py /usr/share/bunkerweb/scheduler/entrypoint.sh /usr/share/bunkerweb/helpers/*.sh /usr/share/bunkerweb/deps/python/bin/* && \ mkdir /etc/nginx && \ chown -R scheduler:scheduler /etc/nginx && \ diff --git a/src/scheduler/entrypoint.sh b/src/scheduler/entrypoint.sh index 9429c44d4..1b63d4899 100755 --- a/src/scheduler/entrypoint.sh +++ b/src/scheduler/entrypoint.sh @@ -27,6 +27,10 @@ if ! grep -q "Docker" /usr/share/bunkerweb/INTEGRATION ; then fi fi +if [ -f /var/lib/bunkerweb/db.sqlite3 ] ; then + chown scheduler:scheduler /var/lib/bunkerweb/db.sqlite3 +fi + # execute jobs log "ENTRYPOINT" "ℹ️ " "Executing scheduler ..." /usr/share/bunkerweb/scheduler/main.py diff --git a/src/scheduler/main.py b/src/scheduler/main.py index d188e2e91..21a39bf34 100644 --- a/src/scheduler/main.py +++ b/src/scheduler/main.py @@ -170,6 +170,8 @@ if __name__ == "__main__": sleep(5) env = db.get_config() + env["DATABASE_URI"] = db.get_database_uri() + # Checking if any custom config has been created by the user custom_confs = [] root_dirs = listdir("/etc/bunkerweb/configs") diff --git a/src/ui/Dockerfile b/src/ui/Dockerfile index 022c85539..7b14889aa 100755 --- a/src/ui/Dockerfile +++ b/src/ui/Dockerfile @@ -37,14 +37,15 @@ RUN apk add --no-cache bash file && \ mkdir -p /var/tmp/bunkerweb && \ mkdir -p /etc/bunkerweb && \ mkdir -p /data/cache && ln -s /data/cache /var/cache/bunkerweb && \ + mkdir -p /data/lib && ln -s /data/lib /var/lib/bunkerweb && \ for dir in $(echo "configs plugins") ; do mkdir -p "/data/${dir}" && ln -s "/data/${dir}" "/etc/bunkerweb/${dir}" ; done && \ for dir in $(echo "configs/http configs/stream configs/server-http configs/server-stream configs/default-server-http configs/default-server-stream configs/modsec configs/modsec-crs") ; do mkdir "/data/${dir}" ; done && \ chown -R root:ui /data && \ chmod -R 770 /data && \ - chown -R root:ui /usr/share/bunkerweb /var/cache/bunkerweb /etc/bunkerweb /var/tmp/bunkerweb && \ + chown -R root:ui /usr/share/bunkerweb /var/cache/bunkerweb /var/lib/bunkerweb /etc/bunkerweb /var/tmp/bunkerweb && \ for dir in $(echo "/usr/share/bunkerweb /etc/bunkerweb") ; do find ${dir} -type f -exec chmod 0740 {} \; ; done && \ for dir in $(echo "/usr/share/bunkerweb /etc/bunkerweb") ; do find ${dir} -type d -exec chmod 0750 {} \; ; done && \ - chmod 770 /var/cache/bunkerweb /var/tmp/bunkerweb && \ + chmod 770 /var/cache/bunkerweb /var/lib/bunkerweb /var/tmp/bunkerweb && \ chmod 750 /usr/share/bunkerweb/gen/main.py /usr/share/bunkerweb/deps/python/bin/* # Fix CVEs diff --git a/src/ui/main.py b/src/ui/main.py index e62e272a8..5779377ae 100755 --- a/src/ui/main.py +++ b/src/ui/main.py @@ -1368,6 +1368,17 @@ def logs_container(container_id): return jsonify({"logs": logs, "last_update": int(time())}) +@app.route("/jobs", methods=["GET"]) +@login_required +def jobs(): + jobs = db.get_jobs() + return render_template( + "jobs.html", + jobs=jobs, + dark_mode=app.config["DARK_MODE"], + ) + + @app.route("/login", methods=["GET", "POST"]) def login(): fail = False