Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 39 additions & 22 deletions src/process_manager.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/usr/bin/env python3
import datetime
import os
import shlex
import signal
Expand All @@ -10,7 +11,6 @@

import psutil
import requests
import schedule
from requests.exceptions import RequestException

from src.check_remote import compare_mtime
Expand Down Expand Up @@ -252,35 +252,52 @@ def run_update(self):

self.state = AppState.RUNNING

def _parse_interval(self, interval: str) -> datetime.timedelta:
interval = interval.lower()
value = int(interval[:-1])
unit = interval[-1]
if unit == "d":
return datetime.timedelta(days=value)
if unit == "h":
return datetime.timedelta(hours=value)
if unit == "m":
return datetime.timedelta(minutes=value)
logger.warning(f"Invalid UPDATE_INTERVAL format: {interval}, defaulting to 1 day")
return datetime.timedelta(days=1)

def _is_update_due(self) -> bool:
marker_file = os.path.join(config.DATA_DIR, ".photon-index-updated")
if not os.path.exists(marker_file):
logger.info("No marker file found, update is due")
return True

marker_time = datetime.datetime.fromtimestamp(os.path.getmtime(marker_file))
now = datetime.datetime.now()
elapsed = now - marker_time
interval = self._parse_interval(config.UPDATE_INTERVAL)

if elapsed < interval:
remaining = interval - elapsed
logger.info(f"Last update was {elapsed} ago, next check in {remaining}, skipping")
return False

logger.info(f"Last update was {elapsed} ago (interval: {interval}), update due")
return True

def schedule_updates(self):
if config.UPDATE_STRATEGY == "DISABLED":
logger.info("Updates disabled, not scheduling")
return

interval = config.UPDATE_INTERVAL.lower()

if interval.endswith("d"):
days = int(interval[:-1])
schedule.every(days).days.do(self.run_update)
logger.info(f"Scheduling updates every {days} days")
elif interval.endswith("h"):
hours = int(interval[:-1])
schedule.every(hours).hours.do(self.run_update)
logger.info(f"Scheduling updates every {hours} hours")
elif interval.endswith("m"):
minutes = int(interval[:-1])
schedule.every(minutes).minutes.do(self.run_update)
logger.info(f"Scheduling updates every {minutes} minutes")
else:
logger.warning(f"Invalid UPDATE_INTERVAL format: {interval}, defaulting to daily")
schedule.every().day.do(self.run_update)
logger.info(f"Scheduling daily update checks (update interval: {config.UPDATE_INTERVAL})")

def scheduler_loop():
def update_loop():
while not self.should_exit:
schedule.run_pending()
time.sleep(1)
if self._is_update_due():
self.run_update()
time.sleep(86400)

thread = threading.Thread(target=scheduler_loop, daemon=True)
thread = threading.Thread(target=update_loop, daemon=True)
thread.start()

def monitor_photon(self):
Expand Down
Loading