luci-app-pbr: sync with principal package
authorStan Grishin <[email protected]>
Fri, 1 Aug 2025 01:40:51 +0000 (01:40 +0000)
committerStan Grishin <[email protected]>
Fri, 1 Aug 2025 02:29:45 +0000 (02:29 +0000)
Signed-off-by: Stan Grishin <[email protected]>
applications/luci-app-pbr/Makefile
applications/luci-app-pbr/README.md
applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js
applications/luci-app-pbr/po/templates/pbr.pot
applications/luci-app-pbr/root/usr/libexec/rpcd/luci.pbr
applications/luci-app-pbr/root/usr/share/rpcd/acl.d/luci-app-pbr.json

index 6c2ef0745b837c117004cf46073206bffd73fd0d..0fadc1b1fd36368e8de33a9e0d56fdf5ba1559f3 100644 (file)
@@ -1,5 +1,5 @@
-# Copyright 2017-2024 MOSSDeF, Stan Grishin ([email protected]).
-# This is free software, licensed under AGPL-3.0-or-later.
+# SPDX-License-Identifier: AGPL-3.0-or-later
+# Copyright 2017-2025 MOSSDeF, Stan Grishin ([email protected]).
 
 include $(TOPDIR)/rules.mk
 
@@ -7,7 +7,7 @@ PKG_NAME:=luci-app-pbr
 PKG_LICENSE:=AGPL-3.0-or-later
 PKG_MAINTAINER:=Stan Grishin <[email protected]>
 PKG_VERSION:=1.1.8
-PKG_RELEASE:=10
+PKG_RELEASE:=32
 
 LUCI_TITLE:=Policy Based Routing Service Web UI
 LUCI_URL:=https://github.com/stangri/luci-app-pbr/
index 6e83d50f82d6c89c5e214a853689aea7e6c82660..8733e8a23b986eb30e33f6f7b2ca11c6870b5988 100644 (file)
@@ -1,3 +1,19 @@
-# README
+# LuCI App for pbr
 
