diff --git a/README.md b/README.md index 8c82775..abe6b58 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,8 @@ This also runs all necessary migrations. # Activate venv **On every new session**, before running commands with -manage.py or developing, you have to activate the venv: +manage.py, running special scripts, or developing, +you have to activate the virtual environment: ``` source ./venv/bin/activate ``` diff --git a/manage.py b/manage.py index e170f6b..5481674 100755 --- a/manage.py +++ b/manage.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!./venv/bin/python3 """Django's command-line utility for administrative tasks.""" import os import sys diff --git a/scripts/bootstrap.py b/scripts/_bootstrap.py similarity index 90% rename from scripts/bootstrap.py rename to scripts/_bootstrap.py index 00b5810..e65485e 100755 --- a/scripts/bootstrap.py +++ b/scripts/_bootstrap.py @@ -131,13 +131,15 @@ if __name__ == "__main__": "Caddy Webserver", ["caddy", "run", "--config", str(caddyfile)], None, - environment=environment_caddy - ), + environment=environment_caddy), MonitoredSubprocess( "Django Development Server", ["./venv/bin/python3", "./manage.py", "runserver", str(config["app"]["application_port"])], - None - ), + None), + MonitoredSubprocess( + "Session Autocleaner", + ["./scripts/_session-autocleaner.py", str(config["app"]["session_clear_interval"])], + None) ] start_and_monitor(procs) else: @@ -151,8 +153,7 @@ if __name__ == "__main__": "Caddy Webserver", ["caddy", "run", "--config", str(caddyfile)], logfile_caddy, - environment=environment_caddy - ), + environment=environment_caddy), MonitoredSubprocess( "Drinks-Manager", [ @@ -166,7 +167,10 @@ if __name__ == "__main__": "project.asgi:application", ], logfile_app, - environment=environment_app - ), + environment=environment_app), + MonitoredSubprocess( + "Session Autocleaner", + ["./scripts/_session-autocleaner.py", str(config["app"]["session_clear_interval"])], + logfile_app) ] start_and_monitor(procs) diff --git a/scripts/_session-autocleaner.py b/scripts/_session-autocleaner.py new file mode 100755 index 0000000..bb81089 --- /dev/null +++ b/scripts/_session-autocleaner.py @@ -0,0 +1,55 @@ +#!./venv/bin/python3 + +# This script clears expired sessions in a regular interval + +import os + +from argparse import ArgumentParser +from atexit import register as register_exithandler +from pathlib import Path +from subprocess import Popen +from time import sleep +from datetime import datetime + + +current_proc = None + + +def exithandler(): + if current_proc is not None: + seconds_waited = 0 + while current_proc.poll() is None: + # wait for 10 seconds to quit session cleaner + if seconds_waited >= 10: + current_proc.terminate() + break + # is still running + sleep(1) + seconds_waited += 1 + print("Stopped session-autocleaner.") + + +if __name__ == "__main__": + try: + argp = ArgumentParser() + argp.add_argument("interval", help="The interval in minutes", type=int) + args = argp.parse_args() + os.chdir(str(Path(__file__).parent.parent)) + print(f"Started session-autocleaner with an interval of {args.interval} minute(s)") + interval = args.interval * 60 + # register exithandler that cleans up stuff + register_exithandler(exithandler) + # main loop + while True: + if current_proc is not None: + # wait for last iteration + while current_proc.poll() is None: + # is still running + print("Last cleanup is still running, waiting before clearing sessions...") + sleep(1) + print(f"Clearing expired sessions at {datetime.now()}...") + current_proc = Popen( + ["./manage.py", "clearsessions"]) + sleep(interval) + except KeyboardInterrupt: + exit() diff --git a/start.sh b/start.sh index 4fbc464..a51c876 100755 --- a/start.sh +++ b/start.sh @@ -8,4 +8,4 @@ export PYTHONPATH="$basedir" export DJANGO_SETTINGS_MODULE="project.settings" export APP_VERSION="revamp-pre" -exec ./scripts/bootstrap.py "$@" +exec ./scripts/_bootstrap.py "$@"