diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..bd55365 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.9.7 +ENV PYTHONUNBUFFERED=1 +WORKDIR /app +# Copy python dependecies file +COPY requirements.txt . +RUN pip install -r requirements.txt +EXPOSE 8001 +COPY . /app/ + +CMD ["python3", "main.py"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..131970f --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# Stream Disk Usage Clean Up +Clean up older screenshots from Stream folder when disk is getting used up +> Ensure you are using the default image format: +> `image_format = $(camera)_screenshots/%y-%m-%d/%H-%M-%S.%f.jpg` + +## Setup + +1. Build the image +```bash +docker build --tag platerecognizer/stream-cleaner . +``` + +2. Run Image +```bash +docker run --rm -t -v /tmp/stream-template-0:/user-data/ -e INTERVAL=3 -e PERCENTAGE=90 -e LOGGING=DEBUG platerecognizer/stream-cleaner + +``` + +3. Configuration Parameters + +| Arg | Default | Description | +| --- | ----------- | --------- | +| -v | **Required** | Stream folder, `config.ini` location | +| -e | INTERVAL=30 | Interval between usage checks. In seconds | +| -e | PERCENTAGE=90 | Screenshots are deleted when percentage is passed | +| -e | LOGGING=INFO | Enable more verbose logging with `DEBUG` | + + diff --git a/main.py b/main.py new file mode 100644 index 0000000..f1f2650 --- /dev/null +++ b/main.py @@ -0,0 +1,67 @@ +import logging +import os +import shutil +import time +import sys +from configobj import ConfigObj + + +LOG_LEVEL = os.environ.get('LOGGING', 'INFO').upper() + +logging.basicConfig( + stream=sys.stdout, + level=LOG_LEVEL, + style='{', + format="{asctime} {levelname} {name} {threadName} : {message}") + +lgr = logging.getLogger(__name__) + + +CONFIG_FILE = '/user-data/config.ini' + + +def cleanup(cameras: list): + """ + Delete camera screenshots dirs + """ + + for camera in cameras: + lgr.info(f'Cleaning up Camera: {camera}') + screenshots_dir = f'/user-data/{camera}_screenshots' + try: + shutil.rmtree(screenshots_dir) + except OSError as e: + lgr.error(f"Error Deleting: {e.filename} - {e.strerror}. Skipped.") + + + +def disk_check(limit: int): + """ + Check disk usage as a percentage + """ + + total, used, free = shutil.disk_usage(__file__) + lgr.debug(f'Total: {total}, Used: {used}, Free: {free} ') + usage = used/total*100 + + lgr.debug(f'Usage :{usage}%') + + return usage > limit + + + +if __name__ == '__main__': + interval = int(os.getenv('INTERVAL', 30)) + percentage = int(os.getenv('PERCENTAGE', 90)) + + if not os.path.exists(CONFIG_FILE): + lgr.error('config.ini not found, did you forget to mount the stream volume?') + exit(1) + + config = ConfigObj('config.ini') + cameras = config['cameras'].sections + while True: + disk_full = disk_check(percentage) + if disk_full: + cleanup(cameras) + time.sleep(interval) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b4d1e2a --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +configobj==5.0.6 \ No newline at end of file