mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-09-11 19:05:11 +08:00
🔥 Sync 2026-08-14 20:56:42
This commit is contained in:
+2
-2
@@ -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
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.<br />If deselect all bands, then used default band modem config.'));
|
||||
var m = new form.Map('mmconfig', _('Modem Configuration'), _('Select bands for modem operation.' +
|
||||
+ '<br />' + 'Selected bands are a recommendation and do not guarantee that the modem will use exactly these bands.' +
|
||||
+ '<br /' + 'If all bands are deselected, the modems default band configuration will be used.'));
|
||||
|
||||
// add styles
|
||||
var style = document.createElement('style');
|
||||
@@ -76,7 +246,7 @@ return view.extend({
|
||||
operatorText = modemObj['3gpp']['operator-name'];
|
||||
}
|
||||
|
||||
html += '<div class="compact-line">';
|
||||
html += '<div class="compact-line cbi-rowstyle-2">';
|
||||
html += '<span class="modem-model">' + modelText + '</span>';
|
||||
|
||||
if (operatorText) {
|
||||
@@ -133,17 +303,22 @@ return view.extend({
|
||||
|
||||
// bands select
|
||||
if (modemObj && modemObj.generic && modemObj.generic['supported-bands']) {
|
||||
o = s.option(form.MultiValue, 'bands', _('Bands'));
|
||||
o = s.option(BandValue, 'bands', _('Bands'));
|
||||
|
||||
// get from modem supported-bands
|
||||
modemObj.generic['supported-bands'].forEach(function(band) {
|
||||
o.value(band, band);
|
||||
o.supportedBands = modemObj.generic['supported-bands'].slice();
|
||||
|
||||
var currentBands = modemObj.generic['current-bands'] || [];
|
||||
var currentSet = {};
|
||||
currentBands.forEach(function(band) {
|
||||
currentSet[band] = true;
|
||||
});
|
||||
|
||||
// Set current
|
||||
if (section.bands) {
|
||||
o.default = section.bands;
|
||||
}
|
||||
// Mark a band as active only when ModemManager reports it
|
||||
// in current-bands. Only supported bands are displayed.
|
||||
o.selectedBands = o.supportedBands.filter(function(band) {
|
||||
return !!currentSet[band];
|
||||
});
|
||||
o.rmempty = true;
|
||||
} else {
|
||||
o = s.option(form.Value, 'bands', _('Bands'));
|
||||
o.value('', _('Not Available'));
|
||||
@@ -174,10 +349,10 @@ return view.extend({
|
||||
getCSS: function() {
|
||||
return [
|
||||
'.modem-info-compact {',
|
||||
' background: #f8fafc;',
|
||||
' border: 1px solid #e2e8f0;',
|
||||
' border-radius: 6px;',
|
||||
' padding: 12px 16px;',
|
||||
' //padding: 12px 16px;',
|
||||
' padding: 2px 2px;',
|
||||
' margin: 15px 0;',
|
||||
'}',
|
||||
'',
|
||||
@@ -189,7 +364,7 @@ return view.extend({
|
||||
'',
|
||||
'.modem-model {',
|
||||
' font-weight: 600;',
|
||||
' color: #2d3748;',
|
||||
' //color: #2d3748;',
|
||||
' font-size: 1em;',
|
||||
'}',
|
||||
'',
|
||||
@@ -203,6 +378,74 @@ return view.extend({
|
||||
' font-size: 0.95em;',
|
||||
'}',
|
||||
'',
|
||||
'.mmconfig-bands {',
|
||||
' border: 1px solid #e2e8f0;',
|
||||
' border-radius: 6px;',
|
||||
' overflow: hidden;',
|
||||
' margin-top: 4px;',
|
||||
'}',
|
||||
'',
|
||||
'.mmconfig-band-group + .mmconfig-band-group {',
|
||||
' border-top: 1px solid #e2e8f0;',
|
||||
'}',
|
||||
'',
|
||||
'.mmconfig-band-group-header {',
|
||||
' display: flex;',
|
||||
' align-items: center;',
|
||||
' justify-content: space-between;',
|
||||
' gap: 10px;',
|
||||
' padding: 8px 12px;',
|
||||
' //background: #f8fafc;',
|
||||
'}',
|
||||
'',
|
||||
'.mmconfig-band-group-title {',
|
||||
' font-size: 0.95em;',
|
||||
'}',
|
||||
'',
|
||||
'.mmconfig-band-actions {',
|
||||
' display: flex;',
|
||||
' gap: 4px;',
|
||||
'}',
|
||||
'',
|
||||
'.mmconfig-band-action {',
|
||||
' padding: 2px 8px;',
|
||||
' font-size: 0.85em;',
|
||||
'}',
|
||||
'',
|
||||
'.mmconfig-band-grid {',
|
||||
' display: grid;',
|
||||
' grid-template-columns: repeat(auto-fill, minmax(72px, 1fr));',
|
||||
' gap: 6px;',
|
||||
' padding: 10px 12px 12px;',
|
||||
'}',
|
||||
'',
|
||||
'.mmconfig-band-item {',
|
||||
' display: flex;',
|
||||
' align-items: center;',
|
||||
' gap: 6px;',
|
||||
' min-height: 30px;',
|
||||
' padding: 4px 6px;',
|
||||
' border: 1px solid #e2e8f0;',
|
||||
' border-radius: 4px;',
|
||||
' cursor: pointer;',
|
||||
' user-select: none;',
|
||||
'}',
|
||||
'',
|
||||
'.mmconfig-band-item:hover {',
|
||||
' background: #f8fafc;',
|
||||
'}',
|
||||
'',
|
||||
'.mmconfig-band-label {',
|
||||
' font-weight: 500;',
|
||||
'}',
|
||||
'',
|
||||
'.mmconfig-bands-empty {',
|
||||
' padding: 10px 12px;',
|
||||
' border: 1px solid #e2e8f0;',
|
||||
' border-radius: 6px;',
|
||||
' color: #718096;',
|
||||
'}',
|
||||
'',
|
||||
'.light-divider {',
|
||||
' height: 1px;',
|
||||
' background: #edf2f7;',
|
||||
|
||||
@@ -26,8 +26,15 @@ msgstr "Состояние"
|
||||
msgid "WARNING"
|
||||
msgstr "ПРЕДУПРЕЖДЕНИЕ"
|
||||
|
||||
msgid "List supported bands.<br />If deselect all bands, then used default band modem config."
|
||||
msgstr "Список поддерживаемых диапазонов.<br />Если не выбрано ни одного диапазона, используется конфигурация модема по умолчанию."
|
||||
|
||||
msgid "Select bands for modem operation."
|
||||
msgstr "Выберите диапазоны для работы модема."
|
||||
|
||||
msgid "Selected bands are a recommendation and do not guarantee that the modem will use exactly these bands."
|
||||
msgstr "Выбранные диапазоны являются рекомендацией и не гарантируют, что модем будет использовать именно эти диапазоны."
|
||||
|
||||
msgid "If all bands are deselected, the modems default band configuration will be used."
|
||||
msgstr "Если снять все флажки, будет использоваться конфигурация диапазонов модема по умолчанию."
|
||||
|
||||
msgid "No modem configuration found. Run <code>/etc/init.d/mmconfig start<code>"
|
||||
msgstr "Не найдена конфигурация. Перезапустите скрипт <code>/etc/init.d/mmconfig start</code>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
},
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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..."))
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
+3
-1
@@ -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 <pepe.schlehofer@gmail.com>, Daniel Engberg <daniel.engberg.lists@pyret.net>
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user