diff --git a/luci-app-mihomo/Makefile b/luci-app-mihomo/Makefile
index 04db9128a..f4a93255d 100644
--- a/luci-app-mihomo/Makefile
+++ b/luci-app-mihomo/Makefile
@@ -1,6 +1,6 @@
include $(TOPDIR)/rules.mk
-PKG_VERSION:=1.13.3
+PKG_VERSION:=1.14.0
LUCI_TITLE:=LuCI Support for mihomo
LUCI_DEPENDS:=+luci-base +mihomo
diff --git a/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js
new file mode 100644
index 000000000..59b2683f3
--- /dev/null
+++ b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js
@@ -0,0 +1,148 @@
+'use strict';
+'require form';
+'require view';
+'require uci';
+'require poll';
+'require tools.mihomo as mihomo';
+
+function renderStatus(running) {
+ return updateStatus(E('input', { id: 'core_status', style: 'border: unset; font-style: italic; font-weight: bold;', readonly: '' }), running);
+}
+
+function updateStatus(element, running) {
+ if (element) {
+ element.style.color = running ? 'green' : 'red';
+ element.value = running ? _('Running') : _('Not Running');
+ }
+ return element;
+}
+
+return view.extend({
+ load: function () {
+ return Promise.all([
+ uci.load('mihomo'),
+ mihomo.appVersion(),
+ mihomo.coreVersion(),
+ mihomo.status(),
+ mihomo.listProfiles()
+ ]);
+ },
+ render: function (data) {
+ const subscriptions = uci.sections('mihomo', 'subscription');
+ const appVersion = data[1];
+ const coreVersion = data[2];
+ const running = data[3];
+ const profiles = data[4];
+
+ let m, s, o;
+
+ m = new form.Map('mihomo', _('MihomoTProxy'), `${_('Transparent Proxy with Mihomo on OpenWrt.')} ${_('How To Use')}`);
+
+ s = m.section(form.NamedSection, 'status', 'status', _('Status'));
+
+ o = s.option(form.Value, '_app_version', _('App Version'));
+ o.readonly = true;
+ o.load = function () {
+ return appVersion.trim();
+ };
+ o.write = function () { };
+
+ o = s.option(form.Value, '_core_version', _('Core Version'));
+ o.readonly = true;
+ o.load = function () {
+ return coreVersion.trim();
+ };
+ o.write = function () { };
+
+ o = s.option(form.DummyValue, '_core_status', _('Core Status'));
+ o.cfgvalue = function () {
+ return renderStatus(running);
+ };
+ poll.add(function () {
+ return L.resolveDefault(mihomo.status()).then(function (running) {
+ updateStatus(document.getElementById('core_status'), running);
+ });
+ });
+
+ o = s.option(form.Button, 'reload', '-');
+ o.inputstyle = 'action';
+ o.inputtitle = _('Reload Service');
+ o.onclick = function () {
+ return mihomo.reload();
+ };
+
+ o = s.option(form.Button, 'restart', '-');
+ o.inputstyle = 'negative';
+ o.inputtitle = _('Restart Service');
+ o.onclick = function () {
+ return mihomo.restart();
+ };
+
+ o = s.option(form.Button, 'update_dashboard', '-');
+ o.inputstyle = 'positive';
+ o.inputtitle = _('Update Dashboard');
+ o.onclick = function () {
+ return mihomo.callMihomoAPI('POST', '/upgrade/ui');
+ };
+
+ o = s.option(form.Button, 'open_dashboard', '-');
+ o.inputtitle = _('Open Dashboard');
+ o.onclick = function () {
+ return mihomo.openDashboard();
+ };
+
+ s = m.section(form.NamedSection, 'config', 'config', _('App Config'));
+
+ o = s.option(form.Flag, 'enabled', _('Enable'));
+ o.rmempty = false;
+
+ o = s.option(form.ListValue, 'profile', _('Choose Profile'));
+ o.optional = true;
+
+ for (const profile of profiles) {
+ o.value('file:' + profile.name, _('File:') + profile.name);
+ };
+
+ for (const subscription of subscriptions) {
+ o.value('subscription:' + subscription['.name'], _('Subscription:') + subscription.name);
+ };
+
+ o = s.option(form.Value, 'start_delay', _('Start Delay'));
+ o.datatype = 'uinteger';
+ o.placeholder = '0';
+
+ o = s.option(form.Flag, 'scheduled_restart', _('Scheduled Restart'));
+ o.rmempty = false;
+
+ o = s.option(form.Value, 'cron_expression', _('Cron Expression'));
+ o.retain = true;
+ o.rmempty = false;
+ o.depends('scheduled_restart', '1');
+
+ o = s.option(form.Flag, 'test_profile', _('Test Profile'));
+ o.rmempty = false;
+
+ o = s.option(form.Flag, 'fast_reload', _('Fast Reload'));
+ o.rmempty = false;
+
+ s = m.section(form.NamedSection, 'config', 'config', _('Core Environment Variable Config'));
+
+ o = s.option(form.Flag, 'disable_safe_path_check', _('Disable Safe Path Check'));
+ o.ucisection = 'env';
+ o.rmempty = false;
+
+ o = s.option(form.Flag, 'disable_loopback_detector', _('Disable Loopback Detector'));
+ o.ucisection = 'env';
+ o.rmempty = false;
+
+ o = s.option(form.Flag, 'disable_quic_go_gso', _('Disable GSO of quic-go'));
+ o.ucisection = 'env';
+ o.rmempty = false;
+
+ o = s.option(form.Flag, 'disable_quic_go_ecn', _('Disable ECN of quic-go'));
+ o.ucisection = 'env';
+ o.rmempty = false;
+
+ return m.render();
+ }
+});
diff --git a/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js
deleted file mode 100644
index 58b849326..000000000
--- a/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js
+++ /dev/null
@@ -1,617 +0,0 @@
-'use strict';
-'require form';
-'require view';
-'require uci';
-'require fs';
-'require network';
-'require rpc';
-'require poll';
-'require tools.widgets as widgets';
-'require tools.mihomo as mihomo';
-
-function renderStatus(running) {
- return updateStatus(E('input', { id: 'core_status', style: 'border: unset; font-style: italic; font-weight: bold;', readonly: '' }), running);
-}
-
-function updateStatus(element, running) {
- if (element) {
- element.style.color = running ? 'green' : 'red';
- element.value = running ? _('Running') : _('Not Running');
- }
- return element;
-}
-
-return view.extend({
- load: function () {
- return Promise.all([
- uci.load('mihomo'),
- mihomo.listProfiles(),
- mihomo.appVersion(),
- mihomo.coreVersion(),
- mihomo.status(),
- mihomo.getUsers(),
- mihomo.getGroups(),
- network.getHostHints(),
- ]);
- },
- render: function (data) {
- const subscriptions = uci.sections('mihomo', 'subscription');
- const profiles = data[1];
- const appVersion = data[2];
- const coreVersion = data[3];
- const running = data[4];
- const users = data[5];
- const groups = data[6];
- const hosts = data[7].hosts;
-
- let m, s, o, so;
-
- m = new form.Map('mihomo', _('MihomoTProxy'), `${_('Transparent Proxy with Mihomo on OpenWrt.')} ${_('How To Use')}`);
-
- s = m.section(form.NamedSection, 'status', 'status', _('Status'));
-
- o = s.option(form.Value, '_app_version', _('App Version'));
- o.readonly = true;
- o.load = function () {
- return appVersion.trim();
- };
- o.write = function () { };
-
- o = s.option(form.Value, '_core_version', _('Core Version'));
- o.readonly = true;
- o.load = function () {
- return coreVersion.trim();
- };
- o.write = function () { };
-
- o = s.option(form.DummyValue, '_core_status', _('Core Status'));
- o.cfgvalue = function () {
- return renderStatus(running);
- };
- poll.add(function () {
- return L.resolveDefault(mihomo.status()).then(function (running) {
- updateStatus(document.getElementById('core_status'), running);
- });
- });
-
- o = s.option(form.Button, 'reload', '-');
- o.inputstyle = 'action';
- o.inputtitle = _('Reload Service');
- o.onclick = function () {
- return mihomo.reload();
- };
-
- o = s.option(form.Button, 'restart', '-');
- o.inputstyle = 'negative';
- o.inputtitle = _('Restart Service');
- o.onclick = function () {
- return mihomo.restart();
- };
-
- o = s.option(form.Button, 'update_dashboard', '-');
- o.inputstyle = 'positive';
- o.inputtitle = _('Update Dashboard');
- o.onclick = function () {
- return mihomo.callMihomoAPI('POST', '/upgrade/ui');
- };
-
- o = s.option(form.Button, 'open_dashboard', '-');
- o.inputtitle = _('Open Dashboard');
- o.onclick = function () {
- return mihomo.openDashboard();
- };
-
- s = m.section(form.NamedSection, 'config', 'config', _('Basic Config'));
-
- s.tab('app', _('App Config'));
-
- o = s.taboption('app', form.Flag, 'enabled', _('Enable'));
- o.rmempty = false;
-
- o = s.taboption('app', form.ListValue, 'profile', _('Choose Profile'));
- o.optional = true;
-
- for (const profile of profiles) {
- o.value('file:' + profile.name, _('File:') + profile.name);
- };
-
- for (const subscription of subscriptions) {
- o.value('subscription:' + subscription['.name'], _('Subscription:') + subscription.name);
- };
-
- o = s.taboption('app', form.FileUpload, 'upload_profile', _('Upload Profile'));
- o.root_directory = mihomo.profilesDir;
-
- o = s.taboption('app', form.Flag, 'mixin', _('Mixin'));
- o.rmempty = false;
-
- s.tab('startup', _('Startup Config'));
-
- o = s.taboption('startup', form.Value, 'start_delay', _('Start Delay'));
- o.datatype = 'uinteger';
- o.placeholder = '0';
-
- o = s.taboption('startup', form.Flag, 'scheduled_restart', _('Scheduled Restart'));
- o.rmempty = false;
-
- o = s.taboption('startup', form.Value, 'cron_expression', _('Cron Expression'));
- o.retain = true;
- o.rmempty = false;
- o.depends('scheduled_restart', '1');
-
- o = s.taboption('startup', form.Flag, 'test_profile', _('Test Profile'));
- o.rmempty = false;
-
- o = s.taboption('startup', form.Flag, 'fast_reload', _('Fast Reload'));
- o.rmempty = false;
-
- s.tab('core_env', _('Core Environment Variable Config'));
-
- o = s.taboption('core_env', form.Flag, 'disable_safe_path_check', _('Disable Safe Path Check'));
- o.ucisection = 'env';
- o.rmempty = false;
-
- o = s.taboption('core_env', form.Flag, 'disable_loopback_detector', _('Disable Loopback Detector'));
- o.ucisection = 'env';
- o.rmempty = false;
-
- o = s.taboption('core_env', form.Flag, 'disable_quic_go_gso', _('Disable GSO of quic-go'));
- o.ucisection = 'env';
- o.rmempty = false;
-
- o = s.taboption('core_env', form.Flag, 'disable_quic_go_ecn', _('Disable ECN of quic-go'));
- o.ucisection = 'env';
- o.rmempty = false;
-
- s = m.section(form.NamedSection, 'proxy', 'proxy', _('Proxy Config'));
-
- s.tab('transparent_proxy', _('Transparent Proxy'));
-
- o = s.taboption('transparent_proxy', form.Flag, 'transparent_proxy', _('Enable'));
- o.rmempty = false;
-
- o = s.taboption('transparent_proxy', form.ListValue, 'tcp_transparent_proxy_mode', _('TCP Proxy Mode'));
- o.value('redirect', _('Redirect Mode'));
- o.value('tproxy', _('TPROXY Mode'));
- o.value('tun', _('TUN Mode'));
-
- o = s.taboption('transparent_proxy', form.ListValue, 'udp_transparent_proxy_mode', _('UDP Proxy Mode'));
- o.value('tproxy', _('TPROXY Mode'));
- o.value('tun', _('TUN Mode'));
-
- o = s.taboption('transparent_proxy', form.Flag, 'ipv4_dns_hijack', _('IPv4 DNS Hijack'));
- o.rmempty = false;
-
- o = s.taboption('transparent_proxy', form.Flag, 'ipv6_dns_hijack', _('IPv6 DNS Hijack'));
- o.rmempty = false;
-
- o = s.taboption('transparent_proxy', form.Flag, 'ipv4_proxy', _('IPv4 Proxy'));
- o.rmempty = false;
-
- o = s.taboption('transparent_proxy', form.Flag, 'ipv6_proxy', _('IPv6 Proxy'));
- o.rmempty = false;
-
- o = s.taboption('transparent_proxy', form.Flag, 'router_proxy', _('Router Proxy'));
- o.rmempty = false;
-
- o = s.taboption('transparent_proxy', form.Flag, 'lan_proxy', _('Lan Proxy'));
- o.rmempty = false;
-
- s.tab('access_control', _('Access Control'));
-
- o = s.taboption('access_control', form.ListValue, 'access_control_mode', _('Mode'));
- o.value('all', _('All Mode'));
- o.value('allow', _('Allow Mode'));
- o.value('block', _('Block Mode'));
-
- o = s.taboption('access_control', form.DynamicList, 'acl_ip', 'IP');
- o.datatype = 'ipmask4';
- o.retain = true;
- o.depends('access_control_mode', 'allow');
- o.depends('access_control_mode', 'block');
-
- for (const mac in hosts) {
- const host = hosts[mac];
- for (const ip of host.ipaddrs) {
- const hint = host.name || mac;
- o.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
- };
- };
-
- o = s.taboption('access_control', form.DynamicList, 'acl_ip6', 'IP6');
- o.datatype = 'ipmask6';
- o.retain = true;
- o.depends('access_control_mode', 'allow');
- o.depends('access_control_mode', 'block');
-
- for (const mac in hosts) {
- const host = hosts[mac];
- for (const ip of host.ip6addrs) {
- const hint = host.name || mac;
- o.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
- };
- };
-
- o = s.taboption('access_control', form.DynamicList, 'acl_mac', 'MAC');
- o.datatype = 'macaddr';
- o.retain = true;
- o.depends('access_control_mode', 'allow');
- o.depends('access_control_mode', 'block');
-
- for (const mac in hosts) {
- const host = hosts[mac];
- const hint = host.name || host.ipaddrs[0];
- o.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac);
- };
-
- o = s.taboption('access_control', widgets.NetworkSelect, 'acl_interface', _('Interface'));
- o.multiple = true;
- o.optional = true;
- o.retain = true;
- o.depends('access_control_mode', 'allow');
- o.depends('access_control_mode', 'block');
-
- s.tab('bypass', _('Bypass'));
-
- o = s.taboption('bypass', form.MultiValue, 'bypass_user', _('Bypass User'));
- o.create = true;
-
- for (const user of users) {
- o.value(user);
- };
-
- o = s.taboption('bypass', form.MultiValue, 'bypass_group', _('Bypass Group'));
- o.create = true;
-
- for (const group of groups) {
- o.value(group);
- };
-
- o = s.taboption('bypass', form.Flag, 'bypass_china_mainland_ip', _('Bypass China Mainland IP'));
- o.rmempty = false;
-
- o = s.taboption('bypass', form.Value, 'proxy_tcp_dport', _('Destination TCP Port to Proxy'));
- o.rmempty = false;
- o.value('0-65535', _('All Port'));
- o.value('21 22 80 110 143 194 443 465 853 993 995 8080 8443', _('Commonly Used Port'));
-
- o = s.taboption('bypass', form.Value, 'proxy_udp_dport', _('Destination UDP Port to Proxy'));
- o.rmempty = false;
- o.value('0-65535', _('All Port'));
- o.value('123 443 8443', _('Commonly Used Port'));
-
- s = m.section(form.GridSection, 'subscription', _('Subscription Config'));
- s.addremove = true;
- s.anonymous = true;
- s.sortable = true;
- s.modaltitle = _('Edit Subscription');
-
- o = s.option(form.Value, 'name', _('Subscription Name'));
- o.rmempty = false;
-
- o = s.option(form.Value, 'used', _('Used'));
- o.modalonly = false;
- o.optional = true;
- o.readonly = true;
-
- o = s.option(form.Value, 'total', _('Total'));
- o.modalonly = false;
- o.optional = true;
- o.readonly = true;
-
- o = s.option(form.Value, 'expire', _('Expire At'));
- o.modalonly = false;
- o.optional = true;
- o.readonly = true;
-
- o = s.option(form.Value, 'update', _('Update At'));
- o.modalonly = false;
- o.optional = true;
- o.readonly = true;
-
- o = s.option(form.Button, 'update_subscription');
- o.editable = true;
- o.inputstyle = 'positive';
- o.inputtitle = _('Update');
- o.modalonly = false;
- o.onclick = function (_, section_id) {
- return mihomo.updateSubscription(section_id);
- };
-
- o = s.option(form.Value, 'url', _('Subscription Url'));
- o.modalonly = true;
- o.rmempty = false;
-
- o = s.option(form.Value, 'user_agent', _('User Agent'));
- o.default = 'clash';
- o.modalonly = true;
- o.rmempty = false;
- o.value('mihomo');
- o.value('clash.meta');
- o.value('clash');
-
- o = s.option(form.ListValue, 'prefer', _('Prefer'));
- o.default = 'remote';
- o.modalonly = true;
- o.value('remote', _('Remote'));
- o.value('local', _('Local'));
-
- s = m.section(form.NamedSection, 'mixin', 'mixin', _('Mixin Config'));
-
- s.tab('general', _('General Config'));
-
- o = s.taboption('general', form.ListValue, 'log_level', '*' + ' ' + _('Log Level'));
- o.value('silent');
- o.value('error');
- o.value('warning');
- o.value('info');
- o.value('debug');
-
- o = s.taboption('general', form.ListValue, 'mode', _('Mode'));
- o.value('global', _('Global Mode'));
- o.value('rule', _('Rule Mode'));
- o.value('direct', _('Direct Mode'));
-
- o = s.taboption('general', form.ListValue, 'match_process', _('Match Process'));
- o.value('strict', _('Auto'));
- o.value('always', _('Enable'));
- o.value('off', _('Disable'));
-
- o = s.taboption('general', widgets.NetworkSelect, 'outbound_interface', '*' + ' ' + _('Outbound Interface'));
- o.optional = true;
-
- o = s.taboption('general', form.Flag, 'ipv6', '*' + ' ' + _('IPv6'));
- o.rmempty = false;
-
- o = s.taboption('general', form.Value, 'tcp_keep_alive_idle', _('TCP Keep Alive Idle'));
- o.datatype = 'uinteger';
- o.placeholder = '600';
-
- o = s.taboption('general', form.Value, 'tcp_keep_alive_interval', _('TCP Keep Alive Interval'));
- o.datatype = 'uinteger';
- o.placeholder = '15';
-
- s.tab('external_control', _('External Control Config'));
-
- o = s.taboption('external_control', form.Value, 'ui_name', '*' + ' ' + _('UI Name'));
- o.rmempty = false;
-
- o = s.taboption('external_control', form.Value, 'ui_url', '*' + ' ' + _('UI Url'));
- o.rmempty = false;
- o.value('https://ghp.ci/https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip', 'MetaCubeXD');
- o.value('https://ghp.ci/https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip', 'YACD');
- o.value('https://ghp.ci/https://github.com/MetaCubeX/Razord-meta/archive/refs/heads/gh-pages.zip', 'Razord');
- o.value('https://ghp.ci/https://github.com/Zephyruso/zashboard/archive/refs/heads/gh-pages.zip', 'Zashboard');
-
- o = s.taboption('external_control', form.Value, 'api_port', '*' + ' ' + _('API Port'));
- o.datatype = 'port';
- o.placeholder = '9090';
-
- o = s.taboption('external_control', form.Value, 'api_secret', '*' + ' ' + _('API Secret'));
- o.password = true;
- o.rmempty = false;
-
- o = s.taboption('external_control', form.Flag, 'selection_cache', _('Save Proxy Selection'));
- o.rmempty = false;
-
- s.tab('inbound', _('Inbound Config'));
-
- o = s.taboption('inbound', form.Flag, 'allow_lan', '*' + ' ' + _('Allow Lan'));
- o.rmempty = false;
-
- o = s.taboption('inbound', form.Value, 'http_port', '*' + ' ' + _('HTTP Port'));
- o.datatype = 'port';
- o.placeholder = '8080';
-
- o = s.taboption('inbound', form.Value, 'socks_port', '*' + ' ' + _('SOCKS Port'));
- o.datatype = 'port';
- o.placeholder = '1080';
-
- o = s.taboption('inbound', form.Value, 'mixed_port', '*' + ' ' + _('Mixed Port'));
- o.datatype = 'port';
- o.placeholder = '7890';
-
- o = s.taboption('inbound', form.Value, 'redir_port', '*' + ' ' + _('Redirect Port'));
- o.datatype = 'port';
- o.placeholder = '7891';
-
- o = s.taboption('inbound', form.Value, 'tproxy_port', '*' + ' ' + _('TPROXY Port'));
- o.datatype = 'port';
- o.placeholder = '7892';
-
- o = s.taboption('inbound', form.Flag, 'authentication', '*' + ' ' + _('Overwrite Authentication'));
- o.rmempty = false;
-
- o = s.taboption('inbound', form.SectionValue, '_authentications', form.TableSection, 'authentication', _('Edit Authentications'));
- o.retain = true;
- o.depends('authentication', '1');
-
- o.subsection.addremove = true;
- o.subsection.anonymous = true;
- o.subsection.sortable = true;
-
- so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
- so.rmempty = false;
-
- so = o.subsection.option(form.Value, 'username', _('Username'));
- so.rmempty = false;
-
- so = o.subsection.option(form.Value, 'password', _('Password'));
- so.password = true;
- so.rmempty = false;
-
- s.tab('tun', _('TUN Config'));
-
- o = s.taboption('tun', form.ListValue, 'tun_stack', '*' + ' ' + _('Stack'));
- o.value('system', 'System');
- o.value('gvisor', 'gVisor');
- o.value('mixed', 'Mixed');
-
- o = s.taboption('tun', form.Value, 'tun_mtu', '*' + ' ' + _('MTU'));
- o.datatype = 'uinteger';
- o.placeholder = '9000';
-
- o = s.taboption('tun', form.Flag, 'tun_gso', '*' + ' ' + _('GSO'));
- o.rmempty = false;
-
- o = s.taboption('tun', form.Value, 'tun_gso_max_size', '*' + ' ' + _('GSO Max Size'));
- o.datatype = 'uinteger';
- o.placeholder = '65536';
- o.retain = true;
- o.depends('tun_gso', '1');
-
- o = s.taboption('tun', form.Flag, 'tun_endpoint_independent_nat', '*' + ' ' + _('Endpoint Independent NAT'));
- o.rmempty = false;
-
- s.tab('dns', _('DNS Config'));
-
- o = s.taboption('dns', form.Value, 'dns_port', '*' + ' ' + _('DNS Port'));
- o.datatype = 'port';
- o.placeholder = '1053';
-
- o = s.taboption('dns', form.ListValue, 'dns_mode', '*' + ' ' + _('DNS Mode'));
- o.value('normal', 'Normal');
- o.value('fake-ip', 'Fake-IP');
- o.value('redir-host', 'Redir-Host');
-
- o = s.taboption('dns', form.Value, 'fake_ip_range', '*' + ' ' + _('Fake-IP Range'));
- o.datatype = 'cidr4';
- o.placeholder = '198.18.0.1/16';
- o.retain = true;
- o.depends('dns_mode', 'fake-ip');
-
- o = s.taboption('dns', form.Flag, 'fake_ip_filter', _('Overwrite Fake-IP Filter'));
- o.retain = true;
- o.rmempty = false;
- o.depends('dns_mode', 'fake-ip');
-
- o = s.taboption('dns', form.DynamicList, 'fake_ip_filters', _('Edit Fake-IP Filters'));
- o.retain = true;
- o.depends({ 'dns_mode': 'fake-ip', 'fake_ip_filter': '1' });
-
- o = s.taboption('dns', form.ListValue, 'fake_ip_filter_mode', _('Fake-IP Filter Mode'));
- o.retain = true;
- o.value('blacklist', _('Block Mode'));
- o.value('whitelist', _('Allow Mode'));
- o.depends({ 'dns_mode': 'fake-ip', 'fake_ip_filter': '1' });
-
- o = s.taboption('dns', form.Flag, 'fake_ip_cache', _('Fake-IP Cache'));
- o.retain = true;
- o.rmempty = false;
- o.depends('dns_mode', 'fake-ip');
-
- o = s.taboption('dns', form.Flag, 'dns_respect_rules', _('Respect Rules'));
- o.rmempty = false;
-
- o = s.taboption('dns', form.Flag, 'dns_doh_prefer_http3', _('DoH Prefer HTTP/3'));
- o.rmempty = false;
-
- o = s.taboption('dns', form.Flag, 'dns_ipv6', _('IPv6'));
- o.rmempty = false;
-
- o = s.taboption('dns', form.Flag, 'dns_system_hosts', _('Use System Hosts'));
- o.rmempty = false;
-
- o = s.taboption('dns', form.Flag, 'dns_hosts', _('Use Hosts'));
- o.rmempty = false;
-
- o = s.taboption('dns', form.Flag, 'hosts', _('Overwrite Hosts'));
- o.rmempty = false;
-
- o = s.taboption('dns', form.SectionValue, '_hosts', form.TableSection, 'host', _('Edit Hosts'));
- o.retain = true;
- o.depends('hosts', '1');
-
- o.subsection.addremove = true;
- o.subsection.anonymous = true;
- o.subsection.sortable = true;
-
- so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
- so.rmempty = false;
-
- so = o.subsection.option(form.Value, 'domain_name', _('Domain Name'));
- so.rmempty = false;
-
- so = o.subsection.option(form.DynamicList, 'ip', _('IP'));
-
- o = s.taboption('dns', form.Flag, 'dns_nameserver', _('Overwrite Nameserver'));
- o.rmempty = false;
-
- o = s.taboption('dns', form.SectionValue, '_dns_nameserver', form.TableSection, 'nameserver', _('Edit Nameservers'));
- o.retain = true;
- o.depends('dns_nameserver', '1');
-
- o.subsection.addremove = true;
- o.subsection.anonymous = true;
- o.subsection.sortable = true;
-
- so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
- so.rmempty = false;
-
- so = o.subsection.option(form.ListValue, 'type', _('Type'));
- so.value('default-nameserver');
- so.value('proxy-server-nameserver');
- so.value('direct-nameserver');
- so.value('nameserver');
- so.value('fallback');
-
- so = o.subsection.option(form.DynamicList, 'nameserver', _('Nameserver'));
-
- o = s.taboption('dns', form.Flag, 'dns_nameserver_policy', _('Overwrite Nameserver Policy'));
- o.rmempty = false;
-
- o = s.taboption('dns', form.SectionValue, '_dns_nameserver_policies', form.TableSection, 'nameserver_policy', _('Edit Nameserver Policies'));
- o.retain = true;
- o.depends('dns_nameserver_policy', '1');
-
- o.subsection.addremove = true;
- o.subsection.anonymous = true;
- o.subsection.sortable = true;
-
- so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
- so.rmempty = false;
-
- so = o.subsection.option(form.Value, 'matcher', _('Matcher'));
- so.rmempty = false;
-
- so = o.subsection.option(form.DynamicList, 'nameserver', _('Nameserver'));
-
- s.tab('geox', _('GeoX Config'));
-
- o = s.taboption('geox', form.ListValue, 'geoip_format', _('GeoIP Format'));
- o.value('dat', 'DAT');
- o.value('mmdb', 'MMDB');
-
- o = s.taboption('geox', form.ListValue, 'geodata_loader', _('GeoData Loader'));
- o.value('standard', _('Standard Loader'));
- o.value('memconservative', _('Memory Conservative Loader'));
-
- o = s.taboption('geox', form.Value, 'geosite_url', _('GeoSite Url'));
- o.rmempty = false;
-
- o = s.taboption('geox', form.Value, 'geoip_mmdb_url', _('GeoIP(MMDB) Url'));
- o.rmempty = false;
-
- o = s.taboption('geox', form.Value, 'geoip_dat_url', _('GeoIP(DAT) Url'));
- o.rmempty = false;
-
- o = s.taboption('geox', form.Value, 'geoip_asn_url', _('GeoIP(ASN) Url'));
- o.rmempty = false;
-
- o = s.taboption('geox', form.Flag, 'geox_auto_update', _('GeoX Auto Update'));
- o.rmempty = false;
-
- o = s.taboption('geox', form.Value, 'geox_update_interval', _('GeoX Update Interval'));
- o.datatype = 'uinteger';
- o.placeholder = '24';
- o.retain = true;
- o.depends('geox_auto_update', '1');
-
- s.tab('mixin_file_content', _('Mixin File Content'));
-
- o = s.taboption('mixin_file_content', form.Flag, 'mixin_file_content', '*' + ' ' + _('Enable'), _('Please go to the editor tab to edit the file for mixin'));
- o.rmempty = false;
-
- return m.render();
- }
-});
diff --git a/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js
index 9a21cf1d4..a94a9674c 100644
--- a/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js
+++ b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js
@@ -9,7 +9,7 @@ return view.extend({
load: function () {
return Promise.all([
uci.load('mihomo'),
- mihomo.listProfiles(),
+ mihomo.listProfiles()
]);
},
render: function (data) {
@@ -20,9 +20,9 @@ return view.extend({
m = new form.Map('mihomo');
- s = m.section(form.NamedSection, 'editor', 'editor');
+ s = m.section(form.NamedSection, 'editor', 'editor', _('Editor'));
- o = s.option(form.ListValue, '_profile', _('Choose Profile'));
+ o = s.option(form.ListValue, '_file', _('Choose File'));
o.optional = true;
for (const profile of profiles) {
@@ -43,19 +43,19 @@ return view.extend({
};
o.onchange = function (event, section_id, value) {
return L.resolveDefault(fs.read_direct(value), '').then(function (content) {
- m.lookupOption('mihomo.editor._profile_content')[0].getUIElement('editor').setValue(content);
+ m.lookupOption('mihomo.editor._file_content')[0].getUIElement('editor').setValue(content);
});
};
- o = s.option(form.TextValue, '_profile_content',);
+ o = s.option(form.TextValue, '_file_content',);
o.rows = 25;
o.wrap = false;
o.write = function (section_id, formvalue) {
- const path = m.lookupOption('mihomo.editor._profile')[0].formvalue('editor');
+ const path = m.lookupOption('mihomo.editor._file')[0].formvalue('editor');
return fs.write(path, formvalue);
};
o.remove = function (section_id) {
- const path = m.lookupOption('mihomo.editor._profile')[0].formvalue('editor');
+ const path = m.lookupOption('mihomo.editor._file')[0].formvalue('editor');
return fs.write(path);
};
diff --git a/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js
index 79a255c8a..bde0be6fa 100644
--- a/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js
+++ b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js
@@ -2,9 +2,8 @@
'require form';
'require view';
'require uci';
-'require fs';
'require poll';
-'require tools.mihomo as mihomo'
+'require tools.mihomo as mihomo';
return view.extend({
load: function () {
@@ -22,7 +21,7 @@ return view.extend({
m = new form.Map('mihomo');
- s = m.section(form.NamedSection, 'log', 'log');
+ s = m.section(form.NamedSection, 'log', 'log', _('Log'));
s.tab('app_log', _('App Log'));
@@ -95,4 +94,4 @@ return view.extend({
handleSaveApply: null,
handleSave: null,
handleReset: null
-});
+});
\ No newline at end of file
diff --git a/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js
new file mode 100644
index 000000000..660a59009
--- /dev/null
+++ b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js
@@ -0,0 +1,303 @@
+'use strict';
+'require form';
+'require view';
+'require uci';
+'require fs';
+'require poll';
+'require tools.widgets as widgets';
+'require tools.mihomo as mihomo';
+
+return view.extend({
+ load: function () {
+ return Promise.all([
+ uci.load('mihomo')
+ ]);
+ },
+ render: function (data) {
+ let m, s, o, so;
+
+ m = new form.Map('mihomo');
+
+ s = m.section(form.NamedSection, 'config', 'config', _('Mixin Config'));
+
+ o = s.option(form.Flag, 'mixin', _('Enable'));
+ o.rmempty = false;
+
+ s = m.section(form.NamedSection, 'mixin', 'mixin', _('Mixin Option'));
+
+ s.tab('general', _('General Config'));
+
+ o = s.taboption('general', form.ListValue, 'log_level', '*' + ' ' + _('Log Level'));
+ o.value('silent');
+ o.value('error');
+ o.value('warning');
+ o.value('info');
+ o.value('debug');
+
+ o = s.taboption('general', form.ListValue, 'mode', _('Mode'));
+ o.value('global', _('Global Mode'));
+ o.value('rule', _('Rule Mode'));
+ o.value('direct', _('Direct Mode'));
+
+ o = s.taboption('general', form.ListValue, 'match_process', _('Match Process'));
+ o.value('strict', _('Auto'));
+ o.value('always', _('Enable'));
+ o.value('off', _('Disable'));
+
+ o = s.taboption('general', widgets.NetworkSelect, 'outbound_interface', '*' + ' ' + _('Outbound Interface'));
+ o.optional = true;
+
+ o = s.taboption('general', form.Flag, 'ipv6', '*' + ' ' + _('IPv6'));
+ o.rmempty = false;
+
+ o = s.taboption('general', form.Value, 'tcp_keep_alive_idle', _('TCP Keep Alive Idle'));
+ o.datatype = 'uinteger';
+ o.placeholder = '600';
+
+ o = s.taboption('general', form.Value, 'tcp_keep_alive_interval', _('TCP Keep Alive Interval'));
+ o.datatype = 'uinteger';
+ o.placeholder = '15';
+
+ s.tab('external_control', _('External Control Config'));
+
+ o = s.taboption('external_control', form.Value, 'ui_name', '*' + ' ' + _('UI Name'));
+
+ o = s.taboption('external_control', form.Value, 'ui_url', '*' + ' ' + _('UI Url'));
+ o.rmempty = false;
+ o.value('https://github.com/Zephyruso/zashboard/archive/refs/heads/gh-pages.zip', 'Zashboard');
+ o.value('https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip', 'MetaCubeXD');
+ o.value('https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip', 'YACD');
+ o.value('https://github.com/MetaCubeX/Razord-meta/archive/refs/heads/gh-pages.zip', 'Razord');
+
+ o = s.taboption('external_control', form.Value, 'api_port', '*' + ' ' + _('API Port'));
+ o.datatype = 'port';
+ o.placeholder = '9090';
+
+ o = s.taboption('external_control', form.Value, 'api_secret', '*' + ' ' + _('API Secret'));
+ o.password = true;
+ o.rmempty = false;
+
+ o = s.taboption('external_control', form.Flag, 'selection_cache', _('Save Proxy Selection'));
+ o.rmempty = false;
+
+ s.tab('inbound', _('Inbound Config'));
+
+ o = s.taboption('inbound', form.Flag, 'allow_lan', '*' + ' ' + _('Allow Lan'));
+ o.rmempty = false;
+
+ o = s.taboption('inbound', form.Value, 'http_port', '*' + ' ' + _('HTTP Port'));
+ o.datatype = 'port';
+ o.placeholder = '8080';
+
+ o = s.taboption('inbound', form.Value, 'socks_port', '*' + ' ' + _('SOCKS Port'));
+ o.datatype = 'port';
+ o.placeholder = '1080';
+
+ o = s.taboption('inbound', form.Value, 'mixed_port', '*' + ' ' + _('Mixed Port'));
+ o.datatype = 'port';
+ o.placeholder = '7890';
+
+ o = s.taboption('inbound', form.Value, 'redir_port', '*' + ' ' + _('Redirect Port'));
+ o.datatype = 'port';
+ o.placeholder = '7891';
+
+ o = s.taboption('inbound', form.Value, 'tproxy_port', '*' + ' ' + _('TPROXY Port'));
+ o.datatype = 'port';
+ o.placeholder = '7892';
+
+ o = s.taboption('inbound', form.Flag, 'authentication', '*' + ' ' + _('Overwrite Authentication'));
+ o.rmempty = false;
+
+ o = s.taboption('inbound', form.SectionValue, '_authentications', form.TableSection, 'authentication', _('Edit Authentications'));
+ o.retain = true;
+ o.depends('authentication', '1');
+
+ o.subsection.addremove = true;
+ o.subsection.anonymous = true;
+ o.subsection.sortable = true;
+
+ so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
+ so.rmempty = false;
+
+ so = o.subsection.option(form.Value, 'username', _('Username'));
+ so.rmempty = false;
+
+ so = o.subsection.option(form.Value, 'password', _('Password'));
+ so.password = true;
+ so.rmempty = false;
+
+ s.tab('tun', _('TUN Config'));
+
+ o = s.taboption('tun', form.ListValue, 'tun_stack', '*' + ' ' + _('Stack'));
+ o.value('system', 'System');
+ o.value('gvisor', 'gVisor');
+ o.value('mixed', 'Mixed');
+
+ o = s.taboption('tun', form.Value, 'tun_mtu', '*' + ' ' + _('MTU'));
+ o.datatype = 'uinteger';
+ o.placeholder = '9000';
+
+ o = s.taboption('tun', form.Flag, 'tun_gso', '*' + ' ' + _('GSO'));
+ o.rmempty = false;
+
+ o = s.taboption('tun', form.Value, 'tun_gso_max_size', '*' + ' ' + _('GSO Max Size'));
+ o.datatype = 'uinteger';
+ o.placeholder = '65536';
+ o.retain = true;
+ o.depends('tun_gso', '1');
+
+ o = s.taboption('tun', form.Flag, 'tun_endpoint_independent_nat', '*' + ' ' + _('Endpoint Independent NAT'));
+ o.rmempty = false;
+
+ s.tab('dns', _('DNS Config'));
+
+ o = s.taboption('dns', form.Value, 'dns_port', '*' + ' ' + _('DNS Port'));
+ o.datatype = 'port';
+ o.placeholder = '1053';
+
+ o = s.taboption('dns', form.ListValue, 'dns_mode', '*' + ' ' + _('DNS Mode'));
+ o.value('normal', 'Normal');
+ o.value('fake-ip', 'Fake-IP');
+ o.value('redir-host', 'Redir-Host');
+
+ o = s.taboption('dns', form.Value, 'fake_ip_range', '*' + ' ' + _('Fake-IP Range'));
+ o.datatype = 'cidr4';
+ o.placeholder = '198.18.0.1/16';
+ o.retain = true;
+ o.depends('dns_mode', 'fake-ip');
+
+ o = s.taboption('dns', form.Flag, 'fake_ip_filter', _('Overwrite Fake-IP Filter'));
+ o.retain = true;
+ o.rmempty = false;
+ o.depends('dns_mode', 'fake-ip');
+
+ o = s.taboption('dns', form.DynamicList, 'fake_ip_filters', _('Edit Fake-IP Filters'));
+ o.retain = true;
+ o.depends({ 'dns_mode': 'fake-ip', 'fake_ip_filter': '1' });
+
+ o = s.taboption('dns', form.ListValue, 'fake_ip_filter_mode', _('Fake-IP Filter Mode'));
+ o.retain = true;
+ o.value('blacklist', _('Block Mode'));
+ o.value('whitelist', _('Allow Mode'));
+ o.depends({ 'dns_mode': 'fake-ip', 'fake_ip_filter': '1' });
+
+ o = s.taboption('dns', form.Flag, 'fake_ip_cache', _('Fake-IP Cache'));
+ o.retain = true;
+ o.rmempty = false;
+ o.depends('dns_mode', 'fake-ip');
+
+ o = s.taboption('dns', form.Flag, 'dns_respect_rules', _('Respect Rules'));
+ o.rmempty = false;
+
+ o = s.taboption('dns', form.Flag, 'dns_doh_prefer_http3', _('DoH Prefer HTTP/3'));
+ o.rmempty = false;
+
+ o = s.taboption('dns', form.Flag, 'dns_ipv6', _('IPv6'));
+ o.rmempty = false;
+
+ o = s.taboption('dns', form.Flag, 'dns_system_hosts', _('Use System Hosts'));
+ o.rmempty = false;
+
+ o = s.taboption('dns', form.Flag, 'dns_hosts', _('Use Hosts'));
+ o.rmempty = false;
+
+ o = s.taboption('dns', form.Flag, 'hosts', _('Overwrite Hosts'));
+ o.rmempty = false;
+
+ o = s.taboption('dns', form.SectionValue, '_hosts', form.TableSection, 'host', _('Edit Hosts'));
+ o.retain = true;
+ o.depends('hosts', '1');
+
+ o.subsection.addremove = true;
+ o.subsection.anonymous = true;
+ o.subsection.sortable = true;
+
+ so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
+ so.rmempty = false;
+
+ so = o.subsection.option(form.Value, 'domain_name', _('Domain Name'));
+ so.rmempty = false;
+
+ so = o.subsection.option(form.DynamicList, 'ip', _('IP'));
+
+ o = s.taboption('dns', form.Flag, 'dns_nameserver', _('Overwrite Nameserver'));
+ o.rmempty = false;
+
+ o = s.taboption('dns', form.SectionValue, '_dns_nameserver', form.TableSection, 'nameserver', _('Edit Nameservers'));
+ o.retain = true;
+ o.depends('dns_nameserver', '1');
+
+ o.subsection.addremove = true;
+ o.subsection.anonymous = true;
+ o.subsection.sortable = true;
+
+ so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
+ so.rmempty = false;
+
+ so = o.subsection.option(form.ListValue, 'type', _('Type'));
+ so.value('default-nameserver');
+ so.value('proxy-server-nameserver');
+ so.value('direct-nameserver');
+ so.value('nameserver');
+ so.value('fallback');
+
+ so = o.subsection.option(form.DynamicList, 'nameserver', _('Nameserver'));
+
+ o = s.taboption('dns', form.Flag, 'dns_nameserver_policy', _('Overwrite Nameserver Policy'));
+ o.rmempty = false;
+
+ o = s.taboption('dns', form.SectionValue, '_dns_nameserver_policies', form.TableSection, 'nameserver_policy', _('Edit Nameserver Policies'));
+ o.retain = true;
+ o.depends('dns_nameserver_policy', '1');
+
+ o.subsection.addremove = true;
+ o.subsection.anonymous = true;
+ o.subsection.sortable = true;
+
+ so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
+ so.rmempty = false;
+
+ so = o.subsection.option(form.Value, 'matcher', _('Matcher'));
+ so.rmempty = false;
+
+ so = o.subsection.option(form.DynamicList, 'nameserver', _('Nameserver'));
+
+ s.tab('geox', _('GeoX Config'));
+
+ o = s.taboption('geox', form.ListValue, 'geoip_format', _('GeoIP Format'));
+ o.value('dat', 'DAT');
+ o.value('mmdb', 'MMDB');
+
+ o = s.taboption('geox', form.ListValue, 'geodata_loader', _('GeoData Loader'));
+ o.value('standard', _('Standard Loader'));
+ o.value('memconservative', _('Memory Conservative Loader'));
+
+ o = s.taboption('geox', form.Value, 'geosite_url', _('GeoSite Url'));
+ o.rmempty = false;
+
+ o = s.taboption('geox', form.Value, 'geoip_mmdb_url', _('GeoIP(MMDB) Url'));
+ o.rmempty = false;
+
+ o = s.taboption('geox', form.Value, 'geoip_dat_url', _('GeoIP(DAT) Url'));
+ o.rmempty = false;
+
+ o = s.taboption('geox', form.Value, 'geoip_asn_url', _('GeoIP(ASN) Url'));
+ o.rmempty = false;
+
+ o = s.taboption('geox', form.Flag, 'geox_auto_update', _('GeoX Auto Update'));
+ o.rmempty = false;
+
+ o = s.taboption('geox', form.Value, 'geox_update_interval', _('GeoX Update Interval'));
+ o.datatype = 'uinteger';
+ o.placeholder = '24';
+ o.retain = true;
+ o.depends('geox_auto_update', '1');
+
+ s.tab('mixin_file_content', _('Mixin File Content'));
+
+ o = s.taboption('mixin_file_content', form.Flag, 'mixin_file_content', '*' + ' ' + _('Enable'), _('Please go to the editor tab to edit the file for mixin'));
+ o.rmempty = false;
+
+ return m.render();
+ }
+});
\ No newline at end of file
diff --git a/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js
new file mode 100644
index 000000000..6952ea581
--- /dev/null
+++ b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js
@@ -0,0 +1,86 @@
+'use strict';
+'require form';
+'require view';
+'require uci';
+'require tools.mihomo as mihomo';
+
+return view.extend({
+ load: function () {
+ return Promise.all([
+ uci.load('mihomo')
+ ]);
+ },
+ render: function (data) {
+ let m, s, o, so;
+
+ m = new form.Map('mihomo');
+
+ s = m.section(form.NamedSection, 'config', 'config', _('Profile'));
+
+ o = s.option(form.FileUpload, '_upload_profile', _('Upload Profile'));
+ o.browser = true;
+ o.enable_download = true;
+ o.root_directory = mihomo.profilesDir;
+ o.write = function (section_id, formvalue) {
+ return true;
+ };
+
+ s = m.section(form.GridSection, 'subscription', _('Subscription'));
+ s.addremove = true;
+ s.anonymous = true;
+ s.sortable = true;
+ s.modaltitle = _('Edit Subscription');
+
+ o = s.option(form.Value, 'name', _('Subscription Name'));
+ o.rmempty = false;
+
+ o = s.option(form.Value, 'used', _('Used'));
+ o.modalonly = false;
+ o.optional = true;
+ o.readonly = true;
+
+ o = s.option(form.Value, 'total', _('Total'));
+ o.modalonly = false;
+ o.optional = true;
+ o.readonly = true;
+
+ o = s.option(form.Value, 'expire', _('Expire At'));
+ o.modalonly = false;
+ o.optional = true;
+ o.readonly = true;
+
+ o = s.option(form.Value, 'update', _('Update At'));
+ o.modalonly = false;
+ o.optional = true;
+ o.readonly = true;
+
+ o = s.option(form.Button, 'update_subscription');
+ o.editable = true;
+ o.inputstyle = 'positive';
+ o.inputtitle = _('Update');
+ o.modalonly = false;
+ o.onclick = function (_, section_id) {
+ return mihomo.updateSubscription(section_id);
+ };
+
+ o = s.option(form.Value, 'url', _('Subscription Url'));
+ o.modalonly = true;
+ o.rmempty = false;
+
+ o = s.option(form.Value, 'user_agent', _('User Agent'));
+ o.default = 'clash';
+ o.modalonly = true;
+ o.rmempty = false;
+ o.value('mihomo');
+ o.value('clash.meta');
+ o.value('clash');
+
+ o = s.option(form.ListValue, 'prefer', _('Prefer'));
+ o.default = 'remote';
+ o.modalonly = true;
+ o.value('remote', _('Remote'));
+ o.value('local', _('Local'));
+
+ return m.render();
+ }
+});
diff --git a/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js
new file mode 100644
index 000000000..6264ef3d7
--- /dev/null
+++ b/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js
@@ -0,0 +1,145 @@
+'use strict';
+'require form';
+'require view';
+'require uci';
+'require network';
+'require tools.widgets as widgets';
+'require tools.mihomo as mihomo';
+
+return view.extend({
+ load: function () {
+ return Promise.all([
+ uci.load('mihomo'),
+ network.getHostHints(),
+ mihomo.getUsers(),
+ mihomo.getGroups()
+ ]);
+ },
+ render: function (data) {
+ const hosts = data[1].hosts;
+ const users = data[2];
+ const groups = data[3];
+
+ let m, s, o;
+
+ m = new form.Map('mihomo');
+
+ s = m.section(form.NamedSection, 'proxy', 'proxy', _('Proxy Config'));
+
+ s.tab('transparent_proxy', _('Transparent Proxy'));
+
+ o = s.taboption('transparent_proxy', form.Flag, 'transparent_proxy', _('Enable'));
+ o.rmempty = false;
+
+ o = s.taboption('transparent_proxy', form.ListValue, 'tcp_transparent_proxy_mode', _('TCP Proxy Mode'));
+ o.value('redirect', _('Redirect Mode'));
+ o.value('tproxy', _('TPROXY Mode'));
+ o.value('tun', _('TUN Mode'));
+
+ o = s.taboption('transparent_proxy', form.ListValue, 'udp_transparent_proxy_mode', _('UDP Proxy Mode'));
+ o.value('tproxy', _('TPROXY Mode'));
+ o.value('tun', _('TUN Mode'));
+
+ o = s.taboption('transparent_proxy', form.Flag, 'ipv4_dns_hijack', _('IPv4 DNS Hijack'));
+ o.rmempty = false;
+
+ o = s.taboption('transparent_proxy', form.Flag, 'ipv6_dns_hijack', _('IPv6 DNS Hijack'));
+ o.rmempty = false;
+
+ o = s.taboption('transparent_proxy', form.Flag, 'ipv4_proxy', _('IPv4 Proxy'));
+ o.rmempty = false;
+
+ o = s.taboption('transparent_proxy', form.Flag, 'ipv6_proxy', _('IPv6 Proxy'));
+ o.rmempty = false;
+
+ o = s.taboption('transparent_proxy', form.Flag, 'router_proxy', _('Router Proxy'));
+ o.rmempty = false;
+
+ o = s.taboption('transparent_proxy', form.Flag, 'lan_proxy', _('Lan Proxy'));
+ o.rmempty = false;
+
+ s.tab('access_control', _('Access Control'));
+
+ o = s.taboption('access_control', form.ListValue, 'access_control_mode', _('Mode'));
+ o.value('all', _('All Mode'));
+ o.value('allow', _('Allow Mode'));
+ o.value('block', _('Block Mode'));
+
+ o = s.taboption('access_control', form.DynamicList, 'acl_ip', 'IP');
+ o.datatype = 'ipmask4';
+ o.retain = true;
+ o.depends('access_control_mode', 'allow');
+ o.depends('access_control_mode', 'block');
+
+ for (const mac in hosts) {
+ const host = hosts[mac];
+ for (const ip of host.ipaddrs) {
+ const hint = host.name || mac;
+ o.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
+ };
+ };
+
+ o = s.taboption('access_control', form.DynamicList, 'acl_ip6', 'IP6');
+ o.datatype = 'ipmask6';
+ o.retain = true;
+ o.depends('access_control_mode', 'allow');
+ o.depends('access_control_mode', 'block');
+
+ for (const mac in hosts) {
+ const host = hosts[mac];
+ for (const ip of host.ip6addrs) {
+ const hint = host.name || mac;
+ o.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
+ };
+ };
+
+ o = s.taboption('access_control', form.DynamicList, 'acl_mac', 'MAC');
+ o.datatype = 'macaddr';
+ o.retain = true;
+ o.depends('access_control_mode', 'allow');
+ o.depends('access_control_mode', 'block');
+
+ for (const mac in hosts) {
+ const host = hosts[mac];
+ const hint = host.name || host.ipaddrs[0];
+ o.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac);
+ };
+
+ o = s.taboption('access_control', widgets.NetworkSelect, 'acl_interface', _('Interface'));
+ o.multiple = true;
+ o.optional = true;
+ o.retain = true;
+ o.depends('access_control_mode', 'allow');
+ o.depends('access_control_mode', 'block');
+
+ s.tab('bypass', _('Bypass'));
+
+ o = s.taboption('bypass', form.MultiValue, 'bypass_user', _('Bypass User'));
+ o.create = true;
+
+ for (const user of users) {
+ o.value(user);
+ };
+
+ o = s.taboption('bypass', form.MultiValue, 'bypass_group', _('Bypass Group'));
+ o.create = true;
+
+ for (const group of groups) {
+ o.value(group);
+ };
+
+ o = s.taboption('bypass', form.Flag, 'bypass_china_mainland_ip', _('Bypass China Mainland IP'));
+ o.rmempty = false;
+
+ o = s.taboption('bypass', form.Value, 'proxy_tcp_dport', _('Destination TCP Port to Proxy'));
+ o.rmempty = false;
+ o.value('0-65535', _('All Port'));
+ o.value('21 22 80 110 143 194 443 465 853 993 995 8080 8443', _('Commonly Used Port'));
+
+ o = s.taboption('bypass', form.Value, 'proxy_udp_dport', _('Destination UDP Port to Proxy'));
+ o.rmempty = false;
+ o.value('0-65535', _('All Port'));
+ o.value('123 443 8443', _('Commonly Used Port'));
+ return m.render();
+ }
+});
diff --git a/luci-app-mihomo/po/templates/mihomo.pot b/luci-app-mihomo/po/templates/mihomo.pot
index 882887472..a48c21beb 100644
--- a/luci-app-mihomo/po/templates/mihomo.pot
+++ b/luci-app-mihomo/po/templates/mihomo.pot
@@ -1,232 +1,230 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:386
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:72
msgid "API Port"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:390
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:76
msgid "API Secret"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:200
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:61
msgid "Access Control"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:203
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:64
msgid "All Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:275
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:280
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:136
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:141
msgid "All Port"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:399
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:85
msgid "Allow Lan"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:204
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:495
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:181
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:65
msgid "Allow Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:106
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:94
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:13
msgid "App Config"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:27
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:38
msgid "App Log"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:53
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:43
msgid "App Version"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:356
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:43
msgid "Auto"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:104
-msgid "Basic Config"
-msgstr ""
-
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:205
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:494
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:180
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:66
msgid "Block Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:254
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:115
msgid "Bypass"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:270
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:131
msgid "Bypass China Mainland IP"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:263
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:124
msgid "Bypass Group"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:256
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:117
msgid "Bypass User"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:111
#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:25
+msgid "Choose File"
+msgstr ""
+
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:99
msgid "Choose Profile"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:31
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:64
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:42
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:75
msgid "Clear Log"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:276
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:281
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:137
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:142
msgid "Commonly Used Port"
msgstr ""
-#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:14
-msgid "Config"
-msgstr ""
-
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:148
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:128
msgid "Core Environment Variable Config"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:60
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:71
msgid "Core Log"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:67
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:57
msgid "Core Status"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:60
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:50
msgid "Core Version"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:137
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:117
msgid "Cron Expression"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:466
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:152
msgid "DNS Config"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:472
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:158
msgid "DNS Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:468
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:154
msgid "DNS Port"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:273
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:134
msgid "Destination TCP Port to Proxy"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:278
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:139
msgid "Destination UDP Port to Proxy"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:353
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:40
msgid "Direct Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:358
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:45
msgid "Disable"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:162
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:142
msgid "Disable ECN of quic-go"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:158
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:138
msgid "Disable GSO of quic-go"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:154
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:134
msgid "Disable Loopback Detector"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:150
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:130
msgid "Disable Safe Path Check"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:506
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:192
msgid "DoH Prefer HTTP/3"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:532
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:218
msgid "Domain Name"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:425
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:111
msgid "Edit Authentications"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:488
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:174
msgid "Edit Fake-IP Filters"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:521
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:207
msgid "Edit Hosts"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:563
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:249
msgid "Edit Nameserver Policies"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:540
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:226
msgid "Edit Nameservers"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:287
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:32
msgid "Edit Subscription"
msgstr ""
-#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:22
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:23
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:45
msgid "Editor"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:108
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:170
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:357
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:433
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:529
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:548
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:571
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:612
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:96
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:23
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:44
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:119
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:215
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:234
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:257
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:298
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:31
msgid "Enable"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:463
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:149
msgid "Endpoint Independent NAT"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:302
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:47
msgid "Expire At"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:374
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:61
msgid "External Control Config"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:498
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:184
msgid "Fake-IP Cache"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:492
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:178
msgid "Fake-IP Filter Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:477
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:163
msgid "Fake-IP Range"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:145
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:125
msgid "Fast Reload"
msgstr ""
@@ -242,60 +240,60 @@ msgstr ""
msgid "File for Reserved IP6"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:115
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:103
#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:29
msgid "File:"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:454
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:140
msgid "GSO"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:457
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:143
msgid "GSO Max Size"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:341
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:28
msgid "General Config"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:585
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:271
msgid "GeoData Loader"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:581
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:267
msgid "GeoIP Format"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:598
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:284
msgid "GeoIP(ASN) Url"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:595
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:281
msgid "GeoIP(DAT) Url"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:592
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:278
msgid "GeoIP(MMDB) Url"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:589
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:275
msgid "GeoSite Url"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:601
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:287
msgid "GeoX Auto Update"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:579
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:265
msgid "GeoX Config"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:604
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:290
msgid "GeoX Update Interval"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:351
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:38
msgid "Global Mode"
msgstr ""
@@ -303,212 +301,222 @@ msgstr ""
msgid "Grant access to mihomo procedures"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:402
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:88
msgid "HTTP Port"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:49
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:39
msgid "How To Use"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:535
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:221
msgid "IP"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:182
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:43
msgid "IPv4 DNS Hijack"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:188
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:49
msgid "IPv4 Proxy"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:363
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:509
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:50
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:195
msgid "IPv6"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:185
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:46
msgid "IPv6 DNS Hijack"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:191
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:52
msgid "IPv6 Proxy"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:397
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:83
msgid "Inbound Config"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:247
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:108
msgid "Interface"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:197
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:58
msgid "Lan Proxy"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:337
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:82
msgid "Local"
msgstr ""
-#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:30
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:36
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:53
msgid "Log"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:343
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:30
msgid "Log Level"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:450
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:136
msgid "MTU"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:355
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:42
msgid "Match Process"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:574
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:260
msgid "Matcher"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:587
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:273
msgid "Memory Conservative Loader"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:49
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:39
#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:3
msgid "MihomoTProxy"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:410
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:96
msgid "Mixed Port"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:125
-msgid "Mixin"
-msgstr ""
-
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:339
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:21
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:29
msgid "Mixin Config"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:610
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:296
msgid "Mixin File Content"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:202
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:350
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:26
+msgid "Mixin Option"
+msgstr ""
+
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:37
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:63
msgid "Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:558
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:577
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:244
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:263
msgid "Nameserver"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:19
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:15
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:15
msgid "Not Running"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:99
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:89
msgid "Open Dashboard"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:360
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:47
msgid "Outbound Interface"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:422
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:108
msgid "Overwrite Authentication"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:483
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:169
msgid "Overwrite Fake-IP Filter"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:518
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:204
msgid "Overwrite Hosts"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:537
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:223
msgid "Overwrite Nameserver"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:560
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:246
msgid "Overwrite Nameserver Policy"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:439
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:125
msgid "Password"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:612
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:298
msgid "Please go to the editor tab to edit the file for mixin"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:333
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:78
msgid "Prefer"
msgstr ""
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:18
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:21
+msgid "Profile"
+msgstr ""
+
#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:37
msgid "Profile for Startup"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:166
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:27
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:37
msgid "Proxy Config"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:174
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:35
msgid "Redirect Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:414
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:100
msgid "Redirect Port"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:79
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:69
msgid "Reload Service"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:336
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:81
msgid "Remote"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:503
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:189
msgid "Respect Rules"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:86
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:76
msgid "Restart Service"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:194
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:55
msgid "Router Proxy"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:352
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:39
msgid "Rule Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:19
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:15
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:15
msgid "Running"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:406
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:92
msgid "SOCKS Port"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:394
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:80
msgid "Save Proxy Selection"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:134
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:114
msgid "Scheduled Restart"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:54
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:87
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:65
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:98
msgid "Scroll To Bottom"
msgstr ""
@@ -517,102 +525,98 @@ msgstr ""
msgid "Service is not running."
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:445
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:131
msgid "Stack"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:586
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:272
msgid "Standard Loader"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:130
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:110
msgid "Start Delay"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:128
-msgid "Startup Config"
-msgstr ""
-
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:51
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:41
msgid "Status"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:283
-msgid "Subscription Config"
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:28
+msgid "Subscription"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:289
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:34
msgid "Subscription Name"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:321
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:66
msgid "Subscription Url"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:119
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:107
#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:33
msgid "Subscription:"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:366
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:53
msgid "TCP Keep Alive Idle"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:370
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:57
msgid "TCP Keep Alive Interval"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:173
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:34
msgid "TCP Proxy Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:175
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:179
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:36
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:40
msgid "TPROXY Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:418
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:104
msgid "TPROXY Port"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:443
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:129
msgid "TUN Config"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:176
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:180
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:37
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:41
msgid "TUN Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:142
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:122
msgid "Test Profile"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:297
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:42
msgid "Total"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:168
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:29
msgid "Transparent Proxy"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:49
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:39
msgid "Transparent Proxy with Mihomo on OpenWrt."
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:551
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:237
msgid "Type"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:178
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:39
msgid "UDP Proxy Mode"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:376
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:63
msgid "UI Name"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:379
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:65
msgid "UI Url"
msgstr ""
@@ -621,38 +625,38 @@ msgstr ""
msgid "Unknown"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:315
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:60
msgid "Update"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:307
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:52
msgid "Update At"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:93
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:83
msgid "Update Dashboard"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:122
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:20
msgid "Upload Profile"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:515
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:201
msgid "Use Hosts"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:512
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:198
msgid "Use System Hosts"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:292
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:37
msgid "Used"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:325
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:70
msgid "User Agent"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:436
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:122
msgid "Username"
msgstr ""
diff --git a/luci-app-mihomo/po/zh_Hans/mihomo.po b/luci-app-mihomo/po/zh_Hans/mihomo.po
index b39595661..be5cadcc8 100644
--- a/luci-app-mihomo/po/zh_Hans/mihomo.po
+++ b/luci-app-mihomo/po/zh_Hans/mihomo.po
@@ -8,232 +8,230 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:386
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:72
msgid "API Port"
msgstr "API 端口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:390
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:76
msgid "API Secret"
msgstr "API 密钥"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:200
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:61
msgid "Access Control"
msgstr "访问控制"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:203
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:64
msgid "All Mode"
msgstr "全部模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:275
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:280
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:136
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:141
msgid "All Port"
msgstr "全部端口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:399
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:85
msgid "Allow Lan"
msgstr "允许局域网访问"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:204
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:495
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:181
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:65
msgid "Allow Mode"
msgstr "白名单模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:106
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:94
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:13
msgid "App Config"
msgstr "插件配置"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:27
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:38
msgid "App Log"
msgstr "插件日志"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:53
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:43
msgid "App Version"
msgstr "插件版本"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:356
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:43
msgid "Auto"
msgstr "自动"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:104
-msgid "Basic Config"
-msgstr "基础配置"
-
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:205
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:494
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:180
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:66
msgid "Block Mode"
msgstr "黑名单模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:254
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:115
msgid "Bypass"
msgstr "绕过"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:270
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:131
msgid "Bypass China Mainland IP"
msgstr "绕过中国大陆 IP"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:263
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:124
msgid "Bypass Group"
msgstr "绕过用户组"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:256
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:117
msgid "Bypass User"
msgstr "绕过用户"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:111
#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:25
+msgid "Choose File"
+msgstr "选择文件"
+
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:99
msgid "Choose Profile"
msgstr "选择配置文件"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:31
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:64
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:42
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:75
msgid "Clear Log"
msgstr "清空日志"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:276
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:281
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:137
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:142
msgid "Commonly Used Port"
msgstr "常用端口"
-#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:14
-msgid "Config"
-msgstr "配置"
-
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:148
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:128
msgid "Core Environment Variable Config"
msgstr "核心环境变量配置"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:60
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:71
msgid "Core Log"
msgstr "核心日志"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:67
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:57
msgid "Core Status"
msgstr "核心状态"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:60
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:50
msgid "Core Version"
msgstr "核心版本"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:137
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:117
msgid "Cron Expression"
msgstr "Cron 表达式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:466
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:152
msgid "DNS Config"
msgstr "DNS 配置"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:472
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:158
msgid "DNS Mode"
msgstr "DNS 模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:468
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:154
msgid "DNS Port"
msgstr "DNS 端口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:273
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:134
msgid "Destination TCP Port to Proxy"
msgstr "要代理的 TCP 目标端口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:278
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:139
msgid "Destination UDP Port to Proxy"
msgstr "要代理的 UDP 目标端口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:353
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:40
msgid "Direct Mode"
msgstr "直连模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:358
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:45
msgid "Disable"
msgstr "禁用"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:162
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:142
msgid "Disable ECN of quic-go"
-msgstr "禁用 quic-go 的显式拥塞通告"
+msgstr "禁用 quic-go 的显式拥塞通知"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:158
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:138
msgid "Disable GSO of quic-go"
msgstr "禁用 quic-go 的通用分段卸载"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:154
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:134
msgid "Disable Loopback Detector"
msgstr "禁用回环检测"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:150
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:130
msgid "Disable Safe Path Check"
msgstr "禁用安全路径检查"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:506
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:192
msgid "DoH Prefer HTTP/3"
msgstr "DoH 优先 HTTP/3"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:532
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:218
msgid "Domain Name"
msgstr "域名"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:425
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:111
msgid "Edit Authentications"
msgstr "编辑身份验证"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:488
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:174
msgid "Edit Fake-IP Filters"
msgstr "编辑 Fake-IP 过滤列表"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:521
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:207
msgid "Edit Hosts"
msgstr "编辑 Hosts"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:563
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:249
msgid "Edit Nameserver Policies"
msgstr "编辑 DNS 服务器查询策略"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:540
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:226
msgid "Edit Nameservers"
msgstr "编辑 DNS 服务器"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:287
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:32
msgid "Edit Subscription"
msgstr "编辑订阅"
-#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:22
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:23
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:45
msgid "Editor"
msgstr "编辑器"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:108
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:170
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:357
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:433
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:529
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:548
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:571
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:612
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:96
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:23
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:44
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:119
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:215
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:234
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:257
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:298
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:31
msgid "Enable"
msgstr "启用"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:463
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:149
msgid "Endpoint Independent NAT"
msgstr "独立于端点的 NAT"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:302
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:47
msgid "Expire At"
msgstr "到期时间"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:374
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:61
msgid "External Control Config"
msgstr "外部控制配置"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:498
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:184
msgid "Fake-IP Cache"
msgstr "Fake-IP 缓存"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:492
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:178
msgid "Fake-IP Filter Mode"
msgstr "Fake-IP 过滤模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:477
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:163
msgid "Fake-IP Range"
msgstr "Fake-IP 范围"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:145
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:125
msgid "Fast Reload"
msgstr "快速重载"
@@ -249,60 +247,60 @@ msgstr "IPv4 保留地址"
msgid "File for Reserved IP6"
msgstr "IPv6 保留地址"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:115
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:103
#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:29
msgid "File:"
msgstr "文件:"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:454
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:140
msgid "GSO"
msgstr "通用分段卸载"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:457
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:143
msgid "GSO Max Size"
msgstr "分段最大长度"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:341
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:28
msgid "General Config"
msgstr "全局配置"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:585
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:271
msgid "GeoData Loader"
msgstr "GeoData 加载器"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:581
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:267
msgid "GeoIP Format"
msgstr "GeoIP 格式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:598
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:284
msgid "GeoIP(ASN) Url"
msgstr "GeoIP(ASN) 下载地址"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:595
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:281
msgid "GeoIP(DAT) Url"
msgstr "GeoIP(DAT) 下载地址"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:592
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:278
msgid "GeoIP(MMDB) Url"
msgstr "GeoIP(MMDB) 下载地址"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:589
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:275
msgid "GeoSite Url"
msgstr "GeoSite 下载地址"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:601
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:287
msgid "GeoX Auto Update"
msgstr "定时更新GeoX文件"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:579
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:265
msgid "GeoX Config"
msgstr "GeoX 配置"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:604
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:290
msgid "GeoX Update Interval"
msgstr "GeoX 文件更新间隔"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:351
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:38
msgid "Global Mode"
msgstr "全局模式"
@@ -310,212 +308,222 @@ msgstr "全局模式"
msgid "Grant access to mihomo procedures"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:402
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:88
msgid "HTTP Port"
msgstr "HTTP 端口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:49
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:39
msgid "How To Use"
msgstr "使用说明"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:535
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:221
msgid "IP"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:182
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:43
msgid "IPv4 DNS Hijack"
msgstr "IPv4 DNS 劫持"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:188
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:49
msgid "IPv4 Proxy"
msgstr "IPv4 代理"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:363
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:509
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:50
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:195
msgid "IPv6"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:185
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:46
msgid "IPv6 DNS Hijack"
msgstr "IPv6 DNS 劫持"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:191
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:52
msgid "IPv6 Proxy"
msgstr "IPv6 代理"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:397
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:83
msgid "Inbound Config"
msgstr "入站配置"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:247
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:108
msgid "Interface"
msgstr "接口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:197
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:58
msgid "Lan Proxy"
msgstr "局域网代理"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:337
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:82
msgid "Local"
msgstr "本地"
-#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:30
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:36
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:53
msgid "Log"
msgstr "日志"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:343
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:30
msgid "Log Level"
msgstr "日志级别"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:450
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:136
msgid "MTU"
msgstr "最大传输单元"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:355
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:42
msgid "Match Process"
msgstr "匹配进程"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:574
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:260
msgid "Matcher"
msgstr "匹配"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:587
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:273
msgid "Memory Conservative Loader"
msgstr "为内存受限设备优化的加载器"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:49
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:39
#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:3
msgid "MihomoTProxy"
msgstr ""
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:410
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:96
msgid "Mixed Port"
msgstr "混合端口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:125
-msgid "Mixin"
-msgstr "混入"
-
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:339
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:21
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:29
msgid "Mixin Config"
msgstr "混入配置"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:610
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:296
msgid "Mixin File Content"
msgstr "混入文件内容"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:202
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:350
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:26
+msgid "Mixin Option"
+msgstr "混入选项"
+
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:37
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:63
msgid "Mode"
msgstr "模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:558
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:577
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:244
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:263
msgid "Nameserver"
msgstr "DNS 服务器"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:19
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:15
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:15
msgid "Not Running"
msgstr "未在运行"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:99
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:89
msgid "Open Dashboard"
msgstr "打开面板"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:360
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:47
msgid "Outbound Interface"
msgstr "出站接口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:422
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:108
msgid "Overwrite Authentication"
msgstr "覆盖身份验证"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:483
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:169
msgid "Overwrite Fake-IP Filter"
msgstr "覆盖 Fake-IP 过滤列表"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:518
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:204
msgid "Overwrite Hosts"
msgstr "覆盖 Hosts"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:537
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:223
msgid "Overwrite Nameserver"
msgstr "覆盖 DNS 服务器"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:560
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:246
msgid "Overwrite Nameserver Policy"
msgstr "覆盖 DNS 服务器查询策略"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:439
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:125
msgid "Password"
msgstr "密码"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:612
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:298
msgid "Please go to the editor tab to edit the file for mixin"
msgstr "请前往编辑器标签编辑用于混入的文件"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:333
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:78
msgid "Prefer"
msgstr "优先"
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:18
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:21
+msgid "Profile"
+msgstr "配置文件"
+
#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:37
msgid "Profile for Startup"
msgstr "用于启动的配置文件"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:166
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:27
+#: applications/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json:37
msgid "Proxy Config"
msgstr "代理配置"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:174
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:35
msgid "Redirect Mode"
msgstr "Redirect 模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:414
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:100
msgid "Redirect Port"
msgstr "Redirect 端口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:79
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:69
msgid "Reload Service"
msgstr "重载服务"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:336
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:81
msgid "Remote"
msgstr "远程"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:503
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:189
msgid "Respect Rules"
msgstr "遵循分流规则"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:86
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:76
msgid "Restart Service"
msgstr "重启服务"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:194
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:55
msgid "Router Proxy"
msgstr "路由器代理"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:352
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:39
msgid "Rule Mode"
msgstr "规则模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:19
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:15
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:15
msgid "Running"
msgstr "运行中"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:406
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:92
msgid "SOCKS Port"
msgstr "SOCKS 端口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:394
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:80
msgid "Save Proxy Selection"
msgstr "保存节点/策略组选择"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:134
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:114
msgid "Scheduled Restart"
msgstr "定时重启"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:54
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:87
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:65
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/log.js:98
msgid "Scroll To Bottom"
msgstr "滚动到底部"
@@ -524,102 +532,98 @@ msgstr "滚动到底部"
msgid "Service is not running."
msgstr "服务未在运行。"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:445
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:131
msgid "Stack"
msgstr "栈"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:586
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:272
msgid "Standard Loader"
msgstr "标准加载器"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:130
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:110
msgid "Start Delay"
msgstr "启动延迟"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:128
-msgid "Startup Config"
-msgstr "启动配置"
-
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:51
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:41
msgid "Status"
msgstr "状态"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:283
-msgid "Subscription Config"
-msgstr "订阅配置"
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:28
+msgid "Subscription"
+msgstr "订阅"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:289
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:34
msgid "Subscription Name"
msgstr "订阅名称"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:321
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:66
msgid "Subscription Url"
msgstr "订阅链接"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:119
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:107
#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/editor.js:33
msgid "Subscription:"
msgstr "订阅:"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:366
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:53
msgid "TCP Keep Alive Idle"
msgstr "TCP Keep Alive 空闲"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:370
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:57
msgid "TCP Keep Alive Interval"
msgstr "TCP Keep Alive 间隔"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:173
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:34
msgid "TCP Proxy Mode"
msgstr "TCP 代理模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:175
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:179
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:36
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:40
msgid "TPROXY Mode"
msgstr "TPROXY 模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:418
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:104
msgid "TPROXY Port"
msgstr "TPROXY 端口"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:443
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:129
msgid "TUN Config"
msgstr "TUN 配置"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:176
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:180
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:37
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:41
msgid "TUN Mode"
msgstr "TUN 模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:142
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:122
msgid "Test Profile"
msgstr "检查配置文件"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:297
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:42
msgid "Total"
msgstr "总量"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:168
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:29
msgid "Transparent Proxy"
msgstr "透明代理"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:49
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:39
msgid "Transparent Proxy with Mihomo on OpenWrt."
msgstr "在 OpenWrt 上使用 Mihomo 进行透明代理。"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:551
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:237
msgid "Type"
msgstr "类型"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:178
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/proxy.js:39
msgid "UDP Proxy Mode"
msgstr "UDP 代理模式"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:376
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:63
msgid "UI Name"
msgstr "UI 名称"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:379
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:65
msgid "UI Url"
msgstr "UI 下载地址"
@@ -628,38 +632,38 @@ msgstr "UI 下载地址"
msgid "Unknown"
msgstr "未知"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:315
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:60
msgid "Update"
msgstr "更新"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:307
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:52
msgid "Update At"
msgstr "更新时间"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:93
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/app.js:83
msgid "Update Dashboard"
msgstr "更新面板"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:122
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:20
msgid "Upload Profile"
msgstr "上传配置文件"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:515
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:201
msgid "Use Hosts"
msgstr "使用 Hosts"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:512
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:198
msgid "Use System Hosts"
msgstr "使用系统的 Hosts"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:292
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:37
msgid "Used"
msgstr "已使用"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:325
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/profile.js:70
msgid "User Agent"
msgstr "用户代理(UA)"
-#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/config.js:436
+#: applications/luci-app-mihomo/htdocs/luci-static/resources/view/mihomo/mixin.js:122
msgid "Username"
msgstr "用户名"
diff --git a/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json b/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json
index 90c6b2ec3..b2860282b 100644
--- a/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json
+++ b/luci-app-mihomo/root/usr/share/luci/menu.d/luci-app-mihomo.json
@@ -2,8 +2,7 @@
"admin/services/mihomo": {
"title": "MihomoTProxy",
"action": {
- "type": "alias",
- "path": "admin/services/mihomo/config"
+ "type": "firstchild"
},
"depends": {
"acl": [ "luci-app-mihomo" ],
@@ -11,16 +10,40 @@
}
},
"admin/services/mihomo/config": {
- "title": "Config",
+ "title": "App Config",
"order": 10,
"action": {
"type": "view",
- "path": "mihomo/config"
+ "path": "mihomo/app"
+ }
+ },
+ "admin/services/mihomo/profile": {
+ "title": "Profile",
+ "order": 20,
+ "action": {
+ "type": "view",
+ "path": "mihomo/profile"
+ }
+ },
+ "admin/services/mihomo/mixin": {
+ "title": "Mixin Config",
+ "order": 30,
+ "action": {
+ "type": "view",
+ "path": "mihomo/mixin"
+ }
+ },
+ "admin/services/mihomo/proxy": {
+ "title": "Proxy Config",
+ "order": 40,
+ "action": {
+ "type": "view",
+ "path": "mihomo/proxy"
}
},
"admin/services/mihomo/editor": {
"title": "Editor",
- "order": 20,
+ "order": 50,
"action": {
"type": "view",
"path": "mihomo/editor"
@@ -28,7 +51,7 @@
},
"admin/services/mihomo/log": {
"title": "Log",
- "order": 30,
+ "order": 60,
"action": {
"type": "view",
"path": "mihomo/log"
diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile
index 3e3d1585a..2b724683e 100644
--- a/luci-app-passwall/Makefile
+++ b/luci-app-passwall/Makefile
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=24.12.17
-PKG_RELEASE:=1
+PKG_RELEASE:=2
PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \
diff --git a/luci-app-passwall/root/usr/share/passwall/app.sh b/luci-app-passwall/root/usr/share/passwall/app.sh
index 7d1f95afd..40b657cd6 100755
--- a/luci-app-passwall/root/usr/share/passwall/app.sh
+++ b/luci-app-passwall/root/usr/share/passwall/app.sh
@@ -1969,7 +1969,7 @@ start() {
}
[ -n "$USE_TABLES" ] && source $APP_PATH/${USE_TABLES}.sh start
set_cache_var "USE_TABLES" "$USE_TABLES"
- [ -z $(get_cache_var "ACL_default_dns_port") ] && lua $APP_PATH/helper_dnsmasq.lua logic_restart -LOG 1
+ [ -z "$(get_cache_var "ACL_default_dns_port")" ] && lua $APP_PATH/helper_dnsmasq.lua logic_restart -LOG 1
if [ "$ENABLED_DEFAULT_ACL" == 1 ] || [ "$ENABLED_ACLS" == 1 ]; then
bridge_nf_ipt=$(sysctl -e -n net.bridge.bridge-nf-call-iptables)
set_cache_var "bak_bridge_nf_ipt" "$bridge_nf_ipt"
@@ -1999,7 +1999,7 @@ stop() {
source $APP_PATH/helper_smartdns.sh del
rm -rf $GLOBAL_DNSMASQ_CONF
rm -rf $GLOBAL_DNSMASQ_CONF_PATH
- [ -z $(get_cache_var "ACL_default_dns_port") ] && lua $APP_PATH/helper_dnsmasq.lua restart -LOG 0
+ [ -z "$(get_cache_var "ACL_default_dns_port")" ] && lua $APP_PATH/helper_dnsmasq.lua restart -LOG 0
bak_bridge_nf_ipt=$(get_cache_var "bak_bridge_nf_ipt")
[ -n "${bak_bridge_nf_ipt}" ] && sysctl -w net.bridge.bridge-nf-call-iptables=${bak_bridge_nf_ipt} >/dev/null 2>&1
bak_bridge_nf_ip6t=$(get_cache_var "bak_bridge_nf_ip6t")
diff --git a/luci-app-passwall/root/usr/share/passwall/iptables.sh b/luci-app-passwall/root/usr/share/passwall/iptables.sh
index 9f82a1fb6..826297bf8 100755
--- a/luci-app-passwall/root/usr/share/passwall/iptables.sh
+++ b/luci-app-passwall/root/usr/share/passwall/iptables.sh
@@ -214,11 +214,11 @@ load_acl() {
[ "$tcp_redir_ports" = "default" ] && tcp_redir_ports=$TCP_REDIR_PORTS
[ "$udp_redir_ports" = "default" ] && udp_redir_ports=$UDP_REDIR_PORTS
- [ -n $(get_cache_var "ACL_${sid}_tcp_node") ] && tcp_node=$(get_cache_var "ACL_${sid}_tcp_node")
- [ -n $(get_cache_var "ACL_${sid}_udp_node") ] && udp_node=$(get_cache_var "ACL_${sid}_udp_node")
- [ -n $(get_cache_var "ACL_${sid}_tcp_port") ] && tcp_port=$(get_cache_var "ACL_${sid}_tcp_port")
- [ -n $(get_cache_var "ACL_${sid}_udp_port") ] && udp_port=$(get_cache_var "ACL_${sid}_udp_port")
- [ -n $(get_cache_var "ACL_${sid}_dns_port") ] && dns_redirect_port=$(get_cache_var "ACL_${sid}_dns_port")
+ [ -n "$(get_cache_var "ACL_${sid}_tcp_node")" ] && tcp_node=$(get_cache_var "ACL_${sid}_tcp_node")
+ [ -n "$(get_cache_var "ACL_${sid}_udp_node")" ] && udp_node=$(get_cache_var "ACL_${sid}_udp_node")
+ [ -n "$(get_cache_var "ACL_${sid}_tcp_port")" ] && tcp_port=$(get_cache_var "ACL_${sid}_tcp_port")
+ [ -n "$(get_cache_var "ACL_${sid}_udp_port")" ] && udp_port=$(get_cache_var "ACL_${sid}_udp_port")
+ [ -n "$(get_cache_var "ACL_${sid}_dns_port")" ] && dns_redirect_port=$(get_cache_var "ACL_${sid}_dns_port")
use_shunt_tcp=0
use_shunt_udp=0
diff --git a/luci-app-passwall/root/usr/share/passwall/nftables.sh b/luci-app-passwall/root/usr/share/passwall/nftables.sh
index 6ba24c1ec..27ff6638e 100755
--- a/luci-app-passwall/root/usr/share/passwall/nftables.sh
+++ b/luci-app-passwall/root/usr/share/passwall/nftables.sh
@@ -274,11 +274,11 @@ load_acl() {
[ "$tcp_redir_ports" = "default" ] && tcp_redir_ports=$TCP_REDIR_PORTS
[ "$udp_redir_ports" = "default" ] && udp_redir_ports=$UDP_REDIR_PORTS
- [ -n $(get_cache_var "ACL_${sid}_tcp_node") ] && tcp_node=$(get_cache_var "ACL_${sid}_tcp_node")
- [ -n $(get_cache_var "ACL_${sid}_udp_node") ] && udp_node=$(get_cache_var "ACL_${sid}_udp_node")
- [ -n $(get_cache_var "ACL_${sid}_tcp_port") ] && tcp_port=$(get_cache_var "ACL_${sid}_tcp_port")
- [ -n $(get_cache_var "ACL_${sid}_udp_port") ] && udp_port=$(get_cache_var "ACL_${sid}_udp_port")
- [ -n $(get_cache_var "ACL_${sid}_dns_port") ] && dns_redirect_port=$(get_cache_var "ACL_${sid}_dns_port")
+ [ -n "$(get_cache_var "ACL_${sid}_tcp_node")" ] && tcp_node=$(get_cache_var "ACL_${sid}_tcp_node")
+ [ -n "$(get_cache_var "ACL_${sid}_udp_node")" ] && udp_node=$(get_cache_var "ACL_${sid}_udp_node")
+ [ -n "$(get_cache_var "ACL_${sid}_tcp_port")" ] && tcp_port=$(get_cache_var "ACL_${sid}_tcp_port")
+ [ -n "$(get_cache_var "ACL_${sid}_udp_port")" ] && udp_port=$(get_cache_var "ACL_${sid}_udp_port")
+ [ -n "$(get_cache_var "ACL_${sid}_dns_port")" ] && dns_redirect_port=$(get_cache_var "ACL_${sid}_dns_port")
use_shunt_tcp=0
use_shunt_udp=0
diff --git a/luci-app-passwall/root/usr/share/passwall/socks_auto_switch.sh b/luci-app-passwall/root/usr/share/passwall/socks_auto_switch.sh
index f76b36874..a7d403fa7 100755
--- a/luci-app-passwall/root/usr/share/passwall/socks_auto_switch.sh
+++ b/luci-app-passwall/root/usr/share/passwall/socks_auto_switch.sh
@@ -82,7 +82,7 @@ test_auto_switch() {
local b_nodes=$1
local now_node=$2
[ -z "$now_node" ] && {
- if [ -n $(/usr/share/${CONFIG}/app.sh get_cache_var "socks_${id}") ]; then
+ if [ -n "$(/usr/share/${CONFIG}/app.sh get_cache_var "socks_${id}")" ]; then
now_node=$(/usr/share/${CONFIG}/app.sh get_cache_var "socks_${id}")
else
#echolog "自动切换检测:未知错误"
diff --git a/mihomo/files/mihomo.conf b/mihomo/files/mihomo.conf
index 4949dbc9c..68e409587 100644
--- a/mihomo/files/mihomo.conf
+++ b/mihomo/files/mihomo.conf
@@ -3,12 +3,12 @@ config status 'status'
config config 'config'
option 'init' '1'
option 'enabled' '0'
+ option 'profile' 'subscription:subscription'
option 'start_delay' '0'
option 'scheduled_restart' '0'
option 'cron_expression' '0 3 * * *'
- option 'profile' 'subscription:subscription'
- option 'mixin' '1'
option 'test_profile' '1'
+ option 'mixin' '1'
config proxy 'proxy'
option 'transparent_proxy' '1'
@@ -57,7 +57,7 @@ config mixin 'mixin'
option 'tcp_keep_alive_idle' '600'
option 'tcp_keep_alive_interval' '15'
option 'ui_name' 'metacubexd'
- option 'ui_url' 'https://ghp.ci/https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip'
+ option 'ui_url' 'https://github.com/Zephyruso/zashboard/archive/refs/heads/gh-pages.zip'
option 'api_port' '9090'
option 'api_secret' ''
option 'selection_cache' '1'
@@ -90,10 +90,10 @@ config mixin 'mixin'
option 'dns_nameserver_policy' '0'
option 'geoip_format' 'dat'
option 'geodata_loader' 'memconservative'
- option 'geosite_url' 'https://ghp.ci/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat'
- option 'geoip_mmdb_url' 'https://ghp.ci/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip-lite.metadb'
- option 'geoip_dat_url' 'https://ghp.ci/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip-lite.dat'
- option 'geoip_asn_url' 'https://ghp.ci/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb'
+ option 'geosite_url' 'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat'
+ option 'geoip_mmdb_url' 'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip-lite.metadb'
+ option 'geoip_dat_url' 'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip-lite.dat'
+ option 'geoip_asn_url' 'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb'
option 'geox_auto_update' '0'
option 'geox_update_interval' '24'
option 'mixin_file_content' '0'