From d3860fd4115f27bbacbd6b1ad4367b5504831738 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 29 Apr 2026 20:35:25 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=84=20Sync=202026-04-29=2020:35:25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cdnspeedtest/Makefile | 4 +- ddns-go/Makefile | 4 +- easytier-noweb/Makefile | 71 ++++++++ easytier/Makefile | 13 +- hickory-dns/Makefile | 2 +- .../files/etc/hickory-dns/forwarder.toml | 6 + hickory-dns/files/etc/init.d/hickory-dns | 9 + ipv6-neigh/Cargo.toml | 2 +- ipv6-neigh/Makefile | 2 +- ipv6-neigh/src/db.rs | 13 +- ipv6-neigh/src/main.rs | 17 +- .../luci-static/resources/view/mptcp/mptcp.js | 25 ++- luci-app-mptcp/po/ru/mptcp.po | 3 + .../root/usr/libexec/rpcd/luci.mptcp | 166 ++++++++++++++++++ .../usr/share/rpcd/acl.d/luci-app-mptcp.json | 6 +- luci-app-passwall/Makefile | 2 +- .../model/cbi/passwall/client/acl_config.lua | 3 +- .../model/cbi/passwall/client/global.lua | 3 +- luci-app-passwall/po/zh-cn/passwall.po | 3 + .../usr/share/passwall/helper_dnsmasq.lua | 11 +- luci-app-sqm-autorate/po/ru/sqm.po | 41 ++++- luci-app-wechatpush/Makefile | 2 +- .../resources/view/wechatpush/config.js | 14 +- luci-app-wechatpush/po/zh_Hans/wechatpush.po | 8 +- .../root/usr/share/wechatpush/api/msmtp.json | 2 +- mptcp/Makefile | 2 +- mptcp/files/etc/init.d/mptcp | 10 +- teleproxy/Makefile | 10 +- 28 files changed, 408 insertions(+), 46 deletions(-) create mode 100644 easytier-noweb/Makefile diff --git a/cdnspeedtest/Makefile b/cdnspeedtest/Makefile index 89a92c258..bf8c67c15 100644 --- a/cdnspeedtest/Makefile +++ b/cdnspeedtest/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=CloudflareSpeedTest -PKG_VERSION:=2.3.4 -PKG_RELEASE:=1 +PKG_VERSION:=2.3.5 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/XIU2/CloudflareSpeedTest/tar.gz/v$(PKG_VERSION)? diff --git a/ddns-go/Makefile b/ddns-go/Makefile index 62fd1786f..65ec8938c 100644 --- a/ddns-go/Makefile +++ b/ddns-go/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ddns-go -PKG_VERSION:=6.16.12 -PKG_RELEASE:=10 +PKG_VERSION:=6.16.13 +PKG_RELEASE:=11 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/jeessy2/ddns-go/tar.gz/v$(PKG_VERSION)? diff --git a/easytier-noweb/Makefile b/easytier-noweb/Makefile new file mode 100644 index 000000000..f9954bbd2 --- /dev/null +++ b/easytier-noweb/Makefile @@ -0,0 +1,71 @@ +include $(TOPDIR)/rules.mk +-include $(dir $(lastword $(MAKEFILE_LIST)))../version.mk + +PKG_NAME:=easytier-noweb +PKG_VERSION:=$(or $(EASYTIER_VERSION),2.6.2) +PKG_RELEASE:=1 + +ifeq ($(ARCH),mipsel) + APP_ARCH:=mipsel +endif +ifeq ($(ARCH),mips) + APP_ARCH:=mips +endif +ifeq ($(ARCH),arm) + APP_ARCH:=arm +endif +ifeq ($(BOARD),kirkwood) + APP_ARCH:=arm +endif +ifeq ($(ARCH),armv7) + APP_ARCH:=armv7 +endif +ifeq ($(ARCH),aarch64) + APP_ARCH:=aarch64 +endif +ifeq ($(ARCH),arm64) + APP_ARCH:=aarch64 +endif +ifeq ($(ARCH),armv8) + APP_ARCH:=aarch64 +endif +ifeq ($(ARCH),x86_64) + APP_ARCH:=x86_64 +endif + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=net + CATEGORY:=Network + TITLE:=A simple, decentralized mesh VPN with WireGuard support. + DEPENDS:=@(x86_64||arm||aarch64||mipsel||mips) +kmod-tun + URL:=https://github.com/EasyTier/EasyTier + MENU:=1 +endef + +define Package/$(PKG_NAME)/description + A simple, decentralized mesh VPN with WireGuard support. +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + if [ ! -f $(PKG_BUILD_DIR)/easytier-core ]; then \ + wget https://github.com/EasyTier/EasyTier/releases/download/v$(PKG_VERSION)/easytier-linux-$(APP_ARCH)-v$(PKG_VERSION).zip -O $(PKG_BUILD_DIR)/easytier-$(PKG_VERSION).zip; \ + unzip -o -j $(PKG_BUILD_DIR)/easytier-$(PKG_VERSION).zip -d $(PKG_BUILD_DIR); \ + rm -f $(PKG_BUILD_DIR)/easytier-$(PKG_VERSION).zip; \ + fi +endef + +define Build/Compile +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/easytier-core $(1)/usr/bin/easytier-core + $(INSTALL_BIN) $(PKG_BUILD_DIR)/easytier-cli $(1)/usr/bin/easytier-cli +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/easytier/Makefile b/easytier/Makefile index 1e1172da5..2a936340c 100644 --- a/easytier/Makefile +++ b/easytier/Makefile @@ -3,7 +3,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=easytier PKG_VERSION:=$(or $(EASYTIER_VERSION),2.6.2) -PKG_RELEASE:=4 +PKG_RELEASE:=5 ifeq ($(ARCH),mipsel) APP_ARCH:=mipsel @@ -37,6 +37,8 @@ PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) include $(INCLUDE_DIR)/package.mk +RSTRIP:=: + define Package/$(PKG_NAME) SECTION:=net CATEGORY:=Network @@ -74,10 +76,13 @@ endef define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/easytier-core $(1)/usr/bin/easytier-core - $(INSTALL_BIN) $(PKG_BUILD_DIR)/easytier-cli $(1)/usr/bin/easytier-cli + $(CP) $(PKG_BUILD_DIR)/easytier-core $(1)/usr/bin/ + chmod 0755 $(1)/usr/bin/easytier-core + $(CP) $(PKG_BUILD_DIR)/easytier-cli $(1)/usr/bin/ + chmod 0755 $(1)/usr/bin/easytier-cli ifdef CONFIG_EASYTIER_INCLUDE_WEBCONSOLE - $(INSTALL_BIN) $(PKG_BUILD_DIR)/easytier-web-embed $(1)/usr/bin/easytier-web + $(CP) $(PKG_BUILD_DIR)/easytier-web-embed $(1)/usr/bin/easytier-web + chmod 0755 $(1)/usr/bin/easytier-web endif endef diff --git a/hickory-dns/Makefile b/hickory-dns/Makefile index 4116a7949..a9084e87a 100644 --- a/hickory-dns/Makefile +++ b/hickory-dns/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=hickory-dns PKG_VERSION:=0.26.0-beta.2 -PKG_RELEASE:=16 +PKG_RELEASE:=17 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/hickory-dns/hickory-dns/tar.gz/v$(PKG_VERSION)? diff --git a/hickory-dns/files/etc/hickory-dns/forwarder.toml b/hickory-dns/files/etc/hickory-dns/forwarder.toml index c1db33725..acfce06e4 100644 --- a/hickory-dns/files/etc/hickory-dns/forwarder.toml +++ b/hickory-dns/files/etc/hickory-dns/forwarder.toml @@ -12,6 +12,12 @@ zone_path = "/etc/hickory-dns/lan.zone" journal_path = "/var/lib/hickory-dns/lan.jrnl" allow_update = true +[[zones.stores.tsig_keys]] +name = "update-key." +key_file = "/etc/hickory-dns/update.key" +algorithm = "hmac-sha256" +fudge = 300 + [[zones]] zone = "." zone_type = "External" diff --git a/hickory-dns/files/etc/init.d/hickory-dns b/hickory-dns/files/etc/init.d/hickory-dns index 35fb57abb..7cf1b58ca 100755 --- a/hickory-dns/files/etc/init.d/hickory-dns +++ b/hickory-dns/files/etc/init.d/hickory-dns @@ -6,8 +6,17 @@ STOP=51 PROG=/usr/bin/hickory-dns CONF=/etc/hickory-dns/forwarder.toml +TSIG_KEY=/etc/hickory-dns/update.key + +generate_tsig_key() { + [ -f "$TSIG_KEY" ] && return 0 + dd if=/dev/urandom bs=32 count=1 of="$TSIG_KEY" 2>/dev/null + chown nobody:nogroup "$TSIG_KEY" 2>/dev/null || true + chmod 400 "$TSIG_KEY" +} start_service() { + generate_tsig_key procd_open_instance hickory-dns procd_set_param command $PROG -c $CONF -q procd_set_param user nobody diff --git a/ipv6-neigh/Cargo.toml b/ipv6-neigh/Cargo.toml index 3c3dcb5f1..561c9e3ae 100644 --- a/ipv6-neigh/Cargo.toml +++ b/ipv6-neigh/Cargo.toml @@ -13,7 +13,7 @@ futures = "0.3.11" netlink-packet-route = {version = "0.21" } netlink-packet-core= {version ="0.7"} clap = { version = "4.0", default-features = false, features = ["cargo", "derive", "help", "std", "suggestions"] } -hickory-proto = { git = "https://github.com/hickory-dns/hickory-dns.git", rev = "34a4cca1a707b642052b427938b7d1e8aaa71e3a" } +hickory-proto = { git = "https://github.com/hickory-dns/hickory-dns.git", rev = "34a4cca1a707b642052b427938b7d1e8aaa71e3a", features = ["dnssec-ring"] } ubus = "0.1.6" serde_json = "1.0.108" diff --git a/ipv6-neigh/Makefile b/ipv6-neigh/Makefile index 44c75ea7e..6d7a1c1b9 100644 --- a/ipv6-neigh/Makefile +++ b/ipv6-neigh/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ipv6-neigh PKG_VERSION:=0.1.0 -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_BUILD_DEPENDS:=rust/host PKG_BUILD_PARALLEL:=1 diff --git a/ipv6-neigh/src/db.rs b/ipv6-neigh/src/db.rs index a93b17fa0..b43a7a2b4 100644 --- a/ipv6-neigh/src/db.rs +++ b/ipv6-neigh/src/db.rs @@ -1,7 +1,8 @@ use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr}; +use std::time::{SystemTime, UNIX_EPOCH}; use hickory_proto::op::{Message, ResponseCode, update_message}; -use hickory_proto::rr::{Name, RData, RecordSet, RecordType}; +use hickory_proto::rr::{Name, RData, RecordSet, RecordType, TSigner}; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::TcpStream; @@ -9,11 +10,12 @@ use tokio::net::TcpStream; pub(crate) struct DnsUpdater { server_addr: SocketAddr, zone: Name, + signer: TSigner, } impl DnsUpdater { - pub fn new(server_addr: SocketAddr, zone: Name) -> Self { - Self { server_addr, zone } + pub fn new(server_addr: SocketAddr, zone: Name, signer: TSigner) -> Self { + Self { server_addr, zone, signer } } /// Create or append a AAAA record. @@ -89,7 +91,10 @@ impl DnsUpdater { } /// Send a DNS message over TCP (2-byte length prefix + message bytes) and read the response. - async fn send_tcp(&self, msg: Message) -> Result> { + async fn send_tcp(&self, mut msg: Message) -> Result> { + let now = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(); + msg.finalize(&self.signer, now)?; + let bytes = msg.to_vec()?; let len = u16::try_from(bytes.len())?; diff --git a/ipv6-neigh/src/main.rs b/ipv6-neigh/src/main.rs index df1444c75..5ac86aa7a 100644 --- a/ipv6-neigh/src/main.rs +++ b/ipv6-neigh/src/main.rs @@ -12,6 +12,8 @@ use rtnetlink::{Error, Handle, new_connection}; use clap::Parser; use hickory_proto::rr::Name; +use hickory_proto::rr::TSigner; +use hickory_proto::rr::rdata::tsig::TsigAlgorithm; use netlink_sys::{AsyncSocket, SocketAddr}; mod db; mod op; @@ -39,6 +41,12 @@ struct Cli { /// DNS zone to update (e.g. "lan") #[clap(short, long, default_value = "lan")] zone: String, + /// Path to TSIG key file (raw HMAC secret) + #[clap(short, long, default_value = "/etc/hickory-dns/update.key")] + key_file: std::path::PathBuf, + /// TSIG key name + #[clap(short = 'n', long, default_value = "update-key.")] + key_name: String, } #[derive(Debug)] @@ -135,7 +143,14 @@ async fn main() -> Result<(), ()> { let args = Cli::parse(); let private_subnet = args.private_subnet; let zone = Name::from_ascii(&args.zone).expect("invalid zone name"); - let updater = db::DnsUpdater::new(args.dns_server, zone); + + let key_data = std::fs::read(&args.key_file) + .unwrap_or_else(|e| panic!("failed to read TSIG key file {:?}: {e}", args.key_file)); + let key_name = Name::from_ascii(&args.key_name).expect("invalid TSIG key name"); + let signer = TSigner::new(key_data, TsigAlgorithm::HmacSha256, key_name, 300) + .expect("invalid TSIG key"); + + let updater = db::DnsUpdater::new(args.dns_server, zone, signer); let (connection, handle, _) = new_connection().unwrap(); tokio::spawn(connection); diff --git a/luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js b/luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js index 0f823820b..81cd896d5 100644 --- a/luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js +++ b/luci-app-mptcp/htdocs/luci-static/resources/view/mptcp/mptcp.js @@ -28,6 +28,21 @@ return L.view.extend({ var m, s, o; var boardinfo = res[0]; + function normalizeSchedulerValue(value) { + if (value == null) + return value; + + var normalized = String(value).trim(); + + if (normalized.endsWith('.o')) + normalized = normalized.slice(0, -2); + + if (normalized.startsWith('mptcp_')) + normalized = normalized.slice(6); + + return normalized; + } + m = new form.Map('network', _('MPTCP'),_('Networks MPTCP settings.')); s = m.section(form.TypedSection, 'globals'); @@ -73,11 +88,19 @@ return L.view.extend({ } if (parseFloat(boardinfo.kernel.substring(0,3)) > 6) { + scheduler.cfgvalue = function(section_id) { + return normalizeSchedulerValue(uci.get('network', section_id, 'mptcp_scheduler')); + }; + + scheduler.write = function(section_id, value) { + uci.set('network', section_id, 'mptcp_scheduler', normalizeSchedulerValue(value)); + }; + scheduler.load = function(section_id) { return L.resolveDefault(fs.list('/usr/share/bpf/scheduler'), []).then(L.bind(function(entries) { for (var i = 0; i < entries.length; i++) if (entries[i].type == 'file' && entries[i].name.match(/\.o$/)) - this.value(entries[i].name); + this.value(normalizeSchedulerValue(entries[i].name), entries[i].name); return this.super('load', [section_id]); }, this)); }; diff --git a/luci-app-mptcp/po/ru/mptcp.po b/luci-app-mptcp/po/ru/mptcp.po index bdd6ac158..ddacab82c 100644 --- a/luci-app-mptcp/po/ru/mptcp.po +++ b/luci-app-mptcp/po/ru/mptcp.po @@ -225,6 +225,7 @@ msgid "" "The number of MPTCP-level retransmission intervals with no traffic and " "pending outstanding data on a given subflow required to declare it stale" msgstr "" +"Количество интервалов повторной передачи MPTCP без трафика и с ожидающими данными на заданном подпотоке, необходимых для его объявления устаревшим" #: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:914 msgid "Upload:" @@ -317,9 +318,11 @@ msgid "" "specifies the maximum number of ADD_ADDR suboptions accepted for each MPTCP " "connection" msgstr "" +"задаёт максимальное количество подопций ADD_ADDR, принимаемых для каждого соединения MPTCP" #: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59 msgid "" "specifies the maximum number of additional subflows allowed for each MPTCP " "connection" msgstr "" +"задаёт максимальное количество дополнительных подпотоков, разрешённых для каждого соединения MPTCP" diff --git a/luci-app-mptcp/root/usr/libexec/rpcd/luci.mptcp b/luci-app-mptcp/root/usr/libexec/rpcd/luci.mptcp index 602ab5052..87bbcb37f 100755 --- a/luci-app-mptcp/root/usr/libexec/rpcd/luci.mptcp +++ b/luci-app-mptcp/root/usr/libexec/rpcd/luci.mptcp @@ -57,6 +57,172 @@ end local methods = { + -- ----------------------------------------------------------------------- + -- Settings: global MPTCP (network.globals) + -- ----------------------------------------------------------------------- + + -- Returns all configurable global MPTCP settings from network.globals. + get_settings = { + call = function() + local result = {} + local string_fields = { + "multipath", "mptcp_checksum", "mptcp_debug", + "mptcp_path_manager", "mptcp_scheduler", "mptcp_syn_retries", + "mptcp_version", "congestion", "mptcp_pm_type", + "mptcp_disable_initial_config", "mptcp_force_multipath", + "mptcpd_enable", "mptcp_subflows", "mptcp_stale_loss_cnt", + "mptcp_add_addr_accepted", "mptcp_add_addr_timeout", + "mptcp_blackhole_timeout", "mptcp_close_timeout", + "mptcp_syn_retrans_before_tcp_fallback", + "mptcp_fullmesh_num_subflows", "mptcp_fullmesh_create_on_err", + "mptcp_ndiffports_num_subflows", "mptcp_rr_cwnd_limited", + "mptcp_rr_num_segments" + } + local list_fields = { + "mptcpd_path_manager", "mptcpd_plugins", + "mptcpd_addr_flags", "mptcpd_notify_flags" + } + for _, field in ipairs(string_fields) do + local val = uci:get("network", "globals", field) + if val ~= nil then result[field] = val end + end + for _, field in ipairs(list_fields) do + local val = uci:get_list("network", "globals", field) + result[field] = val or {} + end + return result + end + }, + + -- Writes one or more global MPTCP settings to network.globals and commits. + -- All parameters are optional; only provided (non-empty) ones are written. + -- List fields (mptcpd_path_manager, mptcpd_plugins, mptcpd_addr_flags, + -- mptcpd_notify_flags) must be passed as JSON arrays. + set_settings = { + args = { + mptcp_checksum = "", + mptcp_debug = "", + mptcp_path_manager = "", + mptcp_scheduler = "", + mptcp_syn_retries = "", + mptcp_version = "", + congestion = "", + mptcp_pm_type = "", + mptcp_disable_initial_config = "", + mptcp_force_multipath = "", + mptcpd_enable = "", + mptcpd_path_manager = {}, + mptcpd_plugins = {}, + mptcpd_addr_flags = {}, + mptcpd_notify_flags = {}, + mptcp_subflows = "", + mptcp_stale_loss_cnt = "", + mptcp_add_addr_accepted = "", + mptcp_add_addr_timeout = "", + mptcp_blackhole_timeout = "", + mptcp_close_timeout = "", + mptcp_syn_retrans_before_tcp_fallback = "", + mptcp_fullmesh_num_subflows = "", + mptcp_fullmesh_create_on_err = "", + mptcp_ndiffports_num_subflows = "", + mptcp_rr_cwnd_limited = "", + mptcp_rr_num_segments = "" + }, + call = function(args) + local string_fields = { + "mptcp_checksum", "mptcp_debug", "mptcp_path_manager", + "mptcp_scheduler", "mptcp_syn_retries", "mptcp_version", + "congestion", "mptcp_pm_type", "mptcp_disable_initial_config", + "mptcp_force_multipath", "mptcpd_enable", "mptcp_subflows", + "mptcp_stale_loss_cnt", "mptcp_add_addr_accepted", + "mptcp_add_addr_timeout", "mptcp_blackhole_timeout", + "mptcp_close_timeout", "mptcp_syn_retrans_before_tcp_fallback", + "mptcp_fullmesh_num_subflows", "mptcp_fullmesh_create_on_err", + "mptcp_ndiffports_num_subflows", "mptcp_rr_cwnd_limited", + "mptcp_rr_num_segments" + } + local list_fields = { + "mptcpd_path_manager", "mptcpd_plugins", + "mptcpd_addr_flags", "mptcpd_notify_flags" + } + for _, field in ipairs(string_fields) do + if args[field] ~= nil and args[field] ~= "" then + uci:set("network", "globals", field, args[field]) + end + end + for _, field in ipairs(list_fields) do + if args[field] ~= nil and type(args[field]) == "table" then + uci:set_list("network", "globals", field, args[field]) + end + end + uci:save("network") + uci:commit("network") + return { result = "ok" } + end + }, + + -- ----------------------------------------------------------------------- + -- Settings: per-interface MPTCP (network.interface) + -- ----------------------------------------------------------------------- + + -- Returns multipath settings for all interfaces (or a single one when + -- the optional "iface" argument is provided). + get_interface_settings = { + args = { iface = "" }, + call = function(args) + local iface = args.iface or "" + if iface ~= "" then + local section = uci:get_all("network", iface) + if not section or section[".type"] ~= "interface" then + return { error = "Interface not found" } + end + return { + multipath = section["multipath"] or "off", + multipath_weight = section["multipath_weight"] or "100" + } + end + local result = {} + uci:foreach("network", "interface", function(s) + local name = s[".name"] + result[name] = { + multipath = s["multipath"] or "off", + multipath_weight = s["multipath_weight"] or "100" + } + end) + return result + end + }, + + -- Sets multipath and/or multipath_weight for the given interface. + -- "iface" is required; "multipath" and "multipath_weight" are optional. + -- Valid values for multipath: "on", "off", "master", "backup". + set_interface_settings = { + args = { iface = "", multipath = "", multipath_weight = "" }, + call = function(args) + local iface = args.iface or "" + if iface == "" then + return { error = "Interface name required" } + end + local section = uci:get_all("network", iface) + if not section or section[".type"] ~= "interface" then + return { error = "Interface not found" } + end + if args.multipath ~= nil and args.multipath ~= "" then + uci:set("network", iface, "multipath", args.multipath) + end + if args.multipath_weight ~= nil and args.multipath_weight ~= "" then + uci:set("network", iface, "multipath_weight", args.multipath_weight) + end + uci:save("network") + uci:commit("network") + return { result = "ok" } + end + }, + + -- ----------------------------------------------------------------------- + -- Bandwidth / diagnostics (existing methods below) + -- ----------------------------------------------------------------------- + -- Returns per-interface bandwidth arrays plus a "total" entry. -- Each value is an array of [ts, rx_bytes, rx_pkts, tx_bytes, tx_pkts]. multipath_bandwidth = { diff --git a/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json b/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json index f8ef2f1f8..1502e0524 100644 --- a/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json +++ b/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json @@ -18,7 +18,11 @@ "mptcp_fullmesh", "mptcp_monitor", "mptcp_connections", - "mptcp_check_trace" + "mptcp_check_trace", + "get_settings", + "set_settings", + "get_interface_settings", + "set_interface_settings" ] } }, diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile index 26d2aa8b7..128c7a543 100644 --- a/luci-app-passwall/Makefile +++ b/luci-app-passwall/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=26.4.15 -PKG_RELEASE:=101 +PKG_RELEASE:=102 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/acl_config.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/acl_config.lua index e062f5434..0b4496d32 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/acl_config.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/acl_config.lua @@ -555,6 +555,7 @@ o:depends({singbox_dns_mode = "udp"}) o:depends({singbox_dns_mode = "tcp"}) o = s:option(Value, "remote_dns_doh", translate("Remote DNS DoH")) +o.description = translate("Format: URL[,IP] (omit the latter if URL is an IP)") o:value("https://1.1.1.1/dns-query", "1.1.1.1 (CloudFlare)") o:value("https://1.1.1.2/dns-query", "1.1.1.2 (CloudFlare-Security)") o:value("https://8.8.4.4/dns-query", "8.8.4.4 (Google)") @@ -565,7 +566,7 @@ o:value("https://208.67.222.222/dns-query", "208.67.222.222 (OpenDNS)") o:value("https://dns.adguard.com/dns-query,94.140.14.14", "94.140.14.14 (AdGuard)") o:value("https://doh.libredns.gr/dns-query,116.202.176.26", "116.202.176.26 (LibreDNS)") o:value("https://doh.libredns.gr/ads,116.202.176.26", "116.202.176.26 (LibreDNS-NoAds)") -o.default = "https://1.1.1.1/dns-query" +o.default = o.keylist[1] o.validate = function(self, value, t) if value ~= "" then value = api.trim(value) diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua index b71d574c8..e89cdf51d 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua @@ -444,7 +444,8 @@ o:depends({singbox_dns_mode = "tcp"}) ---- DoH o = s:taboption("DNS", Value, "remote_dns_doh", translate("Remote DNS DoH")) -o.default = "https://1.1.1.1/dns-query" +o.description = translate("Format: URL[,IP] (omit the latter if URL is an IP)") +o.default = o.keylist[1] o:value("https://1.1.1.1/dns-query", "1.1.1.1 (CloudFlare)") o:value("https://1.1.1.2/dns-query", "1.1.1.2 (CloudFlare-Security)") o:value("https://8.8.4.4/dns-query", "8.8.4.4 (Google)") diff --git a/luci-app-passwall/po/zh-cn/passwall.po b/luci-app-passwall/po/zh-cn/passwall.po index a73a666ab..1512d3e95 100644 --- a/luci-app-passwall/po/zh-cn/passwall.po +++ b/luci-app-passwall/po/zh-cn/passwall.po @@ -220,6 +220,9 @@ msgstr "请求协议" msgid "Remote DNS DoH" msgstr "远程 DNS DoH" +msgid "Format: URL[,IP] (omit the latter if URL is an IP)" +msgstr "格式:URL[,IP](URL 为 IP 时可省略后半部分)" + msgid "Notify the DNS server when the DNS query is notified, the location of the client (cannot be a private IP address)." msgstr "用于 DNS 查询时通知 DNS 服务器,客户端所在的地理位置(不能是私有 IP 地址)。" diff --git a/luci-app-passwall/root/usr/share/passwall/helper_dnsmasq.lua b/luci-app-passwall/root/usr/share/passwall/helper_dnsmasq.lua index be450cb69..7318a7c00 100644 --- a/luci-app-passwall/root/usr/share/passwall/helper_dnsmasq.lua +++ b/luci-app-passwall/root/usr/share/passwall/helper_dnsmasq.lua @@ -286,17 +286,22 @@ function add_rule(var) if domain == "" or domain:find("#") then return end - table.insert(excluded_domain, domain) + excluded_domain[domain] = true end local function check_excluded_domain(domain) if domain == "" or domain:find("#") then return false end - for k,v in ipairs(excluded_domain) do - if domain == v or domain:sub(-#("."..v)) == "."..v then + if excluded_domain[domain] then + return true + end + local pos = domain:find(".", 1, true) + while pos do + if excluded_domain[domain:sub(pos + 1)] then return true end + pos = domain:find(".", pos + 1, true) end return false end diff --git a/luci-app-sqm-autorate/po/ru/sqm.po b/luci-app-sqm-autorate/po/ru/sqm.po index 3aa81dd5a..68d6c47be 100644 --- a/luci-app-sqm-autorate/po/ru/sqm.po +++ b/luci-app-sqm-autorate/po/ru/sqm.po @@ -44,6 +44,8 @@ msgid "" "Download speed (kbit/s) (ingress) set to 0 to selectively disable ingress " "shaping:" msgstr "" +"Скорость загрузки (Кбит/с) (входящий трафик), установите 0 для отключения " +"формирования входящего трафика:" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:58 msgid "Enable SQM" @@ -63,6 +65,7 @@ msgstr "" msgid "" "Explicit congestion notification (ECN) status on outbound packets (egress)." msgstr "" +"Состояние явного уведомления о перегрузке (ECN) для исходящих пакетов (egress)." #: applications/luci-app-sqm/root/usr/share/rpcd/acl.d/luci-app-sqm.json:3 msgid "Grant UCI access for luci-app-sqm" @@ -82,7 +85,7 @@ msgstr "" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:142 msgid "Ignore DSCP on ingress:" -msgstr "" +msgstr "Игнорировать DSCP для входящего трафика:" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:89 msgid "Interface name" @@ -93,12 +96,16 @@ msgid "" "Latency target for egress, e.g. 5ms [units: s, ms, or us]; leave empty for " "automatic selection, put in the word default for the qdisc's default." msgstr "" +"Целевая задержка для исходящего трафика, напр. 5ms [единицы: s, ms, или us]; оставьте пустым для " +"автоматического выбора, введите слово default для значения по умолчанию qdisc." #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:172 msgid "" "Latency target for ingress, e.g 5ms [units: s, ms, or us]; leave empty for " "automatic selection, put in the word default for the qdisc's default." msgstr "" +"Целевая задержка для входящего трафика, напр. 5ms [единицы: s, ms, или us]; оставьте пустым для " +"автоматического выбора, введите слово default для значения по умолчанию qdisc." #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:74 msgid "Link Layer Adaptation" @@ -109,6 +116,8 @@ msgid "" "Maximal Size for size and rate calculations, tcMTU (byte); needs to be >= " "interface MTU + overhead:" msgstr "" +"Максимальный размер для расчётов размера и скорости, tcMTU (байт); должен быть >= " +"MTU интерфейса + накладные расходы:" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:213 msgid "" @@ -122,14 +131,16 @@ msgid "" "Number of entries in size/rate tables, TSIZE; for ATM choose TSIZE = (tcMTU " "+ 1) / 16:" msgstr "" +"Количество записей в таблицах размер/скорость, TSIZE; для ATM выберите TSIZE = (tcMTU " +"+ 1) / 16:" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:193 msgid "Per Packet Overhead (byte):" -msgstr "" +msgstr "Накладные расходы на пакет (байт):" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:73 msgid "Queue Discipline" -msgstr "" +msgstr "Дисциплина очереди" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:120 msgid "Queue setup script" @@ -144,6 +155,8 @@ msgid "" "Queuing disciplines useable on this system. After installing a new qdisc, " "you need to restart the router to see updates!" msgstr "" +"Дисциплины очереди, доступные на этой системе. После установки нового qdisc " +"необходимо перезагрузить маршрутизатор, чтобы увидеть обновления!" #: applications/luci-app-sqm/root/usr/share/luci/menu.d/luci-app-sqm.json:3 msgid "SQM QoS" @@ -154,18 +167,24 @@ msgid "" "Show Advanced Linklayer Options, (only needed if MTU > 1500). Advanced " "options will only be used as long as this box is checked." msgstr "" +"Показать расширенные параметры канального уровня (нужны только если MTU > 1500). " +"Расширенные параметры используются только пока этот флажок установлен." #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:133 msgid "" "Show and Use Advanced Configuration. Advanced options will only be used as " "long as this box is checked." msgstr "" +"Показать и использовать расширенную конфигурацию. Расширенные параметры " +"используются только пока этот флажок установлен." #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:160 msgid "" "Show and Use Dangerous Configuration. Dangerous options will only be used as " "long as this box is checked." msgstr "" +"Показать и использовать опасную конфигурацию. Опасные параметры " +"используются только пока этот флажок установлен." #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:64 msgid "Smart Queue Management" @@ -173,7 +192,7 @@ msgstr "Умное управление очередью" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:136 msgid "Squash DSCP on inbound packets (ingress):" -msgstr "" +msgstr "Обнулить DSCP для входящих пакетов (ingress):" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:83 msgid "" @@ -181,18 +200,25 @@ msgid "" "disable the sqm initscript manually under System Startup menu in case this " "change was not wished for." msgstr "" +"Интерфейс SQM только что включил скрипт инициализации sqm от вашего имени. Не забудьте " +"вручную отключить скрипт инициализации sqm в меню запуска системы, если это изменение " +"не было желаемым." #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:48 msgid "" "The SQM service seems to be disabled. Please use the button below to " "activate this service." msgstr "" +"Похоже, служба SQM отключена. Используйте кнопку ниже для " +"активации этой службы." #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:96 msgid "" "Upload speed (kbit/s) (egress) set to 0 to selectively disable egress " "shaping:" msgstr "" +"Скорость отдачи (Кбит/с) (исходящий трафик), установите 0 для отключения " +"формирования исходящего трафика:" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:103 msgid "Verbosity of SQM's output into the system log." @@ -200,11 +226,11 @@ msgstr "Детальность вывода SQM в системный журна #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:187 msgid "Which link layer to account for:" -msgstr "" +msgstr "Какой канальный уровень учитывать:" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:218 msgid "Which linklayer adaptation mechanism to use; for testing only" -msgstr "" +msgstr "Какой механизм адаптации канального уровня использовать; только для тестирования" #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:65 msgid "" @@ -212,6 +238,9 @@ msgid "" "traffic shaping, better mixing (Fair Queueing), active queue length " "management (AQM) and prioritisation on one network interface." msgstr "" +"С помощью SQM вы можете включить " +"формирование трафика, улучшенное смешивание (справедливая очередь), активное управление " +"длиной очереди (AQM) и расстановку приоритетов на одном сетевом интерфейсе." #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:107 #: applications/luci-app-sqm/htdocs/luci-static/resources/view/network/sqm.js:149 diff --git a/luci-app-wechatpush/Makefile b/luci-app-wechatpush/Makefile index 89c8278e6..7ec4f6ea3 100755 --- a/luci-app-wechatpush/Makefile +++ b/luci-app-wechatpush/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-wechatpush PKG_VERSION:=3.6.12 -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_MAINTAINER:=tty228 PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-wechatpush/htdocs/luci-static/resources/view/wechatpush/config.js b/luci-app-wechatpush/htdocs/luci-static/resources/view/wechatpush/config.js index 125d34ce9..bf5fb46aa 100644 --- a/luci-app-wechatpush/htdocs/luci-static/resources/view/wechatpush/config.js +++ b/luci-app-wechatpush/htdocs/luci-static/resources/view/wechatpush/config.js @@ -256,11 +256,21 @@ return view.extend({ o.depends('jsonpath', '/usr/share/wechatpush/api/msmtp.json'); o.placeholder = "25"; - o = s.taboption('basic', form.Flag, 'smtp_tls', _('Enable TLS')); + o = s.taboption('basic', form.ListValue, 'smtp_tls', _('Enable/Disable TLS')); o.depends('jsonpath', '/usr/share/wechatpush/api/msmtp.json'); + o.widget = 'radio'; + o.value('on', _('Enable')); + o.value('off', _('Disable')); + o.value('', _('Ignore')); + o.default = ''; - o = s.taboption('basic', form.Flag, 'smtp_starttls', _('Enable STARTTLS')); + o = s.taboption('basic', form.ListValue, 'smtp_starttls', _('Enable/Disable STARTTLS')); o.depends('jsonpath', '/usr/share/wechatpush/api/msmtp.json'); + o.widget = 'radio'; + o.value('on', _('Enable')); + o.value('off', _('Disable')); + o.value('', _('Ignore')); + o.default = ''; o = s.taboption('basic', form.Value, 'smtp_user', _('User')); o.depends('jsonpath', '/usr/share/wechatpush/api/msmtp.json'); diff --git a/luci-app-wechatpush/po/zh_Hans/wechatpush.po b/luci-app-wechatpush/po/zh_Hans/wechatpush.po index 18c283035..5e0fc8481 100644 --- a/luci-app-wechatpush/po/zh_Hans/wechatpush.po +++ b/luci-app-wechatpush/po/zh_Hans/wechatpush.po @@ -231,11 +231,11 @@ msgstr "SMTP 服务器" msgid "SMTP Port" msgstr "SMTP 端口" -msgid "Enable TLS" -msgstr "启用 TLS" +msgid "Enable/Disable TLS" +msgstr "启用/禁用 TLS" -msgid "Enable STARTTLS" -msgstr "启用 STARTTLS" +msgid "Enable/Disable STARTTLS" +msgstr "启用/禁用 STARTTLS" msgid "User" msgstr "用户名" diff --git a/luci-app-wechatpush/root/usr/share/wechatpush/api/msmtp.json b/luci-app-wechatpush/root/usr/share/wechatpush/api/msmtp.json index aa92244cd..520a32cd0 100644 --- a/luci-app-wechatpush/root/usr/share/wechatpush/api/msmtp.json +++ b/luci-app-wechatpush/root/usr/share/wechatpush/api/msmtp.json @@ -2,7 +2,7 @@ "_api": "这是 msmtp api 文件", "_api": "【msmtp】", - "url": "msmtp --host=${smtp_host} --port=${smtp_port} ${smtp_tls:+--tls=on} ${smtp_tls:---tls=off} ${smtp_starttls:+--tls-starttls=on} ${smtp_starttls:---tls-starttls=off} ${smtp_user:+--auth=on --user=$smtp_user} ${smtp_passwordeval:+--passwordeval=\\\"$smtp_passwordeval\\\"} ${smtp_from:+--from=$smtp_from} ${smtp_from_full_name:+-F\\\"$smtp_from_full_name\\\"} ${recipient_email}", + "url": "msmtp --host=${smtp_host} --port=${smtp_port} ${smtp_tls:+--tls=$smtp_tls} ${smtp_starttls:+--tls-starttls=$smtp_starttls} ${smtp_user:+--auth=on --user=$smtp_user} ${smtp_passwordeval:+--passwordeval=\\\"$smtp_passwordeval\\\"} ${smtp_from:+--from=$smtp_from} ${smtp_from_full_name:+-F\\\"$smtp_from_full_name\\\"} ${recipient_email}", "data": "${tempjsonpath}", "content_type": "", "command": "'\"To: \\(.to)\\nSubject: \\(.subject)\\nContent-Type: text/html\\n\\n\\(.body)\"'", diff --git a/mptcp/Makefile b/mptcp/Makefile index 5dd7135bc..80205a7bc 100644 --- a/mptcp/Makefile +++ b/mptcp/Makefile @@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mptcp PKG_VERSION:=6.1 -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_MAINTAINER:=Ycarus (Yannick Chabanois) PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) diff --git a/mptcp/files/etc/init.d/mptcp b/mptcp/files/etc/init.d/mptcp index 4d3796f58..0fcb58816 100755 --- a/mptcp/files/etc/init.d/mptcp +++ b/mptcp/files/etc/init.d/mptcp @@ -74,10 +74,12 @@ global_multipath_settings() { [ -z "$mptcp_close_timeout" ] || sysctl -qew net.mptcp.close_timeout="$mptcp_close_timeout" [ -z "$mptcp_syn_retrans_before_tcp_fallback" ] || sysctl -qew net.mptcp.syn_retrans_before_tcp_fallback="$mptcp_syn_retrans_before_tcp_fallback" [ -z "$mptcp_blackhole_timeout" ] || sysctl -qew net.mptcp.blackhole_timeout="$mptcp_blackhole_timeout" - if [ -n "$mptcp_scheduler" ] && [ -d /usr/share/bpf/scheduler ]; then - for scheduler in /usr/share/bpf/scheduler/*.o; do - [ -f "$scheduler" ] && bpftool struct_ops register "$scheduler" >/dev/null 2>&1 - done + if [ -n "$mptcp_scheduler" ]; then + if [ -d /usr/share/bpf/scheduler ]; then + for scheduler in /usr/share/bpf/scheduler/*.o; do + [ -f "$scheduler" ] && bpftool struct_ops register "$scheduler" >/dev/null 2>&1 + done + fi local sched="${mptcp_scheduler#mptcp_}"; sched="${sched%.o}" sysctl -qew net.mptcp.scheduler="$sched" >/dev/null 2>&1 fi diff --git a/teleproxy/Makefile b/teleproxy/Makefile index 7297cea66..51016da09 100644 --- a/teleproxy/Makefile +++ b/teleproxy/Makefile @@ -1,8 +1,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=teleproxy -PKG_VERSION:=4.12.0 -PKG_RELEASE:=5 +PKG_VERSION:=4.12.2 +PKG_RELEASE:=6 PKG_MAINTAINER:=Kosntantine Shevlakov PKG_LICENSE:=GPLv2 @@ -10,7 +10,7 @@ PKG_LICENSE_FILES:=LICENSE PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/teleproxy/teleproxy.git -PKG_SOURCE_VERSION:=1785ace7dfa4bda781c8e52be483e4db22282681 +PKG_SOURCE_VERSION:=06ecb7a06d02669677a0f669119b29f7e9d1d743 PKG_SOURCE_SUBDIR:=$(PKG_NAME) PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz @@ -28,6 +28,10 @@ define Package/$(PKG_NAME) DEPENDS:=+libopenssl +zlib endef +define Package/$(PKG_NAME)/conffiles +/etc/config/$(PKG_NAME) +endef + define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/usr/bin \ $(1)/usr/share \