mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-10-30 03:45:14 +08:00
🤞 Sync 2026-05-16 20:23:58
This commit is contained in:
1 parent
ccfd18b795
commit
1d77fe1b27
38 files changed
+469
-4489
No files matched your search
@@ -2,8 +2,8 @@ include $(TOPDIR)/rules.mk
|
|||||||
-include $(dir $(lastword $(MAKEFILE_LIST)))../version.mk
|
-include $(dir $(lastword $(MAKEFILE_LIST)))../version.mk
|
||||||
|
|
||||||
PKG_NAME:=easytier-noweb
|
PKG_NAME:=easytier-noweb
|
||||||
PKG_VERSION:=$(or $(EASYTIER_VERSION),2.6.2)
|
PKG_VERSION:=$(or $(EASYTIER_VERSION),2.6.4)
|
||||||
PKG_RELEASE:=2
|
PKG_RELEASE:=3
|
||||||
|
|
||||||
ifeq ($(ARCH),mipsel)
|
ifeq ($(ARCH),mipsel)
|
||||||
APP_ARCH:=mipsel
|
APP_ARCH:=mipsel
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@ include $(TOPDIR)/rules.mk
|
|||||||
-include $(dir $(lastword $(MAKEFILE_LIST)))../version.mk
|
-include $(dir $(lastword $(MAKEFILE_LIST)))../version.mk
|
||||||
|
|
||||||
PKG_NAME:=easytier
|
PKG_NAME:=easytier
|
||||||
PKG_VERSION:=$(or $(EASYTIER_VERSION),2.6.2)
|
PKG_VERSION:=$(or $(EASYTIER_VERSION),2.6.4)
|
||||||
PKG_RELEASE:=5
|
PKG_RELEASE:=6
|
||||||
|
|
||||||
ifeq ($(ARCH),mipsel)
|
ifeq ($(ARCH),mipsel)
|
||||||
APP_ARCH:=mipsel
|
APP_ARCH:=mipsel
|
||||||
|
|||||||
Whitespace-only changes.
@@ -7,8 +7,8 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
-include $(dir $(lastword $(MAKEFILE_LIST)))../version.mk
|
-include $(dir $(lastword $(MAKEFILE_LIST)))../version.mk
|
||||||
|
|
||||||
PKG_VERSION:=$(or $(EASYTIER_VERSION),2.6.2)
|
PKG_VERSION:=$(or $(EASYTIER_VERSION),2.6.4)
|
||||||
PKG_RELEASE:=8
|
PKG_RELEASE:=9
|
||||||
|
|
||||||
LUCI_TITLE:=LuCI support for EasyTier
|
LUCI_TITLE:=LuCI support for EasyTier
|
||||||
LUCI_DEPENDS:=+kmod-tun +easytier +luci-compat
|
LUCI_DEPENDS:=+kmod-tun +easytier +luci-compat
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ function get_upload_config()
|
|||||||
easytierbin = uci:get_first("easytier", "easytier", "easytierbin") or "/usr/bin/easytier-core",
|
easytierbin = uci:get_first("easytier", "easytier", "easytierbin") or "/usr/bin/easytier-core",
|
||||||
webbin = uci:get_first("easytier", "easytier", "webbin") or "/usr/bin/easytier-web",
|
webbin = uci:get_first("easytier", "easytier", "webbin") or "/usr/bin/easytier-web",
|
||||||
github_proxys = {},
|
github_proxys = {},
|
||||||
fallback_version = uci:get_first("easytier", "easytier", "fallback_version") or "v2.6.2"
|
fallback_version = uci:get_first("easytier", "easytier", "fallback_version") or "v2.6.4"
|
||||||
}
|
}
|
||||||
|
|
||||||
-- 读取代理列表(list 类型)
|
-- 读取代理列表(list 类型)
|
||||||
@@ -200,7 +200,7 @@ function save_upload_config()
|
|||||||
-- 保存配置
|
-- 保存配置
|
||||||
uci:set("easytier", "@easytier[0]", "easytierbin", data.easytierbin or "/usr/bin/easytier-core")
|
uci:set("easytier", "@easytier[0]", "easytierbin", data.easytierbin or "/usr/bin/easytier-core")
|
||||||
uci:set("easytier", "@easytier[0]", "webbin", data.webbin or "/usr/bin/easytier-web")
|
uci:set("easytier", "@easytier[0]", "webbin", data.webbin or "/usr/bin/easytier-web")
|
||||||
uci:set("easytier", "@easytier[0]", "fallback_version", data.fallback_version or "v2.6.2")
|
uci:set("easytier", "@easytier[0]", "fallback_version", data.fallback_version or "v2.6.4")
|
||||||
|
|
||||||
-- 删除旧的代理列表
|
-- 删除旧的代理列表
|
||||||
uci:delete("easytier", "@easytier[0]", "github_proxys")
|
uci:delete("easytier", "@easytier[0]", "github_proxys")
|
||||||
|
|||||||
@@ -56,12 +56,6 @@ network_name = s:taboption("general", Value, "network_name", translate("Network
|
|||||||
network_name.password = true
|
network_name.password = true
|
||||||
network_name.placeholder = "easytier-name"
|
network_name.placeholder = "easytier-name"
|
||||||
network_name.maxlength = 64
|
network_name.maxlength = 64
|
||||||
network_name.validate = function(self, value)
|
|
||||||
if value and value ~= "" and value:match("[^%w%-_]") then
|
|
||||||
return nil, translate("Only alphanumeric characters, hyphens and underscores allowed")
|
|
||||||
end
|
|
||||||
return value
|
|
||||||
end
|
|
||||||
network_name:depends("etcmd", "etcmd")
|
network_name:depends("etcmd", "etcmd")
|
||||||
|
|
||||||
network_secret = s:taboption("general", Value, "network_secret", translate("Network Secret"),
|
network_secret = s:taboption("general", Value, "network_secret", translate("Network Secret"),
|
||||||
@@ -412,9 +406,28 @@ foreign_relay_bps_limit = s:taboption("privacy", Value, "foreign_relay_bps_limit
|
|||||||
.. "(--foreign-relay-bps-limit parameter)"))
|
.. "(--foreign-relay-bps-limit parameter)"))
|
||||||
foreign_relay_bps_limit:depends("etcmd", "etcmd")
|
foreign_relay_bps_limit:depends("etcmd", "etcmd")
|
||||||
|
|
||||||
extra_args = s:taboption("privacy", Value, "extra_args", translate("Extra Parameters"),
|
extra_args = s:taboption("privacy", DynamicList, "extra_args", translate("Extra Parameters"),
|
||||||
translate("Additional command-line arguments passed to the backend process"))
|
translate("Additional command-line arguments passed to the backend process"))
|
||||||
extra_args.placeholder = "--tcp-whitelist 80 --udp-whitelist 53"
|
extra_args.placeholder = "--tcp-whitelist=80"
|
||||||
|
extra_args.validate = function(self, value, section)
|
||||||
|
if type(value) == "table" then
|
||||||
|
local seen = {}
|
||||||
|
local i
|
||||||
|
for i = 1, #value do
|
||||||
|
local arg = value[i]
|
||||||
|
if arg then
|
||||||
|
arg = tostring(arg):match("^%s*(.-)%s*$")
|
||||||
|
if arg ~= "" then
|
||||||
|
if seen[arg] then
|
||||||
|
return nil, translate("Duplicate extra parameter") .. ": " .. arg
|
||||||
|
end
|
||||||
|
seen[arg] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return value
|
||||||
|
end
|
||||||
extra_args:depends("etcmd", "etcmd")
|
extra_args:depends("etcmd", "etcmd")
|
||||||
|
|
||||||
log = s:taboption("general", ListValue, "log", translate("Program Log"),
|
log = s:taboption("general", ListValue, "log", translate("Program Log"),
|
||||||
|
|||||||
@@ -370,6 +370,8 @@ local uci = require 'luci.model.uci'.cursor()
|
|||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
word-break: break-word;
|
||||||
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
color: var(--text-primary);
|
color: var(--text-primary);
|
||||||
@@ -377,6 +379,34 @@ local uci = require 'luci.model.uci'.cursor()
|
|||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.et-command-panel {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.et-command-toolbar {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.et-copy-btn {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 5px 10px;
|
||||||
|
background: var(--tab-active);
|
||||||
|
color: #fff;
|
||||||
|
border: 1px solid var(--tab-active);
|
||||||
|
border-radius: 6px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.et-copy-btn:hover {
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.et-conninfo-header {
|
.et-conninfo-header {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -893,6 +923,50 @@ function escapeHtml(text) {
|
|||||||
return div.innerHTML;
|
return div.innerHTML;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function copyTextFromElement(elementId, button) {
|
||||||
|
var el = document.getElementById(elementId);
|
||||||
|
if (!el) return;
|
||||||
|
var text = el.textContent || el.innerText || '';
|
||||||
|
|
||||||
|
function markCopied() {
|
||||||
|
if (!button) return;
|
||||||
|
var oldText = button.textContent;
|
||||||
|
button.textContent = '<%:Copied%>';
|
||||||
|
window.setTimeout(function() {
|
||||||
|
button.textContent = oldText;
|
||||||
|
}, 1500);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (navigator.clipboard && window.isSecureContext) {
|
||||||
|
navigator.clipboard.writeText(text).then(markCopied);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var textarea = document.createElement('textarea');
|
||||||
|
textarea.value = text;
|
||||||
|
textarea.setAttribute('readonly', 'readonly');
|
||||||
|
textarea.style.position = 'fixed';
|
||||||
|
textarea.style.left = '-9999px';
|
||||||
|
document.body.appendChild(textarea);
|
||||||
|
textarea.select();
|
||||||
|
try {
|
||||||
|
document.execCommand('copy');
|
||||||
|
markCopied();
|
||||||
|
} finally {
|
||||||
|
document.body.removeChild(textarea);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderCopyablePre(content, className) {
|
||||||
|
var id = 'et_copy_' + Math.random().toString(36).slice(2);
|
||||||
|
return '<div class="et-command-panel">' +
|
||||||
|
'<div class="et-command-toolbar">' +
|
||||||
|
'<button type="button" class="et-copy-btn" onclick="copyTextFromElement(\'' + id + '\', this); return false;"><%:Copy%></button>' +
|
||||||
|
'</div>' +
|
||||||
|
'<div id="' + id + '" class="' + (className || 'et-pre') + '">' + escapeHtml(content) + '</div>' +
|
||||||
|
'</div>';
|
||||||
|
}
|
||||||
|
|
||||||
function parseTable(content, tabName) {
|
function parseTable(content, tabName) {
|
||||||
if (!content || content.trim() === '') {
|
if (!content || content.trim() === '') {
|
||||||
return '<div class="et-empty"><%:No data available%></div>';
|
return '<div class="et-empty"><%:No data available%></div>';
|
||||||
@@ -917,6 +991,47 @@ function parseTable(content, tabName) {
|
|||||||
return '<div class="et-error"><%:Peer Center service not available. This feature requires multiple nodes in the network.%></div>';
|
return '<div class="et-error"><%:Peer Center service not available. This feature requires multiple nodes in the network.%></div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 启动参数可能包含管道符等特殊字符,必须先于表格解析处理。
|
||||||
|
if (tabName === 'cmdline') {
|
||||||
|
var html = renderCopyablePre(content);
|
||||||
|
|
||||||
|
// 检查是否使用配置文件启动
|
||||||
|
if (content.indexOf('--config-file') !== -1 || content.match(/-c\s+\//)) {
|
||||||
|
XHR.get('<%=url("admin/vpn/easytier/api_conninfo")%>', null, function(x, data) {
|
||||||
|
if (data && data.config_file) {
|
||||||
|
var configDiv = document.createElement('div');
|
||||||
|
configDiv.className = 'et-pre';
|
||||||
|
configDiv.style.marginTop = '16px';
|
||||||
|
configDiv.style.borderTop = '2px solid var(--border-color)';
|
||||||
|
configDiv.style.paddingTop = '16px';
|
||||||
|
|
||||||
|
var title = document.createElement('div');
|
||||||
|
title.style.fontWeight = '600';
|
||||||
|
title.style.marginBottom = '8px';
|
||||||
|
title.style.color = 'var(--primary-color)';
|
||||||
|
title.textContent = tr('Configuration File Content') + ':';
|
||||||
|
|
||||||
|
var contentDiv = document.createElement('pre');
|
||||||
|
contentDiv.style.margin = '0';
|
||||||
|
contentDiv.style.whiteSpace = 'pre-wrap';
|
||||||
|
contentDiv.style.overflowWrap = 'anywhere';
|
||||||
|
contentDiv.style.wordBreak = 'break-word';
|
||||||
|
contentDiv.textContent = data.config_file;
|
||||||
|
|
||||||
|
configDiv.appendChild(title);
|
||||||
|
configDiv.appendChild(contentDiv);
|
||||||
|
|
||||||
|
var container = document.getElementById('tab_cmdline');
|
||||||
|
if (container) {
|
||||||
|
container.appendChild(configDiv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
// 连接失败错误处理
|
// 连接失败错误处理
|
||||||
if (content.indexOf('failed to get peer manager client') !== -1 ||
|
if (content.indexOf('failed to get peer manager client') !== -1 ||
|
||||||
content.indexOf('failed to get peer center client') !== -1 ||
|
content.indexOf('failed to get peer center client') !== -1 ||
|
||||||
@@ -948,46 +1063,6 @@ function parseTable(content, tabName) {
|
|||||||
var lines = content.split(/\r?\n/).filter(function(l) { return l.trim() !== ''; });
|
var lines = content.split(/\r?\n/).filter(function(l) { return l.trim() !== ''; });
|
||||||
|
|
||||||
if (lines.length === 0 || lines[0].indexOf('|') === -1) {
|
if (lines.length === 0 || lines[0].indexOf('|') === -1) {
|
||||||
// 启动参数不翻译
|
|
||||||
if (tabName === 'cmdline') {
|
|
||||||
var html = '<div class="et-pre">' + escapeHtml(content) + '</div>';
|
|
||||||
|
|
||||||
// 检查是否使用配置文件启动
|
|
||||||
if (content.indexOf('--config-file') !== -1 || content.match(/-c\s+\//)) {
|
|
||||||
XHR.get('<%=url("admin/vpn/easytier/api_conninfo")%>', null, function(x, data) {
|
|
||||||
if (data && data.config_file) {
|
|
||||||
var configDiv = document.createElement('div');
|
|
||||||
configDiv.className = 'et-pre';
|
|
||||||
configDiv.style.marginTop = '16px';
|
|
||||||
configDiv.style.borderTop = '2px solid var(--border-color)';
|
|
||||||
configDiv.style.paddingTop = '16px';
|
|
||||||
|
|
||||||
var title = document.createElement('div');
|
|
||||||
title.style.fontWeight = '600';
|
|
||||||
title.style.marginBottom = '8px';
|
|
||||||
title.style.color = 'var(--primary-color)';
|
|
||||||
title.textContent = tr('Configuration File Content') + ':';
|
|
||||||
|
|
||||||
var contentDiv = document.createElement('pre');
|
|
||||||
contentDiv.style.margin = '0';
|
|
||||||
contentDiv.style.whiteSpace = 'pre-wrap';
|
|
||||||
contentDiv.style.wordBreak = 'break-all';
|
|
||||||
contentDiv.textContent = data.config_file;
|
|
||||||
|
|
||||||
configDiv.appendChild(title);
|
|
||||||
configDiv.appendChild(contentDiv);
|
|
||||||
|
|
||||||
var container = document.querySelector('.et-tab-content[data-tab="cmdline"]');
|
|
||||||
if (container) {
|
|
||||||
container.appendChild(configDiv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return html;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 对非表格内容进行全面翻译处理
|
// 对非表格内容进行全面翻译处理
|
||||||
var translatedContent = content;
|
var translatedContent = content;
|
||||||
|
|
||||||
|
|||||||
@@ -383,7 +383,7 @@ local translate = i18n.translate
|
|||||||
<select id="fallback_version_select" class="config-input" style="display:none;width:100%;">
|
<select id="fallback_version_select" class="config-input" style="display:none;width:100%;">
|
||||||
<option value=""><%=translate("Loading versions...")%></option>
|
<option value=""><%=translate("Loading versions...")%></option>
|
||||||
</select>
|
</select>
|
||||||
<input type="text" id="fallback_version" class="config-input" placeholder="v2.6.2" style="display:none;width:100%;">
|
<input type="text" id="fallback_version" class="config-input" placeholder="v2.6.4" style="display:none;width:100%;">
|
||||||
</div>
|
</div>
|
||||||
<button type="button" class="upload-btn" onclick="showDownloadModal()" style="padding:8px 16px;min-width:auto;flex-shrink:0;">
|
<button type="button" class="upload-btn" onclick="showDownloadModal()" style="padding:8px 16px;min-width:auto;flex-shrink:0;">
|
||||||
<%=translate("Online Download")%>
|
<%=translate("Online Download")%>
|
||||||
@@ -758,14 +758,14 @@ function loadConfig() {
|
|||||||
proxyList = Array.isArray(proxys) ? proxys : [];
|
proxyList = Array.isArray(proxys) ? proxys : [];
|
||||||
|
|
||||||
renderProxyList();
|
renderProxyList();
|
||||||
versionManager.setVersion(config.fallback_version || 'v2.6.2');
|
versionManager.setVersion(config.fallback_version || 'v2.6.4');
|
||||||
|
|
||||||
// 保存原始配置
|
// 保存原始配置
|
||||||
originalConfig = {
|
originalConfig = {
|
||||||
easytierbin: config.easytierbin || '/usr/bin/easytier-core',
|
easytierbin: config.easytierbin || '/usr/bin/easytier-core',
|
||||||
webbin: config.webbin || '/usr/bin/easytier-web',
|
webbin: config.webbin || '/usr/bin/easytier-web',
|
||||||
github_proxys: JSON.stringify(proxyList),
|
github_proxys: JSON.stringify(proxyList),
|
||||||
fallback_version: config.fallback_version || 'v2.6.2'
|
fallback_version: config.fallback_version || 'v2.6.4'
|
||||||
};
|
};
|
||||||
|
|
||||||
checkDiskSpace('easytierbin');
|
checkDiskSpace('easytierbin');
|
||||||
@@ -843,7 +843,7 @@ function getCurrentConfig() {
|
|||||||
easytierbin: document.getElementById('easytierbin').value || '/usr/bin/easytier-core',
|
easytierbin: document.getElementById('easytierbin').value || '/usr/bin/easytier-core',
|
||||||
webbin: document.getElementById('webbin').value || '/usr/bin/easytier-web',
|
webbin: document.getElementById('webbin').value || '/usr/bin/easytier-web',
|
||||||
github_proxys: JSON.stringify(proxyList),
|
github_proxys: JSON.stringify(proxyList),
|
||||||
fallback_version: versionManager.getCurrentVersion() || 'v2.6.2'
|
fallback_version: versionManager.getCurrentVersion() || 'v2.6.4'
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -868,7 +868,7 @@ function saveConfig() {
|
|||||||
easytierbin: document.getElementById('easytierbin').value || '/usr/bin/easytier-core',
|
easytierbin: document.getElementById('easytierbin').value || '/usr/bin/easytier-core',
|
||||||
webbin: document.getElementById('webbin').value || '/usr/bin/easytier-web',
|
webbin: document.getElementById('webbin').value || '/usr/bin/easytier-web',
|
||||||
github_proxys: proxyList,
|
github_proxys: proxyList,
|
||||||
fallback_version: versionManager.getCurrentVersion() || 'v2.6.2'
|
fallback_version: versionManager.getCurrentVersion() || 'v2.6.4'
|
||||||
};
|
};
|
||||||
|
|
||||||
var xhr = new XMLHttpRequest();
|
var xhr = new XMLHttpRequest();
|
||||||
|
|||||||
@@ -1403,3 +1403,12 @@ msgstr ""
|
|||||||
|
|
||||||
msgid "GEOIP Database Path"
|
msgid "GEOIP Database Path"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Copy"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Copied"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Duplicate extra parameter"
|
||||||
|
msgstr ""
|
||||||
@@ -1267,6 +1267,15 @@ msgstr "统计数据"
|
|||||||
msgid "Command Line"
|
msgid "Command Line"
|
||||||
msgstr "启动参数"
|
msgstr "启动参数"
|
||||||
|
|
||||||
|
msgid "Copy"
|
||||||
|
msgstr "复制"
|
||||||
|
|
||||||
|
msgid "Copied"
|
||||||
|
msgstr "已复制"
|
||||||
|
|
||||||
|
msgid "Duplicate extra parameter"
|
||||||
|
msgstr "重复的额外参数"
|
||||||
|
|
||||||
msgid "IPv4 Address"
|
msgid "IPv4 Address"
|
||||||
msgstr "IPv4地址"
|
msgstr "IPv4地址"
|
||||||
|
|
||||||
@@ -2098,4 +2107,3 @@ msgstr "数据库重置成功"
|
|||||||
|
|
||||||
msgid "Restart service to apply changes?"
|
msgid "Restart service to apply changes?"
|
||||||
msgstr "重启服务以生效?"
|
msgstr "重启服务以生效?"
|
||||||
|
|
||||||
@@ -5,3 +5,5 @@ config easytier
|
|||||||
option auto_config_interface '1'
|
option auto_config_interface '1'
|
||||||
option auto_config_firewall '1'
|
option auto_config_firewall '1'
|
||||||
option interface_netmask '255.0.0.0'
|
option interface_netmask '255.0.0.0'
|
||||||
|
option web_enabled '0'
|
||||||
|
option webbin '/usr/bin/easytier-web'
|
||||||
@@ -71,6 +71,10 @@ get_tz() {
|
|||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
shell_quote() {
|
||||||
|
printf "'%s'" "$(printf "%s" "$1" | sed "s/'/'\\\\''/g")"
|
||||||
|
}
|
||||||
|
|
||||||
check_bin() {
|
check_bin() {
|
||||||
# 优先使用 UCI 配置的代理列表(list 类型),否则使用默认值
|
# 优先使用 UCI 配置的代理列表(list 类型),否则使用默认值
|
||||||
local proxys=""
|
local proxys=""
|
||||||
@@ -103,10 +107,15 @@ check_bin() {
|
|||||||
# 如果获取失败,从 UCI 配置或使用默认版本
|
# 如果获取失败,从 UCI 配置或使用默认版本
|
||||||
if [ -z "$tag" ]; then
|
if [ -z "$tag" ]; then
|
||||||
tag=$(uci -q get easytier.@easytier[0].fallback_version)
|
tag=$(uci -q get easytier.@easytier[0].fallback_version)
|
||||||
[ -z "$tag" ] && tag="v2.6.2"
|
[ -z "$tag" ] && tag="v2.6.4"
|
||||||
fi
|
fi
|
||||||
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 开始在线下载${tag}版本,${proxy}https://github.com/EasyTier/EasyTier/releases/download/${tag}/easytier-linux-${cpucore}-${tag}.zip下载较慢耐心等候" >>/tmp/easytier.log
|
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 开始在线下载${tag}版本,${proxy}https://github.com/EasyTier/EasyTier/releases/download/${tag}/easytier-linux-${cpucore}-${tag}.zip下载较慢耐心等候" >>/tmp/easytier.log
|
||||||
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 开始在线下载${tag}版本,${proxy}https://github.com/EasyTier/EasyTier/releases/download/${tag}/easytier-linux-${cpucore}-${tag}.zip下载较慢耐心等候" >>/tmp/easytierweb.log
|
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 开始在线下载${tag}版本,${proxy}https://github.com/EasyTier/EasyTier/releases/download/${tag}/easytier-linux-${cpucore}-${tag}.zip下载较慢耐心等候" >>/tmp/easytierweb.log
|
||||||
|
if ! command -v unzip >/dev/null 2>&1; then
|
||||||
|
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 系统缺少 unzip,无法解压下载的 EasyTier 压缩包,请安装 unzip 后重试" >>/tmp/easytier.log
|
||||||
|
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 系统缺少 unzip,无法解压下载的 EasyTier 压缩包,请安装 unzip 后重试" >>/tmp/easytierweb.log
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
mkdir -p "$path"
|
mkdir -p "$path"
|
||||||
for proxy in $proxys ; do
|
for proxy in $proxys ; do
|
||||||
if curl -L -k -o /tmp/easytier.zip --connect-timeout 10 --retry 3 "${proxy}https://github.com/EasyTier/EasyTier/releases/download/${tag}/easytier-linux-${cpucore}-${tag}.zip" || \
|
if curl -L -k -o /tmp/easytier.zip --connect-timeout 10 --retry 3 "${proxy}https://github.com/EasyTier/EasyTier/releases/download/${tag}/easytier-linux-${cpucore}-${tag}.zip" || \
|
||||||
@@ -205,7 +214,6 @@ get_etconfig() {
|
|||||||
quic_port="$(uci -q get easytier.@easytier[0].quic_port)"
|
quic_port="$(uci -q get easytier.@easytier[0].quic_port)"
|
||||||
peeradd="$(uci -q get easytier.@easytier[0].peeradd)"
|
peeradd="$(uci -q get easytier.@easytier[0].peeradd)"
|
||||||
desvice_name="$(uci -q get easytier.@easytier[0].desvice_name)"
|
desvice_name="$(uci -q get easytier.@easytier[0].desvice_name)"
|
||||||
[ -z "$desvice_name" ] || desvice_name=$(echo "$desvice_name" | sed 's/[\\$`"()|><&;]/\\&/g')
|
|
||||||
instance_name="$(uci -q get easytier.@easytier[0].instance_name)"
|
instance_name="$(uci -q get easytier.@easytier[0].instance_name)"
|
||||||
vpn_portal="$(uci -q get easytier.@easytier[0].vpn_portal)"
|
vpn_portal="$(uci -q get easytier.@easytier[0].vpn_portal)"
|
||||||
mtu="$(uci -q get easytier.@easytier[0].mtu)"
|
mtu="$(uci -q get easytier.@easytier[0].mtu)"
|
||||||
@@ -442,8 +450,8 @@ start_et() {
|
|||||||
core_cmd=""
|
core_cmd=""
|
||||||
if [ "$etcmd" = "etcmd" ] ; then
|
if [ "$etcmd" = "etcmd" ] ; then
|
||||||
#默认方式启动
|
#默认方式启动
|
||||||
[ -z "$network_name" ] || core_cmd="${core_cmd} --network-name $network_name"
|
[ -z "$network_name" ] || core_cmd="${core_cmd} --network-name $(shell_quote "$network_name")"
|
||||||
[ -z "$network_secret" ] || core_cmd="${core_cmd} --network-secret $network_secret"
|
[ -z "$network_secret" ] || core_cmd="${core_cmd} --network-secret $(shell_quote "$network_secret")"
|
||||||
[ -z "$ipaddr" ] || core_cmd="${core_cmd} -i $ipaddr"
|
[ -z "$ipaddr" ] || core_cmd="${core_cmd} -i $ipaddr"
|
||||||
[ -z "$ip6addr" ] || core_cmd="${core_cmd} --ipv6 $ip6addr"
|
[ -z "$ip6addr" ] || core_cmd="${core_cmd} --ipv6 $ip6addr"
|
||||||
[ "$ip_dhcp" = "0" ] || core_cmd="${core_cmd} -d"
|
[ "$ip_dhcp" = "0" ] || core_cmd="${core_cmd} -d"
|
||||||
@@ -524,7 +532,7 @@ start_et() {
|
|||||||
[ -z "$quic_port" ] || core_cmd="${core_cmd} -l quic:$quic_port"
|
[ -z "$quic_port" ] || core_cmd="${core_cmd} -l quic:$quic_port"
|
||||||
[ -z "$external_node" ] || core_cmd="${core_cmd} -e $external_node"
|
[ -z "$external_node" ] || core_cmd="${core_cmd} -e $external_node"
|
||||||
[ "$listenermode" = "ON" ] || core_cmd="${core_cmd} --no-listener"
|
[ "$listenermode" = "ON" ] || core_cmd="${core_cmd} --no-listener"
|
||||||
[ -z "$desvice_name" ] || core_cmd="${core_cmd} --hostname $desvice_name"
|
[ -z "$desvice_name" ] || core_cmd="${core_cmd} --hostname $(shell_quote "$desvice_name")"
|
||||||
[ -z "$instance_name" ] || core_cmd="${core_cmd} -m $instance_name"
|
[ -z "$instance_name" ] || core_cmd="${core_cmd} -m $instance_name"
|
||||||
[ -z "$vpn_portal" ] || core_cmd="${core_cmd} --vpn-portal $vpn_portal"
|
[ -z "$vpn_portal" ] || core_cmd="${core_cmd} --vpn-portal $vpn_portal"
|
||||||
[ -z "$mtu" ] || core_cmd="${core_cmd} --mtu $mtu"
|
[ -z "$mtu" ] || core_cmd="${core_cmd} --mtu $mtu"
|
||||||
@@ -563,7 +571,13 @@ start_et() {
|
|||||||
[ "$relay_kcp" = "0" ] || core_cmd="${core_cmd} --enable-relay-foreign-network-kcp true"
|
[ "$relay_kcp" = "0" ] || core_cmd="${core_cmd} --enable-relay-foreign-network-kcp true"
|
||||||
[ -z "$udp_white_port" ] || core_cmd="${core_cmd} --udp-whitelist $udp_white_port"
|
[ -z "$udp_white_port" ] || core_cmd="${core_cmd} --udp-whitelist $udp_white_port"
|
||||||
[ -z "$tcp_white_port" ] || core_cmd="${core_cmd} --tcp-whitelist $tcp_white_port"
|
[ -z "$tcp_white_port" ] || core_cmd="${core_cmd} --tcp-whitelist $tcp_white_port"
|
||||||
[ -z "$extra_args" ] || core_cmd="${core_cmd} $extra_args"
|
if [ -n "$extra_args" ] ; then
|
||||||
|
while IFS= read -r extra_arg; do
|
||||||
|
[ -n "$extra_arg" ] && core_cmd="${core_cmd} $extra_arg"
|
||||||
|
done <<EOF
|
||||||
|
$(sed -n "s/^[[:space:]]*list[[:space:]]\\+extra_args[[:space:]]\\+'\\(.*\\)'[[:space:]]*$/\\1/p" /etc/config/easytier)
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 运行 ${easytierbin} ${core_cmd} --console-log-level ${log}" >>/tmp/easytier.log
|
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 运行 ${easytierbin} ${core_cmd} --console-log-level ${log}" >>/tmp/easytier.log
|
||||||
|
|
||||||
@@ -580,7 +594,7 @@ start_et() {
|
|||||||
et_uuid="$(cat /etc/easytier/et_machine_id | tr -d ' \n')"
|
et_uuid="$(cat /etc/easytier/et_machine_id | tr -d ' \n')"
|
||||||
[ -z "$et_uuid" ] || core_cmd="${core_cmd} --machine-id $et_uuid"
|
[ -z "$et_uuid" ] || core_cmd="${core_cmd} --machine-id $et_uuid"
|
||||||
[ -z "$web_config" ] || core_cmd="${core_cmd} -w $web_config"
|
[ -z "$web_config" ] || core_cmd="${core_cmd} -w $web_config"
|
||||||
[ -z "$desvice_name" ] || core_cmd="${core_cmd} --hostname $desvice_name"
|
[ -z "$desvice_name" ] || core_cmd="${core_cmd} --hostname $(shell_quote "$desvice_name")"
|
||||||
fi
|
fi
|
||||||
procd_set_param command /bin/sh -c "
|
procd_set_param command /bin/sh -c "
|
||||||
cd /tmp ; ${easytierbin} ${core_cmd} --console-log-level ${log} >> /tmp/easytier.log 2>&1 &
|
cd /tmp ; ${easytierbin} ${core_cmd} --console-log-level ${log} >> /tmp/easytier.log 2>&1 &
|
||||||
@@ -636,6 +650,7 @@ start_et() {
|
|||||||
|
|
||||||
start_web() {
|
start_web() {
|
||||||
webbin="$(uci -q get easytier.@easytier[0].webbin)"
|
webbin="$(uci -q get easytier.@easytier[0].webbin)"
|
||||||
|
[ -z "$webbin" ] && webbin="/usr/bin/easytier-web" && uci -q set easytier.@easytier[0].webbin=/usr/bin/easytier-web
|
||||||
path=$(dirname "$webbin")
|
path=$(dirname "$webbin")
|
||||||
if [ -f /tmp/easytier-web-embed ] ; then
|
if [ -f /tmp/easytier-web-embed ] ; then
|
||||||
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 找到上传的easytier-web程序,替换${webbin} " >>/tmp/easytierweb.log
|
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 找到上传的easytier-web程序,替换${webbin} " >>/tmp/easytierweb.log
|
||||||
@@ -813,7 +828,7 @@ start_service() {
|
|||||||
|
|
||||||
# 延迟重载网络配置,避免与拨号等网络事件冲突
|
# 延迟重载网络配置,避免与拨号等网络事件冲突
|
||||||
if [ -n "$(uci changes network)" ] || [ -n "$(uci changes firewall)" ]; then
|
if [ -n "$(uci changes network)" ] || [ -n "$(uci changes firewall)" ]; then
|
||||||
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 检测到配置变更,将在5秒后后台重载... " >>/tmp/easytier.log
|
echo "$(date '+%Y-%m-%d %H:%M:%S') easytier : 检测到配置变更,将在5秒后后台重载网络、防火墙... " >>/tmp/easytier.log
|
||||||
(
|
(
|
||||||
sleep 5
|
sleep 5
|
||||||
# 使用锁文件防止重复重载
|
# 使用锁文件防止重复重载
|
||||||
@@ -891,4 +906,3 @@ service_triggers() {
|
|||||||
#如果WAN网络接口上线则触发重新启动easytier
|
#如果WAN网络接口上线则触发重新启动easytier
|
||||||
# procd_add_interface_trigger "interface.*.up" wan /etc/init.d/easytier reload
|
# procd_add_interface_trigger "interface.*.up" wan /etc/init.d/easytier reload
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=luci-app-mosdns
|
PKG_NAME:=luci-app-mosdns
|
||||||
PKG_VERSION:=1.7.3
|
PKG_VERSION:=1.7.3
|
||||||
PKG_RELEASE:=9
|
PKG_RELEASE:=10
|
||||||
|
|
||||||
LUCI_TITLE:=LuCI Support for mosdns
|
LUCI_TITLE:=LuCI Support for mosdns
|
||||||
LUCI_PKGARCH:=all
|
LUCI_PKGARCH:=all
|
||||||
|
|||||||
@@ -155,7 +155,6 @@ function update_adlist() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (download_failed) {
|
if (download_failed) {
|
||||||
print("\x1b[1;31mRules download failed.\n");
|
|
||||||
exec_sys(`rm -rf "${ad_tmpdir}"`);
|
exec_sys(`rm -rf "${ad_tmpdir}"`);
|
||||||
unlink(lock_file);
|
unlink(lock_file);
|
||||||
die("Rules download failed.");
|
die("Rules download failed.");
|
||||||
@@ -215,7 +214,6 @@ function update_geodat() {
|
|||||||
|
|
||||||
let sum_downloaded = split(exec_sys(`sha256sum "${tmpdir}/geoip.dat"`).stdout, /[ \t\n]+/)[0];
|
let sum_downloaded = split(exec_sys(`sha256sum "${tmpdir}/geoip.dat"`).stdout, /[ \t\n]+/)[0];
|
||||||
if (sum_downloaded !== geoip_sum_remote) {
|
if (sum_downloaded !== geoip_sum_remote) {
|
||||||
print("\x1b[1;31mgeoip.dat checksum error\n");
|
|
||||||
exec_sys(`rm -rf "${tmpdir}"`); die("geoip.dat checksum error");
|
exec_sys(`rm -rf "${tmpdir}"`); die("geoip.dat checksum error");
|
||||||
}
|
}
|
||||||
geoip_updated = true;
|
geoip_updated = true;
|
||||||
@@ -248,7 +246,6 @@ function update_geodat() {
|
|||||||
|
|
||||||
let sum_downloaded = split(exec_sys(`sha256sum "${tmpdir}/geosite.dat"`).stdout, /[ \t\n]+/)[0];
|
let sum_downloaded = split(exec_sys(`sha256sum "${tmpdir}/geosite.dat"`).stdout, /[ \t\n]+/)[0];
|
||||||
if (sum_downloaded !== geosite_sum_remote) {
|
if (sum_downloaded !== geosite_sum_remote) {
|
||||||
print("\x1b[1;31mgeosite.dat checksum error\n");
|
|
||||||
exec_sys(`rm -rf "${tmpdir}"`); die("geosite.dat checksum error");
|
exec_sys(`rm -rf "${tmpdir}"`); die("geosite.dat checksum error");
|
||||||
}
|
}
|
||||||
geosite_updated = true;
|
geosite_updated = true;
|
||||||
@@ -332,7 +329,7 @@ switch (action) {
|
|||||||
print("UPDATE_FINISHED\n");
|
print("UPDATE_FINISHED\n");
|
||||||
stdout.flush();
|
stdout.flush();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print("\x1b[1;31mUpdate failed: " + e + "\n\x1b[0m");
|
print("Update failed: " + e + "\n");
|
||||||
print("UPDATE_EXITED\n");
|
print("UPDATE_EXITED\n");
|
||||||
stdout.flush();
|
stdout.flush();
|
||||||
unlink('/var/lock/mosdns_update.lock');
|
unlink('/var/lock/mosdns_update.lock');
|
||||||
|
|||||||
Whitespace-only changes.
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=luci-app-passwall
|
PKG_NAME:=luci-app-passwall
|
||||||
PKG_VERSION:=26.5.11
|
PKG_VERSION:=26.5.11
|
||||||
PKG_RELEASE:=124
|
PKG_RELEASE:=125
|
||||||
PKG_PO_VERSION:=$(PKG_VERSION)
|
PKG_PO_VERSION:=$(PKG_VERSION)
|
||||||
|
|
||||||
PKG_CONFIG_DEPENDS:= \
|
PKG_CONFIG_DEPENDS:= \
|
||||||
|
|||||||
@@ -24,27 +24,50 @@ o = s:option(ListValue, _n("protocol"), translate("Protocol"))
|
|||||||
o:value("udp", "UDP")
|
o:value("udp", "UDP")
|
||||||
|
|
||||||
o = s:option(Value, _n("address"), translate("Address (Support Domain Name)"))
|
o = s:option(Value, _n("address"), translate("Address (Support Domain Name)"))
|
||||||
|
o:depends({ [_n("realms")] = false })
|
||||||
|
|
||||||
o = s:option(Value, _n("port"), translate("Port"))
|
o = s:option(Value, _n("port"), translate("Port"))
|
||||||
o.datatype = "port"
|
o.datatype = "port"
|
||||||
|
o:depends({ [_n("realms")] = false })
|
||||||
|
|
||||||
o = s:option(Value, _n("hop"), translate("Port hopping range"))
|
o = s:option(Value, _n("hop"), translate("Port hopping range"))
|
||||||
o.description = translate("Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).")
|
o.description = translate("Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).")
|
||||||
o.rewrite_option = o.option
|
o.rewrite_option = o.option
|
||||||
|
o:depends({ [_n("realms")] = false })
|
||||||
|
|
||||||
o = s:option(Value, _n("hop_interval"), translate("Hop Interval(second)"), translate("Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5."))
|
o = s:option(Value, _n("hop_interval"), translate("Hop Interval(second)"), translate("Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5."))
|
||||||
o.datatype = "or(uinteger,portrange)"
|
o.datatype = "or(uinteger,portrange)"
|
||||||
o.placeholder = "30"
|
o.placeholder = "30"
|
||||||
o.default = "30"
|
o.default = "30"
|
||||||
o.rewrite_option = o.option
|
o.rewrite_option = o.option
|
||||||
|
o:depends({ [_n("realms")] = false })
|
||||||
|
|
||||||
o = s:option(Value, _n("obfs"), translate("Obfs Password"))
|
o = s:option(Flag, _n("realms"), translate("Realms"))
|
||||||
|
o.default = "0"
|
||||||
o.rewrite_option = o.option
|
o.rewrite_option = o.option
|
||||||
|
|
||||||
|
o = s:option(Value, _n("realm_url"), translate("Realm URL"), translate("Example:") .. "realm://public@realm.hy2.io/your-realm-name")
|
||||||
|
o.rewrite_option = o.option
|
||||||
|
o:depends({ [_n("realms")] = "1" })
|
||||||
|
|
||||||
|
o = s:option(DynamicList, _n("realm_stun"), translate("Realm STUN"))
|
||||||
|
o.default = { "stun.sip.us:3478", "stun.nextcloud.com:3478", "global.stun.twilio.com:3478" }
|
||||||
|
o.rewrite_option = o.option
|
||||||
|
o:depends({ [_n("realms")] = "1" })
|
||||||
|
|
||||||
o = s:option(Value, _n("auth_password"), translate("Auth Password"))
|
o = s:option(Value, _n("auth_password"), translate("Auth Password"))
|
||||||
o.password = true
|
o.password = true
|
||||||
o.rewrite_option = o.option
|
o.rewrite_option = o.option
|
||||||
|
|
||||||
|
o = s:option(ListValue, _n("obfs_type"), translate("Obfs Type"))
|
||||||
|
o:value("", translate("Disable"))
|
||||||
|
o:value("salamander")
|
||||||
|
o.rewrite_option = o.option
|
||||||
|
|
||||||
|
o = s:option(Value, _n("obfs_password"), translate("Obfs Password"))
|
||||||
|
o.rewrite_option = o.option
|
||||||
|
o:depends({ [_n("obfs_type")] = "salamander" })
|
||||||
|
|
||||||
o = s:option(Flag, _n("fast_open"), translate("Fast Open"))
|
o = s:option(Flag, _n("fast_open"), translate("Fast Open"))
|
||||||
o.default = "0"
|
o.default = "0"
|
||||||
|
|
||||||
|
|||||||
@@ -339,11 +339,9 @@ o.placeholder = "30"
|
|||||||
o.default = "30"
|
o.default = "30"
|
||||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||||
|
|
||||||
o = s:option(Value, _n("hysteria2_up_mbps"), translate("Max upload Mbps"))
|
o = s:option(Value, _n("hysteria2_auth_password"), translate("Auth Password"))
|
||||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
o.password = true
|
||||||
|
o:depends({ [_n("protocol")] = "hysteria2"})
|
||||||
o = s:option(Value, _n("hysteria2_down_mbps"), translate("Max download Mbps"))
|
|
||||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
|
||||||
|
|
||||||
o = s:option(ListValue, _n("hysteria2_obfs_type"), translate("Obfs Type"))
|
o = s:option(ListValue, _n("hysteria2_obfs_type"), translate("Obfs Type"))
|
||||||
o:value("", translate("Disable"))
|
o:value("", translate("Disable"))
|
||||||
@@ -353,9 +351,11 @@ o:depends({ [_n("protocol")] = "hysteria2" })
|
|||||||
o = s:option(Value, _n("hysteria2_obfs_password"), translate("Obfs Password"))
|
o = s:option(Value, _n("hysteria2_obfs_password"), translate("Obfs Password"))
|
||||||
o:depends({ [_n("hysteria2_obfs_type")] = "salamander" })
|
o:depends({ [_n("hysteria2_obfs_type")] = "salamander" })
|
||||||
|
|
||||||
o = s:option(Value, _n("hysteria2_auth_password"), translate("Auth Password"))
|
o = s:option(Value, _n("hysteria2_up_mbps"), translate("Max upload Mbps"))
|
||||||
o.password = true
|
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||||
o:depends({ [_n("protocol")] = "hysteria2"})
|
|
||||||
|
o = s:option(Value, _n("hysteria2_down_mbps"), translate("Max download Mbps"))
|
||||||
|
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||||
|
|
||||||
o = s:option(Value, _n("hysteria2_idle_timeout"), translate("Idle Timeout"), translate("Example:") .. "30s (4s~120s)")
|
o = s:option(Value, _n("hysteria2_idle_timeout"), translate("Idle Timeout"), translate("Example:") .. "30s (4s~120s)")
|
||||||
o:depends({ [_n("protocol")] = "hysteria2"})
|
o:depends({ [_n("protocol")] = "hysteria2"})
|
||||||
|
|||||||
@@ -353,17 +353,15 @@ if singbox_tags:find("with_quic") then
|
|||||||
o.description = translate("Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).")
|
o.description = translate("Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).")
|
||||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||||
|
|
||||||
o = s:option(Value, _n("hysteria2_hop_interval"), translate("Hop Interval(Second)"), translate("Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5."))
|
o = s:option(Value, _n("hysteria2_hop_interval"), translate("Hop Interval(second)"), translate("Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5."))
|
||||||
o.datatype = "or(uinteger,portrange)"
|
o.datatype = "or(uinteger,portrange)"
|
||||||
o.placeholder = "30"
|
o.placeholder = "30"
|
||||||
o.default = "30"
|
o.default = "30"
|
||||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||||
|
|
||||||
o = s:option(Value, _n("hysteria2_up_mbps"), translate("Max upload Mbps"))
|
o = s:option(Value, _n("hysteria2_auth_password"), translate("Auth Password"))
|
||||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
o.password = true
|
||||||
|
o:depends({ [_n("protocol")] = "hysteria2"})
|
||||||
o = s:option(Value, _n("hysteria2_down_mbps"), translate("Max download Mbps"))
|
|
||||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
|
||||||
|
|
||||||
o = s:option(ListValue, _n("hysteria2_obfs_type"), translate("Obfs Type"))
|
o = s:option(ListValue, _n("hysteria2_obfs_type"), translate("Obfs Type"))
|
||||||
o:value("", translate("Disable"))
|
o:value("", translate("Disable"))
|
||||||
@@ -373,8 +371,20 @@ if singbox_tags:find("with_quic") then
|
|||||||
o = s:option(Value, _n("hysteria2_obfs_password"), translate("Obfs Password"))
|
o = s:option(Value, _n("hysteria2_obfs_password"), translate("Obfs Password"))
|
||||||
o:depends({ [_n("hysteria2_obfs_type")] = "salamander" })
|
o:depends({ [_n("hysteria2_obfs_type")] = "salamander" })
|
||||||
|
|
||||||
o = s:option(Value, _n("hysteria2_auth_password"), translate("Auth Password"))
|
o = s:option(Value, _n("hysteria2_up_mbps"), translate("Max upload Mbps"))
|
||||||
o.password = true
|
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||||
|
|
||||||
|
o = s:option(Value, _n("hysteria2_down_mbps"), translate("Max download Mbps"))
|
||||||
|
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||||
|
|
||||||
|
o = s:option(Value, _n("hysteria2_idle_timeout"), translate("Idle Timeout"), translate("Example:") .. "30s (4s~120s)")
|
||||||
|
o:depends({ [_n("protocol")] = "hysteria2"})
|
||||||
|
|
||||||
|
o = s:option(Value, _n("hysteria2_keep_alive_period"), translate("QUIC KeepAlive interval"), translate("Example:") .. "10s (2s~60s)")
|
||||||
|
o:depends({ [_n("protocol")] = "hysteria2"})
|
||||||
|
|
||||||
|
o = s:option(Flag, _n("hysteria2_disable_mtu_discovery"), translate("Disable MTU detection"))
|
||||||
|
o.default = "0"
|
||||||
o:depends({ [_n("protocol")] = "hysteria2"})
|
o:depends({ [_n("protocol")] = "hysteria2"})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -26,15 +26,35 @@ o = s:option(Value, _n("port"), translate("Listen Port"))
|
|||||||
o.datatype = "port"
|
o.datatype = "port"
|
||||||
o:depends({ [_n("custom")] = false })
|
o:depends({ [_n("custom")] = false })
|
||||||
|
|
||||||
o = s:option(Value, _n("obfs"), translate("Obfs Password"))
|
o = s:option(Flag, _n("realms"), translate("Realms"))
|
||||||
|
o.default = "0"
|
||||||
o.rewrite_option = o.option
|
o.rewrite_option = o.option
|
||||||
o:depends({ [_n("custom")] = false })
|
o:depends({ [_n("custom")] = false })
|
||||||
|
|
||||||
|
o = s:option(Value, _n("realm_url"), translate("Realm URL"), translate("Example:") .. "realm://public@realm.hy2.io/your-realm-name")
|
||||||
|
o.rewrite_option = o.option
|
||||||
|
o:depends({ [_n("realms")] = "1" })
|
||||||
|
|
||||||
|
o = s:option(DynamicList, _n("realm_stun"), translate("Realm STUN"))
|
||||||
|
o.default = { "stun.sip.us:3478", "stun.nextcloud.com:3478", "global.stun.twilio.com:3478" }
|
||||||
|
o.rewrite_option = o.option
|
||||||
|
o:depends({ [_n("realms")] = "1" })
|
||||||
|
|
||||||
o = s:option(Value, _n("auth_password"), translate("Auth Password"))
|
o = s:option(Value, _n("auth_password"), translate("Auth Password"))
|
||||||
o.password = true
|
o.password = true
|
||||||
o.rewrite_option = o.option
|
o.rewrite_option = o.option
|
||||||
o:depends({ [_n("custom")] = false })
|
o:depends({ [_n("custom")] = false })
|
||||||
|
|
||||||
|
o = s:option(ListValue, _n("obfs_type"), translate("Obfs Type"))
|
||||||
|
o:value("", translate("Disable"))
|
||||||
|
o:value("salamander")
|
||||||
|
o.rewrite_option = o.option
|
||||||
|
o:depends({ [_n("custom")] = false })
|
||||||
|
|
||||||
|
o = s:option(Value, _n("obfs_password"), translate("Obfs Password"))
|
||||||
|
o.rewrite_option = o.option
|
||||||
|
o:depends({ [_n("obfs_type")] = "salamander" })
|
||||||
|
|
||||||
o = s:option(Flag, _n("udp"), translate("UDP"))
|
o = s:option(Flag, _n("udp"), translate("UDP"))
|
||||||
o.default = "1"
|
o.default = "1"
|
||||||
o.rewrite_option = o.option
|
o.rewrite_option = o.option
|
||||||
|
|||||||
@@ -128,6 +128,14 @@ o = s:option(Value, _n("hysteria2_auth_password"), translate("Auth Password"))
|
|||||||
o.password = true
|
o.password = true
|
||||||
o:depends({ [_n("protocol")] = "hysteria2"})
|
o:depends({ [_n("protocol")] = "hysteria2"})
|
||||||
|
|
||||||
|
o = s:option(ListValue, _n("hysteria2_obfs_type"), translate("Obfs Type"))
|
||||||
|
o:value("", translate("Disable"))
|
||||||
|
o:value("salamander")
|
||||||
|
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||||
|
|
||||||
|
o = s:option(Value, _n("hysteria2_obfs_password"), translate("Obfs Password"))
|
||||||
|
o:depends({ [_n("hysteria2_obfs_type")] = "salamander" })
|
||||||
|
|
||||||
o = s:option(Flag, _n("hysteria2_ignore_client_bandwidth"), translate("Client BBR Flow Control"))
|
o = s:option(Flag, _n("hysteria2_ignore_client_bandwidth"), translate("Client BBR Flow Control"))
|
||||||
o.default = 0
|
o.default = 0
|
||||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||||
@@ -138,14 +146,6 @@ o:depends({ [_n("protocol")] = "hysteria2", [_n("hysteria2_ignore_client_bandwid
|
|||||||
o = s:option(Value, _n("hysteria2_down_mbps"), translate("Max download Mbps"))
|
o = s:option(Value, _n("hysteria2_down_mbps"), translate("Max download Mbps"))
|
||||||
o:depends({ [_n("protocol")] = "hysteria2", [_n("hysteria2_ignore_client_bandwidth")] = false })
|
o:depends({ [_n("protocol")] = "hysteria2", [_n("hysteria2_ignore_client_bandwidth")] = false })
|
||||||
|
|
||||||
o = s:option(ListValue, _n("hysteria2_obfs_type"), translate("Obfs Type"))
|
|
||||||
o:value("", translate("Disable"))
|
|
||||||
o:value("salamander")
|
|
||||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
|
||||||
|
|
||||||
o = s:option(Value, _n("hysteria2_obfs_password"), translate("Obfs Password"))
|
|
||||||
o:depends({ [_n("hysteria2_obfs_type")] = "salamander" })
|
|
||||||
|
|
||||||
---- [[ TLS ]]
|
---- [[ TLS ]]
|
||||||
o = s:option(Flag, _n("tls"), translate("TLS"))
|
o = s:option(Flag, _n("tls"), translate("TLS"))
|
||||||
o.default = 0
|
o.default = 0
|
||||||
|
|||||||
@@ -158,6 +158,14 @@ if singbox_tags:find("with_quic") then
|
|||||||
o.password = true
|
o.password = true
|
||||||
o:depends({ [_n("protocol")] = "hysteria2"})
|
o:depends({ [_n("protocol")] = "hysteria2"})
|
||||||
|
|
||||||
|
o = s:option(ListValue, _n("hysteria2_obfs_type"), translate("Obfs Type"))
|
||||||
|
o:value("", translate("Disable"))
|
||||||
|
o:value("salamander")
|
||||||
|
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||||
|
|
||||||
|
o = s:option(Value, _n("hysteria2_obfs_password"), translate("Obfs Password"))
|
||||||
|
o:depends({ [_n("hysteria2_obfs_type")] = "salamander" })
|
||||||
|
|
||||||
o = s:option(Flag, _n("hysteria2_ignore_client_bandwidth"), translate("Client BBR Flow Control"), translate("Commands the client to use the BBR flow control algorithm"))
|
o = s:option(Flag, _n("hysteria2_ignore_client_bandwidth"), translate("Client BBR Flow Control"), translate("Commands the client to use the BBR flow control algorithm"))
|
||||||
o.default = 0
|
o.default = 0
|
||||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||||
@@ -167,14 +175,6 @@ if singbox_tags:find("with_quic") then
|
|||||||
|
|
||||||
o = s:option(Value, _n("hysteria2_down_mbps"), translate("Max download Mbps"))
|
o = s:option(Value, _n("hysteria2_down_mbps"), translate("Max download Mbps"))
|
||||||
o:depends({ [_n("protocol")] = "hysteria2", [_n("hysteria2_ignore_client_bandwidth")] = false })
|
o:depends({ [_n("protocol")] = "hysteria2", [_n("hysteria2_ignore_client_bandwidth")] = false })
|
||||||
|
|
||||||
o = s:option(ListValue, _n("hysteria2_obfs_type"), translate("Obfs Type"))
|
|
||||||
o:value("", translate("Disable"))
|
|
||||||
o:value("salamander")
|
|
||||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
|
||||||
|
|
||||||
o = s:option(Value, _n("hysteria2_obfs_password"), translate("Obfs Password"))
|
|
||||||
o:depends({ [_n("hysteria2_obfs_type")] = "salamander" })
|
|
||||||
end
|
end
|
||||||
|
|
||||||
o = s:option(ListValue, _n("d_protocol"), translate("Destination protocol"))
|
o = s:option(ListValue, _n("d_protocol"), translate("Destination protocol"))
|
||||||
|
|||||||
@@ -31,7 +31,11 @@ local type_table = {}
|
|||||||
for filename in fs.dir(types_dir) do
|
for filename in fs.dir(types_dir) do
|
||||||
table.insert(type_table, filename)
|
table.insert(type_table, filename)
|
||||||
end
|
end
|
||||||
table.sort(type_table)
|
table.sort(type_table, function(a, b)
|
||||||
|
if a == "socks.lua" then return true end
|
||||||
|
if b == "socks.lua" then return false end
|
||||||
|
return a < b
|
||||||
|
end)
|
||||||
|
|
||||||
for index, value in ipairs(type_table) do
|
for index, value in ipairs(type_table) do
|
||||||
local p_func = loadfile(types_dir .. value)
|
local p_func = loadfile(types_dir .. value)
|
||||||
|
|||||||
@@ -5,15 +5,24 @@ local jsonc = api.jsonc
|
|||||||
|
|
||||||
function gen_config_server(node)
|
function gen_config_server(node)
|
||||||
local config = {
|
local config = {
|
||||||
listen = ":" .. node.port,
|
listen = (function()
|
||||||
|
if node.hysteria2_realms and node.hysteria2_realm_url then
|
||||||
|
local url = node.hysteria2_realm_url:gsub("/+$", "")
|
||||||
|
if node.port then
|
||||||
|
url = url .. (url:find("?") and "&lport=" or "?lport=") .. node.port
|
||||||
|
end
|
||||||
|
return url
|
||||||
|
end
|
||||||
|
return ":" .. (node.port or "0")
|
||||||
|
end)(),
|
||||||
tls = {
|
tls = {
|
||||||
cert = node.tls_certificateFile,
|
cert = node.tls_certificateFile,
|
||||||
key = node.tls_keyFile,
|
key = node.tls_keyFile,
|
||||||
},
|
},
|
||||||
obfs = (node.hysteria2_obfs) and {
|
obfs = (node.hysteria2_obfs_type and node.hysteria2_obfs_password) and {
|
||||||
type = "salamander",
|
type = "salamander",
|
||||||
salamander = {
|
salamander = {
|
||||||
password = node.hysteria2_obfs
|
password = node.hysteria2_obfs_password
|
||||||
}
|
}
|
||||||
} or nil,
|
} or nil,
|
||||||
auth = {
|
auth = {
|
||||||
@@ -26,6 +35,9 @@ function gen_config_server(node)
|
|||||||
} or nil,
|
} or nil,
|
||||||
ignoreClientBandwidth = (node.hysteria2_ignoreClientBandwidth == "1") and true or false,
|
ignoreClientBandwidth = (node.hysteria2_ignoreClientBandwidth == "1") and true or false,
|
||||||
disableUDP = (node.hysteria2_udp == "0") and true or false,
|
disableUDP = (node.hysteria2_udp == "0") and true or false,
|
||||||
|
realm = (node.hysteria2_realms and node.hysteria2_realm_stun) and {
|
||||||
|
stunServers = node.hysteria2_realm_stun
|
||||||
|
} or nil
|
||||||
}
|
}
|
||||||
return config
|
return config
|
||||||
end
|
end
|
||||||
@@ -49,7 +61,7 @@ function gen_config(var)
|
|||||||
local local_http_password = var["local_http_password"]
|
local local_http_password = var["local_http_password"]
|
||||||
local tcp_proxy_way = var["tcp_proxy_way"]
|
local tcp_proxy_way = var["tcp_proxy_way"]
|
||||||
local server_host = var["server_host"] or (node.address or ""):lower()
|
local server_host = var["server_host"] or (node.address or ""):lower()
|
||||||
local server_port = var["server_port"] or node.port
|
local server_port = var["server_port"] or (node.port or "443")
|
||||||
|
|
||||||
if api.is_ipv6(server_host) then
|
if api.is_ipv6(server_host) then
|
||||||
server_host = api.get_ipv6_full(server_host)
|
server_host = api.get_ipv6_full(server_host)
|
||||||
@@ -61,7 +73,15 @@ function gen_config(var)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local config = {
|
local config = {
|
||||||
server = server,
|
server = (function()
|
||||||
|
if node.hysteria2_realms and node.hysteria2_realm_url then
|
||||||
|
return node.hysteria2_realm_url:gsub("/+$", "")
|
||||||
|
end
|
||||||
|
return server
|
||||||
|
end)(),
|
||||||
|
realm = (node.hysteria2_realms and node.hysteria2_realm_stun) and {
|
||||||
|
stunServers = node.hysteria2_realm_stun
|
||||||
|
} or nil,
|
||||||
transport = {
|
transport = {
|
||||||
type = "udp",
|
type = "udp",
|
||||||
udp = node.hysteria2_hop and (function()
|
udp = node.hysteria2_hop and (function()
|
||||||
@@ -86,10 +106,10 @@ function gen_config(var)
|
|||||||
return udp
|
return udp
|
||||||
end)() or nil
|
end)() or nil
|
||||||
},
|
},
|
||||||
obfs = (node.hysteria2_obfs) and {
|
obfs = (node.hysteria2_obfs_type and node.hysteria2_obfs_password) and {
|
||||||
type = "salamander",
|
type = "salamander",
|
||||||
salamander = {
|
salamander = {
|
||||||
password = node.hysteria2_obfs
|
password = node.hysteria2_obfs_password
|
||||||
}
|
}
|
||||||
} or nil,
|
} or nil,
|
||||||
auth = node.hysteria2_auth_password,
|
auth = node.hysteria2_auth_password,
|
||||||
|
|||||||
@@ -103,8 +103,8 @@ function gen_outbound(flag, node, tag, proxy_table)
|
|||||||
local run_socks_instance = true
|
local run_socks_instance = true
|
||||||
if proxy_table ~= nil and type(proxy_table) == "table" then
|
if proxy_table ~= nil and type(proxy_table) == "table" then
|
||||||
proxy_tag = proxy_table.tag or nil
|
proxy_tag = proxy_table.tag or nil
|
||||||
fragment = proxy_table.fragment or nil
|
fragment = (proxy_table.fragment and node.protocol ~= "naive") and true or nil
|
||||||
record_fragment = proxy_table.record_fragment or nil
|
record_fragment = (proxy_table.record_fragment and node.protocol ~= "naive") and true or nil
|
||||||
run_socks_instance = proxy_table.run_socks_instance
|
run_socks_instance = proxy_table.run_socks_instance
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -485,9 +485,9 @@ function gen_outbound(flag, node, tag, proxy_table)
|
|||||||
obfs = node.hysteria_obfs,
|
obfs = node.hysteria_obfs,
|
||||||
auth = (node.hysteria_auth_type == "base64") and node.hysteria_auth_password or nil,
|
auth = (node.hysteria_auth_type == "base64") and node.hysteria_auth_password or nil,
|
||||||
auth_str = (node.hysteria_auth_type == "string") and node.hysteria_auth_password or nil,
|
auth_str = (node.hysteria_auth_type == "string") and node.hysteria_auth_password or nil,
|
||||||
recv_window_conn = tonumber(node.hysteria_recv_window_conn),
|
recv_window_conn = tonumber(node.hysteria_recv_window_conn), --1.14 将变更为 stream_receive_window
|
||||||
recv_window = tonumber(node.hysteria_recv_window),
|
recv_window = tonumber(node.hysteria_recv_window), --1.14 将变更为 connection_receive_window
|
||||||
disable_mtu_discovery = (node.hysteria_disable_mtu_discovery == "1") and true or false,
|
disable_mtu_discovery = (node.hysteria_disable_mtu_discovery == "1") and true or false, --1.14 将变更为 disable_path_mtu_discovery
|
||||||
tls = tls
|
tls = tls
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
@@ -560,6 +560,17 @@ function gen_outbound(flag, node, tag, proxy_table)
|
|||||||
password = node.hysteria2_obfs_password
|
password = node.hysteria2_obfs_password
|
||||||
} or nil,
|
} or nil,
|
||||||
password = node.hysteria2_auth_password or nil,
|
password = node.hysteria2_auth_password or nil,
|
||||||
|
idle_timeout = (function(t)
|
||||||
|
if not version_ge_1_14_0 then return nil end
|
||||||
|
t = tonumber(tostring(t or "30"):match("^%d+"))
|
||||||
|
return (t and t >= 4 and t <= 120) and t or 30
|
||||||
|
end)(node.hysteria2_idle_timeout),
|
||||||
|
keep_alive_period = (function(t)
|
||||||
|
if not version_ge_1_14_0 then return nil end
|
||||||
|
t = tonumber(tostring(t or "0"):match("^%d+"))
|
||||||
|
return (t and t >= 2 and t <= 60) and t or nil
|
||||||
|
end)(node.hysteria2_keep_alive_period),
|
||||||
|
disable_path_mtu_discovery = version_ge_1_14_0 and (tonumber(node.hysteria2_disable_mtu_discovery) == 1) or nil,
|
||||||
tls = tls
|
tls = tls
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
@@ -846,10 +857,10 @@ function gen_config_server(node)
|
|||||||
auth_str = (node.hysteria_auth_type == "string") and node.hysteria_auth_password or nil,
|
auth_str = (node.hysteria_auth_type == "string") and node.hysteria_auth_password or nil,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
recv_window_conn = node.hysteria_recv_window_conn and tonumber(node.hysteria_recv_window_conn) or nil,
|
recv_window_conn = node.hysteria_recv_window_conn and tonumber(node.hysteria_recv_window_conn) or nil, --1.14 to stream_receive_window
|
||||||
recv_window_client = node.hysteria_recv_window_client and tonumber(node.hysteria_recv_window_client) or nil,
|
recv_window_client = node.hysteria_recv_window_client and tonumber(node.hysteria_recv_window_client) or nil, --1.14 to connection_receive_window
|
||||||
max_conn_client = node.hysteria_max_conn_client and tonumber(node.hysteria_max_conn_client) or nil,
|
max_conn_client = node.hysteria_max_conn_client and tonumber(node.hysteria_max_conn_client) or nil, --1.14 to max_concurrent_streams
|
||||||
disable_mtu_discovery = (node.hysteria_disable_mtu_discovery == "1") and true or false,
|
disable_mtu_discovery = (node.hysteria_disable_mtu_discovery == "1") and true or false, --1.14 to disable_path_mtu_discover
|
||||||
tls = tls
|
tls = tls
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -602,10 +602,10 @@ local current_node = map:get(section)
|
|||||||
|
|
||||||
if (v_type === "Hysteria2") {
|
if (v_type === "Hysteria2") {
|
||||||
v_password = opt.get("hysteria2_auth_password");
|
v_password = opt.get("hysteria2_auth_password");
|
||||||
var dom_obfs = opt.get("hysteria2_obfs");
|
var dom_obfs = opt.get("hysteria2_obfs_password");
|
||||||
if (dom_obfs && dom_obfs.value != "") {
|
if (dom_obfs && dom_obfs.value != "") {
|
||||||
params += "&obfs=" + "salamander";
|
params += "&obfs=" + "salamander";
|
||||||
params += opt.query("obfs-password", "hysteria2_obfs");
|
params += opt.query("obfs-password", "hysteria2_obfs_password");
|
||||||
}
|
}
|
||||||
params += opt.query("mport", "hysteria2_hop");
|
params += opt.query("mport", "hysteria2_hop");
|
||||||
} else {
|
} else {
|
||||||
@@ -1620,7 +1620,8 @@ local current_node = map:get(section)
|
|||||||
dom_prefix = "hysteria2_"
|
dom_prefix = "hysteria2_"
|
||||||
opt.set(dom_prefix + 'auth_password', decodeURIComponent(password));
|
opt.set(dom_prefix + 'auth_password', decodeURIComponent(password));
|
||||||
if (queryParam["obfs-password"] || queryParam["obfs_password"]) {
|
if (queryParam["obfs-password"] || queryParam["obfs_password"]) {
|
||||||
opt.set(dom_prefix + 'obfs', queryParam["obfs-password"] || queryParam["obfs_password"]);
|
opt.set(dom_prefix + 'obfs_type', "salamander");
|
||||||
|
opt.set(dom_prefix + 'obfs_password', queryParam["obfs-password"] || queryParam["obfs_password"]);
|
||||||
}
|
}
|
||||||
opt.set(dom_prefix + 'hop', queryParam.mport || "");
|
opt.set(dom_prefix + 'hop', queryParam.mport || "");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1415,22 +1415,19 @@ local function processData(szType, content, add_mode, group, sub_cfg)
|
|||||||
local insecure = params.allowinsecure or params.insecure
|
local insecure = params.allowinsecure or params.insecure
|
||||||
result.tls_allowInsecure = (insecure == "1" or insecure == "0") and insecure or (sub_allowinsecure and "1" or "0")
|
result.tls_allowInsecure = (insecure == "1" or insecure == "0") and insecure or (sub_allowinsecure and "1" or "0")
|
||||||
result.hysteria2_hop = params.mport
|
result.hysteria2_hop = params.mport
|
||||||
|
if params["obfs-password"] or params["obfs_password"] then
|
||||||
|
result.hysteria2_obfs_type = "salamander"
|
||||||
|
result.hysteria2_obfs_password = params["obfs-password"] or params["obfs_password"]
|
||||||
|
end
|
||||||
|
|
||||||
if (sub_hysteria2_type == "sing-box" and has_singbox) or (sub_hysteria2_type == "xray" and has_xray) then
|
if (sub_hysteria2_type == "sing-box" and has_singbox) or (sub_hysteria2_type == "xray" and has_xray) then
|
||||||
local is_singbox = sub_hysteria2_type == "sing-box" and has_singbox
|
local is_singbox = sub_hysteria2_type == "sing-box" and has_singbox
|
||||||
result.type = is_singbox and 'sing-box' or 'Xray'
|
result.type = is_singbox and 'sing-box' or 'Xray'
|
||||||
result.protocol = "hysteria2"
|
result.protocol = "hysteria2"
|
||||||
if params["obfs-password"] or params["obfs_password"] then
|
|
||||||
result.hysteria2_obfs_type = "salamander"
|
|
||||||
result.hysteria2_obfs_password = params["obfs-password"] or params["obfs_password"]
|
|
||||||
end
|
|
||||||
result.use_finalmask = (params.fm and params.fm ~= "") and "1" or nil
|
result.use_finalmask = (params.fm and params.fm ~= "") and "1" or nil
|
||||||
result.finalmask = (params.fm and params.fm ~= "") and api.base64Encode(params.fm) or nil
|
result.finalmask = (params.fm and params.fm ~= "") and api.base64Encode(params.fm) or nil
|
||||||
elseif has_hysteria2 then
|
elseif has_hysteria2 then
|
||||||
result.type = "Hysteria2"
|
result.type = "Hysteria2"
|
||||||
if params["obfs-password"] or params["obfs_password"] then
|
|
||||||
result.hysteria2_obfs = params["obfs-password"] or params["obfs_password"]
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
log("跳过 Hysteria2 节点,因未适配到 Hysteria2 核心程序,或未正确设置节点使用类型。")
|
log("跳过 Hysteria2 节点,因未适配到 Hysteria2 核心程序,或未正确设置节点使用类型。")
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -7,10 +7,10 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
LUCI_TITLE:=Argon Theme
|
LUCI_TITLE:=Argon Theme
|
||||||
LUCI_DEPENDS:=+@wget-any +jsonfilter
|
LUCI_DEPENDS:=+wget-any +jsonfilter
|
||||||
|
|
||||||
PKG_VERSION:=2.4.3
|
PKG_VERSION:=2.4.3
|
||||||
PKG_RELEASE:=2
|
PKG_RELEASE:=3
|
||||||
|
|
||||||
LUCI_MINIFY_CSS:=0
|
LUCI_MINIFY_CSS:=0
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
@@ -1 +1 @@
|
|||||||
body{background:#1e1e1e;color:#cccccc}.spinning::before{filter:invert(1)}.login-page .login-container .login-form{background-color:#1e1e1e;-webkit-backdrop-filter:blur(var(--blur-radius-dark)) brightness(0);backdrop-filter:blur(var(--blur-radius-dark)) brightness(0);background-color:rgba(0, 0, 0, var(--blur-opacity-dark))}.login-page .login-container .login-form .brand{color:#adb5bd}.login-page .login-container .login-form .form-login .input-group::before{color:#adb5bd}.login-page .login-container .login-form .form-login .input-group input{background-color:transparent !important;color:#adb5bd;border-bottom:#adb5bd 1px solid !important;border-radius:0 !important;border-top:none !important;border-left:none !important;border-right:none !important;box-shadow:none}.login-page .login-container .login-form .form-login .cbi-button-apply{background-color:#483d8b !important;background-color:var(--dark-primary) !important}.login-page .login-container .login-form .form-login .cbi-button-apply:hover,.login-page .login-container .login-form .form-login .cbi-button-apply:focus{opacity:.9}header::after{background-color:#1e1e1e !important}.main .main-left{background-color:#333333 !important;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.15)}.main .main-left .sidenav-header .brand{color:#cccccc}.main .main-left .nav .slide .slide-menu .active a{color:#cccccc}.main .main-left .nav .slide .slide-menu .active a::after{background-color:#cccccc !important}.main .main-left .nav .slide .slide-menu .active::after{background-color:var(--dark-primary) !important}.main .main-left .nav .slide .slide-menu li a{color:#cccccc}.main .main-left .nav .slide .slide-menu li a:hover{background:none !important}.main .main-left .nav .slide .slide-menu li::after{background-color:var(--dark-primary) !important}.main .main-left .nav .slide .menu.active{background-color:#483d8b !important;background-color:var(--dark-primary) !important;color:#ffffff !important}.main .main-left .nav .slide .menu.active a::after{background-color:#ffffff !important}.main .main-left .nav li a{color:#cccccc !important}.main .main-left .nav li a:hover{background-color:#483d8b !important;background-color:var(--dark-primary) !important;color:#ffffff !important}.main .main-left::-webkit-scrollbar-thumb{background-color:#252526 !important}.main .main-left::-webkit-scrollbar-track{background-color:#333}.main .main-right{background-color:#1e1e1e}h2{color:#ccc;background:#333333}h3{color:#ccc;border-bottom:0;background:#333333}h4{color:#8C6900}abbr{color:var(--dark-primary) !important}a:link,a:visited,a:active{color:#a5b2ff}input:-webkit-autofill{background-color:#3c3c3c !important}#channel_graph{background-color:transparent !important}.cbi-value-field .cbi-input-apply,.cbi-button-apply,.cbi-button-edit{color:#fff !important;background-color:#483d8b !important;background-color:var(--dark-primary) !important;border-color:#483d8b !important;border-color:var(--dark-primary) !important}.cbi-section em{color:#ccc}header.bg-primary{background-color:#1e1e1e !important}.cbi-map-descr{color:#ccc}.cbi-section{background:none;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35)}.panel-title{color:#ccc;background-color:#333333}div>table>tbody>tr:nth-of-type(2n),div>.table>.tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{color:#cccccc}fieldset>table>tbody>tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{border-top:1px solid #252526}#swaptotal>div>div,#swapfree>div>div,#memfree>div>div,#membuff>div>div,#conns>div>div,#memtotal>div>div{background-color:var(--dark-primary) !important}#swaptotal>div>div>div>small,#swapfree>div>div>div>small,#memfree>div>div>div>small,#membuff>div>div>div>small,#conns>div>div>div>small,#memtotal>div>div>div>small{color:#ccc !important}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last{line-height:1.8em}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"]{border:1px solid #999999 !important;background-color:transparent !important}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] div{background-color:#ba8b00 !important}table>tbody>tr>th,table>tfoot>tr>th,table>thead>tr>th{background-color:#252526;border-bottom:black 1px solid !important}.tr[data-title]::before,.tr.cbi-section-table-titles.named::before{background-color:#252526}tr>td,tr>th,.tr>.td,.tr>.th,.cbi-section-table-row::before,#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2){border-top:0}.cbi-rowstyle-2{background-color:#1e1e1e}.cbi-rowstyle-1{background-color:#252526}.cbi-rowstyle-2 .cbi-button-up,.cbi-rowstyle-2 .cbi-button-down,body:not(.Interfaces) .cbi-rowstyle-2:first-child{background-color:#666 !important}.cbi-section>h3:first-child,.panel-title,h3{coloLine truncated
|
body{background:#1e1e1e;color:#cccccc}.spinning::before{filter:invert(1)}.login-page .login-container{background-color:rgba(0, 0, 0, var(--blur-opacity-dark));-webkit-backdrop-filter:blur(var(--blur-radius-dark));backdrop-filter:blur(var(--blur-radius-dark))}.login-page .login-container .login-form{background-color:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}.login-page .login-container .login-form .brand{color:#adb5bd}.login-page .login-container .login-form .form-login .input-group::before{color:#adb5bd}.login-page .login-container .login-form .form-login .input-group input{background-color:transparent !important;color:#adb5bd;border-bottom:#adb5bd 1px solid !important;border-radius:0 !important;border-top:none !important;border-left:none !important;border-right:none !important;box-shadow:none}.login-page .login-container .login-form .form-login .cbi-button-apply{background-color:#483d8b !important;background-color:var(--dark-primary) !important}.login-page .login-container .login-form .form-login .cbi-button-apply:hover,.login-page .login-container .login-form .form-login .cbi-button-apply:focus{opacity:.9}header::after{background-color:#1e1e1e !important}.main .main-left{background-color:#333333 !important;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.15)}.main .main-left .sidenav-header .brand{color:#cccccc}.main .main-left .nav .slide .slide-menu .active a{color:#cccccc}.main .main-left .nav .slide .slide-menu .active a::after{background-color:#cccccc !important}.main .main-left .nav .slide .slide-menu .active::after{background-color:var(--dark-primary) !important}.main .main-left .nav .slide .slide-menu li a{color:#cccccc}.main .main-left .nav .slide .slide-menu li a:hover{background:none !important}.main .main-left .nav .slide .slide-menu li::after{background-color:var(--dark-primary) !important}.main .main-left .nav .slide .menu.active{background-color:#483d8b !important;background-color:var(--dark-primary) !important;color:#ffffff !important}.main .main-left .nav .slide .menu.active a::after{background-color:#ffffff !important}.main .main-left .nav li a{color:#cccccc !important}.main .main-left .nav li a:hover{background-color:#483d8b !important;background-color:var(--dark-primary) !important;color:#ffffff !important}.main .main-left::-webkit-scrollbar-thumb{background-color:#252526 !important}.main .main-left::-webkit-scrollbar-track{background-color:#333}.main .main-right{background-color:#1e1e1e}h2{color:#ccc;background:#333333}h3{color:#ccc;border-bottom:0;background:#333333}h4{color:#8C6900}abbr{color:var(--dark-primary) !important}a:link,a:visited,a:active{color:#a5b2ff}input:-webkit-autofill{background-color:#3c3c3c !important}#channel_graph{background-color:transparent !important}.cbi-value-field .cbi-input-apply,.cbi-button-apply,.cbi-button-edit{color:#fff !important;background-color:#483d8b !important;background-color:var(--dark-primary) !important;border-color:#483d8b !important;border-color:var(--dark-primary) !important}.cbi-section em{color:#ccc}header.bg-primary{background-color:#1e1e1e !important}.cbi-map-descr{color:#ccc}.cbi-section{background:none;box-shadow:0 0 .5rem 0 rgba(0,0,0,0.35)}.panel-title{color:#ccc;background-color:#333333}div>table>tbody>tr:nth-of-type(2n),div>.table>.tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{color:#cccccc}fieldset>table>tbody>tr:nth-of-type(2n){background-color:#252526}table>tbody>tr>td,table>tfoot>tr>td,table>thead>tr>td{border-top:1px solid #252526}#swaptotal>div>div,#swapfree>div>div,#memfree>div>div,#membuff>div>div,#conns>div>div,#memtotal>div>div{background-color:var(--dark-primary) !important}#swaptotal>div>div>div>small,#swapfree>div>div>div>small,#memfree>div>div>div>small,#membuff>div>div>div>small,#conns>div>div>div>small,#memtotal>div>div>div>small{color:#ccc !important}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last{line-height:1.8em}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"]{border:1px solid #999999 !important;background-color:transparent !important}.node-system-packages>.main .cbi-section-node:first-child .cbi-value-last div[style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080"] div{background-color:#ba8b00 !important}table>tbody>tr>th,table>tfoot>tr>th,table>thead>tr>th{background-color:#252526;border-bottom:black 1px solid !important}.tr[data-title]::before,.tr.cbi-section-table-titles.named::before{background-color:#252526}tr>td,tr>th,.tr>.td,.tr>.th,.cbi-section-table-row::before,#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2){border-top:0}.cbi-rowstyle-2{background-color:#1e1e1e}.cbi-rowstyle-1{background-color:#252526}.cbi-rowstyle-2 .cbi-button-up,.cbi-rowstyle-2 .cbi-button-down,body:not(.Interfaces) .cbi-rowstyle-2:first-child{background-color:#666 !impLine truncated
|
||||||
@@ -257,6 +257,11 @@ select[multiple="multiple"] {
|
|||||||
margin: 5em auto;
|
margin: 5em auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.alert-message {
|
||||||
|
transform: none;
|
||||||
|
position: static;
|
||||||
|
}
|
||||||
|
|
||||||
.alert-message>h4 {
|
.alert-message>h4 {
|
||||||
font-size: 110%;
|
font-size: 110%;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@@ -270,6 +275,11 @@ select[multiple="multiple"] {
|
|||||||
padding: .3rem .6rem;
|
padding: .3rem .6rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#maincontent > .alert-message {
|
||||||
|
position: fixed;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
|
|
||||||
.container .alert,
|
.container .alert,
|
||||||
.container .alert-message {
|
.container .alert-message {
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
@@ -464,14 +474,16 @@ table>thead>tr>th,
|
|||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr>td,
|
body:not([data-page="admin-dashboard"]) {
|
||||||
tr>th,
|
tr>td,
|
||||||
.tr>.td,
|
tr>th,
|
||||||
.tr>.th,
|
.tr>.td,
|
||||||
.cbi-section-table-row::before,
|
.tr>.th,
|
||||||
#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2) {
|
.cbi-section-table-row::before,
|
||||||
border-top: thin solid #ddd;
|
#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2) {
|
||||||
padding: 1.1em 1.25rem;
|
border-top: thin solid #ddd;
|
||||||
|
padding: 1.1em 1.25rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#cbi-wireless .td,
|
#cbi-wireless .td,
|
||||||
@@ -1431,7 +1443,6 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
font-size: 0;
|
font-size: 0;
|
||||||
color: #8898aa;
|
|
||||||
background-color: currentColor;
|
background-color: currentColor;
|
||||||
mask-image: var(--dropdown-arrow-icon);
|
mask-image: var(--dropdown-arrow-icon);
|
||||||
mask-repeat: no-repeat;
|
mask-repeat: no-repeat;
|
||||||
@@ -2493,6 +2504,26 @@ pre.command-output {
|
|||||||
padding: 1.5rem;
|
padding: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.alert-message.spinning,
|
||||||
|
.modal.alert-message.spinning {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
height: 16px;
|
||||||
|
width: 16px;
|
||||||
|
position: absolute;
|
||||||
|
top: 2rem;
|
||||||
|
left: 0.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.cbi-dropdown.cbi-button-positive>ul>li[display="0"] {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cbi-dropdown[open]>ul.dropdown>li[selected] {
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
/* page fix */
|
/* page fix */
|
||||||
@import url("page-fix.less");
|
@import url("page-fix.less");
|
||||||
|
|||||||
@@ -39,12 +39,14 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.login-page .login-container {
|
.login-page .login-container {
|
||||||
|
background-color: rgba(0, 0, 0, var(--blur-opacity-dark));
|
||||||
|
-webkit-backdrop-filter: blur(var(--blur-radius-dark));
|
||||||
|
backdrop-filter: blur(var(--blur-radius-dark));
|
||||||
|
|
||||||
.login-form {
|
.login-form {
|
||||||
background-color: #1e1e1e;
|
background-color: transparent;
|
||||||
-webkit-backdrop-filter: blur(var(--blur-radius-dark)) brightness(0);
|
-webkit-backdrop-filter: none;
|
||||||
backdrop-filter: blur(var(--blur-radius-dark)) brightness(0);
|
backdrop-filter: none;
|
||||||
background-color: rgba(0, 0, 0, var(--blur-opacity-dark));
|
|
||||||
|
|
||||||
.brand {
|
.brand {
|
||||||
color: #adb5bd;
|
color: #adb5bd;
|
||||||
@@ -1069,10 +1071,10 @@ input,
|
|||||||
.developer-container {
|
.developer-container {
|
||||||
background: transparent !important;
|
background: transparent !important;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
.config-upload-content{
|
.config-upload-content{
|
||||||
background: #1e1e1e !important;
|
background: #1e1e1e !important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.cbi-tabmenu::-webkit-scrollbar-thumb {
|
.cbi-tabmenu::-webkit-scrollbar-thumb {
|
||||||
@@ -1220,3 +1222,19 @@ input,
|
|||||||
background-color: rgb(112, 112, 112);
|
background-color: rgb(112, 112, 112);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[data-page="admin-system-admin-repokeys"] #key-input {
|
||||||
|
background-color: #1e1e1e;
|
||||||
|
color: #ccc;
|
||||||
|
border: 1px solid #3c3c3c !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-page="admin-system-package-manager"] #modal_overlay textarea{
|
||||||
|
background-color: #1e1e1e;
|
||||||
|
color: #ccc;
|
||||||
|
border: 1px solid #3c3c3c !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cbi-dropdown[open]>ul.dropdown>li[selected] {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
@@ -439,6 +439,7 @@
|
|||||||
|
|
||||||
p span:nth-child(2) {
|
p span:nth-child(2) {
|
||||||
max-height: 18.5px;
|
max-height: 18.5px;
|
||||||
|
max-width: inherit;
|
||||||
top: 4px;
|
top: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -760,6 +760,15 @@
|
|||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.oc .sub-card:hover {
|
||||||
|
transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.oc .myip-ip-item:hover,
|
||||||
|
.oc .myip-check-item:hover {
|
||||||
|
transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
.oc .main-cards-container {
|
.oc .main-cards-container {
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
gap: 0 !important;
|
gap: 0 !important;
|
||||||
@@ -867,6 +876,24 @@
|
|||||||
background: transparent;
|
background: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// VPN - Passwall2
|
||||||
|
[data-page^="admin-vpn-passwall2"],
|
||||||
|
[data-page^="admin-services-passwall2"] {
|
||||||
|
.tr,
|
||||||
|
.td,
|
||||||
|
.th,
|
||||||
|
.cbi-section-table-row,
|
||||||
|
#cbi-passwall2-socks,
|
||||||
|
#cbi-passwall2-socks * {
|
||||||
|
overflow: visible !important;
|
||||||
|
max-height: none !important;
|
||||||
|
transform: none !important;
|
||||||
|
filter: none !important;
|
||||||
|
contain: none !important;
|
||||||
|
clip-path: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* openvpn bug fix */
|
/* openvpn bug fix */
|
||||||
.OpenVPN a {
|
.OpenVPN a {
|
||||||
line-height: initial !important;
|
line-height: initial !important;
|
||||||
@@ -912,6 +939,24 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#cbi-wireless,
|
||||||
|
#cbi-wireless *,
|
||||||
|
#wifi_assoclist_table,
|
||||||
|
#wifi_assoclist_table * {
|
||||||
|
overflow: visible !important;
|
||||||
|
max-height: none !important;
|
||||||
|
transform: none !important;
|
||||||
|
filter: none !important;
|
||||||
|
contain: none !important;
|
||||||
|
clip-path: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cbi-wireless,
|
||||||
|
#wifi_assoclist_table {
|
||||||
|
height: auto !important;
|
||||||
|
min-height: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
/* samba */
|
/* samba */
|
||||||
#cbi-samba [data-tab="template"] {
|
#cbi-samba [data-tab="template"] {
|
||||||
.cbi-value-field {
|
.cbi-value-field {
|
||||||
|
|||||||
@@ -88,11 +88,17 @@
|
|||||||
|
|
||||||
// Login form
|
// Login form
|
||||||
.login-form {
|
.login-form {
|
||||||
.absolute-full();
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
max-width: 26rem;
|
max-width: 26rem;
|
||||||
|
-webkit-backdrop-filter: none;
|
||||||
|
backdrop-filter: none;
|
||||||
|
|
||||||
|
|
||||||
// Brand/Logo section
|
// Brand/Logo section
|
||||||
|
|||||||
@@ -62,7 +62,7 @@
|
|||||||
|
|
||||||
<!-- Security -->
|
<!-- Security -->
|
||||||
<meta http-equiv="X-Content-Type-Options" content="nosniff">
|
<meta http-equiv="X-Content-Type-Options" content="nosniff">
|
||||||
<meta http-equiv="X-Frame-Options" content="SAMEORIGIN">
|
<!-- <meta http-equiv="X-Frame-Options" content="SAMEORIGIN"> -->
|
||||||
<meta http-equiv="X-XSS-Protection" content="1; mode=block">
|
<meta http-equiv="X-XSS-Protection" content="1; mode=block">
|
||||||
<meta http-equiv="Referrer-Policy" content="strict-origin-when-cross-origin">
|
<meta http-equiv="Referrer-Policy" content="strict-origin-when-cross-origin">
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -10,12 +10,12 @@ include $(INCLUDE_DIR)/kernel.mk
|
|||||||
|
|
||||||
PKG_NAME:=natflow
|
PKG_NAME:=natflow
|
||||||
PKG_VERSION:=20260313
|
PKG_VERSION:=20260313
|
||||||
PKG_RELEASE:=8
|
PKG_RELEASE:=9
|
||||||
|
|
||||||
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:=22c630b387a5ca027bc77d3364818ed87e0a6254
|
PKG_SOURCE_VERSION:=874c41f26a54920ef7577cf4fe6be8b842be2821
|
||||||
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
|
||||||
|
|||||||
+2
-2
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=teleproxy
|
PKG_NAME:=teleproxy
|
||||||
PKG_VERSION:=4.12.2
|
PKG_VERSION:=4.12.2
|
||||||
PKG_RELEASE:=8
|
PKG_RELEASE:=9
|
||||||
|
|
||||||
PKG_MAINTAINER:=Kosntantine Shevlakov <shevlakov@132lan.ru>
|
PKG_MAINTAINER:=Kosntantine Shevlakov <shevlakov@132lan.ru>
|
||||||
PKG_LICENSE:=GPLv2
|
PKG_LICENSE:=GPLv2
|
||||||
@@ -10,7 +10,7 @@ PKG_LICENSE_FILES:=LICENSE
|
|||||||
|
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_URL:=https://github.com/teleproxy/teleproxy.git
|
PKG_SOURCE_URL:=https://github.com/teleproxy/teleproxy.git
|
||||||
PKG_SOURCE_VERSION:=4dc15ffbcce1ae83070ca5da88c8ad80323935c8
|
PKG_SOURCE_VERSION:=12a822ef794bab357772348d698dfef3a13487de
|
||||||
|
|
||||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)
|
PKG_SOURCE_SUBDIR:=$(PKG_NAME)
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
|
|||||||
Reference in new issue
Block a user