mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-07-27 10:31:38 +08:00
🤞 Sync 2026-06-25 00:16:31
This commit is contained in:
parent
7e9cb31284
commit
7250d97e2b
@ -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)
|
||||
|
||||
|
||||
@ -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.');
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -3,35 +3,60 @@
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Last-Translator: Konstantine Shevlakov <shevlakov@132lan.ru>\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.<br />DO NOT POWER OFF THIS DEVICE!<br />System will be upgrade completed after reboot!"
|
||||
msgstr "Загрузка обновления завершена. Запущен процесс обновления.<br />НЕ ВЫКЛЮЧАЙТЕ УСТРОЙСТВО!<br />Система будет обновлена после перезагрузки!"
|
||||
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 "Обновление, устройство будет перезагружено"
|
||||
|
||||
8
luci-app-ota/root/usr/share/ota-launch.sh
Executable file
8
luci-app-ota/root/usr/share/ota-launch.sh
Executable 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
|
||||
@ -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
|
||||
|
||||
@ -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"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 \
|
||||
|
||||
@ -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(
|
||||
"<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.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(
|
||||
"<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.datatype = "or(uinteger,portrange)"
|
||||
|
||||
@ -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 "<font style='color:red'>"
|
||||
msgstr ""
|
||||
|
||||
@ -80,6 +80,8 @@ msgid ""
|
||||
"etc.</h3>"
|
||||
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 ""
|
||||
|
||||
|
||||
@ -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 "<font style='color:red'>"
|
||||
msgstr ""
|
||||
|
||||
@ -84,6 +84,8 @@ msgstr ""
|
||||
"<h3>支持 SS/SSR/V2RAY/XRAY/TROJAN/TUIC/HYSTERIA2/NAIVEPROXY/SOCKS5/CLASH 等协"
|
||||
"议。</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: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 ""
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 <ptpt52@gmail.com>
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
Loading…
Reference in New Issue
Block a user