diff --git a/selective-vpn-gui/dns_benchmark_dialog.py b/selective-vpn-gui/dns_benchmark_dialog.py index f1cde6e..aabef1b 100644 --- a/selective-vpn-gui/dns_benchmark_dialog.py +++ b/selective-vpn-gui/dns_benchmark_dialog.py @@ -69,7 +69,7 @@ class DNSBenchmarkDialog(QDialog): hint = QLabel( "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.setStyleSheet("color: gray;") @@ -93,11 +93,8 @@ class DNSBenchmarkDialog(QDialog): self.btn_reset = QPushButton("Reset defaults") self.btn_reset.clicked.connect(self.on_reset_defaults) row_btns.addWidget(self.btn_reset) - self.btn_reload = QPushButton("Reload active set") - self.btn_reload.clicked.connect(self.on_reload_pool) - row_btns.addWidget(self.btn_reload) - self.btn_save_pool = QPushButton("Save active set") - self.btn_save_pool.clicked.connect(self.on_save_pool) + self.btn_save_pool = QPushButton("Apply resolver DNS") + self.btn_save_pool.clicked.connect(self.on_apply_resolver_dns) row_btns.addWidget(self.btn_save_pool) row_btns.addStretch(1) root.addLayout(row_btns) @@ -173,6 +170,7 @@ class DNSBenchmarkDialog(QDialog): def _load_sources(self) -> None: rows: List[tuple[bool, str]] = [] + # Priority 1: backend upstream pool try: st = self.ctrl.dns_upstream_pool_view() for item in st.items: @@ -183,6 +181,7 @@ class DNSBenchmarkDialog(QDialog): except Exception: rows = [] + # Priority 2: local settings cache (when backend is not available) if not rows: raw = str(self.settings.value("dns_benchmark/upstreams", "") or "").strip() if raw: @@ -202,6 +201,19 @@ class DNSBenchmarkDialog(QDialog): if not rows: 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.setRowCount(0) for enabled, addr in rows: @@ -283,6 +295,17 @@ class DNSBenchmarkDialog(QDialog): self._save_settings() 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.setRowCount(0) for item in DEFAULT_UPSTREAMS: @@ -290,22 +313,20 @@ class DNSBenchmarkDialog(QDialog): self.tbl_sources.blockSignals(False) self._save_settings() - def on_reload_pool(self) -> None: - self._safe(self._load_sources, "Reload DNS active set error") - - def on_save_pool(self) -> None: + def on_apply_resolver_dns(self) -> None: def work() -> None: payload = self._source_payload() st = self.ctrl.dns_upstream_pool_save(payload) active = sum(1 for x in st.items if x.enabled) total = len(st.items) + applied = active if active < 12 else 12 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;") if 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 work() -> None: diff --git a/selective-vpn-gui/vpn_dashboard_qt.py b/selective-vpn-gui/vpn_dashboard_qt.py index bca7311..ca0af4a 100755 --- a/selective-vpn-gui/vpn_dashboard_qt.py +++ b/selective-vpn-gui/vpn_dashboard_qt.py @@ -739,13 +739,16 @@ RU: Источник wildcard IP: резолвер, runtime nftset SmartDNS, и total += 1 if bool(getattr(item, "enabled", False)): active.append(addr) + applied = len(active) + if applied > 12: + applied = 12 if not active: text = f"Resolver upstreams: active=0/{total} (empty set)" else: preview = ", ".join(active[:4]) if len(active) > 4: 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.setStyleSheet("color: gray;")