Files
2026-07-13 12:31:34 +08:00

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)