diff --git a/gately/Makefile b/gately/Makefile index 34a885c14..87157ae4e 100644 --- a/gately/Makefile +++ b/gately/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gately -PKG_VERSION:=0.5.2 -PKG_RELEASE:=1 +PKG_VERSION:=0.5.3 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/wangwanjie/gately/tar.gz/v$(PKG_VERSION)? diff --git a/luci-app-daede/Makefile b/luci-app-daede/Makefile index fccf6dcd5..04da08677 100644 --- a/luci-app-daede/Makefile +++ b/luci-app-daede/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-daede PKG_VERSION:=1.15 -PKG_RELEASE:=52 +PKG_RELEASE:=53 PKG_MAINTAINER:=kenzok8 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) diff --git a/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js b/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js index 811f4dbde..f4df1c52e 100644 --- a/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js +++ b/luci-app-daede/htdocs/luci-static/resources/view/daede/updates.js @@ -35,6 +35,8 @@ const HEALTH_PATHS = { btfDetached: '/usr/lib/debug/boot/vmlinux', netns: '/run/netns/daens' }; +const INDEX_STATUS_PATH = '/tmp/luci-app-daede.idx.status'; +let indexStartFailed = false; const CSS = [ '.dd-up-wrap{padding:6px 0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC",sans-serif}', @@ -122,10 +124,19 @@ function probeFile(path) { function probePkg(pkg) { return fs.exec('/usr/share/luci-app-daede/pkg-info.sh', [pkg]).then(function(res) { + if (res.code !== 0) throw new Error('package probe failed'); const out = (res.stdout || '').replace(/[\r\n]+$/, '').split('\t'); - return { installed: out[0] || '', latest: out[1] || '' }; + return { installed: out[0] || '', latest: out[1] || '', state: out[2] || 'absent' }; }).catch(function() { - return { installed: '', latest: '' }; + return { installed: '', latest: '', state: 'error' }; + }); +} + +function probeIndex() { + if (indexStartFailed) return Promise.resolve('failed'); + return L.resolveDefault(fs.read_direct(INDEX_STATUS_PATH, 'text'), '').then(function(out) { + const state = String(out).trim(); + return state === 'success' || state === 'failed' ? state : 'running'; }); } @@ -137,14 +148,16 @@ function stamp() { return view.extend({ load: function() { - // background apk update so new versions show on next poll - fs.exec('/usr/share/luci-app-daede/refresh-index.sh', []).catch(function() {}); + // The script starts a background refresh and returns after writing its state. return Promise.all([ + fs.exec('/usr/share/luci-app-daede/refresh-index.sh', []).then(function(res) { + indexStartFailed = res.code !== 0; + }).catch(function() { indexStartFailed = true; }), backend.detectBackend(), uci.load('daed').catch(function() {}), uci.load('daede').catch(function() {}) ]).then(function(r) { - return r[0]; + return r[1]; }); }, @@ -342,6 +355,7 @@ return view.extend({ probes.push(probePkg(pkg)); }); probes.push(probePkg('luci-app-daede')); + probes.push(probeIndex()); if (ctx.backend.useNetns) probes.push(probeFile(HEALTH_PATHS.netns)); @@ -354,7 +368,8 @@ return view.extend({ coreInfo[pkg] = r[pkgOffset + i]; }); const luci = r[pkgOffset + corePkgs.length]; - const ns = r[pkgOffset + corePkgs.length + 1]; + const indexState = r[pkgOffset + corePkgs.length + 1]; + const ns = r[pkgOffset + corePkgs.length + 2]; // data rows while (dataBody.firstChild) dataBody.removeChild(dataBody.firstChild); @@ -391,26 +406,36 @@ return view.extend({ // a stale compile-jell build) must never be offered as an upgrade. const cmp = (entry.r.installed && entry.r.latest) ? cmpVer(entry.r.latest, entry.r.installed) : null; - const updatable = cmp !== null && cmp > 0; + const updatable = indexState === 'success' && cmp !== null && cmp > 0; let meta; if (!entry.r.installed) { - meta = _('not installed via package manager'); + meta = entry.r.state === 'manual' ? _('not installed via package manager') + : entry.r.state === 'foreign' ? _('unsupported package version') + : entry.r.state === 'error' ? _('package status unavailable') : _('Not installed'); btn.disabled = true; btn.textContent = _('Unavailable'); + } else if (indexState === 'failed') { + meta = _('installed') + ': ' + entry.r.installed + ' · ' + _('package index refresh failed'); + btn.disabled = true; + } else if (indexState !== 'success') { + meta = _('installed') + ': ' + entry.r.installed + ' · ' + _('refreshing package indexes'); + btn.disabled = true; } else if (!entry.r.latest) { - // latest unknown (registry unreachable) - nothing to upgrade to - meta = _('installed') + ': ' + entry.r.installed + ' · ' + _('latest version unknown'); + meta = _('installed') + ': ' + entry.r.installed + ' · ' + _('package not found in configured feeds'); btn.disabled = true; } else if (updatable) { meta = _('installed') + ': ' + entry.r.installed + ' → ' + _('latest') + ': ' + entry.r.latest; + } else if (cmp < 0) { + meta = _('installed') + ': ' + entry.r.installed + ' · ' + _('feed version older: %s').format(entry.r.latest); + btn.disabled = true; } else { - // installed >= feed: already up to date (feed may even be older) meta = _('installed') + ': ' + entry.r.installed + ' · ' + _('up to date'); btn.disabled = true; } + const uncertain = entry.r.installed && (indexState !== 'success' || !entry.r.latest || cmp < 0); pkgBody.appendChild(mkRow( - updatable ? '↑' : (entry.r.installed ? '✓' : '✗'), - updatable ? 'dd-up-new' : (entry.r.installed ? 'dd-up-ok' : 'dd-up-err'), + updatable ? '↑' : (uncertain ? '⚠' : (entry.r.installed ? '✓' : '✗')), + updatable ? 'dd-up-new' : (uncertain ? 'dd-up-warn' : (entry.r.installed ? 'dd-up-ok' : 'dd-up-err')), entry.name, meta, btn diff --git a/luci-app-daede/po/zh-cn/daede.po b/luci-app-daede/po/zh-cn/daede.po index 7d33bedaa..82648e1f8 100644 --- a/luci-app-daede/po/zh-cn/daede.po +++ b/luci-app-daede/po/zh-cn/daede.po @@ -314,6 +314,24 @@ msgstr "已是最新" msgid "not installed via package manager" msgstr "非包管理器安装" +msgid "unsupported package version" +msgstr "已安装其他版本,无法在此升级" + +msgid "package status unavailable" +msgstr "软件包状态读取失败" + +msgid "package index refresh failed" +msgstr "软件源刷新失败,请检查网络和软件源" + +msgid "refreshing package indexes" +msgstr "正在刷新软件源" + +msgid "package not found in configured feeds" +msgstr "当前软件源中没有此包" + +msgid "feed version older: %s" +msgstr "软件源版本较旧:%s" + msgid "Unavailable" msgstr "不可用" diff --git a/luci-app-daede/root/usr/share/luci-app-daede/pkg-info.sh b/luci-app-daede/root/usr/share/luci-app-daede/pkg-info.sh index aec2c1bb7..ea6b26189 100755 --- a/luci-app-daede/root/usr/share/luci-app-daede/pkg-info.sh +++ b/luci-app-daede/root/usr/share/luci-app-daede/pkg-info.sh @@ -1,8 +1,8 @@ #!/bin/sh # pkg-info.sh -# Prints "\t" for the named package, where either field is -# empty when unknown. Used by the Updates view to decide whether to enable -# the [Upgrade] button. +# Prints "\t\t" for the named package, where either +# version is empty when unknown. Used by the Updates view to decide whether to +# enable the [Upgrade] button. PKG="$1" case "$PKG" in @@ -12,22 +12,26 @@ esac installed="" latest="" +state="absent" if command -v apk >/dev/null 2>&1; then if apk info -e "$PKG" >/dev/null 2>&1; then + state="managed" installed=$(apk list -I "$PKG" 2>/dev/null | awk -v p="$PKG" ' - $1 ~ "^" p "-" { + $1 ~ "^" p "-[0-9]" { sub("^" p "-", "", $1); print $1; exit } ') + [ -n "$installed" ] || state="error" fi # apk search treats ^ and $ as literal chars (not regex anchors), so the old # `apk search "^pkg$"` matched nothing. Enumerate the exact-name package - # across all feeds via `apk list` and take the highest version. Restricting - # to "-" avoids sibling names like -geoip / luci-app-. - latest=$(apk list "$PKG" 2>/dev/null | awk -v p="$PKG" ' + # across configured feeds via `apk list -a` and take the highest version. + # The -a flag excludes locally installed packages that are absent from feeds. + # Restricting to "-" avoids sibling names like -geoip. + latest=$(apk list -a "$PKG" 2>/dev/null | awk -v p="$PKG" ' $1 ~ "^" p "-[0-9]" { v = $1; sub("^" p "-", "", v); print v @@ -36,15 +40,22 @@ if command -v apk >/dev/null 2>&1; then elif command -v opkg >/dev/null 2>&1; then installed=$(opkg status "$PKG" 2>/dev/null | awk -F': ' '$1=="Version"{print $2; exit}') latest=$(opkg info "$PKG" 2>/dev/null | awk -F': ' '$1=="Version"{print $2; exit}') + [ -n "$installed" ] && state="managed" fi case "$PKG" in dae|daed) case "$installed" in 20[0-9][0-9].[0-9]*) ;; - *) installed="" ;; + *) [ -n "$installed" ] && state="foreign"; installed="" ;; esac ;; esac -printf '%s\t%s\n' "$installed" "$latest" +if [ "$state" = "absent" ]; then + case "$PKG" in + dae|daed) [ -x "/usr/bin/$PKG" ] && state="manual" ;; + esac +fi + +printf '%s\t%s\t%s\n' "$installed" "$latest" "$state" diff --git a/luci-app-daede/root/usr/share/luci-app-daede/refresh-index.sh b/luci-app-daede/root/usr/share/luci-app-daede/refresh-index.sh index cf6c26cc1..a9aaddb2d 100755 --- a/luci-app-daede/root/usr/share/luci-app-daede/refresh-index.sh +++ b/luci-app-daede/root/usr/share/luci-app-daede/refresh-index.sh @@ -2,20 +2,39 @@ # Background apk/opkg update for the Updates view. Returns at once; throttled. LOCK=/tmp/luci-app-daede.idx.lock +STATUS=/tmp/luci-app-daede.idx.status +LOG=/tmp/luci-app-daede.idx.log -if [ -f "$LOCK" ]; then +write_status() { + printf '%s\n' "$1" > "${STATUS}.$$" && mv "${STATUS}.$$" "$STATUS" +} + +if [ -f "$LOCK" ] && [ -f "$STATUS" ]; then mtime=$(date -r "$LOCK" +%s 2>/dev/null || echo 0) [ "$(( $(date +%s) - mtime ))" -lt 90 ] && exit 0 fi : > "$LOCK" +write_status running ( - # -n: skip if a package op holds the shared apk lock (no need to refresh then) + flock -n 9 || exit 0 + umask 077 + # Wait for package upgrades before refreshing the same apk database. if command -v apk >/dev/null 2>&1; then - flock -n /tmp/luci-app-daede.apk.lock apk update + flock /tmp/luci-app-daede.apk.lock apk update > "$LOG" 2>&1 + rc=$? elif command -v opkg >/dev/null 2>&1; then - opkg update + opkg update > "$LOG" 2>&1 + rc=$? + else + printf '%s\n' 'No supported package manager' > "$LOG" + rc=127 fi -) >/dev/null 2>&1 /tmp/luci-app-daede.idx.run.lock >/dev/null 2>&1 /dev/null 2>&1; then # shared apk lock with the bg index refresh (avoid "Unable to lock database") ( - flock 9 - apk update 2>&1 - ver=$(apk list "$PKG" 2>/dev/null | awk -v p="$PKG" '$1 ~ "^" p "-[0-9]" { v=$1; sub("^" p "-", "", v); print v }' | sort -V | tail -1) + flock 9 || exit 1 + if ! apk info -e "$PKG" >/dev/null 2>&1; then + echo "result: $PKG 未通过包管理器安装,不能在线升级" + exit 1 + fi + if ! apk update 2>&1; then + echo "result: 软件源刷新失败,请检查网络和软件源配置" + exit 1 + fi + ver=$(apk list -a "$PKG" 2>/dev/null | awk -v p="$PKG" '$1 ~ "^" p "-[0-9]" { v=$1; sub("^" p "-", "", v); print v }' | sort -V | tail -1) if [ -n "$ver" ]; then constraint="$PKG=$ver" else echo "result: 软件源中没有找到 $PKG,请检查网络或软件源配置" exit 1 fi + installed=$(apk list -I "$PKG" 2>/dev/null | awk -v p="$PKG" '$1 ~ "^" p "-[0-9]" { v=$1; sub("^" p "-", "", v); print v; exit }') + if [ -n "$installed" ] && [ "$(printf '%s\n%s\n' "$ver" "$installed" | sort -V | tail -1)" = "$installed" ]; then + echo "result: $PKG 已安装版本不低于软件源版本,无需升级" + exit 2 + fi echo "--- apk add -s $constraint ---" if ! apk add -s "$constraint" 2>&1; then @@ -66,14 +78,19 @@ fi fi echo "--- apk add $constraint ---" apk add "$constraint" 2>&1 + add_rc=$? + [ "$add_rc" -eq 0 ] || exit 1 + if ! apk list -I "$PKG" 2>/dev/null | awk -v p="$PKG" -v v="$ver" '$1 == p "-" v { found = 1 } END { exit !found }'; then + echo "result: $PKG was not upgraded to $ver" + exit 1 + fi exit 0 ) 9>/tmp/luci-app-daede.apk.lock rc=$? - if [ "$rc" != 0 ]; then + if [ "$rc" = 2 ]; then + : + elif [ "$rc" != 0 ]; then : - elif ! apk list --installed 2>/dev/null | grep -q "^${PKG}-"; then - echo "result: $PKG is not installed" - rc=1 elif apk list -u 2>/dev/null | grep -q "^${PKG}-"; then echo "result: $PKG still has a pending upgrade" rc=1 @@ -83,16 +100,26 @@ fi fi elif command -v opkg >/dev/null 2>&1; then echo "--- opkg update ---" - opkg update 2>&1 - echo "--- opkg upgrade $PKG ---" - opkg upgrade "$PKG" 2>&1 - rc=$? + if opkg update 2>&1; then + echo "--- opkg upgrade $PKG ---" + opkg upgrade "$PKG" 2>&1 + rc=$? + else + echo "result: 软件源刷新失败,请检查网络和软件源配置" + rc=1 + fi else echo "no package manager found" - exit 3 + rc=3 fi - if [ "$rc" = 0 ]; then echo "$(date '+%F %T') ✓ 完成"; else echo "$(date '+%F %T') ✗ 失败 (rc=$rc)"; fi + if [ "$rc" = 0 ]; then + echo "$(date '+%F %T') ✓ 完成" + elif [ "$rc" = 2 ]; then + echo "$(date '+%F %T') ✓ 无需升级" + else + echo "$(date '+%F %T') ✗ 失败 (rc=$rc)" + fi # luci-app-daede upgrade replaces ACL JSON — reload rpcd so changes apply. if [ "$PKG" = "luci-app-daede" ] && [ "$rc" = "0" ]; then diff --git a/luci-app-daede/root/usr/share/rpcd/acl.d/luci-app-daede.json b/luci-app-daede/root/usr/share/rpcd/acl.d/luci-app-daede.json index 01775956d..2caddd74d 100644 --- a/luci-app-daede/root/usr/share/rpcd/acl.d/luci-app-daede.json +++ b/luci-app-daede/root/usr/share/rpcd/acl.d/luci-app-daede.json @@ -20,6 +20,7 @@ "/tmp/luci-app-daede.pkg-dae.log": [ "read" ], "/tmp/luci-app-daede.pkg-daed.log": [ "read" ], "/tmp/luci-app-daede.pkg-luci-app-daede.log": [ "read" ], + "/tmp/luci-app-daede.idx.status": [ "read" ], "/tmp/luci-app-daede.backup.log": [ "read" ], "/bin/pidof dae": [ "exec" ], "/bin/pidof daed": [ "exec" ], diff --git a/luci-app-open-box/Makefile b/luci-app-open-box/Makefile index 4b8ae3ec7..a3be06458 100644 --- a/luci-app-open-box/Makefile +++ b/luci-app-open-box/Makefile @@ -1,8 +1,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-open-box -PKG_VERSION:=0.1.341 -PKG_RELEASE:=37 +PKG_VERSION:=0.1.342 +PKG_RELEASE:=38 PKG_MAINTAINER:=liandu2024 PKG_LICENSE:=GPL-3.0-or-later diff --git a/luci-app-ssr-plus/Makefile b/luci-app-ssr-plus/Makefile index 507fb656c..a0ae026aa 100644 --- a/luci-app-ssr-plus/Makefile +++ b/luci-app-ssr-plus/Makefile @@ -4,7 +4,7 @@ LUCI_TITLE:=luci-app-ssr-plus LUCI_PKGARCH:=all PKG_NAME:=luci-app-ssr-plus PKG_VERSION:=196 -PKG_RELEASE:=92 +PKG_RELEASE:=93 PKG_CONFIG_DEPENDS:= \ CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \ diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua index cd3e59b86..ce8602314 100644 --- a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua @@ -473,6 +473,7 @@ o:value("shadowsocks", translate("ShadowSocks")) if is_finded("xray") then o:value("wireguard", translate("WireGuard")) o:value("naive", "NaiveProxy (Xray / Cronet)") + o:value("shadowsocksr", "ShadowsocksR (Xray)") end if is_finded("xray") then o:value("hysteria2", translate("Hysteria2")) @@ -565,6 +566,7 @@ o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) o:depends({type = "v2ray", v2ray_protocol = "trojan"}) o:depends({type = "v2ray", v2ray_protocol = "anytls"}) o:depends({type = "v2ray", v2ray_protocol = "naive"}) +o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"}) for _, field in ipairs({ {"anytls_idle_session_check_interval", "Idle session check interval (seconds)", "30"}, @@ -665,6 +667,7 @@ o:depends("type", "ssr") o = s:option(Value, "protocol_param", translate("Protocol param (optional)")) o:depends("type", "ssr") +o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"}) o = s:option(ListValue, "obfs", translate("Obfs")) for _, v in ipairs(obfs) do @@ -675,7 +678,20 @@ o:depends("type", "ssr") o = s:option(Value, "obfs_param", translate("Obfs param (optional)")) o:depends("type", "ssr") +o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"}) +-- Xray uses Mihomo's SSR registry, which differs from legacy libev. +for _, field in ipairs({ + {"ssr_method", "Encrypt Method", {"aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "rc4-md5", "chacha20", "chacha20-ietf", "xchacha20", "none"}}, + {"ssr_protocol", "Protocol", {"origin", "auth_sha1_v4", "auth_aes128_md5", "auth_aes128_sha1", "auth_chain_a", "auth_chain_b"}}, + {"ssr_obfs", "Obfs", {"plain", "http_simple", "http_post", "random_head", "tls1.2_ticket_auth", "tls1.2_ticket_fastauth"}} +}) do + o = s:option(ListValue, field[1], translate(field[2])) + for _, value in ipairs(field[3]) do o:value(value) end + o.default = field[3][1] + o.rmempty = false + o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"}) +end -- [[ Hysteria2 ]]-- o = s:option(Flag, "hysteria2_realms", translate("Hysteria2 Realms")) @@ -1421,7 +1437,7 @@ if protocols and type(protocols) == "table" and #protocols > 0 then if not proto:find("^_") then if proto == "hysteria2" then o:depends({type = "v2ray", v2ray_protocol = "hysteria2", hysteria2_realms = false}) - elseif proto ~= "socks" and proto ~= "http" then + elseif proto ~= "socks" and proto ~= "http" and proto ~= "shadowsocksr" then o:depends({type = "v2ray", v2ray_protocol = proto}) end end diff --git a/luci-app-ssr-plus/root/etc/init.d/shadowsocksr b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr index 972d0239f..36cb409d6 100755 --- a/luci-app-ssr-plus/root/etc/init.d/shadowsocksr +++ b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr @@ -992,8 +992,8 @@ use_mihomo_for_ss_rust_server() { } start_v2ray_with_mihomo() { - # Naive requires the Cronet-enabled Xray build. Never fall back to Mihomo. - [ "$(uci_get_by_name "$1" v2ray_protocol)" = "naive" ] && return 1 + # These nodes use Xray-specific settings. + case "$(uci_get_by_name "$1" v2ray_protocol)" in naive|shadowsocksr) return 1 ;; esac local sid="$1" local local_port="$2" local socks_port="$3" @@ -1798,7 +1798,7 @@ start_udp() { ;; v2ray) enable_mihomo=$(uci_get_by_type server_subscribe enable_mihomo "") - if [ "$(uci_get_by_name "$UDP_RELAY_SERVER" v2ray_protocol)" != "naive" ] && [ "$enable_mihomo" = "1" ] && has_mihomo_binary; then + if [ "$(uci_get_by_name "$UDP_RELAY_SERVER" v2ray_protocol)" != "naive" ] && [ "$(uci_get_by_name "$UDP_RELAY_SERVER" v2ray_protocol)" != "shadowsocksr" ] && [ "$enable_mihomo" = "1" ] && has_mihomo_binary; then redir_udp=0 ARG_UDP="" echolog "UDP TPROXY Relay:V2Ray/Xray 单节点由主 Mihomo 实例处理。" @@ -1811,7 +1811,7 @@ start_udp() { echolog "UDP TPROXY Relay:$($(first_type xray) version | head -1) Started!" else # Xray 不存在但 Mihomo 存在,回退到 Mihomo(当 enable_mihomo=0 时) - if [ "$(uci_get_by_name "$UDP_RELAY_SERVER" v2ray_protocol)" != "naive" ] && has_mihomo_binary; then + if [ "$(uci_get_by_name "$UDP_RELAY_SERVER" v2ray_protocol)" != "naive" ] && [ "$(uci_get_by_name "$UDP_RELAY_SERVER" v2ray_protocol)" != "shadowsocksr" ] && has_mihomo_binary; then redir_udp=0 ARG_UDP="" echolog "UDP TPROXY Relay:Xray 内核不存在,已回退到 Mihomo 内核启动。" diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua index 3accbf240..710cb8242 100755 --- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua @@ -363,6 +363,14 @@ function outbound:handleIndex(index) trojan = function() trojan_shadowsocks() end, + shadowsocksr = function() + outbound_settings = { + address = server.server, port = tonumber(server.server_port), + password = server.password, method = server.ssr_method or "aes-128-cfb", + protocol = server.ssr_protocol or "origin", protocolParam = server.protocol_param, + obfs = server.ssr_obfs or "plain", obfsParam = server.obfs_param + } + end, shadowsocks = function() trojan_shadowsocks() end, @@ -891,8 +899,9 @@ Xray.outbounds = { } } --- Cronet owns TLS and multiplexing. Preserve Xray socket marks and dialer chains. -if server.v2ray_protocol == "naive" then +-- Naive owns TLS/multiplexing; SSR owns obfuscation and uses native UDP. +-- Preserve Xray socket marks and dialer chains for both. +if server.v2ray_protocol == "naive" or server.v2ray_protocol == "shadowsocksr" then local ob = Xray.outbounds[1] ob.streamSettings = { network = "raw", sockopt = ob.streamSettings.sockopt } ob.mux = nil diff --git a/smartdns/Makefile b/smartdns/Makefile index be35f02e0..d3e0ecf96 100644 --- a/smartdns/Makefile +++ b/smartdns/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2018-2025 Nick Peng (pymumu@gmail.com) +# Copyright (c) 2018-2026 Nick Peng (pymumu@gmail.com) # This is free software, licensed under the GNU General Public License v3. # @@ -7,18 +7,18 @@ include $(TOPDIR)/rules.mk PKG_NAME:=smartdns PKG_VERSION:=1.2026.48.4 -PKG_RELEASE:=6 -PKG_TAGS=1.2026.v48.4.3-canary_with_ui-canary-canary +PKG_RELEASE:=7 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_TAGS).tar.gz -PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_TAGS) -PKG_SOURCE_URL:=https://codeload.github.com/PikuZheng/smartdns/tar.gz/$(PKG_TAGS)? -PKG_HASH:=skip +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://www.github.com/pymumu/smartdns.git +PKG_MIRROR_HASH:=skip +PKG_SOURCE_VERSION:=21c940edc65520849ba03544c5cf8d9cf326e680 -SMARTDNS_WEBUI_SOURCE_URL:=https://codeload.github.com/PikuZheng/smartdns-webui/tar.gz -SMARTDNS_WEBUI_SOURCE_VERSION:=4667a7dae18b9776576cda6c98be649703fe671a -SMARTDNS_WEBUI_FILE:=smartdns-webui-$(SMARTDNS_WEBUI_SOURCE_VERSION).tar.gz -SMARTDNS_WEBUI_HASH:=422c920f825b1570f76f1c7d9c2a74bf1c422fddb4f304a0fcb9a1229bc50580 +SMARTDNS_WEBUI_VERSION:=1.0.0 +SMARTDNS_WEBUI_SOURCE_PROTO:=git +SMARTDNS_WEBUI_SOURCE_URL:=https://github.com/pymumu/smartdns-webui.git +SMARTDNS_WEBUI_SOURCE_VERSION:=1c06fee693434ec7c71f06010d3f87416baba9f0 +SMARTDNS_WEBUI_FILE:=smartdns-webui-$(SMARTDNS_WEBUI_VERSION).tar.gz PKG_MAINTAINER:=Nick Peng PKG_LICENSE:=GPL-3.0-or-later @@ -114,18 +114,19 @@ endef define Download/smartdns-webui FILE:=$(SMARTDNS_WEBUI_FILE) + PROTO:=$(SMARTDNS_WEBUI_SOURCE_PROTO) URL:=$(SMARTDNS_WEBUI_SOURCE_URL) - URL_FILE:=$(SMARTDNS_WEBUI_SOURCE_VERSION) + MIRROR_HASH:=88adb092ed7b0dc22b3964249f4969870d3b462c4d924aceb18784c0f664f16e + VERSION:=$(SMARTDNS_WEBUI_SOURCE_VERSION) HASH:=skip + SUBDIR:=smartdns-webui endef $(eval $(call Download,smartdns-webui)) ifdef CONFIG_PACKAGE_smartdns-ui define Build/Prepare $(call Build/Prepare/Default) - $(INSTALL_DIR) $(PKG_BUILD_DIR)/smartdns-webui - $(TAR) -xzf $(DL_DIR)/$(SMARTDNS_WEBUI_FILE) \ - -C $(PKG_BUILD_DIR)/smartdns-webui --strip-components=1 + $(TAR) -C $(PKG_BUILD_DIR)/ -xf $(DL_DIR)/$(SMARTDNS_WEBUI_FILE) endef endif @@ -139,4 +140,4 @@ endef $(eval $(call BuildPackage,smartdns)) $(eval $(call RustBinPackage,smartdns-ui)) -$(eval $(call BuildPackage,smartdns-ui)) +$(eval $(call BuildPackage,smartdns-ui)) \ No newline at end of file