diff --git a/luci-app-amlogic/Makefile b/luci-app-amlogic/Makefile index 86a9d5b3..1edfdb6f 100644 --- a/luci-app-amlogic/Makefile +++ b/luci-app-amlogic/Makefile @@ -16,7 +16,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-amlogic -PKG_VERSION:=3.1.310 +PKG_VERSION:=3.1.312 PKG_RELEASE:=2 PKG_LICENSE:=GPL-2.0 License diff --git a/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/info.js b/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/info.js index fa5beb12..ce9f8d27 100644 --- a/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/info.js +++ b/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/info.js @@ -60,9 +60,27 @@ return view.extend({ handleReset: null, load: function () { - // Fire sync_menu in background (don't block render on it). - callSyncMenu().catch(function () {}); - return callAuthor(); + // Call sync_menu and wait for it. sync_menu writes menu_install / + // menu_armcpu into UCI and clears the LuCI index cache on the server. + // On first boot from USB the install menu may be missing from the + // browser-side navigation (built before sync_menu ran). After the RPC + // returns we check if the sidebar already has an install link; if not, + // reload once so the browser re-fetches the updated menu tree. + // A URL hash flag (#menu-synced) prevents an infinite reload loop. + const alreadyReloaded = window.location.hash === '#menu-synced'; + const syncMenuPromise = callSyncMenu().then(function (res) { + if (alreadyReloaded) return; + if (res && res.show_install === 'yes') { + // Check if the sidebar navigation already contains the install link. + const installLink = document.querySelector('a[href*="amlogic/install"]'); + if (!installLink) { + // Server has updated the index cache; reload to pick up new nav. + window.location.replace(window.location.pathname + '#menu-synced'); + window.location.reload(); + } + } + }).catch(function () {}); + return Promise.all([callAuthor(), syncMenuPromise]).then(function (r) { return r[0]; }); }, render: function (authorUrl) { diff --git a/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/upload.js b/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/upload.js index da246cf9..4bad71e5 100644 --- a/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/upload.js +++ b/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/upload.js @@ -69,7 +69,7 @@ return view.extend({ value: _('Update OpenWrt firmware'), style: 'display:none', click: ui.createHandlerFn(this, function (ev) { return doButton(ev.currentTarget, - _('Updating...'), _('Successful Update'), _('Update Failed'), + _('Updating...'), _('Update Failed'), function () { return callStartUpd('auto@updated@/tmp'); }); }) }); @@ -78,7 +78,7 @@ return view.extend({ value: _('Replace OpenWrt Kernel'), style: 'display:none; margin-left:5px', click: ui.createHandlerFn(this, function (ev) { return doButton(ev.currentTarget, - _('Updating...'), _('Successful Update'), _('Update Failed'), + _('Updating...'), _('Update Failed'), function () { return callStartKnl(); }); }) }); @@ -86,13 +86,23 @@ return view.extend({ const knLog = E('span'); const fwVer = E('span', _('Collecting data...')); - function doButton(btn, busyText, ok, fail, fn) { - // Shared button state machine: disabled -> RPC -> success/fail label. + function doButton(btn, busyText, fail, fn) { + // Shared button state machine: disabled -> RPC -> updating/fail label. + // On success (code==0) the button stays in busyText state and + // remains disabled — the device is about to reboot, so there is + // nothing to restore. Only on failure do we surface an error and + // re-enable the button so the user can retry. btn.disabled = true; btn.value = busyText; return Promise.resolve(fn()).then(function (r) { - btn.value = (r && r.code == 0) ? ok : fail; - }).catch(function () { btn.value = fail; }) - .finally(function () { btn.disabled = false; }); + if (!r || r.code !== 0) { + btn.value = fail; + btn.disabled = false; + } + // code == 0 → keep busyText + disabled (update in progress) + }).catch(function () { + btn.value = fail; + btn.disabled = false; + }); } function refreshList() { diff --git a/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic b/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic index a9d5f300..d5b177b6 100644 --- a/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic +++ b/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic @@ -752,7 +752,8 @@ function m_sync_menu() { const show_armcpu = (index(p, 'qemu') < 0) ? 'yes' : 'no'; shcall('uci -q set amlogic.config.menu_install=' + shq(show_install) + ' && uci -q set amlogic.config.menu_armcpu=' + shq(show_armcpu) + - ' && uci commit amlogic'); + ' && uci commit amlogic' + + ' && rm -f /tmp/luci-indexcache* && rm -rf /tmp/luci-modulecache/*'); return { code: 0, show_install, show_armcpu }; } diff --git a/luci-app-passwall/luasrc/passwall/util_xray.lua b/luci-app-passwall/luasrc/passwall/util_xray.lua index f922c5c4..4cc49322 100644 --- a/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -775,6 +775,9 @@ function gen_config_server(node) config.outbounds[index][k] = nil end end + if value.protocol == "freedom" and api.compare_versions(xray_version, "<", "26.5.3") then -- Todo is to remove it + value.settings = nil + end end return config @@ -1245,9 +1248,9 @@ function gen_config(var) interface = node.iface } }, - settings = { + settings = (api.compare_versions(xray_version, ">", "26.4.25")) and { -- Todo: Remove version check finalRules = {{ action = "allow" }} - } + } or nil } sys.call(string.format("mkdir -p %s && touch %s/%s", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.iface)) end @@ -2023,7 +2026,12 @@ function gen_proto_config(var) -- 额外传出连接 table.insert(outbounds, { - protocol = "freedom", tag = "direct", settings = {finalRules = {{ action = "allow" }}}, sockopt = {mark = 255} + protocol = "freedom", + tag = "direct", + settings = (api.compare_versions(xray_version, ">", "26.4.25")) and { -- Todo: Remove version check + finalRules = {{ action = "allow" }} + } or nil, + sockopt = {mark = 255} }) local config = { diff --git a/qt6base/Makefile b/qt6base/Makefile index b6ce71ec..9137be1a 100644 --- a/qt6base/Makefile +++ b/qt6base/Makefile @@ -7,12 +7,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=qt6base -PKG_VERSION:=6.11.0 +PKG_VERSION:=6.11.1 PKG_RELEASE:=1 PKG_SOURCE:=qtbase-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/qt/qtbase/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=92c107e3340661da5fca50739f83669216914c21ae43519296267b63f0b97a81 +PKG_HASH:=e20852bd45cdef5da5175f3634e285e03e2be7ca437f3d2b7e1a2af7321bca7a HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/qtbase-$(PKG_VERSION) PKG_BUILD_DIR:=$(BUILD_DIR)/qtbase-$(PKG_VERSION) diff --git a/qt6tools/Makefile b/qt6tools/Makefile index 53bf5916..2271996b 100644 --- a/qt6tools/Makefile +++ b/qt6tools/Makefile @@ -7,12 +7,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=qt6tools -PKG_VERSION:=6.11.0 +PKG_VERSION:=6.11.1 PKG_RELEASE:=1 PKG_SOURCE:=qttools-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/qt/qttools/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=eebd01263cde5e6d2bbc0266a622fa0ea7da3f01a3a44497340002d7fff29059 +PKG_HASH:=3b4df61a3941f937c24afda66bdd7e1cfe877eb467e61ac897e97bca3ea7347e HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/qttools-$(PKG_VERSION)