luci-app-pbr: update to 1.2.2-r8
authorStan Grishin <redacted>
Mon, 2 Mar 2026 20:33:19 +0000 (20:33 +0000)
committerStan Grishin <redacted>
Wed, 4 Mar 2026 01:42:23 +0000 (17:42 -0800)
* version bump to match the principal package
* safer wait for long pbr operations

Signed-off-by: Stan Grishin <redacted>
applications/luci-app-pbr/Makefile
applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js
applications/luci-app-pbr/po/templates/pbr.pot

index 1c39e1fd0af4313947c6a9b562700515b42ea651..fd9d73e7554acb040d9bc500387b8972f43972fb 100644 (file)
@@ -7,7 +7,7 @@ PKG_NAME:=luci-app-pbr
 PKG_LICENSE:=AGPL-3.0-or-later
 PKG_MAINTAINER:=Stan Grishin <stangri@melmac.ca>
 PKG_VERSION:=1.2.2
-PKG_RELEASE:=6
+PKG_RELEASE:=8
 
 LUCI_TITLE:=Policy Based Routing Service Web UI
 LUCI_URL:=https://github.com/mossdef-org/luci-app-pbr/
index 80dc2258988918357bf115c86d8369505b9521da..c1d6b5efe0afb272543dceab24393ea8f33f012e 100644 (file)
@@ -125,31 +125,39 @@ var RPC = {
                });
        },
        setInitAction: function (name, action) {
-               _setInitAction(name, action).then(
-                       function (result) {
-                               this.emit("setInitAction", result);
-                       }.bind(this),
-               );
+               _setInitAction(name, action)
+                       .then(
+                               function (result) {
+                                       this.emit("setInitAction", { result: result, action: action });
+                               }.bind(this),
+                       )
+                       .catch(
+                               function (error) {
+                                       // Even if RPC call fails/times out, emit event to start polling
+                                       // This handles cases where the backend task starts but RPC times out
+                                       this.emit("setInitAction", { timeout: true, action: action });
+                               }.bind(this),
+                       );
        },
 };
 
