luci-app-pbr: update to 1.0.1-1
authorStan Grishin <stangri@melmac.ca>
Mon, 19 Dec 2022 03:58:01 +0000 (03:58 +0000)
committerStan Grishin <stangri@melmac.ca>
Mon, 19 Dec 2022 03:58:32 +0000 (03:58 +0000)
* add more error/warning messages
* better error/ubus error handling

Signed-off-by: Stan Grishin <stangri@melmac.ca>
applications/luci-app-pbr/Makefile
applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js
applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js
applications/luci-app-pbr/po/templates/pbr.pot

index ad7096e6028ccf584f58689f30239327b10889ba..9369bae9a97959717abf8ad25b81553565257778 100644 (file)
@@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_LICENSE:=GPL-3.0-or-later
 PKG_MAINTAINER:=Stan Grishin <stangri@melmac.ca>
-PKG_VERSION:=1.0.0-2
+PKG_VERSION:=1.0.1-1
 
 LUCI_TITLE:=Policy Based Routing Service Web UI
 LUCI_DESCRIPTION:=Provides Web UI for Policy Based Routing Service.
index 3eb04d0dff5dbb8c81c24101a0f9402316229c11..fbe8696c2815b722c3467ba03edbddee372e9f46 100644 (file)
@@ -111,8 +111,25 @@ var status = baseclass.extend({
                ]).then(function (data) {
 //                     var replyStatus = data[0];
 //                     var replyGateways = data[1];
-                       var reply = data[0][pkg.Name];
+                       var reply;
                        var text;
+
+                       if (data[0] && data[0][pkg.Name]) {
+                               reply = data[0][pkg.Name];
+                       }
+                       else {
+                               reply = {
+                                       enabled: null,
+                                       running: null,
+                                       running_iptables: null,
+                                       running_nft: null,
+                                       version: null,
+                                       gateways: null,
+                                       errors: [],
+                                       warnings: [],
+                               };
+                       }
+
                        var header = E('h2', {}, _("Policy Based Routing - Status"));
                        var statusTitle = E('label', { class: 'cbi-value-title' }, _("Service Status"));
                        if (reply.version) {
@@ -159,13 +176,19 @@ var status = baseclass.extend({
                                var textLabelsTable = {
                                        warningResolverNotSupported: _("Resolver set (%s) is not supported on this system.").format(uci.get(pkg.Name, 'config', 'resolver_set')),
                                        warningAGHVersionTooLow: _("Installed AdGuardHome (%s) doesn't support 'ipset_file' option."),
-                                       warningPolicyProcess: _("%s")
+                                       warningPolicyProcessCMD: _("%s"),
+                                       warningTorUnsetParams: _("Please unset 'src_addr', 'src_port' and 'dest_port' for policy '%s'"),
+                                       warningTorUnsetProto: _("Please unset 'proto' or set 'proto' to 'all' for policy '%s'"),
+                                       warningTorUnsetChainIpt: _("Please unset 'chain' or set 'chain' to 'PREROUTING' for policy '%s'"),
+                                       warningTorUnsetChainNft: _("Please unset 'chain' or set 'chain' to 'prerouting' for policy '%s'"),
                                };
                                var warningsTitle = E('label', { class: 'cbi-value-title' }, _("Service Warnings"));
                                var text = "";
                                (reply.warnings).forEach(element => {
                                        if (element.id && textLabelsTable[element.id]) {
-                                               text += (textLabelsTable[element.id]).format(element.extra || ' ') + "<br />";
+                                               if (element.id !== 'warningPolicyProcessCMD') {
+                                                       text += (textLabelsTable[element.id]).format(element.extra || ' ') + "<br />";
+                                               }
                                        }
                                        else {
                                                text += _("Unknown Warning!") + "<br />";
@@ -180,8 +203,8 @@ var status = baseclass.extend({
                        if (reply.errors && reply.errors.length) {
                                var textLabelsTable = {
                                        errorConfigValidation: _("Config (%s) validation failure!").format('/etc/config/' + pkg.Name),
-                                       errorNoIpFull: _("%s binary cannot be found!").formate('ip-full'),
-                                       errorNoIptables: _("%s binary cannot be found!").formate('iptables'),
+                                       errorNoIpFull: _("%s binary cannot be found!").format('ip-full'),
+                                       errorNoIptables: _("%s binary cannot be found!").format('iptables'),
                                        errorNoIpset: _("Resolver set support (%s) requires ipset, but ipset binary cannot be found!").format(uci.get(pkg.Name, 'config', 'resolver_set')),
                                        errorNoNft: _("Resolver set support (%s) requires nftables, but nft binary cannot be found!").format(uci.get(pkg.Name, 'config', 'resolver_set')),
                                        errorResolverNotSupported: _("Resolver set (%s) is not supported on this system!").format(uci.get(pkg.Name, 'config', 'resolver_set')),
@@ -193,20 +216,29 @@ var status = baseclass.extend({
                                        errorPolicyNoSrcDest: _("Policy '%s' has no source/destination parameters!"),
                                        errorPolicyNoInterface: _("Policy '%s' has no assigned interface!"),
                                        errorPolicyUnknownInterface: _("Policy '%s' has an unknown interface!"),
-                                       errorPolicyProcess: _("Policy processing error (%s)!"),
+                                       errorPolicyProcessCMD: _("%s"),
                                        errorFailedSetup: _("Failed to set up '%s'!"),
                                        errorFailedReload: _("Failed to reload '%s'!"),
                                        errorUserFileNotFound: _("Custom user file '%s' not found or empty!"),
                                        ererrorUserFileSyntax: _("Syntax error in custom user file '%s'!"),
                                        errorUserFileRunning: _("Error running custom user file '%s'!"),
                                        errorUserFileNoCurl: _("Use of 'curl' is detected in custom user file '%s', but 'curl' isn't installed!"),
-                                       errorNoGateways: _("Failed to set up any gateway!")
+                                       errorNoGateways: _("Failed to set up any gateway!"),
+                                       errorResolver: _("Resolver %s"),
+                                       errorPolicyProcessNoIpv6: _("Skipping IPv6 policy '%s' as IPv6 support is disabled"),
+                                       errorPolicyProcessUnknownFwmark: _("Unknown packet mark for interface '%s'"),
+                                       errorPolicyProcessMismatchFamily: _("Mismatched IP family between in policy %s"),
+                                       errorPolicyProcessUnknownProtocol: _("Unknown protocol in policy %s"),
+                                       errorPolicyProcessInsertionFailed: _("Insertion failed for both IPv4 and IPv6 for policy %s"),
+                                       errorPolicyProcessInsertionFailedIpv4: _("Insertion failed for IPv4 for policy %s"),
                                };
                                var errorsTitle = E('label', { class: 'cbi-value-title' }, _("Service Errors"));
                                var text = "";
                                (reply.errors).forEach(element => {
                                        if (element.id && textLabelsTable[element.id]) {
-                                               text += (textLabelsTable[element.id]).format(element.extra || ' ') + "<br />";
+                                               if (element.id !== 'errorPolicyProcessCMD') {
+                                                       text += (textLabelsTable[element.id]).format(element.extra || ' ') + "<br />";
+                                               }
                                        }
                                        else {
                                                text += _("Unknown Error!") + "<br />";
index 32bc6cb2dec07dac59d0b9c72eaeb7213020f7d8..e2d9d7b9b22ad1a35e0d0299e1512cab8e3be417 100644 (file)
@@ -25,10 +25,33 @@ return view.extend({
                        L.resolveDefault(pbr.getInterfaces(), {}),
                        L.resolveDefault(pbr.getPlatformSupport(), {}),
                ]).then(function (data) {
-                       var arrInterfaces = data[0][pkg.Name].interfaces;
-                       var replyPlatform = data[1][pkg.Name];
+                       var arrInterfaces;
+                       var replyPlatform;
                        var status, m, s, o;
 
+                       if (data[0] && data[0][pkg.Name] && data[0][pkg.Name].interfaces) {
+                               arrInterfaces = data[0][pkg.Name].interfaces;
+                       }
+                       else {
+                               arrInterfaces = ["wan"];
+                       }
+
+                       if (data[1] && data[1][pkg.Name]) {
+                               replyPlatform = data[1][pkg.Name];
+                       }
+                       else {
+                               replyPlatform = {
+                                       ipset_installed: null,
+                                       nft_installed: null,
+                                       adguardhome_installed: null,
+                                       dnsmasq_installed: null,
+                                       unbound_installed: null,
+                                       adguardhome_ipset_support: null,
+                                       dnsmasq_ipset_support: null,
+                                       dnsmasq_nftset_support: null,
+                               };
+                       }
+
                        status = new pbr.status();
                        m = new form.Map(pkg.Name, _("Policy Based Routing - Configuration"));
 
@@ -56,13 +79,22 @@ return view.extend({
                        o.default = "1";
 
                        var text = "";
-                       if (!(replyPlatform.adguardhome_ipset_support)) {
+                       if (replyPlatform.adguardhome_ipset_support === null) {
+                               text += _("The %s support is unknown.").format("<i>adguardhome.ipset</i>") + "<br />"
+                       }
+                       else if (!(replyPlatform.adguardhome_ipset_support)) {
                                text += _("The %s is not supported on this system.").format("<i>adguardhome.ipset</i>") + "<br />"
                        }
-                       if (!(replyPlatform.dnsmasq_ipset_support)) {
+                       if (replyPlatform.dnsmasq_ipset_support === null) {
+                               text += _("The %s support is unknown.").format("<i>dnsmasq.ipset</i>") + "<br />"
+                       }
+                       else if (!(replyPlatform.dnsmasq_ipset_support)) {
                                text += _("The %s is not supported on this system.").format("<i>dnsmasq.ipset</i>") + "<br />"
                        }
-                       if (!(replyPlatform.dnsmasq_nftset_support)) {
+                       if (replyPlatform.dnsmasq_nftset_support === null) {
+                               text += _("The %s support is unknown.").format("<i>dnsmasq.nftset</i>") + "<br />"
+                       }
+                       else if (!(replyPlatform.dnsmasq_nftset_support)) {
                                text += _("The %s is not supported on this system.").format("<i>dnsmasq.nftset</i>") + "<br />"
                        }
                        text += _("Please check the %sREADME%s before changing this option.").format(
index c2e3c228450a90cc78d69b7cfd0337e3b1420e23..3f6f4e771b9193e8e45780e7dbeae2abe1003948 100644 (file)
 msgid ""
 msgstr "Content-Type: text/plain; charset=UTF-8"
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:162
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:179
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:219
 msgid "%s"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:183
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:184
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:206
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:207
 msgid "%s binary cannot be found!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:38
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:61
 msgid ""
 "%sWARNING:%s Please make sure to check the %sREADME%s before changing "
 "anything in this section! Change any of the settings below with extreme "
 "caution!%s"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:73
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:74
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:105
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:106
 msgid "AdGuardHome ipset"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:101
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:133
 msgid "Add"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:136
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:168
 msgid "Add Ignore Target"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:137
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:169
 msgid ""
 "Adds 'ignore' to the list of interfaces for policies. See the %sREADME%s for "
 "details."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:37
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:60
 msgid "Advanced Configuration"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:90
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:122
 msgid ""
 "Allows to specify the list of interface names (in lower case) to be "
 "explicitly supported by the service. Can be useful if your OpenVPN tunnels "
 "have dev option other than tun* or tap*."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:95
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:127
 msgid ""
 "Allows to specify the list of interface names (in lower case) to be ignored "
 "by the service. Can be useful if running both VPN server and VPN client on "
 "the router."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:36
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:59
 msgid "Basic Configuration"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:201
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:233
 msgid "Chain"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:47
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:70
 msgid "Condensed output"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:182
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:205
 msgid "Config (%s) validation failure!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:45
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:68
 msgid "Controls both system log and console output verbosity."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:227
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:259
 msgid "Custom User File Includes"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:199
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:222
 msgid "Custom user file '%s' not found or empty!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:222
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:254
 msgid "DSCP Tag"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:217
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:249
 msgid "DSCP Tagging"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:105
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:137
 msgid "Default ICMP Interface"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:276
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:308
 msgid "Disable"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:71
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:86
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:139
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:103
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:118
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:171
 msgid "Disabled"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:272
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:304
 msgid "Disabling %s service"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:145
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:177
 msgid "Display these protocols in protocol column in Web UI."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:77
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:78
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:109
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:110
 msgid "Dnsmasq ipset"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:81
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:82
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:113
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:114
 msgid "Dnsmasq nft set"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:54
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:77
 msgid "Do not enforce policies when their gateway is down"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:265
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:297
 msgid "Enable"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:87
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:140
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:157
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:235
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:119
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:172
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:189
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:267
 msgid "Enabled"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:261
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:293
 msgid "Enabling %s service"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:201
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:224
 msgid "Error running custom user file '%s'!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:130
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:162
 msgid ""
 "FW Mask used by the service. High mask is used to avoid conflict with SQM/"
 "QoS. Change with caution together with"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:198
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:221
 msgid "Failed to reload '%s'!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:197
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:220
 msgid "Failed to set up '%s'!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:203
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:226
 msgid "Failed to set up any gateway!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:106
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:138
 msgid "Force the ICMP protocol interface."
 msgstr ""
 
@@ -171,39 +172,51 @@ msgstr ""
 msgid "Grant UCI and file access for luci-app-pbr"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:85
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:117
 msgid "IPv6 Support"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:94
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:126
 msgid "Ignored Interfaces"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:102
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:134
 msgid "Insert"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:161
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:233
+msgid "Insertion failed for IPv4 for policy %s"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:232
+msgid "Insertion failed for both IPv4 and IPv6 for policy %s"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:178
 msgid "Installed AdGuardHome (%s) doesn't support 'ipset_file' option."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:210
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:242
 msgid "Interface"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:163
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:195
 msgid "Local addresses / devices"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:168
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:200
 msgid "Local ports"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:161
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:230
+msgid "Mismatched IP family between in policy %s"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:193
 msgid "Name"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:149
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:181
 msgid ""
 "Name, interface and at least one other field are required. Multiple local "
 "and remote addresses/devices/domains and ports can be space separated. "
@@ -211,47 +224,63 @@ msgid ""
 "fields are left blank."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:107
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:139
 msgid "No Change"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:140
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:157
 msgid "Not installed or not found"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:44
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:67
 msgid "Output verbosity"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:239
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:271
 msgid "Path"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:68
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:100
 msgid "Please check the %sREADME%s before changing this option."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:148
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:182
+msgid "Please unset 'chain' or set 'chain' to 'PREROUTING' for policy '%s'"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:183
+msgid "Please unset 'chain' or set 'chain' to 'prerouting' for policy '%s'"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:181
+msgid "Please unset 'proto' or set 'proto' to 'all' for policy '%s'"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:180
+msgid "Please unset 'src_addr', 'src_port' and 'dest_port' for policy '%s'"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:180
 msgid "Policies"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:195
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:218
 msgid "Policy '%s' has an unknown interface!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:194
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:217
 msgid "Policy '%s' has no assigned interface!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:193
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:216
 msgid "Policy '%s' has no source/destination parameters!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:33
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:56
 msgid "Policy Based Routing - Configuration"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:116
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:133
 msgid "Policy Based Routing - Status"
 msgstr ""
 
@@ -259,233 +288,251 @@ msgstr ""
 msgid "Policy Routing"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:196
-msgid "Policy processing error (%s)!"
-msgstr ""
-
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:185
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:217
 msgid "Protocol"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:174
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:206
 msgid "Remote addresses / domains"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:179
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:211
 msgid "Remote ports"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:187
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:227
+msgid "Resolver %s"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:210
 msgid "Resolver set (%s) is not supported on this system!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:160
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:177
 msgid "Resolver set (%s) is not supported on this system."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:185
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:208
 msgid ""
 "Resolver set support (%s) requires ipset, but ipset binary cannot be found!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:186
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:209
 msgid ""
 "Resolver set support (%s) requires nftables, but nft binary cannot be found!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:243
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:275
 msgid "Restart"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:239
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:271
 msgid "Restarting %s service"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:99
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:131
 msgid "Rule Create option"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:228
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:260
 msgid ""
 "Run the following user files after setting up but before restarting DNSMASQ. "
 "See the %sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:121
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:138
 msgid "Running (version: %s using iptables)"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:124
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:141
 msgid "Running (version: %s using nft)"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:127
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:144
 msgid "Running (version: %s)"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:52
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:75
 msgid "See the %sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:100
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:132
 msgid "Select Add for -A/add and Insert for -I/Insert."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:300
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:332
 msgid "Service Control"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:205
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:235
 msgid "Service Errors"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:124
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:129
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:156
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:161
 msgid "Service FW Mask"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:148
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:165
 msgid "Service Gateways"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:117
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:134
 msgid "Service Status"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:164
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:185
 msgid "Service Warnings"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:218
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:250
 msgid ""
 "Set DSCP tags (in range between 1 and 63) for specific interfaces. See the "
 "%sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:232
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:228
+msgid "Skipping IPv6 policy '%s' as IPv6 support is disabled"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:264
 msgid "Start"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:228
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:260
 msgid "Starting %s service"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:122
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:154
 msgid ""
 "Starting (WAN) FW Mark for marks used by the service. High starting mark is "
 "used to avoid conflict with SQM/QoS. Change with caution together with"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:116
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:148
 msgid "Starting (WAN) Table ID number for tables created by the service."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:254
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:286
 msgid "Stop"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:135
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:152
 msgid "Stopped (Disabled)"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:132
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:149
 msgid "Stopped (version: %s)"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:250
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:282
 msgid "Stopping %s service"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:51
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:74
 msgid "Strict enforcement"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:55
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:78
 msgid "Strictly enforce policies when their gateway is down"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:89
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:121
 msgid "Supported Interfaces"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:144
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:176
 msgid "Supported Protocols"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:46
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:69
 msgid "Suppress/No output"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:200
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:223
 msgid "Syntax error in custom user file '%s'!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:149
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:166
 msgid "The %s indicates default gateway. See the %sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:60
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:63
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:66
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:86
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:92
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:98
 msgid "The %s is not supported on this system."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:189
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:212
 msgid "The %s service failed to discover WAN gateway!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:188
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:211
 msgid "The %s service is currently disabled!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:190
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:83
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:89
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:95
+msgid "The %s support is unknown."
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:213
 msgid "The ipset name '%s' is longer than allowed 31 characters!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:191
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:214
 msgid "The nft set name '%s' is longer than allowed 31 characters!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:192
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:215
 msgid "Unexpected exit or service termination: '%s'!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:212
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:244
 msgid "Unknown Error!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:171
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:194
 msgid "Unknown Warning!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:202
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:229
+msgid "Unknown packet mark for interface '%s'"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:231
+msgid "Unknown protocol in policy %s"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:225
 msgid ""
 "Use of 'curl' is detected in custom user file '%s', but 'curl' isn't "
 "installed!"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:70
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:102
 msgid "Use resolver set support for domains"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:48
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:71
 msgid "Verbose output"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:121
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:131
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:153
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:163
 msgid "WAN Table FW Mark"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:115
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:147
 msgid "WAN Table ID"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:42
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:65
 msgid "Web UI Configuration"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:192
-#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:193
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:224
+#: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:225
 msgid "all"
 msgstr ""