update 2025-03-04 00:24:44

This commit is contained in:
kenzok8 2025-03-04 00:24:44 +08:00
parent 709a0a9be9
commit c0bcb90923
18 changed files with 806 additions and 721 deletions

View File

@ -1,6 +1,6 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=1.19.5
PKG_VERSION:=1.20.0
LUCI_TITLE:=LuCI Support for nikki
LUCI_DEPENDS:=+luci-base +nikki

View File

@ -25,6 +25,12 @@ const callNikkiVersion = rpc.declare({
expect: { '': {} }
});
const callNikkiProfile = rpc.declare({
object: 'luci.nikki',
method: 'profile',
expect: { '': {} }
});
const callNikkiUpdateSubscription = rpc.declare({
object: 'luci.nikki',
method: 'update_subscription',
@ -84,13 +90,18 @@ return baseclass.extend({
return callNikkiVersion();
},
profile: function () {
return callNikkiProfile();
},
updateSubscription: function (section_id) {
return callNikkiUpdateSubscription(section_id);
},
api: async function (method, path, query, body) {
const apiPort = uci.get('nikki', 'mixin', 'api_port');
const apiSecret = uci.get('nikki', 'mixin', 'api_secret');
const apiListen = uci.get('nikki', 'mixin', 'api_listen');
const apiSecret = uci.get('nikki', 'mixin', 'api_secret') ?? '';
const apiPort = apiListen.substring(apiListen.lastIndexOf(':') + 1);
const url = `http://${window.location.hostname}:${apiPort}${path}`;
return request.request(url, {
method: method,
@ -100,10 +111,11 @@ return baseclass.extend({
})
},
openDashboard: function () {
openDashboard: async function () {
const uiName = uci.get('nikki', 'mixin', 'ui_name');
const apiPort = uci.get('nikki', 'mixin', 'api_port');
const apiSecret = encodeURIComponent(uci.get('nikki', 'mixin', 'api_secret'));
const apiListen = uci.get('nikki', 'mixin', 'api_listen');
const apiSecret = encodeURIComponent(uci.get('nikki', 'mixin', 'api_secret') ?? '');
const apiPort = apiListen.substring(apiListen.lastIndexOf(':') + 1);
const params = {
host: window.location.hostname,
hostname: window.location.hostname,

View File

@ -18,103 +18,104 @@ return view.extend({
m = new form.Map('nikki');
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 = s.taboption('general', form.ListValue, 'log_level', _('Log Level'));
o.optional = true;
o.value('silent');
o.value('error');
o.value('warning');
o.value('info');
o.value('debug');
o = s.taboption('general', form.ListValue, 'mode', '*' + ' ' + _('Mode'));
o = s.taboption('general', form.ListValue, 'mode', _('Mode'));
o.optional = true;
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', form.ListValue, 'match_process', _('Match Process'));
o.optional = true;
o.value('off');
o.value('strict');
o.value('always');
o = s.taboption('general', widgets.NetworkSelect, 'outbound_interface', '*' + ' ' + _('Outbound Interface'));
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.ListValue, 'ipv6', _('IPv6'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('general', form.Flag, 'unify_delay', _('Unify Delay'));
o.rmempty = false;
o = s.taboption('general', form.ListValue, 'unify_delay', _('Unify Delay'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('general', form.Flag, 'tcp_concurrent', _('TCP Concurrent'));
o.rmempty = false;
o = s.taboption('general', form.ListValue, 'tcp_concurrent', _('TCP Concurrent'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
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_path', '*' + ' ' + _('UI Path'));
o.rmempty = false;
o = s.taboption('external_control', form.Value, 'ui_name', '*' + ' ' + _('UI Name'));
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 = s.taboption('external_control', form.Value, 'ui_url', _('UI Url'));
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_listen', '*' + ' ' + _('API Listen'));
o.datatype = 'ipaddrport(1)';
o.rmempty = false;
o = s.taboption('external_control', form.Value, 'api_secret', '*' + ' ' + _('API Secret'));
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;
o = s.taboption('external_control', form.ListValue, 'selection_cache', _('Save Proxy Selection'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
s.tab('inbound', _('Inbound Config'));
o = s.taboption('inbound', form.Flag, 'allow_lan', '*' + ' ' + _('Allow Lan'));
o.rmempty = false;
o = s.taboption('inbound', form.ListValue, 'allow_lan', _('Allow Lan'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('inbound', form.Value, 'http_port', '*' + ' ' + _('HTTP Port'));
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 = 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 = 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.rmempty = false;
o = s.taboption('inbound', form.Value, 'tproxy_port', '*' + ' ' + _('TPROXY Port'));
o.datatype = 'port';
o.placeholder = '7892';
o.rmempty = false;
o = s.taboption('inbound', form.Flag, 'authentication', '*' + ' ' + _('Overwrite Authentication'));
o = s.taboption('inbound', form.Flag, 'authentication', _('Overwrite Authentication'));
o.rmempty = false;
o = s.taboption('inbound', form.SectionValue, '_authentications', form.TableSection, 'authentication', _('Edit Authentications'));
@ -137,90 +138,97 @@ return view.extend({
s.tab('tun', _('TUN Config'));
o = s.taboption('tun', form.Value, 'tun_device', '*' + ' ' + _('Device'));
o = s.taboption('tun', form.Value, 'tun_device', '*' + ' ' + _('Device Name'));
o.rmempty = false;
o = s.taboption('tun', form.ListValue, 'tun_stack', '*' + ' ' + _('Stack'));
o = s.taboption('tun', form.ListValue, 'tun_stack', _('Stack'));
o.optional = true;
o.value('system', 'System');
o.value('gvisor', 'gVisor');
o.value('mixed', 'Mixed');
o = s.taboption('tun', form.Value, 'tun_mtu', '*' + ' ' + _('MTU'));
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.ListValue, 'tun_gso', _('GSO'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('tun', form.Value, 'tun_gso_max_size', '*' + ' ' + _('GSO Max Size'));
o = s.taboption('tun', form.Value, 'tun_gso_max_size', _('GSO Max Size'));
o.datatype = 'uinteger';
o.placeholder = '65536';
o = s.taboption('tun', form.ListValue, 'tun_endpoint_independent_nat', _('Endpoint Independent NAT'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('tun', form.Flag, 'tun_dns_hijack', _('Overwrite DNS Hijack'));
o.rmempty = false;
o = s.taboption('tun', form.DynamicList, 'tun_dns_hijacks', _('Edit DNS Hijacks'));
o.retain = true;
o.depends('tun_gso', '1');
o = s.taboption('tun', form.Flag, 'tun_endpoint_independent_nat', '*' + ' ' + _('Endpoint Independent NAT'));
o.rmempty = false;
o = s.taboption('tun', form.Flag, 'tun_dns_hijack', '*' + ' ' + _('Overwrite DNS Hijack'));
o.rmempty = false;
o = s.taboption('tun', form.DynamicList, 'tun_dns_hijacks', '*' + ' ' + _('Edit DNS Hijacks'));
o.retain = true;
o.rmempty = false;
o.depends('tun_dns_hijack', '1');
o.value('tcp://any:53');
o.value('udp://any:53');
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.Flag, 'dns_ipv6', '*' + ' ' + _('IPv6'));
o = s.taboption('dns', form.Value, 'dns_listen', '*' + ' ' + _('DNS Listen'));
o.datatype = 'ipaddrport(1)';
o.rmempty = false;
o = s.taboption('dns', form.ListValue, 'dns_ipv6', _('IPv6'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('dns', form.ListValue, 'dns_mode', '*' + ' ' + _('DNS Mode'));
o.value('fake-ip', 'Fake-IP');
o.value('redir-host', 'Redir-Host');
o.value('fake-ip', 'Fake-IP');
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.rmempty = false;
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.depends('fake_ip_filter', '1');
o = s.taboption('dns', form.ListValue, 'fake_ip_filter_mode', _('Fake-IP Filter Mode'));
o.retain = true;
o.optional = 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.ListValue, 'fake_ip_cache', _('Fake-IP Cache'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('dns', form.Flag, 'dns_respect_rules', _('Respect Rules'));
o.rmempty = false;
o = s.taboption('dns', form.ListValue, 'dns_respect_rules', _('Respect Rules'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('dns', form.Flag, 'dns_doh_prefer_http3', _('DoH Prefer HTTP/3'));
o.rmempty = false;
o = s.taboption('dns', form.ListValue, 'dns_doh_prefer_http3', _('DoH Prefer HTTP/3'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('dns', form.Flag, 'dns_system_hosts', _('Use System Hosts'));
o.rmempty = false;
o = s.taboption('dns', form.ListValue, 'dns_system_hosts', _('Use System Hosts'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('dns', form.Flag, 'dns_hosts', _('Use Hosts'));
o.rmempty = false;
o = s.taboption('dns', form.ListValue, 'dns_hosts', _('Use Hosts'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('dns', form.Flag, 'hosts', _('Overwrite Hosts'));
o.rmempty = false;
@ -285,17 +293,20 @@ return view.extend({
s.tab('sniffer', _('Sniffer Config'));
o = s.taboption('sniffer', form.Flag, 'sniffer', _('Enable'));
o.rmempty = false;
o = s.taboption('sniffer', form.ListValue, 'sniffer', _('Enable'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('sniffer', form.Flag, 'sniffer_sniff_dns_mapping', _('Sniff Redir-Host'));
o.rmempty = false;
o = s.taboption('sniffer', form.ListValue, 'sniffer_sniff_dns_mapping', _('Sniff Redir-Host'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('sniffer', form.Flag, 'sniffer_sniff_pure_ip', _('Sniff Pure IP'));
o.rmempty = false;
o = s.taboption('sniffer', form.Flag, 'sniffer_overwrite_destination', _('Overwrite Destination'));
o.rmempty = false;
o = s.taboption('sniffer', form.ListValue, 'sniffer_sniff_pure_ip', _('Sniff Pure IP'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
o = s.taboption('sniffer', form.Flag, 'sniffer_force_domain_name', _('Overwrite Force Sniff Domain Name'));
o.rmempty = false;
@ -336,7 +347,7 @@ return view.extend({
s.tab('rule', _('Rule Config'));
o = s.taboption('rule', form.Flag, 'rule_provider', '*' + ' ' + _('Append Rule Provider'));
o = s.taboption('rule', form.Flag, 'rule_provider', _('Append Rule Provider'));
o.rmempty = false;
o = s.taboption('rule', form.SectionValue, '_rule_providers', form.GridSection, 'rule_provider', _('Edit Rule Providers'));
@ -405,7 +416,7 @@ return view.extend({
so.modalonly = true;
so.depends('type', 'http');
o = s.taboption('rule', form.Flag, 'rule', '*' + ' ' + _('Append Rule'));
o = s.taboption('rule', form.Flag, 'rule', _('Append Rule'));
o.rmempty = false;
o = s.taboption('rule', form.SectionValue, '_rules', form.TableSection, 'rule', _('Edit Rules'));
@ -421,8 +432,7 @@ return view.extend({
so.rmempty = false;
so = o.subsection.option(form.Value, 'type', _('Type'));
so.optional = true;
so.rmempty = true;
so.rmempty = false;
so.value('RULE-SET', _('Rule Set'));
so.value('DOMAIN', _('Domain Name'));
so.value('DOMAIN-SUFFIX', _('Domain Name Suffix'));
@ -453,37 +463,34 @@ return view.extend({
s.tab('geox', _('GeoX Config'));
o = s.taboption('geox', form.ListValue, 'geoip_format', _('GeoIP Format'));
o.optional = true;
o.value('dat', 'DAT');
o.value('mmdb', 'MMDB');
o = s.taboption('geox', form.ListValue, 'geodata_loader', _('GeoData Loader'));
o.optional = true;
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.ListValue, 'geox_auto_update', _('GeoX Auto Update'));
o.optional = true;
o.value('0', _('Disable'));
o.value('1', _('Enable'));
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 = 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();

View File

@ -1,11 +1,11 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:81
msgid "API Port"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:82
msgid "API Listen"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:85
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86
msgid "API Secret"
msgstr ""
@ -22,11 +22,11 @@ msgstr ""
msgid "All Port"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:94
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:96
msgid "Allow Lan"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:203
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:68
msgid "Allow Mode"
msgstr ""
@ -44,23 +44,19 @@ msgstr ""
msgid "App Version"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:409
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:419
msgid "Append Rule"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:340
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:350
msgid "Append Rule Provider"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:43
msgid "Auto"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:396
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:406
msgid "Behavior"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:202
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:205
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69
msgid "Block Mode"
msgstr ""
@ -123,31 +119,31 @@ msgstr ""
msgid "Cron Expression"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:174
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:175
msgid "DNS Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:180
msgid "DNS Mode"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:177
msgid "DNS Listen"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:176
msgid "DNS Port"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:186
msgid "DNS Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:93
msgid "Debug Log"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:432
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:441
msgid "Destination IP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:436
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:445
msgid "Destination IP Geo"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:433
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:442
msgid "Destination Port"
msgstr ""
@ -159,15 +155,31 @@ msgstr ""
msgid "Destination UDP Port to Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:140
msgid "Device"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141
msgid "Device Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:40
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:37
msgid "Direct Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:45
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:50
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:55
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:60
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:91
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:98
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:155
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:163
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:183
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:210
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:215
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:225
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:230
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:298
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:303
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:308
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:485
msgid "Disable"
msgstr ""
@ -187,60 +199,60 @@ msgstr ""
msgid "Disable Safe Path Check"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:214
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:218
msgid "DoH Prefer HTTP/3"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:240
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:428
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:247
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:437
msgid "Domain Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:435
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:444
msgid "Domain Name Geo"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:430
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:439
msgid "Domain Name Keyword"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:431
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:440
msgid "Domain Name Regex"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:429
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:438
msgid "Domain Name Suffix"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:120
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:121
msgid "Edit Authentications"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:164
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:169
msgid "Edit DNS Hijacks"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:196
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:199
msgid "Edit Fake-IP Filters"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:229
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:236
msgid "Edit Hosts"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:271
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:278
msgid "Edit Nameserver Policies"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:248
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:255
msgid "Edit Nameservers"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:343
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:353
msgid "Edit Rule Providers"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:412
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:422
msgid "Edit Rules"
msgstr ""
@ -254,22 +266,37 @@ msgid "Editor"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:95
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:23
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:44
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:128
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:237
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:256
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:279
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:323
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:351
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:420
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:487
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:51
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:56
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:61
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:92
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:99
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:129
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:156
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:164
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:184
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:211
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:216
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:221
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:226
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:231
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:244
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:263
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:286
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:296
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:299
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:304
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:309
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:333
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:361
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:430
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:486
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:493
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31
msgid "Enable"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:171
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161
msgid "Endpoint Independent NAT"
msgstr ""
@ -277,23 +304,23 @@ msgstr ""
msgid "Expire At"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:67
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:69
msgid "External Control Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:208
msgid "Fake-IP Cache"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:203
msgid "Fake-IP Filter Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:55
msgid "Fake-IP Ping Hijack"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206
msgid "Fake-IP Cache"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:200
msgid "Fake-IP Filter Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:185
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:190
msgid "Fake-IP Range"
msgstr ""
@ -301,15 +328,15 @@ msgstr ""
msgid "Fast Reload"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:390
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:400
msgid "File Format"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:384
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:394
msgid "File Path"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:378
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:388
msgid "File Size Limit"
msgstr ""
@ -330,19 +357,19 @@ msgstr ""
msgid "File:"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:304
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:314
msgid "Force Sniff Domain Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:152
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:153
msgid "GSO"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:155
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:158
msgid "GSO Max Size"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:28
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:23
msgid "General Config"
msgstr ""
@ -350,43 +377,43 @@ msgstr ""
msgid "Generate & Download"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:460
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:470
msgid "GeoData Loader"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:456
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:465
msgid "GeoIP Format"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:481
msgid "GeoIP(ASN) Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:470
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:479
msgid "GeoIP(DAT) Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:467
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:477
msgid "GeoIP(MMDB) Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:464
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:475
msgid "GeoSite Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:476
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:483
msgid "GeoX Auto Update"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:454
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:463
msgid "GeoX Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:479
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:488
msgid "GeoX Update Interval"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:38
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:35
msgid "Global Mode"
msgstr ""
@ -394,7 +421,7 @@ msgstr ""
msgid "Grant access to nikki procedures"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:97
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:101
msgid "HTTP Port"
msgstr ""
@ -402,7 +429,7 @@ msgstr ""
msgid "How To Use"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:243
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:250
msgid "IP"
msgstr ""
@ -414,8 +441,8 @@ msgstr ""
msgid "IPv4 Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:50
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:217
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:48
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:181
msgid "IPv6"
msgstr ""
@ -427,11 +454,11 @@ msgstr ""
msgid "IPv6 Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:310
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:320
msgid "Ignore Sniff Domain Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:92
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:94
msgid "Inbound Config"
msgstr ""
@ -452,55 +479,54 @@ msgstr ""
msgid "Log"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:30
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:25
msgid "Log Level"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:148
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:150
msgid "MTU"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:42
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:39
msgid "Match Process"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:282
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:438
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:447
msgid "Matcher"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:462
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473
msgid "Memory Conservative Loader"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:105
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:107
msgid "Mixed Port"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:21
#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:29
msgid "Mixin Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:485
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:491
msgid "Mixin File Content"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:26
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:21
msgid "Mixin Option"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:37
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:33
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66
msgid "Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:357
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:367
msgid "Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:266
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:285
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:273
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:292
msgid "Nameserver"
msgstr ""
@ -509,12 +535,12 @@ msgstr ""
msgid "Nikki"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:448
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:457
msgid "No Resolve"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:371
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:441
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:381
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:450
msgid "Node"
msgstr ""
@ -526,60 +552,59 @@ msgstr ""
msgid "Open Dashboard"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:47
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:45
msgid "Outbound Interface"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:117
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:118
msgid "Overwrite Authentication"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:166
msgid "Overwrite DNS Hijack"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:298
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:335
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:345
msgid "Overwrite Destination"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:191
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:196
msgid "Overwrite Fake-IP Filter"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:301
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:311
msgid "Overwrite Force Sniff Domain Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:226
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:233
msgid "Overwrite Hosts"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:307
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:317
msgid "Overwrite Ignore Sniff Domain Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:245
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:252
msgid "Overwrite Nameserver"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:268
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:275
msgid "Overwrite Nameserver Policy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:313
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:323
msgid "Overwrite Sniff By Protocol"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:134
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:135
msgid "Password"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:487
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:493
msgid "Please go to the editor tab to edit the file for mixin"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:332
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:342
msgid "Port"
msgstr ""
@ -587,7 +612,7 @@ msgstr ""
msgid "Prefer"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:434
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:443
msgid "Process Name"
msgstr ""
@ -600,7 +625,7 @@ msgstr ""
msgid "Profile for Startup"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:326
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:336
msgid "Protocol"
msgstr ""
@ -617,7 +642,7 @@ msgstr ""
msgid "Redirect Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:109
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:110
msgid "Redirect Port"
msgstr ""
@ -629,7 +654,7 @@ msgstr ""
msgid "Remote"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:211
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:213
msgid "Respect Rules"
msgstr ""
@ -641,11 +666,11 @@ msgstr ""
msgid "Router Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:338
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:348
msgid "Rule Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:39
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:36
msgid "Rule Mode"
msgstr ""
@ -653,7 +678,7 @@ msgstr ""
msgid "Rule Provider:"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:427
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:436
msgid "Rule Set"
msgstr ""
@ -661,7 +686,7 @@ msgstr ""
msgid "Running"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:101
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:104
msgid "SOCKS Port"
msgstr ""
@ -678,27 +703,27 @@ msgstr ""
msgid "Scroll To Bottom"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:316
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:326
msgid "Sniff By Protocol"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:295
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:306
msgid "Sniff Pure IP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:292
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:301
msgid "Sniff Redir-Host"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:287
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:294
msgid "Sniffer Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:143
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:144
msgid "Stack"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:461
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:472
msgid "Standard Loader"
msgstr ""
@ -727,15 +752,15 @@ msgstr ""
msgid "Subscription:"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:56
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:58
msgid "TCP Concurrent"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:59
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:63
msgid "TCP Keep Alive Idle"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:63
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:66
msgid "TCP Keep Alive Interval"
msgstr ""
@ -748,11 +773,11 @@ msgstr ""
msgid "TPROXY Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:113
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114
msgid "TPROXY Port"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:138
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:139
msgid "TUN Config"
msgstr ""
@ -777,9 +802,9 @@ msgstr ""
msgid "Transparent Proxy with Mihomo on OpenWrt."
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:259
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:424
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:266
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:370
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:434
msgid "Type"
msgstr ""
@ -787,15 +812,15 @@ msgstr ""
msgid "UDP Proxy Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:72
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:74
msgid "UI Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:69
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:71
msgid "UI Path"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:74
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:76
msgid "UI Url"
msgstr ""
@ -815,7 +840,7 @@ msgstr ""
msgid "Update Dashboard"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:403
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:413
msgid "Update Interval"
msgstr ""
@ -823,15 +848,15 @@ msgstr ""
msgid "Upload Profile"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:366
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:376
msgid "Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:228
msgid "Use Hosts"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223
msgid "Use System Hosts"
msgstr ""
@ -843,6 +868,6 @@ msgstr ""
msgid "User Agent"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:131
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:132
msgid "Username"
msgstr ""

View File

@ -8,11 +8,11 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:81
msgid "API Port"
msgstr "API 端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:82
msgid "API Listen"
msgstr "API 监听"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:85
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86
msgid "API Secret"
msgstr "API 密钥"
@ -29,11 +29,11 @@ msgstr "全部模式"
msgid "All Port"
msgstr "全部端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:94
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:96
msgid "Allow Lan"
msgstr "允许局域网访问"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:203
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:68
msgid "Allow Mode"
msgstr "白名单模式"
@ -51,23 +51,19 @@ msgstr "插件日志"
msgid "App Version"
msgstr "插件版本"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:409
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:419
msgid "Append Rule"
msgstr "追加规则"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:340
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:350
msgid "Append Rule Provider"
msgstr "追加规则提供者"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:43
msgid "Auto"
msgstr "自动"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:396
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:406
msgid "Behavior"
msgstr "行为"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:202
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:205
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69
msgid "Block Mode"
msgstr "黑名单模式"
@ -130,31 +126,31 @@ msgstr "核心版本"
msgid "Cron Expression"
msgstr "Cron 表达式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:174
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:175
msgid "DNS Config"
msgstr "DNS 配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:180
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:177
msgid "DNS Listen"
msgstr "DNS 监听"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:186
msgid "DNS Mode"
msgstr "DNS 模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:176
msgid "DNS Port"
msgstr "DNS 端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:93
msgid "Debug Log"
msgstr "调试日志"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:432
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:441
msgid "Destination IP"
msgstr "目标 IP"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:436
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:445
msgid "Destination IP Geo"
msgstr "目标 IPGeo"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:433
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:442
msgid "Destination Port"
msgstr "目标端口"
@ -166,15 +162,31 @@ msgstr "要代理的 TCP 目标端口"
msgid "Destination UDP Port to Proxy"
msgstr "要代理的 UDP 目标端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:140
msgid "Device"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141
msgid "Device Name"
msgstr "设备名称"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:40
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:37
msgid "Direct Mode"
msgstr "直连模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:45
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:50
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:55
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:60
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:91
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:98
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:155
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:163
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:183
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:210
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:215
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:225
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:230
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:298
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:303
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:308
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:485
msgid "Disable"
msgstr "禁用"
@ -194,60 +206,60 @@ msgstr "禁用回环检测"
msgid "Disable Safe Path Check"
msgstr "禁用安全路径检查"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:214
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:218
msgid "DoH Prefer HTTP/3"
msgstr "DoH 优先 HTTP/3"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:240
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:428
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:247
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:437
msgid "Domain Name"
msgstr "域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:435
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:444
msgid "Domain Name Geo"
msgstr "域名Geo"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:430
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:439
msgid "Domain Name Keyword"
msgstr "域名(关键字)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:431
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:440
msgid "Domain Name Regex"
msgstr "域名(正则表达式)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:429
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:438
msgid "Domain Name Suffix"
msgstr "域名(后缀)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:120
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:121
msgid "Edit Authentications"
msgstr "编辑身份验证"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:164
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:169
msgid "Edit DNS Hijacks"
msgstr "编辑 DNS 劫持"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:196
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:199
msgid "Edit Fake-IP Filters"
msgstr "编辑 Fake-IP 过滤列表"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:229
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:236
msgid "Edit Hosts"
msgstr "编辑 Hosts"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:271
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:278
msgid "Edit Nameserver Policies"
msgstr "编辑 DNS 服务器查询策略"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:248
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:255
msgid "Edit Nameservers"
msgstr "编辑 DNS 服务器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:343
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:353
msgid "Edit Rule Providers"
msgstr "编辑规则提供者"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:412
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:422
msgid "Edit Rules"
msgstr "编辑规则"
@ -261,22 +273,37 @@ msgid "Editor"
msgstr "编辑器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:95
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:23
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:44
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:128
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:237
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:256
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:279
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:323
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:351
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:420
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:487
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:51
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:56
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:61
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:92
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:99
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:129
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:156
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:164
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:184
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:211
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:216
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:221
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:226
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:231
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:244
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:263
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:286
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:296
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:299
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:304
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:309
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:333
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:361
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:430
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:486
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:493
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31
msgid "Enable"
msgstr "启用"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:171
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161
msgid "Endpoint Independent NAT"
msgstr "独立于端点的 NAT"
@ -284,23 +311,23 @@ msgstr "独立于端点的 NAT"
msgid "Expire At"
msgstr "到期时间"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:67
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:69
msgid "External Control Config"
msgstr "外部控制配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:208
msgid "Fake-IP Cache"
msgstr "Fake-IP 缓存"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:203
msgid "Fake-IP Filter Mode"
msgstr "Fake-IP 过滤模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:55
msgid "Fake-IP Ping Hijack"
msgstr "Fake-IP Ping 劫持"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206
msgid "Fake-IP Cache"
msgstr "Fake-IP 缓存"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:200
msgid "Fake-IP Filter Mode"
msgstr "Fake-IP 过滤模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:185
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:190
msgid "Fake-IP Range"
msgstr "Fake-IP 范围"
@ -308,15 +335,15 @@ msgstr "Fake-IP 范围"
msgid "Fast Reload"
msgstr "快速重载"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:390
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:400
msgid "File Format"
msgstr "文件格式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:384
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:394
msgid "File Path"
msgstr "文件路径"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:378
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:388
msgid "File Size Limit"
msgstr "文件大小限制"
@ -337,19 +364,19 @@ msgstr "IPv6 保留地址"
msgid "File:"
msgstr "文件:"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:304
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:314
msgid "Force Sniff Domain Name"
msgstr "强制嗅探的域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:152
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:153
msgid "GSO"
msgstr "通用分段卸载"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:155
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:158
msgid "GSO Max Size"
msgstr "分段最大长度"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:28
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:23
msgid "General Config"
msgstr "全局配置"
@ -357,43 +384,43 @@ msgstr "全局配置"
msgid "Generate & Download"
msgstr "生成并下载"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:460
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:470
msgid "GeoData Loader"
msgstr "GeoData 加载器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:456
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:465
msgid "GeoIP Format"
msgstr "GeoIP 格式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:481
msgid "GeoIP(ASN) Url"
msgstr "GeoIP(ASN) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:470
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:479
msgid "GeoIP(DAT) Url"
msgstr "GeoIP(DAT) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:467
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:477
msgid "GeoIP(MMDB) Url"
msgstr "GeoIP(MMDB) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:464
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:475
msgid "GeoSite Url"
msgstr "GeoSite 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:476
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:483
msgid "GeoX Auto Update"
msgstr "定时更新GeoX文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:454
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:463
msgid "GeoX Config"
msgstr "GeoX 配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:479
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:488
msgid "GeoX Update Interval"
msgstr "GeoX 文件更新间隔"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:38
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:35
msgid "Global Mode"
msgstr "全局模式"
@ -401,7 +428,7 @@ msgstr "全局模式"
msgid "Grant access to nikki procedures"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:97
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:101
msgid "HTTP Port"
msgstr "HTTP 端口"
@ -409,7 +436,7 @@ msgstr "HTTP 端口"
msgid "How To Use"
msgstr "使用说明"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:243
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:250
msgid "IP"
msgstr ""
@ -421,8 +448,8 @@ msgstr "IPv4 DNS 劫持"
msgid "IPv4 Proxy"
msgstr "IPv4 代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:50
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:217
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:48
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:181
msgid "IPv6"
msgstr ""
@ -434,11 +461,11 @@ msgstr "IPv6 DNS 劫持"
msgid "IPv6 Proxy"
msgstr "IPv6 代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:310
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:320
msgid "Ignore Sniff Domain Name"
msgstr "忽略嗅探的域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:92
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:94
msgid "Inbound Config"
msgstr "入站配置"
@ -459,55 +486,54 @@ msgstr "本地"
msgid "Log"
msgstr "日志"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:30
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:25
msgid "Log Level"
msgstr "日志级别"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:148
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:150
msgid "MTU"
msgstr "最大传输单元"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:42
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:39
msgid "Match Process"
msgstr "匹配进程"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:282
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:438
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:447
msgid "Matcher"
msgstr "匹配"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:462
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473
msgid "Memory Conservative Loader"
msgstr "为内存受限设备优化的加载器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:105
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:107
msgid "Mixed Port"
msgstr "混合端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:21
#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:29
msgid "Mixin Config"
msgstr "混入配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:485
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:491
msgid "Mixin File Content"
msgstr "混入文件内容"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:26
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:21
msgid "Mixin Option"
msgstr "混入选项"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:37
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:33
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66
msgid "Mode"
msgstr "模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:357
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:367
msgid "Name"
msgstr "名称"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:266
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:285
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:273
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:292
msgid "Nameserver"
msgstr "DNS 服务器"
@ -516,12 +542,12 @@ msgstr "DNS 服务器"
msgid "Nikki"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:448
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:457
msgid "No Resolve"
msgstr "不解析"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:371
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:441
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:381
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:450
msgid "Node"
msgstr "节点"
@ -533,60 +559,59 @@ msgstr "未在运行"
msgid "Open Dashboard"
msgstr "打开面板"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:47
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:45
msgid "Outbound Interface"
msgstr "出站接口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:117
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:118
msgid "Overwrite Authentication"
msgstr "覆盖身份验证"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:166
msgid "Overwrite DNS Hijack"
msgstr "覆盖 DNS 劫持"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:298
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:335
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:345
msgid "Overwrite Destination"
msgstr "将嗅探结果作为连接目标"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:191
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:196
msgid "Overwrite Fake-IP Filter"
msgstr "覆盖 Fake-IP 过滤列表"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:301
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:311
msgid "Overwrite Force Sniff Domain Name"
msgstr "覆盖强制嗅探的域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:226
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:233
msgid "Overwrite Hosts"
msgstr "覆盖 Hosts"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:307
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:317
msgid "Overwrite Ignore Sniff Domain Name"
msgstr "覆盖忽略嗅探的域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:245
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:252
msgid "Overwrite Nameserver"
msgstr "覆盖 DNS 服务器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:268
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:275
msgid "Overwrite Nameserver Policy"
msgstr "覆盖 DNS 服务器查询策略"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:313
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:323
msgid "Overwrite Sniff By Protocol"
msgstr "覆盖按协议嗅探"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:134
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:135
msgid "Password"
msgstr "密码"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:487
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:493
msgid "Please go to the editor tab to edit the file for mixin"
msgstr "请前往编辑器标签编辑用于混入的文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:332
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:342
msgid "Port"
msgstr "端口"
@ -594,7 +619,7 @@ msgstr "端口"
msgid "Prefer"
msgstr "优先"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:434
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:443
msgid "Process Name"
msgstr "进程名"
@ -607,7 +632,7 @@ msgstr "配置文件"
msgid "Profile for Startup"
msgstr "用于启动的配置文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:326
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:336
msgid "Protocol"
msgstr "协议"
@ -624,7 +649,7 @@ msgstr "代理提供者:"
msgid "Redirect Mode"
msgstr "Redirect 模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:109
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:110
msgid "Redirect Port"
msgstr "Redirect 端口"
@ -636,7 +661,7 @@ msgstr "重载服务"
msgid "Remote"
msgstr "远程"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:211
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:213
msgid "Respect Rules"
msgstr "遵循分流规则"
@ -648,11 +673,11 @@ msgstr "重启服务"
msgid "Router Proxy"
msgstr "路由器代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:338
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:348
msgid "Rule Config"
msgstr "规则配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:39
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:36
msgid "Rule Mode"
msgstr "规则模式"
@ -660,7 +685,7 @@ msgstr "规则模式"
msgid "Rule Provider:"
msgstr "规则提供者:"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:427
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:436
msgid "Rule Set"
msgstr "规则集"
@ -668,7 +693,7 @@ msgstr "规则集"
msgid "Running"
msgstr "运行中"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:101
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:104
msgid "SOCKS Port"
msgstr "SOCKS 端口"
@ -685,27 +710,27 @@ msgstr "定时重启"
msgid "Scroll To Bottom"
msgstr "滚动到底部"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:316
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:326
msgid "Sniff By Protocol"
msgstr "按协议嗅探"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:295
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:306
msgid "Sniff Pure IP"
msgstr "嗅探纯 IP 连接"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:292
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:301
msgid "Sniff Redir-Host"
msgstr "嗅探 Redir-Host 流量"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:287
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:294
msgid "Sniffer Config"
msgstr "嗅探器配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:143
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:144
msgid "Stack"
msgstr "栈"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:461
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:472
msgid "Standard Loader"
msgstr "标准加载器"
@ -734,15 +759,15 @@ msgstr "订阅链接"
msgid "Subscription:"
msgstr "订阅:"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:56
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:58
msgid "TCP Concurrent"
msgstr "TCP 并发"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:59
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:63
msgid "TCP Keep Alive Idle"
msgstr "TCP Keep Alive 空闲"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:63
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:66
msgid "TCP Keep Alive Interval"
msgstr "TCP Keep Alive 间隔"
@ -755,11 +780,11 @@ msgstr "TCP 代理模式"
msgid "TPROXY Mode"
msgstr "TPROXY 模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:113
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114
msgid "TPROXY Port"
msgstr "TPROXY 端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:138
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:139
msgid "TUN Config"
msgstr "TUN 配置"
@ -784,9 +809,9 @@ msgstr "透明代理"
msgid "Transparent Proxy with Mihomo on OpenWrt."
msgstr "在 OpenWrt 上使用 Mihomo 进行透明代理。"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:259
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:424
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:266
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:370
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:434
msgid "Type"
msgstr "类型"
@ -794,15 +819,15 @@ msgstr "类型"
msgid "UDP Proxy Mode"
msgstr "UDP 代理模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:72
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:74
msgid "UI Name"
msgstr "UI 名称"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:69
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:71
msgid "UI Path"
msgstr "UI 路径"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:74
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:76
msgid "UI Url"
msgstr "UI 下载地址"
@ -822,7 +847,7 @@ msgstr "更新时间"
msgid "Update Dashboard"
msgstr "更新面板"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:403
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:413
msgid "Update Interval"
msgstr "更新间隔"
@ -830,15 +855,15 @@ msgstr "更新间隔"
msgid "Upload Profile"
msgstr "上传配置文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:366
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:376
msgid "Url"
msgstr "下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:228
msgid "Use Hosts"
msgstr "使用 Hosts"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223
msgid "Use System Hosts"
msgstr "使用系统的 Hosts"
@ -850,6 +875,6 @@ msgstr "已使用"
msgid "User Agent"
msgstr "用户代理UA"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:131
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:132
msgid "Username"
msgstr "用户名"

View File

@ -2,7 +2,7 @@
'use strict';
import { popen } from 'fs';
import { access, popen } from 'fs';
const methods = {
version: {
@ -28,15 +28,29 @@ const methods = {
core = trim(process.read('all'));
process.close();
}
return { success: true, app: app, core: core };
return { app: app, core: core };
}
},
profile: {
call: function() {
let profile = {};
const filepath = '/etc/nikki/run/config.yaml';
if (access(filepath, 'r')) {
const process = popen(`yq -p yaml -o json < ${filepath}`);
if (process != null) {
profile = json(process.read('all'));
process.close();
}
}
return profile;
}
},
update_subscription: {
args: { section_id: 'section_id' },
call: function(req) {
let success = false;
if (req.args?.section_id) {
const section_id = req.args?.section_id;
const section_id = req.args?.section_id;
if (section_id) {
success = system(['service', 'nikki', 'update_subscription', section_id]) == 0;
}
return { success: success };

View File

@ -54,7 +54,6 @@
border-radius: 3px; /* Add slight rounding */
background-color: #fff; /* Set background color */
vertical-align: middle; /* Align vertically in the middle */
appearance: none; /* Remove default styling */
position: relative; /* Ensure relative positioning */
}

View File

@ -10,8 +10,8 @@ THEME_TITLE:=Kucat Theme
PKG_NAME:=luci-theme-$(THEME_NAME)
LUCI_TITLE:=Kucat Theme by sirpdboy
LUCI_DEPENDS:=
PKG_VERSION:=2.5.5
PKG_RELEASE:=20250301
PKG_VERSION:=2.5.6
PKG_RELEASE:=20250304
define Package/luci-theme-$(THEME_NAME)/postinst
#!/bin/sh

View File

@ -27,7 +27,7 @@
--radius1: 0.375rem;
--radius2: 0.25rem;
--primary-solid: #fd8c73;
--menu-hover-barbgcolor: rgba(255, 255, 255, 0.3)
--menu-hover-barbgcolor: rgba(255, 255, 255, 0.3);
}
[data-theme='light'] {
@ -37,6 +37,7 @@
--menu-hover-color: #fff;
--menu-item-titlebg-color: rgba(var(--primary-rgbm), 0.22);
--menu-barbgcolor: rgba(var(--primary-rgbm), var(--primary-rgbm-ts));
--title-color: #65656b;
--body-text-color: #3c4655;
--body-color: #65656b;
--body-hover-bgcolor: rgba(50, 50, 50, 0.05);
@ -48,28 +49,29 @@
--input-boxhovercolor: rgba(0, 0, 0, 0.22);
--input-checkcolor: rgba(var(--primary-rgbm), 1);
--font-apple: -apple-system, "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif";
--font-sans: "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"
--font-sans: "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB";
}
[data-theme="dark"] {
--primarytextcolor: #bbb;
--primary-title-color: #ddd;
--menu-color: #d3d3d3;
--menu-color: #ccc;
--menu-hover-color: #eee;
--menu-item-titlebg-color: rgba(var(--primary-rgbm), 0.4);
--menu-barbgcolor: rgba(var(--primary-rgbm), var(--primary-rgbm-ts));
--body-text-color: #ccc;
--title-color: #f5f5f5;
--body-text-color: #bbb;
--body-color: #bbb;
--body-hover-bgcolor: rgba(255, 255, 255, 0.05);
--inputbg-color: rgba(255, 255, 255, 0.11);
--inputtext-color: #bbb;
--inputtext-color: #ccc;
--inputborder-color: rgba(255, 255, 255, 0.2);
--input-bgcolor: rgba(50, 50, 50, 0.2);
--input-boxcolor: rgba(255, 255, 255, 0.15);
--input-boxhovercolor: rgba(255, 255, 255, 0.22);
--input-checkcolor: rgba(255, 255, 255, 0.7);
--font-apple: -apple-system, "Google Sans", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif";
--font-sans: "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB"
--font-sans: "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif", "Helvetica Neue", "Helvetica", "Hiragino Sans GB";
}
.tr {
@ -840,7 +842,7 @@ span[data-indicator="poll-status"],
.success {
background-color: #1a8361 !important;
color: #eee;
width: 12rem !important
width: 14rem !important
}
#log_textarea {
@ -925,7 +927,7 @@ span[data-indicator="poll-status"],
white-space: nowrap;
cursor: pointer;
transition: all .2s;
position: relative
position: relative;
font-size: var(--font-z)
}
@ -2075,11 +2077,11 @@ button:active{
line-height: 1;
width: 2.5rem !important;
padding: 5px !important;
color: var(--inputtext-color);
color:#E91E63;
border: 0px solid var(--inputborder-color);
border-right: 1px solid var(--inputborder-color);
border-top: 1px solid var(--inputborder-color);
border-bottom: 1px solid var(--inputborder-color);
border-right: 1px solid var(--inputborder-color);
border-top: 1px solid var(--inputborder-color);
border-bottom: 1px solid var(--inputborder-color);
border-radius: 0 var(--radius2) var(--radius2) 0;
outline: 0;
background-color: var(--inputbg-color);
@ -2563,12 +2565,12 @@ input {
.modal>pre,
.modal>textarea {
font-size: var(--font-z);
font-size-adjust: .35;
font-size: var(--font-x);
overflow: auto;
margin-bottom: .5em;
padding: 8.5px;
cursor: auto;
white-space: pre-wrap;
outline: 0;
}
@ -2813,7 +2815,7 @@ td > .ifacebadge,
.cbi-section em {
font-weight: 600;
color: var(--body-color);
color: var(--title-color);
text-align: center
}
@ -2867,7 +2869,6 @@ textarea {
border-radius: var(--radius2);
word-wrap: break-word;
white-space: pre-wrap;
margin: 0.5rem
}
.cbi-input-textarea:focus,
@ -2905,6 +2906,7 @@ textarea:focus {
display: block;
padding: 2px;
text-decoration: none;
color:#666;
background-color: #cfc
}
@ -2922,8 +2924,9 @@ textarea:focus {
font-style: normal;
display: block;
padding: 2px;
background-color: rgba(255, 255, 255, 0.1) ;
text-decoration: none;
background-color: #eee
}
.uci-change-list var ins,
@ -2998,7 +3001,8 @@ textarea:focus {
min-width: 7rem;
background-color: rgba(var(--primary-rgbm), 0.2);
transform: translate(-50, -50%);
color: var(--body-color) text-align:center !important
color: var(--title-color);
text-align:center !important
}
.ifacebox-head.active {
@ -3017,19 +3021,15 @@ textarea:focus {
.zonebadge {
padding: .2rem !important;
display: inline-block;
min-width: 13rem
}
.zonebadge strong {
font-size: var(--font-x);
color: var(--body-color)
}
.zonebadge .ifacebadge {
margin: .1rem .2rem;
color: var(--menu-color);
/* background-color: #bbb;
border: 1px solid var(--input-boxhovercolor); */
color: var(--title-color);
background-color: #bbb;
border: 1px solid var(--input-boxhovercolor);
}
.zonebadge>input[type="text"] {
@ -3040,12 +3040,19 @@ textarea:focus {
padding: .16rem 1rem;
}
.zonebadge>span,
.zonebadge>em,
.zonebadge>strong {
color: #777;
font-size: var(--font-x);
display: inline-block;
margin: 0 .2rem
}
.zonebadge-empty>strong {
color: var(--title-color) ;
}
.cbi-value-field .cbi-input-checkbox,
.cbi-value-field .cbi-input-radio {
margin-top: .1rem
@ -3968,8 +3975,9 @@ body.lang_pl.node-main-login .cbi-value-title {
[data-page="admin-services-vssr"]>.main .block,
.main .block {
color: var(--body-color);
background-color: var(--inputbg-color) !important;
box-shadow: 0 0 4px var(--inputborder-color);
background-color: var(--input-bgcolor) !important;
box-shadow: 0 0 1px var(--inputborder-color);
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.32), 0 1px 5px 0 rgba(0, 0, 0, 0.2)
}
[data-page="admin-services-shadowsocksr"]>.block:active,
@ -3980,7 +3988,7 @@ body.lang_pl.node-main-login .cbi-value-title {
.block:hover,
[data-page="admin-services-bypass"]>.main .block:hover,
.main .block:hover {
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 4px 6px var(--input-boxhovercolor);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 4px 6px rgba(0, 0, 0, 0.35);
background-color: var(--input-boxhovercolor) !important;
}
@ -4147,6 +4155,21 @@ pre.command-output {
display: block
}
[data-page="admin-store-pages"] .cbi-section>.tags-container>.tags-value,
[data-page="admin-store-pages"] .cbi-section>.sort-container>.sort-value {
flex: none;
}
[data-page="admin-store-pages"] .app-container .app-btns .app-btn {
padding: 0.5rem;
line-height: 1.4;
}
[data-page="admin-system-package-manager"] .modal>textarea {
white-space: nowrap;
}
.main>.main-left,
.cbi-section,
[data-tab-title],
@ -4219,7 +4242,7 @@ div#service_status {
div#add_link_div {
position: fixed;
transform: translate(-50%, -50%);
background-color: #fff;
background-color: rgba(var(--primary-rgbbody), 1);
padding: 0px;
box-shadow: darkgrey 1px 5px 20px 0px;
border-radius: 9px
@ -4370,7 +4393,7 @@ div#add_link_div {
@media screen and (max-width:992px) {
.main .main-left .nav .slide .slide-menu .active a {
font-size: var(--font-z)
font-size: var(--font-x)
}
@ -4395,7 +4418,7 @@ div#add_link_div {
#diag-rc-output>pre,
#command-rc-output>pre,
[data-page="admin-services-wol"] .notice code {
font-size: var(--font-z)
font-size: var(--font-x)
}
.main-left {
@ -4508,7 +4531,7 @@ div#add_link_div {
.cbi-section>h3:first-child,
.panel-title {
font-size: var(--font-d);
font-size: var(--font-z);
padding-bottom: 0.5rem
}
@ -4637,7 +4660,8 @@ div#add_link_div {
padding-left: 0.3rem;
padding-top: 0.8rem;
width: 100%;
font-weight: 700;
margin-bottom: 0.2rem;
font-weight: 600;
}
.cbi-section {
@ -4661,7 +4685,7 @@ div#add_link_div {
h3 {
margin: 0;
font-size: var(--font-x);
font-size: var(--font-z);
line-height: 1.2rem !important;
letter-spacing: 0.02rem
}
@ -4683,30 +4707,38 @@ div#add_link_div {
.hide-xs:not([data-title="MAC-Address"]) {
display: none
}
[data-page="admin-status-overview"] >.main #view td:nth-child(1),
.cbi-value-title {
display: block;
min-width: 0 !important;
text-align: left
[data-page="admin-system-admin-password"] .control-group{
flex-wrap: nowrap;
}
.cbi-value-title,
.cbi-value-description,
.cbi-value-field,
.cbi-value-field .cbi-dropdown,
.cbi-value-field .cbi-input-select,
.cbi-value input[type="text"] {
width: 100%;
}
.cbi-input-textarea,
textarea,
.cbi-value-description,
.cbi-value-field,
.cbi-value-field .cbi-dropdown,
.cbi-value-field .cbi-input-select,
.cbi-value input[type="text"],
.cbi-value input[type="password"] {
width:16rem;
text-align: left;
min-width: 8rem;
margin: 0;
}
[data-page="admin-status-overview"] .main #view td:nth-child(1) {
width: 5rem;
padding-right: 0.4rem
}
.cbi-value-title,
.cbi-value-field {
padding: 0 !important;
line-height: 1
display: inline-block;
line-height: 1;
text-align: left;
}
.cbi-value-description {
display: none !important
}
.cbi-value-field>div {
@ -4717,11 +4749,8 @@ div#add_link_div {
#diag-rc-output > pre,
#command-rc-output > pre,
[data-page="admin-services-wol"] .notice code {
font-size: .8rem !important;
font-size: var(--font-x) !important;
}
.cbi-value-description {
display: none !important
}
.cbi-dynlist p {
padding: 0.5rem 1rem
@ -4756,12 +4785,6 @@ div#add_link_div {
padding-right: 0.2rem
}
.cbi-value-description {
width: 100%;
display: block
}
.Diagnostics form .cbi-map .cbi-section div {
width: 100% !important
}
@ -4776,7 +4799,7 @@ div#add_link_div {
select,
input {
font-size: var(--font-z);
font-size: var(--font-x);
box-sizing: border-box;
min-width: unset
}
@ -4869,3 +4892,38 @@ div#add_link_div {
margin-left: 16rem
}
}
/* luci-mod-dashboard */
.Dashboard .dashboard-bg {
background-color: rgba(var(--primary-rgbm), var(--primary-rgbs-ts));
background-color: rgba(var(--primary-rgbbody), 1)important;
}
.Dashboard h3 {
color: var(--primary-title-color)important;
border-radius: 0 0 16px 16px;
}
.Dashboard:not(.some-other-class) {
color: #666a88 !important;
}
.Dashboard .title {
background-color: rgba(var(--primary-rgbm), 0.1) !important;
border-radius: 16px;
}
.Dashboard span.label.label-success {
background-color: #55bb55;
}
.Dashboard .devices-list .devices-info, .Dashboard .router-status-wifi .wifi-info > hr:last-child {
margin-top: 0.575rem;
}
@media screen and (max-width: 600px) {
div#content-filemanager {
overflow-x: auto;
}
}

View File

@ -1,13 +1,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=nikki
PKG_RELEASE:=7
PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git
PKG_SOURCE_DATE:=2025-02-21
PKG_SOURCE_VERSION:=5830afcbdeeb6c05a3faa56d33353282b8d1f50c
PKG_MIRROR_HASH:=3f5c8aaad3959f77ab3099e0a3d76ca7329e073e1f877720b7c42360c66954c9
PKG_SOURCE_DATE:=2025-03-02
PKG_SOURCE_VERSION:=a7e56f1c431b8f17f98eb4d81bfc784a5f1ebc4c
PKG_MIRROR_HASH:=e6ffc7355fadff8ae93151d016df9b61a618cd4a7125d06f8e1f63f3e70d7b74
PKG_LICENSE:=GPL3.0+
PKG_MAINTAINER:=Joseph Mory <morytyann@gmail.com>
@ -16,7 +16,7 @@ PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_PARALLEL:=1
PKG_BUILD_FLAGS:=no-mips16
PKG_BUILD_VERSION:=alpha-5830afc
PKG_BUILD_VERSION:=alpha-a7e56f1
PKG_BUILD_TIME:=$(shell date -u -Iseconds)
GO_PKG:=github.com/metacubex/mihomo

View File

@ -8,7 +8,6 @@ config config 'config'
option 'scheduled_restart' '0'
option 'cron_expression' '0 3 * * *'
option 'test_profile' '1'
option 'mixin' '1'
config proxy 'proxy'
option 'transparent_proxy' '1'
@ -17,8 +16,8 @@ config proxy 'proxy'
option 'ipv4_dns_hijack' '1'
option 'ipv6_dns_hijack' '1'
option 'ipv4_proxy' '1'
option 'ipv6_proxy' '0'
option 'fake_ip_ping_hijack' '0'
option 'ipv6_proxy' '1'
option 'fake_ip_ping_hijack' '1'
option 'router_proxy' '1'
option 'lan_proxy' '1'
option 'access_control_mode' 'all'
@ -55,17 +54,10 @@ config mixin 'mixin'
option 'log_level' 'warning'
option 'mode' 'rule'
option 'match_process' 'off'
option 'outbound_interface' ''
option 'ipv6' '0'
option 'unify_delay' '1'
option 'tcp_concurrent' '1'
option 'tcp_keep_alive_idle' '600'
option 'tcp_keep_alive_interval' '15'
option 'ipv6' '1'
option 'ui_path' 'ui'
option 'ui_name' ''
option 'ui_url' 'https://github.com/Zephyruso/zashboard/archive/refs/heads/gh-pages.zip'
option 'api_port' '9090'
option 'api_secret' ''
option 'api_listen' '[::]:9090'
option 'selection_cache' '1'
option 'allow_lan' '1'
option 'http_port' '8080'
@ -76,14 +68,10 @@ config mixin 'mixin'
option 'authentication' '1'
option 'tun_device' 'nikki'
option 'tun_stack' 'system'
option 'tun_mtu' '9000'
option 'tun_gso' '1'
option 'tun_gso_max_size' '65536'
option 'tun_dns_hijack' '0'
list 'tun_dns_hijacks' 'tcp://any:53'
list 'tun_dns_hijacks' 'udp://any:53'
option 'tun_endpoint_independent_nat' '0'
option 'dns_port' '1053'
option 'dns_listen' '[::]:1053'
option 'dns_ipv6' '1'
option 'dns_mode' 'fake-ip'
option 'fake_ip_range' '198.18.0.1/16'
@ -91,32 +79,14 @@ config mixin 'mixin'
list 'fake_ip_filters' '+.lan'
list 'fake_ip_filters' '+.local'
option 'fake_ip_cache' '1'
option 'dns_respect_rules' '0'
option 'dns_doh_prefer_http3' '0'
option 'dns_system_hosts' '0'
option 'dns_hosts' '1'
option 'hosts' '0'
option 'dns_nameserver' '0'
option 'dns_nameserver_policy' '0'
option 'sniffer' '0'
option 'sniffer_sniff_dns_mapping' '1'
option 'sniffer_sniff_pure_ip' '1'
option 'sniffer_overwrite_destination' '0'
option 'sniffer_force_domain_name' '0'
option 'sniffer_force_domain_names' ''
option 'sniffer_ignore_domain_name' '0'
option 'sniffer_ignore_domain_names' ''
option 'sniffer_sniff' '0'
option 'rule' '0'
option 'rule_provider' '0'
option 'geoip_format' 'dat'
option 'geodata_loader' 'memconservative'
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'
config env 'env'

View File

@ -44,11 +44,10 @@ start_service() {
log "App" "Start."
# get config
## app config
local scheduled_restart cron_expression profile mixin test_profile fast_reload
local scheduled_restart cron_expression profile test_profile fast_reload
config_get_bool scheduled_restart "config" "scheduled_restart" 0
config_get cron_expression "config" "cron_expression"
config_get profile "config" "profile"
config_get_bool mixin "config" "mixin" 0
config_get_bool test_profile "config" "test_profile" 0
config_get_bool fast_reload "config" "fast_reload" 0
## mixin config
@ -94,13 +93,7 @@ start_service() {
return
fi
# mixin
if [ "$mixin" == 0 ]; then
log "Mixin" "Disabled."
log "Mixin" "Mixin neccesary config."
else
log "Mixin" "Enabled."
log "Mixin" "Mixin all config."
fi
log "Mixin" "Mixin config."
if [ "$mixin_file_content" == 0 ]; then
ucode -S "$MIXIN_UC" | yq -M -p json -o yaml | yq -M -i ea '... comments="" | . as $item ireduce ({}; . * $item ) | .rules = .nikki-rules + .rules | del(.nikki-rules)' "$RUN_PROFILE_PATH" -
elif [ "$mixin_file_content" == 1 ]; then
@ -110,9 +103,9 @@ start_service() {
if [ "$test_profile" == 1 ]; then
log "Profile" "Testing..."
if ($PROG -d "$RUN_DIR" -t >> "$CORE_LOG_PATH" 2>&1); then
log "Profile" "Test passed!"
log "Profile" "Test passed."
else
log "Profile" "Test failed!"
log "Profile" "Test failed."
log "Profile" "Please check the core log to find out the problem."
log "App" "Exit."
return
@ -166,26 +159,11 @@ service_started() {
config_get tun_device "mixin" "tun_device" "nikki"
## proxy config
### transparent proxy
local tcp_transparent_proxy_mode udp_transparent_proxy_mode ipv4_dns_hijack ipv6_dns_hijack ipv4_proxy ipv6_proxy router_proxy lan_proxy
local tcp_transparent_proxy_mode udp_transparent_proxy_mode ipv4_proxy ipv6_proxy
config_get tcp_transparent_proxy_mode "proxy" "tcp_transparent_proxy_mode" "redirect"
config_get udp_transparent_proxy_mode "proxy" "udp_transparent_proxy_mode" "tun"
config_get_bool ipv4_dns_hijack "proxy" "ipv4_dns_hijack" 0
config_get_bool ipv6_dns_hijack "proxy" "ipv6_dns_hijack" 0
config_get_bool ipv4_proxy "proxy" "ipv4_proxy" 0
config_get_bool ipv6_proxy "proxy" "ipv6_proxy" 0
config_get_bool router_proxy "proxy" "router_proxy" 0
config_get_bool lan_proxy "proxy" "lan_proxy" 0
### access control
local access_control_mode
config_get access_control_mode "proxy" "access_control_mode"
### bypass
local bypass_user bypass_group bypass_china_mainland_ip proxy_tcp_dport proxy_udp_dport bypass_dscp
config_get bypass_user "proxy" "bypass_user"
config_get bypass_group "proxy" "bypass_group"
config_get_bool bypass_china_mainland_ip "proxy" "bypass_china_mainland_ip" 0
config_get proxy_tcp_dport "proxy" "proxy_tcp_dport" "0-65535"
config_get proxy_udp_dport "proxy" "proxy_udp_dport" "0-65535"
config_get bypass_dscp "proxy" "bypass_dscp"
# prepare
local tproxy_enable; tproxy_enable=0
if [[ "$tcp_transparent_proxy_mode" == "tproxy" || "$udp_transparent_proxy_mode" == "tproxy" ]]; then
@ -197,12 +175,10 @@ service_started() {
fi
# transparent proxy
log "Transparent Proxy" "Enabled."
log "Transparent Proxy" "TCP Mode: $tcp_transparent_proxy_mode."
log "Transparent Proxy" "UDP Mode: $udp_transparent_proxy_mode."
# wait for tun device online
if [ "$tun_enable" == 1 ]; then
log "Transparent Proxy" "Waiting for tun device online..."
local tun_timeout; tun_timeout=60
local tun_timeout; tun_timeout=15
local tun_interval; tun_interval=1
while [ "$tun_timeout" -gt 0 ]; do
if (ip link show dev "$tun_device" > /dev/null 2>&1); then
@ -242,51 +218,14 @@ service_started() {
fi
$FIREWALL_INCLUDE_SH
fi
# hijack
utpl -D nikki_group="$NIKKI_GROUP" -D tproxy_fw_mark="$TPROXY_FW_MARK" -D tun_fw_mark="$TUN_FW_MARK" -S "$HIJACK_UT" | nft -f -
# dns hijack
if [ "$ipv4_dns_hijack" == 1 ]; then
log "Transparent Proxy" "Hijack IPv4 dns request."
fi
if [ "$ipv6_dns_hijack" == 1 ]; then
log "Transparent Proxy" "Hijack IPv6 dns request."
fi
# proxy
if [ "$ipv4_proxy" == 1 ]; then
log "Transparent Proxy" "Proxy IPv4 traffic."
fi
if [ "$ipv6_proxy" == 1 ]; then
log "Transparent Proxy" "Proxy IPv6 traffic."
fi
# bypass
if [ -n "$bypass_user" ]; then
log "Transparent Proxy" "Bypass user: $bypass_user."
fi
if [ -n "$bypass_group" ]; then
log "Transparent Proxy" "Bypass group: $bypass_group."
fi
if [ "$bypass_china_mainland_ip" == 1 ]; then
log "Transparent Proxy" "Bypass china mainland ip."
fi
log "Transparent Proxy" "Destination TCP Port to Proxy: $proxy_tcp_dport."
log "Transparent Proxy" "Destination UDP Port to Proxy: $proxy_udp_dport."
if [ -n "$bypass_dscp" ]; then
log "Transparent Proxy" "Bypass DSCP: $bypass_dscp."
fi
# router proxy
if [ "$router_proxy" == 1 ]; then
log "Transparent Proxy" "Set proxy for router."
fi
# lan proxy
if [ "$lan_proxy" == 1 ]; then
log "Transparent Proxy" "Set proxy for lan."
# access control
if [ "$access_control_mode" == "all" ]; then
log "Transparent Proxy" "Access Control is using all mode, set proxy for all client."
elif [ "$access_control_mode" == "allow" ]; then
log "Transparent Proxy" "Access Control is using allow mode, set proxy for client which is in acl."
elif [ "$access_control_mode" == "block" ]; then
log "Transparent Proxy" "Access Control is using block mode, set proxy for client which is not in acl."
fi
# check hijack
if (nft list tables | grep -q nikki); then
log "Transparent Proxy" "Hijack successful."
else
log "Transparent Proxy" "Hijack failed."
log "App" "Exit."
fi
# fix compatible between tproxy and dockerd (kmod-br-netfilter)
if [ "$tproxy_enable" == 1 ] && (lsmod | grep -q br_netfilter); then

View File

@ -16,7 +16,52 @@ uci show nikki | grep -E 'nikki.@rule\[[[:digit:]]+\].match=' | sed 's/nikki.@ru
# since v1.19.1
fake_ip_ping_hijack=$(uci -q get nikki.proxy.fake_ip_ping_hijack); [ -z "$fake_ip_ping_hijack" ] && uci set nikki.proxy.fake_ip_ping_hijack=0
proxy_fake_ip_ping_hijack=$(uci -q get nikki.proxy.fake_ip_ping_hijack); [ -z "$proxy_fake_ip_ping_hijack" ] && uci set nikki.proxy.fake_ip_ping_hijack=0
# since v1.20.0
mixin=$(uci -q get nikki.config.mixin); [ -n "$mixin" ] && {
uci del nikki.config.mixin
[ "$mixin" == "0" ] && {
uci del nikki.mixin.unify_delay
uci del nikki.mixin.tcp_concurrent
uci del nikki.mixin.tcp_keep_alive_idle
uci del nikki.mixin.tcp_keep_alive_interval
uci set nikki.mixin.fake_ip_filter=0
uci del nikki.mixin.fake_ip_filter_mode
uci del nikki.mixin.dns_respect_rules
uci del nikki.mixin.dns_doh_prefer_http3
uci del nikki.mixin.dns_system_hosts
uci del nikki.mixin.dns_hosts
uci set nikki.mixin.hosts=0
uci set nikki.mixin.dns_nameserver=0
uci set nikki.mixin.dns_nameserver_policy=0
uci del nikki.mixin.sniffer
uci del nikki.mixin.sniffer_sniff_dns_mapping
uci del nikki.mixin.sniffer_sniff_pure_ip
uci set nikki.mixin.sniffer_force_domain_name=0
uci set nikki.mixin.sniffer_ignore_domain_name=0
uci set nikki.mixin.sniffer_sniff=0
uci del nikki.mixin.geoip_format
uci del nikki.mixin.geodata_loader
uci del nikki.mixin.geosite_url
uci del nikki.mixin.geoip_mmdb_url
uci del nikki.mixin.geoip_dat_url
uci del nikki.mixin.geoip_asn_url
uci del nikki.mixin.geox_auto_update
uci del nikki.mixin.geox_update_interval
}
}
mixin_api_port=$(uci -q get nikki.mixin.api_port); [ -n "$mixin_api_port" ] && {
uci del nikki.mixin.api_port
uci set nikki.mixin.api_listen=[::]:$mixin_api_port
}
mixin_dns_port=$(uci -q get nikki.mixin.dns_port); [ -n "$mixin_dns_port" ] && {
uci del nikki.mixin.dns_port
uci set nikki.mixin.dns_listen=[::]:$mixin_dns_port
}
# commit
uci commit nikki

View File

@ -8,8 +8,8 @@
import { connect } from 'ubus';
import { uci_bool, uci_array } from '/etc/nikki/ucode/include.uc';
let users = map(split(readfile('/etc/passwd'), '\n'), (x) => split(x, ':')[0]);
let groups = map(split(readfile('/etc/group'), '\n'), (x) => split(x, ':')[0]);
const users = map(split(readfile('/etc/passwd'), '\n'), (x) => split(x, ':')[0]);
const groups = map(split(readfile('/etc/group'), '\n'), (x) => split(x, ':')[0]);
const uci = cursor();
const ubus = connect();
@ -19,7 +19,8 @@
const redir_port = uci.get('nikki', 'mixin', 'redir_port');
const tproxy_port = uci.get('nikki', 'mixin', 'tproxy_port');
const dns_port = uci.get('nikki', 'mixin', 'dns_port');
const dns_listen = uci.get('nikki', 'mixin', 'dns_listen');
const dns_port = substr(dns_listen, rindex(dns_listen, ':') + 1);
const fake_ip_range = uci.get('nikki', 'mixin', 'fake_ip_range');
const tun_device = uci.get('nikki', 'mixin', 'tun_device');

View File

@ -1,5 +1,9 @@
export function uci_bool(obj) {
return obj == '1';
return obj == null ? null : obj == '1';
};
export function uci_int(obj) {
return obj == null ? null : int(obj);
};
export function uci_array(obj) {
@ -36,7 +40,7 @@ export function trim_all(obj) {
delete obj[key];
}
}
if (length(obj_keys) == 0) {
if (length(keys(obj)) == 0) {
return null;
}
return obj;

View File

@ -4,39 +4,35 @@
import { cursor } from 'uci';
import { connect } from 'ubus';
import { uci_bool, uci_array, trim_all } from '/etc/nikki/ucode/include.uc';
import { uci_bool, uci_int, uci_array, trim_all } from '/etc/nikki/ucode/include.uc';
const uci = cursor();
const ubus = connect();
const config = {};
const mixin = uci_bool(uci.get('nikki', 'config', 'mixin'));
config['log-level'] = uci.get('nikki', 'mixin', 'log_level') ?? 'info';
config['mode'] = uci.get('nikki', 'mixin', 'mode') ?? 'rule';
config['find-process-mode'] = uci.get('nikki', 'mixin', 'match_process') ?? 'off';
config['interface-name'] = ubus.call('network.interface', 'status', {'interface': uci.get('nikki', 'mixin', 'outbound_interface')})?.l3_device ?? '';
config['log-level'] = uci.get('nikki', 'mixin', 'log_level');
config['mode'] = uci.get('nikki', 'mixin', 'mode');
config['find-process-mode'] = uci.get('nikki', 'mixin', 'match_process');
config['interface-name'] = ubus.call('network.interface', 'status', {'interface': uci.get('nikki', 'mixin', 'outbound_interface')})?.l3_device;
config['ipv6'] = uci_bool(uci.get('nikki', 'mixin', 'ipv6'));
if (mixin) {
config['unified-delay'] = uci_bool(uci.get('nikki', 'mixin', 'unify_delay'));
config['tcp-concurrent'] = uci_bool(uci.get('nikki', 'mixin', 'tcp_concurrent'));
config['keep-alive-idle'] = int(uci.get('nikki', 'mixin', 'tcp_keep_alive_idle') ?? '600');
config['keep-alive-interval'] = int(uci.get('nikki', 'mixin', 'tcp_keep_alive_interval') ?? '15');
}
config['unified-delay'] = uci_bool(uci.get('nikki', 'mixin', 'unify_delay'));
config['tcp-concurrent'] = uci_bool(uci.get('nikki', 'mixin', 'tcp_concurrent'));
config['keep-alive-idle'] = uci_int(uci.get('nikki', 'mixin', 'tcp_keep_alive_idle'));
config['keep-alive-interval'] = uci_int(uci.get('nikki', 'mixin', 'tcp_keep_alive_interval'));
config['external-ui'] = uci.get('nikki', 'mixin', 'ui_path') ?? 'ui';
config['external-ui-name'] = uci.get('nikki', 'mixin', 'ui_name') ?? '';
config['external-ui'] = uci.get('nikki', 'mixin', 'ui_path');
config['external-ui-name'] = uci.get('nikki', 'mixin', 'ui_name');
config['external-ui-url'] = uci.get('nikki', 'mixin', 'ui_url');
config['external-controller'] = '0.0.0.0' + ':' + (uci.get('nikki', 'mixin', 'api_port') ?? '9090');
config['secret'] = uci.get('nikki', 'mixin', 'api_secret') ?? '666666';
config['external-controller'] = uci.get('nikki', 'mixin', 'api_listen');
config['secret'] = uci.get('nikki', 'mixin', 'api_secret');
config['allow-lan'] = uci_bool(uci.get('nikki', 'mixin', 'allow_lan'));
config['port'] = int(uci.get('nikki', 'mixin', 'http_port') ?? '8080');
config['socks-port'] = int(uci.get('nikki', 'mixin', 'socks_port') ?? '1080');
config['mixed-port'] = int(uci.get('nikki', 'mixin', 'mixed_port') ?? '7890');
config['redir-port'] = int(uci.get('nikki', 'mixin', 'redir_port') ?? '7891');
config['tproxy-port'] = int(uci.get('nikki', 'mixin', 'tproxy_port') ?? '7892');
config['port'] = uci_int(uci.get('nikki', 'mixin', 'http_port'));
config['socks-port'] = uci_int(uci.get('nikki', 'mixin', 'socks_port'));
config['mixed-port'] = uci_int(uci.get('nikki', 'mixin', 'mixed_port'));
config['redir-port'] = uci_int(uci.get('nikki', 'mixin', 'redir_port'));
config['tproxy-port'] = uci_int(uci.get('nikki', 'mixin', 'tproxy_port'));
if (uci_bool(uci.get('nikki', 'mixin', 'authentication'))) {
config['authentication'] = [];
@ -54,11 +50,11 @@ if (uci.get('nikki', 'proxy', 'tcp_transparent_proxy_mode') == 'tun' || uci.get(
config['tun']['auto-route'] = false;
config['tun']['auto-redirect'] = false;
config['tun']['auto-detect-interface'] = false;
config['tun']['device'] = uci.get('nikki', 'mixin', 'tun_device') ?? 'nikki';
config['tun']['stack'] = uci.get('nikki', 'mixin', 'tun_stack') ?? 'system';
config['tun']['mtu'] = int(uci.get('nikki', 'mixin', 'tun_mtu') ?? '9000');
config['tun']['device'] = uci.get('nikki', 'mixin', 'tun_device');
config['tun']['stack'] = uci.get('nikki', 'mixin', 'tun_stack');
config['tun']['mtu'] = uci_int(uci.get('nikki', 'mixin', 'tun_mtu'));
config['tun']['gso'] = uci_bool(uci.get('nikki', 'mixin', 'tun_gso'));
config['tun']['gso-max-size'] = int(uci.get('nikki', 'mixin', 'tun_gso_max_size') ?? '65536');
config['tun']['gso-max-size'] = uci_int(uci.get('nikki', 'mixin', 'tun_gso_max_size'));
config['tun']['endpoint-independent-nat'] = uci_bool(uci.get('nikki', 'mixin', 'tun_endpoint_independent_nat'));
if (uci_bool(uci.get('nikki', 'mixin', 'tun_dns_hijack'))) {
config['tun']['dns-hijack'] = uci_array(uci.get('nikki', 'mixin', 'tun_dns_hijacks'));
@ -69,77 +65,73 @@ if (uci.get('nikki', 'proxy', 'tcp_transparent_proxy_mode') == 'tun' || uci.get(
config['dns'] = {};
config['dns']['enable'] = true;
config['dns']['listen'] = '0.0.0.0' + ':' + (uci.get('nikki', 'mixin', 'dns_port') ?? '1053');
config['dns']['listen'] = uci.get('nikki', 'mixin', 'dns_listen');
config['dns']['ipv6'] = uci_bool(uci.get('nikki', 'mixin', 'dns_ipv6'));
config['dns']['enhanced-mode'] = uci.get('nikki', 'mixin', 'dns_mode') ?? 'redir-host';
config['dns']['fake-ip-range'] = uci.get('nikki', 'mixin', 'fake_ip_range') ?? '198.18.0.1/16';
config['dns']['enhanced-mode'] = uci.get('nikki', 'mixin', 'dns_mode');
config['dns']['fake-ip-range'] = uci.get('nikki', 'mixin', 'fake_ip_range');
if (uci_bool(uci.get('nikki', 'mixin', 'fake_ip_filter'))) {
config['dns']['fake-ip-filter'] = uci_array(uci.get('nikki', 'mixin', 'fake_ip_filters'));
config['dns']['fake-ip-filter-mode'] = uci.get('nikki', 'mixin', 'fake_ip_filter_mode') ?? 'blacklist';
}
if (mixin) {
config['dns']['respect-rules'] = uci_bool(uci.get('nikki', 'mixin', 'dns_respect_rules'));
config['dns']['prefer-h3'] = uci_bool(uci.get('nikki', 'mixin', 'dns_doh_prefer_http3'));
config['dns']['use-system-hosts'] = uci_bool(uci.get('nikki', 'mixin', 'dns_system_hosts'));
config['dns']['use-hosts'] = uci_bool(uci.get('nikki', 'mixin', 'dns_hosts'));
if (uci_bool(uci.get('nikki', 'mixin', 'hosts'))) {
config['hosts'] = {};
uci.foreach('nikki', 'hosts', (section) => {
if (!uci_bool(section.enabled)) {
return;
}
config['hosts'][section.domain_name] = uci_array(section.ip);
});
}
if (uci_bool(uci.get('nikki', 'mixin', 'dns_nameserver'))) {
config['dns']['default-nameserver'] = [];
config['dns']['proxy-server-nameserver'] = [];
config['dns']['direct-nameserver'] = [];
config['dns']['nameserver'] = [];
config['dns']['fallback'] = [];
uci.foreach('nikki', 'nameserver', (section) => {
if (!uci_bool(section.enabled)) {
return;
}
push(config['dns'][section.type], ...uci_array(section.nameserver));
})
}
if (uci_bool(uci.get('nikki', 'mixin', 'dns_nameserver_policy'))) {
config['dns']['nameserver-policy'] = {};
uci.foreach('nikki', 'nameserver_policy', (section) => {
if (!uci_bool(section.enabled)) {
return;
}
config['dns']['nameserver-policy'][section.matcher] = uci_array(section.nameserver);
});
}
config['dns']['fake-ip-filter-mode'] = uci.get('nikki', 'mixin', 'fake_ip_filter_mode');
config['dns']['respect-rules'] = uci_bool(uci.get('nikki', 'mixin', 'dns_respect_rules'));
config['dns']['prefer-h3'] = uci_bool(uci.get('nikki', 'mixin', 'dns_doh_prefer_http3'));
config['dns']['use-system-hosts'] = uci_bool(uci.get('nikki', 'mixin', 'dns_system_hosts'));
config['dns']['use-hosts'] = uci_bool(uci.get('nikki', 'mixin', 'dns_hosts'));
if (uci_bool(uci.get('nikki', 'mixin', 'hosts'))) {
config['hosts'] = {};
uci.foreach('nikki', 'hosts', (section) => {
if (!uci_bool(section.enabled)) {
return;
}
config['hosts'][section.domain_name] = uci_array(section.ip);
});
}
if (uci_bool(uci.get('nikki', 'mixin', 'dns_nameserver'))) {
config['dns']['default-nameserver'] = [];
config['dns']['proxy-server-nameserver'] = [];
config['dns']['direct-nameserver'] = [];
config['dns']['nameserver'] = [];
config['dns']['fallback'] = [];
uci.foreach('nikki', 'nameserver', (section) => {
if (!uci_bool(section.enabled)) {
return;
}
push(config['dns'][section.type], ...uci_array(section.nameserver));
})
}
if (uci_bool(uci.get('nikki', 'mixin', 'dns_nameserver_policy'))) {
config['dns']['nameserver-policy'] = {};
uci.foreach('nikki', 'nameserver_policy', (section) => {
if (!uci_bool(section.enabled)) {
return;
}
config['dns']['nameserver-policy'][section.matcher] = uci_array(section.nameserver);
});
}
if (mixin) {
config['sniffer'] = {};
config['sniffer']['enable'] = uci_bool(uci.get('nikki', 'mixin', 'sniffer'));
config['sniffer']['force-dns-mapping'] = uci_bool(uci.get('nikki', 'mixin', 'sniffer_sniff_dns_mapping'));
config['sniffer']['parse-pure-ip'] = uci_bool(uci.get('nikki', 'mixin', 'sniffer_sniff_pure_ip'));
config['sniffer']['override-destination'] = uci_bool(uci.get('nikki', 'mixin', 'sniffer_overwrite_destination'));
if (uci_bool(uci.get('nikki', 'mixin', 'sniffer_force_domain_name'))) {
config['sniffer']['force-domain'] = uci_array(uci.get('nikki', 'mixin', 'sniffer_force_domain_names'));
}
if (uci_bool(uci.get('nikki', 'mixin', 'sniffer_ignore_domain_name'))) {
config['sniffer']['skip-domain'] = uci_array(uci.get('nikki', 'mixin', 'sniffer_ignore_domain_names'));
}
if (uci_bool(uci.get('nikki', 'mixin', 'sniffer_sniff'))) {
config['sniffer']['sniff'] = {};
config['sniffer']['sniff']['HTTP'] = {};
config['sniffer']['sniff']['TLS'] = {};
config['sniffer']['sniff']['QUIC'] = {};
uci.foreach('nikki', 'sniff', (section) => {
if (!uci_bool(section.enabled)) {
return;
}
config['sniffer']['sniff'][section.protocol]['port'] = uci_array(section.port);
config['sniffer']['sniff'][section.protocol]['override-destination'] = uci_bool(section.overwrite_destination);
});
}
config['sniffer'] = {};
config['sniffer']['enable'] = uci_bool(uci.get('nikki', 'mixin', 'sniffer'));
config['sniffer']['force-dns-mapping'] = uci_bool(uci.get('nikki', 'mixin', 'sniffer_sniff_dns_mapping'));
config['sniffer']['parse-pure-ip'] = uci_bool(uci.get('nikki', 'mixin', 'sniffer_sniff_pure_ip'));
if (uci_bool(uci.get('nikki', 'mixin', 'sniffer_force_domain_name'))) {
config['sniffer']['force-domain'] = uci_array(uci.get('nikki', 'mixin', 'sniffer_force_domain_names'));
}
if (uci_bool(uci.get('nikki', 'mixin', 'sniffer_ignore_domain_name'))) {
config['sniffer']['skip-domain'] = uci_array(uci.get('nikki', 'mixin', 'sniffer_ignore_domain_names'));
}
if (uci_bool(uci.get('nikki', 'mixin', 'sniffer_sniff'))) {
config['sniffer']['sniff'] = {};
config['sniffer']['sniff']['HTTP'] = {};
config['sniffer']['sniff']['TLS'] = {};
config['sniffer']['sniff']['QUIC'] = {};
uci.foreach('nikki', 'sniff', (section) => {
if (!uci_bool(section.enabled)) {
return;
}
config['sniffer']['sniff'][section.protocol]['port'] = uci_array(section.port);
config['sniffer']['sniff'][section.protocol]['override-destination'] = uci_bool(section.overwrite_destination);
});
}
config['profile'] = {};
@ -178,29 +170,19 @@ if (uci_bool(uci.get('nikki', 'mixin', 'rule'))) {
if (!uci_bool(section.enabled)) {
return;
}
let rule;
if (length(section.type) > 0) {
rule = `${section.type},${section.matcher},${section.node}`;
} else {
rule = `${section.matcher},${section.node}`;
}
if (uci_bool(section.no_resolve)) {
rule += ',no_resolve';
}
push(config['nikki-rules'], rule);
push(config['nikki-rules'], `${section.type},${section.matcher},${section.node}` + (uci_bool(section.no_resolve) ? ',no_resolve' : ''));
})
}
if (mixin) {
config['geodata-mode'] = uci.get('nikki', 'mixin', 'geoip_format') == 'dat';
config['geodata-loader'] = uci.get('nikki', 'mixin', 'geodata_loader') ?? 'memconservative';
config['geox-url'] = {};
config['geox-url']['geosite'] = uci.get('nikki', 'mixin', 'geosite_url');
config['geox-url']['mmdb'] = uci.get('nikki', 'mixin', 'geoip_mmdb_url');
config['geox-url']['geoip'] = uci.get('nikki', 'mixin', 'geoip_dat_url');
config['geox-url']['asn'] = uci.get('nikki', 'mixin', 'geoip_asn_url');
config['geo-auto-update'] = uci_bool(uci.get('nikki', 'mixin', 'geox_auto_update'));
config['geo-update-interval'] = int(uci.get('nikki', 'mixin', 'geox_update_interval') ?? '24');
}
const geoip_format = uci.get('nikki', 'mixin', 'geoip_format');
config['geodata-mode'] = geoip_format == null ? null : geoip_format == 'dat';
config['geodata-loader'] = uci.get('nikki', 'mixin', 'geodata_loader');
config['geox-url'] = {};
config['geox-url']['geosite'] = uci.get('nikki', 'mixin', 'geosite_url');
config['geox-url']['mmdb'] = uci.get('nikki', 'mixin', 'geoip_mmdb_url');
config['geox-url']['geoip'] = uci.get('nikki', 'mixin', 'geoip_dat_url');
config['geox-url']['asn'] = uci.get('nikki', 'mixin', 'geoip_asn_url');
config['geo-auto-update'] = uci_bool(uci.get('nikki', 'mixin', 'geox_auto_update'));
config['geo-update-interval'] = uci_int(uci.get('nikki', 'mixin', 'geox_update_interval'));
print(trim_all(config));

View File

@ -649,23 +649,26 @@ static int handle_get_class_list(struct ubus_context *ctx, struct ubus_object *o
return 0;
}
#define MAX_APPFILTER_STR_LEN 8192
static int handle_get_app_filter(struct ubus_context *ctx, struct ubus_object *obj,
struct ubus_request_data *req, const char *method,
struct blob_attr *msg) {
struct json_object *response = json_object_new_object();
struct json_object *app_list = json_object_new_array();
int i;
struct uci_context *uci_ctx = uci_alloc_context();
if (!uci_ctx) {
printf("Failed to allocate UCI context\n");
return 0;
}
char app_filter_str[1024] = {0};
app_filter_str[0] = '\0';
af_uci_get_list_value(uci_ctx, "appfilter.rule.app_list", app_filter_str, sizeof(app_filter_str), " ");
printf("app_filter_str: %s\n", app_filter_str);
char *app_id_str = strtok(app_filter_str, " ");
char *appfilter_buf = (char *)malloc(MAX_APPFILTER_STR_LEN);
if (!appfilter_buf){
return 0;
}
appfilter_buf[0] = '\0';
struct json_object *response = json_object_new_object();
struct json_object *app_list = json_object_new_array();
af_uci_get_list_value(uci_ctx, "appfilter.rule.app_list", appfilter_buf, MAX_APPFILTER_STR_LEN - 1, " ");
char *app_id_str = strtok(appfilter_buf, " ");
while (app_id_str) {
json_object_array_add(app_list, json_object_new_int(atoi(app_id_str)));
app_id_str = strtok(NULL, " ");
@ -677,6 +680,7 @@ static int handle_get_app_filter(struct ubus_context *ctx, struct ubus_object *o
blobmsg_add_object(&b, response);
ubus_send_reply(ctx, req, b.head);
blob_buf_free(&b);
free(appfilter_buf);
json_object_put(response);
return 0;
}

View File

@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=smartdns
PKG_VERSION:=46
PKG_VERSION:=46.1
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/pymumu/smartdns/tar.gz/Release$(PKG_VERSION)?
PKG_HASH:=6594d21c0e354b67d4b5918e11eff21e6314e247b9e6e28be1ece4168c368fc1
PKG_HASH:=6307503fa409b9c6b87556d1b1f8eaf99c7be5b06a9d479ec3589c875391a6b3
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-Release$(PKG_VERSION)
PKG_MAINTAINER:=Nick Peng <pymumu@gmail.com>