summaryrefslogtreecommitdiff
path: root/server/apps/policy.py
blob: 93f0ca74999e78fc6332c7f846cb32c82b2b5ff1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# 策略生成与调整,效果评估模块
import random

from settings import *
from .util import da, is_ipaddress


# 初始策略创建,输入参数为期望策略类型、目标(IP或域名)以及任务编号
def init_task_policy(ptype, target, task):
    ip_version = is_ipaddress(target)
    # 非ip地址,默认为DoH域名
    if ip_version is None:
        # TODO:DoH处理
        res = da.get_data(data_type="target", search={""})
    # IPv4
    elif ip_version == 4:
        res = da.get_data(data_type="target", search={"ADDRv4": target})
    # IPv6
    elif ip_version == 6:
        res = da.get_data(data_type="target", search={"ADDRv6": target})
    else:
        exit(1)

    # 目标支持协议范围
    proto = []
    # 不存在该目标的相关记录
    # TODO:后续对该目标进行探测
    if len(res) == 0:
        proto = ["IPv6", "DOH", "DOT", "DNSSEC"]
    # 存在该目标的记录
    else:
        t = res[0]
        for k in ["IPv6", "DOH", "DOT", "DNSSEC"]:
            if t[k]:
                proto.append(k)

    # 可选策略范围 policy
    # 根据用户期望手段与目标协议寻找初始化策略
    # auto自动包含两类策略
    if ptype == "auto":
        policy = ["ddos", "sjqp"]
    # 否则仅支持用户选定的策略类型
    else:
        policy = [ptype]

    # 策略记录,将上述两个范围列表proto,policy中的值组合进sql语句中
    sql = """
    SELECT P_ID,P_NAME,P_EXE,P_PAYLOAD 
    FROM %s
    WHERE P_TYPE IN (%s) AND P_PROTO IN (%s)
    """ % (MYSQL_TAB_POLICY, "\'" + "\',\'".join(policy) + "\'", "\'" + "\',\'".join(proto) + "\'")
    da.cursor.execute(sql)
    policy_list = da.cursor.fetchall()
    # 随机选择一个作为初始策略
    first_policy = random.choice(policy_list)
    # 策略对应的执行文件路径
    p_exe = first_policy["P_EXE"]
    # 策略对应的初始参数
    p_param = first_policy["P_PAYLOAD"]

    task_policy_info = {"policy": first_policy["P_ID"], "param": p_param, "task": task, "tab": MYSQL_TAB_TASKPOLICY}

    # 记录该任务策略
    task_policy_sql = """
    INSERT INTO %(tab)s
    (POLICY,
    POLICY_PARAM,
    FOR_TASK)
    VALUES('%(policy)s', '%(param)s', '%(task)s')
    """ % task_policy_info

    # 获取任务策略的主键值
    da.cursor.execute(task_policy_sql)
    tp_id = da.conn.insert_id()
    da.conn.commit()

    return tp_id, p_exe, p_param