diff --git a/py/api/api_backups.py b/py/api/api_backups.py index 32eed3d..3d1a0f6 100644 --- a/py/api/api_backups.py +++ b/py/api/api_backups.py @@ -5,15 +5,23 @@ # MikroWizard.com , Mikrotik router management solution # Author: sepehr.ha@gmail.com -from flask import request, jsonify +from flask import request, jsonify,session -from libs.db import db_tasks,db_backups,db_device,db_syslog +from libs.db import db_tasks,db_backups,db_device,db_syslog,db_user_group_perm from libs import util from libs.webutil import app, login_required,buildResponse,get_myself,get_ip,get_agent import bgtasks import logging import json - +import datetime +from functools import reduce +import operator +try: + from libs import utilpro + ISPRO=True +except ImportError: + ISPRO=False + pass log = logging.getLogger("api.firmware") @app.route('/api/backup/make', methods = ['POST']) @@ -39,12 +47,52 @@ def backup_create(): @login_required(role='admin',perm={'backup':'read'}) def backup_list(): input = request.json - page = input.get('page') + event_start_time=input.get('start_time',False) + event_end_time=input.get('end_time',False) devid = input.get('devid',False) - size = input.get('size') search = input.get('search') - backups = db_backups.query_backup_jobs(page, size, search,devid=devid) + uid = session.get("userid") or False + if not devid: + devs=list(db_user_group_perm.DevUserGroupPermRel.get_user_devices(uid)) + dev_ids=[dev.id for dev in devs] + else: + dev=db_device.get_device(devid) + if not dev: + return buildResponse({'status': 'failed'}, 200, error="Wrong Data") + dev_ids=[devid] + backups = db_backups.Backups + log.error("1") + clauses = [] + clauses.append(backups.devid << dev_ids) + if event_start_time: + event_start_time=event_start_time.split(".000Z")[0] + event_start_time=datetime.datetime.strptime(event_start_time, "%Y-%m-%dT%H:%M:%S") + clauses.append(backups.created >= event_start_time) + else: + clauses.append(backups.created >= datetime.datetime.now()-datetime.timedelta(days=1)) + if event_end_time: + event_end_time=event_end_time.split(".000Z")[0] + event_end_time=datetime.datetime.strptime(event_end_time, "%Y-%m-%dT%H:%M:%S") + clauses.append(backups.created <= event_end_time) + else: + clauses.append(backups.created <= datetime.datetime.now()) + expr="" + devs=db_device.Devices + try: + if len(clauses): + expr = reduce(operator.and_, clauses) + query=backups.select().where(expr) + else: + query=backups.select() + query=query.order_by(backups.id.desc()) + backups=list(query) + except Exception as e: + log.error(e) + return buildResponse({"status":"failed", "err":str(e)}, 200) reply=[] + log.error("backups") + if search and ISPRO: + backups=utilpro.search_in_backups(search, backups) for back in backups: data={} if back.devid: @@ -70,10 +118,14 @@ def backup_list(): def backup_get(): input = request.json id=input.get('id') - back=db_backups.get_backup(id) - path=back.dir - with open(path, 'r') as file: - file_content = file.read() + try: + back=db_backups.get_backup(id) + path=back.dir + with open(path, 'r') as file: + file_content = file.read() + except Exception as e: + log.error(e) + return buildResponse({"status":"failed"}, 200) return buildResponse({"content":file_content}, 200) @app.route('/api/backup/status', methods = ['POST']) diff --git a/py/libs/db/db_backups.py b/py/libs/db/db_backups.py index c8ad737..9c4bb0f 100644 --- a/py/libs/db/db_backups.py +++ b/py/libs/db/db_backups.py @@ -36,9 +36,7 @@ def query_backup_jobs(page=0, limit=1000, search=None , devid=False): search = "%"+search+"%" q = q.where(Backups.dir ** search) if devid: - q = q.where(Backups.devid == devid) - start_time=datetime.datetime.now()-datetime.timedelta(days=3) - q = q.where(Backups.created >= start_time) + q = q.where(Backups.devid == devid) q = q.paginate(page, limit).order_by(Backups.id.desc()) return q