mirror of
https://git.ianrenton.com/ian/spothole.git
synced 2026-02-04 09:14:30 +00:00
68 lines
2.1 KiB
Python
68 lines
2.1 KiB
Python
import logging
|
|
from datetime import datetime
|
|
from threading import Timer
|
|
from time import sleep
|
|
|
|
import pytz
|
|
|
|
|
|
# Provides a timed cleanup of the spot list.
|
|
class CleanupTimer:
|
|
|
|
# Constructor
|
|
def __init__(self, spots, alerts, web_server, cleanup_interval):
|
|
self.spots = spots
|
|
self.alerts = alerts
|
|
self.web_server = web_server
|
|
self.cleanup_interval = cleanup_interval
|
|
self.cleanup_timer = None
|
|
self.last_cleanup_time = datetime.min.replace(tzinfo=pytz.UTC)
|
|
self.status = "Starting"
|
|
|
|
# Start the cleanup timer
|
|
def start(self):
|
|
self.cleanup()
|
|
|
|
# Stop any threads and prepare for application shutdown
|
|
def stop(self):
|
|
self.cleanup_timer.cancel()
|
|
|
|
# Perform cleanup and reschedule next timer
|
|
def cleanup(self):
|
|
try:
|
|
# Perform cleanup via letting the data expire
|
|
self.spots.expire()
|
|
self.alerts.expire()
|
|
|
|
# Explicitly clean up any spots and alerts that have expired
|
|
for id in list(self.spots.iterkeys()):
|
|
try:
|
|
spot = self.spots[id]
|
|
if spot.expired():
|
|
self.spots.delete(id)
|
|
except KeyError:
|
|
# Must have already been deleted, OK with that
|
|
pass
|
|
for id in list(self.alerts.iterkeys()):
|
|
try:
|
|
alert = self.alerts[id]
|
|
if alert.expired():
|
|
self.alerts.delete(id)
|
|
except KeyError:
|
|
# Must have already been deleted, OK with that
|
|
pass
|
|
|
|
# Clean up web server SSE spot/alert queues
|
|
self.web_server.clean_up_sse_queues()
|
|
|
|
self.status = "OK"
|
|
self.last_cleanup_time = datetime.now(pytz.UTC)
|
|
|
|
except Exception as e:
|
|
self.status = "Error"
|
|
logging.exception("Exception in Cleanup thread")
|
|
sleep(1)
|
|
|
|
self.cleanup_timer = Timer(self.cleanup_interval, self.cleanup)
|
|
self.cleanup_timer.start()
|