added and integrated background daemon and Dockerfile from my other project studywatch
This commit is contained in:
@@ -20,3 +20,6 @@ CALDAV_PASSWORD=
|
||||
|
||||
# prefix to mark event participants in calendar event description like "@max mustermann\n"
|
||||
CALDAV_PARTICIPANT_PREFIX=@
|
||||
|
||||
# delay between attempts to sync data from servers (int)
|
||||
REFETCH_SECONDS=300
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
FROM python:3-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY requirements.txt ./
|
||||
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* # install curl for healthcheck
|
||||
|
||||
COPY . .
|
||||
|
||||
CMD [ "python", "./app.py" ]
|
||||
|
||||
@@ -5,6 +5,7 @@ logging.basicConfig(level=logging.INFO)
|
||||
from flask import Flask, send_from_directory, jsonify
|
||||
import sys, os
|
||||
|
||||
from src.fetch_job import BGFetchJob
|
||||
from src.score import get_social_scores_dict
|
||||
from src.person import Person
|
||||
from src.addressbook import Addressbook
|
||||
@@ -12,10 +13,12 @@ from src.addressbook import Addressbook
|
||||
from src import config
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
addrbook = Addressbook()
|
||||
addrbook.update_cross_refs()
|
||||
# addrbook.print_people()
|
||||
#addrbook.print_events()
|
||||
|
||||
daemon = BGFetchJob()
|
||||
daemon.run(addrbook)
|
||||
|
||||
# root
|
||||
@app.route("/")
|
||||
|
||||
@@ -36,7 +36,31 @@ class Addressbook:
|
||||
sys.exit(1)
|
||||
logger.info(f"{len(self.events)} Events synced from calDAV server!")
|
||||
|
||||
def update(self):
|
||||
logger = logging.getLogger(__name__)
|
||||
try:
|
||||
self.sync_with_carddav()
|
||||
logger.info(f"{len(self.people)} Contacts synced from cardDAV server!")
|
||||
except Exception:logger.exception("Failed to sync contacts from cardDAV server!")
|
||||
|
||||
try:
|
||||
self.sync_with_caldav()
|
||||
logger.info(f"{len(self.events)} Events synced from calDAV server!")
|
||||
except Exception: logger.exception("Failed to sync events from calDAV server!")
|
||||
|
||||
self.update_cross_refs()
|
||||
|
||||
logger.info("Sync complete.")
|
||||
|
||||
def clear_cross_refs(self):
|
||||
for person in self.people:
|
||||
person.seen_at = []
|
||||
for event in self.events:
|
||||
event.participants = []
|
||||
|
||||
def update_cross_refs(self):
|
||||
self.clear_cross_refs()
|
||||
|
||||
for event in self.events:
|
||||
description = event.ical.get("description")
|
||||
if description:
|
||||
|
||||
+4
-2
@@ -25,11 +25,13 @@ try:
|
||||
CALDAV_USER = _env("CALDAV_USER", str)
|
||||
CALDAV_PASSWORD = _env("CALDAV_PASSWORD", str)
|
||||
CALDAV_PARTICIPANT_PREFIX = _env("CALDAV_PARTICIPANT_PREFIX", str)
|
||||
|
||||
REFETCH_SECONDS = _env("REFETCH_SECONDS", int)
|
||||
_logger.info("Config loaded!")
|
||||
|
||||
except Exception:
|
||||
_logger.exception("Failed to load config from .env!")
|
||||
sys.exit(1)
|
||||
|
||||
if FREQUENCY_TARGET_WEEKLY <= 0 or DIVERSITY_TARGET_MONTHLY <= 0:
|
||||
raise ValueError("Floatingpoint options must be > 0.")
|
||||
if FREQUENCY_TARGET_WEEKLY <= 0 or DIVERSITY_TARGET_MONTHLY <= 0 or REFETCH_SECONDS <= 0:
|
||||
raise ValueError("Floatingpoint and integer options must be > 0.")
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
import time, logging, threading
|
||||
|
||||
from src import config
|
||||
from src.addressbook import Addressbook
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def background_fetch_job(addressbook):
|
||||
logging.getLogger(__name__).info("Daemon up!")
|
||||
|
||||
while True:
|
||||
time.sleep(config.REFETCH_SECONDS)
|
||||
addressbook.update()
|
||||
|
||||
|
||||
class BGFetchJob:
|
||||
def __init__(self):
|
||||
self.thread = None
|
||||
|
||||
def run(self, addressbook):
|
||||
logger.info("Summoning fetch job daemon")
|
||||
self.thread = threading.Thread(target=background_fetch_job, args=(addressbook,), daemon=True)
|
||||
self.thread.start()
|
||||
|
||||
def is_alive(self):
|
||||
if self.thread:
|
||||
return self.thread.is_alive()
|
||||
else:
|
||||
return None
|
||||
Reference in New Issue
Block a user