-Documentation for this project is available at [https://docs.openwrt.melmac.net/pbr/](https://docs.openwrt.melmac.net/pbr/).
+[![OpenWrt](https://img.shields.io/badge/OpenWrt-Compatible-blueviolet)](https://openwrt.org)
+[![Web UI](https://img.shields.io/badge/Web_UI-Available-blue)](https://docs.openwrt.melmac.ca/pbr/)
+[![License](https://img.shields.io/badge/License-GPL--3.0-lightgrey)](https://github.com/stangri/luci-app-pbr/blob/master/LICENSE)
+
+LuCI interface for the `pbr` (policy-based routing) package.  
+Provides a visual way to manage traffic policies for routing over specific WAN or VPN interfaces.
+
+## Highlights
+
+- Intuitive Web UI with policy table
+- Add/edit/delete rules by IP, port, MAC, domain
+- Interface-specific status panel and logs
+- Quick toggles for services and resolver settings
+- Integrated with OpenWrt’s service management
+
+**Full documentation:**  
+[https://docs.openwrt.melmac.ca/pbr/](https://docs.openwrt.melmac.ca/pbr/)
index d8b47bc26d15c6e50205f35bcdf3aef3eb7a1bea..18f9f2bc770b286edf5e7008025e8bb589ba125d 100644 (file)
@@ -10,12 +10,15 @@ var pkg = {
        get Name() {
                return "pbr";
        },
+       get LuciCompat() {
+               return 14;
+       },
        get ReadmeCompat() {
                return "1.1.8";
        },
        get URL() {
                return (
-                       "https://docs.openwrt.melmac.net/" +
+                       "https://docs.openwrt.melmac.ca/" +
                        pkg.Name +
                        "/" +
                        (pkg.ReadmeCompat ? pkg.ReadmeCompat + "/" : "")
@@ -23,13 +26,24 @@ var pkg = {
        },
        get DonateURL() {
                return (
-                       "https://docs.openwrt.melmac.net/" +
+                       "https://docs.openwrt.melmac.ca/" +
                        pkg.Name +
                        "/" +
                        (pkg.ReadmeCompat ? pkg.ReadmeCompat + "/" : "") +
                        "#Donate"
                );
        },
+       isVersionMismatch: function (luci, pkg, rpcd) {
+               return luci !== pkg || pkg !== rpcd || luci !== rpcd;
+       },
+       formatMessage: function (info, template) {
+               if (!template) return _("Unknown message") + "<br />";
+               return (
+                       (Array.isArray(info)
+                               ? template.format(...info)
+                               : template.format(info || " ")) + "<br />"
+               );
+       },
 };
 
 var getGateways = rpc.declare({
@@ -62,6 +76,12 @@ var getPlatformSupport = rpc.declare({
        params: ["name"],
 });
 
+var getUbusInfo = rpc.declare({
+       object: "luci." + pkg.Name,
+       method: "getUbusInfo",
+       params: ["name"],
+});
+
 var _setInitAction = rpc.declare({
        object: "luci." + pkg.Name,
        method: "setInitAction",
@@ -87,41 +107,6 @@ var RPC = {
                        }
                });
        },
-       getInitList: function (name) {
-               getInitList(name).then(
-                       function (result) {
-                               this.emit("getInitList", result);
-                       }.bind(this)
-               );
-       },
-       getInitStatus: function (name) {
-               getInitStatus(name).then(
-                       function (result) {
-                               this.emit("getInitStatus", result);
-                       }.bind(this)
-               );
-       },
-       getGateways: function (name) {
-               getGateways(name).then(
-                       function (result) {
-                               this.emit("getGateways", result);
-                       }.bind(this)
-               );
-       },
-       getPlatformSupport: function (name) {
-               getPlatformSupport(name).then(
-                       function (result) {
-                               this.emit("getPlatformSupport", result);
-                       }.bind(this)
-               );
-       },
-       getInterfaces: function (name) {
-               getInterfaces(name).then(
-                       function (result) {
-                               this.emit("getInterfaces", result);
-                       }.bind(this)
-               );
-       },
        setInitAction: function (name, action) {
                _setInitAction(name, action).then(
                        function (result) {
@@ -135,17 +120,10 @@ var status = baseclass.extend({
        render: function () {
                return Promise.all([
                        L.resolveDefault(getInitStatus(pkg.Name), {}),
-                       //                      L.resolveDefault(getGateways(pkg.Name), {}),
+                       L.resolveDefault(getUbusInfo(pkg.Name), {}),
                ]).then(function (data) {
-                       //                      var replyStatus = data[0];
-                       //                      var replyGateways = data[1];
-                       var reply;
-                       var text;
-
-                       if (data[0] && data[0][pkg.Name]) {
-                               reply = data[0][pkg.Name];
-                       } else {
-                               reply = {
+                       var reply = {
+                               status: data[0]?.[pkg.Name] || {
                                        enabled: null,
                                        running: null,
                                        running_iptables: null,
@@ -153,32 +131,59 @@ var status = baseclass.extend({
                                        running_nft_file: null,
                                        version: null,
                                        gateways: null,
+                                       packageCompat: 0,
+                                       rpcdCompat: 0,
+                               },
+                               ubus: data[1]?.[pkg.Name]?.instances?.main?.data || {
+                                       packageCompat: 0,
                                        errors: [],
                                        warnings: [],
-                               };
+                               },
+                       };
+
+                       if (
+                               pkg.isVersionMismatch(
+                                       pkg.LuciCompat,
+                                       reply.status.packageCompat,
+                                       reply.status.rpcdCompat
+                               )
+                       ) {
+                               reply.ubus.warnings.push({
+                                       code: "warningInternalVersionMismatch",
+                                       info: [
+                                               reply.ubus.packageCompat,
+                                               pkg.LuciCompat,
+                                               reply.status.rpcdCompat,
+                                               '<a href="' +
+                                                       pkg.URL +
+                                                       '#Warning:InternalVersionMismatch" target="_blank">',
+                                               "</a>",
+                                       ],
+                               });
                        }
 
+                       var text;
                        var header = E("h2", {}, _("Policy Based Routing - Status"));
                        var statusTitle = E(
                                "label",
                                { class: "cbi-value-title" },
                                _("Service Status")
                        );
-                       if (reply.version) {
-                               text = _("Version %s").format(reply.version) + " - ";
-                               if (reply.running) {
+                       if (reply.status.version) {
+                               text = _("Version %s").format(reply.status.version) + " - ";
+                               if (reply.status.running) {
                                        text += _("Running");
-                                       if (reply.running_iptables) {
+                                       if (reply.status.running_iptables) {
                                                text += " (" + _("iptables mode") + ").";
-                                       } else if (reply.running_nft_file) {
+                                       } else if (reply.status.running_nft_file) {
                                                text += " (" + _("fw4 nft file mode") + ").";
-                                       } else if (reply.running_nft) {
+                                       } else if (reply.status.running_nft) {
                                                text += " (" + _("nft mode") + ").";
                                        } else {
                                                text += ".";
                                        }
                                } else {
-                                       if (reply.enabled) {
+                                       if (reply.status.enabled) {
                                                text += _("Stopped.");
                                        } else {
                                                text += _("Stopped (Disabled).");
@@ -195,7 +200,7 @@ var status = baseclass.extend({
                        ]);
 
                        var gatewaysDiv = [];
-                       if (reply.gateways) {
+                       if (reply.status.gateways) {
                                var gatewaysTitle = E(
                                        "label",
                                        { class: "cbi-value-title" },
@@ -217,7 +222,7 @@ var status = baseclass.extend({
                                                "</a>"
                                        );
                                var gatewaysDescr = E("div", { class: "cbi-value-description" }, text);
-                               var gatewaysText = E("div", {}, reply.gateways);
+                               var gatewaysText = E("div", {}, reply.status.gateways);
                                var gatewaysField = E("div", { class: "cbi-value-field" }, [
                                        gatewaysText,
                                        gatewaysDescr,
@@ -229,8 +234,11 @@ var status = baseclass.extend({
                        }
 
                        var warningsDiv = [];
-                       if (reply.warnings && reply.warnings.length) {
-                               var textLabelsTable = {
+                       if (reply.ubus.warnings && reply.ubus.warnings.length) {
+                               var warningTable = {
+                                       warningInternalVersionMismatch: _(
+                                               "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."
+                                       ),
                                        warningResolverNotSupported: _(
                                                "Resolver set (%s) is not supported on this system."
                                        ).format(L.uci.get(pkg.Name, "config", "resolver_set")),
@@ -283,14 +291,9 @@ var status = baseclass.extend({
                                        _("Service Warnings")
                                );
                                var text = "";
-                               reply.warnings.forEach((element) => {
-                                       if (element.id && textLabelsTable[element.id]) {
-                                               if (element.id !== "warningPolicyProcessCMD") {
-                                                       text +=
-                                                               (textLabelsTable[element.id] + ".").format(
-                                                                       element.extra || " "
-                                                               ) + "<br />";
-                                               }
+                               reply.ubus.warnings.forEach((element) => {
+                                       if (element.code && warningTable[element.code]) {
+                                               text += pkg.formatMessage(element.info, warningTable[element.code]);
                                        } else {
                                                text += _("Unknown warning") + "<br />";
                                        }
@@ -308,8 +311,8 @@ var status = baseclass.extend({
                        }
 
                        var errorsDiv = [];
-                       if (reply.errors && reply.errors.length) {
-                               var textLabelsTable = {
+                       if (reply.ubus.errors && reply.ubus.errors.length) {
+                               var errorTable = {
                                        errorConfigValidation: _("Config (%s) validation failure").format(
                                                "/etc/config/" + pkg.Name
                                        ),
@@ -333,7 +336,7 @@ var status = baseclass.extend({
                                                "The %s interface not found, you need to set the 'pbr.config.procd_wan_interface' option"
                                        ),
                                        errorNoWanInterfaceHint: _(
-                                               "Refer to https://docs.openwrt.melmac.net/pbr/#procd_wan_interface"
+                                               "Refer to https://docs.openwrt.melmac.ca/pbr/#procd_wan_interface"
                                        ),
                                        errorIpsetNameTooLong: _(
                                                "The ipset name '%s' is longer than allowed 31 characters"
@@ -384,6 +387,7 @@ var status = baseclass.extend({
                                        errorPolicyProcessInsertionFailedIpv4: _(
                                                "Insertion failed for IPv4 for policy '%s'"
                                        ),
+                                       errorPolicyProcessUnknownEntry: _("Unknown entry in policy '%s'"),
                                        errorInterfaceRoutingEmptyValues: _(
                                                "Received empty tid/mark or interface name when setting up routing"
                                        ),
@@ -419,16 +423,11 @@ var status = baseclass.extend({
                                        _("Service Errors")
                                );
                                var text = "";
-                               reply.errors.forEach((element) => {
-                                       if (element.id && textLabelsTable[element.id]) {
-                                               if (element.id !== "errorPolicyProcessCMD") {
-                                                       text +=
-                                                               (textLabelsTable[element.id] + "!").format(
-                                                                       element.extra || " "
-                                                               ) + "<br />";
-                                               }
+                               reply.ubus.errors.forEach((element) => {
+                                       if (element.code && errorTable[element.code]) {
+                                               text += pkg.formatMessage(element.info, errorTable[element.code]);
                                        } else {
-                                               text += _("Unknown error!") + "<br />";
+                                               text += _("Unknown error") + "<br />";
                                        }
                                });
                                text += _("Errors encountered, please check the %sREADME%s").format(
@@ -545,10 +544,10 @@ var status = baseclass.extend({
                                _("Disable")
                        );
 
-                       if (reply.enabled) {
+                       if (reply.status.enabled) {
                                btn_enable.disabled = true;
                                btn_disable.disabled = false;
-                               if (reply.running) {
+                               if (reply.status.running) {
                                        btn_start.disabled = true;
                                        btn_action.disabled = false;
                                        btn_stop.disabled = false;
@@ -582,7 +581,7 @@ var status = baseclass.extend({
                                btn_disable,
                        ]);
                        var buttonsField = E("div", { class: "cbi-value-field" }, buttonsText);
-                       var buttonsDiv = reply.version
+                       var buttonsDiv = reply.status.version
                                ? E("div", { class: "cbi-value" }, [buttonsTitle, buttonsField])
                                : "";
 
@@ -604,7 +603,7 @@ var status = baseclass.extend({
                                )
                        );
 
-                       var donateDiv = reply.version
+                       var donateDiv = reply.status.version
                                ? E("div", { class: "cbi-value" }, [donateTitle, donateText])
                                : "";
 
@@ -632,4 +631,5 @@ return L.Class.extend({
        getInitStatus: getInitStatus,
        getInterfaces: getInterfaces,
        getPlatformSupport: getPlatformSupport,
+       getUbusInfo: getUbusInfo,
 });
index e3e571663daa8ef3c65a74a4db8dd23c9830036b..5290fa40e8cea3fef48d52fa476f12fe9dafd09b 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:240
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:358
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:248
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:361
 msgid "%s"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:316
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:319
 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:405
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:409
 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:313
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:316
 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:361
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:364
 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:410
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:414
 msgid "Default fw4 chain '%s' is missing"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:409
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:413
 msgid "Default fw4 table '%s' is missing"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:545
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:544
 msgid "Disable"
 msgstr ""
 
@@ -125,7 +125,7 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:539
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:538
 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:266
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:274
 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:592
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:591
 msgid "Donate to the Project"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:526
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:525
 msgid "Enable"
 msgstr ""
 
@@ -167,15 +167,15 @@ msgstr ""
 msgid "Enabled"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:520
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:519
 msgid "Enabling %s service"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:363
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:366
 msgid "Error running custom user file '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:434
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:433
 msgid "Errors encountered, please check the %sREADME%s"
 msgstr ""
 
@@ -185,31 +185,31 @@ msgid ""
 "QoS. Change with caution together with"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:401
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:405
 msgid "Failed to download '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:399
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:403
 msgid "Failed to download '%s', HTTPS is not supported"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:394
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:398
 msgid "Failed to install fw4 nft file '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:360
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:363
 msgid "Failed to reload '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:390
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:394
 msgid "Failed to resolve '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:359
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:362
 msgid "Failed to set up '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:367
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:370
 msgid "Failed to set up any gateway"
 msgstr ""
 
@@ -237,11 +237,11 @@ msgstr ""
 msgid "Inactive (Disabled)"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:407
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:411
 msgid "Incompatible custom user file detected '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:263
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:271
 msgid ""
 "Incompatible nft calls detected in user include file, disabling fw4 nft file "
 "support"
@@ -251,15 +251,15 @@ msgstr ""
 msgid "Insert"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:385
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:388
 msgid "Insertion failed for IPv4 for policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:382
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:385
 msgid "Insertion failed for both IPv4 and IPv6 for policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:238
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:246
 msgid "Installed AdGuardHome (%s) doesn't support 'ipset_file' option."
 msgstr ""
 
@@ -267,15 +267,22 @@ msgstr ""
 msgid "Interface"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:353
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:356
 msgid "Interface '%s' has no assigned DNS"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:254
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:240
+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:262
 msgid "Invalid OpenVPN config for %s interface"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:392
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:396
 msgid "Invalid OpenVPN config for '%s' interface"
 msgstr ""
 
@@ -288,7 +295,7 @@ msgstr ""
 msgid "Local ports"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:376
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:379
 msgid "Mismatched IP family between in policy '%s'"
 msgstr ""
 
@@ -320,7 +327,7 @@ msgstr ""
 msgid "No Change"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:188
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:193
 #: applications/luci-app-pbr/htdocs/luci-static/resources/view/status/include/72_pbr.js:58
 msgid "Not installed or not found"
 msgstr ""
@@ -333,8 +340,8 @@ msgstr ""
 msgid "Path"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:215
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:600
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:220
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:599
 msgid "Please %sdonate%s to support development of this project."
 msgstr ""
 
@@ -342,24 +349,24 @@ msgstr ""
 msgid "Please check the %sREADME%s before changing this option."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:270
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:278
 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:248
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:256
 msgid "Please unset 'chain' or set 'chain' to 'PREROUTING' for policy '%s'"
 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
 msgid "Please unset 'chain' or set 'chain' to 'prerouting' for policy '%s'"
 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 "Please unset 'proto' or set 'proto' to 'all' for policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:242
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:250
 msgid "Please unset 'src_addr', 'src_port' and 'dest_port' for policy '%s'"
 msgstr ""
 
@@ -367,23 +374,23 @@ msgstr ""
 msgid "Policies"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:356
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:359
 msgid "Policy '%s' has an unknown interface"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:351
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:354
 msgid "Policy '%s' has no assigned DNS"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:350
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:353
 msgid "Policy '%s' has no assigned interface"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:348
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:351
 msgid "Policy '%s' has no source/destination parameters"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:396
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:400
 msgid ""
 "Policy '%s' refers to URL which can't be downloaded in 'secure_reload' mode"
 msgstr ""
@@ -396,7 +403,7 @@ msgstr ""
 msgid "Policy Based Routing - Configuration"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:161
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:166
 msgid "Policy Based Routing - Status"
 msgstr ""
 
@@ -408,12 +415,12 @@ msgstr ""
 msgid "Protocol"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:388
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:392
 msgid "Received empty tid/mark or interface name when setting up routing"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:336
-msgid "Refer to https://docs.openwrt.melmac.net/pbr/#procd_wan_interface"
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:339
+msgid "Refer to https://docs.openwrt.melmac.ca/pbr/#procd_wan_interface"
 msgstr ""
 
 #: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:368
@@ -428,37 +435,37 @@ msgstr ""
 msgid "Remote ports"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:411
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:415
 msgid "Required binary '%s' is missing"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:368
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:371
 msgid "Resolver '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:324
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:327
 msgid "Resolver set (%s) is not supported on this system"
 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
 msgid "Resolver set (%s) is not supported on this system."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:318
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:321
 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:321
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:324
 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:488
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:487
 msgid "Restart"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:482
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:481
 msgid "Restarting %s service"
 msgstr ""
 
@@ -472,7 +479,7 @@ msgid ""
 "See the %sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:170
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:175
 msgid "Running"
 msgstr ""
 
@@ -484,11 +491,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:571
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:570
 msgid "Service Control"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:419
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:423
 msgid "Service Errors"
 msgstr ""
 
@@ -497,15 +504,15 @@ msgstr ""
 msgid "Service FW Mask"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:202
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:207
 msgid "Service Gateways"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:165
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:170
 msgid "Service Status"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:283
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:291
 msgid "Service Warnings"
 msgstr ""
 
@@ -515,15 +522,15 @@ msgid ""
 "%sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:370
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:373
 msgid "Skipping IPv6 policy '%s' as IPv6 support is disabled"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:469
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:468
 msgid "Start"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:463
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:462
 msgid "Starting %s service"
 msgstr ""
 
@@ -537,19 +544,19 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:507
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:506
 msgid "Stop"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:184
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:189
 msgid "Stopped (Disabled)."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:182
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:187
 msgid "Stopped."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:501
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:500
 msgid "Stopping %s service"
 msgstr ""
 
@@ -573,29 +580,29 @@ msgstr ""
 msgid "Suppress/No output"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:362
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:365
 msgid "Syntax error in custom user file '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:206
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:211
 msgid "The %s indicates default gateway. See the %sREADME%s for details."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:333
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:336
 msgid ""
-"The %s interface not found, you need to set the "
-"'pbr.config.procd_wan_interface' option"
+"The %s interface not found, you need to set the 'pbr.config."
+"procd_wan_interface' option"
 msgstr ""
 
 #: applications/luci-app-pbr/htdocs/luci-static/resources/view/pbr/overview.js:96
 msgid "The %s is not supported on this system."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:330
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:333
 msgid "The %s service failed to discover WAN gateway"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:327
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:330
 msgid "The %s service is currently disabled"
 msgstr ""
 
@@ -603,51 +610,59 @@ msgstr ""
 msgid "The %s support is unknown."
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:257
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:265
 msgid "The WebUI application (luci-app-pbr) is outdated, please update it"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:403
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:407
 msgid "The file:// schema requires curl, but it's not detected on this system"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:339
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:342
 msgid "The ipset name '%s' is longer than allowed 31 characters"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:342
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:345
 msgid "The nft set name '%s' is longer than allowed 255 characters"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:260
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:268
 msgid "The principal package (pbr) is outdated, please update it"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:345
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:348
 msgid "Unexpected exit or service termination: '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:413
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:417
 msgid "Unknown IPv6 Link type for device '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:431
-msgid "Unknown error!"
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:390
+msgid "Unknown entry in policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:373
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:430
+msgid "Unknown error"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:40
+msgid "Unknown message"
+msgstr ""
+
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:376
 msgid "Unknown packet mark for interface '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:379
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:382
 msgid "Unknown protocol in policy '%s'"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:295
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:298
 msgid "Unknown warning"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:365
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:368
 msgid ""
 "Use of 'curl' is detected in custom user file '%s', but 'curl' isn't "
 "installed"
@@ -665,7 +680,7 @@ msgstr ""
 msgid "Version"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:168
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:173
 msgid "Version %s"
 msgstr ""
 
@@ -682,17 +697,17 @@ msgstr ""
 msgid "all"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:174
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:179
 #: applications/luci-app-pbr/htdocs/luci-static/resources/view/status/include/72_pbr.js:44
 msgid "fw4 nft file mode"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:172
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:177
 #: applications/luci-app-pbr/htdocs/luci-static/resources/view/status/include/72_pbr.js:42
 msgid "iptables mode"
 msgstr ""
 
-#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:176
+#: applications/luci-app-pbr/htdocs/luci-static/resources/pbr/status.js:181
 #: applications/luci-app-pbr/htdocs/luci-static/resources/view/status/include/72_pbr.js:46
 msgid "nft mode"
 msgstr ""
index 477137f9047a7c7173a73c54fa03b63058cd664c..e5ce4fb4eea0ccf5d87d20665a77cfcf800f9c37 100755 (executable)
@@ -8,10 +8,11 @@
 # ubus -S call luci.pbr getInitList '{"name": "pbr" }'
 # ubus -S call luci.pbr getInitStatus '{"name": "pbr" }'
 # ubus -S call luci.pbr getPlatformSupport '{"name": "pbr" }'
+# ubus -S call luci.pbr getUbusInfo '{"name": "pbr" }'
 # ubus -S call luci.pbr getGateways '{"name": "pbr" }'
 # ubus -S call luci.pbr getInterfaces '{"name": "pbr" }'
 
-readonly luciCompat='11'
+readonly rpcdCompat='14'
 readonly pbrFunctionsFile='/etc/init.d/pbr'
 if [ -s "$pbrFunctionsFile" ]; then
 # shellcheck source=../../../../../pbr/files/etc/init.d/pbr
@@ -22,7 +23,7 @@ else
 fi
 
 # compatibility with old luci app versions
-is_running_iptables() { iptables -t mangle -L | grep -q PBR_PREROUTING >/dev/null 2>&1; }
+is_running_iptables() { iptables -t mangle -n -L | grep -q PBR_PREROUTING >/dev/null 2>&1; }
 is_running() { is_running_iptables || is_running_nft; }
 check_ipset() { { [ -n "$ipset" ] && "$ipset" help hash:net; } >/dev/null 2>&1; }
 check_agh_ipset() {
@@ -84,13 +85,10 @@ set_init_action() {
 }
 
 get_init_status() {
-       local name
+       local name gateways
        name="$(basename "$1")"
        name="${name:-$packageName}" 
-       local gateways warnings errors
        gateways="$(ubus_get_status gateways | sed "s|\\\n|<br />|g;s|\(\\\033[^<]*\)|✓|g;")"
-       warnings="$(ubus_get_status warnings)"
-       errors="$(ubus_get_status errors)"
        json_init
        json_add_object  "$packageName"
        json_add_boolean 'enabled' "$(is_enabled "$packageName")"
@@ -116,53 +114,8 @@ get_init_status() {
        fi
        json_add_string 'version' "$PKG_VERSION"
        json_add_string 'gateways' "$gateways"
-       json_add_array 'errors'
-       if [ -n "$errors" ]; then
-               while read -r line; do
-                       if str_contains "$line" ' '; then
-                               error_id="${line% *}"
-                               error_extra="${line#* }"
-                       else
-                               error_id="$line"
-                               unset error_extra
-                       fi
-                       json_add_object
-                       json_add_string 'id' "$error_id"
-                       json_add_string 'extra' "$error_extra"
-                       json_close_object
-               done <<EOF
-$(echo "$errors" | tr \# \\n)
-EOF
-       fi
-       json_close_array
-       json_add_array 'warnings'
-       if [ -n "$warnings" ]; then
-               while read -r line; do
-                       if str_contains "$line" ' '; then
-                               warning_id="${line% *}"
-                               warning_extra="${line#* }"
-                       else
-                               warning_id="$line"
-                               unset warning_extra
-                       fi
-                       json_add_object
-                       json_add_string 'id' "$warning_id"
-                       json_add_string 'extra' "$warning_extra"
-                       json_close_object
-               done <<EOF
-$(echo "$warnings" | tr \# \\n)
-EOF
-       fi
-       if is_greater "${packageCompat:-0}" "${luciCompat:-0}"; then
-               json_add_object
-               json_add_string 'id' 'warningOutdatedLuciPackage'
-               json_close_object
-       elif is_greater "${luciCompat:-0}" "${packageCompat:-0}"; then
-               json_add_object
-               json_add_string 'id' 'warningOutdatedPrincipalPackage'
-               json_close_object
-       fi
-       json_close_array
+       json_add_int            'packageCompat' "${packageCompat:-0}"
+       json_add_int            'rpcdCompat'            "${rpcdCompat:-0}"
        json_close_object
        json_dump
        json_cleanup
@@ -268,6 +221,13 @@ get_supported_interfaces() {
        json_cleanup
 }
 
+get_ubus_info() {
+       local name
+       name="$(basename "$1")"
+       name="${name:-$packageName}"
+       ubus call service list '{"name":"'"$name"'"}'
+}
+
 case "$1" in
        list)
                json_init
@@ -286,6 +246,9 @@ case "$1" in
                json_add_object "getPlatformSupport"
                        json_add_string 'name' 'name'
                json_close_object
+               json_add_object "getUbusInfo"
+                       json_add_string 'name' 'name'
+               json_close_object
                json_add_object "setInitAction"
                        json_add_string 'name' 'name'
                        json_add_string 'action' 'action'
@@ -330,6 +293,13 @@ case "$1" in
                                json_cleanup
                                get_platform_support "$packageName"
                                ;;
+                       getUbusInfo)
+                               read -r input
+                               json_load "$input"
+                               json_get_var name 'name'
+                               json_cleanup
+                               get_ubus_info "$name"
+                               ;;
                        setInitAction)
                                read -r input
                                json_load "$input"
index 6c2f7de6d78a994e00f366543a1d7c8d6cd53fb1..f785d3af2c4b60a8d68f1c7babf556a18d410b32 100644 (file)
@@ -8,7 +8,8 @@
                                        "getInitList",
                                        "getInitStatus",
                                        "getInterfaces",
-                                       "getPlatformSupport"
+                                       "getPlatformSupport",
+                                       "getUbusInfo"
                                ]
                        },
                        "file": {