summaryrefslogtreecommitdiff
path: root/agent/app.py
blob: 784696bd5b4075acec815812e822a77a1c83abbc (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import argparse
import ipaddress
import os.path
import platform
import socket

import ipinfo
import psutil
import requests
import yaml
from apiflask import APIFlask

from apps.delay import bp as delaybp
from apps.script import bp as scriptbp

# 注册蓝图
app = APIFlask(__name__, template_folder='./static/templates')
app.register_blueprint(delaybp)
app.register_blueprint(scriptbp)
# 代理配置
config = {}
# 代理类型参数映射表
atype_map = {
    "gjst": "攻击渗透",
    "csgz": "参数感知",
    "ztgz": "状态感知"
}


@app.get('/')
@app.doc("获取测试页面")
def hello():
    return "这是一个正常的测试页面"


# 获取代理的部署环境信息
def nodeinfo():
    # IP地址
    # IPv4地址通过向主控端发包时在主控端获取,从而定位最准确的IPv4地址(公网、内网)
    # IPv6地址获取本地的所有公网地址
    v6addr = []
    addr6_info_list = socket.getaddrinfo(socket.gethostname(), None, socket.AF_INET6)
    for a in addr6_info_list:
        addr = ipaddress.ip_address(a[4][0])
        if addr.is_global:
            v6addr.append(a[4][0])

    # 经纬度
    # 使用ipinfo.io进行定位,调用token
    token = "40e1b13cf6b35a"
    handler = ipinfo.getHandler(token)
    details = handler.getDetails()
    # 获取经纬度
    latlng = str(details.loc).split(",")
    lat, lng = latlng[0], latlng[1]

    # CPU核心数
    cpu_num = psutil.cpu_count()

    # 内存信息
    ram_size = int(psutil.virtual_memory().total / (1024 * 1024 * 1024))
    ram_per = psutil.virtual_memory().percent

    # 操作系统
    system = platform.system()
    #
    return {'v6addr': v6addr, 'lat': lat, 'lng': lng, 'cpu_num': cpu_num, 'ram_size': ram_size, 'ram_per': ram_per,
            'sys': system}


# 注册代理
def registernode(proto="http", port=2525, atype="gjst", server="127.0.0.1:8888"):
    info = nodeinfo()
    info["port"] = port
    info["atype"] = atype_map[atype]
    print(info)
    r = requests.post(proto + "://" + server + "/agent/register", json=info)
    if r.status_code != 200:
        print(r.status_code)
        print("注册失败,请检查参数配置是否正确")
        return
    return r.json()['id']


if __name__ == '__main__':
    # 判断是否已存在配置文件
    if os.path.exists("config.yaml"):
        # 存在则读取配置文件信息
        with open("config.yaml", "r") as f:
            config = yaml.safe_load(f)
        app.run(host="0.0.0.0", port=config["port"], debug=True)
    else:
        # 不存在则解析命令行参数
        # 命令行参数设置
        parser = argparse.ArgumentParser()
        parser.add_argument("-p", "--port", type=int, default=2525, help="代理的开放通信端口")
        parser.add_argument("-t", "--atype", type=str, default="gjst",
                            help="代理的工作类型 {gjst(攻击渗透) / csgz(参数感知) / ztgz(状态感知)}")
        parser.add_argument("-s", "--server", type=str, default="127.0.0.1:8888", help="主控端访问地址+端口号")

        # 解析参数
        args = parser.parse_args()

        # 注册代理,并获取主控分配的代理编号
        id = registernode(port=args.port, server=args.server, atype=args.atype)
        config = {"id": id, "port": args.port, "atype": args.atype, "server": args.server}

        # 配置写入yaml文件存储
        with open('config.yaml', 'w') as f:
            yaml.dump(config, f)

        # 运行
        app.run(host="0.0.0.0", debug=True, port=config["port"])