Merge branch 'fix/device-name-display'——选择设备与所有通知显示设备名(不再显示 IP)+ 修 /locate 500/XSS
This commit is contained in:
@@ -357,6 +357,53 @@ def _label(k):
|
||||
return _FIELD_LABELS.get(k, k)
|
||||
|
||||
|
||||
# ================== 设备名解析(让通知显示名字而不是 IP) ==================
|
||||
# 由装配层注册(web_server.py):`notifier.set_device_name_resolver(device_pool.name_of)`。
|
||||
# **刻意做成"纯内存回调"**:notify() 的红线是零 DB——不能为了取个名字去查库。
|
||||
# 快照由 device_pool 维护(启动/池子变动/每 60s 兜底刷新)。
|
||||
_device_name_fn = None
|
||||
|
||||
|
||||
def set_device_name_resolver(fn):
|
||||
"""注册 serial → 设备名 的解析器。必须是**纯内存**实现(不得查库/发请求)。"""
|
||||
global _device_name_fn
|
||||
_device_name_fn = fn
|
||||
|
||||
|
||||
def _dev_name(serial):
|
||||
"""尽力把地址解析成设备名;解析不到返回 ""(调用方保留原值)。"""
|
||||
if not serial or _device_name_fn is None:
|
||||
return ""
|
||||
try:
|
||||
return str(_device_name_fn(str(serial)) or "")
|
||||
except Exception:
|
||||
return ""
|
||||
|
||||
|
||||
def fill_device_names(fields):
|
||||
"""把 fields 里的设备地址补成设备名(**原地改**,返回同一个 dict)。
|
||||
|
||||
两类字段:
|
||||
· `serial` → 补 `device_name`(原来没填才补)——标题主体、字段表、
|
||||
聚合样本认的都是 `device_name`,补上这一处就全带名字了;
|
||||
· `serials` / `devices`(多设备事件,如设备断联)→ 逐项换成名字,
|
||||
通知里不该出现一串 IP。
|
||||
查不到名字(设备没命名 / 已不在池里)就**保留原值**,绝不把内容弄丢。
|
||||
"""
|
||||
if not isinstance(fields, dict):
|
||||
return fields
|
||||
s = fields.get("serial")
|
||||
if s and not fields.get("device_name"):
|
||||
n = _dev_name(s)
|
||||
if n:
|
||||
fields["device_name"] = n
|
||||
for k in ("serials", "devices"):
|
||||
v = fields.get(k)
|
||||
if isinstance(v, (list, tuple)) and v:
|
||||
fields[k] = [_dev_name(x) or x for x in v]
|
||||
return fields
|
||||
|
||||
|
||||
def _subject(ev, fields):
|
||||
"""标题主体:**用户自己写的 title 优先**,其次任务名,再次设备名/serial。"""
|
||||
if fields.get("title"):
|
||||
@@ -374,6 +421,7 @@ def _subject(ev, fields):
|
||||
def build_message(ev, fields, hook=None):
|
||||
"""把事件渲染成统一消息体(title/summary/fields/level/markdown)。"""
|
||||
fields = dict(fields or {})
|
||||
fill_device_names(fields) # 同 notify():预览/测试发送也要显示设备名
|
||||
merged = fields.pop("_merged", None)
|
||||
level = _level_of(ev.key, fields)
|
||||
subj = _subject(ev, fields)
|
||||
@@ -1008,6 +1056,7 @@ def notify(event, **fields):
|
||||
for p in h["events"])]
|
||||
if not hooks:
|
||||
return
|
||||
fill_device_names(fields) # 地址 → 设备名(纯内存快照,不查库)
|
||||
for h in hooks:
|
||||
keys = tuple(str(fields.get(k, "")) for k in (ev.agg_key or ()))
|
||||
# 聚合窗口:事件自己声明「立即发」(agg_window=0,低频高危事件,如批次结束 /
|
||||
|
||||
Reference in New Issue
Block a user