2020-08-12 00:36:09 +00:00
|
|
|
import os
|
|
|
|
import time
|
|
|
|
import logging
|
|
|
|
import threading
|
2021-02-26 15:39:35 +00:00
|
|
|
import asyncio
|
2022-02-24 04:47:10 +00:00
|
|
|
import datetime
|
2022-01-11 01:11:52 +00:00
|
|
|
|
2022-03-08 04:40:44 +00:00
|
|
|
from app.classes.controllers.users_controller import Users_Controller
|
|
|
|
from app.classes.minecraft.serverjars import server_jar_obj
|
|
|
|
from app.classes.models.management import management_helper
|
|
|
|
from app.classes.models.users import users_helper
|
2020-08-12 00:36:09 +00:00
|
|
|
from app.classes.shared.helpers import helper
|
|
|
|
from app.classes.shared.console import console
|
2022-01-26 01:45:30 +00:00
|
|
|
from app.classes.web.tornado_handler import Webserver
|
2021-02-26 15:39:35 +00:00
|
|
|
from app.classes.web.websocket_helper import websocket_helper
|
2020-08-31 17:46:25 +00:00
|
|
|
|
2020-08-17 02:47:53 +00:00
|
|
|
try:
|
2022-03-08 04:40:44 +00:00
|
|
|
from tzlocal import get_localzone
|
2022-01-26 01:45:30 +00:00
|
|
|
from apscheduler.events import EVENT_JOB_EXECUTED
|
2022-01-12 21:09:38 +00:00
|
|
|
from apscheduler.schedulers.background import BackgroundScheduler
|
2022-01-19 19:43:34 +00:00
|
|
|
from apscheduler.triggers.cron import CronTrigger
|
2020-08-17 02:47:53 +00:00
|
|
|
|
2022-01-26 01:45:30 +00:00
|
|
|
except ModuleNotFoundError as err:
|
2022-03-08 04:40:44 +00:00
|
|
|
helper.auto_installer_fix(err)
|
2020-08-12 00:36:09 +00:00
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
logger = logging.getLogger("apscheduler")
|
|
|
|
scheduler_intervals = {
|
|
|
|
"seconds",
|
|
|
|
"minutes",
|
|
|
|
"hours",
|
|
|
|
"days",
|
|
|
|
"weeks",
|
|
|
|
"monday",
|
|
|
|
"tuesday",
|
|
|
|
"wednesday",
|
|
|
|
"thursday",
|
|
|
|
"friday",
|
|
|
|
"saturday",
|
|
|
|
"sunday",
|
|
|
|
}
|
2020-12-17 13:39:29 +00:00
|
|
|
|
2020-08-12 00:36:09 +00:00
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
class TasksManager:
|
2021-03-22 04:02:18 +00:00
|
|
|
def __init__(self, controller):
|
|
|
|
self.controller = controller
|
|
|
|
self.tornado = Webserver(controller, self)
|
|
|
|
|
2022-01-19 19:43:34 +00:00
|
|
|
self.tz = get_localzone()
|
|
|
|
self.scheduler = BackgroundScheduler(timezone=str(self.tz))
|
2022-01-11 01:11:52 +00:00
|
|
|
|
|
|
|
self.users_controller = Users_Controller()
|
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
self.webserver_thread = threading.Thread(
|
|
|
|
target=self.tornado.run_tornado, daemon=True, name="tornado_thread"
|
|
|
|
)
|
2020-08-12 00:36:09 +00:00
|
|
|
|
|
|
|
self.main_thread_exiting = False
|
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
self.schedule_thread = threading.Thread(
|
|
|
|
target=self.scheduler_thread, daemon=True, name="scheduler"
|
|
|
|
)
|
2020-08-17 02:47:53 +00:00
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
self.log_watcher_thread = threading.Thread(
|
|
|
|
target=self.log_watcher, daemon=True, name="log_watcher"
|
|
|
|
)
|
2021-01-20 15:20:42 +00:00
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
self.command_thread = threading.Thread(
|
|
|
|
target=self.command_watcher, daemon=True, name="command_watcher"
|
|
|
|
)
|
2020-08-31 17:46:25 +00:00
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
self.realtime_thread = threading.Thread(
|
|
|
|
target=self.realtime, daemon=True, name="realtime"
|
|
|
|
)
|
2021-03-22 04:02:18 +00:00
|
|
|
|
|
|
|
self.reload_schedule_from_db()
|
|
|
|
|
2020-08-12 00:36:09 +00:00
|
|
|
def get_main_thread_run_status(self):
|
|
|
|
return self.main_thread_exiting
|
|
|
|
|
2021-03-22 04:02:18 +00:00
|
|
|
def reload_schedule_from_db(self):
|
2021-09-08 22:01:10 +00:00
|
|
|
jobs = management_helper.get_schedules_enabled()
|
2022-01-12 22:29:45 +00:00
|
|
|
logger.info("Reload from DB called. Current enabled schedules: ")
|
|
|
|
for item in jobs:
|
2022-01-26 01:45:30 +00:00
|
|
|
logger.info(f"JOB: {item}")
|
2022-01-19 20:34:59 +00:00
|
|
|
|
2021-03-22 04:02:18 +00:00
|
|
|
def command_watcher(self):
|
2020-08-31 17:46:25 +00:00
|
|
|
while True:
|
|
|
|
# select any commands waiting to be processed
|
2021-09-08 22:01:10 +00:00
|
|
|
commands = management_helper.get_unactioned_commands()
|
2020-08-31 20:16:45 +00:00
|
|
|
for c in commands:
|
2022-01-18 19:43:22 +00:00
|
|
|
try:
|
|
|
|
svr = self.controller.get_server_obj(c.server_id)
|
|
|
|
except:
|
2022-03-23 02:50:12 +00:00
|
|
|
logger.error(
|
2022-03-23 06:06:13 +00:00
|
|
|
"Server value requested does note exist! "
|
|
|
|
"Purging item from waiting commands."
|
2022-03-23 02:50:12 +00:00
|
|
|
)
|
2022-01-18 19:43:22 +00:00
|
|
|
management_helper.mark_command_complete(c.command_id)
|
2022-01-26 01:45:30 +00:00
|
|
|
|
2022-01-18 19:43:22 +00:00
|
|
|
user_id = c.user_id
|
|
|
|
command = c.command
|
2020-08-31 20:16:45 +00:00
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
if command == "start_server":
|
2021-11-27 22:10:43 +00:00
|
|
|
svr.run_threaded_server(user_id)
|
2020-08-31 20:16:45 +00:00
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
elif command == "stop_server":
|
2020-08-31 20:16:45 +00:00
|
|
|
svr.stop_threaded_server()
|
|
|
|
|
|
|
|
elif command == "restart_server":
|
2021-11-27 22:10:43 +00:00
|
|
|
svr.restart_threaded_server(user_id)
|
2020-08-31 20:16:45 +00:00
|
|
|
|
2021-03-22 04:02:18 +00:00
|
|
|
elif command == "backup_server":
|
|
|
|
svr.backup_server()
|
|
|
|
|
2021-07-25 01:09:39 +00:00
|
|
|
elif command == "update_executable":
|
2021-11-20 17:25:14 +00:00
|
|
|
svr.jar_update()
|
2022-01-11 05:26:33 +00:00
|
|
|
else:
|
|
|
|
svr.send_command(command)
|
2022-01-18 19:43:22 +00:00
|
|
|
management_helper.mark_command_complete(c.command_id)
|
2020-08-31 20:16:45 +00:00
|
|
|
|
2020-08-31 17:46:25 +00:00
|
|
|
time.sleep(1)
|
|
|
|
|
2020-08-12 00:36:09 +00:00
|
|
|
def _main_graceful_exit(self):
|
2020-08-17 02:47:53 +00:00
|
|
|
try:
|
|
|
|
os.remove(helper.session_file)
|
2021-03-22 04:02:18 +00:00
|
|
|
self.controller.stop_all_servers()
|
2020-08-17 02:47:53 +00:00
|
|
|
except:
|
2021-03-13 15:24:17 +00:00
|
|
|
logger.info("Caught error during shutdown", exc_info=True)
|
2020-08-19 01:04:43 +00:00
|
|
|
|
|
|
|
logger.info("***** Crafty Shutting Down *****\n\n")
|
|
|
|
console.info("***** Crafty Shutting Down *****\n\n")
|
2020-08-12 00:36:09 +00:00
|
|
|
self.main_thread_exiting = True
|
|
|
|
|
|
|
|
def start_webserver(self):
|
|
|
|
self.webserver_thread.start()
|
|
|
|
|
|
|
|
def reload_webserver(self):
|
|
|
|
self.tornado.stop_web_server()
|
|
|
|
console.info("Waiting 3 seconds")
|
|
|
|
time.sleep(3)
|
2022-03-23 02:50:12 +00:00
|
|
|
self.webserver_thread = threading.Thread(
|
|
|
|
target=self.tornado.run_tornado, daemon=True, name="tornado_thread"
|
|
|
|
)
|
2020-08-12 00:36:09 +00:00
|
|
|
self.start_webserver()
|
|
|
|
|
|
|
|
def stop_webserver(self):
|
|
|
|
self.tornado.stop_web_server()
|
|
|
|
|
2020-08-17 02:47:53 +00:00
|
|
|
def start_scheduler(self):
|
|
|
|
logger.info("Launching Scheduler Thread...")
|
|
|
|
console.info("Launching Scheduler Thread...")
|
|
|
|
self.schedule_thread.start()
|
2021-03-22 04:02:18 +00:00
|
|
|
logger.info("Launching command thread...")
|
|
|
|
console.info("Launching command thread...")
|
|
|
|
self.command_thread.start()
|
|
|
|
logger.info("Launching log watcher...")
|
|
|
|
console.info("Launching log watcher...")
|
|
|
|
self.log_watcher_thread.start()
|
|
|
|
logger.info("Launching realtime thread...")
|
|
|
|
console.info("Launching realtime thread...")
|
|
|
|
self.realtime_thread.start()
|
2020-08-17 02:47:53 +00:00
|
|
|
|
2022-01-11 01:11:52 +00:00
|
|
|
def scheduler_thread(self):
|
2022-01-11 05:26:33 +00:00
|
|
|
schedules = management_helper.get_schedules_enabled()
|
2022-01-11 06:29:27 +00:00
|
|
|
self.scheduler.add_listener(self.schedule_watcher, mask=EVENT_JOB_EXECUTED)
|
2022-03-23 06:06:13 +00:00
|
|
|
# self.scheduler.add_job(
|
|
|
|
# self.scheduler.print_jobs, "interval", seconds=10, id="-1"
|
|
|
|
# )
|
2022-01-19 19:43:34 +00:00
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
# load schedules from DB
|
2022-01-11 05:26:33 +00:00
|
|
|
for schedule in schedules:
|
2022-03-23 02:50:12 +00:00
|
|
|
if schedule.interval != "reaction":
|
2022-02-24 03:58:48 +00:00
|
|
|
if schedule.cron_string != "":
|
|
|
|
try:
|
2022-03-23 02:50:12 +00:00
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
CronTrigger.from_crontab(
|
|
|
|
schedule.cron_string, timezone=str(self.tz)
|
|
|
|
),
|
|
|
|
id=str(schedule.schedule_id),
|
|
|
|
args=[
|
|
|
|
schedule.server_id,
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
schedule.command,
|
|
|
|
],
|
|
|
|
)
|
2022-02-24 03:58:48 +00:00
|
|
|
except Exception as e:
|
|
|
|
console.error(f"Failed to schedule task with error: {e}.")
|
|
|
|
console.warning("Removing failed task from DB.")
|
|
|
|
logger.error(f"Failed to schedule task with error: {e}.")
|
|
|
|
logger.warning("Removing failed task from DB.")
|
2022-03-23 02:50:12 +00:00
|
|
|
# remove items from DB if task fails to add to apscheduler
|
2022-02-24 03:58:48 +00:00
|
|
|
management_helper.delete_scheduled_task(schedule.schedule_id)
|
|
|
|
else:
|
2022-03-23 02:50:12 +00:00
|
|
|
if schedule.interval_type == "hours":
|
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
"cron",
|
|
|
|
minute=0,
|
|
|
|
hour="*/" + str(schedule.interval),
|
|
|
|
id=str(schedule.schedule_id),
|
|
|
|
args=[
|
|
|
|
schedule.server_id,
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
schedule.command,
|
|
|
|
],
|
|
|
|
)
|
|
|
|
elif schedule.interval_type == "minutes":
|
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
"cron",
|
|
|
|
minute="*/" + str(schedule.interval),
|
|
|
|
id=str(schedule.schedule_id),
|
|
|
|
args=[
|
|
|
|
schedule.server_id,
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
schedule.command,
|
|
|
|
],
|
|
|
|
)
|
|
|
|
elif schedule.interval_type == "days":
|
|
|
|
curr_time = schedule.start_time.split(":")
|
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
"cron",
|
|
|
|
day="*/" + str(schedule.interval),
|
|
|
|
hour=curr_time[0],
|
|
|
|
minute=curr_time[1],
|
|
|
|
id=str(schedule.schedule_id),
|
|
|
|
args=[
|
|
|
|
schedule.server_id,
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
schedule.command,
|
|
|
|
],
|
|
|
|
)
|
2022-01-11 01:11:52 +00:00
|
|
|
self.scheduler.start()
|
2022-01-12 21:09:38 +00:00
|
|
|
jobs = self.scheduler.get_jobs()
|
2022-01-12 22:29:45 +00:00
|
|
|
logger.info("Loaded schedules. Current enabled schedules: ")
|
2022-01-12 21:09:38 +00:00
|
|
|
for item in jobs:
|
2022-01-26 01:45:30 +00:00
|
|
|
logger.info(f"JOB: {item}")
|
2022-01-11 01:11:52 +00:00
|
|
|
|
|
|
|
def schedule_job(self, job_data):
|
2022-01-26 01:45:30 +00:00
|
|
|
sch_id = management_helper.create_scheduled_task(
|
2022-03-23 02:50:12 +00:00
|
|
|
job_data["server_id"],
|
|
|
|
job_data["action"],
|
|
|
|
job_data["interval"],
|
|
|
|
job_data["interval_type"],
|
|
|
|
job_data["start_time"],
|
|
|
|
job_data["command"],
|
2022-01-26 01:45:30 +00:00
|
|
|
"None",
|
2022-03-23 02:50:12 +00:00
|
|
|
job_data["enabled"],
|
|
|
|
job_data["one_time"],
|
|
|
|
job_data["cron_string"],
|
|
|
|
job_data["parent"],
|
|
|
|
job_data["delay"],
|
|
|
|
)
|
2022-03-23 06:06:13 +00:00
|
|
|
# Checks to make sure some doofus didn't actually make the newly
|
|
|
|
# created task a child of itself.
|
2022-03-23 02:50:12 +00:00
|
|
|
if str(job_data["parent"]) == str(sch_id):
|
|
|
|
management_helper.update_scheduled_task(sch_id, {"parent": None})
|
|
|
|
# Check to see if it's enabled and is not a chain reaction.
|
|
|
|
if job_data["enabled"] and job_data["interval_type"] != "reaction":
|
|
|
|
if job_data["cron_string"] != "":
|
2022-01-11 22:41:46 +00:00
|
|
|
try:
|
2022-03-23 02:50:12 +00:00
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
CronTrigger.from_crontab(
|
|
|
|
job_data["cron_string"], timezone=str(self.tz)
|
|
|
|
),
|
|
|
|
id=str(sch_id),
|
|
|
|
args=[
|
|
|
|
job_data["server_id"],
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
job_data["command"],
|
|
|
|
],
|
|
|
|
)
|
2022-01-11 22:41:46 +00:00
|
|
|
except Exception as e:
|
2022-01-26 01:45:30 +00:00
|
|
|
console.error(f"Failed to schedule task with error: {e}.")
|
2022-01-19 18:07:26 +00:00
|
|
|
console.warning("Removing failed task from DB.")
|
2022-01-26 01:45:30 +00:00
|
|
|
logger.error(f"Failed to schedule task with error: {e}.")
|
2022-01-19 19:43:34 +00:00
|
|
|
logger.warning("Removing failed task from DB.")
|
2022-03-23 02:50:12 +00:00
|
|
|
# remove items from DB if task fails to add to apscheduler
|
2022-01-11 22:41:46 +00:00
|
|
|
management_helper.delete_scheduled_task(sch_id)
|
2022-01-11 17:17:57 +00:00
|
|
|
else:
|
2022-03-23 02:50:12 +00:00
|
|
|
if job_data["interval_type"] == "hours":
|
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
"cron",
|
|
|
|
minute=0,
|
|
|
|
hour="*/" + str(job_data["interval"]),
|
|
|
|
id=str(sch_id),
|
|
|
|
args=[
|
|
|
|
job_data["server_id"],
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
job_data["command"],
|
|
|
|
],
|
|
|
|
)
|
|
|
|
elif job_data["interval_type"] == "minutes":
|
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
"cron",
|
|
|
|
minute="*/" + str(job_data["interval"]),
|
|
|
|
id=str(sch_id),
|
|
|
|
args=[
|
|
|
|
job_data["server_id"],
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
job_data["command"],
|
|
|
|
],
|
|
|
|
)
|
|
|
|
elif job_data["interval_type"] == "days":
|
|
|
|
curr_time = job_data["start_time"].split(":")
|
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
"cron",
|
|
|
|
day="*/" + str(job_data["interval"]),
|
|
|
|
hour=curr_time[0],
|
|
|
|
minute=curr_time[1],
|
|
|
|
id=str(sch_id),
|
|
|
|
args=[
|
|
|
|
job_data["server_id"],
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
job_data["command"],
|
|
|
|
],
|
|
|
|
)
|
2022-01-12 22:29:45 +00:00
|
|
|
logger.info("Added job. Current enabled schedules: ")
|
|
|
|
jobs = self.scheduler.get_jobs()
|
|
|
|
for item in jobs:
|
2022-01-26 01:45:30 +00:00
|
|
|
logger.info(f"JOB: {item}")
|
2022-01-11 01:11:52 +00:00
|
|
|
|
2022-01-15 04:53:44 +00:00
|
|
|
def remove_all_server_tasks(self, server_id):
|
|
|
|
schedules = management_helper.get_schedules_by_server(server_id)
|
|
|
|
for schedule in schedules:
|
2022-03-23 02:50:12 +00:00
|
|
|
if schedule.interval != "reaction":
|
2022-02-24 03:58:48 +00:00
|
|
|
self.remove_job(schedule.schedule_id)
|
2022-01-15 04:53:44 +00:00
|
|
|
|
2022-01-11 01:11:52 +00:00
|
|
|
def remove_job(self, sch_id):
|
2022-01-13 05:30:35 +00:00
|
|
|
job = management_helper.get_scheduled_task_model(sch_id)
|
2022-02-24 05:19:54 +00:00
|
|
|
for schedule in management_helper.get_child_schedules(sch_id):
|
2022-03-23 02:50:12 +00:00
|
|
|
management_helper.update_scheduled_task(
|
|
|
|
schedule.schedule_id, {"parent": None}
|
|
|
|
)
|
2022-01-11 01:11:52 +00:00
|
|
|
management_helper.delete_scheduled_task(sch_id)
|
2022-03-23 02:50:12 +00:00
|
|
|
if job.enabled and job.interval_type != "reaction":
|
2022-01-13 05:30:35 +00:00
|
|
|
self.scheduler.remove_job(str(sch_id))
|
2022-01-26 01:45:30 +00:00
|
|
|
logger.info(f"Job with ID {sch_id} was deleted.")
|
2022-01-13 05:30:35 +00:00
|
|
|
else:
|
2022-03-23 02:50:12 +00:00
|
|
|
logger.info(
|
|
|
|
f"Job with ID {sch_id} was deleted from DB, but was not enabled."
|
2022-03-23 06:06:13 +00:00
|
|
|
f"Not going to try removing something "
|
|
|
|
f"that doesn't exist from active schedules."
|
2022-03-23 02:50:12 +00:00
|
|
|
)
|
2022-01-11 01:11:52 +00:00
|
|
|
|
2022-01-11 22:24:05 +00:00
|
|
|
def update_job(self, sch_id, job_data):
|
|
|
|
management_helper.update_scheduled_task(sch_id, job_data)
|
2022-03-23 06:06:13 +00:00
|
|
|
# Checks to make sure some doofus didn't actually make the newly
|
|
|
|
# created task a child of itself.
|
2022-03-23 02:50:12 +00:00
|
|
|
if str(job_data["parent"]) == str(sch_id):
|
|
|
|
management_helper.update_scheduled_task(sch_id, {"parent": None})
|
2022-01-12 00:30:00 +00:00
|
|
|
try:
|
2022-03-23 02:50:12 +00:00
|
|
|
if job_data["interval"] != "reaction":
|
2022-02-24 03:58:48 +00:00
|
|
|
self.scheduler.remove_job(str(sch_id))
|
2022-01-12 00:30:00 +00:00
|
|
|
except:
|
2022-03-23 02:50:12 +00:00
|
|
|
logger.info(
|
2022-03-23 06:06:13 +00:00
|
|
|
"No job found in update job. "
|
|
|
|
"Assuming it was previously disabled. Starting new job."
|
2022-03-23 02:50:12 +00:00
|
|
|
)
|
2022-01-26 01:45:30 +00:00
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
if job_data["enabled"]:
|
|
|
|
if job_data["interval"] != "reaction":
|
|
|
|
if job_data["cron_string"] != "":
|
2022-02-24 03:58:48 +00:00
|
|
|
try:
|
2022-03-23 02:50:12 +00:00
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
CronTrigger.from_crontab(
|
|
|
|
job_data["cron_string"], timezone=str(self.tz)
|
|
|
|
),
|
|
|
|
id=str(sch_id),
|
|
|
|
args=[
|
|
|
|
job_data["server_id"],
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
job_data["command"],
|
|
|
|
],
|
|
|
|
)
|
2022-02-24 03:58:48 +00:00
|
|
|
except Exception as e:
|
|
|
|
console.error(f"Failed to schedule task with error: {e}.")
|
|
|
|
console.info("Removing failed task from DB.")
|
|
|
|
management_helper.delete_scheduled_task(sch_id)
|
|
|
|
else:
|
2022-03-23 02:50:12 +00:00
|
|
|
if job_data["interval_type"] == "hours":
|
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
"cron",
|
|
|
|
minute=0,
|
|
|
|
hour="*/" + str(job_data["interval"]),
|
|
|
|
id=str(sch_id),
|
|
|
|
args=[
|
|
|
|
job_data["server_id"],
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
job_data["command"],
|
|
|
|
],
|
|
|
|
)
|
|
|
|
elif job_data["interval_type"] == "minutes":
|
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
"cron",
|
|
|
|
minute="*/" + str(job_data["interval"]),
|
|
|
|
id=str(sch_id),
|
|
|
|
args=[
|
|
|
|
job_data["server_id"],
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
job_data["command"],
|
|
|
|
],
|
|
|
|
)
|
|
|
|
elif job_data["interval_type"] == "days":
|
|
|
|
curr_time = job_data["start_time"].split(":")
|
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
"cron",
|
|
|
|
day="*/" + str(job_data["interval"]),
|
|
|
|
hour=curr_time[0],
|
|
|
|
minute=curr_time[1],
|
|
|
|
id=str(sch_id),
|
|
|
|
args=[
|
|
|
|
job_data["server_id"],
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
job_data["command"],
|
|
|
|
],
|
|
|
|
)
|
2022-01-11 22:24:05 +00:00
|
|
|
else:
|
|
|
|
try:
|
|
|
|
self.scheduler.get_job(str(sch_id))
|
|
|
|
self.scheduler.remove_job(str(sch_id))
|
|
|
|
except:
|
2022-03-23 02:50:12 +00:00
|
|
|
logger.info(
|
2022-03-23 06:06:13 +00:00
|
|
|
f"APScheduler found no scheduled job on schedule update for "
|
|
|
|
f"schedule with id: {sch_id} Assuming it was already disabled."
|
2022-03-23 02:50:12 +00:00
|
|
|
)
|
2022-01-11 01:11:52 +00:00
|
|
|
|
|
|
|
def schedule_watcher(self, event):
|
|
|
|
if not event.exception:
|
2022-01-12 22:29:45 +00:00
|
|
|
if str(event.job_id).isnumeric():
|
|
|
|
task = management_helper.get_scheduled_task_model(int(event.job_id))
|
2022-03-23 02:50:12 +00:00
|
|
|
management_helper.add_to_audit_log_raw(
|
|
|
|
"system",
|
|
|
|
users_helper.get_user_id_by_name("system"),
|
|
|
|
task.server_id,
|
|
|
|
f"Task with id {task.schedule_id} completed successfully",
|
|
|
|
"127.0.0.1",
|
|
|
|
)
|
|
|
|
# check if the task is a single run.
|
2022-01-12 22:29:45 +00:00
|
|
|
if task.one_time:
|
|
|
|
self.remove_job(task.schedule_id)
|
|
|
|
logger.info("one time task detected. Deleting...")
|
2022-03-23 06:06:13 +00:00
|
|
|
# check for any child tasks for this. It's kind of backward,
|
|
|
|
# but this makes DB management a lot easier. One to one
|
|
|
|
# instead of one to many.
|
2022-03-23 02:50:12 +00:00
|
|
|
for schedule in management_helper.get_child_schedules_by_server(
|
|
|
|
task.schedule_id, task.server_id
|
|
|
|
):
|
2022-03-23 06:06:13 +00:00
|
|
|
# event job ID's are strings so we need to look at
|
|
|
|
# this as the same data type.
|
2022-02-24 03:58:48 +00:00
|
|
|
if str(schedule.parent) == str(event.job_id):
|
|
|
|
if schedule.enabled:
|
2022-03-23 02:50:12 +00:00
|
|
|
delaytime = datetime.datetime.now() + datetime.timedelta(
|
|
|
|
seconds=schedule.delay
|
|
|
|
)
|
|
|
|
self.scheduler.add_job(
|
|
|
|
management_helper.add_command,
|
|
|
|
"date",
|
|
|
|
run_date=delaytime,
|
|
|
|
id=str(schedule.schedule_id),
|
|
|
|
args=[
|
|
|
|
schedule.server_id,
|
|
|
|
self.users_controller.get_id_by_name("system"),
|
|
|
|
"127.0.0.1",
|
|
|
|
schedule.command,
|
|
|
|
],
|
|
|
|
)
|
2022-01-12 22:29:45 +00:00
|
|
|
else:
|
2022-03-23 02:50:12 +00:00
|
|
|
logger.info(
|
2022-03-23 06:06:13 +00:00
|
|
|
"Event job ID is not numerical. Assuming it's stats "
|
|
|
|
"- not stored in DB. Moving on."
|
2022-03-23 02:50:12 +00:00
|
|
|
)
|
2022-01-11 06:29:27 +00:00
|
|
|
else:
|
2022-01-26 01:45:30 +00:00
|
|
|
logger.error(f"Task failed with error: {event.exception}")
|
2020-08-12 00:36:09 +00:00
|
|
|
|
2021-03-22 04:02:18 +00:00
|
|
|
def start_stats_recording(self):
|
2022-03-23 02:50:12 +00:00
|
|
|
stats_update_frequency = helper.get_setting("stats_update_frequency")
|
|
|
|
logger.info(
|
|
|
|
f"Stats collection frequency set to {stats_update_frequency} seconds"
|
|
|
|
)
|
|
|
|
console.info(
|
|
|
|
f"Stats collection frequency set to {stats_update_frequency} seconds"
|
|
|
|
)
|
2020-08-24 23:16:33 +00:00
|
|
|
|
2020-08-24 02:17:36 +00:00
|
|
|
# one for now,
|
2021-03-22 04:02:18 +00:00
|
|
|
self.controller.stats.record_stats()
|
2020-08-24 02:17:36 +00:00
|
|
|
# one for later
|
2022-03-23 02:50:12 +00:00
|
|
|
self.scheduler.add_job(
|
|
|
|
self.controller.stats.record_stats,
|
|
|
|
"interval",
|
|
|
|
seconds=stats_update_frequency,
|
|
|
|
id="stats",
|
|
|
|
)
|
2022-01-12 02:56:37 +00:00
|
|
|
|
|
|
|
def serverjar_cache_refresher(self):
|
2020-08-23 22:43:28 +00:00
|
|
|
logger.info("Refreshing serverjars.com cache on start")
|
|
|
|
server_jar_obj.refresh_cache()
|
|
|
|
|
|
|
|
logger.info("Scheduling Serverjars.com cache refresh service every 12 hours")
|
2022-03-23 02:50:12 +00:00
|
|
|
self.scheduler.add_job(
|
|
|
|
server_jar_obj.refresh_cache, "interval", hours=12, id="serverjars"
|
|
|
|
)
|
2020-08-23 22:43:28 +00:00
|
|
|
|
2022-01-19 20:34:59 +00:00
|
|
|
def realtime(self):
|
2021-02-26 15:39:35 +00:00
|
|
|
loop = asyncio.new_event_loop()
|
|
|
|
asyncio.set_event_loop(loop)
|
2021-03-01 00:54:20 +00:00
|
|
|
|
2021-09-08 22:01:10 +00:00
|
|
|
host_stats = management_helper.get_latest_hosts_stats()
|
2021-02-26 15:39:35 +00:00
|
|
|
|
|
|
|
while True:
|
|
|
|
|
2022-03-23 02:50:12 +00:00
|
|
|
if host_stats.get(
|
|
|
|
"cpu_usage"
|
|
|
|
) != management_helper.get_latest_hosts_stats().get(
|
|
|
|
"cpu_usage"
|
|
|
|
) or host_stats.get(
|
|
|
|
"mem_percent"
|
|
|
|
) != management_helper.get_latest_hosts_stats().get(
|
|
|
|
"mem_percent"
|
|
|
|
):
|
2021-02-26 15:39:35 +00:00
|
|
|
# Stats are different
|
|
|
|
|
2021-09-08 22:01:10 +00:00
|
|
|
host_stats = management_helper.get_latest_hosts_stats()
|
2021-02-26 15:39:35 +00:00
|
|
|
if len(websocket_helper.clients) > 0:
|
|
|
|
# There are clients
|
2022-03-23 02:50:12 +00:00
|
|
|
websocket_helper.broadcast_page(
|
|
|
|
"/panel/dashboard",
|
|
|
|
"update_host_stats",
|
|
|
|
{
|
|
|
|
"cpu_usage": host_stats.get("cpu_usage"),
|
|
|
|
"cpu_cores": host_stats.get("cpu_cores"),
|
|
|
|
"cpu_cur_freq": host_stats.get("cpu_cur_freq"),
|
|
|
|
"cpu_max_freq": host_stats.get("cpu_max_freq"),
|
|
|
|
"mem_percent": host_stats.get("mem_percent"),
|
|
|
|
"mem_usage": host_stats.get("mem_usage"),
|
|
|
|
},
|
|
|
|
)
|
2021-03-05 09:35:05 +00:00
|
|
|
|
2021-03-05 09:30:18 +00:00
|
|
|
def log_watcher(self):
|
2021-09-08 22:01:10 +00:00
|
|
|
self.controller.servers.check_for_old_logs()
|
2022-03-23 02:50:12 +00:00
|
|
|
self.scheduler.add_job(
|
|
|
|
self.controller.servers.check_for_old_logs,
|
|
|
|
"interval",
|
|
|
|
hours=6,
|
|
|
|
id="log-mgmt",
|
|
|
|
)
|