diff --git a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js
index d34a5a932..102bd328e 100644
--- a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js
+++ b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js
@@ -799,6 +799,17 @@ return view.extend({
.format('https://wiki.metacubex.one/config/proxy-groups/#exclude-type'));
so.placeholder = 'Shadowsocks|Trojan';
so.modalonly = true;
+
+ so = ss.taboption('field_general', form.Flag, 'hidden', _('Hidden'),
+ _('Returns hidden status in the API to hide the display of this proxy group.') + '' +
+ _('requires front-end adaptation using the API.'));
+ so.default = so.disabled;
+ so.modalonly = true;
+
+ so = ss.taboption('field_general', form.Value, 'icon', _('Icon'),
+ _('Returns the string input for icon in the API to display in this proxy group.') + '' +
+ _('requires front-end adaptation using the API.'));
+ so.modalonly = true;
/* Proxy Group END */
/* Routing rules START */
diff --git a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js
index 1cc49fac4..ef7e92583 100644
--- a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js
+++ b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js
@@ -168,9 +168,9 @@ return view.extend({
return E('strong', [features.core_version || _('Unknown')]);
}
- so = ss.option(form.DummyValue, '_luciapp_version', _('Application version'));
+ so = ss.option(form.DummyValue, '_app_version', _('Application version'));
so.cfgvalue = function() {
- return E('strong', [features.luciapp_version || _('Unknown')]);
+ return E('strong', [features.app_version || _('Unknown')]);
}
so = ss.option(form.DummyValue, '_client_status', _('Client status'));
@@ -231,7 +231,7 @@ return view.extend({
so.value.apply(so, res);
})
so.rmempty = false;
- if (!features.hm_has_stunclient) {
+ if (!features.has_stunclient) {
so.description = _('To check NAT Behavior you need to install stuntman-client first')
.format('https://github.com/muink/openwrt-stuntman');
so.readonly = true;
@@ -475,9 +475,9 @@ return view.extend({
so = ss.option(form.ListValue, 'proxy_mode', _('Proxy mode'));
so.value('redir', _('Redirect TCP'));
- if (features.hm_has_tproxy)
+ if (features.has_tproxy)
so.value('redir_tproxy', _('Redirect TCP + TProxy UDP'));
- if (features.hm_has_ip_full && features.hm_has_tun) {
+ if (features.has_ip_full && features.has_tun) {
so.value('redir_tun', _('Redirect TCP + Tun UDP'));
so.value('tun', _('Tun TCP/UDP'));
} else
@@ -782,7 +782,7 @@ return view.extend({
_('Please ensure that the DNS query of the domains to be processed in the DNS policy' +
'are send via DIRECT/Proxy Node in the same semantics as Routing mode.'));
so.default = so.disabled;
- if (!features.hm_has_dnsmasq_full) {
+ if (!features.has_dnsmasq_full) {
so.description = _('To enable, you need to install dnsmasq-full.');
so.readonly = true;
uci.set(data[0], so.section.section, so.option, '');
diff --git a/luci-app-fchomo/po/templates/fchomo.pot b/luci-app-fchomo/po/templates/fchomo.pot
index e49fe721c..b4f878e8c 100644
--- a/luci-app-fchomo/po/templates/fchomo.pot
+++ b/luci-app-fchomo/po/templates/fchomo.pot
@@ -1010,6 +1010,10 @@ msgstr ""
msgid "Heartbeat interval"
msgstr ""
+#: htdocs/luci-static/resources/view/fchomo/client.js:803
+msgid "Hidden"
+msgstr ""
+
#: htdocs/luci-static/resources/view/fchomo/node.js:441
msgid "Host that supports TLS 1.3"
msgstr ""
@@ -1063,6 +1067,10 @@ msgstr ""
msgid "IPv6 support"
msgstr ""
+#: htdocs/luci-static/resources/view/fchomo/client.js:809
+msgid "Icon"
+msgstr ""
+
#: htdocs/luci-static/resources/view/fchomo/node.js:289
msgid "Idle session check interval"
msgstr ""
@@ -1891,6 +1899,16 @@ msgstr ""
msgid "Restls script"
msgstr ""
+#: htdocs/luci-static/resources/view/fchomo/client.js:804
+msgid ""
+"Returns hidden status in the API to hide the display of this proxy group."
+msgstr ""
+
+#: htdocs/luci-static/resources/view/fchomo/client.js:810
+msgid ""
+"Returns the string input for icon in the API to display in this proxy group."
+msgstr ""
+
#: htdocs/luci-static/resources/view/fchomo/global.js:754
msgid "Routing Control"
msgstr ""
@@ -2692,6 +2710,11 @@ msgstr ""
msgid "razord-meta"
msgstr ""
+#: htdocs/luci-static/resources/view/fchomo/client.js:805
+#: htdocs/luci-static/resources/view/fchomo/client.js:811
+msgid "requires front-end adaptation using the API."
+msgstr ""
+
#: htdocs/luci-static/resources/view/fchomo/node.js:430
msgid "restls"
msgstr ""
diff --git a/luci-app-fchomo/po/zh_Hans/fchomo.po b/luci-app-fchomo/po/zh_Hans/fchomo.po
index e1002c66f..d6276691c 100644
--- a/luci-app-fchomo/po/zh_Hans/fchomo.po
+++ b/luci-app-fchomo/po/zh_Hans/fchomo.po
@@ -1030,6 +1030,10 @@ msgstr "健康字段"
msgid "Heartbeat interval"
msgstr "心跳间隔"
+#: htdocs/luci-static/resources/view/fchomo/client.js:803
+msgid "Hidden"
+msgstr "隐藏"
+
#: htdocs/luci-static/resources/view/fchomo/node.js:441
msgid "Host that supports TLS 1.3"
msgstr "主机名称 (支援 TLS 1.3)"
@@ -1083,6 +1087,10 @@ msgstr "仅 IPv6"
msgid "IPv6 support"
msgstr "IPv6 支持"
+#: htdocs/luci-static/resources/view/fchomo/client.js:809
+msgid "Icon"
+msgstr "图标"
+
#: htdocs/luci-static/resources/view/fchomo/node.js:289
msgid "Idle session check interval"
msgstr "空闲会话检查间隔"
@@ -1918,6 +1926,16 @@ msgstr "资源管理"
msgid "Restls script"
msgstr "Restls 剧本"
+#: htdocs/luci-static/resources/view/fchomo/client.js:804
+msgid ""
+"Returns hidden status in the API to hide the display of this proxy group."
+msgstr "在 API 返回 hidden 状态,以隐藏该代理组显示"
+
+#: htdocs/luci-static/resources/view/fchomo/client.js:810
+msgid ""
+"Returns the string input for icon in the API to display in this proxy group."
+msgstr "在 API 返回 icon 所输入的字符串,以在该代理组显示"
+
#: htdocs/luci-static/resources/view/fchomo/global.js:754
msgid "Routing Control"
msgstr "路由控制"
@@ -2726,6 +2744,11 @@ msgstr "私钥"
msgid "razord-meta"
msgstr "razord-meta"
+#: htdocs/luci-static/resources/view/fchomo/client.js:805
+#: htdocs/luci-static/resources/view/fchomo/client.js:811
+msgid "requires front-end adaptation using the API."
+msgstr "需要使用 API 的前端适配"
+
#: htdocs/luci-static/resources/view/fchomo/node.js:430
msgid "restls"
msgstr ""
diff --git a/luci-app-fchomo/po/zh_Hant/fchomo.po b/luci-app-fchomo/po/zh_Hant/fchomo.po
index 50154bf17..3c0638b04 100644
--- a/luci-app-fchomo/po/zh_Hant/fchomo.po
+++ b/luci-app-fchomo/po/zh_Hant/fchomo.po
@@ -1030,6 +1030,10 @@ msgstr "健康欄位"
msgid "Heartbeat interval"
msgstr "心跳間隔"
+#: htdocs/luci-static/resources/view/fchomo/client.js:803
+msgid "Hidden"
+msgstr "隱藏"
+
#: htdocs/luci-static/resources/view/fchomo/node.js:441
msgid "Host that supports TLS 1.3"
msgstr "主機名稱 (支援 TLS 1.3)"
@@ -1083,6 +1087,10 @@ msgstr "僅 IPv6"
msgid "IPv6 support"
msgstr "IPv6 支援"
+#: htdocs/luci-static/resources/view/fchomo/client.js:809
+msgid "Icon"
+msgstr "圖標"
+
#: htdocs/luci-static/resources/view/fchomo/node.js:289
msgid "Idle session check interval"
msgstr "空閒會話檢查間隔"
@@ -1918,6 +1926,16 @@ msgstr "資源管理"
msgid "Restls script"
msgstr "Restls 劇本"
+#: htdocs/luci-static/resources/view/fchomo/client.js:804
+msgid ""
+"Returns hidden status in the API to hide the display of this proxy group."
+msgstr "在 API 傳回 hidden 狀態,以隱藏該代理組顯示"
+
+#: htdocs/luci-static/resources/view/fchomo/client.js:810
+msgid ""
+"Returns the string input for icon in the API to display in this proxy group."
+msgstr "在 API 傳回 icon 所輸入的字串,以在該代理組顯示"
+
#: htdocs/luci-static/resources/view/fchomo/global.js:754
msgid "Routing Control"
msgstr "路由控制"
@@ -2726,6 +2744,11 @@ msgstr "私鑰"
msgid "razord-meta"
msgstr "razord-meta"
+#: htdocs/luci-static/resources/view/fchomo/client.js:805
+#: htdocs/luci-static/resources/view/fchomo/client.js:811
+msgid "requires front-end adaptation using the API."
+msgstr "需要使用 API 的前端適配"
+
#: htdocs/luci-static/resources/view/fchomo/node.js:430
msgid "restls"
msgstr ""
diff --git a/luci-app-fchomo/root/usr/share/fchomo/firewall_post.ut b/luci-app-fchomo/root/usr/share/fchomo/firewall_post.ut
index f36ef4cb0..f51164a2a 100644
--- a/luci-app-fchomo/root/usr/share/fchomo/firewall_post.ut
+++ b/luci-app-fchomo/root/usr/share/fchomo/firewall_post.ut
@@ -4,7 +4,7 @@
{%-
import { readfile } from 'fs';
import { cursor } from 'uci';
- import { isEmpty, yqRead } from 'fchomo';
+ import { isEmpty, yqReadFile } from 'fchomo';
const fw4 = require('fw4');
@@ -122,10 +122,10 @@
for (let i in control_options)
control_info[i] = uci.get(cfgname, 'routing', i);
- control_info.wan_direct_ipv4_ips = json(trim(yqRead('-oj', '.IPCIDR', resources_dir + '/direct_list.yaml')) || '[]');
- control_info.wan_direct_ipv6_ips = json(trim(yqRead('-oj', '.IPCIDR6', resources_dir + '/direct_list.yaml')) || '[]');
- control_info.wan_proxy_ipv4_ips = json(trim(yqRead('-oj', '.IPCIDR', resources_dir + '/proxy_list.yaml')) || '[]');
- control_info.wan_proxy_ipv6_ips = json(trim(yqRead('-oj', '.IPCIDR6', resources_dir + '/proxy_list.yaml')) || '[]');
+ control_info.wan_direct_ipv4_ips = json(trim(yqReadFile('-oj', '.IPCIDR', resources_dir + '/direct_list.yaml')) || '[]');
+ control_info.wan_direct_ipv6_ips = json(trim(yqReadFile('-oj', '.IPCIDR6', resources_dir + '/direct_list.yaml')) || '[]');
+ control_info.wan_proxy_ipv4_ips = json(trim(yqReadFile('-oj', '.IPCIDR', resources_dir + '/proxy_list.yaml')) || '[]');
+ control_info.wan_proxy_ipv6_ips = json(trim(yqReadFile('-oj', '.IPCIDR6', resources_dir + '/proxy_list.yaml')) || '[]');
/* UCI config end */
-%}
diff --git a/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc b/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc
index 42a2a86fe..8a9045503 100644
--- a/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc
+++ b/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc
@@ -666,9 +666,12 @@ uci.foreach(uciconf, ucipgrp, (cfg) => {
lazy: (cfg.lazy === '0') ? false : null,
"expected-status": cfg.url ? cfg.expected_status || '204' : null,
"max-failed-times": cfg.url ? strToInt(cfg.max_failed_times) ?? 5 : null,
+ // General fields
filter: parse_filter(cfg.filter),
"exclude-filter": parse_filter(cfg.exclude_filter),
- "exclude-type": parse_filter(cfg.exclude_type)
+ "exclude-type": parse_filter(cfg.exclude_type),
+ hidden: strToBool(cfg.hidden),
+ icon: cfg.icon
});
});
/* Proxy Group END */
diff --git a/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo b/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo
index 4c07bb7d4..903c934e4 100644
--- a/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo
+++ b/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo
@@ -4,17 +4,9 @@
import { access, lsdir, lstat, popen, readfile, writefile } from 'fs';
import {
- shellQuote, yqRead,
+ shellQuote, isBinary, yqReadFile,
HM_DIR, EXE_DIR, SDL_DIR, RUN_DIR
-} from '/usr/share/fchomo/fchomo.uc';
-
-function isBinary(str) {
- for (let off = 0, byte = ord(str); off < length(str); byte = ord(str, ++off))
- if (byte <= 8 || (byte >= 14 && byte <= 31))
- return true;
-
- return false;
-}
+} from 'fchomo';
function hasKernelModule(kmod) {
return (system(sprintf('[ -e "/lib/modules/$(uname -r)"/%s ]', shellQuote(kmod))) === 0);
@@ -100,20 +92,15 @@ const methods = {
fd.close();
}
- const fp = popen(`${use_apk ? 'apk list -I' : 'opkg list-installed'} luci-app-fchomo | ` +
- `awk '{print $${use_apk ? '1' : 'NF'}}'`);
- if (fp) {
- features.luciapp_version = trim(fp.read('line')) || null;
+ features.app_version = trim(popen(`${use_apk ? 'apk list -I' : 'opkg list-installed'} luci-app-fchomo | ` +
+ `awk '{print $${use_apk ? '1' : 'NF'}}'`).read('all')) || null;
- fp.close();
- }
-
- features.hm_has_dnsmasq_full = system(`[ -n "$(${use_apk ? 'apk list -qI' : 'opkg list-installed'} dnsmasq-full)" ]`) == 0 || null;
- features.hm_has_ip_full = access('/usr/libexec/ip-full');
- features.hm_has_stunclient = access('/usr/bin/stunclient');
- features.hm_has_tcp_brutal = hasKernelModule('brutal.ko');
- features.hm_has_tproxy = hasKernelModule('nft_tproxy.ko') || access('/etc/modules.d/nft-tproxy');
- features.hm_has_tun = hasKernelModule('tun.ko') || access('/etc/modules.d/30-tun');
+ features.has_dnsmasq_full = system(`[ -n "$(${use_apk ? 'apk list -qI' : 'opkg list-installed'} dnsmasq-full)" ]`) == 0 || null;
+ features.has_ip_full = access('/usr/libexec/ip-full');
+ features.has_stunclient = access('/usr/bin/stunclient');
+ features.has_tcp_brutal = hasKernelModule('brutal.ko');
+ features.has_tproxy = hasKernelModule('nft_tproxy.ko') || access('/etc/modules.d/nft-tproxy');
+ features.has_tun = hasKernelModule('tun.ko') || access('/etc/modules.d/30-tun');
return features;
}
@@ -125,7 +112,7 @@ const methods = {
if (req.args?.instance) {
const instance = req.args?.instance;
- let config = json(trim(yqRead('-oj', '.[] |= with(select(type == "!!map"); del(.)) |= with(select(type == "!!seq"); del(.))', `${RUN_DIR}/${instance}.yaml`)) || '{}');
+ let config = json(trim(yqReadFile('-oj', '.[] |= with(select(type == "!!map"); del(.)) |= with(select(type == "!!seq"); del(.))', `${RUN_DIR}/${instance}.yaml`)) || '{}');
return {
http: config['external-controller'],
@@ -144,13 +131,7 @@ const methods = {
if (!req.args?.url)
return { httpcode: null, error: 'illegal url' };
- let httpcode = '-1';
- const fd = popen("wget --spider -t1 -ST3 '" + req.args?.url + "' 2>&1 | awk '/^\\s*HTTP\\//{print $2}'");
- if (fd) {
- httpcode = trim(fd.read('line')) || httpcode;
-
- fd.close();
- }
+ const httpcode = trim(popen(`wget --spider -t1 -ST3 '${req.args?.url}' 2>&1 | awk '/^\\s*HTTP\\//{print $2}'`).read('all')) || '-1';
return { httpcode: httpcode };
}
diff --git a/luci-app-fchomo/root/usr/share/fchomo/fchomo.uc b/luci-app-fchomo/root/usr/share/ucode/fchomo.uc
similarity index 77%
rename from luci-app-fchomo/root/usr/share/fchomo/fchomo.uc
rename to luci-app-fchomo/root/usr/share/ucode/fchomo.uc
index 58cd1c373..9f7eb0d70 100644
--- a/luci-app-fchomo/root/usr/share/fchomo/fchomo.uc
+++ b/luci-app-fchomo/root/usr/share/ucode/fchomo.uc
@@ -27,16 +27,44 @@ export function shellQuote(s) {
return `'${replace(s, "'", "'\\''")}'`;
};
-export function yqRead(flags, command, filepath) {
- let out = '';
+export function isBinary(str) {
+ for (let off = 0, byte = ord(str); off < length(str); byte = ord(str, ++off))
+ if (byte <= 8 || (byte >= 14 && byte <= 31))
+ return true;
- const fd = popen(`yq ${flags} ${shellQuote(command)} ${filepath}`);
- if (fd) {
- out = fd.read('all');
- fd.close();
- }
+ return false;
+};
- return out;
+export function executeCommand(...args) {
+ let outfd = mkstemp();
+ let errfd = mkstemp();
+
+ const exitcode = system(`${join(' ', args)} >&${outfd.fileno()} 2>&${errfd.fileno()}`);
+
+ outfd.seek();
+ errfd.seek();
+
+ const stdout = outfd.read(1024 * 1024) ?? '';
+ const stderr = errfd.read(1024 * 1024) ?? '';
+
+ outfd.close();
+ errfd.close();
+
+ const binary = isBinary(stdout);
+
+ return {
+ command: join(' ', args),
+ stdout: binary ? null : stdout,
+ stderr,
+ exitcode,
+ binary
+ };
+};
+
+export function yqReadFile(flags, command, filepath) {
+ const out = executeCommand('yq', flags, shellQuote(command), filepath);
+
+ return out.stdout;
};
/* Utilities end */
diff --git a/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js b/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js
index eb04d8cf9..f7d5e4756 100644
--- a/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js
+++ b/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js
@@ -103,11 +103,7 @@ return view.extend({
o.rmempty = false;
o = s.option(form.Value, 'favicon_path', _('Favicon path'));
- o.datatype = 'file';
- o.placeholder = '/etc/tinyfilemanager/favicon.png';
- o.optional = true;
- o.rmempty = false;
- o.retain = true;
+ o.placeholder = '/tinyfilemanager/rootfs/etc/tinyfilemanager/favicon.png';
o = s.option(form.DynamicList, 'exclude_items', _('Exclude Files/Folders'));
o.datatype = "list(string)";
diff --git a/luci-app-tinyfilemanager/root/etc/config/tinyfilemanager b/luci-app-tinyfilemanager/root/etc/config/tinyfilemanager
index 1e0fc4418..fe15fad06 100644
--- a/luci-app-tinyfilemanager/root/etc/config/tinyfilemanager
+++ b/luci-app-tinyfilemanager/root/etc/config/tinyfilemanager
@@ -7,6 +7,6 @@ config main
option date_format 'd.m.o'
option time_format 'H:i:s'
option show_second '0'
- option favicon_path '/etc/tinyfilemanager/favicon.png'
+ option favicon_path '/tinyfilemanager/rootfs/etc/tinyfilemanager/favicon.png'
option online_viewer '0'
diff --git a/luci-app-tinyfilemanager/root/etc/init.d/tinyfilemanager b/luci-app-tinyfilemanager/root/etc/init.d/tinyfilemanager
index a95128e5f..1f6a615c7 100755
--- a/luci-app-tinyfilemanager/root/etc/init.d/tinyfilemanager
+++ b/luci-app-tinyfilemanager/root/etc/init.d/tinyfilemanager
@@ -37,7 +37,7 @@ validate_section() {
'date_format:or("d.m.o", "d-m-o", "d/m/o", "j.n.o", "j-n-o", "j/n/o", "o.m.d", "o-m-d", "o/m/d", "o.n.j", "o-n-j", "o/n/j"):d.m.o' \
'time_format:or("H\:i\:s", "G\:i\:s", "A h\:i\:s", "A g\:i\:s", "h\:i\:s A", "g\:i\:s A"):H\:i\:s' \
'show_second:bool:0' \
- 'favicon_path:file' \
+ 'favicon_path:string' \
'exclude_items:list(string)' \
'online_viewer:or("0", "google", "microsoft"):0' \
'max_upload_size:and(uinteger,max(2048))'
diff --git a/oaf/Makefile b/oaf/Makefile
index 8abafb7f6..fe63c560e 100755
--- a/oaf/Makefile
+++ b/oaf/Makefile
@@ -23,7 +23,7 @@ define KernelPackage/oaf/description
endef
-EXTRA_CFLAGS:=-Wno-declaration-after-statement -Wno-strict-prototypes -Wno-unused-variable -Wno-implicit-fallthrough -Wno-missing-braces -Wno-parentheses -Wno-format
+EXTRA_CFLAGS:=-Wno-declaration-after-statement -Wno-strict-prototypes -Wno-unused-variable -Wno-implicit-fallthrough -Wno-missing-braces -Wno-parentheses -Wno-format -Wno-missing-prototypes -Wno-missing-declarations
diff --git a/oaf/src/af_log.c b/oaf/src/af_log.c
index e2f7eb9a3..941677410 100755
--- a/oaf/src/af_log.c
+++ b/oaf/src/af_log.c
@@ -115,13 +115,16 @@ static struct ctl_table oaf_table[] = {
.mode = 0666,
.proc_handler = proc_douintvec,
},
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 12, 0))
{
}
+#endif
};
+#define OAF_SYS_PROC_DIR "oaf"
static struct ctl_table oaf_root_table[] = {
{
- .procname = "oaf",
+ .procname = OAF_SYS_PROC_DIR,
.mode = 0555,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0))
.child = oaf_table,
@@ -137,7 +140,7 @@ static int af_init_log_sysctl(void)
#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0))
oaf_table_header = register_sysctl_table(oaf_root_table);
#else
- oaf_table_header = register_sysctl(oaf_root_table->procname, oaf_table);
+ oaf_table_header = register_sysctl(OAF_SYS_PROC_DIR, oaf_table);
#endif
if (oaf_table_header == NULL){
printk("init log sysctl...failed\n");
diff --git a/xray-core/Makefile b/xray-core/Makefile
index a32fe9133..f6b0a94f6 100644
--- a/xray-core/Makefile
+++ b/xray-core/Makefile
@@ -1,12 +1,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=xray-core
-PKG_VERSION:=25.2.21
+PKG_VERSION:=25.3.6
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/XTLS/Xray-core/tar.gz/v$(PKG_VERSION)?
-PKG_HASH:=a565db518d2da12fabb74e123d9bf2bdbc34420b81373938f8fcbc7004fda3ba
+PKG_HASH:=d62305348deff713767fe1b3c23538e3f8bfe0c96d092f1f95f48c17bc2f5943
PKG_MAINTAINER:=Tianling Shen
PKG_LICENSE:=MPL-2.0