diff options
| author | handingkang <[email protected]> | 2024-05-30 14:00:54 +0800 |
|---|---|---|
| committer | handingkang <[email protected]> | 2024-05-30 14:00:54 +0800 |
| commit | 976f86584fbf663e613944f12b82522359772c8b (patch) | |
| tree | 2c3beb5486265a9a8b35621c5e5eb1b18412b0bd /server/apps/target.py | |
| parent | 6bc2600c7ad368d3b16b4921c90f0c4e8273a37f (diff) | |
1. (表格)目标信息获取接口重构,采用SQLAlchemy访问数据库
Diffstat (limited to 'server/apps/target.py')
| -rw-r--r-- | server/apps/target.py | 66 |
1 files changed, 40 insertions, 26 deletions
diff --git a/server/apps/target.py b/server/apps/target.py index a7460a7..c8fbefb 100644 --- a/server/apps/target.py +++ b/server/apps/target.py @@ -1,7 +1,9 @@ # 目标状态感知 # 时延测试接口 +import ipaddress import random import threading +from operator import or_ import requests from apiflask import APIBlueprint, Schema @@ -9,9 +11,13 @@ from apiflask.fields import Integer, String, List, Nested, IP, DateTime, Dict from apiflask.validators import OneOf from requests.exceptions import Timeout +from exts import db +from model import Target from settings import * from .util import da, fake +# from sqlalchemy import func + bp = APIBlueprint("目标信息及状态接口集合", __name__, url_prefix="/target") icmp_delaytable = {} @@ -29,7 +35,7 @@ target_map = { } -class Target(Schema): +class TargetSchema(Schema): ipv4 = String() ipv6 = String() protocol = List(String()) @@ -278,7 +284,7 @@ def record(query_data): }, location='query') @bp.output({ "code": Integer(), - "data": List(Nested(Target())), + "data": List(Nested(TargetSchema())), "total": Integer() }) def target_info(query_data): @@ -291,41 +297,49 @@ def target_info(query_data): # 目标信息列表 target_list = [] - + query = db.session.query(Target) # 普通检索,默认所有条件为单选 if ip is None: - # 无协议筛选 - if proto == None: - res = da.get_data(data_type="target", search={"proto": proto, "cou": cou, "isp": isp}, - offset=(page - 1) * per_page, limit=per_page) - res_count = da.count_data(data_type="target", search={"proto": proto, "cou": cou, "isp": isp}) - # 协议筛选,填入筛选的协议 - else: - res = da.get_data(data_type="target", search={proto: True, "cou": cou, "isp": isp}, - offset=(page - 1) * per_page, limit=per_page) - res_count = da.count_data(data_type="target", search={proto: True, "cou": cou, "isp": isp}) + # 分页查询 + res = query.filter( + or_(Target.ipv6 == True, proto != 'IPv6'), + or_(Target.dnssec == True, proto != 'DNSSEC'), + or_(Target.doh == True, proto != 'DoH'), + or_(Target.dot == True, proto != 'DoT'), + or_(Target.cou == cou, cou == None), + or_(Target.isp == isp, isp == None)).paginate(page=page, per_page=per_page) + # 查询总数 + res_count = res.total else: # 查询目标,根据v4、v6地址分类 - res = da.get_data(data_type="target", - search={"ADDRv4": ip} if "." in str(ip) else {"ADDRv6": ip}) - res_count = da.count_data(data_type="target", search={"ADDRv4": ip} if "." in str(ip) else {"ADDRv6": ip}) + res = query.filter( + or_(Target.addrv6 == ip, ipaddress.ip_address(ip).version != 6), + or_(Target.addrv4 == ip, ipaddress.ip_address(ip).version != 4)).all() + # 查询总数 + res_count = len(res) # 结果转换 for r in res: - target = {} + target = { + "ipv4": r.addrv4, + "ipv6": r.addrv6, + "cou": r.cou, + "isp": r.isp, + "lat": r.lat, + "lng": r.lng, + "time": r.updated_time + } + # 支持的协议特殊处理 protocol = [] - for k, v in r.items(): - # debug(k + ":" + str(v)) - if k in ["IPv6", "DNSSEC", "DOH", "DOT"] and bool(v) is True: + # 目标各协议支持情况 + proto_state = {"IPv6": r.ipv6, "DNSSEC": r.dnssec, "DoH": r.doh, "DoT": r.dot} + for k, v in proto_state.items(): + if bool(v) is True: protocol.append(k) target["protocol"] = protocol + # 防护措施特殊处理 - protect = str(r["PROTECT"]).split("|") - target["protect"] = protect - # 其他统一处理 - for k in target_map.keys(): - # 原数据的值赋给经过映射之后的键 - target[target_map[k]] = r[k] + target["protect"] = str(r.protect).split("|") target_list.append(target) return {"code": 200, "data": target_list, "total": res_count} |
