dns ui: keep defaults visible and apply active set workflow

This commit is contained in:
beckline
2026-02-22 19:52:47 +03:00
parent 0f88cfeeaa
commit 89eaaf3f23
2 changed files with 37 additions and 13 deletions

View File

@@ -69,7 +69,7 @@ class DNSBenchmarkDialog(QDialog):
hint = QLabel( hint = QLabel(
"One DNS per row. Checkbox means ACTIVE for resolver wave mode. " "One DNS per row. Checkbox means ACTIVE for resolver wave mode. "
"Benchmark checks all rows and shows health." "Benchmark checks all rows and shows health. Resolver applies up to 12 active DNS."
) )
hint.setWordWrap(True) hint.setWordWrap(True)
hint.setStyleSheet("color: gray;") hint.setStyleSheet("color: gray;")
@@ -93,11 +93,8 @@ class DNSBenchmarkDialog(QDialog):
self.btn_reset = QPushButton("Reset defaults") self.btn_reset = QPushButton("Reset defaults")
self.btn_reset.clicked.connect(self.on_reset_defaults) self.btn_reset.clicked.connect(self.on_reset_defaults)
row_btns.addWidget(self.btn_reset) row_btns.addWidget(self.btn_reset)
self.btn_reload = QPushButton("Reload active set") self.btn_save_pool = QPushButton("Apply resolver DNS")
self.btn_reload.clicked.connect(self.on_reload_pool) self.btn_save_pool.clicked.connect(self.on_apply_resolver_dns)
row_btns.addWidget(self.btn_reload)
self.btn_save_pool = QPushButton("Save active set")
self.btn_save_pool.clicked.connect(self.on_save_pool)
row_btns.addWidget(self.btn_save_pool) row_btns.addWidget(self.btn_save_pool)
row_btns.addStretch(1) row_btns.addStretch(1)
root.addLayout(row_btns) root.addLayout(row_btns)
@@ -173,6 +170,7 @@ class DNSBenchmarkDialog(QDialog):
def _load_sources(self) -> None: def _load_sources(self) -> None:
rows: List[tuple[bool, str]] = [] rows: List[tuple[bool, str]] = []
# Priority 1: backend upstream pool
try: try:
st = self.ctrl.dns_upstream_pool_view() st = self.ctrl.dns_upstream_pool_view()
for item in st.items: for item in st.items:
@@ -183,6 +181,7 @@ class DNSBenchmarkDialog(QDialog):
except Exception: except Exception:
rows = [] rows = []
# Priority 2: local settings cache (when backend is not available)
if not rows: if not rows:
raw = str(self.settings.value("dns_benchmark/upstreams", "") or "").strip() raw = str(self.settings.value("dns_benchmark/upstreams", "") or "").strip()
if raw: if raw:
@@ -202,6 +201,19 @@ class DNSBenchmarkDialog(QDialog):
if not rows: if not rows:
rows = [(True, item) for item in DEFAULT_UPSTREAMS] rows = [(True, item) for item in DEFAULT_UPSTREAMS]
# Keep developer defaults always visible in list.
merged: List[tuple[bool, str]] = []
seen = set()
by_addr = {addr: enabled for enabled, addr in rows}
for addr in DEFAULT_UPSTREAMS:
merged.append((bool(by_addr.get(addr, False)), addr))
seen.add(addr)
for enabled, addr in rows:
if addr in seen:
continue
merged.append((enabled, addr))
rows = merged
self.tbl_sources.blockSignals(True) self.tbl_sources.blockSignals(True)
self.tbl_sources.setRowCount(0) self.tbl_sources.setRowCount(0)
for enabled, addr in rows: for enabled, addr in rows:
@@ -283,6 +295,17 @@ class DNSBenchmarkDialog(QDialog):
self._save_settings() self._save_settings()
def on_reset_defaults(self) -> None: def on_reset_defaults(self) -> None:
btn = QMessageBox.question(
self,
"Reset DNS defaults",
"Reset list to 12 developer default DNS entries?\n"
"This does not apply to resolver until you click 'Apply resolver DNS'.",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No,
)
if btn != QMessageBox.Yes:
return
self.tbl_sources.blockSignals(True) self.tbl_sources.blockSignals(True)
self.tbl_sources.setRowCount(0) self.tbl_sources.setRowCount(0)
for item in DEFAULT_UPSTREAMS: for item in DEFAULT_UPSTREAMS:
@@ -290,22 +313,20 @@ class DNSBenchmarkDialog(QDialog):
self.tbl_sources.blockSignals(False) self.tbl_sources.blockSignals(False)
self._save_settings() self._save_settings()
def on_reload_pool(self) -> None: def on_apply_resolver_dns(self) -> None:
self._safe(self._load_sources, "Reload DNS active set error")
def on_save_pool(self) -> None:
def work() -> None: def work() -> None:
payload = self._source_payload() payload = self._source_payload()
st = self.ctrl.dns_upstream_pool_save(payload) st = self.ctrl.dns_upstream_pool_save(payload)
active = sum(1 for x in st.items if x.enabled) active = sum(1 for x in st.items if x.enabled)
total = len(st.items) total = len(st.items)
applied = active if active < 12 else 12
self._save_settings() self._save_settings()
self.lbl_summary.setText(f"Saved active DNS set: active={active}/{total}") self.lbl_summary.setText(f"Applied resolver DNS: active={active}/{total}, applied={applied}/12")
self.lbl_summary.setStyleSheet("color: green;") self.lbl_summary.setStyleSheet("color: green;")
if self.refresh_cb: if self.refresh_cb:
self.refresh_cb() self.refresh_cb()
self._safe(work, "Save DNS active set error") self._safe(work, "Apply resolver DNS error")
def on_run_benchmark(self) -> None: def on_run_benchmark(self) -> None:
def work() -> None: def work() -> None:

View File

@@ -739,13 +739,16 @@ RU: Источник wildcard IP: резолвер, runtime nftset SmartDNS, и
total += 1 total += 1
if bool(getattr(item, "enabled", False)): if bool(getattr(item, "enabled", False)):
active.append(addr) active.append(addr)
applied = len(active)
if applied > 12:
applied = 12
if not active: if not active:
text = f"Resolver upstreams: active=0/{total} (empty set)" text = f"Resolver upstreams: active=0/{total} (empty set)"
else: else:
preview = ", ".join(active[:4]) preview = ", ".join(active[:4])
if len(active) > 4: if len(active) > 4:
preview += f", +{len(active)-4} more" preview += f", +{len(active)-4} more"
text = f"Resolver upstreams: active={len(active)}/{total} [{preview}]" text = f"Resolver upstreams: active={len(active)}/{total}, applied={applied}/12 [{preview}]"
self.lbl_dns_resolver_upstreams.setText(text) self.lbl_dns_resolver_upstreams.setText(text)
self.lbl_dns_resolver_upstreams.setStyleSheet("color: gray;") self.lbl_dns_resolver_upstreams.setStyleSheet("color: gray;")