From 0630b226111dda3ab9f7c738e5701b81d147346e Mon Sep 17 00:00:00 2001 From: Simon Beginn Date: Thu, 14 Oct 2021 13:13:15 +0200 Subject: [PATCH] Switch to whole new entrypoint system --- docker/docker-py3-kms-minimal/Dockerfile | 26 ++++++------ docker/docker-py3-kms/Dockerfile | 35 +++++++++------- docker/docker-py3-kms/build-py3-kms.sh | 1 - docker/docker-py3-kms/run-py3-kms.sh | 16 ------- docker/docker-py3-kms/start.sh | 50 ---------------------- docker/entrypoint.py | 53 ++++++++++++++++++++++++ docs/Getting Started.md | 9 ++-- 7 files changed, 92 insertions(+), 98 deletions(-) delete mode 100755 docker/docker-py3-kms/build-py3-kms.sh delete mode 100755 docker/docker-py3-kms/run-py3-kms.sh delete mode 100755 docker/docker-py3-kms/start.sh create mode 100755 docker/entrypoint.py diff --git a/docker/docker-py3-kms-minimal/Dockerfile b/docker/docker-py3-kms-minimal/Dockerfile index 738c054..2c9107d 100644 --- a/docker/docker-py3-kms-minimal/Dockerfile +++ b/docker/docker-py3-kms-minimal/Dockerfile @@ -2,17 +2,17 @@ FROM alpine:3.12 -ENV IP 0.0.0.0 -ENV PORT 1688 -ENV EPID "" -ENV LCID 1033 -ENV CLIENT_COUNT 26 -ENV ACTIVATION_INTERVAL 120 -ENV RENEWAL_INTERVAL 10080 -ENV HWID "RANDOM" -ENV LOGLEVEL INFO -ENV LOGFILE /dev/stdout -ENV LOGSIZE "" +ENV IP 0.0.0.0 +ENV PORT 1688 +ENV EPID "" +ENV LCID 1033 +ENV CLIENT_COUNT 26 +ENV ACTIVATION_INTERVAL 120 +ENV RENEWAL_INTERVAL 10080 +ENV HWID RANDOM +ENV LOGLEVEL INFO +ENV LOGFILE /dev/stdout +ENV LOGSIZE "" COPY ./py-kms /home/py-kms @@ -37,4 +37,6 @@ WORKDIR /home/py-kms EXPOSE ${PORT}/tcp -ENTRYPOINT /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} +COPY docker/entrypoint.py /usr/bin/entrypoint.py +RUN chmod a+x /usr/bin/entrypoint.py +ENTRYPOINT ['/usr/bin/python3', '/usr/bin/entrypoint.py'] diff --git a/docker/docker-py3-kms/Dockerfile b/docker/docker-py3-kms/Dockerfile index 38a6a61..e5fd87c 100644 --- a/docker/docker-py3-kms/Dockerfile +++ b/docker/docker-py3-kms/Dockerfile @@ -1,19 +1,19 @@ FROM alpine:3.12 -ENV IP 0.0.0.0 -ENV PORT 1688 -ENV EPID "" -ENV LCID 1033 -ENV CLIENT_COUNT 26 -ENV ACTIVATION_INTERVAL 120 -ENV RENEWAL_INTERVAL 10080 -ENV SQLITE false -ENV HWID "RANDOM" -ENV LOGLEVEL INFO -ENV LOGFILE /dev/stdout -ENV LOGSIZE "" +ENV IP 0.0.0.0 +ENV PORT 1688 +ENV EPID "" +ENV LCID 1033 +ENV CLIENT_COUNT 26 +ENV ACTIVATION_INTERVAL 120 +ENV RENEWAL_INTERVAL 10080 +ENV SQLITE true +ENV SQLITE_PORT 8080 +ENV HWID RANDOM +ENV LOGLEVEL INFO +ENV LOGFILE /dev/stdout +ENV LOGSIZE "" -COPY docker/docker-py3-kms/start.sh /usr/bin/start.sh COPY ./py-kms /home/py-kms RUN apk add --no-cache --update \ @@ -28,10 +28,12 @@ RUN apk add --no-cache --update \ tzdata \ build-base python3-dev && \ git clone https://github.com/coleifer/sqlite-web.git /tmp/sqlite_web && \ + cd /tmp/sqlite_web && \ + git checkout 2e7c85da3d37f80074ed3ae39b5851069b4f301c && \ + cd / && \ mv /tmp/sqlite_web/sqlite_web /home/ && \ rm -rf /tmp/sqlite_web && \ pip3 install peewee tzlocal pytz pysqlite3 && \ - chmod a+x /usr/bin/start.sh && \ apk del git build-base python3-dev # Fix undefined timezone, in case the user did not mount the /etc/localtime @@ -39,6 +41,9 @@ RUN cp /usr/share/zoneinfo/UTC /etc/localtime WORKDIR /home/py-kms +EXPOSE ${SQLITE_PORT}/tcp EXPOSE ${PORT}/tcp -ENTRYPOINT ["/usr/bin/start.sh"] +COPY docker/entrypoint.py /usr/bin/entrypoint.py +RUN chmod a+x /usr/bin/entrypoint.py +ENTRYPOINT ['/usr/bin/python3', '/usr/bin/entrypoint.py'] diff --git a/docker/docker-py3-kms/build-py3-kms.sh b/docker/docker-py3-kms/build-py3-kms.sh deleted file mode 100755 index 71e6145..0000000 --- a/docker/docker-py3-kms/build-py3-kms.sh +++ /dev/null @@ -1 +0,0 @@ -docker build -t pykms/pykms:py3-kms ../../ --file ./Dockerfile diff --git a/docker/docker-py3-kms/run-py3-kms.sh b/docker/docker-py3-kms/run-py3-kms.sh deleted file mode 100755 index b8d5f4c..0000000 --- a/docker/docker-py3-kms/run-py3-kms.sh +++ /dev/null @@ -1,16 +0,0 @@ -docker stop py3-kms -docker rm py3-kms -docker run -d --name py3-kms \ - -t \ - -p 8080:8080 \ - -p 1688:1688 \ - -e IP=0.0.0.0 \ - -e PORT=1688 \ - -e SQLITE=true \ - -e HWID=RANDOM \ - -e LOGLEVEL=INFO \ - -e LOGFILE=/var/log/pykms_logserver.log \ - -e LOGSIZE=2 \ - -v /etc/localtime:/etc/localtime:ro \ - -v /var/log:/var/log:rw \ - --restart unless-stopped pykms/pykms:py3-kms diff --git a/docker/docker-py3-kms/start.sh b/docker/docker-py3-kms/start.sh deleted file mode 100755 index f6b1e01..0000000 --- a/docker/docker-py3-kms/start.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -cd /home/py-kms -if [ "$SQLITE" == false ]; -then - if [ "$EPID" == "" ]; - then - if [ "$LOGSIZE" == "" ]; - then - /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} - else - /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} -S ${LOGSIZE} - fi - else - if [ "$LOGSIZE" == "" ]; - then - /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -e ${EPID} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} - else - /usr/bin/python3 pykms_Server.py ${IP} ${PORT} -e ${EPID} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} -S ${LOGSIZE} - fi - fi -else - if [ "$EPID" == "" ]; - then - if [ "$LOGSIZE" == "" ]; - then - /bin/bash -c "/usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -s ${PWD}/pykms_database.db -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} &" - sleep 5 - /usr/bin/python3 pykms_Client.py ${IP} ${PORT} -m Windows10 & - /usr/bin/python3 /home/sqlite_web/sqlite_web.py -H ${IP} -x ${PWD}/pykms_database.db --read-only - else - /bin/bash -c "/usr/bin/python3 pykms_Server.py ${IP} ${PORT} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -s ${PWD}/pykms_database.db -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} -S ${LOGSIZE} &" - sleep 5 - /usr/bin/python3 pykms_Client.py ${IP} ${PORT} -m Windows10 & - /usr/bin/python3 /home/sqlite_web/sqlite_web.py -H ${IP} -x ${PWD}/pykms_database.db --read-only - fi - else - if [ "$LOGSIZE" == "" ]; - then - /bin/bash -c "/usr/bin/python3 pykms_Server.py ${IP} ${PORT} -e ${EPID} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -s ${PWD}/pykms_database.db -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} &" - sleep 5 - /usr/bin/python3 pykms_Client.py ${IP} ${PORT} -m Windows10 & - /usr/bin/python3 /home/sqlite_web/sqlite_web.py -H ${IP} -x ${PWD}/pykms_database.db --read-only - else - /bin/sh -c "/usr/bin/python3 pykms_Server.py ${IP} ${PORT} -e ${EPID} -l ${LCID} -c ${CLIENT_COUNT} -a ${ACTIVATION_INTERVAL} -r ${RENEWAL_INTERVAL} -s ${PWD}/pykms_database.db -w ${HWID} -V ${LOGLEVEL} -F ${LOGFILE} -S ${LOGSIZE} &" - sleep 5 - /usr/bin/python3 pykms_Client.py ${IP} ${PORT} -m Windows10 & - /usr/bin/python3 /home/sqlite_web/sqlite_web.py -H ${IP} -x ${PWD}/pykms_database.db --read-only - fi - fi -fi diff --git a/docker/entrypoint.py b/docker/entrypoint.py new file mode 100755 index 0000000..9fe4fe3 --- /dev/null +++ b/docker/entrypoint.py @@ -0,0 +1,53 @@ +#!/usr/bin/python3 + +# This replaces the old start.sh and ensures all arguments are bound correctly from the environment variables... + +import os +import time +import subprocess + +argumentVariableMapping = { + '-l': 'LCID', + '-c': 'CLIENT_COUNT', + '-a': 'ACTIVATION_INTERVAL', + '-r': 'RENEWAL_INTERVAL', + '-w': 'HWID', + '-V': 'LOGLEVEL', + '-F': 'LOGFILE', + '-S': 'LOGSIZE', + '-e': 'EPID' +} + +# Build the command to execute +command = ['/usr/bin/python3', 'pykms_Server.py', os.environ.get('IP'), os.environ.get('PORT')] +for (arg, env) in argumentVariableMapping.items(): + if env in os.environ and os.environ.get(env) != '': + command.append(arg) + command.append(os.environ.get(env)) + +enableSQLITE = os.environ.get('SQLITE').lower() == 'true' +os.makedirs('db', exist_ok=True) +dbPath = os.path.join(os.environ.get('PWD'), 'db', 'pykms_database.db') +if enableSQLITE: + command.append('-s') + command.append(dbPath) + +pykmsProcess = subprocess.Popen(command) + +# In case SQLITE is defined: Start the web interface +if enableSQLITE: + time.sleep(5) # The server may take a while to start + if not os.path.isfile(dbPath): + # Start a dummy activation to ensure the database file is created + subprocess.run(['/usr/bin/python3', 'pykms_Client.py', os.environ.get('IP'), os.environ.get('PORT'), '-m', 'Windows10', '-n', 'DummyClient', '-c', 'ae3a27d1-b73a-4734-9878-70c949815218']) + sqliteProcess = subprocess.Popen(['/usr/bin/python3', '/home/sqlite_web/sqlite_web.py', '-H', os.environ.get('IP'), '--read-only', '-x', dbPath, '-p', os.environ.get('SQLITE_PORT')]) + +try: + pykmsProcess.wait() +except: + # In case of any error - just shut down + pass + +if enableSQLITE: + sqliteProcess.terminate() + pykmsProcess.terminate() diff --git a/docs/Getting Started.md b/docs/Getting Started.md index ce1c633..45e9b29 100644 --- a/docs/Getting Started.md +++ b/docs/Getting Started.md @@ -37,25 +37,26 @@ _Please note that any architecture other than the classic `amd64` is slightly bi #### Docker Compose You can use `docker-compose` instead of building and running the Dockerfile, so you do not need to respecify your settings again and again. The following Docker Compose file will deploy the `latest` image with the log into your local directory. +Make sure to take a look into the `entrypoint.py` script to see all supported variable mappings! ```yaml version: '3' services: kms: - image: pykmsorg/py-kms:latest + image: pykmsorg/py-kms:python3 ports: - 1688:1688 + - 8080:8080 environment: - IP=0.0.0.0 - SQLITE=true - HWID=RANDOM - LOGLEVEL=INFO - - LOGSIZE=2 - - LOGFILE=/var/log/pykms_logserver.log + - LOGFILE=/dev/stdout restart: always volumes: + - ./db:/home/py-kms/db - /etc/localtime:/etc/localtime:ro - - ./logs:/var/log:rw ``` #### Parameters