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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
from exts import db
from settings import *
import json
import datetime
class User(db.Model):
__tablename__ = MYSQL_TAB_USER
user_id = db.Column(db.String(255), primary_key=True, nullable=False)
user_name = db.Column(db.String(255))
created_by = db.Column(db.String(255))
created_time = db.Column(db.TIMESTAMP, server_default=db.func.now())
user_pwd_hash = db.Column(db.String(255))
user_group = db.Column(db.String(255))
class Task(db.Model):
__tablename__ = MYSQL_TAB_TASK
task_id = db.Column(db.String(255), primary_key=True, nullable=False)
task_name = db.Column(db.String(255))
agent_id = db.Column(db.String(255), db.ForeignKey(f'{MYSQL_TAB_AGENT}.agent_id'))
created_by = db.Column(db.String(255), db.ForeignKey(f'{MYSQL_TAB_USER}.user_id'))
target_ip = db.Column(db.String(255))
created_time = db.Column(db.DateTime, server_default=db.func.now())
policy = db.Column(db.Integer)
status = db.Column(db.String(255))
policy_delay = db.Column(db.String(255))
task_delay = db.Column(db.String(255))
target_scan = db.Column(db.String(255))
target_domain = db.Column(db.String(255))
target_rtype = db.Column(db.String(255))
target_rr = db.Column(db.String(255))
# Relationships
agent = db.relationship('Agent', backref='tasks')
user = db.relationship('User', backref='tasks')
class TaskLog(db.Model):
__tablename__ = MYSQL_TAB_TASK_LOG
tlog_id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False)
created_by_agent = db.Column(db.String(255), db.ForeignKey(f'{MYSQL_TAB_AGENT}.agent_id'))
created_time = db.Column(db.DateTime, server_default=db.func.now())
tlog_level = db.Column(db.String(255))
tlog_info = db.Column(db.String(255))
tlog_tp = db.Column(db.Integer, db.ForeignKey(f'{MYSQL_TAB_TASKPOLICY}.tp_id'))
# Relationships
agent = db.relationship('Agent', backref='task_logs')
task_policy = db.relationship('TaskPolicy', backref='task_logs')
class TaskPolicy(db.Model):
__tablename__ = MYSQL_TAB_TASKPOLICY
tp_id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False)
tp_time = db.Column(db.DateTime, server_default=db.func.now())
policy = db.Column(db.String(255), db.ForeignKey(f'{MYSQL_TAB_POLICY}.p_id'))
policy_param = db.Column(db.String(255))
for_task = db.Column(db.String(255), db.ForeignKey(f'{MYSQL_TAB_TASK}.task_id'))
# Relationships
policy_ref = db.relationship('Policy', backref='task_policies')
task = db.relationship('Task', backref='task_policies')
class Agent(db.Model):
__tablename__ = MYSQL_TAB_AGENT
agent_id = db.Column(db.String(255), primary_key=True, nullable=False)
ipaddr = db.Column(db.String(255))
start_time = db.Column(db.DateTime, server_default=db.func.now())
lat = db.Column(db.String(255))
lng = db.Column(db.String(255))
agent_type = db.Column(db.String(255))
sys = db.Column(db.String(255))
port = db.Column(db.Integer)
cpu_num = db.Column(db.Integer)
status = db.Column(db.Boolean)
mem = db.Column(db.String(255))
idle = db.Column(db.Boolean)
class Policy(db.Model):
__tablename__ = MYSQL_TAB_POLICY
p_id = db.Column(db.String(255), primary_key=True, nullable=False)
p_exe = db.Column(db.String(255))
p_type = db.Column(db.String(255))
p_desc = db.Column(db.String(255))
p_payload = db.Column(db.String(255))
p_name = db.Column(db.String(255))
p_proto = db.Column(db.String(255))
class Syslog(db.Model):
__tablename__ = MYSQL_TAB_SYSLOG
log_id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False)
log_level = db.Column(db.String(255))
log_info = db.Column(db.String(255))
log_time = db.Column(db.DateTime, server_default=db.func.now())
s_ip = db.Column(db.String(255))
user_id = db.Column(db.String(255), db.ForeignKey(f'{MYSQL_TAB_USER}.user_id'))
# Relationships
user = db.relationship('User', backref='syslogs')
class Target(db.Model):
__tablename__ = MYSQL_TAB_TARGETDATA
target_id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False)
addrv4 = db.Column(db.String(255))
addrv6 = db.Column(db.String(255))
ipv6 = db.Column(db.Boolean)
dnssec = db.Column(db.Boolean)
dot = db.Column(db.Boolean)
doh = db.Column(db.Boolean)
cou = db.Column(db.String(255))
isp = db.Column(db.String(255))
lat = db.Column(db.String(255))
lng = db.Column(db.String(255))
updated_time = db.Column(db.DateTime, server_default=db.func.now())
protect = db.Column(db.String(255))
doh_domain = db.Column(db.String(255))
# 对单个模型操作
def model_to_dict(model, fields=None, exchange_fields=None):
"""
将Flask SQLAlchemy的模型对象转换为字典类型
:param: model : 模型对象
:param: fields : 需要获取的字段列表,默认为 None,获取全部字段
:param: exchange_fields : 需要替换名字的字段,{'数据库字段':'前端展示字段'},有些数据库字段名在展示时需要修改成前端需要的名字
:return: 返回字典类型
"""
# 传递空值时
if not model:
return {}
if fields is None:
# 获取所有列名
columns = [column.name for column in model.__table__.columns]
# 排除掉relationships 设置的反向查询字段
relations = getattr(model.__class__, '__mapper__').relationships
exclude_cols = [rel.key for rel in relations]
# print(exclude_cols,'要剔除的反向查询字段')
# 拿到所有列名-排除的列名
cols = set(columns) - set(exclude_cols)
fields = list(cols)
obj_dict = {}
for field in fields:
if field not in model.__dict__:
continue
value = model.__dict__[field]
# 1、对时间字段进行操作
if isinstance(value, datetime.datetime):
# 字段类型是datetime的,格式化
value = value.strftime('%Y-%m-%d %H:%M:%S')
if isinstance(value, datetime.date):
# 字段类型是date的,格式化
value = value.strftime('%Y-%m-%d')
# 2、将所有可以进行反序列化的进行反序列化(将json字符串转成python结构数据类型)
if isinstance(value, str):
try:
value = json.loads(value)
except Exception as _:
pass
#3、替换展示的字段
if type(exchange_fields) == dict:
for db_field, show_field in exchange_fields.items():
#db_field 是数据库字段,show_field是展示字段名
if field == db_field:
field = show_field
obj_dict[field] = value
return obj_dict
#对数据集操作
def model_to_dict_list(queryset, fields=None, exchange_fields=None):
#1、空对象操作
if not queryset:
return []
#2、数据类型控制
first = queryset[0]
#3、循环操作
ret = []
for obj in queryset:
dic = model_to_dict(obj, fields=fields, exchange_fields=exchange_fields)
ret.append(dic)
return ret
|