Files
lrc-backend/backend/cron/__init__.py
2020-07-20 17:51:57 +02:00

103 lines
3.8 KiB
Python

# -*- coding: utf-8 -*-
import logging
import random
import signal
import sys
import time
from logging.handlers import TimedRotatingFileHandler
from pprint import pprint
from backend import app, main_logger
from apscheduler.schedulers.background import BackgroundScheduler
from backend.cron.cron_state_checker import async_cron_recorder_checker, async_permanent_cron_recorder_checker
from backend.websocket.handlers import send_state_update_to_recorders
cron_log_handler = TimedRotatingFileHandler(app.config.get('CRON_LOG_FILE'), interval=1, when='d', backupCount=3)
cron_log_handler.setFormatter(logging.Formatter('[%(asctime)s] - %(funcName)20s() %(message)s'))
cron_logger = logging.getLogger("lrc.cron")
cron_logger.addHandler(cron_log_handler)
logging.getLogger("apscheduler.scheduler").addHandler(cron_log_handler)
logging.getLogger("apscheduler.executors.default").addHandler(cron_log_handler)
scheduler = None
def get_default_scheduler():
cron_logger.debug("creating scheduler!")
global scheduler
scheduler = BackgroundScheduler(timezone='utc')
scheduler.daemonic = False
return scheduler
def add_default_jobs(sched=None, testing=False):
global scheduler
if sched is None:
sched = scheduler
if testing:
check_recorder_state_job = sched.add_job(async_cron_recorder_checker.check_object_state, 'interval', seconds=40,
id="check_recorder_state_job")
check_all_recorders_state_job = sched.add_job(async_permanent_cron_recorder_checker, 'interval', minutes=5,
id="check_all_recorders_state_job")
else:
check_recorder_state_job = sched.add_job(async_cron_recorder_checker.check_object_state, 'interval', minutes=2,
id="check_recorder_state_job")
check_all_recorders_state_job = sched.add_job(async_permanent_cron_recorder_checker.check_object_state, 'interval', minutes=30,
id="check_all_recorders_state_job")
"""
Job regularly sending the state to "frontend recorders" through websocket
"""
send_update_state_to_recorder_job = sched.add_job(
lambda: send_state_update_to_recorders(async_cron_recorder_checker.get_current_state()), 'interval', minutes=1,
id="send_update_state_to_recorder_job")
return [check_recorder_state_job, send_update_state_to_recorder_job, check_all_recorders_state_job]
def signal_handler(sig, frame):
print('You pressed Ctrl+C -> shutting down scheduler!')
if scheduler is not None:
scheduler.shutdown()
sys.exit(0)
if __name__ == '__main__':
# check_for_ingestibles_and_ingest()
# remove_obsolete_media_files_objects()
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(
logging.Formatter('[%(asctime)s] {%(threadName)s} %(levelname)s in %(module)s, line %(lineno)d: %(message)s'))
cron_logger.addHandler(stream_handler)
cron_logger.setLevel(logging.INFO)
signal.signal(signal.SIGINT, signal_handler)
get_default_scheduler()
add_default_jobs(testing=True)
cron_logger.info("Starting internal scheduler")
scheduler.start()
c = 0
while c < 10:
sleep_time = random.randint(10, 20)
cron_logger.info("Sleeping for {}s".format(sleep_time))
time.sleep(sleep_time)
recorder_id = random.randint(0, 15)
cron_logger.info("Using recorder id {}".format(recorder_id))
async_cron_recorder_checker.add_object_to_state_check(recorder_id)
async_cron_recorder_checker.add_object_to_state_check(recorder_id + 1)
pprint(async_cron_recorder_checker.get_current_state())
while True:
user_in = input("Type >exit< to quit.")
if user_in == "exit" or user_in == ">exit<":
break
scheduler.shutdown()