diff --git a/dae/Makefile b/dae/Makefile
index dc5e3e91..7ee47975 100644
--- a/dae/Makefile
+++ b/dae/Makefile
@@ -6,9 +6,9 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=dae
PKG_VERSION:=2026.08.13
-PKG_RELEASE:=35
+PKG_RELEASE:=36
-PKG_SOURCE:=dae-src-2026.08.13-44554e556f44.tar.gz
+PKG_SOURCE:=dae-src-2026.08.13-0d20959710a0.tar.gz
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=skip
diff --git a/daed/Makefile b/daed/Makefile
index 473fab2a..106f921c 100644
--- a/daed/Makefile
+++ b/daed/Makefile
@@ -6,9 +6,9 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=daed
PKG_VERSION:=2026.08.13
-PKG_RELEASE:=46
+PKG_RELEASE:=47
-PKG_SOURCE:=daed-src-2026.08.13-b5028aedb364.tar.gz
+PKG_SOURCE:=daed-src-2026.08.13-4a38e0f66b3d.tar.gz
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=skip
diff --git a/luci-app-mmconfig/Makefile b/luci-app-mmconfig/Makefile
index 78b81e92..77ecbd41 100644
--- a/luci-app-mmconfig/Makefile
+++ b/luci-app-mmconfig/Makefile
@@ -3,8 +3,8 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=Configrure modem bands via mmcli utility
LUCI_DEPENDS:=+luci-proto-modemmanager +luci-app-modeminfo
PKG_LICENSE:=GPLv3
-PKG_VERSION:=0.1.1
-PKG_RELEASE:=1
+PKG_VERSION:=0.1.2
+PKG_RELEASE:=2
include $(TOPDIR)/feeds/luci/luci.mk
diff --git a/luci-app-mmconfig/htdocs/luci-static/resources/view/modem/bands.js b/luci-app-mmconfig/htdocs/luci-static/resources/view/modem/bands.js
index d826fad3..d6f30d88 100644
--- a/luci-app-mmconfig/htdocs/luci-static/resources/view/modem/bands.js
+++ b/luci-app-mmconfig/htdocs/luci-static/resources/view/modem/bands.js
@@ -5,6 +5,174 @@
'require dom';
'require modemmanager_helper as helper';
+function getBandInfo(band) {
+ var match = /^(utran|eutran|ngran)-(\d+)$/.exec(band);
+
+ if (match) {
+ var generation = {
+ 'utran': { key: '3g', title: _('3G / UMTS'), order: 2 },
+ 'eutran': { key: '4g', title: _('4G / LTE'), order: 3 },
+ 'ngran': { key: '5g', title: _('5G / NR'), order: 4 }
+ }[match[1]];
+
+ return {
+ value: band,
+ number: parseInt(match[2], 10),
+ label: match[1] == 'ngran' ? 'n' + match[2] : 'B' + match[2],
+ generation: generation
+ };
+ }
+
+ return {
+ value: band,
+ number: null,
+ label: band,
+ generation: {
+ key: '2g',
+ title: _('2G / GSM'),
+ order: 1
+ }
+ };
+}
+
+function groupBands(bands) {
+ var groups = {};
+
+ (bands || []).forEach(function(band) {
+ var info = getBandInfo(band);
+ var key = info.generation.key;
+
+ if (!groups[key]) {
+ groups[key] = {
+ key: key,
+ title: info.generation.title,
+ order: info.generation.order,
+ bands: []
+ };
+ }
+
+ groups[key].bands.push(info);
+ });
+
+ Object.keys(groups).forEach(function(key) {
+ groups[key].bands.sort(function(a, b) {
+ if (a.number !== null && b.number !== null)
+ return a.number - b.number;
+
+ if (a.number !== null)
+ return -1;
+
+ if (b.number !== null)
+ return 1;
+
+ return a.value.localeCompare(b.value);
+ });
+ });
+
+ return Object.keys(groups).map(function(key) {
+ return groups[key];
+ }).sort(function(a, b) {
+ return a.order - b.order;
+ });
+}
+
+var BandValue = form.Value.extend({
+ supportedBands: [],
+ selectedBands: [],
+
+ formvalue: function(section_id) {
+ var node = document.getElementById(this.cbid(section_id));
+ if (!node)
+ return [];
+
+ return Array.prototype.slice.call(
+ node.querySelectorAll('input[type="checkbox"][data-band-value]:checked')
+ ).map(function(input) {
+ return input.getAttribute('data-band-value');
+ });
+ },
+
+ renderWidget: function(section_id) {
+ var container = E('div', {
+ 'class': 'mmconfig-bands',
+ 'id': this.cbid(section_id)
+ });
+
+ var selected = {};
+ (this.selectedBands || []).forEach(function(band) {
+ selected[band] = true;
+ });
+
+ var groups = groupBands(this.supportedBands);
+
+ if (!groups.length) {
+ return E('div', { 'class': 'mmconfig-bands-empty' },
+ _('No supported bands reported by ModemManager.'));
+ }
+
+ groups.forEach(function(group) {
+ var groupNode = E('div', { 'class': 'mmconfig-band-group' });
+ var header = E('div', { 'class': 'mmconfig-band-group-header cbi-rowstyle-2' });
+ var title = E('strong', { 'class': 'mmconfig-band-group-title' }, group.title);
+ var actions = E('span', { 'class': 'mmconfig-band-actions' });
+
+ actions.appendChild(E('button', {
+ 'type': 'button',
+ 'class': 'btn cbi-button cbi-button-neutral mmconfig-band-action',
+ 'click': function() {
+ groupNode.querySelectorAll('input[type="checkbox"][data-band-value]').forEach(function(input) {
+ input.checked = true;
+ });
+ }
+ }, _('All')));
+
+ actions.appendChild(E('button', {
+ 'type': 'button',
+ 'class': 'btn cbi-button cbi-button-neutral mmconfig-band-action',
+ 'click': function() {
+ groupNode.querySelectorAll('input[type="checkbox"][data-band-value]').forEach(function(input) {
+ input.checked = false;
+ });
+ }
+ }, _('None')));
+
+ header.appendChild(title);
+ header.appendChild(actions);
+
+ var grid = E('div', { 'class': 'mmconfig-band-grid' });
+
+ group.bands.forEach(function(band) {
+ var id = this.cbid(section_id) + '-' +
+ band.value.replace(/[^a-zA-Z0-9_-]/g, '-');
+
+ var input = E('input', {
+ 'type': 'checkbox',
+ 'id': id,
+ 'data-band-value': band.value
+ });
+
+ input.checked = !!selected[band.value];
+
+ grid.appendChild(E('label', {
+ 'class': 'mmconfig-band-item',
+ 'for': id,
+ 'title': band.value
+ }, [
+ input,
+ E('span', { 'class': 'mmconfig-band-label' }, band.label)
+ ]));
+ }, this);
+
+ groupNode.appendChild(header);
+ groupNode.appendChild(grid);
+ container.appendChild(groupNode);
+ }, this);
+
+ return container;
+ }
+});
+
+
return view.extend({
load: function() {
return Promise.all([
@@ -15,7 +183,9 @@ return view.extend({
render: function(data) {
var modemsData = data[1];
- var m = new form.Map('mmconfig', _('Modem Configuration'), _('List supported bands.
If deselect all bands, then used default band modem config.'));
+ var m = new form.Map('mmconfig', _('Modem Configuration'), _('Select bands for modem operation.' +
+ + '
' + 'Selected bands are a recommendation and do not guarantee that the modem will use exactly these bands.' +
+ + '
';
+ html += '
/etc/init.d/mmconfig start"
msgstr "Не найдена конфигурация. Перезапустите скрипт /etc/init.d/mmconfig start"
diff --git a/luci-app-passwall2/Makefile b/luci-app-passwall2/Makefile
index 78cd3fa6..78d578e4 100644
--- a/luci-app-passwall2/Makefile
+++ b/luci-app-passwall2/Makefile
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall2
PKG_VERSION:=26.8.14
-PKG_RELEASE:=80
+PKG_RELEASE:=81
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \
@@ -59,11 +59,11 @@ choice
default PACKAGE_$(PKG_NAME)_Basic_Core_Xray
config PACKAGE_$(PKG_NAME)_Basic_Core_Xray
- bool "Xray"
+ tristate "Xray"
select PACKAGE_xray-core
config PACKAGE_$(PKG_NAME)_Basic_Core_SingBox
- bool "SingBox"
+ tristate "SingBox"
select PACKAGE_sing-box
config PACKAGE_$(PKG_NAME)_Basic_Core_All
diff --git a/luci-app-passwall2/luasrc/controller/passwall2.lua b/luci-app-passwall2/luasrc/controller/passwall2.lua
index d5350972..e7f3d225 100644
--- a/luci-app-passwall2/luasrc/controller/passwall2.lua
+++ b/luci-app-passwall2/luasrc/controller/passwall2.lua
@@ -5,8 +5,7 @@ module("luci.controller.passwall2", package.seeall)
local api = require "luci.passwall2.api"
local appname = api.appname -- not available
local c_config = api.c_config -- not available
-local s_config = api.s_config -- not available
-local uci = api.uci -- in funtion index()
+local uci, uci_get, uci_set, uci_del, uci_foreach, uci_save = api.uci, api.uci_get_c, api.uci_set_c, api.uci_del_c, api.uci_foreach_c, api.uci_save_c
local http = require "luci.http"
local util = require "luci.util"
local i18n = require "luci.i18n"
@@ -22,14 +21,11 @@ function index()
end
local api = require "luci.passwall2.api"
local appname = api.appname -- global definitions not available
- local c_config = api.c_config -- not available
- local s_config = api.s_config -- not available
- local uci = api.uci -- in function index()
entry({"admin", "services", appname}).dependent = true
entry({"admin", "services", appname, "show"}, call("show_menu")).leaf = true
entry({"admin", "services", appname, "hide"}, call("hide_menu")).leaf = true
local e
- if uci:get(c_config, "@global[0]", "hide_from_luci") ~= "1" then
+ if api.uci_get_c("@global[0]", "hide_from_luci") ~= "1" then
e = entry({"admin", "services", appname}, alias("admin", "services", appname, "settings"), _("PassWall 2"), 0)
else
e = entry({"admin", "services", appname}, alias("admin", "services", appname, "settings"), nil, 0)
@@ -248,10 +244,10 @@ function socks_autoswitch_add_node()
local id = http.formvalue("id")
local key = http.formvalue("key")
if id and id ~= "" and key and key ~= "" then
- uci:set(c_config, id, "enable_autoswitch", "1")
- local new_list = uci:get(c_config, id, "autoswitch_backup_node") or {}
+ uci_set(id, "enable_autoswitch", "1")
+ local new_list = uci_get(id, "autoswitch_backup_node") or {}
for i = #new_list, 1, -1 do
- if (uci:get(c_config, new_list[i], "remarks") or ""):find(key) then
+ if (uci_get(new_list[i], "remarks") or ""):find(key) then
table.remove(new_list, i)
end
end
@@ -260,8 +256,8 @@ function socks_autoswitch_add_node()
table.insert(new_list, e.id)
end
end
- uci:set_list(c_config, id, "autoswitch_backup_node", new_list)
- api.uci_save(uci, c_config)
+ uci_set(id, "autoswitch_backup_node", new_list)
+ uci_save()
end
http.redirect(api.url("socks_config", id))
end
@@ -270,15 +266,15 @@ function socks_autoswitch_remove_node()
local id = http.formvalue("id")
local key = http.formvalue("key")
if id and id ~= "" and key and key ~= "" then
- uci:set(c_config, id, "enable_autoswitch", "1")
- local new_list = uci:get(c_config, id, "autoswitch_backup_node") or {}
+ uci_set(id, "enable_autoswitch", "1")
+ local new_list = uci_get(id, "autoswitch_backup_node") or {}
for i = #new_list, 1, -1 do
- if (uci:get(c_config, new_list[i], "remarks") or ""):find(key) then
+ if (uci_get(new_list[i], "remarks") or ""):find(key) then
table.remove(new_list, i)
end
end
- uci:set_list(c_config, id, "autoswitch_backup_node", new_list)
- api.uci_save(uci, c_config)
+ uci_set(id, "autoswitch_backup_node", new_list)
+ uci_save()
end
http.redirect(api.url("socks_config", id))
end
@@ -369,7 +365,7 @@ function socks_status()
local id = http.formvalue("id")
e.index = index
e.socks_status = luci.sys.call(string.format("/bin/busybox top -bn1 | grep -v -E 'grep|acl/|acl_' | grep '%s/bin/' | grep '%s' > /dev/null", appname, id)) == 0
- local use_http = uci:get(c_config, id, "http_port") or 0
+ local use_http = uci_get(id, "http_port") or 0
e.use_http = 0
if tonumber(use_http) > 0 then
e.use_http = 1
@@ -439,9 +435,9 @@ function update_config()
local data_t = jsonParse(data) or {}
if next(data_t) then
for k, v in pairs(data_t) do
- uci:set(c_config, id, k, v)
+ uci_set(id, k, v)
end
- api.uci_save(uci, c_config)
+ uci_save()
http_write_json_ok()
return
end
@@ -457,16 +453,16 @@ function add_node()
local group = http.formvalue("group")
if group and group ~= "default" then
- uci:set(c_config, uid, "group", group)
+ uci_set(uid, "group", group)
end
- uci:set(c_config, uid, "type", "Xray")
+ uci_set(uid, "type", "Xray")
if redirect == "1" then
- api.uci_save(uci, c_config)
+ uci_save()
http.redirect(api.url("node_config", uid))
else
- api.uci_save(uci, c_config, true, true)
+ uci_save(true, true)
http_write_json({result = uid})
end
end
@@ -475,8 +471,8 @@ function set_node()
local type = http.formvalue("type")
local config = http.formvalue("config")
local section = http.formvalue("section")
- uci:set(c_config, type, config, section)
- api.uci_save(uci, c_config, true, true)
+ uci_set(type, config, section)
+ uci_save(true, true)
http.redirect(api.url("log"))
end
@@ -484,58 +480,58 @@ function copy_node()
local section = http.formvalue("section")
local uid = api.gen_random_char()
uci:section(c_config, "nodes", uid)
- for k, v in pairs(uci:get_all(c_config, section)) do
+ for k, v in pairs(uci_get(section)) do
if not k:match("^%.") and k ~= "group" then
if k == "remarks" then v = (v or "") .. "(1)" end
- uci:set(c_config, uid, k, v)
+ uci_set(uid, k, v)
end
end
- uci:set(c_config, uid, "add_mode", 1)
- api.uci_save(uci, c_config)
+ uci_set(uid, "add_mode", 1)
+ uci_save()
http.redirect(api.url("node_config", uid))
end
function clear_all_nodes()
- uci:set(c_config, '@global[0]', "enabled", "0")
- uci:set(c_config, '@global[0]', "socks_enabled", "0")
- uci:set(c_config, '@global_haproxy[0]', "balancing_enable", "0")
- uci:delete(c_config, '@global[0]', "node")
- uci:foreach(c_config, "socks", function(t)
- uci:delete(c_config, t[".name"])
- uci:set_list(c_config, t[".name"], "autoswitch_backup_node", {})
+ uci_set('@global[0]', "enabled", "0")
+ uci_set('@global[0]', "socks_enabled", "0")
+ uci_set('@global_haproxy[0]', "balancing_enable", "0")
+ uci_del('@global[0]', "node")
+ uci_foreach("socks", function(t)
+ uci_del(t[".name"])
+ uci_set(t[".name"], "autoswitch_backup_node", {})
end)
- uci:foreach(c_config, "haproxy_config", function(t)
- uci:delete(c_config, t[".name"])
+ uci_foreach("haproxy_config", function(t)
+ uci_del(t[".name"])
end)
- uci:foreach(c_config, "acl_rule", function(t)
- uci:delete(c_config, t[".name"], "node")
+ uci_foreach("acl_rule", function(t)
+ uci_del(t[".name"], "node")
end)
- uci:foreach(c_config, "nodes", function(node)
- uci:delete(c_config, node['.name'])
+ uci_foreach("nodes", function(node)
+ uci_del(node['.name'])
end)
- uci:foreach(c_config, "subscribe_list", function(t)
- uci:delete(c_config, t[".name"], "md5")
- uci:delete(c_config, t[".name"], "chain_proxy")
- uci:delete(c_config, t[".name"], "preproxy_node")
- uci:delete(c_config, t[".name"], "to_node")
+ uci_foreach("subscribe_list", function(t)
+ uci_del(t[".name"], "md5")
+ uci_del(t[".name"], "chain_proxy")
+ uci_del(t[".name"], "preproxy_node")
+ uci_del(t[".name"], "to_node")
end)
- api.uci_save(uci, c_config, true, true)
+ uci_save(true, true)
end
function delete_select_nodes()
local ids = http.formvalue("ids")
local redirect = http.formvalue("redirect")
string.gsub(ids, '[^' .. "," .. ']+', function(w)
- if (uci:get(c_config, "@global[0]", "node") or "") == w then
- uci:delete(c_config, '@global[0]', "node")
+ if (uci_get("@global[0]", "node") or "") == w then
+ uci_del('@global[0]', "node")
end
- uci:foreach(c_config, "socks", function(t)
+ uci_foreach("socks", function(t)
if t["node"] == w then
- uci:delete(c_config, t[".name"])
+ uci_del(t[".name"])
end
local changed = false
- local auto_switch_node_list = uci:get(c_config, t[".name"], "autoswitch_backup_node") or {}
+ local auto_switch_node_list = uci_get(t[".name"], "autoswitch_backup_node") or {}
for i = #auto_switch_node_list, 1, -1 do
if w == auto_switch_node_list[i] then
table.remove(auto_switch_node_list, i)
@@ -543,31 +539,31 @@ function delete_select_nodes()
end
end
if changed then
- uci:set_list(c_config, t[".name"], "autoswitch_backup_node", auto_switch_node_list)
+ uci_set(t[".name"], "autoswitch_backup_node", auto_switch_node_list)
end
end)
- uci:foreach(c_config, "haproxy_config", function(t)
+ uci_foreach("haproxy_config", function(t)
if t["lbss"] == w then
- uci:delete(c_config, t[".name"])
+ uci_del(t[".name"])
end
end)
- uci:foreach(c_config, "acl_rule", function(t)
+ uci_foreach("acl_rule", function(t)
if t["node"] == w then
- uci:delete(c_config, t[".name"], "node")
+ uci_del(t[".name"], "node")
end
end)
- uci:foreach(c_config, "nodes", function(t)
+ uci_foreach("nodes", function(t)
if t["preproxy_node"] == w then
- uci:delete(c_config, t[".name"], "preproxy_node")
- uci:delete(c_config, t[".name"], "chain_proxy")
+ uci_del(t[".name"], "preproxy_node")
+ uci_del(t[".name"], "chain_proxy")
end
if t["to_node"] == w then
- uci:delete(c_config, t[".name"], "to_node")
- uci:delete(c_config, t[".name"], "chain_proxy")
+ uci_del(t[".name"], "to_node")
+ uci_del(t[".name"], "chain_proxy")
end
local list_name = t["urltest_node"] and "urltest_node" or (t["balancing_node"] and "balancing_node")
if list_name then
- local nodes = uci:get_list(c_config, t[".name"], list_name)
+ local nodes = uci_get(t[".name"], list_name)
if nodes then
local changed = false
local new_nodes = {}
@@ -579,48 +575,48 @@ function delete_select_nodes()
end
end
if changed then
- uci:set_list(c_config, t[".name"], list_name, new_nodes)
+ uci_set(t[".name"], list_name, new_nodes)
end
end
end
if t["fallback_node"] == w then
- uci:delete(c_config, t[".name"], "fallback_node")
+ uci_del(t[".name"], "fallback_node")
end
end)
- uci:foreach(c_config, "subscribe_list", function(t)
+ uci_foreach("subscribe_list", function(t)
if t["preproxy_node"] == w then
- uci:delete(c_config, t[".name"], "preproxy_node")
- uci:delete(c_config, t[".name"], "chain_proxy")
+ uci_del(t[".name"], "preproxy_node")
+ uci_del(t[".name"], "chain_proxy")
end
if t["to_node"] == w then
- uci:delete(c_config, t[".name"], "to_node")
- uci:delete(c_config, t[".name"], "chain_proxy")
+ uci_del(t[".name"], "to_node")
+ uci_del(t[".name"], "chain_proxy")
end
end)
- if (uci:get(c_config, w, "add_mode") or "0") == "2" then
- local group = uci:get(c_config, w, "group") or ""
+ if (uci_get(w, "add_mode") or "0") == "2" then
+ local group = uci_get(w, "group") or ""
if group ~= "" then
- uci:foreach(c_config, "subscribe_list", function(t)
+ uci_foreach("subscribe_list", function(t)
if t["remark"] == group then
- uci:delete(c_config, t[".name"], "md5")
+ uci_del(t[".name"], "md5")
end
end)
end
end
- uci:delete(c_config, w)
+ uci_del(w)
end)
if redirect == "1" then
- api.uci_save(uci, c_config)
+ uci_save()
http.redirect(api.url("node_list"))
else
- api.uci_save(uci, c_config, true, true)
+ uci_save(true, true)
end
end
function get_node()
local id = http.formvalue("id")
local result = {}
- local show_node_info = uci:get(c_config, "@global_other[0]", "show_node_info") or "0"
+ local show_node_info = uci_get("@global_other[0]", "show_node_info") or "0"
local function add_is_ipv6_key(o)
if o and o.address and show_node_info == "1" then
@@ -633,12 +629,12 @@ function get_node()
end
if id then
- result = uci:get_all(c_config, id)
+ result = uci_get(id)
add_is_ipv6_key(result)
else
local default_nodes = {}
local other_nodes = {}
- uci:foreach(c_config, "nodes", function(t)
+ uci_foreach("nodes", function(t)
add_is_ipv6_key(t)
if not t.group or t.group == "" then
default_nodes[#default_nodes + 1] = t
@@ -692,7 +688,7 @@ function rollback_rules()
return
end
local bak_dir = "/tmp/bak_v2ray/"
- local geo_dir = (uci:get(c_config, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/")
+ local geo_dir = (uci_get("@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/")
fs.move(bak_dir .. arg_type .. ".dat", geo_dir .. arg_type .. ".dat")
fs.rmdir(bak_dir)
http_write_json_ok()
@@ -705,9 +701,9 @@ function server_update_config()
local data_t = jsonParse(data) or {}
if next(data_t) then
for k, v in pairs(data_t) do
- uci:set(c_config .. "_server", id, k, v)
+ api.uci_set_s(id, k, v)
end
- api.uci_save(uci, c_config .. "_server")
+ api.uci_save_s()
http_write_json_ok()
return
end
@@ -861,7 +857,7 @@ function geo_view()
end
local function get_rules(str, type)
local rules_id = {}
- uci:foreach(c_config, "shunt_rules", function(s)
+ uci_foreach("shunt_rules", function(s)
local list
if type == "geoip" then list = s.ip_list else list = s.domain_list end
for line in string.gmatch((list or ""), "[^\r\n]+") do
@@ -878,7 +874,7 @@ function geo_view()
end)
return rules_id
end
- local geo_dir = (uci:get(c_config, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"):match("^(.*)/")
+ local geo_dir = (uci_get("@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"):match("^(.*)/")
local geosite_path = geo_dir .. "/geosite.dat"
local geoip_path = geo_dir .. "/geoip.dat"
local geo_type, file_path, cmd
@@ -995,8 +991,8 @@ function flush_set()
local redirect = http.formvalue("redirect") or "0"
local reload = http.formvalue("reload") or "0"
if reload == "1" then
- uci:set(c_config, '@global[0]', "flush_set", "1")
- api.uci_save(uci, c_config, true, true)
+ uci_set('@global[0]', "flush_set", "1")
+ uci_save(true, true)
else
api.sh_uci_set(c_config, "@global[0]", "flush_set", "1", true)
end
@@ -1007,9 +1003,9 @@ end
function fetch_certsha256()
local id = http.formvalue("id") or ""
- local address = (id ~= "") and uci:get(c_config, id, "address") or ""
- local port = (id ~= "") and uci:get(c_config, id, "port") or 0
- local sni = (id ~= "") and uci:get(c_config, id, "tls_serverName") or ""
+ local address = (id ~= "") and uci_get(id, "address") or ""
+ local port = (id ~= "") and uci_get(id, "port") or 0
+ local sni = (id ~= "") and uci_get(id, "tls_serverName") or ""
sni = (sni ~= "") and sni or address
if address == "" or port == 0 then
http_write_json_error()
@@ -1024,11 +1020,11 @@ function get_shunt_rules()
local result = {}
if id then
- result = uci:get_all(c_config, id)
+ result = uci_get(id)
else
local default_items = {}
local other_items = {}
- uci:foreach(c_config, "shunt_rules", function(t)
+ uci_foreach("shunt_rules", function(t)
if not t.group or t.group == "" then
default_items[#default_items + 1] = t
else
@@ -1047,7 +1043,7 @@ function add_shunt_rule()
local uid = add_name
if add_name then
- local has = uci:get(c_config, uid)
+ local has = uci_get(uid)
if has then
http_write_json_error({ message = i18n.translate("This ID already exists.") })
return
@@ -1059,14 +1055,14 @@ function add_shunt_rule()
local group = http.formvalue("group")
if group and group ~= "default" then
- uci:set(c_config, uid, "group", group)
+ uci_set(uid, "group", group)
end
if redirect == "1" then
- api.uci_save(uci, c_config)
+ uci_save()
http.redirect(api.url("shunt_rules", uid))
else
- api.uci_save(uci, c_config)
+ uci_save()
http_write_json_ok({uid = uid, redirect_url = api.url("shunt_rules", uid)})
end
end
@@ -1075,17 +1071,17 @@ function delete_select_shunt_rules()
local ids = http.formvalue("ids")
local redirect = http.formvalue("redirect")
string.gsub(ids, '[^' .. "," .. ']+', function(w)
- uci:foreach(c_config, "nodes", function(s)
+ uci_foreach("nodes", function(s)
if s["protocol"] and s["protocol"] == "_shunt" then
- uci:delete(c_config, s[".name"], w)
+ uci_del(s[".name"], w)
end
end)
- uci:delete(c_config, w)
+ uci_del(w)
end)
if redirect == "1" then
- api.uci_save(uci, c_config)
+ uci_save()
http.redirect(api.url("rule"))
else
- api.uci_save(uci, c_config, true, true)
+ uci_save(true, true)
end
end
diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/geoview.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/geoview.lua
index 234aad26..bc11424e 100644
--- a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/geoview.lua
+++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/geoview.lua
@@ -2,7 +2,7 @@ local api = require "luci.passwall2.api"
local fs = api.fs
local uci = api.uci
-local geo_dir = (uci:get(api.c_config, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"):match("^(.*)/")
+local geo_dir = (api.uci_get_c("@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"):match("^(.*)/")
local geosite_path = geo_dir .. "/geosite.dat"
local geoip_path = geo_dir .. "/geoip.dat"
if fs.access(geosite_path) and fs.access(geoip_path) then
diff --git a/luci-app-passwall2/luasrc/passwall2/api.lua b/luci-app-passwall2/luasrc/passwall2/api.lua
index 3e67ce19..fa2d2b39 100644
--- a/luci-app-passwall2/luasrc/passwall2/api.lua
+++ b/luci-app-passwall2/luasrc/passwall2/api.lua
@@ -17,9 +17,10 @@ command_timeout = 300
OPENWRT_ARCH = nil
DISTRIB_ARCH = nil
+LOCK_PREFIX = "/tmp/lock/passwall2"
LOG_FILE = "/tmp/log/passwall2.log"
-CACHE_PATH = "/tmp/etc/passwall2_tmp"
-TMP_PATH = "/tmp/etc/" .. appname
+TMP_PATH = "/tmp/etc/passwall2"
+CACHE_PATH = TMP_PATH .. "_tmp"
TMP_IFACE_PATH = TMP_PATH .. "/iface"
local lang = uci:get("luci", "main", "lang") or "auto"
@@ -62,7 +63,85 @@ function is_old_uci()
return sys.call("grep -E 'require[ \t]*\"uci\"' /usr/lib/lua/luci/model/uci.lua >/dev/null 2>&1") == 0
end
+function uci_del(config, section, option)
+ if option then
+ return uci:delete(config, section, option)
+ else
+ return uci:delete(config, section)
+ end
+end
+
+function uci_get(config, section, option)
+ if not section then
+ return uci:get_all(config)
+ elseif option then
+ return uci:get(config, section, option) or nil
+ else
+ return uci:get_all(config, section)
+ end
+end
+
+function uci_set(config, section, option, value)
+ if type(value) == "number" then
+ value = value .. ""
+ end
+ if #value > 0 then
+ if option then
+ if type(value) == "table" then
+ return uci:set_list(config, section, option, value)
+ else
+ return uci:set(config, section, option, value)
+ end
+ else
+ return uci:set(config, section, value)
+ end
+ else
+ return uci_del(config, section, option)
+ end
+end
+
+function uci_del_c(section, option)
+ return uci_del(c_config, section, option)
+end
+
+function uci_foreach_c(stype, func)
+ uci:foreach(c_config, stype, func)
+end
+
+function uci_get_c(section, option)
+ return uci_get(c_config, section, option)
+end
+
+function uci_set_c(section, option, value)
+ return uci_set(c_config, section, option, value)
+end
+
+function uci_save_c(commit, apply)
+ return uci_save(uci, c_config, commit, apply)
+end
+
+function uci_del_s(section, option)
+ return uci_del(s_config, section, option)
+end
+
+function uci_foreach_s(stype, func)
+ uci:foreach(s_config, stype, func)
+end
+
+function uci_get_s(section, option)
+ return uci_get(s_config, section, option)
+end
+
+function uci_set_s(section, option, value)
+ return uci_set(s_config, section, option, value)
+end
+
+function uci_save_s(commit, apply)
+ return uci_save(uci, s_config, commit, apply)
+end
+
function uci_save(cursor, config, commit, apply)
+ if not cursor then cursor = uci end
if is_old_uci() then
cursor:save(config)
if commit then
@@ -236,7 +315,7 @@ function curl_direct(url, file, args)
end
function curl_auto(url, file, args)
- local localhost_proxy = uci:get(c_config, "@global[0]", "localhost_proxy") or "1"
+ local localhost_proxy = uci_get_c("@global[0]", "localhost_proxy") or "1"
if localhost_proxy == "1" then
return curl_base(url, file, args)
else
@@ -495,7 +574,7 @@ function get_node_name(node_id)
if type(node_id) == "table" then
e = node_id
else
- e = uci:get_all(c_config, node_id)
+ e = uci_get_c(node_id)
end
if e then
if e.type and e.remarks then
@@ -511,7 +590,7 @@ function get_node_name(node_id)
end
function get_valid_nodes()
- local show_node_info = uci:get(c_config, "@global_other[0]", "show_node_info") or "0"
+ local show_node_info = uci_get_c("@global_other[0]", "show_node_info") or "0"
local nodes = {}
local default_nodes = {}
local other_nodes = {}
@@ -696,7 +775,7 @@ function chmod_755(file)
end
function get_customed_path(e)
- return uci:get(c_config, "@global_app[0]", e .. "_file")
+ return uci_get_c("@global_app[0]", e .. "_file")
end
function finded_com(e)
@@ -755,7 +834,7 @@ end
function get_app_path(app_name)
if com[app_name] then
local def_path = com[app_name].default_path
- local path = uci:get(c_config, "@global_app[0]", app_name:gsub("%-","_") .. "_file")
+ local path = uci_get_c("@global_app[0]", app_name:gsub("%-","_") .. "_file")
path = path and (#path>0 and path or def_path) or def_path
return path
end
@@ -1714,7 +1793,7 @@ end
function get_socks_backup_nodes(id)
id = trim(id)
if id == "" then return "" end
- local socks = uci:get_all(c_config, id)
+ local socks = uci_get_c(id)
local nodes
if socks.backup_node_add_mode and socks.backup_node_add_mode == "batch" then
local node = {}
@@ -1735,7 +1814,7 @@ function get_socks_backup_nodes(id)
end
function get_core(field, candidates)
- local v = uci:get(c_config, "@global_subscribe[0]", field)
+ local v = uci_get_c("@global_subscribe[0]", field)
if v and v ~= "" then
for _, c in ipairs(candidates) do
if c[2] == v and c[1] then
diff --git a/luci-app-passwall2/luasrc/passwall2/server_app.lua b/luci-app-passwall2/luasrc/passwall2/server_app.lua
index dee45ac7..1135f6b8 100644
--- a/luci-app-passwall2/luasrc/passwall2/server_app.lua
+++ b/luci-app-passwall2/luasrc/passwall2/server_app.lua
@@ -84,7 +84,7 @@ local function gen_include()
end
local function start()
- local enabled = tonumber(uci:get(CONFIG, "@global[0]", "enable") or 0)
+ local enabled = tonumber(api.uci_get_s("@global[0]", "enable") or 0)
if enabled == nil or enabled == 0 then
return
end
@@ -102,7 +102,7 @@ local function start()
nft_file:write('flush chain inet fw4 PSW2-SERVER\n')
nft_file:write('insert rule inet fw4 input position 0 jump PSW2-SERVER comment "PSW2-SERVER"\n')
end
- uci:foreach(CONFIG, "server", function(server)
+ api.uci_foreach_s("server", function(server)
local id = server[".name"]
local enable = server.enable
if enable and tonumber(enable) == 1 then
diff --git a/luci-app-passwall2/luasrc/passwall2/util_hysteria2.lua b/luci-app-passwall2/luasrc/passwall2/util_hysteria2.lua
index 24dcb776..9811daab 100644
--- a/luci-app-passwall2/luasrc/passwall2/util_hysteria2.lua
+++ b/luci-app-passwall2/luasrc/passwall2/util_hysteria2.lua
@@ -1,15 +1,13 @@
module("luci.passwall2.util_hysteria2", package.seeall)
local api = require "luci.passwall2.api"
-local uci = api.uci
local jsonc = api.jsonc
function gen_config_server(node)
- local users = node.users or {}
local users = nil
if node.users and #node.users > 0 then
users = {}
for i, v in ipairs(node.users) do
- local user = uci:get_all(api.s_config, v) or {}
+ local user = api.uci_get_s(v) or {}
if user[".type"] == "user" then
users[user.username] = user.password
end
@@ -74,7 +72,7 @@ function gen_config(var)
print("node Cannot be empty!")
return
end
- local node = uci:get_all(api.c_config, node_id)
+ local node = api.uci_get_c(node_id)
local local_socks_address = var["local_socks_address"] or "0.0.0.0"
local local_socks_port = var["local_socks_port"]
local local_socks_username = var["local_socks_username"]
diff --git a/luci-app-passwall2/luasrc/passwall2/util_naiveproxy.lua b/luci-app-passwall2/luasrc/passwall2/util_naiveproxy.lua
index 4839f53c..c4f62638 100644
--- a/luci-app-passwall2/luasrc/passwall2/util_naiveproxy.lua
+++ b/luci-app-passwall2/luasrc/passwall2/util_naiveproxy.lua
@@ -1,6 +1,5 @@
module("luci.passwall2.util_navieproxy", package.seeall)
local api = require "luci.passwall2.api"
-local uci = api.uci
local jsonc = api.jsonc
function gen_config(var)
@@ -9,7 +8,7 @@ function gen_config(var)
print("node Cannot be empty!")
return
end
- local node = uci:get_all(api.c_config, node_id)
+ local node = api.uci_get_c(node_id)
local run_type = var["run_type"]
local local_addr = var["local_addr"]
local local_port = var["local_port"]
diff --git a/luci-app-passwall2/luasrc/passwall2/util_shadowsocks.lua b/luci-app-passwall2/luasrc/passwall2/util_shadowsocks.lua
index a0ac3022..83bafd91 100644
--- a/luci-app-passwall2/luasrc/passwall2/util_shadowsocks.lua
+++ b/luci-app-passwall2/luasrc/passwall2/util_shadowsocks.lua
@@ -1,12 +1,11 @@
module("luci.passwall2.util_shadowsocks", package.seeall)
local api = require "luci.passwall2.api"
-local uci = api.uci
local jsonc = api.jsonc
function gen_config_server(node)
local user = nil
if node.user then
- user = uci:get_all(api.s_config, node.user)
+ user = api.uci_get_s(node.user)
end
local config = {}
@@ -41,7 +40,7 @@ function gen_config(var)
print("node Cannot be empty!")
return
end
- local node = uci:get_all(api.c_config, node_id)
+ local node = api.uci_get_c(node_id)
local server_host = var["server_host"] or (node.address or ""):lower()
local server_port = var["server_port"] or node.port
local local_addr = var["local_addr"]
diff --git a/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua b/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua
index 5d9c015a..1719ea4e 100644
--- a/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua
+++ b/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua
@@ -1,16 +1,14 @@
module("luci.passwall2.util_sing-box", package.seeall)
local api = require "luci.passwall2.api"
-local uci = api.uci
local sys = api.sys
local jsonc = api.jsonc
-local appname = api.appname
local fs = api.fs
local CACHE_PATH = api.CACHE_PATH
local split = api.split
local ech_domain = {}
local local_version = api.get_app_version("sing-box"):match("[^v]+")
-local version_ge_1_13_0 = api.compare_versions(local_version, ">=", "1.13.0")
+local version_ge_1_14_0 = api.compare_versions(local_version, ">=", "1.14.0")
local GLOBAL = {
DNS_SERVER = {}
@@ -23,7 +21,7 @@ local GEO_VAR = {
IP_PATH = nil,
SITE_TAGS = {},
IP_TAGS = {},
- TO_SRS_PATH = "/tmp/etc/" .. appname .."_tmp/singbox_srss/"
+ TO_SRS_PATH = CACHE_PATH .. "/singbox_srss/"
}
function check_geoview()
@@ -34,7 +32,7 @@ function check_geoview()
if GEO_VAR.OK == 0 then
api.log(0, "!!! Note: Geo rules cannot be used if the Geoview component is missing or the version is too low.")
else
- GEO_VAR.DIR = GEO_VAR.DIR or (uci:get(api.c_config, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"):match("^(.*)/")
+ GEO_VAR.DIR = GEO_VAR.DIR or (api.uci_get_c("@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"):match("^(.*)/")
GEO_VAR.SITE_PATH = GEO_VAR.SITE_PATH or (GEO_VAR.DIR .. "/geosite.dat")
GEO_VAR.IP_PATH = GEO_VAR.IP_PATH or (GEO_VAR.DIR .. "/geoip.dat")
if not fs.access(GEO_VAR.TO_SRS_PATH) then
@@ -139,8 +137,7 @@ function gen_outbound(flag, node, tag, proxy_table)
config_file = string.format("%s_%s_%s_%s.json", flag, tag, node_id, new_port)
end
if run_socks_instance then
- sys.call(string.format('/usr/share/%s/app.sh run_socks "%s"> /dev/null',
- appname,
+ sys.call(string.format('/usr/share/passwall2/app.sh run_socks "%s"> /dev/null',
string.format("flag=%s node=%s bind=%s socks_port=%s config_file=%s relay_port=%s",
new_port, --flag
node_id, --node
@@ -794,7 +791,7 @@ function gen_config_server(node)
if node.users and #node.users > 0 then
users = {}
for i, v in ipairs(node.users) do
- local user = uci:get_all(api.s_config, v) or {}
+ local user = api.uci_get_s(v) or {}
if user[".type"] == "user" then
local u = {}
if node.protocol == "mixed" or node.protocol == "socks" or node.protocol == "http" or node.protocol == "naive" then
@@ -1030,7 +1027,7 @@ function gen_config_server(node)
}
sys.call(string.format("mkdir -p %s && touch %s/%s", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.outbound_node_iface))
else
- local outbound_node_t = uci:get_all(api.c_config, node.outbound_node)
+ local outbound_node_t = api.uci_get_c(node.outbound_node)
if node.outbound_node == "_socks" or node.outbound_node == "_http" then
outbound_node_t = {
type = node.type,
@@ -1132,7 +1129,7 @@ function gen_config(var)
local CACHE_TEXT_FILE = CACHE_PATH .. "/cache_" .. flag .. ".txt"
- local singbox_settings = uci:get_all(api.c_config, "@global_singbox[0]") or {}
+ local singbox_settings = api.uci_get_c("@global_singbox[0]") or {}
local route = {
rules = {}
@@ -1195,7 +1192,7 @@ function gen_config(var)
local node = nil
if node_id then
- node = uci:get_all(api.c_config, node_id)
+ node = api.uci_get_c(node_id)
end
if local_socks_port then
@@ -1290,7 +1287,7 @@ function gen_config(var)
function get_node_by_id(node_id)
if not node_id or node_id == "" or node_id == "nil" then return nil end
- local section = uci:get_all(api.c_config, node_id) or {}
+ local section = api.uci_get_c(node_id) or {}
if section[".type"] == "socks" then
local result = {
[".name"] = node_id,
@@ -1569,7 +1566,7 @@ function gen_config(var)
end
--shunt rule
- uci:foreach(api.c_config, "shunt_rules", function(e)
+ api.uci_foreach_c("shunt_rules", function(e)
if node["shunt_group"] ~= e.group then
return
end
@@ -1835,16 +1832,16 @@ function gen_config(var)
if dns_listen_port then
local dns_host = ""
if flag == "global" then
- dns_host = uci:get(api.c_config, "@global[0]", "dns_hosts") or ""
+ dns_host = api.uci_get_c("@global[0]", "dns_hosts") or ""
else
flag = flag:gsub("acl_", "")
- local dns_hosts_mode = uci:get(api.c_config, flag, "dns_hosts_mode") or "default"
+ local dns_hosts_mode = api.uci_get_c(flag, "dns_hosts_mode") or "default"
if dns_hosts_mode == "default" then
- dns_host = uci:get(api.c_config, "@global[0]", "dns_hosts") or ""
+ dns_host = api.uci_get_c("@global[0]", "dns_hosts") or ""
elseif dns_hosts_mode == "disable" then
dns_host = ""
elseif dns_hosts_mode == "custom" then
- dns_host = uci:get(api.c_config, flag, "dns_hosts") or ""
+ dns_host = api.uci_get_c(flag, "dns_hosts") or ""
end
end
if #dns_host > 0 then
@@ -1982,7 +1979,12 @@ function gen_config(var)
else default_dns_flag = "direct"
end
dns.final = default_dns_flag
- dns.strategy = default_dns_flag == "remote" and remote_strategy or direct_strategy
+ -- Single-stack (ipv4_only / ipv6_only) is enforced per-domain via the
+ -- query_type / reject rules generated below. The global dns.strategy applies
+ -- to every DNS server that does not set its own query_strategy, so keep it
+ -- dual-stack; otherwise a single-stack choice on one path would also force the
+ -- other path (e.g. direct / CN domains) into single-stack. See issue #1220.
+ dns.strategy = "prefer_ipv6"
-- DNS in order of shunt
if dns_domain_rules and #dns_domain_rules > 0 then
diff --git a/luci-app-passwall2/luasrc/passwall2/util_xray.lua b/luci-app-passwall2/luasrc/passwall2/util_xray.lua
index 896fa1fe..ebe68a89 100644
--- a/luci-app-passwall2/luasrc/passwall2/util_xray.lua
+++ b/luci-app-passwall2/luasrc/passwall2/util_xray.lua
@@ -1,9 +1,7 @@
module("luci.passwall2.util_xray", package.seeall)
local api = require "luci.passwall2.api"
-local uci = api.uci
local sys = api.sys
local jsonc = api.jsonc
-local appname = api.appname
local fs = api.fs
local CACHE_PATH = api.CACHE_PATH
@@ -17,7 +15,7 @@ local xray_version = api.get_app_version("xray")
local xray_min_version = "26.3.27"
local function get_domain_excluded()
- local path = string.format("/usr/share/%s/domains_excluded", appname)
+ local path = "/usr/share/passwall2/domains_excluded"
local content = fs.readfile(path)
if not content then return nil end
local hosts = {}
@@ -79,8 +77,7 @@ function gen_outbound(flag, node, tag, proxy_table)
config_file = string.format("%s_%s_%s_%s.json", flag, tag, node_id, new_port)
end
if run_socks_instance then
- sys.call(string.format('/usr/share/%s/app.sh run_socks "%s"> /dev/null',
- appname,
+ sys.call(string.format('/usr/share/passwall2/app.sh run_socks "%s"> /dev/null',
string.format("flag=%s node=%s bind=%s socks_port=%s config_file=%s relay_port=%s",
new_port, --flag
node_id, --node
@@ -501,7 +498,7 @@ function gen_config_server(node)
if node.users and #node.users > 0 then
users = {}
for i, v in ipairs(node.users) do
- local user = uci:get_all(api.s_config, v) or {}
+ local user = api.uci_get_s(v) or {}
if user[".type"] == "user" then
local u = {}
if node.protocol == "socks" or node.protocol == "http" then
@@ -633,7 +630,7 @@ function gen_config_server(node)
}
sys.call(string.format("mkdir -p %s && touch %s/%s", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.outbound_node_iface))
else
- local outbound_node_t = uci:get_all(api.c_config, node.outbound_node)
+ local outbound_node_t = api.uci_get_c(node.outbound_node)
if node.outbound_node == "_socks" or node.outbound_node == "_http" then
outbound_node_t = {
type = node.type,
@@ -906,7 +903,7 @@ function gen_config(var)
local CACHE_TEXT_FILE = CACHE_PATH .. "/cache_" .. flag .. ".txt"
- local xray_settings = uci:get_all(api.c_config, "@global_xray[0]") or {}
+ local xray_settings = api.uci_get_c("@global_xray[0]") or {}
if xray_settings.fragment == "1" then
local lengths, delays = {}, {}
@@ -931,7 +928,7 @@ function gen_config(var)
if xray_settings.noise == "1" then
local noises = {}
- uci:foreach(api.c_config, "xray_noise_packets", function(n)
+ api.uci_foreach_c("xray_noise_packets", function(n)
if n.enabled == "1" then
local noise = {
rand = (n.type == "rand" and n.packet) and (n.packet:find("-", 1, true) and n.packet or tonumber(n.packet)) or nil,
@@ -948,7 +945,7 @@ function gen_config(var)
} or nil
end
- local node = node_id and uci:get_all(api.c_config, node_id) or nil
+ local node = node_id and api.uci_get_c(node_id) or nil
local balancers = {}
local rules = {}
@@ -1000,7 +997,7 @@ function gen_config(var)
function get_node_by_id(node_id)
if not node_id or node_id == "" or node_id == "nil" then return nil end
- local section = uci:get_all(api.c_config, node_id) or {}
+ local section = api.uci_get_c(node_id) or {}
if section[".type"] == "socks" then
local result = {
[".name"] = node_id,
@@ -1394,7 +1391,7 @@ function gen_config(var)
end
--shunt rule
- uci:foreach(api.c_config, "shunt_rules", function(e)
+ api.uci_foreach_c("shunt_rules", function(e)
if node["shunt_group"] ~= e.group then
return
end
@@ -1590,16 +1587,16 @@ function gen_config(var)
local dns_host = ""
if flag == "global" then
- dns_host = uci:get(api.c_config, "@global[0]", "dns_hosts") or ""
+ dns_host = api.uci_get_c("@global[0]", "dns_hosts") or ""
else
flag = flag:gsub("acl_", "")
- local dns_hosts_mode = uci:get(api.c_config, flag, "dns_hosts_mode") or "default"
+ local dns_hosts_mode = api.uci_get_c(flag, "dns_hosts_mode") or "default"
if dns_hosts_mode == "default" then
- dns_host = uci:get(api.c_config, "@global[0]", "dns_hosts") or ""
+ dns_host = api.uci_get_c("@global[0]", "dns_hosts") or ""
elseif dns_hosts_mode == "disable" then
dns_host = ""
elseif dns_hosts_mode == "custom" then
- dns_host = uci:get(api.c_config, flag, "dns_hosts") or ""
+ dns_host = api.uci_get_c(flag, "dns_hosts") or ""
end
end
if #dns_host > 0 then
@@ -1977,12 +1974,12 @@ function gen_config(var)
if inbounds or outbounds then
local config = {
env = (function()
- local asset_location = uci:get(api.c_config, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"
+ local asset_location = api.uci_get_c("@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"
return { XRAY_LOCATION_ASSET = asset_location }
end)(),
log = {
- --access = string.format("/tmp/etc/%s/%s_access.log", appname, "global"),
- --error = string.format("/tmp/etc/%s/%s_error.log", appname, "global"),
+ --access = string.format("%s/%s_access.log", TMP_PATH, "global"),
+ --error = string.format("%s/%s_error.log", TMP_PATH, "global"),
--dnsLog = true,
loglevel = get_log_level(loglevel)
},
diff --git a/luci-app-passwall2/root/usr/share/passwall2/haproxy.lua b/luci-app-passwall2/root/usr/share/passwall2/haproxy.lua
index eb7d0f8c..aa525d37 100644
--- a/luci-app-passwall2/root/usr/share/passwall2/haproxy.lua
+++ b/luci-app-passwall2/root/usr/share/passwall2/haproxy.lua
@@ -3,7 +3,6 @@
local api = require ("luci.passwall2.api")
local appname = api.appname
local fs = api.fs
-local jsonc = api.jsonc
local uci = api.uci
local sys = api.sys
@@ -21,11 +20,11 @@ local haproxy_conf = var["-conf"]
local haproxy_dns = "127.0.0.1"
local cpu_thread = sys.exec('echo -n $(cat /proc/cpuinfo | grep "processor" | wc -l)') or "1"
-local health_check_type = uci:get(api.c_config, "@global_haproxy[0]", "health_check_type") or "tcp"
-local health_check_inter = uci:get(api.c_config, "@global_haproxy[0]", "health_check_inter") or "20"
-local balancingStrategy = uci:get(api.c_config, "@global_haproxy[0]", "balancingStrategy") or "roundrobin"
-local console_port = uci:get(api.c_config, "@global_haproxy[0]", "console_port")
-local bind_local = uci:get(api.c_config, "@global_haproxy[0]", "bind_local") or "0"
+local health_check_type = api.uci_get_c("@global_haproxy[0]", "health_check_type") or "tcp"
+local health_check_inter = api.uci_get_c("@global_haproxy[0]", "health_check_inter") or "20"
+local balancingStrategy = api.uci_get_c("@global_haproxy[0]", "balancingStrategy") or "roundrobin"
+local console_port = api.uci_get_c("@global_haproxy[0]", "console_port")
+local bind_local = api.uci_get_c("@global_haproxy[0]", "bind_local") or "0"
local bind_address = "0.0.0.0"
if bind_local == "1" then bind_address = "127.0.0.1" end
@@ -92,14 +91,14 @@ f_out:write(haproxy_config)
local listens = {}
-uci:foreach(api.c_config, "haproxy_config", function(t)
+api.uci_foreach_c("haproxy_config", function(t)
if t.enabled == "1" then
local server_remark
local server_address
local server_port
local lbss = t.lbss
local listen_port = tonumber(t.haproxy_port) or 0
- local server_node = uci:get_all(api.c_config, lbss)
+ local server_node = api.uci_get_c(lbss)
local hop = (health_check_type == "script_logic") and (server_node.hysteria_hop or server_node.hysteria2_hop) or nil
hop = hop and hop:gsub(":", "-") or nil
if server_node and server_node.address and (server_node.port or hop) then
@@ -212,8 +211,8 @@ listen %s
end
-- Console config
-local console_user = uci:get(api.c_config, "@global_haproxy[0]", "console_user")
-local console_password = uci:get(api.c_config, "@global_haproxy[0]", "console_password")
+local console_user = api.uci_get_c("@global_haproxy[0]", "console_user")
+local console_password = api.uci_get_c("@global_haproxy[0]", "console_password")
local str = [[
listen console
bind 0.0.0.0:%s
@@ -229,7 +228,7 @@ f_out:close()
-- Built-in health check URL
if health_check_type == "script_logic" then
- local probeUrl = uci:get(api.c_config, "@global_haproxy[0]", "health_probe_url") or "https://www.google.com/generate_204"
+ local probeUrl = api.uci_get_c("@global_haproxy[0]", "health_probe_url") or "https://www.google.com/generate_204"
local f_url = io.open(haproxy_path .. "/Probe_URL", "w")
f_url:write(probeUrl)
f_url:close()
diff --git a/luci-app-passwall2/root/usr/share/passwall2/helper_dnsmasq.lua b/luci-app-passwall2/root/usr/share/passwall2/helper_dnsmasq.lua
index 719ee089..6b86f47b 100644
--- a/luci-app-passwall2/root/usr/share/passwall2/helper_dnsmasq.lua
+++ b/luci-app-passwall2/root/usr/share/passwall2/helper_dnsmasq.lua
@@ -1,6 +1,5 @@
local api = require "luci.passwall2.api"
-local appname = "passwall2"
-local uci = api.uci
+local c_config = api.c_config
local sys = api.sys
local jsonc = api.jsonc
local fs = api.fs
@@ -23,38 +22,38 @@ local function tinsert(table_name, val)
end
local function backup_servers()
- local DNSMASQ_DNS = uci:get("dhcp", "@dnsmasq[0]", "server")
+ local DNSMASQ_DNS = api.uci_get("dhcp", "@dnsmasq[0]", "server")
if DNSMASQ_DNS and #DNSMASQ_DNS > 0 then
- uci:set(api.c_config, "@global[0]", "dnsmasq_servers", DNSMASQ_DNS)
- api.uci_save(uci, appname, true)
+ api.uci_set_c("@global[0]", "dnsmasq_servers", DNSMASQ_DNS)
+ api.uci_save_c(true)
end
end
local function restore_servers()
local dns_table = {}
- local DNSMASQ_DNS = uci:get("dhcp", "@dnsmasq[0]", "server")
+ local DNSMASQ_DNS = api.uci_get("dhcp", "@dnsmasq[0]", "server")
if DNSMASQ_DNS and #DNSMASQ_DNS > 0 then
for k, v in ipairs(DNSMASQ_DNS) do
tinsert(dns_table, v)
end
end
- local OLD_SERVER = uci:get(api.c_config, "@global[0]", "dnsmasq_servers")
+ local OLD_SERVER = api.uci_get_c("@global[0]", "dnsmasq_servers")
if OLD_SERVER and #OLD_SERVER > 0 then
for k, v in ipairs(OLD_SERVER) do
tinsert(dns_table, v)
end
- uci:delete(api.c_config, "@global[0]", "dnsmasq_servers")
- api.uci_save(uci, appname, true)
+ api.uci_del_c("@global[0]", "dnsmasq_servers")
+ api.uci_save_c(true)
end
if dns_table and #dns_table > 0 then
- uci:set_list("dhcp", "@dnsmasq[0]", "server", dns_table)
- api.uci_save(uci, "dhcp", true)
+ api.uci_set("dhcp", "@dnsmasq[0]", "server", dns_table)
+ api.uci_save(nil, "dhcp", true)
end
end
function stretch()
- local dnsmasq_server = uci:get("dhcp", "@dnsmasq[0]", "server")
- local dnsmasq_noresolv = uci:get("dhcp", "@dnsmasq[0]", "noresolv")
+ local dnsmasq_server = api.uci_get("dhcp", "@dnsmasq[0]", "server")
+ local dnsmasq_noresolv = api.uci_get("dhcp", "@dnsmasq[0]", "noresolv")
local _flag
if dnsmasq_server and #dnsmasq_server > 0 then
for k, v in ipairs(dnsmasq_server) do
@@ -64,7 +63,7 @@ function stretch()
end
end
if not _flag and dnsmasq_noresolv == "1" then
- uci:delete("dhcp", "@dnsmasq[0]", "noresolv")
+ api.uci_del("dhcp", "@dnsmasq[0]", "noresolv")
local RESOLVFILE = "/tmp/resolv.conf.d/resolv.conf.auto"
local file = io.open(RESOLVFILE, "r")
if not file then
@@ -76,8 +75,8 @@ function stretch()
RESOLVFILE = "/tmp/resolv.conf.auto"
end
end
- uci:set("dhcp", "@dnsmasq[0]", "resolvfile", RESOLVFILE)
- api.uci_save(uci, "dhcp", true)
+ api.uci_set("dhcp", "@dnsmasq[0]", "resolvfile", RESOLVFILE)
+ api.uci_save(nil, "dhcp", true)
end
end
@@ -96,15 +95,15 @@ function logic_restart(var)
backup_servers()
--sys.call("sed -i '/list server/d' /etc/config/dhcp >/dev/null 2>&1")
local dns_table = {}
- local dnsmasq_server = uci:get("dhcp", "@dnsmasq[0]", "server")
+ local dnsmasq_server = api.uci_get("dhcp", "@dnsmasq[0]", "server")
if dnsmasq_server and #dnsmasq_server > 0 then
for k, v in ipairs(dnsmasq_server) do
if v:find("/") then
tinsert(dns_table, v)
end
end
- uci:set_list("dhcp", "@dnsmasq[0]", "server", dns_table)
- api.uci_save(uci, "dhcp", true)
+ api.uci_set("dhcp", "@dnsmasq[0]", "server", dns_table)
+ api.uci_save(nil, "dhcp", true)
end
sys.call("/etc/init.d/dnsmasq restart >/dev/null 2>&1")
restore_servers()
@@ -243,7 +242,7 @@ function add_rule(var)
end
local cache_text = ""
- local nodes_address_md5 = sys.exec("echo -n $(uci show passwall2 | grep '\\.address') | md5sum")
+ local nodes_address_md5 = sys.exec("echo -n $(uci show %s | grep '\\.address') | md5sum" % c_config)
local new_text = TMP_DNSMASQ_PATH .. DNSMASQ_CONF_FILE .. DEFAULT_DNS .. LOCAL_DNS .. TUN_DNS .. nodes_address_md5 .. NFTFLAG
if fs.access(CACHE_TEXT_FILE) then
for line in io.lines(CACHE_TEXT_FILE) do
@@ -268,7 +267,7 @@ function add_rule(var)
-- Always use domestic DNS to resolve node domain names
if true then
fwd_dns = LOCAL_DNS
- uci:foreach(api.c_config, "nodes", function(t)
+ api.uci_foreach_c("nodes", function(t)
local function process_address(address)
address = (address or ""):lower()
if address == "engage.cloudflareclient.com" then return end
@@ -326,7 +325,7 @@ function add_rule(var)
["return"] = "1"
})
--dhcp.leases to hostsMore actions
- local hosts = "/tmp/etc/" .. appname .. "_tmp/dhcp-hosts"
+ local hosts = api.CACHE_PATH .. "/dhcp-hosts"
sys.call("touch " .. hosts)
tinsert(conf_lines, "addn-hosts=" .. hosts)
else
diff --git a/luci-app-passwall2/root/usr/share/passwall2/rule_update.lua b/luci-app-passwall2/root/usr/share/passwall2/rule_update.lua
index 844f103b..04c157c7 100755
--- a/luci-app-passwall2/root/usr/share/passwall2/rule_update.lua
+++ b/luci-app-passwall2/root/usr/share/passwall2/rule_update.lua
@@ -1,12 +1,11 @@
#!/usr/bin/lua
local api = require "luci.passwall2.api"
-local name = api.appname
-local c_config = api.c_config
+local appname = api.appname
local fs = api.fs
local log = api.log
local sys = api.sys
-local uci = api.uci
+local uci, uci_get, uci_set, uci_del, uci_foreach, uci_save = api.uci, api.uci_get_c, api.uci_set_c, api.uci_del_c, api.uci_foreach_c, api.uci_save_c
local arg1 = arg[1]
local arg2 = arg[2]
@@ -16,9 +15,9 @@ local reboot = 0
local geoip_update = "0"
local geosite_update = "0"
-local geoip_url = uci:get(c_config, "@global_rules[0]", "geoip_url") or "https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip.dat"
-local geosite_url = uci:get(c_config, "@global_rules[0]", "geosite_url") or "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"
-local asset_location = uci:get(c_config, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"
+local geoip_url = uci_get("@global_rules[0]", "geoip_url") or "https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip.dat"
+local geosite_url = uci_get("@global_rules[0]", "geosite_url") or "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"
+local asset_location = uci_get("@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"
asset_location = asset_location:match("/$") and asset_location or (asset_location .. "/")
local backup_path = "/tmp/bak_v2ray/"
@@ -177,16 +176,16 @@ if arg2 then
end
end)
else
- geoip_update = uci:get(c_config, "@global_rules[0]", "geoip_update") or "1"
- geosite_update = uci:get(c_config, "@global_rules[0]", "geosite_update") or "1"
+ geoip_update = uci_get("@global_rules[0]", "geoip_update") or "1"
+ geosite_update = uci_get("@global_rules[0]", "geosite_update") or "1"
end
if geoip_update == "0" and geosite_update == "0" then
os.exit(0)
end
local function check_instance(action)
- local rule_lock = "/var/lock/" .. name .. "_rule_update.lock"
- local sub_lock = "/var/lock/" .. name .. "_subscribe.lock"
+ local rule_lock = "/var/lock/" .. appname .. "_rule_update.lock"
+ local sub_lock = "/var/lock/" .. appname .. "_subscribe.lock"
if action == "start" then
math.randomseed(os.time() + math.floor(os.clock() * 1000))
@@ -233,20 +232,20 @@ if geosite_update == "1" then
remove_tmp_geofile("geosite")
end
-uci:set(c_config, "@global_rules[0]", "geoip_update", geoip_update)
-uci:set(c_config, "@global_rules[0]", "geosite_update", geosite_update)
-api.uci_save(uci, c_config, true)
+uci_set("@global_rules[0]", "geoip_update", geoip_update)
+uci_set("@global_rules[0]", "geosite_update", geosite_update)
+uci_save(true)
if reboot == 1 then
if arg3 == "cron" then
- if not fs.access("/var/lock/" .. name .. ".lock") then
- sys.call("touch /tmp/lock/" .. name .. "_cron.lock")
+ if not fs.access("/var/lock/" .. appname .. ".lock") then
+ sys.call("touch /tmp/lock/" .. appname .. "_cron.lock")
end
end
log(1, api.i18n.translate("Restart the service and apply the new rules."))
- uci:set(c_config, "@global[0]", "flush_set", "1")
- api.uci_save(uci, c_config, true, true)
+ uci_set("@global[0]", "flush_set", "1")
+ uci_save(true, true)
end
log(0, api.i18n.translate("The rules have been updated..."))
diff --git a/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua b/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua
index a3cc1622..c4f657b8 100755
--- a/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua
+++ b/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua
@@ -7,23 +7,22 @@ require 'luci.util'
require 'luci.jsonc'
require 'luci.sys'
local api = require "luci.passwall2.api"
-local appname = api.appname
local c_config = api.c_config
-local datatypes = require "luci.cbi.datatypes"
+
+local datatypes = api.datatypes
+local split = api.split
+local base64Decode = api.base64Decode
+local jsonParse, jsonStringify = api.jsonc.parse, api.jsonc.stringify
+local UrlEncode, UrlDecode = api.UrlEncode, api.UrlDecode
+local fs = api.fs
+local log = api.log
+local i18n = api.i18n
+local uci, uci_get, uci_set, uci_del, uci_foreach, uci_save = api.uci, api.uci_get_c, api.uci_set_c, api.uci_del_c, api.uci_foreach_c, api.uci_save_c
-- these global functions are accessed all the time by the event handler
-- so caching them is worth the effort
local tinsert = table.insert
local ssub, slen, schar, sbyte, sformat, sgsub = string.sub, string.len, string.char, string.byte, string.format, string.gsub
-local split = api.split
-local jsonParse, jsonStringify = luci.jsonc.parse, luci.jsonc.stringify
-local base64Decode = api.base64Decode
-local UrlEncode = api.UrlEncode
-local UrlDecode = api.UrlDecode
-local uci = api.uci
-local fs = api.fs
-local log = api.log
-local i18n = api.i18n
local lyaml = require "lyaml"
local has_ss_rust = api.is_finded("sslocal")
@@ -32,9 +31,9 @@ local has_singbox = api.finded_com("sing-box")
local has_xray = api.finded_com("xray")
local has_hysteria2 = api.finded_com("hysteria")
local DEFAULT_ALLOWINSECURE = true
-local DEFAULT_FILTER_KEYWORD_MODE = uci:get(c_config, "@global_subscribe[0]", "filter_keyword_mode") or "0"
-local DEFAULT_FILTER_KEYWORD_DISCARD_LIST = uci:get(c_config, "@global_subscribe[0]", "filter_discard_list") or {}
-local DEFAULT_FILTER_KEYWORD_KEEP_LIST = uci:get(c_config, "@global_subscribe[0]", "filter_keep_list") or {}
+local DEFAULT_FILTER_KEYWORD_MODE = uci_get("@global_subscribe[0]", "filter_keyword_mode") or "0"
+local DEFAULT_FILTER_KEYWORD_DISCARD_LIST = uci_get("@global_subscribe[0]", "filter_discard_list") or {}
+local DEFAULT_FILTER_KEYWORD_KEEP_LIST = uci_get("@global_subscribe[0]", "filter_keep_list") or {}
-- Nodes should be retrieved using the core type (if not set on the node subscription page, the default type will be used automatically).
local DEFAULT_SS_TYPE = api.get_core("ss_type", {{has_ss_rust,"shadowsocks-rust"},{has_singbox,"sing-box"},{has_xray,"xray"}})
local DEFAULT_TROJAN_TYPE = api.get_core("trojan_type", {{has_singbox,"sing-box"},{has_xray,"xray"}})
@@ -131,13 +130,13 @@ do
local szType = "@global[0]"
local option = "node"
- local node_id = uci:get(c_config, szType, option)
+ local node_id = uci_get(szType, option)
CONFIG[#CONFIG + 1] = {
log = true,
remarks = i18n.translatef("Node"),
- currentNode = node_id and uci:get_all(c_config, node_id) or nil,
+ currentNode = node_id and uci_get(node_id) or nil,
set = function(o, server)
- uci:set(c_config, szType, option, server)
+ uci_set(szType, option, server)
o.newNodeId = server
end
}
@@ -146,7 +145,7 @@ do
if true then
local i = 0
local option = "node"
- uci:foreach(c_config, "socks", function(t)
+ uci_foreach("socks", function(t)
i = i + 1
local id = t[".name"]
local node_id = t[option]
@@ -154,14 +153,14 @@ do
log = true,
id = id,
remarks = i18n.translatef("Socks node list [%s]", i),
- currentNode = node_id and uci:get_all(c_config, node_id) or nil,
+ currentNode = node_id and uci_get(node_id) or nil,
set = function(o, server)
if not server or server == "" then
if #nodes_table > 0 then
server = nodes_table[1][".name"]
end
end
- uci:set(c_config, t[".name"], option, server)
+ uci_set(t[".name"], option, server)
o.newNodeId = server
end
}
@@ -171,7 +170,7 @@ do
local newNodes = {}
for k, asb_node_id in ipairs(t.autoswitch_backup_node) do
if asb_node_id then
- local currentNode = uci:get_all(c_config, asb_node_id) or {}
+ local currentNode = uci_get(asb_node_id) or {}
if currentNode[".type"] == "nodes" then
currentNodes[#currentNodes + 1] = {
log = true,
@@ -193,7 +192,7 @@ do
set = function(o, newNodes)
if o then
if not newNodes then newNodes = o.newNodes end
- uci:set_list(c_config, id, "autoswitch_backup_node", newNodes or {})
+ uci_set(id, "autoswitch_backup_node", newNodes or {})
end
end
}
@@ -209,25 +208,25 @@ do
local ip, port = str:match("^([%d%.]+):(%d+)$")
return ip and datatypes.ipaddr(ip) and tonumber(port) and tonumber(port) <= 65535
end
- uci:foreach(c_config, "haproxy_config", function(t)
+ uci_foreach("haproxy_config", function(t)
i = i + 1
local node_id = t[option]
CONFIG[#CONFIG + 1] = {
log = true,
id = t[".name"],
remarks = i18n.translatef("HAProxy node list [%s]", i),
- currentNode = node_id and uci:get_all(c_config, node_id) or nil,
+ currentNode = node_id and uci_get(node_id) or nil,
set = function(o, server)
-- Modify the LBS value only if it is not in IP:Port format.
if not is_ip_port(t[option]) then
- uci:set(c_config, t[".name"], option, server)
+ uci_set(t[".name"], option, server)
o.newNodeId = server
end
end,
delete = function(o)
-- Deletion is only performed if the current LBS value is not in IP:port format.
if not is_ip_port(t[option]) then
- uci:delete(c_config, t[".name"])
+ uci_del(t[".name"])
end
end
}
@@ -236,7 +235,7 @@ do
if true then
local i = 0
- uci:foreach(c_config, "acl_rule", function(t)
+ uci_foreach("acl_rule", function(t)
i = i + 1
local option = "node"
local node_id = t[option]
@@ -244,20 +243,20 @@ do
log = true,
id = t[".name"],
remarks = i18n.translatef("ACL list [%s]", i),
- currentNode = node_id and uci:get_all(c_config, node_id) or nil,
+ currentNode = node_id and uci_get(node_id) or nil,
set = function(o, server)
- uci:set(c_config, t[".name"], option, server)
+ uci_set(t[".name"], option, server)
o.newNodeId = server
end
}
end)
end
- uci:foreach(c_config, "nodes", function(node)
+ uci_foreach("nodes", function(node)
local node_id = node[".name"]
if node.protocol and node.protocol == '_shunt' then
local rules = {}
- uci:foreach(c_config, "shunt_rules", function(e)
+ uci_foreach("shunt_rules", function(e)
if e[".name"] and e.remarks then
table.insert(rules, e)
table.insert(rules, {
@@ -278,7 +277,7 @@ do
for k, e in pairs(rules) do
local _node_id = node[e[".name"]] or nil
if _node_id then
- local section = uci:get_all(c_config, _node_id) or {}
+ local section = uci_get(_node_id) or {}
if section[".type"] == "nodes" then
CONFIG[#CONFIG + 1] = {
log = false,
@@ -286,7 +285,7 @@ do
remarks = i18n.translatef("Shunt [%s] node", e.remarks),
set = function(o, server)
if not server then server = "" end
- uci:set(c_config, node_id, e[".name"], server)
+ uci_set(node_id, e[".name"], server)
o.newNodeId = server
end
}
@@ -303,7 +302,7 @@ do
log = true,
node = b_node_id,
currentNode = (function()
- local section = uci:get_all(c_config, b_node_id) or {}
+ local section = uci_get(b_node_id) or {}
if section[".type"] == "socks" then
return { Socks = b_node_id }
end
@@ -325,15 +324,15 @@ do
set = function(o, newNodes)
if o then
if not newNodes then newNodes = o.newNodes end
- uci:set_list(c_config, node_id, "balancing_node", newNodes or {})
+ uci_set(node_id, "balancing_node", newNodes or {})
end
end
}
-- Backup Node
- local currentNode = uci:get_all(c_config, node_id) or nil
+ local currentNode = uci_get(node_id) or nil
if currentNode and currentNode.fallback_node then
- local section = uci:get_all(c_config, currentNode.fallback_node) or {}
+ local section = uci_get(currentNode.fallback_node) or {}
if section[".type"] == "nodes" then
CONFIG[#CONFIG + 1] = {
log = true,
@@ -341,11 +340,11 @@ do
remarks = i18n.translatef("Xray Load Balancing node [%s] backup node", node_id),
currentNode = section,
set = function(o, server)
- uci:set(c_config, node_id, "fallback_node", server)
+ uci_set(node_id, "fallback_node", server)
o.newNodeId = server
end,
delete = function(o)
- uci:delete(c_config, node_id, "fallback_node")
+ uci_del(node_id, "fallback_node")
end
}
end
@@ -360,7 +359,7 @@ do
log = true,
node = u_node_id,
currentNode = (function()
- local section = uci:get_all(c_config, u_node_id) or {}
+ local section = uci_get(u_node_id) or {}
if section[".type"] == "socks" then
return { Socks = u_node_id }
end
@@ -382,47 +381,47 @@ do
set = function(o, newNodes)
if o then
if not newNodes then newNodes = o.newNodes end
- uci:set_list(c_config, node_id, "urltest_node", newNodes or {})
+ uci_set(node_id, "urltest_node", newNodes or {})
end
end
}
else
-- Preproxy Node
- local currentNode = uci:get_all(c_config, node_id) or nil
+ local currentNode = uci_get(node_id) or nil
if currentNode and currentNode.preproxy_node then
- local section = uci:get_all(c_config, currentNode.preproxy_node) or {}
+ local section = uci_get(currentNode.preproxy_node) or {}
if section[".type"] == "nodes" then
CONFIG[#CONFIG + 1] = {
log = true,
id = node_id,
remarks = i18n.translatef("Node [%s] preproxy node", node_id),
- currentNode = uci:get_all(c_config, currentNode.preproxy_node) or nil,
+ currentNode = uci_get(currentNode.preproxy_node) or nil,
set = function(o, server)
- uci:set(c_config, node_id, "preproxy_node", server)
+ uci_set(node_id, "preproxy_node", server)
o.newNodeId = server
end,
delete = function(o)
- uci:delete(c_config, node_id, "preproxy_node")
+ uci_del(node_id, "preproxy_node")
end
}
end
end
-- Landing node
- local currentNode = uci:get_all(c_config, node_id) or nil
+ local currentNode = uci_get(node_id) or nil
if currentNode and currentNode.to_node then
- local section = uci:get_all(c_config, currentNode.to_node) or {}
+ local section = uci_get(currentNode.to_node) or {}
if section[".type"] == "nodes" then
CONFIG[#CONFIG + 1] = {
log = true,
id = node_id,
remarks = i18n.translatef("Node [%s] landing node", node_id),
- currentNode = uci:get_all(c_config, currentNode.to_node) or nil,
+ currentNode = uci_get(currentNode.to_node) or nil,
set = function(o, server)
- uci:set(c_config, node_id, "to_node", server)
+ uci_set(node_id, "to_node", server)
o.newNodeId = server
end,
delete = function(o)
- uci:delete(c_config, node_id, "to_node")
+ uci_del(node_id, "to_node")
end
}
end
@@ -2002,7 +2001,7 @@ local function curl(url, file, ua, mode, hwid)
end
function get_headers()
- local cache_file = "/tmp/etc/" .. appname .. "_tmp/sub_curl_headers"
+ local cache_file = CACHE_PATH .. "/sub_curl_headers"
if fs.access(cache_file) then
return luci.sys.exec("cat " .. cache_file)
end
@@ -2084,19 +2083,19 @@ local function truncate_nodes(group)
end
end
end
- uci:foreach(c_config, "nodes", function(node)
+ uci_foreach("nodes", function(node)
if node.add_mode == "2" then
if (not group) or (group:lower() == (node.group or ""):lower()) then
- uci:delete(c_config, node['.name'])
+ uci_del(node['.name'])
end
end
end)
- uci:foreach(c_config, "subscribe_list", function(o)
+ uci_foreach("subscribe_list", function(o)
if (not group) or (group:lower() == (o.remark or ""):lower()) then
- uci:delete(c_config, o['.name'], "md5")
+ uci_del(o['.name'], "md5")
end
end)
- api.uci_save(uci, c_config, true)
+ uci_save(true)
end
local function select_node(nodes, config, parentConfig)
@@ -2239,10 +2238,10 @@ local function update_node(manual)
end
if manual == 0 and next(group) then
- uci:foreach(c_config, "nodes", function(node)
+ uci_foreach("nodes", function(node)
-- Do not delete nodes if no new nodes are found or nodes were manually imported...
if node.add_mode == "2" and (node.group and group[node.group:lower()] == true) then
- uci:delete(c_config, node['.name'])
+ uci_del(node['.name'])
end
end)
end
@@ -2255,9 +2254,9 @@ local function update_node(manual)
-- Subscription Group Chain Agent
local function valid_chain_node(node)
if not node then return "" end
- local cp = uci:get(c_config, node, "chain_proxy") or ""
- local am = uci:get(c_config, node, "add_mode") or "0"
- chain_node_type = (cp == "" and am ~= "2") and (uci:get(c_config, node, "type") or "") or ""
+ local cp = uci_get(node, "chain_proxy") or ""
+ local am = uci_get(node, "add_mode") or "0"
+ chain_node_type = (cp == "" and am ~= "2") and (uci_get(node, "type") or "") or ""
if chain_node_type ~= "Xray" and chain_node_type ~= "sing-box" then
chain_node_type = ""
return ""
@@ -2278,39 +2277,39 @@ local function update_node(manual)
local cfgid = uci:section(c_config, "nodes", api.gen_random_char())
for kkk, vvv in pairs(vv) do
if type(vvv) == "table" and next(vvv) ~= nil then
- uci:set_list(c_config, cfgid, kkk, vvv)
+ uci_set(cfgid, kkk, vvv)
else
if kkk ~= "group" or vvv ~= "default" then
- uci:set(c_config, cfgid, kkk, vvv)
+ uci_set(cfgid, kkk, vvv)
end
-- Sing-Box Node Domain resolver
if kkk == "type" and (vvv == "Xray" or vvv == "sing-box") then
if domain_resolver then
- uci:set(c_config, cfgid, "domain_resolver", domain_resolver)
+ uci_set(cfgid, "domain_resolver", domain_resolver)
if domain_resolver_dns then
- uci:set(c_config, cfgid, "domain_resolver_dns", domain_resolver_dns)
+ uci_set(cfgid, "domain_resolver_dns", domain_resolver_dns)
elseif domain_resolver_dns_https then
- uci:set(c_config, cfgid, "domain_resolver_dns_https", domain_resolver_dns_https)
+ uci_set(cfgid, "domain_resolver_dns_https", domain_resolver_dns_https)
end
end
if domain_strategy then
if vvv == "sing-box" then
domain_strategy = (domain_strategy == "UseIPv4" and "ipv4_only") or (domain_strategy == "UseIPv6" and "ipv6_only") or domain_strategy
end
- uci:set(c_config, cfgid, "domain_strategy", domain_strategy)
+ uci_set(cfgid, "domain_strategy", domain_strategy)
end
end
-- Subscription Group Chain Agent
if chain_node_type ~= "" and kkk == "type" and (vvv == "Xray" or vvv == "sing-box") then
if preproxy_node_group ~="" then
- uci:set(c_config, cfgid, "chain_proxy", "1")
- uci:set(c_config, cfgid, "preproxy_node", preproxy_node_group)
+ uci_set(cfgid, "chain_proxy", "1")
+ uci_set(cfgid, "preproxy_node", preproxy_node_group)
elseif to_node_group ~= "" then
- uci:set(c_config, cfgid, "chain_proxy", "2")
- uci:set(c_config, cfgid, "to_node", to_node_group)
+ uci_set(cfgid, "chain_proxy", "2")
+ uci_set(cfgid, "to_node", to_node_group)
elseif outbound_iface_group ~= "" then
- uci:set(c_config, cfgid, "chain_proxy", "3")
- uci:set(c_config, cfgid, "outbound_iface", outbound_iface_group)
+ uci_set(cfgid, "chain_proxy", "3")
+ uci_set(cfgid, "outbound_iface", outbound_iface_group)
end
end
end
@@ -2321,16 +2320,16 @@ local function update_node(manual)
for cfgid, info in pairs(subscribe_info) do
for key, value in pairs(info) do
if value ~= "" then
- uci:set(c_config, cfgid, key, value)
+ uci_set(cfgid, key, value)
else
- uci:delete(c_config, cfgid, key)
+ uci_del(cfgid, key)
end
end
end
if next(CONFIG) then
local nodes = {}
- uci:foreach(c_config, "nodes", function(node)
+ uci_foreach("nodes", function(node)
nodes[#nodes + 1] = node
end)
@@ -2352,16 +2351,16 @@ local function update_node(manual)
end
end
- api.uci_save(uci, c_config, true)
+ uci_save(true)
if arg[3] == "cron" then
- if not fs.access("/var/lock/" .. appname .. ".lock") then
- luci.sys.call("touch /tmp/lock/" .. appname .. "_cron.lock")
+ if not fs.access(api.LOCK_PREFIX .. ".lock") then
+ luci.sys.call("touch %s_cron.lock" % api.LOCK_PREFIX)
end
end
if manual ~= 1 then
- luci.sys.call("/etc/init.d/" .. appname .. " restart > /dev/null 2>&1 &")
+ luci.sys.call("/etc/init.d/passwall2 restart > /dev/null 2>&1 &")
end
end
@@ -2485,10 +2484,10 @@ local execute = function()
local fail_list = {}
if arg[2] ~= "all" then
string.gsub(arg[2], '[^' .. "," .. ']+', function(w)
- subscribe_list[#subscribe_list + 1] = uci:get_all(c_config, w) or {}
+ subscribe_list[#subscribe_list + 1] = uci_get(w) or {}
end)
else
- uci:foreach(c_config, "subscribe_list", function(o)
+ uci_foreach("subscribe_list", function(o)
subscribe_list[#subscribe_list + 1] = o
end)
end
@@ -2531,7 +2530,7 @@ local execute = function()
log(1, i18n.translatef("Subscription: [%s] No changes, no update required.", remark))
else
parse_link(raw_data, "2", remark, value)
- uci:set(c_config, cfgid, "md5", new_md5)
+ uci_set(cfgid, "md5", new_md5)
end
else
fail_list[#fail_list + 1] = value
@@ -2554,8 +2553,8 @@ local execute = function()
end
local function check_instance(action)
- local sub_lock = "/var/lock/" .. appname .. "_subscribe.lock"
- local rule_lock = "/var/lock/" .. appname .. "_rule_update.lock"
+ local sub_lock = api.LOCK_PREFIX .. "_subscribe.lock"
+ local rule_lock = api.LOCK_PREFIX .. "_rule_update.lock"
if action == "start" then
math.randomseed(os.time() + math.floor(os.clock() * 1000))
diff --git a/netdata/Makefile b/netdata/Makefile
index 04313045..d56cec12 100644
--- a/netdata/Makefile
+++ b/netdata/Makefile
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=netdata
PKG_VERSION:=2.11.0
-PKG_RELEASE:=15
+PKG_RELEASE:=16
PKG_MAINTAINER:=Josef Schlehofer , Daniel Engberg
PKG_LICENSE:=GPL-3.0-or-later
@@ -83,6 +83,8 @@ CMAKE_OPTIONS += \
-DENABLE_PLUGIN_SYSTEMD_JOURNAL=Off \
-DENABLE_PLUGIN_SYSTEMD_UNITS=Off \
-DENABLE_PLUGIN_XENSTAT=Off \
+ -DSQLITE_USE_GIT=On \
+ -DUSE_MOLD=Off \
-DENABLE_WEBRTC=Off
define Package/netdata/conffiles