diff --git a/11.0.Dockerfile b/11.0.Dockerfile index 6bdf1edd..f5ae698f 100644 --- a/11.0.Dockerfile +++ b/11.0.Dockerfile @@ -1,7 +1,7 @@ FROM python:3.5-stretch AS base EXPOSE 8069 8072 - +ARG WKHTMLTOPDF_SKIP=0 ARG GEOIP_UPDATER_VERSION=4.1.5 ARG MQT=https://github.com/OCA/maintainer-quality-tools.git ARG WKHTMLTOPDF_VERSION=0.12.5 @@ -56,11 +56,11 @@ RUN apt-get -qq update \ && curl -sL https://deb.nodesource.com/setup_6.x | bash - \ && apt-get update \ && apt-get install -yqq --no-install-recommends nodejs \ - && curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.stretch_amd64.deb \ + && test ${WKHTMLTOPDF_SKIP} -ne 0 && ln -s /usr/local/bin/wkhtmltopdf /usr/local/bin/kwkhtmltopdf || (curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.stretch_amd64.deb \ && echo "${WKHTMLTOPDF_CHECKSUM} wkhtmltox.deb" | sha256sum -c - \ && apt-get install -yqq --no-install-recommends ./wkhtmltox.deb \ && rm wkhtmltox.deb \ - && wkhtmltopdf --version \ + && wkhtmltopdf --version) \ && curl --silent -L --output geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb https://github.com/maxmind/geoipupdate/releases/download/v${GEOIP_UPDATER_VERSION}/geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ && dpkg -i geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ && rm geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ diff --git a/12.0.Dockerfile b/12.0.Dockerfile index 427f69bd..df5e62b3 100644 --- a/12.0.Dockerfile +++ b/12.0.Dockerfile @@ -4,6 +4,7 @@ EXPOSE 8069 8072 ARG GEOIP_UPDATER_VERSION=4.1.5 ARG MQT=https://github.com/OCA/maintainer-quality-tools.git +ARG WKHTMLTOPDF_SKIP=0 ARG WKHTMLTOPDF_VERSION=0.12.5 ARG WKHTMLTOPDF_CHECKSUM='1140b0ab02aa6e17346af2f14ed0de807376de475ba90e1db3975f112fbd20bb' ENV DB_FILTER=.* \ @@ -56,11 +57,11 @@ RUN apt-get -qq update \ && curl -sL https://deb.nodesource.com/setup_8.x | bash - \ && apt-get update \ && apt-get install -yqq --no-install-recommends nodejs \ - && curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.stretch_amd64.deb \ + && test ${WKHTMLTOPDF_SKIP} -ne 0 && ln -s /usr/local/bin/wkhtmltopdf /usr/local/bin/kwkhtmltopdf || ( curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.stretch_amd64.deb \ && echo "${WKHTMLTOPDF_CHECKSUM} wkhtmltox.deb" | sha256sum -c - \ && apt-get install -yqq --no-install-recommends ./wkhtmltox.deb \ && rm wkhtmltox.deb \ - && wkhtmltopdf --version \ + && wkhtmltopdf --version) \ && curl --silent -L --output geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb https://github.com/maxmind/geoipupdate/releases/download/v${GEOIP_UPDATER_VERSION}/geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ && dpkg -i geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ && rm geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ diff --git a/13.0.Dockerfile b/13.0.Dockerfile index a248d90c..2ebcf810 100644 --- a/13.0.Dockerfile +++ b/13.0.Dockerfile @@ -4,6 +4,7 @@ EXPOSE 8069 8072 ARG GEOIP_UPDATER_VERSION=4.1.5 ARG MQT=https://github.com/OCA/maintainer-quality-tools.git +ARG WKHTMLTOPDF_SKIP=0 ARG WKHTMLTOPDF_VERSION=0.12.5 ARG WKHTMLTOPDF_CHECKSUM='dfab5506104447eef2530d1adb9840ee3a67f30caaad5e9bcb8743ef2f9421bd' ENV DB_FILTER=.* \ @@ -39,10 +40,12 @@ ENV DB_FILTER=.* \ RUN apt-get -qq update \ && apt-get install -yqq --no-install-recommends \ curl \ - && curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.buster_amd64.deb \ - && echo "${WKHTMLTOPDF_CHECKSUM} wkhtmltox.deb" | sha256sum -c - \ + && test ${WKHTMLTOPDF_SKIP} -ne 0 && ln -s /usr/local/bin/wkhtmltopdf /usr/local/bin/kwkhtmltopdf || (curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.buster_amd64.deb \ + && echo "${WKHTMLTOPDF_CHECKSUM} wkhtmltox.deb" | sha256sum -c - \ + && apt-get install -yqq --no-install-recommends ./wkhtmltox.deb \ + && rm wkhtmltox.deb \ + && wkhtmltopdf --version) \ && apt-get install -yqq --no-install-recommends \ - ./wkhtmltox.deb \ chromium \ ffmpeg \ fonts-liberation2 \ diff --git a/14.0.Dockerfile b/14.0.Dockerfile index 1c3fde3f..f6b0f818 100644 --- a/14.0.Dockerfile +++ b/14.0.Dockerfile @@ -3,6 +3,7 @@ FROM python:3.8-slim-buster AS base EXPOSE 8069 8072 ARG GEOIP_UPDATER_VERSION=4.3.0 +ARG WKHTMLTOPDF_SKIP=0 ARG WKHTMLTOPDF_VERSION=0.12.5 ARG WKHTMLTOPDF_CHECKSUM='dfab5506104447eef2530d1adb9840ee3a67f30caaad5e9bcb8743ef2f9421bd' ENV DB_FILTER=.* \ @@ -36,10 +37,11 @@ ENV DB_FILTER=.* \ RUN apt-get -qq update \ && apt-get install -yqq --no-install-recommends \ curl \ - && curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.buster_amd64.deb \ + && test ${WKHTMLTOPDF_SKIP} -ne 0 && ln -s /usr/local/bin/wkhtmltopdf /usr/local/bin/kwkhtmltopdf || (curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.buster_amd64.deb \ && echo "${WKHTMLTOPDF_CHECKSUM} wkhtmltox.deb" | sha256sum -c - \ + && rm wkhtmltox.deb \ + && wkhtmltopdf --version) \ && apt-get install -yqq --no-install-recommends \ - ./wkhtmltox.deb \ chromium \ ffmpeg \ fonts-liberation2 \ diff --git a/15.0.Dockerfile b/15.0.Dockerfile index 71c6aa76..bb303826 100644 --- a/15.0.Dockerfile +++ b/15.0.Dockerfile @@ -3,6 +3,7 @@ FROM python:3.8-slim-bullseye AS base EXPOSE 8069 8072 ARG GEOIP_UPDATER_VERSION=4.3.0 +ARG WKHTMLTOPDF_SKIP=0 ARG WKHTMLTOPDF_VERSION=0.12.5 ARG WKHTMLTOPDF_CHECKSUM='dfab5506104447eef2530d1adb9840ee3a67f30caaad5e9bcb8743ef2f9421bd' ENV DB_FILTER=.* \ @@ -36,10 +37,11 @@ ENV DB_FILTER=.* \ RUN apt-get -qq update \ && apt-get install -yqq --no-install-recommends \ curl \ - && curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.buster_amd64.deb \ + && test ${WKHTMLTOPDF_SKIP} -ne 0 && ln -s /usr/local/bin/wkhtmltopdf /usr/local/bin/kwkhtmltopdf || ( curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.buster_amd64.deb \ && echo "${WKHTMLTOPDF_CHECKSUM} wkhtmltox.deb" | sha256sum -c - \ + && rm wkhtmltox.deb \ + && wkhtmltopdf --version) \ && apt-get install -yqq --no-install-recommends \ - ./wkhtmltox.deb \ chromium \ ffmpeg \ fonts-liberation2 \ diff --git a/bin/kwkhtmltopdf b/bin/kwkhtmltopdf new file mode 100755 index 00000000..5b60f973 --- /dev/null +++ b/bin/kwkhtmltopdf @@ -0,0 +1,98 @@ +#!/usr/bin/env python +# Copyright (c) 2019 ACSONE SA/NV +# Distributed under the MIT License (http://opensource.org/licenses/MIT) + +from __future__ import print_function + +import os +import sys + +import requests + +CHUNK_SIZE = 2 ** 16 + + +class Error(Exception): + pass + + +class UsageError(Error): + pass + + +class ServerError(Error): + pass + + +def wkhtmltopdf(args): + url = os.getenv("KWKHTMLTOPDF_SERVER_URL") + + if url == "": + raise UsageError("KWKHTMLTOPDF_SERVER_URL not set") + elif url == "MOCK": + print("wkhtmltopdf 0.12.5 (mock)") + return + + parts = [] + + def add_option(option): + # TODO option encoding? + parts.append(("option", (None, option))) + + def add_file(filename): + with open(filename, "rb") as f: + parts.append(("file", (filename, f.read()))) + + if "-" in args: + raise UsageError("stdin/stdout input is not implemented") + + output = "-" + if len(args) >= 2 and not args[-1].startswith("-") and not args[-2].startswith("-"): + output = args[-1] + args = args[:-1] + + for arg in args: + if arg.startswith("-"): + add_option(arg) + elif arg.startswith("http://") or arg.startswith("https://"): + add_option(arg) + elif arg.startswith("file://"): + add_file(arg[7:]) + elif os.path.isfile(arg): + # TODO better way to detect args that are actually options + # TODO in case an option has the same name as an existing file + # TODO only way I see so far is enumerating them in a static + # TODO datastructure (that can be initialized with a quick parse + # TODO of wkhtmltopdf --extended-help) + add_file(arg) + else: + add_option(arg) + + if not parts: + add_option("-h") + + try: + r = requests.post(url, files=parts) + r.raise_for_status() + + if output == "-": + if sys.version_info[0] < 3: + out = sys.stdout + else: + out = sys.stdout.buffer + else: + out = open(output, "wb") + for chunk in r.iter_content(chunk_size=CHUNK_SIZE): + out.write(chunk) + except requests.exceptions.ChunkedEncodingError: + # TODO look if client and server could use trailer headers + # TODO to report errors + raise ServerError("kwkhtmltopdf server error, consult server log") + + +if __name__ == "__main__": + try: + wkhtmltopdf(sys.argv[1:]) + except Error as e: + print(e, file=sys.stderr) + sys.exit(-1)