Add snippet Execute,Better Task Results , fix some bugs

This commit is contained in:
sepehr 2024-07-28 18:56:56 +03:30
parent 733307de8d
commit 463161c291
7 changed files with 188 additions and 31 deletions

View file

@ -5,15 +5,16 @@
# MikroWizard.com , Mikrotik router management solution
# Author: sepehr.ha@gmail.com
from flask import request
from flask import request,session
from libs.db import db_user_tasks,db_syslog
from libs.db import db_user_tasks,db_syslog,db_tasks,db_sysconfig
from libs.webutil import app, login_required,buildResponse,get_myself,get_ip,get_agent
from functools import reduce
import bgtasks
import operator
import logging
import json
import datetime
log = logging.getLogger("api.snippet")
@app.route('/api/snippet/list', methods = ['POST'])
@ -95,4 +96,90 @@ def user_snippet_delete():
snippet=db_user_tasks.delete_snippet(id)
return buildResponse({"result":"success"}, 200)
else:
return buildResponse({"result":"failed","err":"Failed to delete snippet"}, 200)
return buildResponse({"result":"failed","err":"Failed to delete snippet"}, 200)
@app.route('/api/snippet/exec', methods = ['POST'])
@login_required(role='admin',perm={'task':'write'})
def exec_snippet():
"""crate user task"""
input = request.json
description=input.get('description',None)
snippetid=input.get('id',False)
members=input.get('members', False)
task_type=input.get('task_type',"backup")
selection_type=input.get('selection_type',False)
# taskdata=input.get('data',False)
utasks=db_user_tasks.UserTasks
# todo
# add owner check devids and dev groups with owner
if not description:
return buildResponse({'status': 'failed'},200,error="Wrong name/desc")
#check if cron is valid and correct
taskdata={}
taskdata['memebrs']=members
taskdata['owner']=members
snipet=db_user_tasks.get_snippet(snippetid)
if snipet:
taskdata['snippet']={'id':snipet.id,'code':snipet.content,'description':snipet.description,'name':snipet.name}
else:
return buildResponse({'status': 'failed'}, 200, error="Wrong snippet")
if selection_type not in ["devices","groups"]:
return buildResponse({'status': 'failed'}, 200, error="Wrong member type")
if task_type != 'snipet_exec':
return buildResponse({'status': 'failed'}, 200, error="Wrong task type")
try:
data={
'name':snipet.name,
'description':description,
'snippetid':int(snippetid),
'cron':None,
'desc_cron': None,
'action': 'snipet_exec',
'task_type':'snipet_exec',
'selection_type':selection_type,
'data':json.dumps(taskdata),
'created': datetime.datetime.now()
}
task=utasks.create(**data)
status=db_tasks.exec_snipet_status().status
uid = session.get("userid") or False
default_ip=db_sysconfig.get_sysconfig('default_ip')
if not uid:
return buildResponse({'result':'failed','err':"No User"}, 200)
if not status:
bgtasks.exec_snipet(task=task,default_ip=default_ip,devices=members,uid=uid)
res={'status': True}
else:
res={'status': status}
#add members to task
db_syslog.add_syslog_event(get_myself(), "Snippet","execute", get_ip(),get_agent(),json.dumps(input))
return buildResponse([{'status': 'success'}],200)
except Exception as e:
log.error(e)
return buildResponse({'status': 'failed','massage':str(e)},200)
@app.route('/api/snippet/executed', methods = ['POST'])
@login_required(role='admin',perm={'task':'write'})
def get_executed_snippet():
"""crate user task"""
input = request.json
id=input.get('id', False)
snipet=db_user_tasks.get_snippet(id)
if not snipet:
return buildResponse({'status': 'failed'}, 200, error="Wrong snippet")
utasks=db_user_tasks.UserTasks
tasks=utasks.select().where(utasks.snippetid==id).where(utasks.task_type=='snipet_exec')
taks_ids=[task.id for task in tasks]
task_res=db_tasks.TaskResults
executed_tasks=task_res.select().where(task_res.external_id<<taks_ids).order_by(task_res.id.desc())
executed_tasks=list(executed_tasks.dicts())
for task in executed_tasks:
task['result']=json.loads(task['result'])
task['info']=json.loads(task['info'])
if executed_tasks:
return buildResponse(executed_tasks, 200)
else:
return buildResponse({'status': 'failed'}, 200)