MikroWizard.mikroman/py/task_run.py

102 lines
2.8 KiB
Python
Raw Normal View History

import re
from flask import request, jsonify, g
from playhouse.shortcuts import dict_to_model, update_model_from_dict
import os
os.environ["PYSRV_CONFIG_PATH"] = "/conf/server-conf.json"
import sys
# from libs.db import db_device
# from libs.db import db_groups
# from libs.db import db_tasks
from libs import util
from libs.db import db_user_tasks
from libs.webutil import app, login_required, get_myself,buildResponse
from functools import reduce
import logging
from cron_descriptor import get_description
import queue
from threading import Thread
try:
from libs import utilpro
ISPRO=True
except ImportError:
ISPRO=False
pass
log = logging.getLogger("api.usertasks")
def backup_devs(devices):
num_threads = len(devices)
q = queue.Queue()
threads = []
for dev in devices:
t = Thread(target=util.backup_routers, args=(dev, q))
t.start()
threads.append(t)
for t in threads:
t.join()
res=[]
for _ in range(num_threads):
qres=q.get()
if not qres['state']:
util.log_alert('backup',dev,'Backup failed')
res.append(qres)
return res
def run_snippets(devices,snippet):
num_threads = len(devices)
q = queue.Queue()
threads = []
for dev in devices:
t = Thread(target=util.run_snippets, args=(dev, snippet, q))
t.start()
threads.append(t)
for t in threads:
t.join()
res=[]
for _ in range(num_threads):
qres=q.get()
if 'result' in qres and not qres['result']:
util.log_alert('run_snippet', dev, 'Run Snippet failed')
res.append(qres)
return res
if __name__ == '__main__':
# quick adhoc tests
logging.basicConfig(level=logging.DEBUG)
taksid=sys.argv[1]
#check if taskid is int
if not taksid.isdigit():
print("Wrong Task ID")
exit()
utask=db_user_tasks.UserTasks.get_utask_by_id(taksid)
if not utask:
log.error("No task with this id {}".format(taksid))
exit()
#Get user task from db by id
devices=[]
devices=db_user_tasks.get_task_devices(utask)
if utask.task_type == "backup":
log.error("TASK TYPE BACKUP")
res=backup_devs(devices=devices)
elif utask.task_type == "snippet":
log.error("TASK TYPE SNIPPET")
snippet=utask.snippetid.content
if not snippet:
log.error("no snippet")
else:
res=run_snippets(devices=devices, snippet=snippet)
elif utask.task_type == "firmware":
log.error("firmware update")
if not ISPRO:
exit()
res=utilpro.run_firmware_task(utask)
elif utask.task_type == "vault":
log.error("vault")
if not ISPRO:
exit()
res=utilpro.run_vault_task(utask)
#log.error(res)
#[{'id': 3, 'state': False}, {'id': 1, 'state': False}, {'id': 2, 'state': True}]