🤞 Sync 2026-06-25 00:16:31

This commit is contained in:
github-actions[bot] committed 2026-06-25 00:16:31 +08:00
1 parent 251e9e9dd1
commit bbcd3f17c5
14 files changed
+505 -276

No files matched your search

+1 -1
View File
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-daede PKG_NAME:=luci-app-daede
PKG_VERSION:=1.14.7 PKG_VERSION:=1.14.7
PKG_RELEASE:=22 PKG_RELEASE:=23
PKG_MAINTAINER:=kenzok8 PKG_MAINTAINER:=kenzok8
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
@@ -452,7 +452,13 @@ return view.extend({
uci.set('daede', 'config', 'geo_auto_freq', freqSel.value); uci.set('daede', 'config', 'geo_auto_freq', freqSel.value);
const orig = saveBtn.textContent; const orig = saveBtn.textContent;
saveBtn.disabled = true; 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']); return fs.exec('/usr/share/luci-app-daede/geo-cron.sh', [autoCb.checked ? 'enable' : 'disable']);
}).then(function() { }).then(function() {
logPane.textContent = _('Geo data source saved.'); logPane.textContent = _('Geo data source saved.');
+2 -2
View File
@@ -10,8 +10,8 @@ LUCI_TITLE:=Simple OTA Update for OpenWrt
#LUCI_DEPENDS:= +luci-app-firewall #LUCI_DEPENDS:= +luci-app-firewall
PKG_LICENSE:=Apache-2.0 PKG_LICENSE:=Apache-2.0
PKG_VERSION:=0.0.2 PKG_VERSION:=0.0.3
PKG_RELEASE:=2 PKG_RELEASE:=3
include $(TOPDIR)/feeds/luci/luci.mk include $(TOPDIR)/feeds/luci/luci.mk
@@ -9,32 +9,48 @@
*/ */
return view.extend({ return view.extend({
load: function() { // Format raw firmware filename → "OpenWrt 24.10.7 202606-rev01"
return Promise.resolve(); 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; 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) { if (success) {
self.checkButton.disabled = true;
self.showUpdateAvailable();
self.upgradeButton.disabled = false; self.upgradeButton.disabled = false;
} }
}).catch(function() {}); }).catch(function() {});
}, },
showUpdateAvailable: function() { updateVersionBlock: function(current, upgrade, hasUpdate) {
var self = this; this.verCurrentVal.textContent = current || '—';
self.statusDiv.innerHTML = ''; this.verAvailVal.textContent = upgrade || '—';
self.statusDiv.appendChild(E('div', { 'class': 'alert-message success' }, [
E('h3', {}, _('Update Available')), // Changelog link visible only when update is available
E('button', { this.verChangelogLink.style.display = hasUpdate ? '' : 'none';
'class': 'btn cbi-button cbi-button-neutral',
'style': 'margin-top: 6px;', // Colour: important (green) = update found, warning (yellow) = no update / unknown
'click': function() { self.showChangelog(); } this.versionBlock.className = 'alert-message ' + (hasUpdate ? 'success' : 'warning');
}, _('Show Changelog'))
]));
}, },
showChangelog: function() { showChangelog: function() {
@@ -52,7 +68,7 @@ return view.extend({
]); ]);
}, },
render: function() { render: function(data) {
var self = this; var self = this;
this.checkButton = E('button', { this.checkButton = E('button', {
@@ -66,7 +82,29 @@ return view.extend({
'click': ui.createHandlerFn(this, 'handleUpgrade') 'click': ui.createHandlerFn(this, 'handleUpgrade')
}, _('Upgrade')); }, _('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' }, [ var container = E('div', { 'class': 'cbi-map' }, [
E('h2', {}, _('OTA System Update')), E('h2', {}, _('OTA System Update')),
@@ -75,10 +113,10 @@ return view.extend({
' ', ' ',
this.upgradeButton this.upgradeButton
]), ]),
this.statusDiv this.versionBlock
]); ]);
this.checkInitialState(); this.checkInitialState(data);
return container; return container;
}, },
@@ -87,33 +125,23 @@ return view.extend({
var self = this; var self = this;
this.checkButton.disabled = true; this.checkButton.disabled = true;
this.statusDiv.innerHTML = ''; this.upgradeButton.disabled = true;
this.statusDiv.appendChild(E('div', { 'class': 'spinner' }, _('Checking for updates...')));
return fs.exec('/usr/share/ota.sh', ['check']) return fs.exec('/usr/share/ota.sh', ['check'])
.then(function() { .then(function() {
return self.verifyCheckResult(); return self.verifyCheckResult(self.verCurrentVal.textContent);
}) })
.then(function(success) { .then(function(success) {
if (success) { self.upgradeButton.disabled = !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.checkButton.disabled = false; self.checkButton.disabled = false;
}) })
.catch(function(err) { .catch(function(err) {
self.statusDiv.innerHTML = ''; self.updateVersionBlock('', _('Check failed: ') + (err.message || err), false);
self.statusDiv.appendChild(E('div', { 'class': 'alert-message error' },
_('Check failed: ') + (err.message || err)));
self.checkButton.disabled = false; self.checkButton.disabled = false;
}); });
}, },
verifyCheckResult: function() { verifyCheckResult: function(currentVer) {
var self = this; var self = this;
return Promise.all([ return Promise.all([
@@ -124,11 +152,33 @@ return view.extend({
self.changelog = content; self.changelog = content;
return content && content.length > 0; 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) { ]).then(function(results) {
return results[0] !== null && var hasProfiles = results[0] !== null;
results[1] !== null && var hasLock = results[1] !== null;
results[2] === true; 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.upgradeButton.disabled = true;
this.checkButton.disabled = true; this.checkButton.disabled = true;
// Remove stale progress file before starting
fs.remove('/tmp/ota_progress').catch(function() {});
self.openUpgradeModal(); 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() { .then(function() {
self.stopProgressPolling(); // launcher exited — polling is running, wait for 'done' or 'error'
self.setModalProgress(100, _('Upgrade started. Device will reboot...'), 'done');
self.finalizeUpgradeModal(false);
}) })
.catch(function(err) { .catch(function(err) {
var msg = err.message || err.toString(); var msg = err.message || err.toString();
self.stopProgressPolling(); // XHR timeout is expected — launcher or sysupgrade still running,
// polling continues and will finalize via 'flashing'/'error' state
// XHR timeout = sysupgrade already running, treat as success if (msg.indexOf('timed out') !== -1 || msg.indexOf('XHR') !== -1) {
if (msg.indexOf('timed out') !== -1) { return;
self.setModalProgress(100, _('Upgrade started. Device will reboot...'), 'done');
self.finalizeUpgradeModal(false);
} else {
self.setModalProgress(0, _('Error: ') + msg, 'error');
self.finalizeUpgradeModal(true);
} }
// Genuine exec failure
self.stopProgressPolling();
self.setModalProgress(0, _('Launch failed: ') + msg, 'error');
self.finalizeUpgradeModal(true);
}); });
}, },
openUpgradeModal: function() { openUpgradeModal: function() {
var self = this; var self = this;
// Progress bar element
self.modalProgressInner = E('div', { 'style': 'width: 0%; transition: width 0.4s ease;' }); self.modalProgressInner = E('div', { 'style': 'width: 0%; transition: width 0.4s ease;' });
self.modalProgressBar = E('div', { 'class': 'cbi-progressbar', 'style': 'margin: 10px 0;' }, self.modalProgressBar = E('div', {
self.modalProgressInner); 'class': 'cbi-progressbar',
'style': 'margin: 10px 0;'
}, self.modalProgressInner);
// Status label
self.modalStatus = E('div', { self.modalStatus = E('div', {
'style': 'font-size: 0.9em; color: #666; margin-bottom: 8px;' 'style': 'font-size: 0.9em; color: #666; margin-bottom: 8px;'
}, _('Starting upgrade...')); }, _('Starting upgrade...'));
// Log area
self.modalLog = E('pre', { self.modalLog = E('pre', {
'style': 'white-space: pre-wrap; max-height: 200px; overflow-y: auto; ' + 'style': 'white-space: pre-wrap; max-height: 200px; overflow-y: auto; ' +
'background: #f5f5f5; padding: 8px; border-radius: 3px; ' + 'background: #f5f5f5; padding: 8px; border-radius: 3px; ' +
'color: black; font-size: 0.85em; margin-top: 10px;' 'color: black; font-size: 0.85em; margin-top: 10px;'
}, ''); }, '');
// Close button (disabled until done)
self.modalCloseBtn = E('button', { self.modalCloseBtn = E('button', {
'class': 'btn cbi-button', 'class': 'btn cbi-button',
'disabled': true, 'disabled': true,
@@ -209,7 +252,6 @@ return view.extend({
]) ])
]); ]);
// Start polling /tmp/ota_progress
self.startProgressPolling(); self.startProgressPolling();
}, },
@@ -227,7 +269,6 @@ return view.extend({
if (line.indexOf('downloading') === 0) { if (line.indexOf('downloading') === 0) {
var pct = parseInt(line.split(' ')[1], 10) || 0; var pct = parseInt(line.split(' ')[1], 10) || 0;
// downloading maps to 0..70% of bar
var barPct = Math.round(pct * 0.70); var barPct = Math.round(pct * 0.70);
self.setModalProgress(barPct, self.setModalProgress(barPct,
_('Downloading firmware: ') + pct + '%', 'progress'); _('Downloading firmware: ') + pct + '%', 'progress');
@@ -242,18 +283,37 @@ return view.extend({
self.appendModalLog(_('Testing firmware image...')); self.appendModalLog(_('Testing firmware image...'));
} else if (line === 'flashing') { } else if (line === 'flashing') {
self.stopProgressPolling();
self.setModalProgress(95, _('Flashing! DO NOT POWER OFF!'), 'progress'); self.setModalProgress(95, _('Flashing! DO NOT POWER OFF!'), 'progress');
self.appendModalLog(_('Flashing firmware...')); 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) { } else if (line.indexOf('error') === 0) {
var reason = line.replace('error', '').trim(); var reason = line.replace('error', '').trim();
self.stopProgressPolling();
self.setModalProgress(0, _('Error: ') + reason, 'error'); self.setModalProgress(0, _('Error: ') + reason, 'error');
self.appendModalLog(_('FAILED: ') + reason); self.appendModalLog(_('FAILED: ') + reason);
self.stopProgressPolling(); self.finalizeUpgradeModal(true);
} }
}).catch(function() { }).catch(function() {});
// file not yet created — ignore
});
}, 1500); }, 1500);
}, },
@@ -269,7 +329,6 @@ return view.extend({
var pct = Math.min(100, Math.max(0, percent)); var pct = Math.min(100, Math.max(0, percent));
this.modalProgressInner.style.width = pct + '%'; this.modalProgressInner.style.width = pct + '%';
this.modalStatus.textContent = text; this.modalStatus.textContent = text;
if (state === 'error') { if (state === 'error') {
this.modalStatus.style.color = '#c00'; this.modalStatus.style.color = '#c00';
} else if (state === 'done') { } else if (state === 'done') {
@@ -282,7 +341,6 @@ return view.extend({
appendModalLog: function(line) { appendModalLog: function(line) {
if (!this.modalLog) return; if (!this.modalLog) return;
this.modalLog.textContent += line + '\n'; this.modalLog.textContent += line + '\n';
// Auto-scroll to bottom
this.modalLog.scrollTop = this.modalLog.scrollHeight; this.modalLog.scrollTop = this.modalLog.scrollHeight;
}, },
@@ -291,11 +349,9 @@ return view.extend({
this.modalCloseBtn.disabled = false; this.modalCloseBtn.disabled = false;
} }
if (!isError) { if (!isError) {
// For successful flash — don't re-enable buttons, this.versionBlock.className = 'alert-message warning';
// device is about to reboot this.verAvailVal.textContent = _('Upgrade started — device will reboot');
this.statusDiv.innerHTML = ''; this.verChangelogLink.style.display = 'none';
this.statusDiv.appendChild(E('div', { 'class': 'alert-message warning' },
_('Upgrade started! DO NOT POWER OFF THIS DEVICE! System will reboot after upgrade.')));
} else { } else {
this.upgradeButton.disabled = false; this.upgradeButton.disabled = false;
this.checkButton.disabled = false; this.checkButton.disabled = false;
+43 -18
View File
@@ -3,35 +3,60 @@
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Last-Translator: Konstantine Shevlakov <shevlakov@132lan.ru>\n" "Last-Translator: Konstantine Shevlakov <shevlakov@132lan.ru>\n"
msgid "OTA Update" msgid "Changelog"
msgstr "Обновление OTA" msgstr "Изменения"
msgid "Update Available"
msgstr "Доступно обновление"
msgid "OTA System Update"
msgstr "Обновление через OTA"
msgid "Check for Updates" msgid "Check for Updates"
msgstr "Проверить" msgstr "Проверить"
msgid "Upgrade" msgid "Upgrade"
msgstr "Обновить" msgstr "Обновить"
msgid "Checking for updates..." msgid "Show Changelog"
msgstr "Проверка обновлений..." msgstr "Посмотреть изменения"
msgid "No updates available or check failed" msgid "Current version:"
msgstr "Нет доступных обновлений" msgstr "Текущая версия:"
msgid "Available version:"
msgid "Доступно обновление:"
msgid "OTA System Update"
msgstr "Обновление через OTA"
msgid "OTA Update"
msgstr "Обновление OTA"
msgid "Check failed: " msgid "Check failed: "
msgstr "Неудачно: " msgstr "Неудачно: "
msgid "Download completed successfully! Start upgrade.<br />DO NOT POWER OFF THIS DEVICE!<br />System will be upgrade completed after reboot!" msgid "No updates available"
msgstr "Загрузка обновления завершена. Запущен процесс обновления.<br />НЕ ВЫКЛЮЧАЙТЕ УСТРОЙСТВО!<br />Система будет обновлена после перезагрузки!" msgstr "Нет доступных обновлений"
msgid "Upgrade failed: " msgid "Downloading: "
msgstr "Обновление прервано: " msgstr "Загружается: "
msgid "Download completed! Prepare upgrade..." msgid "Verifying SHA256 checksum..."
msgstr "Загрузка выполнена. Подготовка..." 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 "Обновление, устройство будет перезагружено"
+8
View File
@@ -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
+31 -21
View File
@@ -34,6 +34,7 @@
. /lib/functions.sh . /lib/functions.sh
PROGRESS_FILE=/tmp/ota_progress PROGRESS_FILE=/tmp/ota_progress
VERSION_FILE=/tmp/ota_version
set_progress() { set_progress() {
echo "$1" > ${PROGRESS_FILE} echo "$1" > ${PROGRESS_FILE}
@@ -142,32 +143,27 @@ for b in $BASE_BOARD; do
echo "from $URL_BASE" echo "from $URL_BASE"
set_progress "downloading 0" set_progress "downloading 0"
# Start wget in background # Download with uclient-fetch, parse % from stderr progress bar
wget ${URL_BASE}/targets/${DISTRIB_TARGET}/$FILE -O /tmp/firmware.bin 2>/dev/null & uclient-fetch -O /tmp/firmware.bin ${URL_BASE}/targets/${DISTRIB_TARGET}/$FILE 2>&1 | while IFS= read -r line; do
WGET_PID=$! pct=$(echo "$line" | grep -o '[0-9]*%' | tr -d '%' | tail -1)
[ -n "$pct" ] && set_progress "downloading $pct"
# 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
done done
# Bash, not ash
wait $WGET_PID #DL_RC=${PIPESTATUS[0]:-$?}
DL_RC=$? DL_RC=$?
# ash-safe fallback: check file exists and non-empty
[ -s /tmp/firmware.bin ] && DL_RC=0
sleep 2
case $DL_RC in case $DL_RC in
0) echo "Download complete." 0) echo "Download complete."
set_progress "downloading 100" ;; set_progress "downloading 100" ;;
*) echo "No updates for this board: $BOARD" *) echo "Download failed for board: $BOARD"
set_progress "error download" set_progress "error download"
remove_files && exit 0 ;; remove_files && exit 1 ;;
esac esac
sleep 2
set_progress "verifying" set_progress "verifying"
SHA256_DL=$(sha256sum /tmp/firmware.bin | awk '{print $1}') SHA256_DL=$(sha256sum /tmp/firmware.bin | awk '{print $1}')
echo -n "Check sha256 sum: " echo -n "Check sha256 sum: "
@@ -176,25 +172,31 @@ for b in $BASE_BOARD; do
echo "Update process start!" echo "Update process start!"
echo "Device will be rebooted." echo "Device will be rebooted."
echo "DO NOT TURN OFF DEVICE!" echo "DO NOT TURN OFF DEVICE!"
sleep 2
set_progress "testing" set_progress "testing"
sysupgrade -T /tmp/firmware.bin sysupgrade -T /tmp/firmware.bin
case $? in case $? in
0) echo "Flashing firmware" 0) echo "Flashing firmware" ;;
set_progress "flashing" ;;
*) echo "Failed! Abort update" *) echo "Failed! Abort update"
set_progress "error verify" set_progress "error verify"
remove_files && exit 0 ;; remove_files && exit 1 ;;
esac esac
sleep 2
set_progress "flashing"
rm -rf /tmp/update.lock /tmp/profiles.json /tmp/changelog.txt 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 else
echo "Failed! Abort update." echo "Failed! Abort update."
set_progress "error sha256" set_progress "error sha256"
remove_files && rm -rf /tmp/update.lock /tmp/profiles.json remove_files && rm -rf /tmp/update.lock /tmp/profiles.json
exit 1
fi fi
fi fi
;; ;;
check) check)
. /usr/lib/os-release
if [ $FW_REV_EXT -gt $FW_VER_LOCAL ]; then if [ $FW_REV_EXT -gt $FW_VER_LOCAL ]; then
echo "New firmware upgrade release!" echo "New firmware upgrade release!"
echo -e "*** $FILE ***\n" echo -e "*** $FILE ***\n"
@@ -205,8 +207,16 @@ for b in $BASE_BOARD; do
echo "" echo ""
echo "Please run script again for download and install update!" echo "Please run script again for download and install update!"
touch /tmp/update.lock 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 else
echo "Update not found!" 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 fi
;; ;;
esac esac
@@ -4,14 +4,20 @@
"read": { "read": {
"file": { "file": {
"/usr/share/ota.sh": ["exec"], "/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/changelog.txt": ["read"],
"/tmp/profiles.json": ["read"], "/tmp/profiles.json": ["read"],
"/tmp/update.lock": ["read"] "/tmp/update.lock": ["read"],
"/tmp/ota_version": ["read"],
"/tmp/ota_progress": ["read"]
} }
}, },
"write": { "write": {
"file": { "file": {
"/usr/share/ota.sh": ["exec"] "/usr/share/ota.sh": ["exec"],
"/usr/share/ota-launch.sh": ["exec"]
} }
} }
} }
+1 -1
View File
@@ -4,7 +4,7 @@ LUCI_TITLE:=luci-app-ssr-plus
LUCI_PKGARCH:=all LUCI_PKGARCH:=all
PKG_NAME:=luci-app-ssr-plus PKG_NAME:=luci-app-ssr-plus
PKG_VERSION:=195 PKG_VERSION:=195
PKG_RELEASE:=30 PKG_RELEASE:=31
PKG_CONFIG_DEPENDS:= \ PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \ CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \
@@ -68,6 +68,26 @@ end
table.sort(key_table) 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") m = Map("shadowsocksr")
-- [[ global ]]-- -- [[ global ]]--
s = m:section(TypedSection, "global", translate("Server failsafe auto swith and custom update settings")) 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:value("1-5", "1-5")
o:depends("fragment", true) o:depends("fragment", true)
o = s:option(Value, "fragment_length", translate("Fragment Length"), translate("Fragmented packet length (byte)")) o = s:option(Value, "fragment_length", translate("Fragment Length"))
o.datatype = "or(uinteger,portrange)" if xray_version_val <= 260601 then
o.datatype = "or(uinteger,portrange)"
end
o.default = "100-200" o.default = "100-200"
o:depends("fragment", true) o:depends("fragment", true)
o.description = translate(
"<ul>" ..
"<li>" .. translate("Fragmented packet length (byte)") .. "</li>" ..
"<li>" .. translate("Note: When version is higher than 26.6.1, input multiple fragment lengths saperate with ','.") .. "</li>" ..
"</ul>"
)
o = s:option(Value, "fragment_delay", translate("Fragment Delay"), translate("Fragmentation interval (ms)")) o = s:option(Value, "fragment_delay", translate("Fragment Delay"))
o.datatype = "or(uinteger,portrange)" if xray_version_val <= 260601 then
o.datatype = "or(uinteger,portrange)"
end
o.default = "10-20" o.default = "10-20"
o:depends("fragment", true) o:depends("fragment", true)
o.description = translate(
"<ul>" ..
"<li>" .. translate("Fragmentation interval (ms)") .. "</li>" ..
"<li>" .. translate("Note: When version is higher than 26.6.1, input multiple fragment intervals saperate with ','.") .. "</li>" ..
"</ul>"
)
o = s:option(Value, "fragment_maxSplit", translate("Max Split"), translate("Limit the maximum number of splits.")) o = s:option(Value, "fragment_maxSplit", translate("Max Split"), translate("Limit the maximum number of splits."))
o.datatype = "or(uinteger,portrange)" o.datatype = "or(uinteger,portrange)"
+85 -71
View File
@@ -1,7 +1,7 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8" 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 "" msgid ""
"\"1-3\" is for segmentation at TCP layer, applying to the beginning 1 to 3 " "\"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 " "data writes by the client. \"tlshello\" is for TLS client hello packet "
@@ -64,7 +64,7 @@ msgstr ""
msgid "8 Threads" msgid "8 Threads"
msgstr "" 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 "<font style='color:red'>" msgid "<font style='color:red'>"
msgstr "" msgstr ""
@@ -80,6 +80,8 @@ msgid ""
"etc.</h3>" "etc.</h3>"
msgstr "" 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: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:1588
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1601 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1601
@@ -206,7 +208,7 @@ msgstr ""
msgid "Anti-pollution DNS Server" msgid "Anti-pollution DNS Server"
msgstr "" 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" msgid "Apple Domains DNS"
msgstr "" msgstr ""
@@ -214,11 +216,11 @@ msgstr ""
msgid "Apple Domains Data" msgid "Apple Domains Data"
msgstr "" 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" msgid "Apple Domains Update url"
msgstr "" 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" msgid "Apple domains optimization"
msgstr "" msgstr ""
@@ -366,7 +368,7 @@ msgstr ""
msgid "Check Server Port" msgid "Check Server Port"
msgstr "" 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" msgid "Check Try Count"
msgstr "" msgstr ""
@@ -381,7 +383,7 @@ msgid ""
"release page." "release page."
msgstr "" 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)" msgid "Check timout(second)"
msgstr "" msgstr ""
@@ -403,15 +405,15 @@ msgstr ""
msgid "ChinaDNS-NG query protocol" msgid "ChinaDNS-NG query protocol"
msgstr "" 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" msgid "Chnroute Update url"
msgstr "" 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" msgid "Clang.CN"
msgstr "" 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" msgid "Clang.CN.CIDR"
msgstr "" msgstr ""
@@ -454,7 +456,7 @@ msgstr ""
msgid "Clear logs" msgid "Clear logs"
msgstr "" 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: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:1452
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479
@@ -663,7 +665,7 @@ msgstr ""
msgid "Default" msgid "Default"
msgstr "" 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" msgid "Default Node Local Port"
msgstr "" msgstr ""
@@ -704,7 +706,7 @@ msgid ""
"entries before the original Clash rules." "entries before the original Clash rules."
msgstr "" 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)" msgid "Delay (ms)"
msgstr "" msgstr ""
@@ -766,7 +768,7 @@ msgstr ""
msgid "DoT upstream (Need use wolfssl version)" msgid "DoT upstream (Need use wolfssl version)"
msgstr "" 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" msgid "Domain Strategy"
msgstr "" msgstr ""
@@ -816,9 +818,9 @@ msgstr ""
msgid "Edit ShadowSocksR Server" msgid "Edit ShadowSocksR Server"
msgstr "" msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:198 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:218
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:278 #: 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-config.lua:54
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:581 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:581
@@ -835,7 +837,7 @@ msgstr ""
msgid "Enable Authentication" msgid "Enable Authentication"
msgstr "" 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 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1739
msgid "Enable Auto Switch" msgid "Enable Auto Switch"
msgstr "" msgstr ""
@@ -890,7 +892,7 @@ msgstr ""
msgid "Enable V3 protocol." msgid "Enable V3 protocol."
msgstr "" 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" msgid "Enable adblock"
msgstr "" msgstr ""
@@ -906,7 +908,7 @@ msgstr ""
msgid "Enabled Kernel virtual NIC TUN(optional)" msgid "Enabled Kernel virtual NIC TUN(optional)"
msgstr "" 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" msgid "Enabled Mixed"
msgstr "" msgstr ""
@@ -1048,13 +1050,13 @@ msgstr ""
msgid "Flow" msgid "Flow"
msgstr "" 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 "" msgid ""
"For Apple domains equipped with Chinese mainland CDN, always responsive to " "For Apple domains equipped with Chinese mainland CDN, always responsive to "
"Chinese CDN IP addresses" "Chinese CDN IP addresses"
msgstr "" 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:" msgid "For specific usage, see:"
msgstr "" msgstr ""
@@ -1064,27 +1066,27 @@ msgid ""
"(,)." "(,)."
msgstr "" 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" msgid "Fragment"
msgstr "" 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" msgid "Fragment Delay"
msgstr "" 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" msgid "Fragment Length"
msgstr "" 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" msgid "Fragment Packets"
msgstr "" 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)" msgid "Fragmentation interval (ms)"
msgstr "" 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)" msgid "Fragmented packet length (byte)"
msgstr "" msgstr ""
@@ -1134,7 +1136,7 @@ msgstr ""
msgid "Global Client" msgid "Global Client"
msgstr "" 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 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:213
msgid "Global HTTP/HTTPS Proxy Server" msgid "Global HTTP/HTTPS Proxy Server"
msgstr "" msgstr ""
@@ -1143,7 +1145,7 @@ msgstr ""
msgid "Global Mode" msgid "Global Mode"
msgstr "" 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 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:204
msgid "Global SOCKS5 Proxy Server" msgid "Global SOCKS5 Proxy Server"
msgstr "" msgstr ""
@@ -1195,7 +1197,7 @@ msgstr ""
msgid "HTTP" msgid "HTTP"
msgstr "" 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" msgid "HTTP Auth Mode"
msgstr "" msgstr ""
@@ -1204,7 +1206,7 @@ msgstr ""
msgid "HTTP Host" msgid "HTTP Host"
msgstr "" 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" msgid "HTTP Password"
msgstr "" msgstr ""
@@ -1213,11 +1215,11 @@ msgstr ""
msgid "HTTP Path" msgid "HTTP Path"
msgstr "" 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" msgid "HTTP User"
msgstr "" 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." msgid "HTTP proxy auth method, default:none."
msgstr "" msgstr ""
@@ -1280,7 +1282,7 @@ msgstr ""
msgid "IP Stack Preference" msgid "IP Stack Preference"
msgstr "" 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)" msgid "If empty, Not change Apple domains parsing DNS (Default is empty)"
msgstr "" msgstr ""
@@ -1479,7 +1481,7 @@ msgstr ""
msgid "Level 3 Public DNS-3 (4.2.2.3-4)" msgid "Level 3 Public DNS-3 (4.2.2.3-4)"
msgstr "" 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." msgid "Limit the maximum number of splits."
msgstr "" msgstr ""
@@ -1498,8 +1500,8 @@ msgstr ""
msgid "Loading..." msgid "Loading..."
msgstr "" msgstr ""
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:217 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:237
msgid "Local Port" msgid "Local Port"
msgstr "" msgstr ""
@@ -1519,11 +1521,11 @@ msgstr ""
msgid "Loop Mode" msgid "Loop Mode"
msgstr "" 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" msgid "Loukky/gfwlist-by-loukky"
msgstr "" 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" msgid "Loyalsoldier/v2ray-rules-dat"
msgstr "" msgstr ""
@@ -1558,7 +1560,7 @@ msgstr ""
msgid "Max Early Data" msgid "Max Early Data"
msgstr "" 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" msgid "Max Split"
msgstr "" msgstr ""
@@ -1611,7 +1613,7 @@ msgstr ""
msgid "Missing xz support" msgid "Missing xz support"
msgstr "" 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." msgid "Mixed as an alias of socks, default:Enabled."
msgstr "" msgstr ""
@@ -1644,7 +1646,7 @@ msgstr ""
msgid "Mux" msgid "Mux"
msgstr "" 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" msgid "NEO DEV HOST"
msgstr "" msgstr ""
@@ -1730,7 +1732,7 @@ msgid ""
"the table." "the table."
msgstr "" 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" msgid "Noise"
msgstr "" msgstr ""
@@ -1768,6 +1770,18 @@ msgid ""
"compatibility issues." "compatibility issues."
msgstr "" 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 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1644
msgid "Number of early established connections to reduce latency." msgid "Number of early established connections to reduce latency."
msgstr "" msgstr ""
@@ -1804,19 +1818,19 @@ msgstr ""
msgid "Only Common Ports" msgid "Only Common Ports"
msgstr "" 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." msgid "Only when HTTP Auth Mode is password valid, Mandatory."
msgstr "" 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." msgid "Only when HTTP Auth Mode is password valid, Not mandatory."
msgstr "" 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." msgid "Only when Socks5 Auth Mode is password valid, Mandatory."
msgstr "" 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." msgid "Only when Socks5 Auth Mode is password valid, Not mandatory."
msgstr "" msgstr ""
@@ -1838,11 +1852,11 @@ msgstr ""
msgid "Package Name" msgid "Package Name"
msgstr "" 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." msgid "Packet or Rand length as a string, e.g., 10-20."
msgstr "" 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" msgid "Packet | Rand Length"
msgstr "" msgstr ""
@@ -2129,7 +2143,7 @@ msgstr ""
msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?" msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?"
msgstr "" 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" msgid "Reset to defaults"
msgstr "" msgstr ""
@@ -2258,7 +2272,7 @@ msgstr ""
msgid "Server Type" msgid "Server Type"
msgstr "" 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" msgid "Server failsafe auto swith and custom update settings"
msgstr "" msgstr ""
@@ -2368,7 +2382,7 @@ msgstr ""
msgid "Socks Version" msgid "Socks Version"
msgstr "" 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." msgid "Socks protocol auth methods, default:noauth."
msgstr "" msgstr ""
@@ -2377,15 +2391,15 @@ msgstr ""
msgid "Socks5" msgid "Socks5"
msgstr "" 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" msgid "Socks5 Auth Mode"
msgstr "" 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" msgid "Socks5 Password"
msgstr "" 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" msgid "Socks5 User"
msgstr "" msgstr ""
@@ -2466,7 +2480,7 @@ msgstr ""
msgid "Successfully retrieved certificate name:" msgid "Successfully retrieved certificate name:"
msgstr "" 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" msgid "Support AdGuardHome and DNSMASQ format list"
msgstr "" msgstr ""
@@ -2480,7 +2494,7 @@ msgid ""
"a maximum length of 3 bytes." "a maximum length of 3 bytes."
msgstr "" 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)" msgid "Switch check cycly(second)"
msgstr "" msgstr ""
@@ -2509,7 +2523,7 @@ msgstr ""
msgid "TCP Fast Open" msgid "TCP Fast Open"
msgstr "" 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 "" msgid ""
"TCP fragments, which can deceive the censorship system in some cases, such " "TCP fragments, which can deceive the censorship system in some cases, such "
"as bypassing SNI blacklists." "as bypassing SNI blacklists."
@@ -2644,7 +2658,7 @@ msgstr ""
msgid "Timeout for establishing a connection to server(second)" msgid "Timeout for establishing a connection to server(second)"
msgstr "" 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." msgid "To send noise packets, select \"Noise\" in Xray Settings."
msgstr "" msgstr ""
@@ -2675,7 +2689,7 @@ msgstr ""
msgid "Try Count" msgid "Try Count"
msgstr "" 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 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:695
msgid "Type" msgid "Type"
msgstr "" msgstr ""
@@ -2684,7 +2698,7 @@ msgstr ""
msgid "UDP" msgid "UDP"
msgstr "" 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 "" msgid ""
"UDP noise, Under some circumstances it can bypass some UDP based protocol " "UDP noise, Under some circumstances it can bypass some UDP based protocol "
"restrictions." "restrictions."
@@ -3009,11 +3023,11 @@ msgstr ""
msgid "Xray" msgid "Xray"
msgstr "" 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" msgid "Xray Fragment Settings"
msgstr "" 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" msgid "Xray Noise Packets"
msgstr "" msgstr ""
@@ -3032,7 +3046,7 @@ msgstr ""
msgid "YAML Reloaded!" msgid "YAML Reloaded!"
msgstr "" 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" msgid "adblock_url"
msgstr "" msgstr ""
@@ -3060,7 +3074,7 @@ msgstr ""
msgid "android" msgid "android"
msgstr "" 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" msgid "anti-AD"
msgstr "" msgstr ""
@@ -3068,7 +3082,7 @@ msgstr ""
msgid "chacha20-poly1305" msgid "chacha20-poly1305"
msgstr "" 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" msgid "china-operator-ip"
msgstr "" msgstr ""
@@ -3114,7 +3128,7 @@ msgstr ""
msgid "edge" msgid "edge"
msgstr "" 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" msgid "felixonmars/dnsmasq-china-list"
msgstr "" msgstr ""
@@ -3135,11 +3149,11 @@ msgstr ""
msgid "gRPC Service Name" msgid "gRPC Service Name"
msgstr "" 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" msgid "gfwlist Update url"
msgstr "" 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" msgid "gfwlist/gfwlist"
msgstr "" msgstr ""
@@ -3235,7 +3249,7 @@ msgstr ""
msgid "spiderX" msgid "spiderX"
msgstr "" 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" msgid "v2fly/domain-list-community"
msgstr "" msgstr ""
+85 -71
View File
@@ -1,7 +1,7 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n" 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 "" msgid ""
"\"1-3\" is for segmentation at TCP layer, applying to the beginning 1 to 3 " "\"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 " "data writes by the client. \"tlshello\" is for TLS client hello packet "
@@ -66,7 +66,7 @@ msgstr ""
msgid "8 Threads" msgid "8 Threads"
msgstr "8 线程" 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 "<font style='color:red'>" msgid "<font style='color:red'>"
msgstr "" msgstr ""
@@ -84,6 +84,8 @@ msgstr ""
"<h3>支持 SS/SSR/V2RAY/XRAY/TROJAN/TUIC/HYSTERIA2/NAIVEPROXY/SOCKS5/CLASH 等协" "<h3>支持 SS/SSR/V2RAY/XRAY/TROJAN/TUIC/HYSTERIA2/NAIVEPROXY/SOCKS5/CLASH 等协"
"议。</h3>" "议。</h3>"
#: 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: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:1588
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1601 #: 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" msgid "Anti-pollution DNS Server"
msgstr "访问国外域名 DNS 服务器" 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" msgid "Apple Domains DNS"
msgstr "Apple 域名 DNS" msgstr "Apple 域名 DNS"
@@ -218,11 +220,11 @@ msgstr "Apple 域名 DNS"
msgid "Apple Domains Data" msgid "Apple Domains Data"
msgstr "【Apple 域名】数据库" 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" msgid "Apple Domains Update url"
msgstr "Apple 域名更新 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" msgid "Apple domains optimization"
msgstr "Apple 域名解析优化" msgstr "Apple 域名解析优化"
@@ -370,7 +372,7 @@ msgstr "检查服务器"
msgid "Check Server Port" msgid "Check Server Port"
msgstr "【服务器端口】检查" 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" msgid "Check Try Count"
msgstr "切换检查重试次数" msgstr "切换检查重试次数"
@@ -385,7 +387,7 @@ msgid ""
"release page." "release page."
msgstr "检测已安装组件版本,并从上游发布页在线升级。" 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)" msgid "Check timout(second)"
msgstr "切换检查超时时间(秒)" msgstr "切换检查超时时间(秒)"
@@ -407,15 +409,15 @@ msgstr "【中国大陆 IP 段】数据库"
msgid "ChinaDNS-NG query protocol" msgid "ChinaDNS-NG query protocol"
msgstr "ChinaDNS-NG 查询协议" 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" msgid "Chnroute Update url"
msgstr "中国大陆 IP 段更新 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" msgid "Clang.CN"
msgstr "" 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" msgid "Clang.CN.CIDR"
msgstr "" msgstr ""
@@ -458,7 +460,7 @@ msgstr "清空所有自定义客户端代理规则,并恢复为空白状态吗
msgid "Clear logs" msgid "Clear logs"
msgstr "清空日志" 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: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:1452
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479
@@ -668,7 +670,7 @@ msgstr "解密"
msgid "Default" msgid "Default"
msgstr "默认" 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" msgid "Default Node Local Port"
msgstr "节点默认本地端口" msgstr "节点默认本地端口"
@@ -713,7 +715,7 @@ msgstr ""
"为每个客户端指定 Mihomo 代理目标。规则会以 SRC-IP-CIDR 形式注入到原始 Clash " "为每个客户端指定 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)" msgid "Delay (ms)"
msgstr "延迟(ms)" msgstr "延迟(ms)"
@@ -775,7 +777,7 @@ msgstr "是否要恢复客户端默认配置?"
msgid "DoT upstream (Need use wolfssl version)" msgid "DoT upstream (Need use wolfssl version)"
msgstr "DoT 上游(需使用 wolfssl 版本)" 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" msgid "Domain Strategy"
msgstr "域名解析策略" msgstr "域名解析策略"
@@ -825,9 +827,9 @@ msgstr "编辑"
msgid "Edit ShadowSocksR Server" msgid "Edit ShadowSocksR Server"
msgstr "编辑服务器配置" msgstr "编辑服务器配置"
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:157 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:198 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:218
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:278 #: 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-config.lua:54
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:581 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:581
@@ -844,7 +846,7 @@ msgstr "客户端启用 0-RTT QUIC 连接握手"
msgid "Enable Authentication" msgid "Enable Authentication"
msgstr "启用用户名/密码认证" 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 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1739
msgid "Enable Auto Switch" msgid "Enable Auto Switch"
msgstr "启用自动切换" msgstr "启用自动切换"
@@ -899,7 +901,7 @@ msgstr "开启 V2 协议。"
msgid "Enable V3 protocol." msgid "Enable V3 protocol."
msgstr "开启 V3 协议。" 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" msgid "Enable adblock"
msgstr "启用广告屏蔽" msgstr "启用广告屏蔽"
@@ -915,7 +917,7 @@ msgstr "启用此选项配置 XHTTP 附加项(JSON 格式)。"
msgid "Enabled Kernel virtual NIC TUN(optional)" msgid "Enabled Kernel virtual NIC TUN(optional)"
msgstr "启用内核的虚拟网卡 TUN(可选)" 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" msgid "Enabled Mixed"
msgstr "启用 Mixed" msgstr "启用 Mixed"
@@ -1057,13 +1059,13 @@ msgstr "指纹伪造"
msgid "Flow" msgid "Flow"
msgstr "流控(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 "" msgid ""
"For Apple domains equipped with Chinese mainland CDN, always responsive to " "For Apple domains equipped with Chinese mainland CDN, always responsive to "
"Chinese CDN IP addresses" "Chinese CDN IP addresses"
msgstr "配备中国大陆 CDN 的 Apple 域名,始终应答中国大陆 CDN 地址" 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:" msgid "For specific usage, see:"
msgstr "具体使用方法,具体请参见:" msgstr "具体使用方法,具体请参见:"
@@ -1073,27 +1075,27 @@ msgid ""
"(,)." "(,)."
msgstr "格式为:10000:20000 或 10000-20000 多组时用逗号(,)隔开。" 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" msgid "Fragment"
msgstr "分片" 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" msgid "Fragment Delay"
msgstr "分片延迟" 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" msgid "Fragment Length"
msgstr "分片包长" 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" msgid "Fragment Packets"
msgstr "分片方式" 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)" msgid "Fragmentation interval (ms)"
msgstr "分片间隔(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)" msgid "Fragmented packet length (byte)"
msgstr "分片包长 (byte)" msgstr "分片包长 (byte)"
@@ -1143,7 +1145,7 @@ msgstr "GitHub 直连"
msgid "Global Client" msgid "Global Client"
msgstr "TCP 透明代理" 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 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:213
msgid "Global HTTP/HTTPS Proxy Server" msgid "Global HTTP/HTTPS Proxy Server"
msgstr "HTTP/HTTPS 代理服务端(全局)" msgstr "HTTP/HTTPS 代理服务端(全局)"
@@ -1152,7 +1154,7 @@ msgstr "HTTP/HTTPS 代理服务端(全局)"
msgid "Global Mode" msgid "Global Mode"
msgstr "全局模式" 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 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:204
msgid "Global SOCKS5 Proxy Server" msgid "Global SOCKS5 Proxy Server"
msgstr "SOCKS5 代理服务端(全局)" msgstr "SOCKS5 代理服务端(全局)"
@@ -1204,7 +1206,7 @@ msgstr "H2/gRPC 健康检查"
msgid "HTTP" msgid "HTTP"
msgstr "" 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" msgid "HTTP Auth Mode"
msgstr "HTTP 认证模式" msgstr "HTTP 认证模式"
@@ -1213,7 +1215,7 @@ msgstr "HTTP 认证模式"
msgid "HTTP Host" msgid "HTTP Host"
msgstr "HTTP 主机名" 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" msgid "HTTP Password"
msgstr "HTTP 密码" msgstr "HTTP 密码"
@@ -1222,11 +1224,11 @@ msgstr "HTTP 密码"
msgid "HTTP Path" msgid "HTTP Path"
msgstr "HTTP 路径" 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" msgid "HTTP User"
msgstr "HTTP 用户名" 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." msgid "HTTP proxy auth method, default:none."
msgstr "HTTP 代理认证方式,默认:none。" msgstr "HTTP 代理认证方式,默认:none。"
@@ -1289,7 +1291,7 @@ msgstr "绕过中国大陆 IP 模式"
msgid "IP Stack Preference" msgid "IP Stack Preference"
msgstr "IP 栈优先级" 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)" msgid "If empty, Not change Apple domains parsing DNS (Default is empty)"
msgstr "如果为空,则不更改 Apple 域名解析 DNS(默认为空)" msgstr "如果为空,则不更改 Apple 域名解析 DNS(默认为空)"
@@ -1489,7 +1491,7 @@ msgstr ""
msgid "Level 3 Public DNS-3 (4.2.2.3-4)" msgid "Level 3 Public DNS-3 (4.2.2.3-4)"
msgstr "" 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." msgid "Limit the maximum number of splits."
msgstr "限制分片的最大数量。" msgstr "限制分片的最大数量。"
@@ -1508,8 +1510,8 @@ msgstr "仅监听指定的接口,未指定则监听全部。"
msgid "Loading..." msgid "Loading..."
msgstr "加载中..." msgstr "加载中..."
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207
#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:217 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:237
msgid "Local Port" msgid "Local Port"
msgstr "本地端口" msgstr "本地端口"
@@ -1529,11 +1531,11 @@ msgstr "日志"
msgid "Loop Mode" msgid "Loop Mode"
msgstr "循环模式" 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" msgid "Loukky/gfwlist-by-loukky"
msgstr "" 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" msgid "Loyalsoldier/v2ray-rules-dat"
msgstr "" msgstr ""
@@ -1570,7 +1572,7 @@ msgstr "未找到匹配的发布资产"
msgid "Max Early Data" msgid "Max Early Data"
msgstr "最大前置数据" 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" msgid "Max Split"
msgstr "最大分片数" msgstr "最大分片数"
@@ -1625,7 +1627,7 @@ msgstr "缺少 unzip 支持"
msgid "Missing xz support" msgid "Missing xz support"
msgstr "缺少 xz 支持" 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." msgid "Mixed as an alias of socks, default:Enabled."
msgstr "Mixed 作为 SOCKS 的别名,默认:启用。" msgstr "Mixed 作为 SOCKS 的别名,默认:启用。"
@@ -1658,7 +1660,7 @@ msgstr "必须是 JSON 文本内容!"
msgid "Mux" msgid "Mux"
msgstr "" 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" msgid "NEO DEV HOST"
msgstr "" msgstr ""
@@ -1745,7 +1747,7 @@ msgid ""
msgstr "" 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" msgid "Noise"
msgstr "噪声" msgstr "噪声"
@@ -1783,6 +1785,18 @@ msgid ""
"compatibility issues." "compatibility issues."
msgstr "注意:不同版本间的配置恢复可能会导致兼容性问题。" 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 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1644
msgid "Number of early established connections to reduce latency." msgid "Number of early established connections to reduce latency."
msgstr "预连接的数量,用于降低延迟。" msgstr "预连接的数量,用于降低延迟。"
@@ -1819,19 +1833,19 @@ msgstr "设置后,仅在服务器证书链指纹匹配时连接。"
msgid "Only Common Ports" msgid "Only Common Ports"
msgstr "仅常用端口(不走 P2P 流量到代理)" 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." msgid "Only when HTTP Auth Mode is password valid, Mandatory."
msgstr "仅当 HTTP 认证模式为 password 时有效,必填。" 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." msgid "Only when HTTP Auth Mode is password valid, Not mandatory."
msgstr "仅当 HTTP 认证模式为 password 时有效,非必填。" 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." msgid "Only when Socks5 Auth Mode is password valid, Mandatory."
msgstr "仅当 Socks5 认证方式为 Password 时有效,必填。" 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." msgid "Only when Socks5 Auth Mode is password valid, Not mandatory."
msgstr "仅当 Socks5 认证方式为 Password 时有效,非必填。" msgstr "仅当 Socks5 认证方式为 Password 时有效,非必填。"
@@ -1853,11 +1867,11 @@ msgstr ""
msgid "Package Name" msgid "Package Name"
msgstr "组件包名称" 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." msgid "Packet or Rand length as a string, e.g., 10-20."
msgstr "数据包或 Rand 长度以字符串形式输入,例如: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" msgid "Packet | Rand Length"
msgstr "数据包 | Rand 长度" msgstr "数据包 | Rand 长度"
@@ -2144,7 +2158,7 @@ msgstr "重置完成"
msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?" msgid "Reset saved Mihomo proxy-group selections and restore YAML defaults?"
msgstr "要清空已保存的 Mihomo 分组选择,并恢复为 YAML 默认值吗?" 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" msgid "Reset to defaults"
msgstr "恢复出厂设置" msgstr "恢复出厂设置"
@@ -2274,7 +2288,7 @@ msgstr "服务端配置"
msgid "Server Type" msgid "Server Type"
msgstr "服务端类型" 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" msgid "Server failsafe auto swith and custom update settings"
msgstr "服务器节点故障自动切换/广告屏蔽/中国大陆 IP 段数据库更新设置" msgstr "服务器节点故障自动切换/广告屏蔽/中国大陆 IP 段数据库更新设置"
@@ -2384,7 +2398,7 @@ msgstr ""
msgid "Socks Version" msgid "Socks Version"
msgstr "Socks 版本" 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." msgid "Socks protocol auth methods, default:noauth."
msgstr "Socks 协议的认证方式,默认值:noauth。" msgstr "Socks 协议的认证方式,默认值:noauth。"
@@ -2393,15 +2407,15 @@ msgstr "Socks 协议的认证方式,默认值:noauth。"
msgid "Socks5" msgid "Socks5"
msgstr "" 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" msgid "Socks5 Auth Mode"
msgstr "Socks5 认证方式" 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" msgid "Socks5 Password"
msgstr "Socks5 密码" 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" msgid "Socks5 User"
msgstr "Socks5 用户名" msgstr "Socks5 用户名"
@@ -2482,7 +2496,7 @@ msgstr "已成功获取证书指纹:"
msgid "Successfully retrieved certificate name:" msgid "Successfully retrieved certificate name:"
msgstr "已成功获取证书名称:" 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" msgid "Support AdGuardHome and DNSMASQ format list"
msgstr "同时支持 AdGuard Home 和 DNSMASQ 格式的过滤列表" msgstr "同时支持 AdGuard Home 和 DNSMASQ 格式的过滤列表"
@@ -2498,7 +2512,7 @@ msgstr ""
"支持以“,”分隔的十进制数字,或者经过 Base64 编码的字符串,其最大长度为 3 个字" "支持以“,”分隔的十进制数字,或者经过 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)" msgid "Switch check cycly(second)"
msgstr "自动切换检查周期(秒)" msgstr "自动切换检查周期(秒)"
@@ -2527,7 +2541,7 @@ msgstr "TCP 伪装类型"
msgid "TCP Fast Open" msgid "TCP Fast Open"
msgstr "TCP 快速打开" 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 "" msgid ""
"TCP fragments, which can deceive the censorship system in some cases, such " "TCP fragments, which can deceive the censorship system in some cases, such "
"as bypassing SNI blacklists." "as bypassing SNI blacklists."
@@ -2670,7 +2684,7 @@ msgstr "超时"
msgid "Timeout for establishing a connection to server(second)" msgid "Timeout for establishing a connection to server(second)"
msgstr "连接超时时间(单位:秒)" 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." msgid "To send noise packets, select \"Noise\" in Xray Settings."
msgstr "在 Xray 设置中勾选 “噪声” 以发送噪声包。" msgstr "在 Xray 设置中勾选 “噪声” 以发送噪声包。"
@@ -2701,7 +2715,7 @@ msgstr "Trojan 密码"
msgid "Try Count" msgid "Try Count"
msgstr "重试次数" 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 #: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:695
msgid "Type" msgid "Type"
msgstr "类型" msgstr "类型"
@@ -2710,7 +2724,7 @@ msgstr "类型"
msgid "UDP" msgid "UDP"
msgstr "" 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 "" msgid ""
"UDP noise, Under some circumstances it can bypass some UDP based protocol " "UDP noise, Under some circumstances it can bypass some UDP based protocol "
"restrictions." "restrictions."
@@ -3037,11 +3051,11 @@ msgstr ""
msgid "Xray" msgid "Xray"
msgstr "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" msgid "Xray Fragment Settings"
msgstr "Xray 分片设置" 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" msgid "Xray Noise Packets"
msgstr "Xray 噪声数据包" msgstr "Xray 噪声数据包"
@@ -3060,7 +3074,7 @@ msgstr "YAML 重载失败!"
msgid "YAML Reloaded!" msgid "YAML Reloaded!"
msgstr "YAML 已重载!" 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" msgid "adblock_url"
msgstr "广告屏蔽更新 URL" msgstr "广告屏蔽更新 URL"
@@ -3088,7 +3102,7 @@ msgstr "allowedIPs(可选)"
msgid "android" msgid "android"
msgstr "" 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" msgid "anti-AD"
msgstr "" msgstr ""
@@ -3096,7 +3110,7 @@ msgstr ""
msgid "chacha20-poly1305" msgid "chacha20-poly1305"
msgstr "" 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" msgid "china-operator-ip"
msgstr "" msgstr ""
@@ -3142,7 +3156,7 @@ msgstr "例如:/etc/ssl/private.key"
msgid "edge" msgid "edge"
msgstr "" 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" msgid "felixonmars/dnsmasq-china-list"
msgstr "" msgstr ""
@@ -3163,11 +3177,11 @@ msgstr "gRPC 模式"
msgid "gRPC Service Name" msgid "gRPC Service Name"
msgstr "gRPC 服务名称" 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" msgid "gfwlist Update url"
msgstr "GFW 列表更新 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" msgid "gfwlist/gfwlist"
msgstr "" msgstr ""
@@ -3264,7 +3278,7 @@ msgstr ""
msgid "spiderX" msgid "spiderX"
msgstr "" 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" msgid "v2fly/domain-list-community"
msgstr "" msgstr ""
@@ -59,10 +59,14 @@ local function parse_realm_uri(uri)
local scheme, token, server_url, realm_id, query = trim(uri):match("^(realm%+http|realm)://([^@]+)@([^/]+)/([^?]*)%??(.*)$") 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 if not scheme or not token or not server_url or not realm_id then return nil end
realm_id = realm_id:gsub("/+$", "") 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 = { local realm = {
scheme = scheme, scheme = scheme,
token = token, token = token,
server_url = server_url, server_url = server_url,
address = address,
port = port,
realm_id = realm_id realm_id = realm_id
} }
-- 解析 query 中的 stun= -- 解析 query 中的 stun=
@@ -292,6 +296,15 @@ function xray_hysteria2()
address = server.server, address = server.server,
port = tonumber(server.server_port) 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 end
local outbound = {} local outbound = {}
function outbound:new(o) function outbound:new(o)
@@ -700,15 +713,56 @@ Xray.outbounds = {
local n_maxsplit = xray_fragment.fragment_maxSplit local n_maxsplit = xray_fragment.fragment_maxSplit
--local domainstr = xray_noise.domainStrategy --local domainstr = xray_noise.domainStrategy
finalmask.tcp = finalmask.tcp or {} 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] = { finalmask.tcp[#finalmask.tcp + 1] = {
type = "fragment", type = "fragment",
settings = { settings = 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
}
} }
end end
if xray_fragment.noise == "1" and (TP == "kcp" or (TP == "xhttp" and (server.tls_alpn == "h3" or server.tls_alpn == "h3,h2"))) then if xray_fragment.noise == "1" and (TP == "kcp" or (TP == "xhttp" and (server.tls_alpn == "h3" or server.tls_alpn == "h3,h2"))) then
+2 -2
View File
@@ -10,12 +10,12 @@ include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=natflow PKG_NAME:=natflow
PKG_VERSION:=20260531 PKG_VERSION:=20260531
PKG_RELEASE:=19 PKG_RELEASE:=20
PKG_SOURCE:=$(PKG_VERSION).tar.xz PKG_SOURCE:=$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=https://github.com/ptpt52/natflow.git PKG_SOURCE_URL:=https://github.com/ptpt52/natflow.git
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=d048ff525d0ab9780a2af16a56a1359b7b14beb4 PKG_SOURCE_VERSION:=c1f7aae14a67a8a2f8edd9641c69ccf77654c42a
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_MAINTAINER:=Chen Minqiang <ptpt52@gmail.com> PKG_MAINTAINER:=Chen Minqiang <ptpt52@gmail.com>
PKG_LICENSE:=GPL-2.0 PKG_LICENSE:=GPL-2.0