From b4111dc4c1ef52ebdf71dd468efec53b44acc3b9 Mon Sep 17 00:00:00 2001 From: Alexander Todorov Date: Thu, 22 Feb 2024 20:52:59 +0200 Subject: [PATCH] Add cron job for anonymous analytics - triggers every 5 days - respects settings.ANONYMOUS_ANALYTICS setting --- Dockerfile | 3 +- .../modules/tcms.cron.anonymous_analytics.rst | 7 +++ docs/source/modules/tcms.cron.rst | 15 ++++++ docs/source/modules/tcms.rst | 1 + etc/cron.jobs/anonymous_analytics.sh | 8 +++ etc/uwsgi.conf | 2 + tcms/cron/__init__.py | 0 tcms/cron/anonymous_analytics.py | 49 +++++++++++++++++++ 8 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 docs/source/modules/tcms.cron.anonymous_analytics.rst create mode 100644 docs/source/modules/tcms.cron.rst create mode 100755 etc/cron.jobs/anonymous_analytics.sh create mode 100644 tcms/cron/__init__.py create mode 100644 tcms/cron/anonymous_analytics.py diff --git a/Dockerfile b/Dockerfile index 828cf7522e..214a6c7155 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,8 +25,9 @@ COPY ./dist/venv/ /venv COPY ./manage.py /Kiwi/ # create directories so we can properly set ownership for them -RUN mkdir /Kiwi/ssl /Kiwi/static /Kiwi/uploads /Kiwi/etc +RUN mkdir -p /Kiwi/ssl /Kiwi/static /Kiwi/uploads /Kiwi/etc/cron.jobs COPY ./etc/*.conf /Kiwi/etc/ +COPY ./etc/cron.jobs/* /Kiwi/etc/cron.jobs/ # generate self-signed SSL certificate RUN /usr/bin/sscg -v -f \ diff --git a/docs/source/modules/tcms.cron.anonymous_analytics.rst b/docs/source/modules/tcms.cron.anonymous_analytics.rst new file mode 100644 index 0000000000..b6d293257b --- /dev/null +++ b/docs/source/modules/tcms.cron.anonymous_analytics.rst @@ -0,0 +1,7 @@ +tcms.cron.anonymous\_analytics module +===================================== + +.. automodule:: tcms.cron.anonymous_analytics + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/modules/tcms.cron.rst b/docs/source/modules/tcms.cron.rst new file mode 100644 index 0000000000..c0db993b97 --- /dev/null +++ b/docs/source/modules/tcms.cron.rst @@ -0,0 +1,15 @@ +tcms.cron package +================= + +.. automodule:: tcms.cron + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + tcms.cron.anonymous_analytics diff --git a/docs/source/modules/tcms.rst b/docs/source/modules/tcms.rst index 1e783a836e..535a8a798e 100644 --- a/docs/source/modules/tcms.rst +++ b/docs/source/modules/tcms.rst @@ -14,6 +14,7 @@ Subpackages tcms.bugs tcms.core + tcms.cron tcms.issuetracker tcms.kiwi_attachments tcms.kiwi_auth diff --git a/etc/cron.jobs/anonymous_analytics.sh b/etc/cron.jobs/anonymous_analytics.sh new file mode 100755 index 0000000000..0d083541a3 --- /dev/null +++ b/etc/cron.jobs/anonymous_analytics.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# make sure Python is enabled +export VIRTUAL_ENV=/venv +export PATH=/venv/bin:${PATH} + +# execute the actual Python script +cat /venv/lib64/python3.11/site-packages/tcms/cron/anonymous_analytics.py | /Kiwi/manage.py shell diff --git a/etc/uwsgi.conf b/etc/uwsgi.conf index fb611c6a56..e4d2ddb9da 100644 --- a/etc/uwsgi.conf +++ b/etc/uwsgi.conf @@ -10,6 +10,8 @@ harakiri = 30 max-requests = 1000 vacuum = true home = /venv +; anonymous analytics every 5 days +cron2 = day=-5,harakiri=10 /Kiwi/etc/cron.jobs/anonymous_analytics.sh ; override the standard configuration if-file = /Kiwi/etc/uwsgi.override diff --git a/tcms/cron/__init__.py b/tcms/cron/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tcms/cron/anonymous_analytics.py b/tcms/cron/anonymous_analytics.py new file mode 100644 index 0000000000..2e3c6f74cc --- /dev/null +++ b/tcms/cron/anonymous_analytics.py @@ -0,0 +1,49 @@ +# Copyright (c) 2024 Alexander Todorov +# +# Licensed under the GPL 2.0: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html + +""" + Send a custom pageview event to Plausible.io so that we can count + how many/which versions of Kiwi TCMS are out there in the wild! + + WARNING: this file is meant to be executed as a wsgi cron job, + see etc/wsgi.conf for more details. +""" +import sys + +import requests +from django.conf import settings + + +def post_analytics(): + response = requests.post( + "https://plausible.io/api/event", + json={ + "name": "pageview", + "url": f"app://{settings.PLAUSIBLE_DOMAIN}/deployed-versions", + "domain": settings.PLAUSIBLE_DOMAIN, + "props": { + "version": settings.KIWI_VERSION, + }, + }, + headers={ + "User-Agent": f"kiwi-tcms/{settings.KIWI_VERSION}", + "Content-Type": "application/json", + }, + timeout=10, + ) + + print(response.status_code) + print(response.headers) + print(response.text) + + +if not settings.ANONYMOUS_ANALYTICS: + print("Anonymous analytics are explicitly disabled. Exiting") +elif "manage.py" in sys.argv and "shell" in sys.argv: + # execute only when piped to `./manage.py shell` + post_analytics() +else: + print( + "WARNING: pipe the content of this file to ./manage.py shell in order to execute it" + )