diff --git a/src/autoconf/Dockerfile b/src/autoconf/Dockerfile index d7f9464d7..b9c44dd1f 100644 --- a/src/autoconf/Dockerfile +++ b/src/autoconf/Dockerfile @@ -9,7 +9,7 @@ RUN mkdir -p /usr/share/bunkerweb/deps && \ rm -rf /tmp/req # Install dependencies -RUN apk add --no-cache --virtual .build-deps g++ gcc libffi-dev && \ +RUN apk add --no-cache --virtual .build-deps g++ gcc musl-dev jpeg-dev zlib-dev libffi-dev cairo-dev pango-dev gdk-pixbuf-dev && \ pip install --no-cache-dir --upgrade pip && \ pip install wheel && \ mkdir -p /usr/share/bunkerweb/deps/python && \ diff --git a/src/scheduler/Dockerfile b/src/scheduler/Dockerfile index 7568ec7b3..3066d7f89 100644 --- a/src/scheduler/Dockerfile +++ b/src/scheduler/Dockerfile @@ -10,7 +10,7 @@ RUN mkdir -p /usr/share/bunkerweb/deps && \ rm -rf /tmp/req # Install python requirements -RUN apk add --no-cache --virtual .build-deps g++ gcc libffi-dev && \ +RUN apk add --no-cache --virtual .build-deps g++ gcc musl-dev jpeg-dev zlib-dev libffi-dev cairo-dev pango-dev gdk-pixbuf-dev && \ pip install --no-cache-dir --upgrade pip && \ pip install wheel && \ mkdir -p /usr/share/bunkerweb/deps/python && \ @@ -51,7 +51,8 @@ RUN apk add --no-cache bash libgcc libstdc++ openssl && \ 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/lib/bunkerweb /var/tmp/bunkerweb && \ + chmod -R 770 /var/cache/bunkerweb /var/lib/bunkerweb /var/tmp/bunkerweb && \ + find /usr/share/bunkerweb/core/*/jobs/* -type f -exec chmod 750 {} \; && \ 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/ui/Dockerfile b/src/ui/Dockerfile index 40e2c88f6..e1a5ae428 100755 --- a/src/ui/Dockerfile +++ b/src/ui/Dockerfile @@ -10,7 +10,7 @@ RUN mkdir -p /usr/share/bunkerweb/deps && \ rm -rf /tmp/req # Install python requirements -RUN apk add --no-cache --virtual .build-deps g++ gcc && \ +RUN apk add --no-cache --virtual .build-deps g++ gcc musl-dev jpeg-dev zlib-dev libffi-dev cairo-dev pango-dev gdk-pixbuf-dev && \ pip install --no-cache-dir --upgrade pip && \ pip install wheel && \ mkdir -p /usr/share/bunkerweb/deps/python && \ diff --git a/src/ui/main.py b/src/ui/main.py index 924918219..a35dbb61a 100755 --- a/src/ui/main.py +++ b/src/ui/main.py @@ -1,3 +1,4 @@ +from io import BytesIO from bs4 import BeautifulSoup from copy import deepcopy from datetime import datetime, timedelta, timezone @@ -15,6 +16,7 @@ from flask import ( redirect, render_template, request, + send_file, url_for, ) from flask_login import LoginManager, login_required, login_user, logout_user @@ -1385,6 +1387,42 @@ def jobs(): ) +@app.route("/jobs/download", methods=["GET"]) +@login_required +def jobs_download(): + job_name = request.args.get("job_name", None) + file_name = request.args.get("file_name", None) + + if not job_name or not file_name: + return ( + jsonify( + { + "status": "ko", + "message": "job_name and file_name are required", + } + ), + 422, + ) + + cache_file = db.get_job_cache_file(job_name, file_name) + + if not cache_file: + return ( + jsonify( + { + "status": "ko", + "message": "file not found", + } + ), + 404, + ) + + with BytesIO(cache_file) as file: + file.seek(0) + + return send_file(file, as_attachment=True, attachment_filename=file_name) + + @app.route("/login", methods=["GET", "POST"]) def login(): fail = False