feat: карточки сервисов на дашборде + секция Hosts в правилах + скрытие вкладки Conditions для Hosts

Дашборд:
- Добавлены карточки статуса Zapret, Zapret2, ByeDpi на панель мониторинга
- Показывают статус (работает/остановлен), количество перезапусков, предупреждения
- Баг: API возвращает boolean а не число — исправлено сравнение

Секция Hosts:
- Перенесены опции hosts из глобальных настроек в отдельный тип секции (action=hosts)
- Опции: пользовательские DNS записи, удалённые списки хостов, автообновление, интервал
- Миграция: автоматический перенос глобальных настроек hosts в секцию
- Вкладка «Условия» скрыта для секций типа Hosts (hosts записи применяются глобально)
- Возвращена кнопка «Import Hosts File» с модальным окном загрузки из файла
- Убраны неиспользуемые опции из settings.js (~280 строк)

Локализация:
- Переведены 6 новых строк для превью импорта hosts
This commit is contained in:
Dushnilin
2026-08-06 14:16:18 +03:00
parent 488bbfefd5
commit 7125e1a48e
23 changed files with 1222 additions and 793 deletions
+5 -3
View File
@@ -590,6 +590,8 @@ function rule_has_list_update_source(section) {
return false;
if (option(section, "action", "") == "dns")
return list_has_remote_references(option(section, "domain_ip_lists", ""));
if (option(section, "action", "") == "hosts")
return false;
return (
rule_config.has_community_subnet_list(connections.community_lists_value(section)) ||
@@ -2088,7 +2090,7 @@ function import_domain_ip_list_file_into_rulesets(filepath, section) {
let ruleset_filepath = domain_ip_list_ruleset_path(section);
let ok = nft_module_success([ "split-domain-subnet-file", filepath, domains_tmpfile, subnets_tmpfile ]);
let domains_only = option(section, "action", "") == "dns";
let domains_only = option(section, "action", "") == "dns" || option(section, "action", "") == "hosts";
if (ok)
ok = ruleset_module_success([ "import-plain-list", domains_tmpfile, ruleset_filepath, "domain_suffix", "domains", "5000" ]);
if (ok && !domains_only)
@@ -2251,7 +2253,7 @@ function import_all_preset_lists(settings) {
function import_builtin_subnets_from_rule(section, settings) {
if (!bool_option(section, "enabled", true))
return true;
if (option(section, "action", "") == "dns")
if (option(section, "action", "") == "dns" || option(section, "action", "") == "hosts")
return true;
let ok = true;
@@ -2391,7 +2393,7 @@ function import_custom_ruleset_subnets_from_remote(url, format, section, label,
function import_rule_sets_with_subnets_from_rule(section, settings) {
if (!bool_option(section, "enabled", true))
return true;
if (option(section, "action", "") == "dns")
if (option(section, "action", "") == "dns" || option(section, "action", "") == "hosts")
return true;
let references = connections.rule_sets_with_subnets(section);