diff options
Diffstat (limited to 'applications')
54 files changed, 740 insertions, 383 deletions
diff --git a/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua b/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua index 3f39622920..da783e3361 100644 --- a/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua +++ b/applications/luci-app-adblock/luasrc/model/cbi/adblock/overview_tab.lua @@ -183,7 +183,7 @@ end des = bl:option(DummyValue, "adb_src_desc", translate("Description")) -cat = bl:option(DynamicList, "adb_src_cat", translate("Categories")) +cat = bl:option(DynamicList, "adb_src_cat", translate("Archive Categories")) cat.datatype = "uciname" cat.optional = true diff --git a/applications/luci-app-adblock/luasrc/view/adblock/blocklist.htm b/applications/luci-app-adblock/luasrc/view/adblock/blocklist.htm index 424a72f6fd..81622e9bc6 100644 --- a/applications/luci-app-adblock/luasrc/view/adblock/blocklist.htm +++ b/applications/luci-app-adblock/luasrc/view/adblock/blocklist.htm @@ -22,25 +22,35 @@ end -%> <style type="text/css"> -table.cbi-section-table th, -table.cbi-section-table td, +.table.cbi-section-table .th, +.table.cbi-section-table .td, .cbi-section-table-cell, -.cbi-section-table-row, -.cbi-input-text +.cbi-section-table-row { text-align:left; vertical-align:top; margin-right:auto; margin-left:0px; + padding-left:2px; + line-height:20px; + height:20px; +} +.table.cbi-section-table .th +{ + white-space:nowrap; +} +.table.cbi-section-table input +{ + width:7em; } .cbi-input-text { + text-align:left; + padding-left:2px; outline:none; box-shadow:none; background:transparent; - padding-left:2px; - line-height:25px; - height:25px; + height:20px; width:10em; } </style> diff --git a/applications/luci-app-adblock/luasrc/view/adblock/query.htm b/applications/luci-app-adblock/luasrc/view/adblock/query.htm index 8bbc92664d..8bbed3a53e 100644 --- a/applications/luci-app-adblock/luasrc/view/adblock/query.htm +++ b/applications/luci-app-adblock/luasrc/view/adblock/query.htm @@ -35,7 +35,7 @@ This is free software, licensed under the Apache License, Version 2.0 else { input.style.display = 'none'; - output.innerHTML = '<span class="error"><%:Invalid domain specified!%></span>'; + output.innerHTML = '<span class="error"><%:Blocklist not found!%></span>'; } } ); diff --git a/applications/luci-app-adblock/po/it/adblock.po b/applications/luci-app-adblock/po/it/adblock.po index 7c64468e6a..c2db36effc 100644 --- a/applications/luci-app-adblock/po/it/adblock.po +++ b/applications/luci-app-adblock/po/it/adblock.po @@ -40,6 +40,9 @@ msgstr "Tempo addizionale in secondi di attesa prima che adblock si avvii." msgid "Advanced" msgstr "Avanzato" +msgid "Archive Categories" +msgstr "" + msgid "Backup Directory" msgstr "Directory del Backup" @@ -49,14 +52,14 @@ msgstr "" msgid "Blocklist Sources" msgstr "Fonti lista di Blocco" +msgid "Blocklist not found!" +msgstr "" + msgid "" "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all " "domains except those listed in the whitelist file.<br />" msgstr "" -msgid "Categories" -msgstr "" - msgid "" "Choose 'none' to disable automatic startups, 'timed' to use a classic " "timeout (default 30 sec.) or select another trigger interface." @@ -169,9 +172,6 @@ msgstr "" msgid "Input file not found, please check your configuration." msgstr "File di input non trovato, per favore controlla la tua configurazione." -msgid "Invalid domain specified!" -msgstr "Dominio invalido specificato!" - msgid "Last Run" msgstr "Ultimo Avvio" @@ -371,6 +371,9 @@ msgstr "in pausa" msgid "running" msgstr "" +#~ msgid "Invalid domain specified!" +#~ msgstr "Dominio invalido specificato!" + #~ msgid "Available blocklist sources." #~ msgstr "Fonti lista di blocco disponibili." diff --git a/applications/luci-app-adblock/po/ja/adblock.po b/applications/luci-app-adblock/po/ja/adblock.po index 5276f69626..cddedacd43 100644 --- a/applications/luci-app-adblock/po/ja/adblock.po +++ b/applications/luci-app-adblock/po/ja/adblock.po @@ -42,6 +42,9 @@ msgstr "Adblock の処理が開始されるまでの、追加の遅延時間( msgid "Advanced" msgstr "詳細設定" +msgid "Archive Categories" +msgstr "" + msgid "Backup Directory" msgstr "バックアップ先 ディレクトリ" @@ -51,6 +54,9 @@ msgstr "バックアップ モード" msgid "Blocklist Sources" msgstr "ブロックリスト提供元" +msgid "Blocklist not found!" +msgstr "" + msgid "" "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all " "domains except those listed in the whitelist file.<br />" @@ -58,9 +64,6 @@ msgstr "" "ホワイトリストに存在しない全ドメインへのアクセスをブロックするために、追加で " "'Jail' リスト (/tmp/adb_list.jail) を作成します。<br />" -msgid "Categories" -msgstr "カテゴリー" - msgid "" "Choose 'none' to disable automatic startups, 'timed' to use a classic " "timeout (default 30 sec.) or select another trigger interface." @@ -185,9 +188,6 @@ msgstr "ホワイトリスト ファイルへのフルパスです。" msgid "Input file not found, please check your configuration." msgstr "入力ファイルが見つかりません。設定を確認してください。" -msgid "Invalid domain specified!" -msgstr "無効なドメインが指定されています!" - msgid "Last Run" msgstr "最終実行" @@ -399,3 +399,9 @@ msgstr "一時停止" msgid "running" msgstr "実行中" + +#~ msgid "Categories" +#~ msgstr "カテゴリー" + +#~ msgid "Invalid domain specified!" +#~ msgstr "無効なドメインが指定されています!" diff --git a/applications/luci-app-adblock/po/pt-br/adblock.po b/applications/luci-app-adblock/po/pt-br/adblock.po index 6e8098a395..07d0f9a8d2 100644 --- a/applications/luci-app-adblock/po/pt-br/adblock.po +++ b/applications/luci-app-adblock/po/pt-br/adblock.po @@ -43,6 +43,9 @@ msgstr "" msgid "Advanced" msgstr "Avançado" +msgid "Archive Categories" +msgstr "" + msgid "Backup Directory" msgstr "Diretório da cópia de segurança" @@ -52,14 +55,14 @@ msgstr "" msgid "Blocklist Sources" msgstr "Fontes de listas de bloqueio" +msgid "Blocklist not found!" +msgstr "" + msgid "" "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all " "domains except those listed in the whitelist file.<br />" msgstr "" -msgid "Categories" -msgstr "" - msgid "" "Choose 'none' to disable automatic startups, 'timed' to use a classic " "timeout (default 30 sec.) or select another trigger interface." @@ -169,9 +172,6 @@ msgstr "" msgid "Input file not found, please check your configuration." msgstr "Arquivo de entrada não encontrado, por favor cheque sua configuração." -msgid "Invalid domain specified!" -msgstr "Domínio especificado inválido!" - msgid "Last Run" msgstr "" @@ -363,6 +363,9 @@ msgstr "" msgid "running" msgstr "" +#~ msgid "Invalid domain specified!" +#~ msgstr "Domínio especificado inválido!" + #~ msgid "Available blocklist sources." #~ msgstr "Fontes de listas de bloqueio disponíveis." diff --git a/applications/luci-app-adblock/po/ru/adblock.po b/applications/luci-app-adblock/po/ru/adblock.po index 24f42a7760..c1193d38e1 100644 --- a/applications/luci-app-adblock/po/ru/adblock.po +++ b/applications/luci-app-adblock/po/ru/adblock.po @@ -44,6 +44,9 @@ msgstr "Дополнительная задержка в секундах до msgid "Advanced" msgstr "Дополнительно" +msgid "Archive Categories" +msgstr "" + msgid "Backup Directory" msgstr "Папка для бэкапа" @@ -53,6 +56,9 @@ msgstr "Режим сохранения бекапа" msgid "Blocklist Sources" msgstr "Источники списков блокировки" +msgid "Blocklist not found!" +msgstr "" + msgid "" "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all " "domains except those listed in the whitelist file.<br />" @@ -61,9 +67,6 @@ msgstr "" "заблокировать доступ ко всем доменам, кроме тех что перечислены в файле " "Белого списка.<br />" -msgid "Categories" -msgstr "" - msgid "" "Choose 'none' to disable automatic startups, 'timed' to use a classic " "timeout (default 30 sec.) or select another trigger interface." @@ -186,9 +189,6 @@ msgstr "Полный путь к файлу Белого списка." msgid "Input file not found, please check your configuration." msgstr "Config файл не найден, настройте config файл." -msgid "Invalid domain specified!" -msgstr "Задан недопустимый домен!" - msgid "Last Run" msgstr "Последнее время запуска" @@ -397,6 +397,9 @@ msgstr "остановлено" msgid "running" msgstr "работает" +#~ msgid "Invalid domain specified!" +#~ msgstr "Задан недопустимый домен!" + #~ msgid "Available blocklist sources." #~ msgstr "Источники списков блокировки. " diff --git a/applications/luci-app-adblock/po/sv/adblock.po b/applications/luci-app-adblock/po/sv/adblock.po index 349d0cc490..4a7ca4b738 100644 --- a/applications/luci-app-adblock/po/sv/adblock.po +++ b/applications/luci-app-adblock/po/sv/adblock.po @@ -30,6 +30,9 @@ msgstr "" msgid "Advanced" msgstr "Avancerat" +msgid "Archive Categories" +msgstr "" + msgid "Backup Directory" msgstr "Säkerhetskopiera mapp" @@ -39,14 +42,14 @@ msgstr "" msgid "Blocklist Sources" msgstr "Källor för blockeringslistor" +msgid "Blocklist not found!" +msgstr "" + msgid "" "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all " "domains except those listed in the whitelist file.<br />" msgstr "" -msgid "Categories" -msgstr "" - msgid "" "Choose 'none' to disable automatic startups, 'timed' to use a classic " "timeout (default 30 sec.) or select another trigger interface." @@ -160,9 +163,6 @@ msgid "Input file not found, please check your configuration." msgstr "" "Inmatningsfilen kunde inte hittas, var vänlig kontrollera din konfiguration." -msgid "Invalid domain specified!" -msgstr "Ogiltig domän angiven!" - msgid "Last Run" msgstr "Kördes senast" @@ -348,6 +348,9 @@ msgstr "pausad" msgid "running" msgstr "" +#~ msgid "Invalid domain specified!" +#~ msgstr "Ogiltig domän angiven!" + #~ msgid "Available blocklist sources." #~ msgstr "Tillgängliga källor för blockeringslistor" diff --git a/applications/luci-app-adblock/po/templates/adblock.pot b/applications/luci-app-adblock/po/templates/adblock.pot index 67c52eaacd..a375d0edb6 100644 --- a/applications/luci-app-adblock/po/templates/adblock.pot +++ b/applications/luci-app-adblock/po/templates/adblock.pot @@ -30,6 +30,9 @@ msgstr "" msgid "Advanced" msgstr "" +msgid "Archive Categories" +msgstr "" + msgid "Backup Directory" msgstr "" @@ -39,14 +42,14 @@ msgstr "" msgid "Blocklist Sources" msgstr "" +msgid "Blocklist not found!" +msgstr "" + msgid "" "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all " "domains except those listed in the whitelist file.<br />" msgstr "" -msgid "Categories" -msgstr "" - msgid "" "Choose 'none' to disable automatic startups, 'timed' to use a classic " "timeout (default 30 sec.) or select another trigger interface." @@ -152,9 +155,6 @@ msgstr "" msgid "Input file not found, please check your configuration." msgstr "" -msgid "Invalid domain specified!" -msgstr "" - msgid "Last Run" msgstr "" diff --git a/applications/luci-app-adblock/po/zh-cn/adblock.po b/applications/luci-app-adblock/po/zh-cn/adblock.po index 42bf0c04b9..408d04055c 100644 --- a/applications/luci-app-adblock/po/zh-cn/adblock.po +++ b/applications/luci-app-adblock/po/zh-cn/adblock.po @@ -16,7 +16,7 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" msgid "'Jail' Blocklist Creation" -msgstr "" +msgstr "“Jail” 拦截名单创建" msgid "-------" msgstr "-------" @@ -25,6 +25,7 @@ msgid "" "<b>Caution:</b> To prevent OOM exceptions on low memory devices with less " "than 64 MB free RAM, please only select a few of them!" msgstr "" +"<b>注意:</b>为防止在小于 64M 空闲内存的设备上出现内存不足异常,请只选择其中的几个!" msgid "Adblock" msgstr "Adblock" @@ -44,23 +45,26 @@ msgstr "触发 Adblock 开始处理前的额外延迟(以秒为单位)。" msgid "Advanced" msgstr "高级" +msgid "Archive Categories" +msgstr "" + msgid "Backup Directory" msgstr "备份目录" msgid "Backup Mode" -msgstr "" +msgstr "备份模式" msgid "Blocklist Sources" msgstr "拦截列表来源" +msgid "Blocklist not found!" +msgstr "" + msgid "" "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all " "domains except those listed in the whitelist file.<br />" msgstr "" -msgid "Categories" -msgstr "" - msgid "" "Choose 'none' to disable automatic startups, 'timed' to use a classic " "timeout (default 30 sec.) or select another trigger interface." @@ -79,6 +83,7 @@ msgid "" "Create compressed blocklist backups, they will be used in case of download " "errors or during startup in backup mode." msgstr "" +"创建压缩的拦截列表备份,它们将在下载错误或备份模式启动期间使用。" msgid "DNS Backend (DNS Directory)" msgstr "DNS 后端(DNS 目录)" @@ -95,7 +100,7 @@ msgid "" msgstr "启动期间不要自动更新 blocklists,改用 blocklists 的备份。" msgid "Download Utility" -msgstr "" +msgstr "下载工具" msgid "Download Utility (SSL Library)" msgstr "下载实用程序(SSL 库)" @@ -110,10 +115,10 @@ msgid "Edit Whitelist" msgstr "编辑白名单" msgid "Email Notification" -msgstr "" +msgstr "Email 提醒" msgid "Email Notification Count" -msgstr "" +msgstr "Email 提醒计数" msgid "Enable Adblock" msgstr "启用 Adblock" @@ -125,6 +130,7 @@ msgid "" "Enable memory intense overall sort / duplicate removal on low memory devices " "(< 64 MB free RAM)" msgstr "" +"在低内存设备上启用积极的内存整体排序/重复移除(< 64 MB 空闲内存)" msgid "Enable verbose debug logging in case of any processing error." msgstr "在出现任何处理错误的情况下启用详细调试日志记录。" @@ -136,25 +142,29 @@ msgid "Extra Options" msgstr "额外选项" msgid "Flush DNS Cache" -msgstr "" +msgstr "清空 DNS 缓存" msgid "Flush DNS Cache after adblock processing." -msgstr "" +msgstr "在 adblock 进程启动后清空 DNS 缓存。" msgid "" "For SSL protected blocklist sources you need a suitable SSL library, e.g. " "'libustream-ssl' or 'built-in'." msgstr "" +"对受 SSL 保护的拦截列表源,您需要一个合适的 SSL 库,如 “libustream-ssl” 或 " +"“built-in”。" msgid "" "For further information <a href=\"%s\" target=\"_blank\">check the online " "documentation</a>" msgstr "" +"进一步信息<a href=\"%s\" target=\"_blank\">请访问在线文档" msgid "" "For further performance improvements you can raise this value, e.g. '8' or " "'16' should be safe." msgstr "" +"为了进一步提高性能,您可以提高此值,例如:8 或 16 应该是安全的。" msgid "Force Local DNS" msgstr "强制本地 DNS" @@ -163,14 +173,11 @@ msgid "Force Overall Sort" msgstr "强制整体排序" msgid "Full path to the whitelist file." -msgstr "" +msgstr "白名单文件的全路径。" msgid "Input file not found, please check your configuration." msgstr "输入文件未找到,请检查您的配置。" -msgid "Invalid domain specified!" -msgstr "无效域名!" - msgid "Last Run" msgstr "最后运行" @@ -178,6 +185,7 @@ msgid "" "List of available network interfaces. Usually the startup will be triggered " "by the 'wan' interface.<br />" msgstr "" +"可用网络接口列表。通常启动将由 “wan” 接口触发。<br />" msgid "" "List of supported DNS backends with their default list export directory.<br /" @@ -185,13 +193,13 @@ msgid "" msgstr "支持的 DNS 后端列表及其默认列表导出目录。<br />" msgid "List of supported and fully pre-configured download utilities." -msgstr "" +msgstr "支持和完全预配置的下载工具列表。" msgid "Loading" msgstr "加载中" msgid "Max. Download Queue" -msgstr "" +msgstr "最大下载队列" msgid "No" msgstr "否" @@ -201,7 +209,7 @@ msgid "" msgstr "在默认设置并不适合您时的额外选项。" msgid "Overall Domains" -msgstr "" +msgstr "域名总览" msgid "Overview" msgstr "总览" @@ -219,6 +227,7 @@ msgstr "请在终端会话中直接编辑此文件。" msgid "" "Please note: this needs additional 'msmtp' package installation and setup." msgstr "" +"请注意:这需要额外的 “msmtp” 软件包安装和设置。" msgid "Query" msgstr "查询" @@ -230,6 +239,7 @@ msgid "" "Raise the minimum email notification count, to get emails if the overall " "count is less or equal to the given limit (default 0),<br />" msgstr "" +"如果总数小于或等于给定限制(默认为 0),请提高最小电子邮件通知数,以获取电子邮件。" msgid "Redirect all DNS queries from 'lan' zone to the local resolver." msgstr "将所有 DNS 查询从“lan”区域重定向到本地解析器。" @@ -250,11 +260,13 @@ msgid "" "Send notification emails in case of a processing error or if domain count is " "≤ 0.<br />" msgstr "" +"如果发生错误或域计数 ≤ 0,发送通知电子邮件。<br />" msgid "" "Size of the download queue to handle downloads & list processing in " "parallel (default '4').<br />" msgstr "" +"处理下载队列的大小 &amp; 并行处理列表(默认 “4”)。<br />" msgid "Startup Trigger" msgstr "启动触发器" @@ -269,12 +281,14 @@ msgid "" "Target directory for adblock backups. Please use only non-volatile disks, e." "g. an external usb stick." msgstr "" +"adblock 备份的目标目录。 请仅使用非易失性磁盘,例如:一个外置 U 盘。" msgid "Target directory for the generated blocklist 'adb_list.overall'." msgstr "生成的 blocklist 'adb_list.overall'的目标目录。" msgid "The file size is too large for online editing in LuCI (≥ 100 KB)." msgstr "" +"文件过大,无法使用 LuCI 的在线编辑(≥ 100 KB)。" msgid "" "This form allows you to modify the content of the adblock blacklist (%s)." @@ -319,7 +333,7 @@ msgid "Waiting for command to complete..." msgstr "正在执行命令..." msgid "Whitelist File" -msgstr "" +msgstr "白名单文件" msgid "Yes" msgstr "是" @@ -328,6 +342,7 @@ msgid "" "You can use this restrictive blocklist manually e.g. for guest wifi or " "kidsafe configurations." msgstr "" +"您可以手动使用此限制性拦截列表,例如:为客人提供 wifi 或 kidsafe 配置。" msgid "disabled" msgstr "已禁用" @@ -335,7 +350,7 @@ msgstr "已禁用" msgid "" "e.g. to receive an email notification with every adblock update set this " "value to 150000." -msgstr "" +msgstr "例如:要接收每个 adblock 更新的电子邮件通知时将此值设置为150000。" msgid "enabled" msgstr "已启用" @@ -350,7 +365,10 @@ msgid "paused" msgstr "已暂停" msgid "running" -msgstr "" +msgstr "运行中" + +#~ msgid "Invalid domain specified!" +#~ msgstr "无效域名!" #~ msgid "Available blocklist sources." #~ msgstr "可用的 blocklist 来源。" diff --git a/applications/luci-app-adblock/po/zh-tw/adblock.po b/applications/luci-app-adblock/po/zh-tw/adblock.po index f42d1b3807..45b19cdc80 100644 --- a/applications/luci-app-adblock/po/zh-tw/adblock.po +++ b/applications/luci-app-adblock/po/zh-tw/adblock.po @@ -44,6 +44,9 @@ msgstr "觸發 Adblock 開始處理前的額外延遲(以秒為單位)。" msgid "Advanced" msgstr "高階" +msgid "Archive Categories" +msgstr "" + msgid "Backup Directory" msgstr "備份目錄" @@ -53,14 +56,14 @@ msgstr "" msgid "Blocklist Sources" msgstr "攔截列表來源" +msgid "Blocklist not found!" +msgstr "" + msgid "" "Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all " "domains except those listed in the whitelist file.<br />" msgstr "" -msgid "Categories" -msgstr "" - msgid "" "Choose 'none' to disable automatic startups, 'timed' to use a classic " "timeout (default 30 sec.) or select another trigger interface." @@ -168,9 +171,6 @@ msgstr "" msgid "Input file not found, please check your configuration." msgstr "輸入檔案未找到,請檢查您的配置。" -msgid "Invalid domain specified!" -msgstr "無效域名!" - msgid "Last Run" msgstr "最後執行" @@ -352,6 +352,9 @@ msgstr "已暫停" msgid "running" msgstr "" +#~ msgid "Invalid domain specified!" +#~ msgstr "無效域名!" + #~ msgid "Available blocklist sources." #~ msgstr "可用的 blocklist 來源。" diff --git a/applications/luci-app-ddns/Makefile b/applications/luci-app-ddns/Makefile index bd6ddeb1b3..7295189518 100644 --- a/applications/luci-app-ddns/Makefile +++ b/applications/luci-app-ddns/Makefile @@ -16,10 +16,11 @@ PKG_VERSION:=2.4.9 # Release == build # increase on changes of translation files -PKG_RELEASE:=3 +PKG_RELEASE:=5 PKG_LICENSE:=Apache-2.0 -PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com> +PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>, \ + Ansuel Smith <ansuelsmth@gmail.com> # LuCI specific settings LUCI_TITLE:=LuCI Support for Dynamic DNS Client (ddns-scripts) diff --git a/applications/luci-app-ddns/luasrc/controller/ddns.lua b/applications/luci-app-ddns/luasrc/controller/ddns.lua index 5f4a5118c3..e152bb0d98 100755 --- a/applications/luci-app-ddns/luasrc/controller/ddns.lua +++ b/applications/luci-app-ddns/luasrc/controller/ddns.lua @@ -21,7 +21,6 @@ luci_helper = "/usr/lib/ddns/dynamic_dns_lucihelper.sh" local srv_name = "ddns-scripts" local srv_ver_min = "2.7.7" -- minimum version of service required -local srv_ver_cmd = luci_helper .. [[ -V | awk {'print $2'}]] local app_name = "luci-app-ddns" local app_title = "Dynamic DNS" local app_version = "2.4.9-1" @@ -29,7 +28,6 @@ local app_version = "2.4.9-1" function index() local nxfs = require "nixio.fs" -- global definitions not available local sys = require "luci.sys" -- in function index() - local ddns = require "luci.tools.ddns" -- ddns multiused functions local muci = require "luci.model.uci" -- no config create an empty one @@ -81,33 +79,40 @@ end -- Standardized application/service functions function app_title_main() - return [[<a href="javascript:alert(']] - .. I18N.translate("Version Information") - .. [[\n\n]] .. app_name - .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]] .. app_version - .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]] - .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]] - .. srv_ver_min .. [[ ]] .. I18N.translate("or higher") - .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]] - .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]] - .. (service_version() or I18N.translate("NOT installed")) - .. [[\n\n]] - .. [[')">]] - .. I18N.translate(app_title) - .. [[</a>]] + tmp = {} + tmp[#tmp+1] = [[<a href="javascript:alert(']] + tmp[#tmp+1] = I18N.translate("Version Information") + tmp[#tmp+1] = [[\n\n]] .. app_name + tmp[#tmp+1] = [[\n]] .. I18N.translate("Version") .. [[: ]] .. app_version + tmp[#tmp+1] = [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]] + tmp[#tmp+1] = [[\n]] .. I18N.translate("Version") .. [[: ]] + tmp[#tmp+1] = srv_ver_min .. [[ ]] .. I18N.translate("or higher") + tmp[#tmp+1] = [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]] + tmp[#tmp+1] = [[\n]] .. I18N.translate("Version") .. [[: ]] + tmp[#tmp+1] = (service_version() or I18N.translate("NOT installed")) + tmp[#tmp+1] = [[\n\n]] + tmp[#tmp+1] = [[')">]] + tmp[#tmp+1] = I18N.translate(app_title) + tmp[#tmp+1] = [[</a>]] + + return table.concat(tmp) end -function service_version() - local ver = nil - - ver = UTIL.exec(srv_ver_cmd) - if #ver > 0 then return ver end - IPKG.list_installed(srv_name, function(n, v, d) - if v and (#v > 0) then ver = v end - end - ) - return ver +function service_version() + + local srv_ver_cmd = luci_helper .. " -V | awk {'print $2'} " + local ver + + if IPKG then + ver = IPKG.info(srv_name)[srv_name].Version + else + ver = UTIL.exec(srv_ver_cmd) + end + + if ver and #ver > 0 then return ver or nil end + end + function service_ok() return IPKG.compare_versions((service_version() or "0"), ">=", srv_ver_min) end diff --git a/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua b/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua index 977dbe34b1..eb2159076e 100644 --- a/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua +++ b/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua @@ -172,7 +172,7 @@ local function _option_used(option, urlscript) end -- function to verify if option is valid -local function _option_validate(self, value) +local function _option_validate(self, value, optional) -- section is globally defined here be calling agrument (see above) local fusev6 = usev6:formvalue(section) or "0" local fsvc4 = svc4:formvalue(section) or "-" @@ -204,6 +204,7 @@ local function _option_validate(self, value) if used < 1 then return "" end -- needed but no data then return error if not value or (#value == 0) then + if optional then return nil end return nil, err_tab_basic(self) .. translate("missing / required") end return value @@ -292,6 +293,10 @@ function luh.parse(self, section, novld) end -- use_ipv6 -- ################################################################ + +--We call it globally as it's called 11 times even outside specific function, saves 11 os.execute slow command! +local has_ipv6 = DDNS.env_info("has_ipv6") + usev6 = ns:taboption("basic", ListValue, "use_ipv6", translate("IP address version"), translate("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider") ) @@ -300,16 +305,16 @@ usev6.default = "0" usev6:value("0", translate("IPv4-Address") ) function usev6.cfgvalue(self, section) local value = AbstractValue.cfgvalue(self, section) or "0" - if DDNS.has_ipv6 or (value == "1" and not DDNS.has_ipv6) then + if has_ipv6 or (value == "1" and not has_ipv6) then self:value("1", translate("IPv6-Address") ) end - if value == "1" and not DDNS.has_ipv6 then + if value == "1" and not has_ipv6 then self.description = err_ipv6_basic end return value end function usev6.validate(self, value) - if (value == "1" and DDNS.has_ipv6) or value == "0" then + if (value == "1" and has_ipv6) or value == "0" then return value end return nil, err_tab_basic(self) .. err_ipv6_plain @@ -360,7 +365,7 @@ svc6 = ns:taboption("basic", ListValue, "ipv6_service_name", translate("DDNS Service provider") .. " [IPv6]" ) svc6.default = "-" svc6:depends("use_ipv6", "1") -- only show on IPv6 -if not DDNS.has_ipv6 then +if not has_ipv6 then svc6.description = err_ipv6_basic end function svc6.cfgvalue(self, section) @@ -374,7 +379,7 @@ function svc6.cfgvalue(self, section) end function svc6.validate(self, value) if usev6:formvalue(section) == "1" then -- do only on IPv6 - if DDNS.has_ipv6 then return value end + if has_ipv6 then return value end return nil, err_tab_basic(self) .. err_ipv6_plain else return "" -- suppress validate error @@ -509,18 +514,18 @@ pe = ns:taboption("basic", Value, "param_enc", translate("Optional Encoded Parameter"), translate("Optional: Replaces [PARAMENC] in Update-URL (URL-encoded)") ) function pe.validate(self, value) - return _option_validate(self, value) + return _option_validate(self, value, true) end function pe.parse(self, section, novld) DDNS.value_parse(self, section, novld) end --- IPv4/IPv6 - param_enc -- ################################################### +-- IPv4/IPv6 - param_opt -- ################################################### po = ns:taboption("basic", Value, "param_opt", translate("Optional Parameter"), translate("Optional: Replaces [PARAMOPT] in Update-URL (NOT URL-encoded)") ) function po.validate(self, value) - return _option_validate(self, value) + return _option_validate(self, value, true) end function po.parse(self, section, novld) DDNS.value_parse(self, section, novld) @@ -586,13 +591,17 @@ end svc6:value("-", translate("-- custom --") ) -- IPv4/IPv6 - use_https -- ################################################### -if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then + +--We call it globally as it's called 4 times outside specific function. +local has_ssl = DDNS.env_info("has_ssl") + +if has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then https = ns:taboption("basic", Flag, "use_https", translate("Use HTTP Secure") ) https.orientation = "horizontal" function https.cfgvalue(self, section) local value = AbstractValue.cfgvalue(self, section) - if not DDNS.has_ssl and value == "1" then + if not has_ssl and value == "1" then self.description = bold_on .. font_red .. translate("HTTPS not supported") .. font_off .. "<br />" .. translate("please disable") .. " !" .. bold_off @@ -602,7 +611,7 @@ if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then return value end function https.validate(self, value) - if (value == "1" and DDNS.has_ssl ) or value == "0" then return value end + if (value == "1" and has_ssl ) or value == "0" then return value end return nil, err_tab_basic(self) .. translate("HTTPS not supported") .. " !" end function https.write(self, section, value) @@ -616,7 +625,7 @@ if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then end -- IPv4/IPv6 - cacert -- ###################################################### -if DDNS.has_ssl then +if has_ssl then cert = ns:taboption("basic", Value, "cacert", translate("Path to CA-Certificate"), translate("directory or path/file") .. "<br />" .. @@ -706,7 +715,7 @@ src6:value("network", translate("Network")) src6:value("web", translate("URL")) src6:value("interface", translate("Interface")) src6:value("script", translate("Script")) -if not DDNS.has_ipv6 then +if not has_ipv6 then src6.description = err_ipv6_other end function src6.cfgvalue(self, section) @@ -715,7 +724,7 @@ end function src6.validate(self, value) if usev6:formvalue(section) ~= "1" then return "" -- ignore on IPv4 selected - elseif not DDNS.has_ipv6 then + elseif not has_ipv6 then return nil, err_tab_adv(self) .. err_ipv6_plain elseif not _verify_ip_source() then return nil, err_tab_adv(self) .. @@ -794,7 +803,7 @@ ipn6 = ns:taboption("advanced", ListValue, "ipv6_network", ipn6:depends("ipv6_source", "network") ipn6.default = "wan6" WADM.cbi_add_networks(ipn6) -if DDNS.has_ipv6 then +if has_ipv6 then ipn6.description = translate("Defines the network to read systems IPv6-Address from") else ipn6.description = err_ipv6_other @@ -808,7 +817,7 @@ function ipn6.validate(self, value) -- ignore if IPv4 selected OR -- ignore everything except "network" return "" - elseif DDNS.has_ipv6 then + elseif has_ipv6 then return value else return nil, err_tab_adv(self) .. err_ipv6_plain @@ -881,7 +890,7 @@ iurl6 = ns:taboption("advanced", Value, "ipv6_url", translate("URL to detect") .. " [IPv6]" ) iurl6:depends("ipv6_source", "web") iurl6.default = "http://checkipv6.dyndns.com" -if DDNS.has_ipv6 then +if has_ipv6 then iurl6.description = translate("Defines the Web page to read systems IPv6-Address from") else iurl6.description = err_ipv6_other @@ -895,7 +904,7 @@ function iurl6.validate(self, value) -- ignore if IPv4 selected OR -- ignore everything except "web" return "" - elseif not DDNS.has_ipv6 then + elseif not has_ipv6 then return nil, err_tab_adv(self) .. err_ipv6_plain elseif not value or #value == 0 then return nil, err_tab_adv(self) .. translate("missing / required") @@ -1051,7 +1060,7 @@ eif6:depends("ipv6_source", "web") eif6:depends("ipv6_source", "script") eif6.default = "wan6" WADM.cbi_add_networks(eif6) -if not DDNS.has_ipv6 then +if not has_ipv6 then eif6.description = err_ipv6_other else eif6.description = translate("Network on which the ddns-updater scripts will be started") @@ -1065,7 +1074,7 @@ function eif6.validate(self, value) or fsrc6 == "network" or fsrc6 == "interface" then return "" -- ignore IPv4, network, interface - elseif not DDNS.has_ipv6 then + elseif not has_ipv6 then return nil, err_tab_adv(self) .. err_ipv6_plain else return value @@ -1084,10 +1093,13 @@ function eif6.write(self, section, value) end function eif6.parse(self, section, novld) DDNS.value_parse(self, section, novld) -end +end -- IPv4/IPv6 - bind_network -- ################################################ -if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then + +local has_bindnet = DDNS.env_info("has_bindnet") + +if has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then bnet = ns:taboption("advanced", ListValue, "bind_network", translate("Bind Network") ) bnet:depends("ipv4_source", "web") @@ -1097,7 +1109,7 @@ if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then WADM.cbi_add_networks(bnet) function bnet.cfgvalue(self, section) local value = AbstractValue.cfgvalue(self, section) - if not DDNS.has_bindnet and value ~= "" then + if not has_bindnet and value ~= "" then self.description = bold_on .. font_red .. translate("Binding to a specific network not supported") .. font_off .. "<br />" .. translate("please set to 'default'") .. " !" .. bold_off @@ -1108,7 +1120,7 @@ if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then return value end function bnet.validate(self, value) - if ( (value ~= "") and DDNS.has_bindnet ) or (value == "") then return value end + if ( (value ~= "") and has_bindnet ) or (value == "") then return value end return nil, err_tab_adv(self) .. translate("Binding to a specific network not supported") .. " !" end function bnet.parse(self, section, novld) @@ -1119,13 +1131,16 @@ end -- IPv4 + IPv6 - force_ipversion -- ########################################### -- optional to force wget/curl and host to use only selected IP version -- command parameter "-4" or "-6" -if DDNS.has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then + +local has_forceip = DDNS.env_info("has_forceip") + +if has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then fipv = ns:taboption("advanced", Flag, "force_ipversion", translate("Force IP Version") ) fipv.orientation = "horizontal" function fipv.cfgvalue(self, section) local value = AbstractValue.cfgvalue(self, section) - if not DDNS.has_forceip and value ~= "0" then + if not has_forceip and value ~= "0" then self.description = bold_on .. font_red .. translate("Force IP Version not supported") .. font_off .. "<br />" .. translate("please disable") .. " !" .. bold_off @@ -1135,14 +1150,17 @@ if DDNS.has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) t return value end function fipv.validate(self, value) - if (value == "1" and DDNS.has_forceip) or value == "0" then return value end + if (value == "1" and has_forceip) or value == "0" then return value end return nil, err_tab_adv(self) .. translate("Force IP Version not supported") end end -- IPv4 + IPv6 - dns_server -- ################################################ -- optional DNS Server to use resolving my IP -if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then + +local has_dnsserver = DDNS.env_info("has_dnsserver") + +if has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then dns = ns:taboption("advanced", Value, "dns_server", translate("DNS-Server"), translate("OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'.") .. "<br />" .. @@ -1152,7 +1170,7 @@ if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then -- if .datatype is set, then it is checked before calling this function if not value or (#value == 0) then return "" -- ignore on empty - elseif not DDNS.has_dnsserver then + elseif not has_dnsserver then return nil, err_tab_adv(self) .. translate("Specifying a DNS-Server is not supported") elseif not DTYP.host(value) then return nil, err_tab_adv(self) .. translate("use hostname, FQDN, IPv4- or IPv6-Address") @@ -1179,13 +1197,16 @@ if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then end -- IPv4 + IPv6 - force_dnstcp -- ############################################## -if DDNS.has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then + +local has_bindhost = DDNS.env_info("has_bindhost") + +if has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then tcp = ns:taboption("advanced", Flag, "force_dnstcp", translate("Force TCP on DNS") ) tcp.orientation = "horizontal" function tcp.cfgvalue(self, section) local value = AbstractValue.cfgvalue(self, section) - if not DDNS.has_bindhost and value ~= "0" then + if not has_bindhost and value ~= "0" then self.description = bold_on .. font_red .. translate("DNS requests via TCP not supported") .. font_off .. "<br />" .. translate("please disable") .. " !" .. bold_off @@ -1195,7 +1216,7 @@ if DDNS.has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) the return value end function tcp.validate(self, value) - if (value == "1" and DDNS.has_bindhost ) or value == "0" then + if (value == "1" and has_bindhost ) or value == "0" then return value end return nil, err_tab_adv(self) .. translate("DNS requests via TCP not supported") @@ -1204,13 +1225,16 @@ end -- IPv4 + IPv6 - proxy -- ##################################################### -- optional Proxy to use for http/https requests [user:password@]proxyhost[:port] -if DDNS.has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then + +local has_proxy = DDNS.env_info("has_proxy") + +if has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then pxy = ns:taboption("advanced", Value, "proxy", translate("PROXY-Server") ) pxy.placeholder="user:password@myproxy.lan:8080" function pxy.cfgvalue(self, section) local value = AbstractValue.cfgvalue(self, section) - if not DDNS.has_proxy and value ~= "" then + if not has_proxy and value ~= "" then self.description = bold_on .. font_red .. translate("PROXY-Server not supported") .. font_off .. "<br />" .. translate("please remove entry") .. "!" .. bold_off @@ -1226,7 +1250,7 @@ if DDNS.has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then -- if .datatype is set, then it is checked before calling this function if not value or (#value == 0) then return "" -- ignore on empty - elseif DDNS.has_proxy then + elseif has_proxy then local ipv6 = usev6:formvalue(section) or "0" local force = fipv:formvalue(section) or "0" local command = CTRL.luci_helper .. [[ -]] diff --git a/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua b/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua index df39a3a7e5..419201548b 100644 --- a/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua +++ b/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua @@ -48,7 +48,7 @@ if not SYS.init.enabled("ddns") then end -- No IPv6 support -if not DDNS.has_ipv6 then +if not DDNS.env_info("has_ipv6") then local v6 = s:option(DummyValue, "_no_ipv6") v6.titleref = 'http://www.openwrt.org" target="_blank' v6.rawhtml = true @@ -60,7 +60,7 @@ if not DDNS.has_ipv6 then end -- No HTTPS support -if not DDNS.has_ssl then +if not DDNS.env_info("has_ssl") then local sl = s:option(DummyValue, "_no_https") sl.titleref = DISP.build_url("admin", "system", "packages") sl.rawhtml = true @@ -74,7 +74,7 @@ if not DDNS.has_ssl then end -- No bind_network -if not DDNS.has_bindnet then +if not DDNS.env_info("has_bindnet") then local bn = s:option(DummyValue, "_no_bind_network") bn.titleref = DISP.build_url("admin", "system", "packages") bn.rawhtml = true @@ -90,7 +90,7 @@ if not DDNS.has_bindnet then end -- currently only cURL possibly without proxy support -if not DDNS.has_proxy then +if not DDNS.env_info("has_proxy") then local px = s:option(DummyValue, "_no_proxy") px.titleref = DISP.build_url("admin", "system", "packages") px.rawhtml = true @@ -104,7 +104,7 @@ if not DDNS.has_proxy then end -- "Force IP Version not supported" -if not DDNS.has_forceip then +if not DDNS.env_info("has_forceip") then local fi = s:option(DummyValue, "_no_force_ip") fi.titleref = DISP.build_url("admin", "system", "packages") fi.rawhtml = true @@ -112,11 +112,11 @@ if not DDNS.has_forceip then translate("Force IP Version not supported") .. bold_off local value = translate("BusyBox's nslookup and Wget do not support to specify " .. "the IP version to use for communication with DDNS Provider!") - if not (DDNS.has_wgetssl or DDNS.has_curl or DDNS.has_fetch) then + if not (DDNS.env_info("has_wgetssl") or DDNS.env_info("has_curl") or DDNS.env_info("has_fetch")) then value = value .. "<br />- " .. translate("You should install 'wget' or 'curl' or 'uclient-fetch' package.") end - if not DDNS.has_bindhost then + if not DDNS.env_info("has_bindhost") then value = value .. "<br />- " .. translate("You should install 'bind-host' or 'knot-host' or 'drill' package for DNS requests.") end @@ -124,7 +124,7 @@ if not DDNS.has_forceip then end -- "DNS requests via TCP not supported" -if not DDNS.has_bindhost then +if not DDNS.env_info("has_bindhost") then local dt = s:option(DummyValue, "_no_dnstcp") dt.titleref = DISP.build_url("admin", "system", "packages") dt.rawhtml = true @@ -137,7 +137,7 @@ if not DDNS.has_bindhost then end -- nslookup compiled with musl produce problems when using -if not DDNS.has_dnsserver then +if not DDNS.env_info("has_dnsserver") then local ds = s:option(DummyValue, "_no_dnsserver") ds.titleref = DISP.build_url("admin", "system", "packages") ds.rawhtml = true @@ -151,7 +151,7 @@ if not DDNS.has_dnsserver then end -- certificates installed -if DDNS.has_ssl and not DDNS.has_cacerts then +if DDNS.env_info("has_ssl") and not DDNS.env_info("has_cacerts") then local ca = s:option(DummyValue, "_no_certs") ca.titleref = DISP.build_url("admin", "system", "packages") ca.rawhtml = true diff --git a/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua b/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua index 114f831c17..11f73800ea 100644 --- a/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua +++ b/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua @@ -1,21 +1,20 @@ -- Copyright 2014-2018 Christian Schoenebeck <christian dot schoenebeck at gmail dot com> -- Licensed to the public under the Apache License 2.0. -local NXFS = require "nixio.fs" local DISP = require "luci.dispatcher" local HTTP = require "luci.http" local SYS = require "luci.sys" local CTRL = require "luci.controller.ddns" -- this application's controller local DDNS = require "luci.tools.ddns" -- ddns multiused functions -local show_hints = not (DDNS.has_ipv6 -- IPv6 support - and DDNS.has_ssl -- HTTPS support - and DDNS.has_proxy -- Proxy support - and DDNS.has_bindhost -- DNS TCP support - and DDNS.has_forceip -- Force IP version - and DDNS.has_dnsserver -- DNS server support - and DDNS.has_bindnet -- Bind to network/interface - and DDNS.has_cacerts -- certificates installed at /etc/ssl/certs +local show_hints = not (DDNS.env_info("has_ipv6") -- IPv6 support + and DDNS.env_info("has_ssl") -- HTTPS support + and DDNS.env_info("has_proxy") -- Proxy support + and DDNS.env_info("has_bindhost") -- DNS TCP support + and DDNS.env_info("has_forceip") -- Force IP version + and DDNS.env_info("has_dnsserver") -- DNS server support + and DDNS.env_info("has_bindnet") -- Bind to network/interface + and DDNS.env_info("has_cacerts") -- certificates installed at /etc/ssl/certs ) local not_enabled = not SYS.init.enabled("ddns") local need_update = not CTRL.service_ok() diff --git a/applications/luci-app-ddns/luasrc/tools/ddns.lua b/applications/luci-app-ddns/luasrc/tools/ddns.lua index 690b9b30ce..57913a51fe 100755 --- a/applications/luci-app-ddns/luasrc/tools/ddns.lua +++ b/applications/luci-app-ddns/luasrc/tools/ddns.lua @@ -5,36 +5,134 @@ module("luci.tools.ddns", package.seeall) local NX = require "nixio" local NXFS = require "nixio.fs" -local OPKG = require "luci.model.ipkg" local UCI = require "luci.model.uci" local SYS = require "luci.sys" -local UTIL = require "luci.util" -local function _check_certs() - local _, v = NXFS.glob("/etc/ssl/certs/*.crt") - if ( v == 0 ) then _, v = NXFS.glob("/etc/ssl/certs/*.pem") end - return (v > 0) -end +function env_info(type) + + if ( type == "has_ssl" ) or ( type == "has_proxy" ) or ( type == "has_forceip" ) + or ( type == "has_bindnet" ) or ( type == "has_fetch" ) + or ( type == "has_wgetssl" ) or ( type == "has_curl" ) + or ( type == "has_curlssl" ) or ( type == "has_curlpxy" ) + or ( type == "has_fetchssl" ) or ( type == "has_bbwget" ) then + + local function has_wgetssl() + return (SYS.call( [[which wget-ssl >/dev/null 2>&1]] ) == 0) -- and true or nil + end + + local function has_curlssl() + return (SYS.call( [[$(which curl) -V 2>&1 | grep "Protocols:" | grep -qF "https"]] ) ~= 0) + end + + local function has_fetch() + return (SYS.call( [[which uclient-fetch >/dev/null 2>&1]] ) == 0) + end + + local function has_fetchssl() + return NXFS.access("/lib/libustream-ssl.so") + end + + local function has_curl() + return (SYS.call( [[which curl >/dev/null 2>&1]] ) == 0) + end + + local function has_curlpxy() + return (SYS.call( [[grep -i "all_proxy" /usr/lib/libcurl.so* >/dev/null 2>&1]] ) == 0) + end + + local function has_bbwget() + return (SYS.call( [[$(which wget) -V 2>&1 | grep -iqF "busybox"]] ) == 0) + end + + if type == "has_wgetssl" then + return has_wgetssl() + + elseif type == "has_curl" then + return has_curl() + + elseif type == "has_curlssl" then + return has_curlssl() + + elseif type == "has_curlpxy" then + return has_curlpxy() + + elseif type == "has_fetch" then + return has_fetch() + + elseif type == "has_fetchssl" then + return has_fetchssl() + + elseif type == "has_bbwget" then + return has_bbwget() + + elseif type == "has_ssl" then + if has_wgetssl() then return true end + if has_curlssl() then return true end + if (has_fetch() and has_fetchssl()) then return true end + return false + + elseif type == "has_proxy" then + if has_wgetssl() then return true end + if has_curlpxy() then return true end + if has_fetch() then return true end + if has_bbwget() then return true end + return false + + elseif type == "has_forceip" then + if has_wgetssl() then return true end + if has_curl() then return true end + if has_fetch() then return true end -- only really needed for transfer + return false + + elseif type == "has_bindnet" then + if has_curl() then return true end + if has_wgetssl() then return true end + return false + end + + elseif ( type == "has_dnsserver" ) or ( type == "has_bindhost" ) or ( type == "has_hostip" ) or ( type == "has_nslookup" ) then + local function has_bindhost() + if (SYS.call( [[which host >/dev/null 2>&1]] ) == 0) then return true end + if (SYS.call( [[which host >/dev/null 2>&1]] ) == 0) then return true end + if (SYS.call( [[which khost >/dev/null 2>&1]] ) == 0) then return true end + if (SYS.call( [[which drill >/dev/null 2>&1]] ) == 0) then return true end + return false + end + + local function has_hostip() + return (SYS.call( [[which hostip >/dev/null 2>&1]] ) == 0) + end + + local function has_nslookup() + return (SYS.call( [[$(which nslookup) localhost 2>&1 | grep -qF "(null)"]] ) ~= 0) + end + + if type == "has_bindhost" then + return has_bindhost() + elseif type == "has_hostip" then + return has_hostip() + elseif type == "has_nslookup" then + return has_nslookup() + elseif tyep == "has_dnsserver" then + if has_bindhost() then return true end + if has_hostip() then return true end + if has_nslookup() then return true end + return false + end + + elseif type == "has_ipv6" then + return (NXFS.access("/proc/net/ipv6_route") and NXFS.access("/usr/sbin/ip6tables")) + + elseif type == "has_cacerts" then + --old _check_certs() local function + local _, v = NXFS.glob("/etc/ssl/certs/*.crt") + if ( v == 0 ) then _, v = NXFS.glob("/etc/ssl/certs/*.pem") end + return (v > 0) + else + return + end -has_wgetssl = (SYS.call( [[which wget-ssl >/dev/null 2>&1]] ) == 0) -- and true or nil -has_curl = (SYS.call( [[which curl >/dev/null 2>&1]] ) == 0) -has_curlssl = (SYS.call( [[$(which curl) -V 2>&1 | grep "Protocols:" | grep -qF "https"]] ) ~= 0) -has_curlpxy = (SYS.call( [[grep -i "all_proxy" /usr/lib/libcurl.so* >/dev/null 2>&1]] ) == 0) -has_fetch = (SYS.call( [[which uclient-fetch >/dev/null 2>&1]] ) == 0) -has_fetchssl = NXFS.access("/lib/libustream-ssl.so") -has_bbwget = (SYS.call( [[$(which wget) -V 2>&1 | grep -iqF "busybox"]] ) == 0) -has_bindhost = (SYS.call( [[which host >/dev/null 2>&1]] ) == 0) - or (SYS.call( [[which khost >/dev/null 2>&1]] ) == 0) - or (SYS.call( [[which drill >/dev/null 2>&1]] ) == 0) -has_hostip = (SYS.call( [[which hostip >/dev/null 2>&1]] ) == 0) -has_nslookup = (SYS.call( [[$(which nslookup) localhost 2>&1 | grep -qF "(null)"]] ) ~= 0) -has_ipv6 = (NXFS.access("/proc/net/ipv6_route") and NXFS.access("/usr/sbin/ip6tables")) -has_ssl = (has_wgetssl or has_curlssl or (has_fetch and has_fetchssl)) -has_proxy = (has_wgetssl or has_curlpxy or has_fetch or has_bbwget) -has_forceip = (has_wgetssl or has_curl or has_fetch) -- only really needed for transfer -has_dnsserver = (has_bindhost or has_hostip or has_nslookup) -has_bindnet = (has_wgetssl or has_curl) -has_cacerts = _check_certs() +end -- function to calculate seconds from given interval and unit function calc_seconds(interval, unit) diff --git a/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm b/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm index 5bdcb03e73..7fcb882a15 100644 --- a/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm +++ b/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm @@ -1,4 +1,3 @@ - <!-- ++ BEGIN ++ Dynamic DNS ++ system_status.htm ++ --> <script type="text/javascript">//<![CDATA[ // helper to move status data to the relevant @@ -10,8 +9,8 @@ if ( !(tbl) ) { return; } // clear all rows - while (tbl.rows.length > 1) - tbl.deleteRow(1); + while (tbl.firstElementChild !== tbl.lastElementChild) + tbl.removeChild(tbl.lastElementChild); // variable for Modulo-Division use to set cbi-rowstyle-? (0 or 1) var i = -1; @@ -21,22 +20,22 @@ if (data[0].enabled == 0) { var txt = '<strong><font color="red"><%:DDNS Autostart disabled%></font>' ; var url = '<a href="' + data[0].url_up + '"><%:enable here%></a></strong>' ; - var tr = tbl.insertRow(-1); - tr.className = 'cbi-section-table-row cbi-rowstyle-' + (((j + i) % 2) + 1); - var td = tr.insertCell(-1); - td.colSpan = 2 ; - td.innerHTML = txt + " - " + url - tr.insertCell(-1).colSpan = 3 ; + tbl.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format(((j + i) % 2) + 1), [ + E('<div class="td">', [ txt," - ", url ]) + ])); i++ ; } + var configuration; + var next_update; + var lookup; + var registered_ip; + var network; + for( j = 1; j < data.length; j++ ) { - var tr = tbl.insertRow(-1); - tr.className = 'cbi-section-table-row cbi-rowstyle-' + (((j + i) % 2) + 1) ; - // configuration - tr.insertCell(-1).innerHTML = '<strong>' + data[j].section + '</strong>' ; + configuration = data[j].section; // pid // data[j].pid ignored here @@ -47,66 +46,74 @@ // next update switch (data[j].datenext) { case "_empty_": - tr.insertCell(-1).innerHTML = '<em><%:Unknown error%></em>' ; + next_update = '<em><%:Unknown error%></em>'; break; case "_stopped_": - tr.insertCell(-1).innerHTML = '<em><%:Stopped%></em>' ; + next_update = '<em><%:Stopped%></em>'; break; case "_disabled_": - tr.insertCell(-1).innerHTML = '<em><%:Disabled%></em>' ; + next_update = '<em><%:Disabled%></em>'; break; case "_noupdate_": - tr.insertCell(-1).innerHTML = '<em><%:Update error%></em>' ; + next_update = '<em><%:Update error%></em>'; break; case "_runonce_": - tr.insertCell(-1).innerHTML = '<em><%:Run once%></em>' ; + next_update = '<em><%:Run once%></em>'; break; case "_verify_": - tr.insertCell(-1).innerHTML = '<em><%:Verify%></em>'; + next_update = '<em><%:Verify%></em>'; break; default: - tr.insertCell(-1).innerHTML = data[j].datenext ; + next_update = data[j].datenext; break; } // lookup if (data[j].lookup == "_nolookup_") - tr.insertCell(-1).innerHTML = '<em><%:config error%></em>'; + lookup = '<em><%:config error%></em>'; else - tr.insertCell(-1).innerHTML = data[j].lookup; + lookup = data[j].lookup; // registered IP switch (data[j].reg_ip) { case "_nolookup_": - tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>'; + registered_ip = '<em><%:config error%></em>'; break; case "_nodata_": - tr.insertCell(-1).innerHTML = '<em><%:No data%></em>'; + registered_ip = '<em><%:No data%></em>'; break; case "_noipv6_": - tr.insertCell(-1).innerHTML = '<em><%:IPv6 not supported%></em>'; + registered_ip = '<em><%:IPv6 not supported%></em>'; break; default: - tr.insertCell(-1).innerHTML = data[j].reg_ip; + registered_ip = data[j].reg_ip; break; } // monitored interface if (data[j].iface == "_nonet_") - tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>'; + network = '<em><%:Config error%></em>'; else - tr.insertCell(-1).innerHTML = data[j].iface; + network = data[j].iface; + + tbl.appendChild(E('<div class="tr cbi-section-table-row cbi-rowstyle-%d">'.format(((j + i) % 2) + 1), [ + E('<div class="td">', [ E('<strong>', configuration) ]), + E('<div class="td">', next_update), + E('<div class="td">', lookup), + E('<div class="td">', registered_ip), + E('<div class="td">', network) + ])); } - if (tbl.rows.length == 1 || (data[0].enabled == 0 && tbl.rows.length == 2) ) { + if (tbl.firstElementChild === tbl.lastElementChild || (data[0].enabled == 0 && tbl.childNodes.length == 2) ) { var br = '<br />'; - if (tbl.rows.length > 1) + var msg = '<%:There is no service configured.%>'; + if (tbl.firstElementChild !== tbl.lastElementChild) br = ''; - var tr = tbl.insertRow(-1); - tr.className = "cbi-section-table-row"; - var td = tr.insertCell(-1); - td.colSpan = 5; - td.innerHTML = '<em>' + br + '<%:There is no service configured.%></em>' ; + msg = br + msg; + tbl.appendChild(E('<div class="tr cbi-section-table-row">', [ + E('<div class="td">', [ E('<em>', msg) ]) + ])); } } @@ -128,17 +135,17 @@ <fieldset class="cbi-section" id="ddns_status_section"> <legend><a href="<%=url([[admin]], [[services]], [[ddns]])%>"><%:Dynamic DNS%></a></legend> - <table class="cbi-section-table" id="ddns_status_table"> - <tr class="cbi-section-table-titles"> - <th class="cbi-section-table-cell"><%:Configuration%></th> - <th class="cbi-section-table-cell"><%:Next Update%></th> - <th class="cbi-section-table-cell"><%:Lookup Hostname%></th> - <th class="cbi-section-table-cell"><%:Registered IP%></th> - <th class="cbi-section-table-cell"><%:Network%></th> - </tr> - <tr class="cbi-section-table-row"> - <td colspan="5"><em><br /><%:Collecting data...%></em></td> - </tr> - </table> + <div class="table cbi-section-table" id="ddns_status_table"> + <div class="tr cbi-section-table-titles"> + <div class="th cbi-section-table-cell"><%:Configuration%></div> + <div class="th cbi-section-table-cell"><%:Next Update%></div> + <div class="th cbi-section-table-cell"><%:Lookup Hostname%></div> + <div class="th cbi-section-table-cell"><%:Registered IP%></div> + <div class="th cbi-section-table-cell"><%:Network%></div> + </div> + <div class="tr cbi-section-table-row"> + <div class="td"><em><br /><%:Collecting data...%></em></div> + </div> + </div> </fieldset> <!-- ++ END ++ Dynamic DNS ++ system_status.htm ++ --> diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua index 17a49483d7..d51f8fb79b 100644 --- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua +++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua @@ -55,6 +55,7 @@ o = s:option(Value, "src", translate("Source zone")) o.nocreate = true o.default = "wan" o.template = "cbi/firewall_zonelist" +o.rmempty = false o = s:option(DynamicList, "src_mac", @@ -88,6 +89,10 @@ o.rmempty = true o.datatype = "neg(portrange)" o.placeholder = translate("any") +o:depends("proto", "tcp") +o:depends("proto", "udp") +o:depends("proto", "tcp udp") +o:depends("proto", "tcpudp") o = s:option(Value, "src_dip", translate("External IP address"), @@ -108,7 +113,10 @@ o = s:option(Value, "src_dport", translate("External port"), "destination port or port range on this host")) o.datatype = "neg(portrange)" - +o:depends("proto", "tcp") +o:depends("proto", "udp") +o:depends("proto", "tcp udp") +o:depends("proto", "tcpudp") o = s:option(Value, "dest", translate("Internal zone")) o.nocreate = true @@ -133,6 +141,10 @@ o = s:option(Value, "dest_port", o.placeholder = translate("any") o.datatype = "portrange" +o:depends("proto", "tcp") +o:depends("proto", "udp") +o:depends("proto", "tcp udp") +o:depends("proto", "tcpudp") o = s:option(Flag, "reflection", translate("Enable NAT Loopback")) o.rmempty = true diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua index e61ce73cdd..5485ebf096 100644 --- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua +++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua @@ -54,7 +54,7 @@ function s.parse(self, ...) if created then m.uci:save("firewall") luci.http.redirect(ds.build_url( - "admin/network/firewall/redirect", created + "admin/network/firewall/forwards", created )) end end diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua index 1c838888f1..b57201041d 100644 --- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua +++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua @@ -115,6 +115,10 @@ elseif rule_type == "redirect" then o.datatype = "neg(portrange)" o.placeholder = translate("any") + o:depends("proto", "tcp") + o:depends("proto", "udp") + o:depends("proto", "tcp udp") + o:depends("proto", "tcpudp") o = s:option(Value, "dest", translate("Destination zone")) o.nocreate = true @@ -139,6 +143,10 @@ elseif rule_type == "redirect" then o.placeholder = translate("any") o.datatype = "neg(portrange)" + o:depends("proto", "tcp") + o:depends("proto", "udp") + o:depends("proto", "tcp udp") + o:depends("proto", "tcpudp") o = s:option(Value, "src_dip", translate("SNAT IP address"), @@ -163,6 +171,10 @@ elseif rule_type == "redirect" then o.rmempty = true o.placeholder = translate('Do not rewrite') + o:depends("proto", "tcp") + o:depends("proto", "udp") + o:depends("proto", "tcp udp") + o:depends("proto", "tcpudp") s:option(Value, "extra", translate("Extra arguments"), @@ -255,7 +267,7 @@ else o = s:option(Value, "src", translate("Source zone")) o.nocreate = true o.allowany = true - o.default = "wan" + o.allowlocal = "src" o.template = "cbi/firewall_zonelist" @@ -281,12 +293,26 @@ else o.datatype = "list(neg(portrange))" o.placeholder = translate("any") + o:depends("proto", "tcp") + o:depends("proto", "udp") + o:depends("proto", "tcp udp") + o:depends("proto", "tcpudp") - o = s:option(Value, "dest", translate("Destination zone")) + o = s:option(Value, "dest_local", translate("Output zone")) + o.nocreate = true + o.allowany = true + o.rmempty = false + o.template = "cbi/firewall_zonelist" + o.alias = "dest" + o:depends("src", "") + + o = s:option(Value, "dest_remote", translate("Destination zone")) o.nocreate = true o.allowany = true o.allowlocal = true o.template = "cbi/firewall_zonelist" + o.alias = "dest" + o:depends({["src"] = "", ["!reverse"] = true}) o = s:option(Value, "dest_ip", translate("Destination address")) @@ -302,6 +328,10 @@ else o.datatype = "list(neg(portrange))" o.placeholder = translate("any") + o:depends("proto", "tcp") + o:depends("proto", "udp") + o:depends("proto", "tcp udp") + o:depends("proto", "tcpudp") o = s:option(ListValue, "target", translate("Action")) o.default = "ACCEPT" @@ -316,9 +346,9 @@ else translate("Passes additional arguments to iptables. Use with care!")) end -o = s:option(MultiValue, "weekdays", translate("Week Days")) -o.oneline = true -o.widget = "checkbox" +o = s:option(DropDown, "weekdays", translate("Week Days")) +o.multiple = true +o.display = 5 o:value("Sun", translate("Sunday")) o:value("Mon", translate("Monday")) o:value("Tue", translate("Tuesday")) @@ -327,9 +357,9 @@ o:value("Thu", translate("Thursday")) o:value("Fri", translate("Friday")) o:value("Sat", translate("Saturday")) -o = s:option(MultiValue, "monthdays", translate("Month Days")) -o.oneline = true -o.widget = "checkbox" +o = s:option(DropDown, "monthdays", translate("Month Days")) +o.multiple = true +o.display = 15 for i = 1,31 do o:value(translate(i)) end diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua index c533491977..22dec5ee6b 100644 --- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua +++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua @@ -89,17 +89,31 @@ local function rule_proto_txt(self, s) end local function rule_src_txt(self, s) - local z = ft.fmt_zone(self.map:get(s, "src"), translate("any zone")) - local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any host")) + local z = ft.fmt_zone(self.map:get(s, "src")) local p = ft.fmt_port(self.map:get(s, "src_port")) local m = ft.fmt_mac(self.map:get(s, "src_mac")) - if p and m then - return translatef("From %s in %s with source %s and %s", a, z, p, m) - elseif p or m then - return translatef("From %s in %s with source %s", a, z, p or m) + -- Forward/Input + if z and #z > 0 then + local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any host")) + if p and m then + return translatef("From %s in %s with source %s and %s", a, z, p, m) + elseif p or m then + return translatef("From %s in %s with source %s", a, z, p or m) + else + return translatef("From %s in %s", a, z) + end + + -- Output else - return translatef("From %s in %s", a, z) + local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any router IP")) + if p and m then + return translatef("From %s on <var>this device</var> with source %s and %s", a, p, m) + elseif p or m then + return translatef("From %s on <var>this device</var> with source %s", a, p or m) + else + return translatef("From %s on <var>this device</var>", a) + end end end @@ -158,7 +172,7 @@ target = s:option(DummyValue, "target", translate("Action")) target.rawhtml = true target.width = "20%" function target.cfgvalue(self, s) - local t = ft.fmt_target(self.map:get(s, "target"), self.map:get(s, "dest")) + local t = ft.fmt_target(self.map:get(s, "target"), self.map:get(s, "src"), self.map:get(s, "dest")) local l = ft.fmt_limit(self.map:get(s, "limit"), self.map:get(s, "limit_burst")) diff --git a/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua b/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua index a42c1499f0..e168c3c605 100644 --- a/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua +++ b/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua @@ -101,9 +101,12 @@ end function net.write(self, section, value) zone:clear_networks() - local n - for n in ut.imatch(value) do - zone:add_network(n) + local net + for net in ut.imatch(value) do + local n = nw:get_network(net) or nw:add_network(net, { proto = "none" }) + if n then + zone:add_network(n:name()) + end end end diff --git a/applications/luci-app-firewall/luasrc/tools/firewall.lua b/applications/luci-app-firewall/luasrc/tools/firewall.lua index 2d89bfa2a6..055342bfb3 100644 --- a/applications/luci-app-firewall/luasrc/tools/firewall.lua +++ b/applications/luci-app-firewall/luasrc/tools/firewall.lua @@ -198,8 +198,18 @@ function fmt_limit(limit, burst) end end -function fmt_target(x, dest) - if dest and #dest > 0 then +function fmt_target(x, src, dest) + if not src or #src == 0 then + if x == "ACCEPT" then + return _("Accept output") + elseif x == "REJECT" then + return _("Refuse output") + elseif x == "NOTRACK" then + return _("Do not track output") + else --if x == "DROP" then + return _("Discard output") + end + elseif dest and #dest > 0 then if x == "ACCEPT" then return _("Accept forward") elseif x == "REJECT" then diff --git a/applications/luci-app-firewall/po/ca/firewall.po b/applications/luci-app-firewall/po/ca/firewall.po index 2ccffca9a7..b206fce1e4 100644 --- a/applications/luci-app-firewall/po/ca/firewall.po +++ b/applications/luci-app-firewall/po/ca/firewall.po @@ -314,6 +314,9 @@ msgstr "Altre..." msgid "Output" msgstr "Sortida" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "Passa paràmetres addicionals al iptables. Utilitzeu-ho amb cura!" diff --git a/applications/luci-app-firewall/po/cs/firewall.po b/applications/luci-app-firewall/po/cs/firewall.po index 4cbf356d0b..3ecd433a7d 100644 --- a/applications/luci-app-firewall/po/cs/firewall.po +++ b/applications/luci-app-firewall/po/cs/firewall.po @@ -309,6 +309,9 @@ msgstr "Ostatní ..." msgid "Output" msgstr "Výstup" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "Předává další argumenty iptables. Používat opatrně!" diff --git a/applications/luci-app-firewall/po/de/firewall.po b/applications/luci-app-firewall/po/de/firewall.po index 0ee6007dd6..e39d4f8566 100644 --- a/applications/luci-app-firewall/po/de/firewall.po +++ b/applications/luci-app-firewall/po/de/firewall.po @@ -307,6 +307,9 @@ msgstr "Anderes..." msgid "Output" msgstr "Ausgang" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "Gibt zusätzliche Kommandozeilenargumente an iptables weiter. Mit Vorsicht " diff --git a/applications/luci-app-firewall/po/el/firewall.po b/applications/luci-app-firewall/po/el/firewall.po index 9ddd4c9db1..783fcd462c 100644 --- a/applications/luci-app-firewall/po/el/firewall.po +++ b/applications/luci-app-firewall/po/el/firewall.po @@ -306,6 +306,9 @@ msgstr "Άλλο..." msgid "Output" msgstr "Έξοδος" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" diff --git a/applications/luci-app-firewall/po/en/firewall.po b/applications/luci-app-firewall/po/en/firewall.po index f0fe0b3782..9d9166d68f 100644 --- a/applications/luci-app-firewall/po/en/firewall.po +++ b/applications/luci-app-firewall/po/en/firewall.po @@ -305,6 +305,9 @@ msgstr "" msgid "Output" msgstr "Output" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" diff --git a/applications/luci-app-firewall/po/es/firewall.po b/applications/luci-app-firewall/po/es/firewall.po index 000853e9bd..e96fecad99 100644 --- a/applications/luci-app-firewall/po/es/firewall.po +++ b/applications/luci-app-firewall/po/es/firewall.po @@ -312,6 +312,9 @@ msgstr "Otros..." msgid "Output" msgstr "Salida" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "Pasa más parámetros a IPTables. ¡Usar con cuidado!" diff --git a/applications/luci-app-firewall/po/fr/firewall.po b/applications/luci-app-firewall/po/fr/firewall.po index 74c28b8836..4a34064868 100644 --- a/applications/luci-app-firewall/po/fr/firewall.po +++ b/applications/luci-app-firewall/po/fr/firewall.po @@ -307,6 +307,9 @@ msgstr "Autre..." msgid "Output" msgstr "Sortie" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" diff --git a/applications/luci-app-firewall/po/he/firewall.po b/applications/luci-app-firewall/po/he/firewall.po index 0416661c26..5511e8ab10 100644 --- a/applications/luci-app-firewall/po/he/firewall.po +++ b/applications/luci-app-firewall/po/he/firewall.po @@ -296,6 +296,9 @@ msgstr "" msgid "Output" msgstr "" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" diff --git a/applications/luci-app-firewall/po/hu/firewall.po b/applications/luci-app-firewall/po/hu/firewall.po index 33a305ce8e..30c242913d 100644 --- a/applications/luci-app-firewall/po/hu/firewall.po +++ b/applications/luci-app-firewall/po/hu/firewall.po @@ -313,6 +313,9 @@ msgstr "Egyéb..." msgid "Output" msgstr "Kimenet" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "További argumentumok küldése az iptables részére. Használja körültekintően!" diff --git a/applications/luci-app-firewall/po/it/firewall.po b/applications/luci-app-firewall/po/it/firewall.po index 4808d12475..e26c504b95 100644 --- a/applications/luci-app-firewall/po/it/firewall.po +++ b/applications/luci-app-firewall/po/it/firewall.po @@ -311,6 +311,9 @@ msgstr "Altri..." msgid "Output" msgstr "" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "Passa comandi addizionali a iptables. Usare con cura!" diff --git a/applications/luci-app-firewall/po/ja/firewall.po b/applications/luci-app-firewall/po/ja/firewall.po index 27109904ba..d4cf84c956 100644 --- a/applications/luci-app-firewall/po/ja/firewall.po +++ b/applications/luci-app-firewall/po/ja/firewall.po @@ -316,6 +316,9 @@ msgstr "その他のプロトコル" msgid "Output" msgstr "送信" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "iptablesにパススルーする追加の引数を設定してください。ただし、注意して設定し" diff --git a/applications/luci-app-firewall/po/ko/firewall.po b/applications/luci-app-firewall/po/ko/firewall.po index dd4f96197a..5c3d02c1e2 100644 --- a/applications/luci-app-firewall/po/ko/firewall.po +++ b/applications/luci-app-firewall/po/ko/firewall.po @@ -304,6 +304,9 @@ msgstr "" msgid "Output" msgstr "" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "iptables 명령에 추가 인자들을 더합니다. 조심해 사용하세요!" diff --git a/applications/luci-app-firewall/po/ms/firewall.po b/applications/luci-app-firewall/po/ms/firewall.po index 58aea1fd0b..9688622ba4 100644 --- a/applications/luci-app-firewall/po/ms/firewall.po +++ b/applications/luci-app-firewall/po/ms/firewall.po @@ -295,6 +295,9 @@ msgstr "" msgid "Output" msgstr "" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" diff --git a/applications/luci-app-firewall/po/no/firewall.po b/applications/luci-app-firewall/po/no/firewall.po index 2a13b6b3cd..d59fec3646 100644 --- a/applications/luci-app-firewall/po/no/firewall.po +++ b/applications/luci-app-firewall/po/no/firewall.po @@ -308,6 +308,9 @@ msgstr "Andre..." msgid "Output" msgstr "Utdata" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "Sender flere argumenter til iptables. Bruk med forsiktighet!" diff --git a/applications/luci-app-firewall/po/pl/firewall.po b/applications/luci-app-firewall/po/pl/firewall.po index a08a1e5606..7c087ef02b 100644 --- a/applications/luci-app-firewall/po/pl/firewall.po +++ b/applications/luci-app-firewall/po/pl/firewall.po @@ -316,6 +316,9 @@ msgstr "Inne..." msgid "Output" msgstr "Wyjście (Output)" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "Przekazuje dodatkowe argumenty do iptables. Zachowaj szczególną ostrożność!" diff --git a/applications/luci-app-firewall/po/pt-br/firewall.po b/applications/luci-app-firewall/po/pt-br/firewall.po index 7da028bee4..bfcdd54d9b 100644 --- a/applications/luci-app-firewall/po/pt-br/firewall.po +++ b/applications/luci-app-firewall/po/pt-br/firewall.po @@ -313,6 +313,9 @@ msgstr "Outro..." msgid "Output" msgstr "Saída" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "Passa argumentos adicionais para o iptables. Use com cuidado!" diff --git a/applications/luci-app-firewall/po/pt/firewall.po b/applications/luci-app-firewall/po/pt/firewall.po index 543489e1ad..2536b7a369 100644 --- a/applications/luci-app-firewall/po/pt/firewall.po +++ b/applications/luci-app-firewall/po/pt/firewall.po @@ -314,6 +314,9 @@ msgstr "Outro..." msgid "Output" msgstr "Saída" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "Passa argumentos adicionais para o iptables. Usar com cuidado!" diff --git a/applications/luci-app-firewall/po/ro/firewall.po b/applications/luci-app-firewall/po/ro/firewall.po index 937efe722b..dbae338229 100644 --- a/applications/luci-app-firewall/po/ro/firewall.po +++ b/applications/luci-app-firewall/po/ro/firewall.po @@ -300,6 +300,9 @@ msgstr "Altele..." msgid "Output" msgstr "Ieşire" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" diff --git a/applications/luci-app-firewall/po/ru/firewall.po b/applications/luci-app-firewall/po/ru/firewall.po index 528756d7e3..a441c5a709 100644 --- a/applications/luci-app-firewall/po/ru/firewall.po +++ b/applications/luci-app-firewall/po/ru/firewall.po @@ -318,6 +318,9 @@ msgstr "Другое..." msgid "Output" msgstr "Исходящий трафик" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "Передаёт дополнительные аргументы таблице iptables. Используйте с " diff --git a/applications/luci-app-firewall/po/sk/firewall.po b/applications/luci-app-firewall/po/sk/firewall.po index a382bde7db..c6952faa35 100644 --- a/applications/luci-app-firewall/po/sk/firewall.po +++ b/applications/luci-app-firewall/po/sk/firewall.po @@ -296,6 +296,9 @@ msgstr "" msgid "Output" msgstr "" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" diff --git a/applications/luci-app-firewall/po/sv/firewall.po b/applications/luci-app-firewall/po/sv/firewall.po index d5f6a2d8a5..0301c25b5a 100644 --- a/applications/luci-app-firewall/po/sv/firewall.po +++ b/applications/luci-app-firewall/po/sv/firewall.po @@ -302,6 +302,9 @@ msgstr "Andra..." msgid "Output" msgstr "Utmatning" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" diff --git a/applications/luci-app-firewall/po/templates/firewall.pot b/applications/luci-app-firewall/po/templates/firewall.pot index 6ff4c3ca0f..d2691cc44a 100644 --- a/applications/luci-app-firewall/po/templates/firewall.pot +++ b/applications/luci-app-firewall/po/templates/firewall.pot @@ -289,6 +289,9 @@ msgstr "" msgid "Output" msgstr "" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" diff --git a/applications/luci-app-firewall/po/tr/firewall.po b/applications/luci-app-firewall/po/tr/firewall.po index 1dd1e6f9cf..9c5adb1cd2 100644 --- a/applications/luci-app-firewall/po/tr/firewall.po +++ b/applications/luci-app-firewall/po/tr/firewall.po @@ -296,6 +296,9 @@ msgstr "" msgid "Output" msgstr "" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" diff --git a/applications/luci-app-firewall/po/uk/firewall.po b/applications/luci-app-firewall/po/uk/firewall.po index 86ff65edf1..7234ceff66 100644 --- a/applications/luci-app-firewall/po/uk/firewall.po +++ b/applications/luci-app-firewall/po/uk/firewall.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"PO-Revision-Date: 2012-12-29 12:53+0200\n" +"PO-Revision-Date: 2018-06-10 17:15+0200\n" "Last-Translator: Yurii <yuripet@gmail.com>\n" "Language-Team: none\n" "Language: uk\n" @@ -10,7 +10,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Pootle 2.0.6\n" + +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" msgid "%s in %s" msgstr "%s у %s" @@ -40,10 +42,10 @@ msgid "<var>%s</var> and limit to %s" msgstr "<var>%s</var> з лімітом %s" msgid "Accept forward" -msgstr "" +msgstr "Приймати переспрямовування" msgid "Accept input" -msgstr "" +msgstr "Приймати введення" msgid "Action" msgstr "Дія" @@ -58,10 +60,10 @@ msgid "Advanced Settings" msgstr "Розширені настройки" msgid "Allow forward from <em>source zones</em>:" -msgstr "Дозволити спрямовування від <em>зон-джерел</em>:" +msgstr "Дозволити переспрямовування від <em>зон-джерел</em>:" msgid "Allow forward to <em>destination zones</em>:" -msgstr "Дозволити спрямовування до <em>зон призначення</em>:" +msgstr "Дозволити переспрямовування до <em>зон призначення</em>:" msgid "Any" msgstr "Будь-який" @@ -95,22 +97,22 @@ msgid "Destination zone" msgstr "Зона призначення" msgid "Disable" -msgstr "" +msgstr "Вимкнути" msgid "Discard forward" -msgstr "" +msgstr "Відкидати переспрямовування" msgid "Discard input" -msgstr "" +msgstr "Відкидати введення" msgid "Do not rewrite" msgstr "Не перезаписувати" msgid "Do not track forward" -msgstr "" +msgstr "Не відслідковувати переспрямовування" msgid "Do not track input" -msgstr "" +msgstr "Не відслідковувати введення" msgid "Drop invalid packets" msgstr "Відкидати помилкові пакети" @@ -128,7 +130,7 @@ msgid "Enable logging on this zone" msgstr "Увімкнути реєстрування у цій зоні" msgid "Experimental feature. Not fully compatible with QoS/SQM." -msgstr "" +msgstr "Експериментальна функція. Не повністю сумісно з QoS / SQM." msgid "External IP address" msgstr "Зовнішня IP-адреса" @@ -149,7 +151,7 @@ msgid "Firewall - Custom Rules" msgstr "Брандмауер — Настроювані правила" msgid "Firewall - Port Forwards" -msgstr "Брандмауер — Спрямовування портів" +msgstr "Брандмауер — Переспрямовування портів" msgid "Firewall - Traffic Rules" msgstr "Брандмауер — Правила трафіка" @@ -161,13 +163,13 @@ msgid "Force connection tracking" msgstr "Увімкнути відстеження з'єднань" msgid "Forward" -msgstr "Спрямовування" +msgstr "Переспрямовування" msgid "Forward to" -msgstr "спрямовування до" +msgstr "переспрямовування до" msgid "Friday" -msgstr "" +msgstr "П'ятниця" msgid "From %s in %s" msgstr "%s у %s" @@ -182,16 +184,16 @@ msgid "General Settings" msgstr "Загальні настройки" msgid "Hardware flow offloading" -msgstr "" +msgstr "Апаратні засоби розвантаження потоку" msgid "IP" -msgstr "" +msgstr "IP-адреса" msgid "IP range" -msgstr "" +msgstr "Діапазон IP" msgid "IPs" -msgstr "" +msgstr "IP-алреси" msgid "IPv4" msgstr "IPv4" @@ -212,7 +214,7 @@ msgid "Input" msgstr "Вхідний" msgid "Inter-Zone Forwarding" -msgstr "Спрямовування крізь зони" +msgstr "Переспрямовування між зонами" msgid "Internal IP address" msgstr "Внутрішня IP-адреса" @@ -227,10 +229,10 @@ msgid "Limit log messages" msgstr "Обмеження повідомлень журналу" msgid "MAC" -msgstr "" +msgstr "MAC-алреса" msgid "MACs" -msgstr "" +msgstr "MAC-алреси" msgid "MSS clamping" msgstr "Затискання MSS" @@ -246,8 +248,8 @@ msgstr "Зіставляти ICMP типу" msgid "Match forwarded traffic to the given destination port or port range." msgstr "" -"Зіставляти трафік, що спрямовується на заданий порт призначення або діапазон " -"портів." +"Зіставляти трафік, що переспрямовується на заданий порт призначення або " +"діапазон портів." msgid "" "Match incoming traffic directed at the given destination port or port range " @@ -264,10 +266,10 @@ msgstr "" "діапазоні портів вузла клієнта." msgid "Monday" -msgstr "" +msgstr "Понеділок" msgid "Month Days" -msgstr "" +msgstr "Дні місяця" msgid "Name" msgstr "Ім'я" @@ -276,13 +278,13 @@ msgid "New SNAT rule" msgstr "Нове правило SNAT" msgid "New forward rule" -msgstr "Нове правило спрямовування" +msgstr "Нове правило переспрямовування" msgid "New input rule" msgstr "Нове вхідне правило" msgid "New port forward" -msgstr "Нове спрямовування порту" +msgstr "Нове переспрямовування порту" msgid "New source NAT" msgstr "Новий NAT джерела" @@ -312,18 +314,21 @@ msgstr "Інше..." msgid "Output" msgstr "Вихідний" +msgid "Output zone" +msgstr "Вихідна зона" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" "Передача додаткових аргументів для IPTables. Використовуйте з обережністю!" msgid "Port Forwards" -msgstr "Спрямовування портів" +msgstr "Переспрямовування портів" msgid "" "Port forwarding allows remote computers on the Internet to connect to a " "specific computer or service within the private LAN." msgstr "" -"Спрямовування портів дозволяє віддаленим комп'ютерам з Інтернету " +"Переспрямовування портів дозволяє віддаленим комп'ютерам з Інтернету " "підключатися до певного комп'ютера або служби у приватній мережі." msgid "Protocol" @@ -338,16 +343,16 @@ msgid "Redirect matched incoming traffic to the specified internal host" msgstr "Переспрямувати відповідний вхідний трафік на заданий внутрішній вузол" msgid "Refuse forward" -msgstr "" +msgstr "Відхиляти переспрямовування" msgid "Refuse input" -msgstr "" +msgstr "Відхиляти введення" msgid "Requires hardware NAT support. Implemented at least for mt7621" -msgstr "" +msgstr "Необхідна апаратна підтримка NAT. Впроваджено принаймні для mt7621" msgid "Restart Firewall" -msgstr "" +msgstr "Перезавантажити брандмауер" msgid "Restrict Masquerading to given destination subnets" msgstr "Обмежити підміну заданими підмережами призначення" @@ -375,13 +380,13 @@ msgid "Rewrite to source %s, %s" msgstr "перезапис на вихідний %s, %s" msgid "Routing/NAT Offloading" -msgstr "" +msgstr "Розвантаження маршрутизації/NAT" msgid "Rule is disabled" -msgstr "" +msgstr "Правило вимкнено" msgid "Rule is enabled" -msgstr "" +msgstr "Правило ввімкнено" msgid "SNAT IP address" msgstr "IP-адреса SNAT" @@ -390,13 +395,13 @@ msgid "SNAT port" msgstr "Порт SNAT" msgid "Saturday" -msgstr "" +msgstr "Субота" msgid "Software based offloading for routing/NAT" -msgstr "" +msgstr "Програмне розвантаження для маршрутизації/NAT" msgid "Software flow offloading" -msgstr "" +msgstr "Програмне розвантаження потоку" msgid "Source IP address" msgstr "IP-адреса джерела" @@ -426,19 +431,19 @@ msgid "Source zone" msgstr "Зона-джерело" msgid "Start Date (yyyy-mm-dd)" -msgstr "" +msgstr "Дата початку (рррр-мм-дд)" msgid "Start Time (hh:mm:ss)" -msgstr "" +msgstr "Час початку (гг:хх:сс)" msgid "Stop Date (yyyy-mm-dd)" -msgstr "" +msgstr "Дата зупинки (рррр-мм-дд)" msgid "Stop Time (hh:mm:ss)" -msgstr "" +msgstr "Час зупинки (гг:хх:сс)" msgid "Sunday" -msgstr "" +msgstr "Неділя" msgid "" "The firewall creates zones over your network interfaces to control network " @@ -455,19 +460,20 @@ msgid "" "rule is <em>unidirectional</em>, e.g. a forward from lan to wan does " "<em>not</em> imply a permission to forward from wan to lan as well." msgstr "" -"Опції, наведені нижче, управляють політиками спрямовування між цією (%s) та " -"іншими зонами. <em>Зони призначення</em> покриваються трафіком, що " -"<strong>виходить з %q</strong>. <em>Зони-джерела</em> покриваються трафіком " -"з інших зон, <strong>спрямованим на %q</strong>. Правила спрямування є " -"<em>односпрямованим</em>, тобто, спрямування від LAN до WAN <em>не</em> " -"означає, що є також дозвіл спрямовувати від WAN в LAN." +"Опції, наведені нижче, керують політиками переспрямовування між цією (%s) " +"та іншими зонами. <em>Зони призначення</em> покриваються переспрямованим " +"трафіком, що <strong>виходить з %q</strong>. <em>Зони-джерела</em> " +"покриваються трафіком з інших зон, <strong>переспрямованим на %q</strong>. " +"Правило переспрямовування є <em>односпрямованим</em>, тобто, спрямовування " +"від LAN до WAN <em>не</em> означає, що є також дозвіл спрямовувати від WAN " +"до LAN." msgid "" "This page allows you to change advanced properties of the port forwarding " "entry. In most cases there is no need to modify those settings." msgstr "" -"На цій сторінці можна змінити додаткові властивості елемента спрямовування " -"портів. У більшості випадків змінювати ці параметри немає необхідності." +"На цій сторінці можна змінити додаткові властивості елемента переспрямовування " +"портів. У більшості випадків змінювати ці параметри немає потреби." msgid "" "This page allows you to change advanced properties of the traffic rule " @@ -476,7 +482,6 @@ msgstr "" "На цій сторінці можна змінити додаткові властивості елемента правил трафіка, " "таких як відповідні параметри джерела та вузлів призначення." -#, fuzzy msgid "" "This section defines common properties of %q. The <em>input</em> and " "<em>output</em> options set the default policies for traffic entering and " @@ -486,15 +491,15 @@ msgid "" msgstr "" "Цей розділ визначає загальні властивості %q. Параметри <em>вхідний</em> і " "<em>вихідний</em> задають типову політику для трафіку на вході й виході з " -"цієї зони, а параметр \"спрямовування\" описує політику спрямовування " -"трафіку між різними мережами в межах зони. Пункт <em>вкриті мережі</em> " +"цієї зони, а параметр \"переспрямовування\" описує політику спрямовування " +"трафіку між різними мережами в межах зони. Пункт <em>Покриті мережі</em> " "визначає, які доступні мережі є членами цієї зони." msgid "Thursday" -msgstr "" +msgstr "Четвер" msgid "Time in UTC" -msgstr "" +msgstr "Час в UTC" msgid "To %s at %s on <var>this device</var>" msgstr "%s на %s <var>цього пристрою</var>" @@ -527,7 +532,7 @@ msgstr "" "порти WAN на маршрутизаторі." msgid "Tuesday" -msgstr "" +msgstr "Вівторок" msgid "Via %s" msgstr "Через %s" @@ -536,10 +541,10 @@ msgid "Via %s at %s" msgstr "Через %s на %s" msgid "Wednesday" -msgstr "" +msgstr "Середа" msgid "Week Days" -msgstr "" +msgstr "Дні тижня" msgid "" "You may specify multiple by selecting \"-- custom --\" and then entering " @@ -552,7 +557,7 @@ msgid "Zone %q" msgstr "Зона %q" msgid "Zone ⇒ Forwardings" -msgstr "Зона ⇒ Спрямовування" +msgstr "Зона ⇒ Переспрямовування" msgid "Zones" msgstr "Зони" @@ -573,7 +578,7 @@ msgid "any zone" msgstr "будь-якій зоні" msgid "day" -msgstr "" +msgstr "день" msgid "don't track" msgstr "не відстеж." @@ -582,31 +587,31 @@ msgid "drop" msgstr "опускати" msgid "hour" -msgstr "" +msgstr "година" msgid "minute" -msgstr "" +msgstr "хвилина" msgid "not" -msgstr "" +msgstr "не" msgid "port" -msgstr "" +msgstr "порт" msgid "ports" -msgstr "" +msgstr "порти" msgid "reject" msgstr "відкидати" msgid "second" -msgstr "" +msgstr "секунда" msgid "traffic" -msgstr "" +msgstr "трафік" msgid "type" -msgstr "" +msgstr "типом" msgid "types" -msgstr "" +msgstr "типами" diff --git a/applications/luci-app-firewall/po/vi/firewall.po b/applications/luci-app-firewall/po/vi/firewall.po index bd33afcd09..0eba33f760 100644 --- a/applications/luci-app-firewall/po/vi/firewall.po +++ b/applications/luci-app-firewall/po/vi/firewall.po @@ -306,6 +306,9 @@ msgstr "" msgid "Output" msgstr "Output" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "" diff --git a/applications/luci-app-firewall/po/zh-cn/firewall.po b/applications/luci-app-firewall/po/zh-cn/firewall.po index 46da547c08..8c1424cf06 100644 --- a/applications/luci-app-firewall/po/zh-cn/firewall.po +++ b/applications/luci-app-firewall/po/zh-cn/firewall.po @@ -179,7 +179,7 @@ msgid "General Settings" msgstr "基本设置" msgid "Hardware flow offloading" -msgstr "硬件流量卸载" +msgstr "硬件流量分载" msgid "IP" msgstr "IP" @@ -301,6 +301,9 @@ msgstr "其它..." msgid "Output" msgstr "出站数据" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "传递到 iptables 的额外参数。小心使用!" @@ -359,7 +362,7 @@ msgid "Rewrite to source %s, %s" msgstr "源地址改写成 %s, %s" msgid "Routing/NAT Offloading" -msgstr "Routing/NAT 卸载" +msgstr "Routing/NAT 分载" msgid "Rule is disabled" msgstr "规则已禁用" @@ -377,10 +380,10 @@ msgid "Saturday" msgstr "星期六" msgid "Software based offloading for routing/NAT" -msgstr "基于软件的 Routing/NAT 卸载" +msgstr "基于软件的 Routing/NAT 分载" msgid "Software flow offloading" -msgstr "软件流量卸载" +msgstr "软件流量分载" msgid "Source IP address" msgstr "源 IP 地址" diff --git a/applications/luci-app-firewall/po/zh-tw/firewall.po b/applications/luci-app-firewall/po/zh-tw/firewall.po index 1fbe970ddb..93af452d05 100644 --- a/applications/luci-app-firewall/po/zh-tw/firewall.po +++ b/applications/luci-app-firewall/po/zh-tw/firewall.po @@ -301,6 +301,9 @@ msgstr "其它..." msgid "Output" msgstr "出站資料" +msgid "Output zone" +msgstr "" + msgid "Passes additional arguments to iptables. Use with care!" msgstr "傳遞到 iptables 的額外引數。小心使用!" diff --git a/applications/luci-app-lxc/luasrc/controller/lxc.lua b/applications/luci-app-lxc/luasrc/controller/lxc.lua index c7fe63f87b..8557f2b821 100644 --- a/applications/luci-app-lxc/luasrc/controller/lxc.lua +++ b/applications/luci-app-lxc/luasrc/controller/lxc.lua @@ -18,7 +18,7 @@ module("luci.controller.lxc", package.seeall) local uci = require "luci.model.uci".cursor() local util = require "luci.util" -local fs = require "nixio" +local nx = require "nixio" function index() if not nixio.fs.access("/etc/config/lxc") then @@ -60,8 +60,8 @@ end function lxc_create(lxc_name, lxc_template) luci.http.prepare_content("text/plain") - local check = lxc_get_config_path() - if not check then + local path = lxc_get_config_path() + if not path then return end @@ -80,6 +80,10 @@ function lxc_create(lxc_name, lxc_template) ssl_status } }), src_err) + + while (nx.fs.access(path .. lxc_name .. "/partial")) do + nx.nanosleep(1) + end end function lxc_action(lxc_action, lxc_name) @@ -96,7 +100,7 @@ function lxc_get_config_path() local ret = content:match('^%s*lxc.lxcpath%s*=%s*([^%s]*)') if ret then - if nixio.fs.access(ret) then + if nx.fs.access(ret) then local min_space = tonumber(uci:get("lxc", "lxc", "min_space")) or 100000 local free_space = tonumber(util.exec("df " ..ret.. " | awk '{if(NR==2)print $4}'")) if free_space and free_space >= min_space then @@ -150,7 +154,7 @@ function lxc_configuration_set(lxc_name) end function lxc_get_arch_target() - local target = fs.uname().machine + local target = nx.uname().machine local target_map = { armv5 = "armel", armv6 = "armel", diff --git a/applications/luci-app-lxc/luasrc/view/lxc.htm b/applications/luci-app-lxc/luasrc/view/lxc.htm index a68143b796..b45e27f51f 100644 --- a/applications/luci-app-lxc/luasrc/view/lxc.htm +++ b/applications/luci-app-lxc/luasrc/view/lxc.htm @@ -15,8 +15,8 @@ Author: Petar Koretic <petar.koretic@sartura.hr> -%> <%- -local fs = require "nixio" -local target = fs.uname().machine +local nx = require "nixio" +local target = nx.uname().machine -%> <fieldset class="cbi-section"> @@ -36,7 +36,7 @@ local target = fs.uname().machine <span id="lxc-list-output"></span> </fieldset> -<hr/> +<hr /> <fieldset class="cbi-section"> <legend><%:Create New Container%></legend> <div class="cbi-section-node"> @@ -46,11 +46,11 @@ local target = fs.uname().machine <div class="th cbi-section-table-cell"><%:Template%></div> <div class="th cbi-section-table-cell"><%:Actions%></div> </div> - <div class="tr cbi-section-table-row" id="div_holder"> + <div class="tr cbi-section-table-row" id="div_create"> <div class="td"><input class="cbi-input-text" type="text" id="tx_name" placeholder="<%:Enter new name%>" value='' /></div> <div class="td"><select id="s_template" class="cbi-input-select cbi-button"></select></div> <div class="td"> - <input type="button" id="bt_create" value="<%:Create%>" onclick="lxc_create(div_holder)" class="cbi-button cbi-button-add" /> + <input type="button" id="bt_create" value="<%:Create%>" onclick="lxc_create()" class="cbi-button cbi-button-add" /> <span id="lxc-add-loader" style="display:inline-block; width:16px; height:16px; margin:0 5px"></span> </div> </div> @@ -62,25 +62,29 @@ local target = fs.uname().machine <span id="lxc-add-output"></span> </fieldset> -<hr/> +<hr /> <script type="text/javascript" src="<%=resource%>/cbi.js"></script> <script type="text/javascript"> //<![CDATA[ - window.img = { "red" : "<%=resource%>/cbi/red.gif", "green" : "<%=resource%>/cbi/green.gif", "purple" : "<%=resource%>/cbi/purple.gif" } - window.states = { "STOPPED" : "red", "RUNNING" : "green", "FROZEN" : "purple" } + window.img = { "red" : "<%=resource%>/cbi/red.gif", "green" : "<%=resource%>/cbi/green.gif", "purple" : "<%=resource%>/cbi/purple.gif" }; + window.states = { "STOPPED" : "red", "RUNNING" : "green", "FROZEN" : "purple" }; var t_lxc_list = document.getElementById('t_lxc_list'); var loader_html = '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" width="16" height="16" style="vertical-align:middle" />'; - var output_list = document.getElementById("lxc-list-output") - var output_add = document.getElementById("lxc-add-output") - var loader_add = document.getElementById("lxc-add-loader") + var output_list = document.getElementById("lxc-list-output"); + var output_add = document.getElementById("lxc-add-output"); + var loader_add = document.getElementById("lxc-add-loader"); + var div_create = document.getElementById("div_create"); + var bt_create = div_create.querySelector("#bt_create"); - function lxc_create(div) + bt_create.disabled = true; + info_message(output_add, "Template download in progress, please be patient!"); + + function lxc_create() { - var lxc_name = div.querySelector("#tx_name").value.replace(/[\s!@#$%^&*()+=\[\]{};':"\\|,<>\/?]/g,''); - var lxc_template = div.querySelector("#s_template").value; - var bt_create = div.querySelector("#bt_create"); + var lxc_name = div_create.querySelector("#tx_name").value.replace(/[\s!@#$%^&*()+=\[\]{};':"\\|,<>\/?]/g,''); + var lxc_template = div_create.querySelector("#s_template").value; if (t_lxc_list.querySelector("[data-id='" + lxc_name + "']") != null) { @@ -155,7 +159,7 @@ local target = fs.uname().machine var div3 = document.createElement("div"); div3.className = "td"; div3.style.width = "50%"; - div3.innerHTML = actions + div3.innerHTML = actions; document.getElementById("t_lxc_list").appendChild(div0); div0.appendChild(div1); @@ -209,8 +213,8 @@ local target = fs.uname().machine } else if (action == "destroy") { - var div = self.parentNode.parentNode - var img = div.querySelector('img') + var div = self.parentNode.parentNode; + var img = div.querySelector('img'); if (img.getAttribute('src') != window.img["red"]) { @@ -434,7 +438,7 @@ local target = fs.uname().machine } else { - setTimeout(function() { elem.innerHTML = ''}, 1000); + setTimeout(function() { elem.innerHTML = ''}, 2000); } } @@ -466,10 +470,6 @@ local target = fs.uname().machine } } - lxc_list_update(); - - info_message(output_add, "Template download in progress, please be patient!"); - new XHR().get('<%=luci.dispatcher.build_url("admin", "services")%>/lxc_get_downloadable', null, function(x, data) { @@ -489,7 +489,6 @@ local target = fs.uname().machine return set_no_template(); } - bt_create.disabled = false; var select = document.getElementById("s_template"); for(var key in data) { @@ -498,7 +497,11 @@ local target = fs.uname().machine option.text = data[key].replace(/[_:]/g, ' '); select.add(option, -1); } + info_message(output_add, ""); + bt_create.disabled = false; }) + + lxc_list_update(); //]]> </script> diff --git a/applications/luci-app-mwan3/po/zh-cn/mwan3.po b/applications/luci-app-mwan3/po/zh-cn/mwan3.po index 4a92c7abd9..13773ef1e1 100644 --- a/applications/luci-app-mwan3/po/zh-cn/mwan3.po +++ b/applications/luci-app-mwan3/po/zh-cn/mwan3.po @@ -42,7 +42,7 @@ msgid "Check IP rules" msgstr "检查 IP 规则" msgid "Check link quality" -msgstr "" +msgstr "检查连接数量" msgid "Check routing table" msgstr "检查路由表" @@ -57,7 +57,7 @@ msgid "Destination port" msgstr "目标端口" msgid "Detail" -msgstr "" +msgstr "详细" msgid "Diagnostics" msgstr "诊断" @@ -76,7 +76,7 @@ msgid "Enter value in hex, starting with <code>0x</code>" msgstr "输入十六进制值,以 <code>0x</code> 开头" msgid "Execute" -msgstr "" +msgstr "执行" msgid "Expect interface state on up event" msgstr "在 up 事件发生时的预期接口状态" @@ -103,7 +103,7 @@ msgid "Hotplug ifup" msgstr "Hotplug ifup" msgid "INFO: MWAN not running" -msgstr "" +msgstr "信息:MWAN 没有运行" msgid "IPset" msgstr "IPset" @@ -154,28 +154,28 @@ msgid "Local source interface" msgstr "本地源接口" msgid "MWAN - Globals" -msgstr "" +msgstr "MWAN - 全局" msgid "MWAN - Interfaces" -msgstr "" +msgstr "MWAN - 接口" msgid "MWAN - Members" -msgstr "" +msgstr "MWAN - 成员" msgid "MWAN - Notification" -msgstr "" +msgstr "MWAN - 通知" msgid "MWAN - Policies" -msgstr "" +msgstr "MWAN - 策略" msgid "MWAN - Rules" -msgstr "" +msgstr "MWAN - 规则" msgid "MWAN Interface Configuration - %s" msgstr "MWAN 接口配置 - %s" msgid "MWAN Interfaces" -msgstr "" +msgstr "MWAN 接口" msgid "MWAN Member Configuration - %s" msgstr "MWAN 成员配置 - %s" @@ -187,13 +187,13 @@ msgid "MWAN Rule Configuration - %s" msgstr "MWAN 规则配置 - %s" msgid "MWAN Status - Detail" -msgstr "" +msgstr "MWAN Status - 详细" msgid "MWAN Status - Diagnostics" -msgstr "" +msgstr "MWAN Status - 诊断" msgid "MWAN Status - Troubleshooting" -msgstr "" +msgstr "MWAN Status - 故障排除" msgid "" "MWAN supports up to 252 physical and/or logical interfaces<br />MWAN " @@ -209,10 +209,10 @@ msgstr "" "口不应该与成员、策略、规则中的任意一个设置项使用相同的名称" msgid "Max packet latency [ms]" -msgstr "" +msgstr "最大数据包延迟 [ms]" msgid "Max packet loss [%]" -msgstr "" +msgstr "最大数据包丢失率 [%]" msgid "" "May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or " @@ -246,10 +246,10 @@ msgid "Metric" msgstr "跃点数" msgid "Min packet latency [ms]" -msgstr "" +msgstr "最小数据包延迟 [ms]" msgid "Min packet loss [%]" -msgstr "" +msgstr "最小数据包丢失率 [%]" msgid "" "Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/" @@ -265,7 +265,7 @@ msgid "No MWAN interfaces found" msgstr "没有找到 MWAN 接口" msgid "Notification" -msgstr "" +msgstr "通知" msgid "Offline" msgstr "离线" @@ -312,7 +312,7 @@ msgstr "" "“策略”把成员进行分组,告诉 MWAN 如何分配“规则”中使用这一策略的流量<br />拥有" "较低跃点数的成员将会被优先使用。拥有相同跃点数的成员把流量进行负载均衡。<br /" ">进行负载均衡的成员之间拥有较高比重的成员将会被分配到更多流量。<br />名称允许" -"包括A-Z、a-z、0-9、_ 但是不能有空格。名称应该在 15 个字符以内<br />策略不应该" +"包括 A-Z、a-z、0-9、_ 但是不能有空格。名称应该在 15 个字符以内<br />策略不应该" "与接口、成员、规则中的任意一个设置项使用相同的名称" msgid "Policy" @@ -344,6 +344,11 @@ msgid "" "z, 0-9, _ and no spaces<br />Rules may not share the same name as configured " "interfaces, members or policies" msgstr "" +"规则指定哪些流量将使用特定的 MWAN 策略<br />规则基于 IP 地址,端口或协议<br />" +"规则从上到下匹配<br />匹配规则以下的规则被忽略<br />不符合任何规则的流量将使用主路由表进" +"行路由<br />目的地为已知(非默认)网络的流量由主路由表处理<br />流量符合规则,但该策略的" +"所有 WAN 接口关闭后都会被失效<br />名称可包含字符 A-Z,a-z,0-9,_和空格<br />" +"规则不能与配置的接口、成员或策略共享相同的名称" msgid "Seconds. Acceptable values: 1-1000000. Defaults to 600 if not set" msgstr "单位为秒。接受的值:1-1000000。留空则使用默认值 600 秒" @@ -364,7 +369,7 @@ msgid "Supports CIDR notation (eg \"192.168.100.0/24\") without quotes" msgstr "支持 CIDR 记法(例如:\"192.168.100.0/24\")不含引号" msgid "Task" -msgstr "" +msgstr "任务" msgid "There are currently %d of %d supported interfaces configured" msgstr "当前已配置 %d 个接口,最大支持 %d 个" @@ -395,6 +400,14 @@ msgid "" "Physical device name which interface went up or down (e.g. \"eth0\" or " "\"wwan0\")<br /><br />" msgstr "" +"这里允许您修改“/etc/mwan3.user”的内容。<br />该文件在 sysupgrade 期间也会" +"保留。<br /><br />注意:<br />该文件会作为 shell 脚本解释。<br />脚本的第" +"一行必须是 "#!/bin/sh",不带引号。<br />以 # 开头的行是注释,不会执" +"行。<br />将您的自定义 mwan3 动作放在这里,他们将<br />在启用 mwan3 的接口" +"上<br />在 netifd hotplug 接口事件时执行。<br /><br />有三个主要的环境变量" +"传递给这个脚本。<br /><br />$ACTION “ifup” 或 “ifdown”<br />$INTERFACE 启动" +"或停止的接口名(例如 “wan” 或 “wwan”)<br />$DEVICE 启动或停止接口的物理设备" +"名(例如 “eth0” 或 “wwan0”)<br /><br />" msgid "Tracking hostname or IP address" msgstr "跟踪的主机或 IP 地址" @@ -421,35 +434,37 @@ msgid "" msgstr "使用该接口的 IP 地址作为路由器本身发起的流量的源 IP 地址" msgid "View the content of /etc/protocols for protocol description" -msgstr "" +msgstr "查看协议描述的 /etc/protocols 的内容" msgid "WARNING: %d interfaces are configured exceeding the maximum of %d!" msgstr "警告:已配置 %d 个接口,超过最大值 %d!" msgid "WARNING: Interface %s are not found in /etc/config/network" -msgstr "" +msgstr "警告:接口 %s 在 /etc/config/network 中未找到" msgid "WARNING: Interface %s has a duplicate metric %s configured" -msgstr "" +msgstr "警告:接口 %s 的 metric %s 配置重复" msgid "" "WARNING: Interface %s has a higher reliability requirement than tracking " "hosts (%d)" msgstr "" +"警告:接口 %s 比跟踪主机具有更高的可靠性要求(%d)" msgid "WARNING: Interface %s has no default route in the main routing table" -msgstr "" +msgstr "警告:接口 %s 在主路由表中没有默认的路由" msgid "WARNING: Policy %s has exceeding the maximum name of 15 characters" -msgstr "" +msgstr "警告:策略 %s 名称超过 15 个字符" msgid "" "WARNING: Rule %s have a port configured with no or improper protocol " "specified!" msgstr "" +"警告:规则 %s 有一个端口配置没有指定或协议不正确!" msgid "Waiting for command to complete..." -msgstr "" +msgstr "正在等待命令完成..." msgid "Weight" msgstr "比重" |