mirror of
https://git.ianrenton.com/ian/spothole.git
synced 2025-10-27 08:49:27 +00:00
103 lines
3.2 KiB
Python
103 lines
3.2 KiB
Python
# Main script
|
|
import importlib
|
|
import logging
|
|
import signal
|
|
import sys
|
|
|
|
from diskcache import Cache
|
|
|
|
from core.cleanup import CleanupTimer
|
|
from core.config import config, WEB_SERVER_PORT
|
|
from core.lookup_helper import lookup_helper
|
|
from core.status_reporter import StatusReporter
|
|
from server.webserver import WebServer
|
|
|
|
# Globals
|
|
spots = Cache('cache/spots_cache')
|
|
alerts = Cache('cache/alerts_cache')
|
|
status_data = {}
|
|
spot_providers = []
|
|
alert_providers = []
|
|
cleanup_timer = None
|
|
|
|
|
|
# Shutdown function
|
|
def shutdown(sig, frame):
|
|
logging.info("Stopping program, this may take a few seconds...")
|
|
for p in spot_providers:
|
|
if p.enabled:
|
|
p.stop()
|
|
for p in alert_providers:
|
|
if p.enabled:
|
|
p.stop()
|
|
cleanup_timer.stop()
|
|
lookup_helper.stop()
|
|
spots.close()
|
|
alerts.close()
|
|
|
|
|
|
# Utility method to get a spot provider based on the class specified in its config entry.
|
|
def get_spot_provider_from_config(config_providers_entry):
|
|
module = importlib.import_module('spotproviders.' + config_providers_entry["class"].lower())
|
|
provider_class = getattr(module, config_providers_entry["class"])
|
|
return provider_class(config_providers_entry)
|
|
|
|
|
|
# Utility method to get an alert provider based on the class specified in its config entry.
|
|
def get_alert_provider_from_config(config_providers_entry):
|
|
module = importlib.import_module('alertproviders.' + config_providers_entry["class"].lower())
|
|
provider_class = getattr(module, config_providers_entry["class"])
|
|
return provider_class(config_providers_entry)
|
|
|
|
|
|
# Main function
|
|
if __name__ == '__main__':
|
|
# Set up logging
|
|
root = logging.getLogger()
|
|
root.setLevel(logging.INFO)
|
|
handler = logging.StreamHandler(sys.stdout)
|
|
handler.setLevel(logging.INFO)
|
|
formatter = logging.Formatter("%(message)s")
|
|
handler.setFormatter(formatter)
|
|
root.addHandler(handler)
|
|
|
|
logging.info("Starting...")
|
|
|
|
# Shut down gracefully on SIGINT
|
|
signal.signal(signal.SIGINT, shutdown)
|
|
|
|
# Set up lookup helper
|
|
lookup_helper.start()
|
|
|
|
# Fetch, set up and start spot providers
|
|
for entry in config["spot-providers"]:
|
|
spot_providers.append(get_spot_provider_from_config(entry))
|
|
for p in spot_providers:
|
|
p.setup(spots=spots)
|
|
if p.enabled:
|
|
p.start()
|
|
|
|
# Fetch, set up and start alert providers
|
|
for entry in config["alert-providers"]:
|
|
alert_providers.append(get_alert_provider_from_config(entry))
|
|
for p in alert_providers:
|
|
p.setup(alerts=alerts)
|
|
if p.enabled:
|
|
p.start()
|
|
|
|
# Set up timer to clear spot list of old data
|
|
cleanup_timer = CleanupTimer(spots=spots, alerts=alerts, cleanup_interval=60)
|
|
cleanup_timer.start()
|
|
|
|
# Set up web server
|
|
web_server = WebServer(spots=spots, alerts= alerts, status_data=status_data, port=WEB_SERVER_PORT)
|
|
web_server.start()
|
|
|
|
# Set up status reporter
|
|
status_reporter = StatusReporter(status_data=status_data, spots=spots, alerts=alerts, web_server=web_server,
|
|
cleanup_timer=cleanup_timer, spot_providers=spot_providers,
|
|
alert_providers=alert_providers, run_interval=5)
|
|
status_reporter.start()
|
|
|
|
logging.info("Startup complete.")
|