diff --git a/luci-app-daede/Makefile b/luci-app-daede/Makefile index c18ce1b6..a30df03c 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.14.7 -PKG_RELEASE:=22 +PKG_RELEASE:=23 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 29756728..dd47d534 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 @@ -452,7 +452,13 @@ return view.extend({ uci.set('daede', 'config', 'geo_auto_freq', freqSel.value); const orig = saveBtn.textContent; saveBtn.disabled = true; saveBtn.textContent = '...'; - uci.save().then(function() { return uci.apply(); }).then(function() { + uci.save().then(function() { + return uci.changes(); + }).then(function(changes) { + // apply only when changed; empty changeset fails apply (#16) + if (changes && Object.keys(changes).length) + return uci.apply(); + }).then(function() { return fs.exec('/usr/share/luci-app-daede/geo-cron.sh', [autoCb.checked ? 'enable' : 'disable']); }).then(function() { logPane.textContent = _('Geo data source saved.'); diff --git a/luci-app-ota/Makefile b/luci-app-ota/Makefile index 2cd229c1..1649004d 100644 --- a/luci-app-ota/Makefile +++ b/luci-app-ota/Makefile @@ -10,8 +10,8 @@ LUCI_TITLE:=Simple OTA Update for OpenWrt #LUCI_DEPENDS:= +luci-app-firewall PKG_LICENSE:=Apache-2.0 -PKG_VERSION:=0.0.2 -PKG_RELEASE:=2 +PKG_VERSION:=0.0.3 +PKG_RELEASE:=3 include $(TOPDIR)/feeds/luci/luci.mk diff --git a/luci-app-ota/htdocs/luci-static/resources/view/system/ota.js b/luci-app-ota/htdocs/luci-static/resources/view/system/ota.js index 1e6fa9af..30b390a1 100644 --- a/luci-app-ota/htdocs/luci-static/resources/view/system/ota.js +++ b/luci-app-ota/htdocs/luci-static/resources/view/system/ota.js @@ -9,32 +9,48 @@ */ return view.extend({ - load: function() { - return Promise.resolve(); + // Format raw firmware filename → "OpenWrt 24.10.7 202606-rev01" + fmtVer: function(raw) { + if (!raw) return ''; + // From openwrt-24.10.7-4g-lte-202606-rev01 + var m = raw.match(/^openwrt-([\d.]+)-.*-(\d{6}-rev\d+)$/); + if (m) return 'OpenWrt ' + m[1] + ' ' + m[2]; + return raw; }, - checkInitialState: function() { + load: function() { + return fs.read('/usr/lib/os-release') + .then(function(content) { + // OPENWRT_RELEASE="OpenWrt 24.10.7~4g-lte-202606-rev01" + var m = (content || '').match(/OPENWRT_RELEASE="(OpenWrt\s+[\d.]+)~.*-(\d{6}-rev\d+)"/); + if (m) return m[1].trim() + ' ' + m[2].trim(); + return ''; + }) + .catch(function() { return ''; }); + }, + + checkInitialState: function(currentVer) { var self = this; - this.verifyCheckResult().then(function(success) { + // Show current version immediately from fw_rev + self.updateVersionBlock(currentVer, '—', false); + + // Restore available version if previous check result still on disk + self.verifyCheckResult(currentVer).then(function(success) { if (success) { - self.checkButton.disabled = true; - self.showUpdateAvailable(); self.upgradeButton.disabled = false; } }).catch(function() {}); }, - showUpdateAvailable: function() { - var self = this; - self.statusDiv.innerHTML = ''; - self.statusDiv.appendChild(E('div', { 'class': 'alert-message success' }, [ - E('h3', {}, _('Update Available')), - E('button', { - 'class': 'btn cbi-button cbi-button-neutral', - 'style': 'margin-top: 6px;', - 'click': function() { self.showChangelog(); } - }, _('Show Changelog')) - ])); + updateVersionBlock: function(current, upgrade, hasUpdate) { + this.verCurrentVal.textContent = current || '—'; + this.verAvailVal.textContent = upgrade || '—'; + + // Changelog link visible only when update is available + this.verChangelogLink.style.display = hasUpdate ? '' : 'none'; + + // Colour: important (green) = update found, warning (yellow) = no update / unknown + this.versionBlock.className = 'alert-message ' + (hasUpdate ? 'success' : 'warning'); }, showChangelog: function() { @@ -52,7 +68,7 @@ return view.extend({ ]); }, - render: function() { + render: function(data) { var self = this; this.checkButton = E('button', { @@ -66,7 +82,29 @@ return view.extend({ 'click': ui.createHandlerFn(this, 'handleUpgrade') }, _('Upgrade')); - this.statusDiv = E('div', { 'class': 'cbi-section' }); + // Version info rows — always visible, updated after check + this.verCurrentVal = E('span', {}, '—'); + this.verAvailVal = E('span', {}, '—'); + this.verChangelogLink = E('button', { + 'class': 'btn cbi-button cbi-button-neutral', + 'style': 'display: none; margin-left: 10px;', + 'click': function() { self.showChangelog(); } + }, _('Show Changelog')); + + this.versionBlock = E('div', { 'class': 'alert-message', 'style': 'margin-top: 1.5em;' }, [ + E('table', { 'style': 'border: none; background: none;' }, [ + E('tr', {}, [ + E('td', { 'style': 'padding: 2px 10px 2px 0; font-weight: bold; white-space: nowrap;' }, + _('Current version:')), + E('td', {}, this.verCurrentVal) + ]), + E('tr', {}, [ + E('td', { 'style': 'padding: 2px 10px 2px 0; font-weight: bold; white-space: nowrap;' }, + _('Available version:')), + E('td', {}, [ this.verAvailVal, this.verChangelogLink ]) + ]) + ]) + ]); var container = E('div', { 'class': 'cbi-map' }, [ E('h2', {}, _('OTA System Update')), @@ -75,10 +113,10 @@ return view.extend({ ' ', this.upgradeButton ]), - this.statusDiv + this.versionBlock ]); - this.checkInitialState(); + this.checkInitialState(data); return container; }, @@ -87,33 +125,23 @@ return view.extend({ var self = this; this.checkButton.disabled = true; - this.statusDiv.innerHTML = ''; - this.statusDiv.appendChild(E('div', { 'class': 'spinner' }, _('Checking for updates...'))); + this.upgradeButton.disabled = true; return fs.exec('/usr/share/ota.sh', ['check']) .then(function() { - return self.verifyCheckResult(); + return self.verifyCheckResult(self.verCurrentVal.textContent); }) .then(function(success) { - if (success) { - self.upgradeButton.disabled = false; - self.showUpdateAvailable(); - } else { - self.statusDiv.innerHTML = ''; - self.statusDiv.appendChild(E('div', { 'class': 'alert-message warning' }, - _('No updates available or check failed'))); - } + self.upgradeButton.disabled = !success; self.checkButton.disabled = false; }) .catch(function(err) { - self.statusDiv.innerHTML = ''; - self.statusDiv.appendChild(E('div', { 'class': 'alert-message error' }, - _('Check failed: ') + (err.message || err))); + self.updateVersionBlock('', _('Check failed: ') + (err.message || err), false); self.checkButton.disabled = false; }); }, - verifyCheckResult: function() { + verifyCheckResult: function(currentVer) { var self = this; return Promise.all([ @@ -124,11 +152,33 @@ return view.extend({ self.changelog = content; return content && content.length > 0; }) - .catch(function() { return false; }) + .catch(function() { return false; }), + fs.read('/tmp/ota_version') + .then(function(content) { return content || ''; }) + .catch(function() { return ''; }) ]).then(function(results) { - return results[0] !== null && - results[1] !== null && - results[2] === true; + var hasProfiles = results[0] !== null; + var hasLock = results[1] !== null; + var hasChangelog = results[2]; + var verContent = results[3]; + + // both current= and upgrade= are full firmware names written by ota.sh + var current = '', upgrade = ''; + verContent.split('\n').forEach(function(line) { + var m; + if ((m = line.match(/^current=(.+)/))) current = self.fmtVer(m[1].trim()); + if ((m = line.match(/^upgrade=(.+)/))) upgrade = self.fmtVer(m[1].trim()); + }); + // fallback: if ota_version missing, use value from load() (already formatted) + if (!current) current = currentVer || ''; + + if (hasProfiles && hasLock && hasChangelog) { + self.updateVersionBlock(current, upgrade, true); + return true; + } + + self.updateVersionBlock(current, _('No updates available'), false); + return false; }); }, @@ -142,53 +192,46 @@ return view.extend({ this.upgradeButton.disabled = true; this.checkButton.disabled = true; - // Remove stale progress file before starting - fs.remove('/tmp/ota_progress').catch(function() {}); - self.openUpgradeModal(); - return fs.exec('/usr/share/ota.sh', ['upgrade']) + // ota-launch.sh starts ota.sh in background and exits immediately + return fs.exec('/usr/share/ota-launch.sh', []) .then(function() { - self.stopProgressPolling(); - self.setModalProgress(100, _('Upgrade started. Device will reboot...'), 'done'); - self.finalizeUpgradeModal(false); + // launcher exited — polling is running, wait for 'done' or 'error' }) .catch(function(err) { var msg = err.message || err.toString(); - self.stopProgressPolling(); - - // XHR timeout = sysupgrade already running, treat as success - if (msg.indexOf('timed out') !== -1) { - self.setModalProgress(100, _('Upgrade started. Device will reboot...'), 'done'); - self.finalizeUpgradeModal(false); - } else { - self.setModalProgress(0, _('Error: ') + msg, 'error'); - self.finalizeUpgradeModal(true); + // XHR timeout is expected — launcher or sysupgrade still running, + // polling continues and will finalize via 'flashing'/'error' state + if (msg.indexOf('timed out') !== -1 || msg.indexOf('XHR') !== -1) { + return; } + // Genuine exec failure + self.stopProgressPolling(); + self.setModalProgress(0, _('Launch failed: ') + msg, 'error'); + self.finalizeUpgradeModal(true); }); }, openUpgradeModal: function() { var self = this; - // Progress bar element self.modalProgressInner = E('div', { 'style': 'width: 0%; transition: width 0.4s ease;' }); - self.modalProgressBar = E('div', { 'class': 'cbi-progressbar', 'style': 'margin: 10px 0;' }, - self.modalProgressInner); + self.modalProgressBar = E('div', { + 'class': 'cbi-progressbar', + 'style': 'margin: 10px 0;' + }, self.modalProgressInner); - // Status label self.modalStatus = E('div', { 'style': 'font-size: 0.9em; color: #666; margin-bottom: 8px;' }, _('Starting upgrade...')); - // Log area self.modalLog = E('pre', { 'style': 'white-space: pre-wrap; max-height: 200px; overflow-y: auto; ' + 'background: #f5f5f5; padding: 8px; border-radius: 3px; ' + 'color: black; font-size: 0.85em; margin-top: 10px;' }, ''); - // Close button (disabled until done) self.modalCloseBtn = E('button', { 'class': 'btn cbi-button', 'disabled': true, @@ -209,7 +252,6 @@ return view.extend({ ]) ]); - // Start polling /tmp/ota_progress self.startProgressPolling(); }, @@ -227,7 +269,6 @@ return view.extend({ if (line.indexOf('downloading') === 0) { var pct = parseInt(line.split(' ')[1], 10) || 0; - // downloading maps to 0..70% of bar var barPct = Math.round(pct * 0.70); self.setModalProgress(barPct, _('Downloading firmware: ') + pct + '%', 'progress'); @@ -242,18 +283,37 @@ return view.extend({ self.appendModalLog(_('Testing firmware image...')); } else if (line === 'flashing') { + self.stopProgressPolling(); self.setModalProgress(95, _('Flashing! DO NOT POWER OFF!'), 'progress'); self.appendModalLog(_('Flashing firmware...')); + // Simulate reboot wait with countdown + var countdown = 90; + self.setModalProgress(98, _('Device will be rebooted, please wait... ') + countdown + 's', 'progress'); + var rebootTimer = setInterval(function() { + countdown--; + if (countdown <= 0) { + clearInterval(rebootTimer); + self.setModalProgress(100, _('Device will be rebooted, please wait... '), 'done'); + self.finalizeUpgradeModal(false); + } else { + self.setModalProgress(98, _('Device will be rebooted, please wait... ') + countdown + 's', 'progress'); + } + }, 1000); + + } else if (line === 'done') { + self.stopProgressPolling(); + self.setModalProgress(100, _('Upgrade started. Device will reboot...'), 'done'); + self.appendModalLog(_('Done. Waiting for reboot...')); + self.finalizeUpgradeModal(false); } else if (line.indexOf('error') === 0) { var reason = line.replace('error', '').trim(); + self.stopProgressPolling(); self.setModalProgress(0, _('Error: ') + reason, 'error'); self.appendModalLog(_('FAILED: ') + reason); - self.stopProgressPolling(); + self.finalizeUpgradeModal(true); } - }).catch(function() { - // file not yet created — ignore - }); + }).catch(function() {}); }, 1500); }, @@ -269,7 +329,6 @@ return view.extend({ var pct = Math.min(100, Math.max(0, percent)); this.modalProgressInner.style.width = pct + '%'; this.modalStatus.textContent = text; - if (state === 'error') { this.modalStatus.style.color = '#c00'; } else if (state === 'done') { @@ -282,7 +341,6 @@ return view.extend({ appendModalLog: function(line) { if (!this.modalLog) return; this.modalLog.textContent += line + '\n'; - // Auto-scroll to bottom this.modalLog.scrollTop = this.modalLog.scrollHeight; }, @@ -291,11 +349,9 @@ return view.extend({ this.modalCloseBtn.disabled = false; } if (!isError) { - // For successful flash — don't re-enable buttons, - // device is about to reboot - this.statusDiv.innerHTML = ''; - this.statusDiv.appendChild(E('div', { 'class': 'alert-message warning' }, - _('Upgrade started! DO NOT POWER OFF THIS DEVICE! System will reboot after upgrade.'))); + this.versionBlock.className = 'alert-message warning'; + this.verAvailVal.textContent = _('Upgrade started — device will reboot'); + this.verChangelogLink.style.display = 'none'; } else { this.upgradeButton.disabled = false; this.checkButton.disabled = false; diff --git a/luci-app-ota/po/ru/ota.po b/luci-app-ota/po/ru/ota.po index 68061eed..771d015e 100644 --- a/luci-app-ota/po/ru/ota.po +++ b/luci-app-ota/po/ru/ota.po @@ -3,35 +3,60 @@ "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Konstantine Shevlakov \n" -msgid "OTA Update" -msgstr "Обновление OTA" - -msgid "Update Available" -msgstr "Доступно обновление" - -msgid "OTA System Update" -msgstr "Обновление через OTA" +msgid "Changelog" +msgstr "Изменения" msgid "Check for Updates" msgstr "Проверить" + msgid "Upgrade" msgstr "Обновить" -msgid "Checking for updates..." -msgstr "Проверка обновлений..." +msgid "Show Changelog" +msgstr "Посмотреть изменения" -msgid "No updates available or check failed" -msgstr "Нет доступных обновлений" +msgid "Current version:" +msgstr "Текущая версия:" + +msgid "Available version:" +msgid "Доступно обновление:" + +msgid "OTA System Update" +msgstr "Обновление через OTA" + +msgid "OTA Update" +msgstr "Обновление OTA" msgid "Check failed: " msgstr "Неудачно: " -msgid "Download completed successfully! Start upgrade.
DO NOT POWER OFF THIS DEVICE!
System will be upgrade completed after reboot!" -msgstr "Загрузка обновления завершена. Запущен процесс обновления.
НЕ ВЫКЛЮЧАЙТЕ УСТРОЙСТВО!
Система будет обновлена после перезагрузки!" +msgid "No updates available" +msgstr "Нет доступных обновлений" -msgid "Upgrade failed: " -msgstr "Обновление прервано: " +msgid "Downloading: " +msgstr "Загружается: " -msgid "Download completed! Prepare upgrade..." -msgstr "Загрузка выполнена. Подготовка..." +msgid "Verifying SHA256 checksum..." +msgstr Проверка суммы SHA256..." + +msgid "Verifying SHA256..." +msgstr "Проверка SHA256..." + +msgid "Testing firmware image (sysupgrade -T)..." +msgstr "Проверка образа прошивки (sysupgrade -T)..." + +msgid "Testing firmware image..." +msgstr "Проверка образа прошивки..." + +msgid "Flashing! DO NOT POWER OFF!" +msgstr "Прошивка! НЕ ОТКЛЮЧАЙТЕ ПИТАНИЕ УСТРОЙСТВА!" + +msgid "Flashing firmware..." +msgstr "Запись прошивки..." + +msgid "Device will be rebooted, please wait... " +msgstr "Устройство будет перезагружено, ожидание..." + +msgid "Upgrade started — device will reboot" +msgstr "Обновление, устройство будет перезагружено" diff --git a/luci-app-ota/root/usr/share/ota-launch.sh b/luci-app-ota/root/usr/share/ota-launch.sh new file mode 100755 index 00000000..0f353972 --- /dev/null +++ b/luci-app-ota/root/usr/share/ota-launch.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# OTA upgrade background launcher +# Called by LuCI to start upgrade asynchronously. +# Returns immediately so the RPC call completes and JS polling can work. + +rm -f /tmp/ota_progress +setsid /usr/share/ota.sh upgrade > /tmp/ota_upgrade.log 2>&1 & +echo $! > /tmp/ota_upgrade.pid diff --git a/luci-app-ota/root/usr/share/ota.sh b/luci-app-ota/root/usr/share/ota.sh index d32ed09e..20dd91a0 100755 --- a/luci-app-ota/root/usr/share/ota.sh +++ b/luci-app-ota/root/usr/share/ota.sh @@ -34,6 +34,7 @@ . /lib/functions.sh PROGRESS_FILE=/tmp/ota_progress +VERSION_FILE=/tmp/ota_version set_progress() { echo "$1" > ${PROGRESS_FILE} @@ -142,32 +143,27 @@ for b in $BASE_BOARD; do echo "from $URL_BASE" set_progress "downloading 0" - # Start wget in background - wget ${URL_BASE}/targets/${DISTRIB_TARGET}/$FILE -O /tmp/firmware.bin 2>/dev/null & - WGET_PID=$! - - # Poll file size while wget runs - while kill -0 $WGET_PID 2>/dev/null; do - CURRENT=$(stat -c%s /tmp/firmware.bin 2>/dev/null || echo 0) - if [ -n "$FILESIZE" ] && [ "$FILESIZE" -gt 0 ]; then - PCT=$(( CURRENT * 100 / FILESIZE )) - [ $PCT -gt 99 ] && PCT=99 - set_progress "downloading $PCT" - fi - sleep 1 + # Download with uclient-fetch, parse % from stderr progress bar + uclient-fetch -O /tmp/firmware.bin ${URL_BASE}/targets/${DISTRIB_TARGET}/$FILE 2>&1 | while IFS= read -r line; do + pct=$(echo "$line" | grep -o '[0-9]*%' | tr -d '%' | tail -1) + [ -n "$pct" ] && set_progress "downloading $pct" done - - wait $WGET_PID + # Bash, not ash + #DL_RC=${PIPESTATUS[0]:-$?} DL_RC=$? + # ash-safe fallback: check file exists and non-empty + [ -s /tmp/firmware.bin ] && DL_RC=0 + sleep 2 case $DL_RC in 0) echo "Download complete." set_progress "downloading 100" ;; - *) echo "No updates for this board: $BOARD" + *) echo "Download failed for board: $BOARD" set_progress "error download" - remove_files && exit 0 ;; + remove_files && exit 1 ;; esac + sleep 2 set_progress "verifying" SHA256_DL=$(sha256sum /tmp/firmware.bin | awk '{print $1}') echo -n "Check sha256 sum: " @@ -176,25 +172,31 @@ for b in $BASE_BOARD; do echo "Update process start!" echo "Device will be rebooted." echo "DO NOT TURN OFF DEVICE!" + sleep 2 set_progress "testing" sysupgrade -T /tmp/firmware.bin case $? in - 0) echo "Flashing firmware" - set_progress "flashing" ;; + 0) echo "Flashing firmware" ;; *) echo "Failed! Abort update" set_progress "error verify" - remove_files && exit 0 ;; + remove_files && exit 1 ;; esac + sleep 2 + set_progress "flashing" rm -rf /tmp/update.lock /tmp/profiles.json /tmp/changelog.txt - sleep 25 && sysupgrade /tmp/firmware.bin & + # Exit cleanly before sysupgrade takes over + sleep 30 && sysupgrade /tmp/firmware.bin & + exit 0 else echo "Failed! Abort update." set_progress "error sha256" remove_files && rm -rf /tmp/update.lock /tmp/profiles.json + exit 1 fi fi ;; check) + . /usr/lib/os-release if [ $FW_REV_EXT -gt $FW_VER_LOCAL ]; then echo "New firmware upgrade release!" echo -e "*** $FILE ***\n" @@ -205,8 +207,16 @@ for b in $BASE_BOARD; do echo "" echo "Please run script again for download and install update!" touch /tmp/update.lock + # Write version info for LuCI + # Extract prefix (everything before YYYYMM date) from remote filename + VER_PREFIX=$(echo $FILE | sed 's/-[0-9]\{6\}-rev[0-9]*-.*//') + VER_UPGRADE="${VER_PREFIX}-$(echo $FILE | sed 's/.*-\([0-9]\{6\}-rev[0-9]*\)-.*/\1/')" + VER_CURRENT="${VER_PREFIX}-${FW_REV}" + printf "current=%s\nupgrade=%s\n" "$VER_CURRENT" "$VER_UPGRADE" > ${VERSION_FILE} else echo "Update not found!" + # Write only current version using OPENWRT_RELEASE prefix + local FW_REV + printf "current=%s\nupgrade=\n" "${OPENWRT_RELEASE%~*} $FW_REV" > ${VERSION_FILE} fi ;; esac diff --git a/luci-app-ota/root/usr/share/rpcd/acl.d/luci-app-ota.json b/luci-app-ota/root/usr/share/rpcd/acl.d/luci-app-ota.json index ba00f1ab..55eb8e5e 100644 --- a/luci-app-ota/root/usr/share/rpcd/acl.d/luci-app-ota.json +++ b/luci-app-ota/root/usr/share/rpcd/acl.d/luci-app-ota.json @@ -4,14 +4,20 @@ "read": { "file": { "/usr/share/ota.sh": ["exec"], + "/usr/share/ota-launch.sh": ["exec"], + "/usr/lib/os-release": ["read"], + "/rom/etc/uci-defaults/fw_rev": ["read"], "/tmp/changelog.txt": ["read"], "/tmp/profiles.json": ["read"], - "/tmp/update.lock": ["read"] + "/tmp/update.lock": ["read"], + "/tmp/ota_version": ["read"], + "/tmp/ota_progress": ["read"] } }, "write": { "file": { - "/usr/share/ota.sh": ["exec"] + "/usr/share/ota.sh": ["exec"], + "/usr/share/ota-launch.sh": ["exec"] } } } diff --git a/luci-app-ssr-plus/Makefile b/luci-app-ssr-plus/Makefile index 2d28f9c3..03e0d2cc 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:=195 -PKG_RELEASE:=30 +PKG_RELEASE:=31 PKG_CONFIG_DEPENDS:= \ CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \ diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua index a1023748..c9c7e152 100644 --- a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua @@ -68,6 +68,26 @@ end table.sort(key_table) +-- 获取 Xray 版本号 +if is_finded("xray") then + local version = luci.sys.exec("xray version 2>&1") + if version and version ~= "" then + xray_version = version:match("Xray%s+([%d%.]+)") + end +end + +-- 将 Xray 版本号转换为数字 +if xray_version and xray_version ~= "" then + local major, minor, patch = + xray_version:match("(%d+)%.?(%d*)%.?(%d*)") + + major = tonumber(major) or 0 + minor = tonumber(minor) or 0 + patch = tonumber(patch) or 0 + + xray_version_val = major * 10000 + minor * 100 + patch +end + m = Map("shadowsocksr") -- [[ global ]]-- s = m:section(TypedSection, "global", translate("Server failsafe auto swith and custom update settings")) @@ -237,15 +257,31 @@ if is_finded("xray") then o:value("1-5", "1-5") o:depends("fragment", true) - o = s:option(Value, "fragment_length", translate("Fragment Length"), translate("Fragmented packet length (byte)")) - o.datatype = "or(uinteger,portrange)" + o = s:option(Value, "fragment_length", translate("Fragment Length")) + if xray_version_val <= 260601 then + o.datatype = "or(uinteger,portrange)" + end o.default = "100-200" o:depends("fragment", true) + o.description = translate( + "" + ) - o = s:option(Value, "fragment_delay", translate("Fragment Delay"), translate("Fragmentation interval (ms)")) - o.datatype = "or(uinteger,portrange)" + o = s:option(Value, "fragment_delay", translate("Fragment Delay")) + if xray_version_val <= 260601 then + o.datatype = "or(uinteger,portrange)" + end o.default = "10-20" o:depends("fragment", true) + o.description = translate( + "" + ) o = s:option(Value, "fragment_maxSplit", translate("Max Split"), translate("Limit the maximum number of splits.")) o.datatype = "or(uinteger,portrange)" diff --git a/luci-app-ssr-plus/po/templates/ssr-plus.pot b/luci-app-ssr-plus/po/templates/ssr-plus.pot index 64b70ed6..df9ea447 100644 --- a/luci-app-ssr-plus/po/templates/ssr-plus.pot +++ b/luci-app-ssr-plus/po/templates/ssr-plus.pot @@ -1,7 +1,7 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:231 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:251 msgid "" "\"1-3\" is for segmentation at TCP layer, applying to the beginning 1 to 3 " "data writes by the client. \"tlshello\" is for TLS client hello packet " @@ -64,7 +64,7 @@ msgstr "" msgid "8 Threads" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:296 msgid "" msgstr "" @@ -80,6 +80,8 @@ msgid "" "etc." msgstr "" +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:267 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:280 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1267 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1588 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1601 @@ -206,7 +208,7 @@ msgstr "" msgid "Anti-pollution DNS Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148 msgid "Apple Domains DNS" msgstr "" @@ -214,11 +216,11 @@ msgstr "" msgid "Apple Domains Data" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:123 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:143 msgid "Apple Domains Update url" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:119 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139 msgid "Apple domains optimization" msgstr "" @@ -366,7 +368,7 @@ msgstr "" msgid "Check Server Port" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:94 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114 msgid "Check Try Count" msgstr "" @@ -381,7 +383,7 @@ msgid "" "release page." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:89 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:109 msgid "Check timout(second)" msgstr "" @@ -403,15 +405,15 @@ msgstr "" msgid "ChinaDNS-NG query protocol" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:113 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:133 msgid "Chnroute Update url" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134 msgid "Clang.CN" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:115 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:135 msgid "Clang.CN.CIDR" msgstr "" @@ -454,7 +456,7 @@ msgstr "" msgid "Clear logs" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:264 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:300 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1097 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1452 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479 @@ -663,7 +665,7 @@ msgstr "" msgid "Default" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:101 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:121 msgid "Default Node Local Port" msgstr "" @@ -704,7 +706,7 @@ msgid "" "entries before the original Clash rules." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:302 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:338 msgid "Delay (ms)" msgstr "" @@ -766,7 +768,7 @@ msgstr "" msgid "DoT upstream (Need use wolfssl version)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:289 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:325 msgid "Domain Strategy" msgstr "" @@ -816,9 +818,9 @@ msgstr "" msgid "Edit ShadowSocksR Server" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:198 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:278 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:218 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:314 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:54 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:581 @@ -835,7 +837,7 @@ msgstr "" msgid "Enable Authentication" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:80 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1739 msgid "Enable Auto Switch" msgstr "" @@ -890,7 +892,7 @@ msgstr "" msgid "Enable V3 protocol." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:154 msgid "Enable adblock" msgstr "" @@ -906,7 +908,7 @@ msgstr "" msgid "Enabled Kernel virtual NIC TUN(optional)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:181 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:201 msgid "Enabled Mixed" msgstr "" @@ -1048,13 +1050,13 @@ msgstr "" msgid "Flow" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:119 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139 msgid "" "For Apple domains equipped with Chinese mainland CDN, always responsive to " "Chinese CDN IP addresses" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:262 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:298 msgid "For specific usage, see:" msgstr "" @@ -1064,27 +1066,27 @@ msgid "" "(,)." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:248 msgid "Fragment" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:273 msgid "Fragment Delay" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:240 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260 msgid "Fragment Length" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:231 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:251 msgid "Fragment Packets" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:281 msgid "Fragmentation interval (ms)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:240 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:268 msgid "Fragmented packet length (byte)" msgstr "" @@ -1134,7 +1136,7 @@ msgstr "" msgid "Global Client" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:194 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:214 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:213 msgid "Global HTTP/HTTPS Proxy Server" msgstr "" @@ -1143,7 +1145,7 @@ msgstr "" msgid "Global Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:152 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:172 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:204 msgid "Global SOCKS5 Proxy Server" msgstr "" @@ -1195,7 +1197,7 @@ msgstr "" msgid "HTTP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:202 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222 msgid "HTTP Auth Mode" msgstr "" @@ -1204,7 +1206,7 @@ msgstr "" msgid "HTTP Host" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:232 msgid "HTTP Password" msgstr "" @@ -1213,11 +1215,11 @@ msgstr "" msgid "HTTP Path" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 msgid "HTTP User" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:202 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222 msgid "HTTP proxy auth method, default:none." msgstr "" @@ -1280,7 +1282,7 @@ msgstr "" msgid "IP Stack Preference" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148 msgid "If empty, Not change Apple domains parsing DNS (Default is empty)" msgstr "" @@ -1479,7 +1481,7 @@ msgstr "" msgid "Level 3 Public DNS-3 (4.2.2.3-4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:250 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:286 msgid "Limit the maximum number of splits." msgstr "" @@ -1498,8 +1500,8 @@ msgstr "" msgid "Loading..." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:217 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:237 msgid "Local Port" msgstr "" @@ -1519,11 +1521,11 @@ msgstr "" msgid "Loop Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:109 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:129 msgid "Loukky/gfwlist-by-loukky" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:108 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128 msgid "Loyalsoldier/v2ray-rules-dat" msgstr "" @@ -1558,7 +1560,7 @@ msgstr "" msgid "Max Early Data" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:250 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:286 msgid "Max Split" msgstr "" @@ -1611,7 +1613,7 @@ msgstr "" msgid "Missing xz support" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:181 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:201 msgid "Mixed as an alias of socks, default:Enabled." msgstr "" @@ -1644,7 +1646,7 @@ msgstr "" msgid "Mux" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:138 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:158 msgid "NEO DEV HOST" msgstr "" @@ -1730,7 +1732,7 @@ msgid "" "the table." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:255 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:291 msgid "Noise" msgstr "" @@ -1768,6 +1770,18 @@ msgid "" "compatibility issues." msgstr "" +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:282 +msgid "" +"Note: When version is higher than 26.6.1, input multiple fragment intervals " +"saperate with ','." +msgstr "" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:269 +msgid "" +"Note: When version is higher than 26.6.1, input multiple fragment lengths " +"saperate with ','." +msgstr "" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1644 msgid "Number of early established connections to reduce latency." msgstr "" @@ -1804,19 +1818,19 @@ msgstr "" msgid "Only Common Ports" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 msgid "Only when HTTP Auth Mode is password valid, Mandatory." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:232 msgid "Only when HTTP Auth Mode is password valid, Not mandatory." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:170 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190 msgid "Only when Socks5 Auth Mode is password valid, Mandatory." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:195 msgid "Only when Socks5 Auth Mode is password valid, Not mandatory." msgstr "" @@ -1838,11 +1852,11 @@ msgstr "" msgid "Package Name" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:261 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:297 msgid "Packet or Rand length as a string, e.g., 10-20." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:298 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:334 msgid "Packet | Rand Length" msgstr "" @@ -2129,7 +2143,7 @@ msgstr "" msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:164 msgid "Reset to defaults" msgstr "" @@ -2258,7 +2272,7 @@ msgstr "" msgid "Server Type" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:73 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:93 msgid "Server failsafe auto swith and custom update settings" msgstr "" @@ -2368,7 +2382,7 @@ msgstr "" msgid "Socks Version" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:163 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:183 msgid "Socks protocol auth methods, default:noauth." msgstr "" @@ -2377,15 +2391,15 @@ msgstr "" msgid "Socks5" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:163 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:183 msgid "Socks5 Auth Mode" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:195 msgid "Socks5 Password" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:170 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190 msgid "Socks5 User" msgstr "" @@ -2466,7 +2480,7 @@ msgstr "" msgid "Successfully retrieved certificate name:" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:142 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:162 msgid "Support AdGuardHome and DNSMASQ format list" msgstr "" @@ -2480,7 +2494,7 @@ msgid "" "a maximum length of 3 bytes." msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:84 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:104 msgid "Switch check cycly(second)" msgstr "" @@ -2509,7 +2523,7 @@ msgstr "" msgid "TCP Fast Open" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:248 msgid "" "TCP fragments, which can deceive the censorship system in some cases, such " "as bypassing SNI blacklists." @@ -2644,7 +2658,7 @@ msgstr "" msgid "Timeout for establishing a connection to server(second)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:296 msgid "To send noise packets, select \"Noise\" in Xray Settings." msgstr "" @@ -2675,7 +2689,7 @@ msgstr "" msgid "Try Count" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:282 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:318 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:695 msgid "Type" msgstr "" @@ -2684,7 +2698,7 @@ msgstr "" msgid "UDP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:255 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:291 msgid "" "UDP noise, Under some circumstances it can bypass some UDP based protocol " "restrictions." @@ -3009,11 +3023,11 @@ msgstr "" msgid "Xray" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:225 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245 msgid "Xray Fragment Settings" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:258 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:294 msgid "Xray Noise Packets" msgstr "" @@ -3032,7 +3046,7 @@ msgstr "" msgid "YAML Reloaded!" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:137 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157 msgid "adblock_url" msgstr "" @@ -3060,7 +3074,7 @@ msgstr "" msgid "android" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:159 msgid "anti-AD" msgstr "" @@ -3068,7 +3082,7 @@ msgstr "" msgid "chacha20-poly1305" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:116 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:136 msgid "china-operator-ip" msgstr "" @@ -3114,7 +3128,7 @@ msgstr "" msgid "edge" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:124 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144 msgid "felixonmars/dnsmasq-china-list" msgstr "" @@ -3135,11 +3149,11 @@ msgstr "" msgid "gRPC Service Name" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:106 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:126 msgid "gfwlist Update url" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:110 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:130 msgid "gfwlist/gfwlist" msgstr "" @@ -3235,7 +3249,7 @@ msgstr "" msgid "spiderX" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:107 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127 msgid "v2fly/domain-list-community" msgstr "" diff --git a/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po b/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po index cc997cbb..e362c4ba 100644 --- a/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po +++ b/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po @@ -1,7 +1,7 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8\n" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:231 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:251 msgid "" "\"1-3\" is for segmentation at TCP layer, applying to the beginning 1 to 3 " "data writes by the client. \"tlshello\" is for TLS client hello packet " @@ -66,7 +66,7 @@ msgstr "" msgid "8 Threads" msgstr "8 线程" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:296 msgid "" msgstr "" @@ -84,6 +84,8 @@ msgstr "" "

支持 SS/SSR/V2RAY/XRAY/TROJAN/TUIC/HYSTERIA2/NAIVEPROXY/SOCKS5/CLASH 等协" "议。

" +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:267 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:280 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1267 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1588 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1601 @@ -210,7 +212,7 @@ msgstr "JSON 格式的 FinalMaskObject,用来实现分享。" msgid "Anti-pollution DNS Server" msgstr "访问国外域名 DNS 服务器" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148 msgid "Apple Domains DNS" msgstr "Apple 域名 DNS" @@ -218,11 +220,11 @@ msgstr "Apple 域名 DNS" msgid "Apple Domains Data" msgstr "【Apple 域名】数据库" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:123 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:143 msgid "Apple Domains Update url" msgstr "Apple 域名更新 URL" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:119 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139 msgid "Apple domains optimization" msgstr "Apple 域名解析优化" @@ -370,7 +372,7 @@ msgstr "检查服务器" msgid "Check Server Port" msgstr "【服务器端口】检查" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:94 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114 msgid "Check Try Count" msgstr "切换检查重试次数" @@ -385,7 +387,7 @@ msgid "" "release page." msgstr "检测已安装组件版本,并从上游发布页在线升级。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:89 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:109 msgid "Check timout(second)" msgstr "切换检查超时时间(秒)" @@ -407,15 +409,15 @@ msgstr "【中国大陆 IP 段】数据库" msgid "ChinaDNS-NG query protocol" msgstr "ChinaDNS-NG 查询协议" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:113 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:133 msgid "Chnroute Update url" msgstr "中国大陆 IP 段更新 URL" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134 msgid "Clang.CN" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:115 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:135 msgid "Clang.CN.CIDR" msgstr "" @@ -458,7 +460,7 @@ msgstr "清空所有自定义客户端代理规则,并恢复为空白状态吗 msgid "Clear logs" msgstr "清空日志" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:264 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:300 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1097 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1452 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479 @@ -668,7 +670,7 @@ msgstr "解密" msgid "Default" msgstr "默认" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:101 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:121 msgid "Default Node Local Port" msgstr "节点默认本地端口" @@ -713,7 +715,7 @@ msgstr "" "为每个客户端指定 Mihomo 代理目标。规则会以 SRC-IP-CIDR 形式注入到原始 Clash " "规则之前。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:302 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:338 msgid "Delay (ms)" msgstr "延迟(ms)" @@ -775,7 +777,7 @@ msgstr "是否要恢复客户端默认配置?" msgid "DoT upstream (Need use wolfssl version)" msgstr "DoT 上游(需使用 wolfssl 版本)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:289 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:325 msgid "Domain Strategy" msgstr "域名解析策略" @@ -825,9 +827,9 @@ msgstr "编辑" msgid "Edit ShadowSocksR Server" msgstr "编辑服务器配置" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:198 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:278 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:218 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:314 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:54 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:581 @@ -844,7 +846,7 @@ msgstr "客户端启用 0-RTT QUIC 连接握手" msgid "Enable Authentication" msgstr "启用用户名/密码认证" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:80 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1739 msgid "Enable Auto Switch" msgstr "启用自动切换" @@ -899,7 +901,7 @@ msgstr "开启 V2 协议。" msgid "Enable V3 protocol." msgstr "开启 V3 协议。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:154 msgid "Enable adblock" msgstr "启用广告屏蔽" @@ -915,7 +917,7 @@ msgstr "启用此选项配置 XHTTP 附加项(JSON 格式)。" msgid "Enabled Kernel virtual NIC TUN(optional)" msgstr "启用内核的虚拟网卡 TUN(可选)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:181 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:201 msgid "Enabled Mixed" msgstr "启用 Mixed" @@ -1057,13 +1059,13 @@ msgstr "指纹伪造" msgid "Flow" msgstr "流控(Flow)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:119 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139 msgid "" "For Apple domains equipped with Chinese mainland CDN, always responsive to " "Chinese CDN IP addresses" msgstr "配备中国大陆 CDN 的 Apple 域名,始终应答中国大陆 CDN 地址" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:262 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:298 msgid "For specific usage, see:" msgstr "具体使用方法,具体请参见:" @@ -1073,27 +1075,27 @@ msgid "" "(,)." msgstr "格式为:10000:20000 或 10000-20000 多组时用逗号(,)隔开。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:248 msgid "Fragment" msgstr "分片" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:273 msgid "Fragment Delay" msgstr "分片延迟" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:240 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260 msgid "Fragment Length" msgstr "分片包长" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:231 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:251 msgid "Fragment Packets" msgstr "分片方式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:281 msgid "Fragmentation interval (ms)" msgstr "分片间隔(ms)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:240 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:268 msgid "Fragmented packet length (byte)" msgstr "分片包长 (byte)" @@ -1143,7 +1145,7 @@ msgstr "GitHub 直连" msgid "Global Client" msgstr "TCP 透明代理" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:194 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:214 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:213 msgid "Global HTTP/HTTPS Proxy Server" msgstr "HTTP/HTTPS 代理服务端(全局)" @@ -1152,7 +1154,7 @@ msgstr "HTTP/HTTPS 代理服务端(全局)" msgid "Global Mode" msgstr "全局模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:152 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:172 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:204 msgid "Global SOCKS5 Proxy Server" msgstr "SOCKS5 代理服务端(全局)" @@ -1204,7 +1206,7 @@ msgstr "H2/gRPC 健康检查" msgid "HTTP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:202 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222 msgid "HTTP Auth Mode" msgstr "HTTP 认证模式" @@ -1213,7 +1215,7 @@ msgstr "HTTP 认证模式" msgid "HTTP Host" msgstr "HTTP 主机名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:232 msgid "HTTP Password" msgstr "HTTP 密码" @@ -1222,11 +1224,11 @@ msgstr "HTTP 密码" msgid "HTTP Path" msgstr "HTTP 路径" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 msgid "HTTP User" msgstr "HTTP 用户名" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:202 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222 msgid "HTTP proxy auth method, default:none." msgstr "HTTP 代理认证方式,默认:none。" @@ -1289,7 +1291,7 @@ msgstr "绕过中国大陆 IP 模式" msgid "IP Stack Preference" msgstr "IP 栈优先级" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148 msgid "If empty, Not change Apple domains parsing DNS (Default is empty)" msgstr "如果为空,则不更改 Apple 域名解析 DNS(默认为空)" @@ -1489,7 +1491,7 @@ msgstr "" msgid "Level 3 Public DNS-3 (4.2.2.3-4)" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:250 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:286 msgid "Limit the maximum number of splits." msgstr "限制分片的最大数量。" @@ -1508,8 +1510,8 @@ msgstr "仅监听指定的接口,未指定则监听全部。" msgid "Loading..." msgstr "加载中..." -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187 -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:217 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:237 msgid "Local Port" msgstr "本地端口" @@ -1529,11 +1531,11 @@ msgstr "日志" msgid "Loop Mode" msgstr "循环模式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:109 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:129 msgid "Loukky/gfwlist-by-loukky" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:108 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128 msgid "Loyalsoldier/v2ray-rules-dat" msgstr "" @@ -1570,7 +1572,7 @@ msgstr "未找到匹配的发布资产" msgid "Max Early Data" msgstr "最大前置数据" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:250 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:286 msgid "Max Split" msgstr "最大分片数" @@ -1625,7 +1627,7 @@ msgstr "缺少 unzip 支持" msgid "Missing xz support" msgstr "缺少 xz 支持" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:181 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:201 msgid "Mixed as an alias of socks, default:Enabled." msgstr "Mixed 作为 SOCKS 的别名,默认:启用。" @@ -1658,7 +1660,7 @@ msgstr "必须是 JSON 文本内容!" msgid "Mux" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:138 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:158 msgid "NEO DEV HOST" msgstr "" @@ -1745,7 +1747,7 @@ msgid "" msgstr "" "节点顺序可用鼠标拖拉后立即生效,服务器节点自动切换顺序和表中节点顺序一致。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:255 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:291 msgid "Noise" msgstr "噪声" @@ -1783,6 +1785,18 @@ msgid "" "compatibility issues." msgstr "注意:不同版本间的配置恢复可能会导致兼容性问题。" +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:282 +msgid "" +"Note: When version is higher than 26.6.1, input multiple fragment intervals " +"saperate with ','." +msgstr "注意:当版本高于 26.6.1 时,可以输入多个分片间隔,并用英文 ',' 分隔。" + +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:269 +msgid "" +"Note: When version is higher than 26.6.1, input multiple fragment lengths " +"saperate with ','." +msgstr "注意:当版本高于 26.6.1 时,可以输入多个分片长度,并用英文 ',' 分隔。" + #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1644 msgid "Number of early established connections to reduce latency." msgstr "预连接的数量,用于降低延迟。" @@ -1819,19 +1833,19 @@ msgstr "设置后,仅在服务器证书链指纹匹配时连接。" msgid "Only Common Ports" msgstr "仅常用端口(不走 P2P 流量到代理)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 msgid "Only when HTTP Auth Mode is password valid, Mandatory." msgstr "仅当 HTTP 认证模式为 password 时有效,必填。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:232 msgid "Only when HTTP Auth Mode is password valid, Not mandatory." msgstr "仅当 HTTP 认证模式为 password 时有效,非必填。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:170 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190 msgid "Only when Socks5 Auth Mode is password valid, Mandatory." msgstr "仅当 Socks5 认证方式为 Password 时有效,必填。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:195 msgid "Only when Socks5 Auth Mode is password valid, Not mandatory." msgstr "仅当 Socks5 认证方式为 Password 时有效,非必填。" @@ -1853,11 +1867,11 @@ msgstr "" msgid "Package Name" msgstr "组件包名称" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:261 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:297 msgid "Packet or Rand length as a string, e.g., 10-20." msgstr "数据包或 Rand 长度以字符串形式输入,例如:10-20。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:298 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:334 msgid "Packet | Rand Length" msgstr "数据包 | Rand 长度" @@ -2144,7 +2158,7 @@ msgstr "重置完成" msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?" msgstr "要清空已保存的 Mihomo 分组选择,并恢复为 YAML 默认值吗?" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:164 msgid "Reset to defaults" msgstr "恢复出厂设置" @@ -2274,7 +2288,7 @@ msgstr "服务端配置" msgid "Server Type" msgstr "服务端类型" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:73 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:93 msgid "Server failsafe auto swith and custom update settings" msgstr "服务器节点故障自动切换/广告屏蔽/中国大陆 IP 段数据库更新设置" @@ -2384,7 +2398,7 @@ msgstr "" msgid "Socks Version" msgstr "Socks 版本" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:163 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:183 msgid "Socks protocol auth methods, default:noauth." msgstr "Socks 协议的认证方式,默认值:noauth。" @@ -2393,15 +2407,15 @@ msgstr "Socks 协议的认证方式,默认值:noauth。" msgid "Socks5" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:163 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:183 msgid "Socks5 Auth Mode" msgstr "Socks5 认证方式" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:195 msgid "Socks5 Password" msgstr "Socks5 密码" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:170 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190 msgid "Socks5 User" msgstr "Socks5 用户名" @@ -2482,7 +2496,7 @@ msgstr "已成功获取证书指纹:" msgid "Successfully retrieved certificate name:" msgstr "已成功获取证书名称:" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:142 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:162 msgid "Support AdGuardHome and DNSMASQ format list" msgstr "同时支持 AdGuard Home 和 DNSMASQ 格式的过滤列表" @@ -2498,7 +2512,7 @@ msgstr "" "支持以“,”分隔的十进制数字,或者经过 Base64 编码的字符串,其最大长度为 3 个字" "节。" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:84 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:104 msgid "Switch check cycly(second)" msgstr "自动切换检查周期(秒)" @@ -2527,7 +2541,7 @@ msgstr "TCP 伪装类型" msgid "TCP Fast Open" msgstr "TCP 快速打开" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:248 msgid "" "TCP fragments, which can deceive the censorship system in some cases, such " "as bypassing SNI blacklists." @@ -2670,7 +2684,7 @@ msgstr "超时" msgid "Timeout for establishing a connection to server(second)" msgstr "连接超时时间(单位:秒)" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:260 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:296 msgid "To send noise packets, select \"Noise\" in Xray Settings." msgstr "在 Xray 设置中勾选 “噪声” 以发送噪声包。" @@ -2701,7 +2715,7 @@ msgstr "Trojan 密码" msgid "Try Count" msgstr "重试次数" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:282 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:318 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:695 msgid "Type" msgstr "类型" @@ -2710,7 +2724,7 @@ msgstr "类型" msgid "UDP" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:255 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:291 msgid "" "UDP noise, Under some circumstances it can bypass some UDP based protocol " "restrictions." @@ -3037,11 +3051,11 @@ msgstr "" msgid "Xray" msgstr "Xray" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:225 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:245 msgid "Xray Fragment Settings" msgstr "Xray 分片设置" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:258 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:294 msgid "Xray Noise Packets" msgstr "Xray 噪声数据包" @@ -3060,7 +3074,7 @@ msgstr "YAML 重载失败!" msgid "YAML Reloaded!" msgstr "YAML 已重载!" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:137 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157 msgid "adblock_url" msgstr "广告屏蔽更新 URL" @@ -3088,7 +3102,7 @@ msgstr "allowedIPs(可选)" msgid "android" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:159 msgid "anti-AD" msgstr "" @@ -3096,7 +3110,7 @@ msgstr "" msgid "chacha20-poly1305" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:116 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:136 msgid "china-operator-ip" msgstr "" @@ -3142,7 +3156,7 @@ msgstr "例如:/etc/ssl/private.key" msgid "edge" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:124 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144 msgid "felixonmars/dnsmasq-china-list" msgstr "" @@ -3163,11 +3177,11 @@ msgstr "gRPC 模式" msgid "gRPC Service Name" msgstr "gRPC 服务名称" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:106 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:126 msgid "gfwlist Update url" msgstr "GFW 列表更新 URL" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:110 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:130 msgid "gfwlist/gfwlist" msgstr "" @@ -3264,7 +3278,7 @@ msgstr "" msgid "spiderX" msgstr "" -#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:107 +#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127 msgid "v2fly/domain-list-community" msgstr "" 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 5f45b800..1990735b 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 @@ -59,10 +59,14 @@ local function parse_realm_uri(uri) local scheme, token, server_url, realm_id, query = trim(uri):match("^(realm%+http|realm)://([^@]+)@([^/]+)/([^?]*)%??(.*)$") if not scheme or not token or not server_url or not realm_id then return nil end realm_id = realm_id:gsub("/+$", "") + local address, port = server_url:match("^%[?([^%]]+)%]?:?(%d*)$") + port = tonumber(port) or (scheme == "realm+http" and 80 or 443) local realm = { scheme = scheme, token = token, server_url = server_url, + address = address, + port = port, realm_id = realm_id } -- 解析 query 中的 stun= @@ -292,6 +296,15 @@ function xray_hysteria2() address = server.server, port = tonumber(server.server_port) } + + -- Realm 支持:使用 Realm 服务器地址覆盖默认地址 + if server.v2ray_protocol == "hysteria2" and server.hysteria2_realms then + local realm = parse_realm_uri(server.hysteria2_realm_url) + if realm then + outbound_settings.address = realm.address + outbound_settings.port = realm.port + end + end end local outbound = {} function outbound:new(o) @@ -700,15 +713,56 @@ Xray.outbounds = { local n_maxsplit = xray_fragment.fragment_maxSplit --local domainstr = xray_noise.domainStrategy finalmask.tcp = finalmask.tcp or {} + + -- 辅助函数:将逗号分隔的字符串拆分为数组 + local function split_to_array(str) + if not str or str == "" then return nil end + local result = {} + for value in string.gmatch(str, "[^,]+") do + value = value:gsub("^%s*(.-)%s*$", "%1") -- 去除首尾空格 + if value ~= "" then + table.insert(result, value) + end + end + return #result > 0 and result or nil + end + + -- 构建 fragment settings + local fragment_settings = { + packets = (n_packets and n_packets ~= "") and n_packets or nil, + maxSplit = (n_maxsplit and n_maxsplit ~= "") and n_maxsplit or nil + } + + -- 根据 Xray 版本决定使用旧格式还是新格式 + if xray_version_val <= 260601 then + -- 旧版本:使用 length 和 delay(单个值) + if n_length and n_length ~= "" then + fragment_settings.length = n_length + end + if n_delay and n_delay ~= "" then + if type(n_delay) == "string" and n_delay:find("-", 1, true) then + fragment_settings.delay = n_delay + else + fragment_settings.delay = tonumber(n_delay) + end + end + else + -- 新版本:使用 lengths 和 delays(数组) + -- 拆分逗号分隔的字符串 + local lengths_array = split_to_array(n_length) + if lengths_array then + fragment_settings.lengths = lengths_array + end + + local delays_array = split_to_array(n_delay) + if delays_array then + fragment_settings.delays = delays_array + end + end + finalmask.tcp[#finalmask.tcp + 1] = { type = "fragment", - settings = { - --domainStrategy = (xray_fragment.noise == "1" and xray_noise.enabled == "1") and domainstr or nil, - packets = (n_packets and n_packets ~= "") and n_packets or nil, - length = (n_length and n_length ~= "") and n_length or nil, - delay = (type(n_delay) == "string" and string.find(n_delay, "-")) and n_delay or (n_delay and tonumber(n_delay)), - maxSplit = (n_maxsplit and n_maxsplit ~= "") and n_maxsplit or nil - } + settings = fragment_settings } end if xray_fragment.noise == "1" and (TP == "kcp" or (TP == "xhttp" and (server.tls_alpn == "h3" or server.tls_alpn == "h3,h2"))) then diff --git a/natflow/Makefile b/natflow/Makefile index 4e33801a..182b10d4 100644 --- a/natflow/Makefile +++ b/natflow/Makefile @@ -10,12 +10,12 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=natflow PKG_VERSION:=20260531 -PKG_RELEASE:=19 +PKG_RELEASE:=20 PKG_SOURCE:=$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://github.com/ptpt52/natflow.git PKG_SOURCE_PROTO:=git -PKG_SOURCE_VERSION:=d048ff525d0ab9780a2af16a56a1359b7b14beb4 +PKG_SOURCE_VERSION:=c1f7aae14a67a8a2f8edd9641c69ccf77654c42a PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_MAINTAINER:=Chen Minqiang PKG_LICENSE:=GPL-2.0