-// Poll service status until completion (for long-running operations like download)
-var pollServiceStatus = function (callback) {
+// Poll service status until the expected running state is reached.
+// expectRunning: true for start/restart, false for stop.
+var pollServiceStatus = function (expectRunning, callback) {
        var maxAttempts = 300; // Max 5 minutes of polling
        var attempt = 0;
 
        var checkStatus = function () {
                attempt++;
 
-               // Use the RPC function directly from the module scope
                L.resolveDefault(getInitStatus(pkg.Name), {})
                        .then(function (statusData) {
-                               var currentStatus =
+                               var isRunning =
                                        statusData && statusData[pkg.Name] && statusData[pkg.Name].running;
 
-                               // Check if completed or failed
-                               if (currentStatus === true) {
-                                       callback(true, currentStatus);
+                               // Check if the expected state has been reached
+                               if (expectRunning ? isRunning === true : isRunning !== true) {
+                                       callback(true);
                                }
                                // Check if timed out
                                else if (attempt >= maxAttempts) {
@@ -157,7 +165,7 @@ var pollServiceStatus = function (callback) {
                                }
                                // Continue polling
                                else {
-                                       setTimeout(checkStatus, 1000); // Check again in 1 second
+                                       setTimeout(checkStatus, 1000);
                                }
                        })
                        .catch(function (err) {
@@ -170,7 +178,7 @@ var pollServiceStatus = function (callback) {
                        });
        };
 
-       // Start polling after 2 seconds delay (give backend time to start the task)
+       // Start polling after a delay to give the backend time to start the task
        setTimeout(checkStatus, 3000);
 };
 
@@ -727,12 +735,24 @@ var status = baseclass.extend({
 });
 
 RPC.on("setInitAction", function (reply) {
-       // Don't immediately hide modal and reload
-       // Instead, poll status until the operation actually completes
-       pollServiceStatus(function () {
+       var action = reply && reply.action;
+       if (action === "start" || action === "restart" || action === "reload") {
+               // Long-running: poll until service is running
+               pollServiceStatus(true, function () {
+                       ui.hideModal();
+                       location.reload();
+               });
+       } else if (action === "stop") {
+               // Poll until service has stopped
+               pollServiceStatus(false, function () {
+                       ui.hideModal();
+                       location.reload();
+               });
+       } else {
+               // enable/disable are fast, just reload immediately
                ui.hideModal();
                location.reload();
-       });
+       }
 });
 
 return L.Class.extend({
index 5691bac8095d4507854f6c633beac38685eb526f..dd25675e3bdfb681d54205f8c4b4613ea2089acc 100644 (file)
@@ -1,12 +1,12 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=UTF-8"
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:312
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:442
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:320
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:450
 msgid "%s"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:397
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:405
 msgid "%s binary cannot be found"
 msgstr ""
 
@@ -67,7 +67,7 @@ msgstr ""
 msgid "Chain"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:493
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:501
 msgid "Command failed: '%s'"
 msgstr ""
 
@@ -75,7 +75,7 @@ msgstr ""
 msgid "Condensed output"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:394
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:402
 msgid "Config (%s) validation failure"
 msgstr ""
 
@@ -87,7 +87,7 @@ msgstr ""
 msgid "Custom User File Includes"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:445
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:453
 msgid "Custom user file '%s' not found or empty"
 msgstr ""
 
@@ -107,15 +107,15 @@ msgstr ""
 msgid "Default ICMP Interface"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:498
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:506
 msgid "Default fw4 chain '%s' is missing"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:497
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:505
 msgid "Default fw4 table '%s' is missing"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:650
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:658
 msgid "Disable"
 msgstr ""
 
@@ -125,7 +125,7 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:644
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:652
 msgid "Disabling %s service"
 msgstr ""
 
@@ -133,7 +133,7 @@ msgstr ""
 msgid "Display these protocols in protocol column in Web UI."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:338
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:346
 msgid ""
 "Dnsmasq instance (%s) targeted in settings, but it doesn't have its own "
 "confdir"
@@ -151,11 +151,11 @@ msgstr ""
 msgid "Do not enforce policies when their gateway is down"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:697
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:705
 msgid "Donate to the Project"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:631
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:639
 msgid "Enable"
 msgstr ""
 
@@ -167,19 +167,19 @@ msgstr ""
 msgid "Enabled"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:625
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:633
 msgid "Enabling %s service"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:447
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:455
 msgid "Error running custom user file '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:506
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:514
 msgid "Errors encountered, please check %s"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:539
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:547
 msgid "Errors encountered, please check the %sREADME%s"
 msgstr ""
 
@@ -189,35 +189,35 @@ msgid ""
 "QoS. Change with caution together with"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:504
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:512
 msgid "Failed to create temporary file with mktemp mask: '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:489
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:497
 msgid "Failed to download '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:487
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:495
 msgid "Failed to download '%s', HTTPS is not supported"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:482
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:490
 msgid "Failed to install fw4 nft file '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:444
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:452
 msgid "Failed to reload '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:478
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:486
 msgid "Failed to resolve '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:443
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:451
 msgid "Failed to set up '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:451
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:459
 msgid "Failed to set up any gateway"
 msgstr ""
 
@@ -245,15 +245,15 @@ msgstr ""
 msgid "Inactive (Disabled)"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:353
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:361
 msgid "Incompatible DHCP Option 6 for interface %s"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:495
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:503
 msgid "Incompatible custom user file detected '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:335
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:343
 msgid ""
 "Incompatible nft calls detected in user include file, disabling fw4 nft file "
 "support"
@@ -263,15 +263,15 @@ msgstr ""
 msgid "Insert"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:469
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:477
 msgid "Insertion failed for IPv4 for policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:466
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:474
 msgid "Insertion failed for both IPv4 and IPv6 for policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:310
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:318
 msgid "Installed AdGuardHome (%s) doesn't support 'ipset_file' option."
 msgstr ""
 
@@ -279,26 +279,26 @@ msgstr ""
 msgid "Interface"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:437
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:445
 msgid "Interface '%s' has no assigned DNS"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:476
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:484
 msgid "Interface mark for '%s' exceeds the fwmask value"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:304
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:312
 msgid ""
 "Internal version mismatch (package: %s, luci app: %s, luci rpcd: %s), you "
 "may need to update packages or reboot the device, please check the "
 "%sREADME%s."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:326
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:334
 msgid "Invalid OpenVPN config for %s interface"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:480
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:488
 msgid "Invalid OpenVPN config for '%s' interface"
 msgstr ""
 
@@ -311,7 +311,7 @@ msgstr ""
 msgid "Local ports"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:460
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:468
 msgid "Mismatched IP family between in policy '%s'"
 msgstr ""
 
@@ -339,27 +339,27 @@ msgid ""
 "check the %sREADME%s."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:511
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:519
 msgid "Netifd setup: failed to delete fw4 netifd nft file '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:508
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:516
 msgid "Netifd setup: failed to install fw4 netifd nft file '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:517
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:525
 msgid "Netifd setup: invalid value of netifd_interface_default option '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:520
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:528
 msgid "Netifd setup: invalid value of netifd_interface_default6 option '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:356
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:364
 msgid "Netifd setup: option netifd_interface_local is missing, assuming '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:514
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:522
 msgid "Netifd setup: required option '%s' is missing"
 msgstr ""
 
@@ -367,7 +367,7 @@ msgstr ""
 msgid "No Change"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:251
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:259
 #: applications/luci-app-pbr/htdocs/luci-static/resources/view/status/include/72_pbr.js:45
 msgid "Not installed or not found"
 msgstr ""
@@ -380,8 +380,8 @@ msgstr ""
 msgid "Path"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:279
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:705
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:287
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:713
 msgid "Please %sdonate%s to support development of this project."
 msgstr ""
 
@@ -389,24 +389,24 @@ msgstr ""
 msgid "Please check the %sREADME%s before changing this option."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:342
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:350
 msgid ""
 "Please set 'dhcp.%%s.force=1' to speed up service start-up %s(more info)%s"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:320
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:328
 msgid "Please unset 'chain' or set 'chain' to 'PREROUTING' for policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:323
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:331
 msgid "Please unset 'chain' or set 'chain' to 'prerouting' for policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:317
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:325
 msgid "Please unset 'proto' or set 'proto' to 'all' for policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:314
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:322
 msgid "Please unset 'src_addr', 'src_port' and 'dest_port' for policy '%s'"
 msgstr ""
 
@@ -414,23 +414,23 @@ msgstr ""
 msgid "Policies"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:440
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:448
 msgid "Policy '%s' has an unknown interface"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:435
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:443
 msgid "Policy '%s' has no assigned DNS"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:434
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:442
 msgid "Policy '%s' has no assigned interface"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:432
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:440
 msgid "Policy '%s' has no source/destination parameters"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:484
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:492
 msgid ""
 "Policy '%s' refers to URL which can't be downloaded in 'secure_reload' mode"
 msgstr ""
@@ -443,7 +443,7 @@ msgstr ""
 msgid "Policy Based Routing - Configuration"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:224
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:232
 msgid "Policy Based Routing - Status"
 msgstr ""
 
@@ -455,11 +455,11 @@ msgstr ""
 msgid "Protocol"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:473
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:481
 msgid "Received empty tid/mark or interface name when setting up routing"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:417
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:425
 msgid "Refer to %sREADME%s for details"
 msgstr ""
 
@@ -479,37 +479,37 @@ msgstr ""
 msgid "Remote ports"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:499
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:507
 msgid "Required binary '%s' is missing"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:452
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:460
 msgid "Resolver '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:405
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:413
 msgid "Resolver set (%s) is not supported on this system"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:307
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:315
 msgid "Resolver set (%s) is not supported on this system."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:399
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:407
 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:402
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:410
 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:593
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:601
 msgid "Restart"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:587
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:595
 msgid "Restarting %s service"
 msgstr ""
 
@@ -523,7 +523,7 @@ msgid ""
 "See the %sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:233
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:241
 msgid "Running"
 msgstr ""
 
@@ -535,11 +535,11 @@ msgstr ""
 msgid "Select Add for -A/add and Insert for -I/Insert."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:676
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:684
 msgid "Service Control"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:529
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:537
 msgid "Service Errors"
 msgstr ""
 
@@ -548,15 +548,15 @@ msgstr ""
 msgid "Service FW Mask"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:265
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:273
 msgid "Service Gateways"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:228
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:236
 msgid "Service Status"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:365
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:373
 msgid "Service Warnings"
 msgstr ""
 
@@ -566,15 +566,15 @@ msgid ""
 "%sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:454
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:462
 msgid "Skipping IPv6 policy '%s' as IPv6 support is disabled"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:574
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:582
 msgid "Start"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:568
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:576
 msgid "Starting %s service"
 msgstr ""
 
@@ -596,19 +596,19 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:612
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:620
 msgid "Stop"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:247
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:255
 msgid "Stopped (Disabled)."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:245
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:253
 msgid "Stopped."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:606
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:614
 msgid "Stopping %s service"
 msgstr ""
 
@@ -632,29 +632,29 @@ msgstr ""
 msgid "Suppress/No output"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:446
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:454
 msgid "Syntax error in custom user file '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:269
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:277
 msgid "The %s indicates default gateway. See the %sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:414
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:422
 msgid ""
-"The %s interface not found, you need to set the "
-"'pbr.config.uplink_interface' option"
+"The %s interface not found, you need to set the 'pbr.config."
+"uplink_interface' option"
 msgstr ""
 
 #: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:97
 msgid "The %s is not supported on this system."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:411
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:419
 msgid "The %s service failed to discover uplink gateway"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:408
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:416
 msgid "The %s service is currently disabled"
 msgstr ""
 
@@ -662,23 +662,23 @@ msgstr ""
 msgid "The %s support is unknown."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:491
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:499
 msgid "The '%s' schema requires curl, but it's not detected on this system"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:329
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:337
 msgid "The WebUI application (luci-app-pbr) is outdated, please update it"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:423
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:431
 msgid "The ipset name '%s' is longer than allowed 31 characters"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:426
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:434
 msgid "The nft set name '%s' is longer than allowed 255 characters"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:332
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:340
 msgid "The principal package (pbr) is outdated, please update it"
 msgstr ""
 
@@ -686,19 +686,19 @@ msgstr ""
 msgid "Unable to retrieve %s status"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:429
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:437
 msgid "Unexpected exit or service termination: '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:501
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:509
 msgid "Unknown IPv6 Link type for device '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:471
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:479
 msgid "Unknown entry in policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:536
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:544
 msgid "Unknown error"
 msgstr ""
 
@@ -706,15 +706,15 @@ msgstr ""
 msgid "Unknown message"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:457
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:465
 msgid "Unknown packet mark for interface '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:463
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:471
 msgid "Unknown protocol in policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:372
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:380
 msgid "Unknown warning"
 msgstr ""
 
@@ -726,17 +726,17 @@ msgstr ""
 msgid "Uplink Interface Table FW Mark"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:359
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:367
 msgid "Uplink/WAN interface is still down, going back to boot mode"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:523
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:531
 msgid ""
 "Uplink/WAN interface is still down, increase value of "
 "'procd_boot_trigger_delay' option"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:449
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:457
 msgid ""
 "Use of 'curl' is detected in custom user file '%s', but 'curl' isn't "
 "installed"
@@ -754,7 +754,7 @@ msgstr ""
 msgid "Version"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:231
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:239
 msgid "Version %s"
 msgstr ""
 
@@ -762,11 +762,11 @@ msgstr ""
 msgid "WAN Table FW Mark"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:351
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:359
 msgid "Warnings encountered, please check %s"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:375
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:383
 msgid "Warnings encountered, please check the %sREADME%s"
 msgstr ""
 
@@ -778,17 +778,17 @@ msgstr ""
 msgid "all"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:237
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:245
 #: applications/luci-app-pbr/htdocs/luci-static/resources/view/status/include/72_pbr.js:31
 msgid "fw4 nft file mode"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:235
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:243
 #: applications/luci-app-pbr/htdocs/luci-static/resources/view/status/include/72_pbr.js:29
 msgid "iptables mode"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:239
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:247
 #: applications/luci-app-pbr/htdocs/luci-static/resources/view/status/include/72_pbr.js:33
 msgid "nft mode"
 msgstr ""
git clone https://git.99rst.org/PROJECT