306 lines
7.6 KiB
Python
306 lines
7.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
@File : monitor_api.py
|
|
@Date : 2024-01-28
|
|
@Author : Peng Shiyu
|
|
"""
|
|
import json
|
|
from datetime import datetime, timedelta
|
|
|
|
from flask import request, g
|
|
from peewee import SQL, fn
|
|
from playhouse.shortcuts import model_to_dict
|
|
|
|
from domain_admin.enums.monitor_type_enum import MonitorTypeEnum
|
|
from domain_admin.enums.operation_enum import OperationEnum
|
|
from domain_admin.enums.role_enum import RoleEnum
|
|
from domain_admin.enums.time_unit_enum import TimeUnitEnum
|
|
from domain_admin.model.log_monitor_model import LogMonitorModel
|
|
from domain_admin.model.monitor_model import MonitorModel
|
|
from domain_admin.service import monitor_service, file_service, async_task_service, operation_service, auth_service
|
|
from domain_admin.service.scheduler_service import scheduler_main
|
|
from domain_admin.utils.flask_ext.app_exception import DataNotFoundAppException
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def add_monitor():
|
|
"""
|
|
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
title = request.json['title']
|
|
monitor_type = request.json['monitor_type']
|
|
allow_error_count = request.json.get('allow_error_count') or 0
|
|
content = request.json['content']
|
|
interval = request.json['interval']
|
|
interval_unit = request.json.get('interval_unit', TimeUnitEnum.Minute)
|
|
|
|
monitor_row = MonitorModel.create(
|
|
user_id=current_user_id,
|
|
title=title,
|
|
allow_error_count=allow_error_count,
|
|
monitor_type=monitor_type,
|
|
content=json.dumps(content),
|
|
interval=interval,
|
|
interval_unit=interval_unit
|
|
)
|
|
|
|
scheduler_main.run_one_monitor_task(MonitorModel.get_by_id(monitor_row.id))
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def update_monitor_by_id():
|
|
"""
|
|
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
|
|
monitor_id = request.json['monitor_id']
|
|
title = request.json['title']
|
|
content = request.json['content']
|
|
interval = request.json['interval']
|
|
allow_error_count = request.json.get('allow_error_count') or 0
|
|
interval_unit = request.json.get('interval_unit', TimeUnitEnum.Minute)
|
|
|
|
monitor_row = MonitorModel.select().where(
|
|
MonitorModel.id == monitor_id,
|
|
MonitorModel.user_id == current_user_id
|
|
).first()
|
|
|
|
if not monitor_row:
|
|
raise DataNotFoundAppException()
|
|
|
|
MonitorModel.update(
|
|
title=title,
|
|
content=json.dumps(content),
|
|
interval=interval,
|
|
interval_unit=interval_unit,
|
|
allow_error_count=allow_error_count,
|
|
).where(
|
|
MonitorModel.id == monitor_id
|
|
).execute()
|
|
|
|
scheduler_main.run_one_monitor_task(MonitorModel.get_by_id(monitor_id))
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def update_monitor_active():
|
|
"""
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
|
|
monitor_id = request.json['monitor_id']
|
|
is_active = request.json['is_active']
|
|
|
|
if is_active:
|
|
next_run_time = datetime.now()
|
|
else:
|
|
next_run_time = None
|
|
|
|
# data check
|
|
monitor_row = MonitorModel.select().where(
|
|
MonitorModel.id == monitor_id,
|
|
MonitorModel.user_id == current_user_id
|
|
).first()
|
|
|
|
if not monitor_row:
|
|
raise DataNotFoundAppException()
|
|
|
|
MonitorModel.update(
|
|
is_active=is_active,
|
|
next_run_time=next_run_time
|
|
).where(
|
|
MonitorModel.id == monitor_row.id
|
|
).execute()
|
|
|
|
if is_active:
|
|
scheduler_main.run_one_monitor_task(MonitorModel.get_by_id(monitor_id))
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def remove_monitor_by_id():
|
|
"""
|
|
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
|
|
monitor_id = request.json['monitor_id']
|
|
|
|
# data check
|
|
monitor_row = MonitorModel.select().where(
|
|
MonitorModel.id == monitor_id,
|
|
MonitorModel.user_id == current_user_id
|
|
).first()
|
|
|
|
if not monitor_row:
|
|
raise DataNotFoundAppException()
|
|
|
|
MonitorModel.delete_by_id(monitor_row.id)
|
|
|
|
# remote log
|
|
LogMonitorModel.delete().where(
|
|
LogMonitorModel.monitor_id == monitor_row.id,
|
|
LogMonitorModel.monitor_type == MonitorTypeEnum.HTTP
|
|
).execute()
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
@operation_service.operation_log_decorator(
|
|
model=MonitorModel,
|
|
operation_type_id=OperationEnum.BATCH_DELETE,
|
|
primary_key='monitor_ids'
|
|
)
|
|
def delete_monitor_by_ids():
|
|
"""
|
|
批量删除
|
|
@since v1.6.12
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
|
|
monitor_ids = request.json['monitor_ids']
|
|
|
|
MonitorModel.delete().where(
|
|
MonitorModel.id.in_(monitor_ids),
|
|
MonitorModel.user_id == current_user_id
|
|
).execute()
|
|
|
|
# remote log
|
|
LogMonitorModel.delete().where(
|
|
LogMonitorModel.monitor_id.in_(monitor_ids),
|
|
LogMonitorModel.monitor_type == MonitorTypeEnum.HTTP
|
|
).execute()
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def get_monitor_by_id():
|
|
"""
|
|
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
|
|
monitor_id = request.json['monitor_id']
|
|
|
|
# data check
|
|
monitor_row = MonitorModel.select().where(
|
|
MonitorModel.id == monitor_id,
|
|
MonitorModel.user_id == current_user_id
|
|
).first()
|
|
|
|
if not monitor_row:
|
|
raise DataNotFoundAppException()
|
|
|
|
return monitor_row.to_dict()
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def get_monitor_list():
|
|
"""
|
|
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
|
|
page = request.json.get('page', 1)
|
|
size = request.json.get('size', 10)
|
|
order_prop = request.json.get('order_prop') or 'create_time'
|
|
order_type = request.json.get('order_type') or 'desc'
|
|
keyword = request.json.get('keyword')
|
|
status = request.json.get('status')
|
|
|
|
query = MonitorModel.select().where(
|
|
MonitorModel.user_id == current_user_id
|
|
)
|
|
|
|
if keyword:
|
|
query = query.where(MonitorModel.title.contains(keyword))
|
|
|
|
if isinstance(status, int):
|
|
query = query.where(MonitorModel.status == status)
|
|
|
|
total = query.count()
|
|
|
|
lst = []
|
|
|
|
if total > 0:
|
|
ordering = [
|
|
SQL(f"`{order_prop}` {order_type}"),
|
|
MonitorModel.id.desc()
|
|
]
|
|
|
|
rows = query.order_by(*ordering).paginate(page, size)
|
|
|
|
lst = [row.to_dict() for row in rows]
|
|
|
|
monitor_service.load_monitor_log_count(lst)
|
|
|
|
return {
|
|
'list': lst,
|
|
'total': total
|
|
}
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def export_monitor_file():
|
|
"""
|
|
导出监控文件
|
|
csv格式
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
|
|
keyword = request.json.get('keyword')
|
|
status = request.json.get('status')
|
|
ext = request.json.get('ext', 'csv')
|
|
|
|
order_prop = request.json.get('order_prop') or 'create_time'
|
|
order_type = request.json.get('order_type') or 'desc'
|
|
|
|
params = {
|
|
'keyword': keyword,
|
|
'status': status,
|
|
'user_id': current_user_id,
|
|
}
|
|
|
|
query = monitor_service.get_monitor_list_query(**params)
|
|
|
|
ordering = [
|
|
SQL(f"`{order_prop}` {order_type}"),
|
|
MonitorModel.id.desc()
|
|
]
|
|
|
|
rows = query.order_by(*ordering)
|
|
|
|
lst = [row.to_dict() for row in rows]
|
|
|
|
filename = monitor_service.export_monitor_to_file(rows=lst, ext=ext)
|
|
|
|
return {
|
|
'name': filename,
|
|
'url': file_service.resolve_temp_url(filename)
|
|
}
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def import_monitor_from_file():
|
|
"""
|
|
从文件导入域名
|
|
支持 xlsx 和 csv格式
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
|
|
update_file = request.files.get('file')
|
|
|
|
filename = file_service.save_temp_file(update_file)
|
|
|
|
# 导入数据
|
|
monitor_service.import_monitor_from_file(filename, current_user_id)
|
|
|
|
# 异步查询
|
|
monitor_service.run_init_monitor_task_async(user_id=current_user_id)
|