Compare commits

...

2 Commits

Author SHA1 Message Date
gitea-action
73586f1afa nikki: sync upstream
last commit: 0df3fc2941
2025-04-12 13:30:27 +08:00
gitea-action
30cf173156 luci-app-nikki: sync upstream
last commit: 0df3fc2941
2025-04-12 13:30:27 +08:00
15 changed files with 907 additions and 803 deletions

View File

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

View File

@ -37,7 +37,8 @@ return view.extend({
m = new form.Map('nikki', _('Nikki'), `${_('Transparent Proxy with Mihomo on OpenWrt.')} <a href="https://github.com/nikkinikki-org/OpenWrt-nikki/wiki" target="_blank">${_('How To Use')}</a>`); m = new form.Map('nikki', _('Nikki'), `${_('Transparent Proxy with Mihomo on OpenWrt.')} <a href="https://github.com/nikkinikki-org/OpenWrt-nikki/wiki" target="_blank">${_('How To Use')}</a>`);
s = m.section(form.NamedSection, 'status', 'status', _('Status')); s = m.section(form.TableSection, 'status', _('Status'));
s.anonymous = true;
o = s.option(form.Value, '_app_version', _('App Version')); o = s.option(form.Value, '_app_version', _('App Version'));
o.readonly = true; o.readonly = true;
@ -63,28 +64,28 @@ return view.extend({
}); });
}); });
o = s.option(form.Button, 'reload', '-'); o = s.option(form.Button, 'reload');
o.inputstyle = 'action'; o.inputstyle = 'action';
o.inputtitle = _('Reload Service'); o.inputtitle = _('Reload Service');
o.onclick = function () { o.onclick = function () {
return nikki.reload(); return nikki.reload();
}; };
o = s.option(form.Button, 'restart', '-'); o = s.option(form.Button, 'restart');
o.inputstyle = 'negative'; o.inputstyle = 'negative';
o.inputtitle = _('Restart Service'); o.inputtitle = _('Restart Service');
o.onclick = function () { o.onclick = function () {
return nikki.restart(); return nikki.restart();
}; };
o = s.option(form.Button, 'update_dashboard', '-'); o = s.option(form.Button, 'update_dashboard');
o.inputstyle = 'positive'; o.inputstyle = 'positive';
o.inputtitle = _('Update Dashboard'); o.inputtitle = _('Update Dashboard');
o.onclick = function () { o.onclick = function () {
return nikki.updateDashboard(); return nikki.updateDashboard();
}; };
o = s.option(form.Button, 'open_dashboard', '-'); o = s.option(form.Button, 'open_dashboard');
o.inputtitle = _('Open Dashboard'); o.inputtitle = _('Open Dashboard');
o.onclick = function () { o.onclick = function () {
return nikki.openDashboard(); return nikki.openDashboard();

View File

@ -29,8 +29,8 @@ return view.extend({
o = s.taboption('app_log', form.Button, 'clear_app_log'); o = s.taboption('app_log', form.Button, 'clear_app_log');
o.inputstyle = 'negative'; o.inputstyle = 'negative';
o.inputtitle = _('Clear Log'); o.inputtitle = _('Clear Log');
o.onclick = function () { o.onclick = function (_, section_id) {
m.lookupOption('nikki.log._app_log')[0].getUIElement('log').setValue(''); m.lookupOption('_app_log', section_id)[0].getUIElement(section_id).setValue('');
return nikki.clearAppLog(); return nikki.clearAppLog();
}; };
@ -52,8 +52,8 @@ return view.extend({
o = s.taboption('app_log', form.Button, 'scroll_app_log_to_bottom'); o = s.taboption('app_log', form.Button, 'scroll_app_log_to_bottom');
o.inputtitle = _('Scroll To Bottom'); o.inputtitle = _('Scroll To Bottom');
o.onclick = function () { o.onclick = function (_, section_id) {
const element = m.lookupOption('nikki.log._app_log')[0].getUIElement('log').node.firstChild; const element = m.lookupOption('_app_log', section_id)[0].getUIElement(section_id).node.firstChild;
element.scrollTop = element.scrollHeight; element.scrollTop = element.scrollHeight;
}; };
@ -62,8 +62,8 @@ return view.extend({
o = s.taboption('core_log', form.Button, 'clear_core_log'); o = s.taboption('core_log', form.Button, 'clear_core_log');
o.inputstyle = 'negative'; o.inputstyle = 'negative';
o.inputtitle = _('Clear Log'); o.inputtitle = _('Clear Log');
o.onclick = function () { o.onclick = function (_, section_id) {
m.lookupOption('nikki.log._core_log')[0].getUIElement('log').setValue(''); m.lookupOption('_core_log', section_id)[0].getUIElement(section_id).setValue('');
return nikki.clearCoreLog(); return nikki.clearCoreLog();
}; };
@ -85,8 +85,8 @@ return view.extend({
o = s.taboption('core_log', form.Button, 'scroll_core_log_to_bottom'); o = s.taboption('core_log', form.Button, 'scroll_core_log_to_bottom');
o.inputtitle = _('Scroll To Bottom'); o.inputtitle = _('Scroll To Bottom');
o.onclick = function () { o.onclick = function (_, section_id) {
const element = m.lookupOption('nikki.log._core_log')[0].getUIElement('log').node.firstChild; const element = m.lookupOption('_core_log', section_id)[0].getUIElement(section_id).node.firstChild;
element.scrollTop = element.scrollHeight; element.scrollTop = element.scrollHeight;
}; };

View File

@ -61,7 +61,7 @@ return view.extend({
o.value(network.getName()); o.value(network.getName());
} }
o = s.taboption('general', form.ListValue, 'ipv6', _('IPv6')); o = s.taboption('general', form.ListValue, 'ipv6', 'IPv6');
o.optional = true; o.optional = true;
o.placeholder = _('Unmodified'); o.placeholder = _('Unmodified');
o.value('0', _('Disable')); o.value('0', _('Disable'));
@ -233,7 +233,7 @@ return view.extend({
o.placeholder = _('Unmodified'); o.placeholder = _('Unmodified');
o.rmempty = false; o.rmempty = false;
o = s.taboption('dns', form.ListValue, 'dns_ipv6', _('IPv6')); o = s.taboption('dns', form.ListValue, 'dns_ipv6', 'IPv6');
o.optional = true; o.optional = true;
o.placeholder = _('Unmodified'); o.placeholder = _('Unmodified');
o.value('0', _('Disable')); o.value('0', _('Disable'));
@ -309,7 +309,7 @@ return view.extend({
so = o.subsection.option(form.Value, 'domain_name', _('Domain Name')); so = o.subsection.option(form.Value, 'domain_name', _('Domain Name'));
so.rmempty = false; so.rmempty = false;
so = o.subsection.option(form.DynamicList, 'ip', _('IP')); so = o.subsection.option(form.DynamicList, 'ip', 'IP');
o = s.taboption('dns', form.Flag, 'dns_nameserver', _('Overwrite Nameserver')); o = s.taboption('dns', form.Flag, 'dns_nameserver', _('Overwrite Nameserver'));
o.rmempty = false; o.rmempty = false;

View File

@ -22,104 +22,87 @@ return view.extend({
const groups = data[3]?.groups ?? []; const groups = data[3]?.groups ?? [];
const cgroups = data[3]?.cgroups ?? []; const cgroups = data[3]?.cgroups ?? [];
let m, s, o; let m, s, o, so;
m = new form.Map('nikki'); m = new form.Map('nikki');
s = m.section(form.NamedSection, 'proxy', 'proxy', _('Proxy Config')); s = m.section(form.NamedSection, 'proxy', 'proxy', _('Proxy Config'));
s.tab('transparent_proxy', _('Transparent Proxy')); s.tab('proxy', _('Proxy Config'));
o = s.taboption('transparent_proxy', form.Flag, 'transparent_proxy', _('Enable')); o = s.taboption('proxy', form.Flag, 'enabled', _('Enable'));
o.rmempty = false; o.rmempty = false;
o = s.taboption('transparent_proxy', form.ListValue, 'tcp_transparent_proxy_mode', _('TCP Proxy Mode')); o = s.taboption('proxy', form.ListValue, 'tcp_mode', _('TCP Mode'));
o.optional = true; o.optional = true;
o.placeholder = _('Disable'); o.placeholder = _('Disable');
o.value('redirect', _('Redirect Mode')); o.value('redirect', _('Redirect Mode'));
o.value('tproxy', _('TPROXY Mode')); o.value('tproxy', _('TPROXY Mode'));
o.value('tun', _('TUN Mode')); o.value('tun', _('TUN Mode'));
o = s.taboption('transparent_proxy', form.ListValue, 'udp_transparent_proxy_mode', _('UDP Proxy Mode')); o = s.taboption('proxy', form.ListValue, 'udp_mode', _('UDP Mode'));
o.optional = true; o.optional = true;
o.placeholder = _('Disable'); o.placeholder = _('Disable');
o.value('tproxy', _('TPROXY Mode')); o.value('tproxy', _('TPROXY Mode'));
o.value('tun', _('TUN Mode')); o.value('tun', _('TUN Mode'));
o = s.taboption('transparent_proxy', form.Flag, 'ipv4_dns_hijack', _('IPv4 DNS Hijack')); o = s.taboption('proxy', form.Flag, 'ipv4_dns_hijack', _('IPv4 DNS Hijack'));
o.rmempty = false; o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'ipv6_dns_hijack', _('IPv6 DNS Hijack')); o = s.taboption('proxy', form.Flag, 'ipv6_dns_hijack', _('IPv6 DNS Hijack'));
o.rmempty = false; o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'ipv4_proxy', _('IPv4 Proxy')); o = s.taboption('proxy', form.Flag, 'ipv4_proxy', _('IPv4 Proxy'));
o.rmempty = false; o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'ipv6_proxy', _('IPv6 Proxy')); o = s.taboption('proxy', form.Flag, 'ipv6_proxy', _('IPv6 Proxy'));
o.rmempty = false; o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'fake_ip_ping_hijack', _('Fake-IP Ping Hijack')); o = s.taboption('proxy', form.Flag, 'fake_ip_ping_hijack', _('Fake-IP Ping Hijack'));
o.rmempty = false; o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'router_proxy', _('Router Proxy')); s.tab('router', _('Router Proxy'));
o = s.taboption('router', form.Flag, 'router_proxy', _('Enable'));
o.rmempty = false; o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'lan_proxy', _('Lan Proxy')); o = s.taboption('router', form.SectionValue, '_router_access_control', form.TableSection, 'router_access_control', _('Access Control'));
o.rmempty = false;
s.tab('access_control', _('Access Control')); o.subsection.addremove = true;
o.subsection.anonymous = true;
o.subsection.sortable = true;
o = s.taboption('access_control', form.ListValue, 'access_control_mode', _('Mode')); so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
o.value('all', _('All Mode')); so.default = '1';
o.value('allow', _('Allow Mode')); so.rmempty = false;
o.value('block', _('Block Mode'));
o = s.taboption('access_control', form.DynamicList, 'acl_ip', 'IP'); so = o.subsection.option(form.DynamicList, 'user', _('User'));
o.datatype = 'ipmask4';
o.retain = true;
o.depends('access_control_mode', 'allow');
o.depends('access_control_mode', 'block');
for (const mac in hosts) { for (const user of users) {
const host = hosts[mac]; so.value(user);
for (const ip of host.ipaddrs) {
const hint = host.name ?? mac;
o.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
};
}; };
o = s.taboption('access_control', form.DynamicList, 'acl_ip6', 'IP6'); so = o.subsection.option(form.DynamicList, 'group', _('Group'));
o.datatype = 'ipmask6';
o.retain = true;
o.depends('access_control_mode', 'allow');
o.depends('access_control_mode', 'block');
for (const mac in hosts) { for (const group of groups) {
const host = hosts[mac]; so.value(group);
for (const ip of host.ip6addrs) {
const hint = host.name ?? mac;
o.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
};
}; };
o = s.taboption('access_control', form.DynamicList, 'acl_mac', 'MAC'); so = o.subsection.option(form.DynamicList, 'cgroup', _('CGroup'));
o.datatype = 'macaddr';
o.retain = true;
o.depends('access_control_mode', 'allow');
o.depends('access_control_mode', 'block');
for (const mac in hosts) { for (const cgroup of cgroups) {
const host = hosts[mac]; so.value(cgroup);
const hint = host.name ?? host.ipaddrs[0];
o.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac);
}; };
o = s.taboption('access_control', form.DynamicList, 'acl_interface', _('Interface')); so = o.subsection.option(form.Flag, 'proxy', _('Proxy'));
o.multiple = true; so.rmempty = false;
o.optional = true;
o.retain = true; s.tab('lan', _('LAN Proxy'));
o.depends('access_control_mode', 'allow');
o.depends('access_control_mode', 'block'); o = s.taboption('lan', form.Flag, 'lan_proxy', _('Enable'));
o = s.taboption('lan', form.DynamicList, 'lan_inbound_interface', _('Inbound Interface'));
o.rmempty = false;
for (const network of networks) { for (const network of networks) {
if (network.getName() === 'loopback') { if (network.getName() === 'loopback') {
@ -128,26 +111,49 @@ return view.extend({
o.value(network.getName()); o.value(network.getName());
} }
o = s.taboption('lan', form.SectionValue, '_lan_access_control', form.TableSection, 'lan_access_control', _('Access Control'));
o.subsection.addremove = true;
o.subsection.anonymous = true;
o.subsection.sortable = true;
so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
so.default = '1';
so.rmempty = false;
so = o.subsection.option(form.DynamicList, 'ip', 'IP');
for (const mac in hosts) {
const host = hosts[mac];
for (const ip of host.ipaddrs) {
const hint = host.name ?? mac;
so.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
};
};
so = o.subsection.option(form.DynamicList, 'ip6', 'IP6');
for (const mac in hosts) {
const host = hosts[mac];
for (const ip of host.ip6addrs) {
const hint = host.name ?? mac;
so.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
};
};
so = o.subsection.option(form.DynamicList, 'mac', 'MAC');
for (const mac in hosts) {
const host = hosts[mac];
const hint = host.name ?? host.ipaddrs[0];
so.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac);
};
so = o.subsection.option(form.Flag, 'proxy', _('Proxy'));
so.rmempty = false;
s.tab('bypass', _('Bypass')); s.tab('bypass', _('Bypass'));
o = s.taboption('bypass', form.DynamicList, 'bypass_user', _('Bypass User'));
for (const user of users) {
o.value(user);
};
o = s.taboption('bypass', form.DynamicList, 'bypass_group', _('Bypass Group'));
for (const group of groups) {
o.value(group);
};
o = s.taboption('bypass', form.DynamicList, 'bypass_cgroup', _('Bypass cgroup'));
for (const cgroup of cgroups) {
o.value(cgroup);
};
o = s.taboption('bypass', form.Flag, 'bypass_china_mainland_ip', _('Bypass China Mainland IP')); o = s.taboption('bypass', form.Flag, 'bypass_china_mainland_ip', _('Bypass China Mainland IP'));
o.rmempty = false; o.rmempty = false;

View File

@ -1,33 +1,29 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8" msgstr "Content-Type: text/plain; charset=UTF-8"
#: 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 "API Listen" msgid "API Listen"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:125 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:126
msgid "API Secret" msgid "API Secret"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:70 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:114
msgid "Access Control" msgid "Access Control"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:73 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
msgid "All Mode" #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:159
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:164
msgid "All Port" msgid "All Port"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:137 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:138
msgid "Allow Lan" msgid "Allow Lan"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:262 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:263
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:74
msgid "Allow Mode" msgid "Allow Mode"
msgstr "" msgstr ""
@ -44,45 +40,36 @@ msgstr ""
msgid "App Version" msgid "App Version"
msgstr "" 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:486
msgid "Append Rule" msgid "Append Rule"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:416 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:417
msgid "Append Rule Provider" msgid "Append Rule Provider"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:472 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:262
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:75
msgid "Block Mode" msgid "Block Mode"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:131 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:155
msgid "Bypass" msgid "Bypass"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:154 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:157
msgid "Bypass China Mainland IP" msgid "Bypass China Mainland IP"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:170
msgid "Bypass DSCP" msgid "Bypass DSCP"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:140 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:91
msgid "Bypass Group" msgid "CGroup"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:133
msgid "Bypass User"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:147
msgid "Bypass cgroup"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:29 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:29
@ -98,8 +85,8 @@ msgstr ""
msgid "Clear Log" msgid "Clear Log"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:160 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:163
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:168
msgid "Commonly Used Port" msgid "Commonly Used Port"
msgstr "" msgstr ""
@ -123,15 +110,15 @@ msgstr ""
msgid "Cron Expression" msgid "Cron Expression"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:228 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:229
msgid "DNS Config" msgid "DNS Config"
msgstr "" msgstr ""
#: 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:231
msgid "DNS Listen" msgid "DNS Listen"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:241 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:242
msgid "DNS Mode" msgid "DNS Mode"
msgstr "" msgstr ""
@ -139,27 +126,27 @@ msgstr ""
msgid "Debug Log" msgid "Debug Log"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
msgid "Destination IP" msgid "Destination IP"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:512
msgid "Destination IP Geo" msgid "Destination IP Geo"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
msgid "Destination Port" msgid "Destination Port"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:157 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:160
msgid "Destination TCP Port to Proxy" msgid "Destination TCP Port to Proxy"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165
msgid "Destination UDP Port to Proxy" msgid "Destination UDP Port to Proxy"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:188 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:189
msgid "Device Name" msgid "Device Name"
msgstr "" msgstr ""
@ -171,20 +158,20 @@ msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:73 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:73
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:79 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:79
#: 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:85
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:132 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:140 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:207
#: 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:217
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:238 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:267 #: 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:273 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274
#: 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:280
#: 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:286
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291 #: 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:360 #: 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:366 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:367
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:372 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:373
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45
msgid "Disable" msgid "Disable"
@ -210,60 +197,60 @@ msgstr ""
msgid "Disable TCP Keep Alive" msgid "Disable TCP Keep Alive"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:276 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:277
msgid "DoH Prefer HTTP/3" msgid "DoH Prefer HTTP/3"
msgstr "" msgstr ""
#: 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:309
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:503 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:504
msgid "Domain Name" msgid "Domain Name"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
msgid "Domain Name Geo" msgid "Domain Name Geo"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
msgid "Domain Name Keyword" msgid "Domain Name Keyword"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
msgid "Domain Name Regex" msgid "Domain Name Regex"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:504 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
msgid "Domain Name Suffix" msgid "Domain Name Suffix"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:168 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:169
msgid "Edit Authentications" msgid "Edit Authentications"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:222 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223
msgid "Edit DNS Hijacks" msgid "Edit DNS Hijacks"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:254 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:255
msgid "Edit Fake-IP Filters" msgid "Edit Fake-IP Filters"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:297 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:298
msgid "Edit Hosts" msgid "Edit Hosts"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:339 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:340
msgid "Edit Nameserver Policies" msgid "Edit Nameserver Policies"
msgstr "" 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:317
msgid "Edit Nameservers" msgid "Edit Nameservers"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:419 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:420
msgid "Edit Rule Providers" msgid "Edit Rule Providers"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:488 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:489
msgid "Edit Rules" msgid "Edit Rules"
msgstr "" msgstr ""
@ -281,34 +268,38 @@ 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:74
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:80 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:80
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133 #: 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:141 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:142
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:176 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:177
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:207 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:208
#: 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:218
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239 #: 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:268 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:269
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:275
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:280 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:281
#: 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:287
#: 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:293
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:305 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:306
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:324 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:325
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:347 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:348
#: 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:358
#: 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:362
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:367 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:368
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:373 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:374
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:399 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:400
#: 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:428
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:496 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:497
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:560
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:75
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:120
msgid "Enable" msgid "Enable"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:213 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:214
msgid "Endpoint Independent NAT" msgid "Endpoint Independent NAT"
msgstr "" msgstr ""
@ -320,11 +311,11 @@ msgstr ""
msgid "External Control Config" msgid "External Control Config"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:264 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:265
msgid "Fake-IP Cache" msgid "Fake-IP Cache"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:258 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:259
msgid "Fake-IP Filter Mode" msgid "Fake-IP Filter Mode"
msgstr "" msgstr ""
@ -332,7 +323,7 @@ msgstr ""
msgid "Fake-IP Ping Hijack" msgid "Fake-IP Ping Hijack"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:246 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:247
msgid "Fake-IP Range" msgid "Fake-IP Range"
msgstr "" msgstr ""
@ -340,15 +331,15 @@ msgstr ""
msgid "Fast Reload" msgid "Fast Reload"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:466 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:467
msgid "File Format" msgid "File Format"
msgstr "" 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:461
msgid "File Path" msgid "File Path"
msgstr "" 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:455
msgid "File Size Limit" msgid "File Size Limit"
msgstr "" msgstr ""
@ -369,15 +360,15 @@ msgstr ""
msgid "File:" msgid "File:"
msgstr "" 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:379
msgid "Force Sniff Domain Name" msgid "Force Sniff Domain Name"
msgstr "" 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:204
msgid "GSO" msgid "GSO"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:209 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:210
msgid "GSO Max Size" msgid "GSO Max Size"
msgstr "" msgstr ""
@ -389,39 +380,39 @@ msgstr ""
msgid "Generate & Download" msgid "Generate & Download"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:537 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:538
msgid "GeoData Loader" msgid "GeoData Loader"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:531 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:532
msgid "GeoIP Format" msgid "GeoIP Format"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:552 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
msgid "GeoIP(ASN) Url" msgid "GeoIP(ASN) Url"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:549 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
msgid "GeoIP(DAT) Url" msgid "GeoIP(DAT) Url"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:546 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
msgid "GeoIP(MMDB) Url" msgid "GeoIP(MMDB) Url"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:543 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
msgid "GeoSite Url" msgid "GeoSite Url"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:555 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:556
msgid "GeoX Auto Update" msgid "GeoX Auto Update"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:529 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:530
msgid "GeoX Config" msgid "GeoX Config"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:561 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:562
msgid "GeoX Update Interval" msgid "GeoX Update Interval"
msgstr "" msgstr ""
@ -437,7 +428,11 @@ msgstr ""
msgid "Grant access to nikki procedures" msgid "Grant access to nikki procedures"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:143 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:85
msgid "Group"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:144
msgid "HTTP Port" msgid "HTTP Port"
msgstr "" msgstr ""
@ -445,10 +440,6 @@ msgstr ""
msgid "How To Use" msgid "How To Use"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:311
msgid "IP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:49 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:49
msgid "IPv4 DNS Hijack" msgid "IPv4 DNS Hijack"
msgstr "" msgstr ""
@ -457,11 +448,6 @@ msgstr ""
msgid "IPv4 Proxy" msgid "IPv4 Proxy"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:64
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:235
msgid "IPv6"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:52 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:52
msgid "IPv6 DNS Hijack" msgid "IPv6 DNS Hijack"
msgstr "" msgstr ""
@ -470,20 +456,20 @@ msgstr ""
msgid "IPv6 Proxy" msgid "IPv6 Proxy"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:385 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:386
msgid "Ignore Sniff Domain Name" msgid "Ignore Sniff Domain Name"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:135 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:136
msgid "Inbound Config" msgid "Inbound Config"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:117 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:104
msgid "Interface" msgid "Inbound Interface"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:67 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:100
msgid "Lan Proxy" msgid "LAN Proxy"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:82 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:82
@ -499,7 +485,7 @@ msgstr ""
msgid "Log Level" msgid "Log Level"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:199 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:200
msgid "MTU" msgid "MTU"
msgstr "" msgstr ""
@ -507,16 +493,16 @@ msgstr ""
msgid "Match Process" msgid "Match Process"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:350 #: 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:513 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:514
msgid "Matcher" msgid "Matcher"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:542
msgid "Memory Conservative Loader" msgid "Memory Conservative Loader"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:151 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:152
msgid "Mixed Port" msgid "Mixed Port"
msgstr "" msgstr ""
@ -524,7 +510,7 @@ msgstr ""
msgid "Mixin Config" msgid "Mixin Config"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:565 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:566
msgid "Mixin File Content" msgid "Mixin File Content"
msgstr "" msgstr ""
@ -533,16 +519,15 @@ msgid "Mixin Option"
msgstr "" 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:39
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:72
msgid "Mode" msgid "Mode"
msgstr "" 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:434
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:334 #: 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:353 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:354
msgid "Nameserver" msgid "Nameserver"
msgstr "" msgstr ""
@ -551,12 +536,12 @@ msgstr ""
msgid "Nikki" msgid "Nikki"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:523 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:524
msgid "No Resolve" msgid "No Resolve"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:447 #: 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:516 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:517
msgid "Node" msgid "Node"
msgstr "" msgstr ""
@ -572,55 +557,55 @@ msgstr ""
msgid "Outbound Interface" msgid "Outbound Interface"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:165 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:166
msgid "Overwrite Authentication" msgid "Overwrite Authentication"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:219 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220
msgid "Overwrite DNS Hijack" msgid "Overwrite DNS Hijack"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:411 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:412
msgid "Overwrite Destination" msgid "Overwrite Destination"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:251 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:252
msgid "Overwrite Fake-IP Filter" msgid "Overwrite Fake-IP Filter"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:375 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:376
msgid "Overwrite Force Sniff Domain Name" msgid "Overwrite Force Sniff Domain Name"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:294 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:295
msgid "Overwrite Hosts" msgid "Overwrite Hosts"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:382 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:383
msgid "Overwrite Ignore Sniff Domain Name" msgid "Overwrite Ignore Sniff Domain Name"
msgstr "" 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:314
msgid "Overwrite Nameserver" msgid "Overwrite Nameserver"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:336 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:337
msgid "Overwrite Nameserver Policy" msgid "Overwrite Nameserver Policy"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:389 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:390
msgid "Overwrite Sniff By Protocol" msgid "Overwrite Sniff By Protocol"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:182 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:183
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
msgid "Please go to the editor tab to edit the file for mixin" msgid "Please go to the editor tab to edit the file for mixin"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:408 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:409
msgid "Port" msgid "Port"
msgstr "" msgstr ""
@ -628,7 +613,7 @@ msgstr ""
msgid "Prefer" msgid "Prefer"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
msgid "Process Name" msgid "Process Name"
msgstr "" msgstr ""
@ -641,11 +626,17 @@ msgstr ""
msgid "Profile for Startup" msgid "Profile for Startup"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:402 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:403
msgid "Protocol" msgid "Protocol"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:97
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:152
msgid "Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:29 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:29
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31
#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:37 #: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:37
msgid "Proxy Config" msgid "Proxy Config"
msgstr "" msgstr ""
@ -662,7 +653,7 @@ msgstr ""
msgid "Redirect Mode" msgid "Redirect Mode"
msgstr "" 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:156
msgid "Redirect Port" msgid "Redirect Port"
msgstr "" msgstr ""
@ -674,7 +665,7 @@ msgstr ""
msgid "Remote" msgid "Remote"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:270 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:271
msgid "Respect Rules" msgid "Respect Rules"
msgstr "" msgstr ""
@ -686,7 +677,7 @@ msgstr ""
msgid "Router Proxy" msgid "Router Proxy"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:414 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:415
msgid "Rule Config" msgid "Rule Config"
msgstr "" msgstr ""
@ -698,7 +689,7 @@ msgstr ""
msgid "Rule Provider:" msgid "Rule Provider:"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:502 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:503
msgid "Rule Set" msgid "Rule Set"
msgstr "" msgstr ""
@ -706,11 +697,11 @@ msgstr ""
msgid "Running" msgid "Running"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:147 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:148
msgid "SOCKS Port" msgid "SOCKS Port"
msgstr "" msgstr ""
#: 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:130
msgid "Save Proxy Selection" msgid "Save Proxy Selection"
msgstr "" msgstr ""
@ -723,27 +714,27 @@ msgstr ""
msgid "Scroll To Bottom" msgid "Scroll To Bottom"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:392 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:393
msgid "Sniff By Protocol" msgid "Sniff By Protocol"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:369 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:370
msgid "Sniff Pure IP" msgid "Sniff Pure IP"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:363 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:364
msgid "Sniff Redir-Host" msgid "Sniff Redir-Host"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:355 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:356
msgid "Sniffer Config" msgid "Sniffer Config"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:192 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:193
msgid "Stack" msgid "Stack"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
msgid "Standard Loader" msgid "Standard Loader"
msgstr "" msgstr ""
@ -785,7 +776,7 @@ msgid "TCP Keep Alive Interval"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:36 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:36
msgid "TCP Proxy Mode" msgid "TCP Mode"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:40 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:40
@ -793,11 +784,11 @@ msgstr ""
msgid "TPROXY Mode" msgid "TPROXY Mode"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:160 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161
msgid "TPROXY Port" msgid "TPROXY Port"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:186 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:187
msgid "TUN Config" msgid "TUN Config"
msgstr "" msgstr ""
@ -814,22 +805,18 @@ msgstr ""
msgid "Total" msgid "Total"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31
msgid "Transparent Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38
msgid "Transparent Proxy with Mihomo on OpenWrt." msgid "Transparent Proxy with Mihomo on OpenWrt."
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:327 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:328
#: 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:437
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:500 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:501
msgid "Type" msgid "Type"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:43 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:43
msgid "UDP Proxy Mode" msgid "UDP Mode"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:110 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:110
@ -862,42 +849,42 @@ msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:107 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:107
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:111 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:111
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:122 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:123
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:127 #: 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:131 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:132
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:139 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:140
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:145 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:146
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:149 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:150
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:153 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:154
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:157 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:158
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:162 #: 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:189 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:190
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:194 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:195
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:201 #: 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/mixin.js:206
#: 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:212
#: 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:216
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:232 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:233
#: 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:238
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:242 #: 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:248 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:249
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:260 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261
#: 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:267
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:272 #: 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:278 #: 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:284 #: 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:290 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:359 #: 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:365 #: 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:371 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:372
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:533 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:534
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:539 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:545
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:548
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:551
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:554
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:557 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:563 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:564
msgid "Unmodified" msgid "Unmodified"
msgstr "" msgstr ""
@ -913,7 +900,7 @@ msgstr ""
msgid "Update Dashboard" msgid "Update Dashboard"
msgstr "" 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:480
msgid "Update Interval" msgid "Update Interval"
msgstr "" msgstr ""
@ -921,15 +908,15 @@ msgstr ""
msgid "Upload Profile" msgid "Upload Profile"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:442 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:443
msgid "Url" msgid "Url"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:288 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289
msgid "Use Hosts" msgid "Use Hosts"
msgstr "" 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:283
msgid "Use System Hosts" msgid "Use System Hosts"
msgstr "" msgstr ""
@ -937,10 +924,14 @@ msgstr ""
msgid "Used" msgid "Used"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:79
msgid "User"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:70 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:70
msgid "User Agent" msgid "User Agent"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:179 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:180
msgid "Username" msgid "Username"
msgstr "" msgstr ""

View File

@ -8,33 +8,29 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: 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 "API Listen" msgid "API Listen"
msgstr "API 监听" msgstr "API 监听"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:125 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:126
msgid "API Secret" msgid "API Secret"
msgstr "API 密钥" msgstr "API 密钥"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:70 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:114
msgid "Access Control" msgid "Access Control"
msgstr "访问控制" msgstr "访问控制"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:73 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
msgid "All Mode" #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
msgstr "全部模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:159
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:164
msgid "All Port" msgid "All Port"
msgstr "全部端口" msgstr "全部端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:137 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:138
msgid "Allow Lan" msgid "Allow Lan"
msgstr "允许局域网访问" msgstr "允许局域网访问"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:262 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:263
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:74
msgid "Allow Mode" msgid "Allow Mode"
msgstr "白名单模式" msgstr "白名单模式"
@ -51,46 +47,37 @@ msgstr "插件日志"
msgid "App Version" msgid "App Version"
msgstr "插件版本" 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:486
msgid "Append Rule" msgid "Append Rule"
msgstr "追加规则" msgstr "追加规则"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:416 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:417
msgid "Append Rule Provider" msgid "Append Rule Provider"
msgstr "追加规则提供者" msgstr "追加规则提供者"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:472 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473
msgid "Behavior" msgid "Behavior"
msgstr "行为" msgstr "行为"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:262
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:75
msgid "Block Mode" msgid "Block Mode"
msgstr "黑名单模式" msgstr "黑名单模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:131 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:155
msgid "Bypass" msgid "Bypass"
msgstr "绕过" msgstr "绕过"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:154 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:157
msgid "Bypass China Mainland IP" msgid "Bypass China Mainland IP"
msgstr "绕过中国大陆 IP" msgstr "绕过中国大陆 IP"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:170
msgid "Bypass DSCP" msgid "Bypass DSCP"
msgstr "绕过 DSCP" msgstr "绕过 DSCP"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:140 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:91
msgid "Bypass Group" msgid "CGroup"
msgstr "绕过用户组" msgstr "控制组"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:133
msgid "Bypass User"
msgstr "绕过用户"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:147
msgid "Bypass cgroup"
msgstr "绕过资源控制组"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:29 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:29
msgid "Choose File" msgid "Choose File"
@ -105,8 +92,8 @@ msgstr "选择配置文件"
msgid "Clear Log" msgid "Clear Log"
msgstr "清空日志" msgstr "清空日志"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:160 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:163
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:168
msgid "Commonly Used Port" msgid "Commonly Used Port"
msgstr "常用端口" msgstr "常用端口"
@ -130,15 +117,15 @@ msgstr "核心版本"
msgid "Cron Expression" msgid "Cron Expression"
msgstr "Cron 表达式" msgstr "Cron 表达式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:228 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:229
msgid "DNS Config" msgid "DNS Config"
msgstr "DNS 配置" msgstr "DNS 配置"
#: 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:231
msgid "DNS Listen" msgid "DNS Listen"
msgstr "DNS 监听" msgstr "DNS 监听"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:241 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:242
msgid "DNS Mode" msgid "DNS Mode"
msgstr "DNS 模式" msgstr "DNS 模式"
@ -146,27 +133,27 @@ msgstr "DNS 模式"
msgid "Debug Log" msgid "Debug Log"
msgstr "调试日志" msgstr "调试日志"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
msgid "Destination IP" msgid "Destination IP"
msgstr "目标 IP" msgstr "目标 IP"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:512
msgid "Destination IP Geo" msgid "Destination IP Geo"
msgstr "目标 IPGeo" msgstr "目标 IPGeo"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
msgid "Destination Port" msgid "Destination Port"
msgstr "目标端口" msgstr "目标端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:157 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:160
msgid "Destination TCP Port to Proxy" msgid "Destination TCP Port to Proxy"
msgstr "要代理的 TCP 目标端口" msgstr "要代理的 TCP 目标端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165
msgid "Destination UDP Port to Proxy" msgid "Destination UDP Port to Proxy"
msgstr "要代理的 UDP 目标端口" msgstr "要代理的 UDP 目标端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:188 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:189
msgid "Device Name" msgid "Device Name"
msgstr "设备名称" msgstr "设备名称"
@ -178,20 +165,20 @@ msgstr "直连模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:73 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:73
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:79 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:79
#: 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:85
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:132 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:140 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:207
#: 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:217
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:238 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:267 #: 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:273 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274
#: 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:280
#: 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:286
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291 #: 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:360 #: 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:366 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:367
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:372 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:373
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45
msgid "Disable" msgid "Disable"
@ -217,60 +204,60 @@ msgstr "禁用安全路径检查"
msgid "Disable TCP Keep Alive" msgid "Disable TCP Keep Alive"
msgstr "禁用 TCP Keep Alive" msgstr "禁用 TCP Keep Alive"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:276 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:277
msgid "DoH Prefer HTTP/3" msgid "DoH Prefer HTTP/3"
msgstr "DoH 优先 HTTP/3" msgstr "DoH 优先 HTTP/3"
#: 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:309
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:503 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:504
msgid "Domain Name" msgid "Domain Name"
msgstr "域名" msgstr "域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
msgid "Domain Name Geo" msgid "Domain Name Geo"
msgstr "域名Geo" msgstr "域名Geo"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
msgid "Domain Name Keyword" msgid "Domain Name Keyword"
msgstr "域名(关键字)" msgstr "域名(关键字)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
msgid "Domain Name Regex" msgid "Domain Name Regex"
msgstr "域名(正则表达式)" msgstr "域名(正则表达式)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:504 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
msgid "Domain Name Suffix" msgid "Domain Name Suffix"
msgstr "域名(后缀)" msgstr "域名(后缀)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:168 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:169
msgid "Edit Authentications" msgid "Edit Authentications"
msgstr "编辑身份验证" msgstr "编辑身份验证"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:222 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223
msgid "Edit DNS Hijacks" msgid "Edit DNS Hijacks"
msgstr "编辑 DNS 劫持" msgstr "编辑 DNS 劫持"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:254 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:255
msgid "Edit Fake-IP Filters" msgid "Edit Fake-IP Filters"
msgstr "编辑 Fake-IP 过滤列表" msgstr "编辑 Fake-IP 过滤列表"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:297 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:298
msgid "Edit Hosts" msgid "Edit Hosts"
msgstr "编辑 Hosts" msgstr "编辑 Hosts"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:339 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:340
msgid "Edit Nameserver Policies" msgid "Edit Nameserver Policies"
msgstr "编辑 DNS 服务器查询策略" msgstr "编辑 DNS 服务器查询策略"
#: 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:317
msgid "Edit Nameservers" msgid "Edit Nameservers"
msgstr "编辑 DNS 服务器" msgstr "编辑 DNS 服务器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:419 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:420
msgid "Edit Rule Providers" msgid "Edit Rule Providers"
msgstr "编辑规则提供者" msgstr "编辑规则提供者"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:488 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:489
msgid "Edit Rules" msgid "Edit Rules"
msgstr "编辑规则" msgstr "编辑规则"
@ -288,34 +275,38 @@ 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:74
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:80 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:80
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133 #: 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:141 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:142
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:176 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:177
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:207 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:208
#: 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:218
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239 #: 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:268 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:269
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:275
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:280 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:281
#: 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:287
#: 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:293
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:305 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:306
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:324 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:325
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:347 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:348
#: 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:358
#: 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:362
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:367 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:368
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:373 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:374
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:399 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:400
#: 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:428
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:496 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:497
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:560
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:75
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:120
msgid "Enable" msgid "Enable"
msgstr "启用" msgstr "启用"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:213 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:214
msgid "Endpoint Independent NAT" msgid "Endpoint Independent NAT"
msgstr "独立于端点的 NAT" msgstr "独立于端点的 NAT"
@ -327,11 +318,11 @@ msgstr "到期时间"
msgid "External Control Config" msgid "External Control Config"
msgstr "外部控制配置" msgstr "外部控制配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:264 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:265
msgid "Fake-IP Cache" msgid "Fake-IP Cache"
msgstr "Fake-IP 缓存" msgstr "Fake-IP 缓存"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:258 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:259
msgid "Fake-IP Filter Mode" msgid "Fake-IP Filter Mode"
msgstr "Fake-IP 过滤模式" msgstr "Fake-IP 过滤模式"
@ -339,7 +330,7 @@ msgstr "Fake-IP 过滤模式"
msgid "Fake-IP Ping Hijack" msgid "Fake-IP Ping Hijack"
msgstr "Fake-IP Ping 劫持" msgstr "Fake-IP Ping 劫持"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:246 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:247
msgid "Fake-IP Range" msgid "Fake-IP Range"
msgstr "Fake-IP 范围" msgstr "Fake-IP 范围"
@ -347,15 +338,15 @@ msgstr "Fake-IP 范围"
msgid "Fast Reload" msgid "Fast Reload"
msgstr "快速重载" msgstr "快速重载"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:466 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:467
msgid "File Format" msgid "File Format"
msgstr "文件格式" 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:461
msgid "File Path" msgid "File Path"
msgstr "文件路径" 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:455
msgid "File Size Limit" msgid "File Size Limit"
msgstr "文件大小限制" msgstr "文件大小限制"
@ -376,15 +367,15 @@ msgstr "IPv6 保留地址"
msgid "File:" msgid "File:"
msgstr "文件:" 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:379
msgid "Force Sniff Domain Name" msgid "Force Sniff Domain Name"
msgstr "强制嗅探的域名" 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:204
msgid "GSO" msgid "GSO"
msgstr "通用分段卸载" msgstr "通用分段卸载"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:209 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:210
msgid "GSO Max Size" msgid "GSO Max Size"
msgstr "分段最大长度" msgstr "分段最大长度"
@ -396,39 +387,39 @@ msgstr "全局配置"
msgid "Generate & Download" msgid "Generate & Download"
msgstr "生成并下载" msgstr "生成并下载"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:537 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:538
msgid "GeoData Loader" msgid "GeoData Loader"
msgstr "GeoData 加载器" msgstr "GeoData 加载器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:531 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:532
msgid "GeoIP Format" msgid "GeoIP Format"
msgstr "GeoIP 格式" msgstr "GeoIP 格式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:552 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
msgid "GeoIP(ASN) Url" msgid "GeoIP(ASN) Url"
msgstr "GeoIP(ASN) 下载地址" msgstr "GeoIP(ASN) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:549 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
msgid "GeoIP(DAT) Url" msgid "GeoIP(DAT) Url"
msgstr "GeoIP(DAT) 下载地址" msgstr "GeoIP(DAT) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:546 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
msgid "GeoIP(MMDB) Url" msgid "GeoIP(MMDB) Url"
msgstr "GeoIP(MMDB) 下载地址" msgstr "GeoIP(MMDB) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:543 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
msgid "GeoSite Url" msgid "GeoSite Url"
msgstr "GeoSite 下载地址" msgstr "GeoSite 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:555 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:556
msgid "GeoX Auto Update" msgid "GeoX Auto Update"
msgstr "定时更新GeoX文件" msgstr "定时更新GeoX文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:529 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:530
msgid "GeoX Config" msgid "GeoX Config"
msgstr "GeoX 配置" msgstr "GeoX 配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:561 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:562
msgid "GeoX Update Interval" msgid "GeoX Update Interval"
msgstr "GeoX 文件更新间隔" msgstr "GeoX 文件更新间隔"
@ -444,7 +435,11 @@ msgstr "全局模式"
msgid "Grant access to nikki procedures" msgid "Grant access to nikki procedures"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:143 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:85
msgid "Group"
msgstr "用户组"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:144
msgid "HTTP Port" msgid "HTTP Port"
msgstr "HTTP 端口" msgstr "HTTP 端口"
@ -452,10 +447,6 @@ msgstr "HTTP 端口"
msgid "How To Use" msgid "How To Use"
msgstr "使用说明" msgstr "使用说明"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:311
msgid "IP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:49 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:49
msgid "IPv4 DNS Hijack" msgid "IPv4 DNS Hijack"
msgstr "IPv4 DNS 劫持" msgstr "IPv4 DNS 劫持"
@ -464,11 +455,6 @@ msgstr "IPv4 DNS 劫持"
msgid "IPv4 Proxy" msgid "IPv4 Proxy"
msgstr "IPv4 代理" msgstr "IPv4 代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:64
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:235
msgid "IPv6"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:52 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:52
msgid "IPv6 DNS Hijack" msgid "IPv6 DNS Hijack"
msgstr "IPv6 DNS 劫持" msgstr "IPv6 DNS 劫持"
@ -477,20 +463,20 @@ msgstr "IPv6 DNS 劫持"
msgid "IPv6 Proxy" msgid "IPv6 Proxy"
msgstr "IPv6 代理" msgstr "IPv6 代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:385 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:386
msgid "Ignore Sniff Domain Name" msgid "Ignore Sniff Domain Name"
msgstr "忽略嗅探的域名" msgstr "忽略嗅探的域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:135 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:136
msgid "Inbound Config" msgid "Inbound Config"
msgstr "入站配置" msgstr "入站配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:117 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:104
msgid "Interface" msgid "Inbound Interface"
msgstr "接口" msgstr "入站接口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:67 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:100
msgid "Lan Proxy" msgid "LAN Proxy"
msgstr "局域网代理" msgstr "局域网代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:82 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:82
@ -506,7 +492,7 @@ msgstr "日志"
msgid "Log Level" msgid "Log Level"
msgstr "日志级别" msgstr "日志级别"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:199 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:200
msgid "MTU" msgid "MTU"
msgstr "最大传输单元" msgstr "最大传输单元"
@ -514,16 +500,16 @@ msgstr "最大传输单元"
msgid "Match Process" msgid "Match Process"
msgstr "匹配进程" msgstr "匹配进程"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:350 #: 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:513 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:514
msgid "Matcher" msgid "Matcher"
msgstr "匹配" msgstr "匹配"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:542
msgid "Memory Conservative Loader" msgid "Memory Conservative Loader"
msgstr "为内存受限设备优化的加载器" msgstr "为内存受限设备优化的加载器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:151 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:152
msgid "Mixed Port" msgid "Mixed Port"
msgstr "混合端口" msgstr "混合端口"
@ -531,7 +517,7 @@ msgstr "混合端口"
msgid "Mixin Config" msgid "Mixin Config"
msgstr "混入配置" msgstr "混入配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:565 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:566
msgid "Mixin File Content" msgid "Mixin File Content"
msgstr "混入文件内容" msgstr "混入文件内容"
@ -540,16 +526,15 @@ msgid "Mixin Option"
msgstr "混入选项" 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:39
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:72
msgid "Mode" msgid "Mode"
msgstr "模式" 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:434
msgid "Name" msgid "Name"
msgstr "名称" msgstr "名称"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:334 #: 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:353 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:354
msgid "Nameserver" msgid "Nameserver"
msgstr "DNS 服务器" msgstr "DNS 服务器"
@ -558,12 +543,12 @@ msgstr "DNS 服务器"
msgid "Nikki" msgid "Nikki"
msgstr "" msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:523 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:524
msgid "No Resolve" msgid "No Resolve"
msgstr "不解析" msgstr "不解析"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:447 #: 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:516 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:517
msgid "Node" msgid "Node"
msgstr "节点" msgstr "节点"
@ -579,55 +564,55 @@ msgstr "打开面板"
msgid "Outbound Interface" msgid "Outbound Interface"
msgstr "出站接口" msgstr "出站接口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:165 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:166
msgid "Overwrite Authentication" msgid "Overwrite Authentication"
msgstr "覆盖身份验证" msgstr "覆盖身份验证"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:219 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220
msgid "Overwrite DNS Hijack" msgid "Overwrite DNS Hijack"
msgstr "覆盖 DNS 劫持" msgstr "覆盖 DNS 劫持"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:411 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:412
msgid "Overwrite Destination" msgid "Overwrite Destination"
msgstr "将嗅探结果作为连接目标" msgstr "将嗅探结果作为连接目标"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:251 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:252
msgid "Overwrite Fake-IP Filter" msgid "Overwrite Fake-IP Filter"
msgstr "覆盖 Fake-IP 过滤列表" msgstr "覆盖 Fake-IP 过滤列表"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:375 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:376
msgid "Overwrite Force Sniff Domain Name" msgid "Overwrite Force Sniff Domain Name"
msgstr "覆盖强制嗅探的域名" msgstr "覆盖强制嗅探的域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:294 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:295
msgid "Overwrite Hosts" msgid "Overwrite Hosts"
msgstr "覆盖 Hosts" msgstr "覆盖 Hosts"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:382 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:383
msgid "Overwrite Ignore Sniff Domain Name" msgid "Overwrite Ignore Sniff Domain Name"
msgstr "覆盖忽略嗅探的域名" 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:314
msgid "Overwrite Nameserver" msgid "Overwrite Nameserver"
msgstr "覆盖 DNS 服务器" msgstr "覆盖 DNS 服务器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:336 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:337
msgid "Overwrite Nameserver Policy" msgid "Overwrite Nameserver Policy"
msgstr "覆盖 DNS 服务器查询策略" msgstr "覆盖 DNS 服务器查询策略"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:389 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:390
msgid "Overwrite Sniff By Protocol" msgid "Overwrite Sniff By Protocol"
msgstr "覆盖按协议嗅探" msgstr "覆盖按协议嗅探"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:182 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:183
msgid "Password" msgid "Password"
msgstr "密码" msgstr "密码"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
msgid "Please go to the editor tab to edit the file for mixin" msgid "Please go to the editor tab to edit the file for mixin"
msgstr "请前往编辑器标签编辑用于混入的文件" msgstr "请前往编辑器标签编辑用于混入的文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:408 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:409
msgid "Port" msgid "Port"
msgstr "端口" msgstr "端口"
@ -635,7 +620,7 @@ msgstr "端口"
msgid "Prefer" msgid "Prefer"
msgstr "优先" msgstr "优先"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
msgid "Process Name" msgid "Process Name"
msgstr "进程名" msgstr "进程名"
@ -648,11 +633,17 @@ msgstr "配置文件"
msgid "Profile for Startup" msgid "Profile for Startup"
msgstr "用于启动的配置文件" msgstr "用于启动的配置文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:402 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:403
msgid "Protocol" msgid "Protocol"
msgstr "协议" msgstr "协议"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:97
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:152
msgid "Proxy"
msgstr "代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:29 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:29
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31
#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:37 #: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:37
msgid "Proxy Config" msgid "Proxy Config"
msgstr "代理配置" msgstr "代理配置"
@ -669,7 +660,7 @@ msgstr "随机"
msgid "Redirect Mode" msgid "Redirect Mode"
msgstr "Redirect 模式" msgstr "Redirect 模式"
#: 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:156
msgid "Redirect Port" msgid "Redirect Port"
msgstr "Redirect 端口" msgstr "Redirect 端口"
@ -681,7 +672,7 @@ msgstr "重载服务"
msgid "Remote" msgid "Remote"
msgstr "远程" msgstr "远程"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:270 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:271
msgid "Respect Rules" msgid "Respect Rules"
msgstr "遵循分流规则" msgstr "遵循分流规则"
@ -693,7 +684,7 @@ msgstr "重启服务"
msgid "Router Proxy" msgid "Router Proxy"
msgstr "路由器代理" msgstr "路由器代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:414 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:415
msgid "Rule Config" msgid "Rule Config"
msgstr "规则配置" msgstr "规则配置"
@ -705,7 +696,7 @@ msgstr "规则模式"
msgid "Rule Provider:" msgid "Rule Provider:"
msgstr "规则提供者:" msgstr "规则提供者:"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:502 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:503
msgid "Rule Set" msgid "Rule Set"
msgstr "规则集" msgstr "规则集"
@ -713,11 +704,11 @@ msgstr "规则集"
msgid "Running" msgid "Running"
msgstr "运行中" msgstr "运行中"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:147 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:148
msgid "SOCKS Port" msgid "SOCKS Port"
msgstr "SOCKS 端口" msgstr "SOCKS 端口"
#: 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:130
msgid "Save Proxy Selection" msgid "Save Proxy Selection"
msgstr "保存节点/策略组选择" msgstr "保存节点/策略组选择"
@ -730,27 +721,27 @@ msgstr "定时重启"
msgid "Scroll To Bottom" msgid "Scroll To Bottom"
msgstr "滚动到底部" msgstr "滚动到底部"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:392 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:393
msgid "Sniff By Protocol" msgid "Sniff By Protocol"
msgstr "按协议嗅探" msgstr "按协议嗅探"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:369 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:370
msgid "Sniff Pure IP" msgid "Sniff Pure IP"
msgstr "嗅探纯 IP 连接" msgstr "嗅探纯 IP 连接"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:363 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:364
msgid "Sniff Redir-Host" msgid "Sniff Redir-Host"
msgstr "嗅探 Redir-Host 流量" msgstr "嗅探 Redir-Host 流量"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:355 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:356
msgid "Sniffer Config" msgid "Sniffer Config"
msgstr "嗅探器配置" msgstr "嗅探器配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:192 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:193
msgid "Stack" msgid "Stack"
msgstr "栈" msgstr "栈"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
msgid "Standard Loader" msgid "Standard Loader"
msgstr "标准加载器" msgstr "标准加载器"
@ -792,19 +783,19 @@ msgid "TCP Keep Alive Interval"
msgstr "TCP Keep Alive 间隔" msgstr "TCP Keep Alive 间隔"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:36 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:36
msgid "TCP Proxy Mode" msgid "TCP Mode"
msgstr "TCP 代理模式" msgstr "TCP 模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:40 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:40
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:46 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:46
msgid "TPROXY Mode" msgid "TPROXY Mode"
msgstr "TPROXY 模式" msgstr "TPROXY 模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:160 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161
msgid "TPROXY Port" msgid "TPROXY Port"
msgstr "TPROXY 端口" msgstr "TPROXY 端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:186 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:187
msgid "TUN Config" msgid "TUN Config"
msgstr "TUN 配置" msgstr "TUN 配置"
@ -821,23 +812,19 @@ msgstr "检查配置文件"
msgid "Total" msgid "Total"
msgstr "总量" msgstr "总量"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31
msgid "Transparent Proxy"
msgstr "透明代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38
msgid "Transparent Proxy with Mihomo on OpenWrt." msgid "Transparent Proxy with Mihomo on OpenWrt."
msgstr "在 OpenWrt 上使用 Mihomo 进行透明代理。" msgstr "在 OpenWrt 上使用 Mihomo 进行透明代理。"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:327 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:328
#: 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:437
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:500 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:501
msgid "Type" msgid "Type"
msgstr "类型" msgstr "类型"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:43 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:43
msgid "UDP Proxy Mode" msgid "UDP Mode"
msgstr "UDP 代理模式" msgstr "UDP 模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:110 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:110
msgid "UI Name" msgid "UI Name"
@ -869,42 +856,42 @@ msgstr "统一延迟"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:107 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:107
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:111 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:111
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:122 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:123
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:127 #: 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:131 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:132
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:139 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:140
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:145 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:146
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:149 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:150
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:153 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:154
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:157 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:158
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:162 #: 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:189 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:190
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:194 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:195
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:201 #: 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/mixin.js:206
#: 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:212
#: 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:216
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:232 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:233
#: 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:238
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:242 #: 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:248 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:249
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:260 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261
#: 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:267
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:272 #: 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:278 #: 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:284 #: 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:290 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:359 #: 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:365 #: 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:371 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:372
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:533 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:534
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:539 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:545
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:548
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:551
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:554
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:557 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:563 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:564
msgid "Unmodified" msgid "Unmodified"
msgstr "不修改" msgstr "不修改"
@ -920,7 +907,7 @@ msgstr "更新时间"
msgid "Update Dashboard" msgid "Update Dashboard"
msgstr "更新面板" 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:480
msgid "Update Interval" msgid "Update Interval"
msgstr "更新间隔" msgstr "更新间隔"
@ -928,15 +915,15 @@ msgstr "更新间隔"
msgid "Upload Profile" msgid "Upload Profile"
msgstr "上传配置文件" msgstr "上传配置文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:442 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:443
msgid "Url" msgid "Url"
msgstr "下载地址" msgstr "下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:288 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289
msgid "Use Hosts" msgid "Use Hosts"
msgstr "使用 Hosts" msgstr "使用 Hosts"
#: 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:283
msgid "Use System Hosts" msgid "Use System Hosts"
msgstr "使用系统的 Hosts" msgstr "使用系统的 Hosts"
@ -944,10 +931,14 @@ msgstr "使用系统的 Hosts"
msgid "Used" msgid "Used"
msgstr "已使用" msgstr "已使用"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:79
msgid "User"
msgstr "用户"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:70 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:70
msgid "User Agent" msgid "User Agent"
msgstr "用户代理UA" msgstr "用户代理UA"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:179 #: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:180
msgid "Username" msgid "Username"
msgstr "用户名" msgstr "用户名"

View File

@ -59,8 +59,8 @@ const methods = {
}, },
get_identifiers: { get_identifiers: {
call: function() { call: function() {
const users = filter(get_users(), (x) => x != '' && x != 'root'); const users = filter(get_users(), (x) => x != '');
const groups = filter(get_groups(), (x) => x != '' && x != 'root'); const groups = filter(get_groups(), (x) => x != '');
const cgroups = filter(get_cgroups(), (x) => x != '' && x != 'nikki'); const cgroups = filter(get_cgroups(), (x) => x != '' && x != 'nikki');
return { users: users, groups: groups, cgroups: cgroups }; return { users: users, groups: groups, cgroups: cgroups };
} }

View File

@ -5,9 +5,9 @@ PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git
PKG_SOURCE_DATE:=2025-04-06 PKG_SOURCE_DATE:=2025-04-12
PKG_SOURCE_VERSION:=9e8f4ada4754ae95b002535acbeb457e40b06731 PKG_SOURCE_VERSION:=cedb36df5fe58d5d972b1507c1ab656aca5f046d
PKG_MIRROR_HASH:=1c8a7d70de0cb903b58eca1937b6561003cae7e76f9f021fd3eb9007b6a1f65f PKG_MIRROR_HASH:=b2f9fe4e2ebd38036eac0f2c5af79362cb2afbb780c36c236259ecace9db11da
PKG_LICENSE:=GPL3.0+ PKG_LICENSE:=GPL3.0+
PKG_MAINTAINER:=Joseph Mory <morytyann@gmail.com> PKG_MAINTAINER:=Joseph Mory <morytyann@gmail.com>
@ -16,7 +16,7 @@ PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_PARALLEL:=1 PKG_BUILD_PARALLEL:=1
PKG_BUILD_FLAGS:=no-mips16 PKG_BUILD_FLAGS:=no-mips16
PKG_BUILD_VERSION:=alpha-9e8f4ad PKG_BUILD_VERSION:=alpha-cedb36d
PKG_BUILD_TIME:=$(shell date -u -Iseconds) PKG_BUILD_TIME:=$(shell date -u -Iseconds)
GO_PKG:=github.com/metacubex/mihomo GO_PKG:=github.com/metacubex/mihomo

View File

@ -10,9 +10,9 @@ config config 'config'
option 'test_profile' '1' option 'test_profile' '1'
config proxy 'proxy' config proxy 'proxy'
option 'transparent_proxy' '1' option 'enabled' '1'
option 'tcp_transparent_proxy_mode' 'redirect' option 'tcp_mode' 'redirect'
option 'udp_transparent_proxy_mode' 'tun' option 'udp_mode' 'tun'
option 'ipv4_dns_hijack' '1' option 'ipv4_dns_hijack' '1'
option 'ipv6_dns_hijack' '1' option 'ipv6_dns_hijack' '1'
option 'ipv4_proxy' '1' option 'ipv4_proxy' '1'
@ -20,30 +20,7 @@ config proxy 'proxy'
option 'fake_ip_ping_hijack' '1' option 'fake_ip_ping_hijack' '1'
option 'router_proxy' '1' option 'router_proxy' '1'
option 'lan_proxy' '1' option 'lan_proxy' '1'
option 'access_control_mode' 'all' list 'lan_inbound_interface' 'lan'
option 'acl_ip' ''
option 'acl_ip6' ''
option 'acl_mac' ''
option 'acl_interface' ''
list 'bypass_user' 'dnsmasq'
list 'bypass_user' 'ftp'
list 'bypass_user' 'logd'
list 'bypass_user' 'nobody'
list 'bypass_user' 'ntp'
list 'bypass_user' 'ubus'
list 'bypass_group' 'dnsmasq'
list 'bypass_group' 'ftp'
list 'bypass_group' 'logd'
list 'bypass_group' 'nogroup'
list 'bypass_group' 'ntp'
list 'bypass_group' 'ubus'
list 'bypass_cgroup' 'adguardhome'
list 'bypass_cgroup' 'aria2'
list 'bypass_cgroup' 'dnsmasq'
list 'bypass_cgroup' 'netbird'
list 'bypass_cgroup' 'qbittorrent'
list 'bypass_cgroup' 'tailscale'
list 'bypass_cgroup' 'zerotier'
list 'bypass_dscp' '4' list 'bypass_dscp' '4'
option 'bypass_china_mainland_ip' '0' option 'bypass_china_mainland_ip' '0'
option 'proxy_tcp_dport' '0-65535' option 'proxy_tcp_dport' '0-65535'
@ -100,6 +77,38 @@ config env 'env'
option 'disable_quic_go_gso' '0' option 'disable_quic_go_gso' '0'
option 'disable_quic_go_ecn' '0' option 'disable_quic_go_ecn' '0'
config router_access_control
option 'enabled' '1'
list 'user' 'dnsmasq'
list 'user' 'ftp'
list 'user' 'logd'
list 'user' 'nobody'
list 'user' 'ntp'
list 'user' 'ubus'
list 'group' 'dnsmasq'
list 'group' 'ftp'
list 'group' 'logd'
list 'group' 'nogroup'
list 'group' 'ntp'
list 'group' 'ubus'
list 'cgroup' 'adguardhome'
list 'cgroup' 'aria2'
list 'cgroup' 'dnsmasq'
list 'cgroup' 'netbird'
list 'cgroup' 'qbittorrent'
list 'cgroup' 'sysntpd'
list 'cgroup' 'tailscale'
list 'cgroup' 'zerotier'
option 'proxy' '0'
config router_access_control
option 'enabled' '1'
option 'proxy' '1'
config lan_access_control
option 'enabled' '1'
option 'proxy' '1'
config authentication config authentication
option 'enabled' '1' option 'enabled' '1'
option 'username' 'nikki' option 'username' 'nikki'

View File

@ -143,11 +143,11 @@ service_started() {
fi fi
# load config # load config
config_load nikki config_load nikki
# check if transparent proxy enabled # check if proxy enabled
local transparent_proxy local enabled
config_get_bool transparent_proxy "proxy" "transparent_proxy" 0 config_get_bool enabled "proxy" "enabled" 0
if [ "$transparent_proxy" == 0 ]; then if [ "$enabled" == 0 ]; then
log "Transparent Proxy" "Disabled." log "Proxy" "Disabled."
return return
fi fi
# get config # get config
@ -156,19 +156,19 @@ service_started() {
local tun_device local tun_device
config_get tun_device "mixin" "tun_device" "nikki" config_get tun_device "mixin" "tun_device" "nikki"
## proxy config ## proxy config
### transparent proxy ### general
local tcp_transparent_proxy_mode udp_transparent_proxy_mode ipv4_proxy ipv6_proxy local tcp_mode udp_mode ipv4_proxy ipv6_proxy
config_get tcp_transparent_proxy_mode "proxy" "tcp_transparent_proxy_mode" config_get tcp_mode "proxy" "tcp_mode"
config_get udp_transparent_proxy_mode "proxy" "udp_transparent_proxy_mode" config_get udp_mode "proxy" "udp_mode"
config_get_bool ipv4_proxy "proxy" "ipv4_proxy" 0 config_get_bool ipv4_proxy "proxy" "ipv4_proxy" 0
config_get_bool ipv6_proxy "proxy" "ipv6_proxy" 0 config_get_bool ipv6_proxy "proxy" "ipv6_proxy" 0
# prepare config # prepare config
local tproxy_enable; tproxy_enable=0 local tproxy_enable; tproxy_enable=0
if [[ "$tcp_transparent_proxy_mode" == "tproxy" || "$udp_transparent_proxy_mode" == "tproxy" ]]; then if [[ "$tcp_mode" == "tproxy" || "$udp_mode" == "tproxy" ]]; then
tproxy_enable=1 tproxy_enable=1
fi fi
local tun_enable; tun_enable=0 local tun_enable; tun_enable=0
if [[ "$tcp_transparent_proxy_mode" == "tun" || "$udp_transparent_proxy_mode" == "tun" ]]; then if [[ "$tcp_mode" == "tun" || "$udp_mode" == "tun" ]]; then
tun_enable=1 tun_enable=1
fi fi
# fix compatible with dockerd # fix compatible with dockerd
@ -197,17 +197,17 @@ service_started() {
fi fi
fi fi
fi fi
# transparent proxy # proxy
log "Transparent Proxy" "Enabled." log "Proxy" "Enabled."
# wait for tun device online # wait for tun device online
if [ "$tun_enable" == 1 ]; then if [ "$tun_enable" == 1 ]; then
log "Transparent Proxy" "Waiting for tun device online..." log "Proxy" "Waiting for tun device online..."
local tun_timeout; tun_timeout=15 local tun_timeout; tun_timeout=15
local tun_interval; tun_interval=1 local tun_interval; tun_interval=1
while [ "$tun_timeout" -gt 0 ]; do while [ "$tun_timeout" -gt 0 ]; do
if (ip link show dev "$tun_device" > /dev/null 2>&1); then if (ip link show dev "$tun_device" > /dev/null 2>&1); then
if [ $(ip -json addr show dev "$tun_device" | tun_device="$tun_device" yq -M '.[] | select(.ifname = strenv(tun_device)) | .addr_info | length') -gt 0 ]; then if [ $(ip -json addr show dev "$tun_device" | tun_device="$tun_device" yq -M '.[] | select(.ifname = strenv(tun_device)) | .addr_info | length') -gt 0 ]; then
log "Transparent Proxy" "Tun device is online." log "Proxy" "Tun device is online."
break break
fi fi
fi fi
@ -215,7 +215,7 @@ service_started() {
sleep "$tun_interval" sleep "$tun_interval"
done done
if [ "$tun_timeout" -le 0 ]; then if [ "$tun_timeout" -le 0 ]; then
log "Transparent Proxy" "Waiting timeout, tun device is not online." log "Proxy" "Waiting timeout, tun device is not online."
log "App" "Exit." log "App" "Exit."
return return
fi fi
@ -246,9 +246,9 @@ service_started() {
utpl -D cgroup_name="$CGROUP_NAME" -D cgroup_id="$CGROUP_ID" -D tproxy_fw_mark="$TPROXY_FW_MARK" -D tun_fw_mark="$TUN_FW_MARK" -S "$HIJACK_UT" | nft -f - utpl -D cgroup_name="$CGROUP_NAME" -D cgroup_id="$CGROUP_ID" -D tproxy_fw_mark="$TPROXY_FW_MARK" -D tun_fw_mark="$TUN_FW_MARK" -S "$HIJACK_UT" | nft -f -
# check hijack # check hijack
if (nft list tables | grep -q nikki); then if (nft list tables | grep -q nikki); then
log "Transparent Proxy" "Hijack successful." log "Proxy" "Hijack successful."
else else
log "Transparent Proxy" "Hijack failed." log "Proxy" "Hijack failed."
log "App" "Exit." log "App" "Exit."
fi fi
} }

View File

@ -5,11 +5,11 @@
config_load nikki config_load nikki
config_get enabled "config" "enabled" 0 config_get enabled "config" "enabled" 0
config_get tcp_transparent_proxy_mode "proxy" "tcp_transparent_proxy_mode" config_get tcp_mode "proxy" "tcp_mode"
config_get udp_transparent_proxy_mode "proxy" "udp_transparent_proxy_mode" config_get udp_mode "proxy" "udp_mode"
config_get tun_device "mixin" "tun_device" config_get tun_device "mixin" "tun_device"
if [ "$enabled" == 1 ] && [[ "$tcp_transparent_proxy_mode" == "tun" || "$udp_transparent_proxy_mode" == "tun" ]]; then if [ "$enabled" == 1 ] && [[ "$tcp_mode" == "tun" || "$udp_mode" == "tun" ]]; then
nft insert rule inet fw4 input iifname "$tun_device" counter accept comment "nikki" nft insert rule inet fw4 input iifname "$tun_device" counter accept comment "nikki"
nft insert rule inet fw4 forward oifname "$tun_device" counter accept comment "nikki" nft insert rule inet fw4 forward oifname "$tun_device" counter accept comment "nikki"
nft insert rule inet fw4 forward iifname "$tun_device" counter accept comment "nikki" nft insert rule inet fw4 forward iifname "$tun_device" counter accept comment "nikki"

View File

@ -30,6 +30,82 @@ mixin_dns_port=$(uci -q get nikki.mixin.dns_port); [ -n "$mixin_dns_port" ] && {
uci set nikki.mixin.dns_listen=[::]:$mixin_dns_port uci set nikki.mixin.dns_listen=[::]:$mixin_dns_port
} }
# since v1.22.0
proxy_transparent_proxy=$(uci -q get nikki.proxy.transparent_proxy); [ -n "$proxy_transparent_proxy" ] && {
uci rename nikki.proxy.transparent_proxy=enabled
uci rename nikki.proxy.tcp_transparent_proxy_mode=tcp_mode
uci rename nikki.proxy.udp_transparent_proxy_mode=udp_mode
uci add nikki router_access_control
uci set nikki.@router_access_control[-1].enabled=1
proxy_bypass_user=$(uci -q get nikki.proxy.bypass_user); [ -n "$proxy_bypass_user" ] && {
for user in $proxy_bypass_user; do
uci add_list nikki.@router_access_control[-1].user="$user"
done
}
proxy_bypass_group=$(uci -q get nikki.proxy.bypass_group); [ -n "$proxy_bypass_group" ] && {
for group in $proxy_bypass_group; do
uci add_list nikki.@router_access_control[-1].group="$group"
done
}
proxy_bypass_cgroup=$(uci -q get nikki.proxy.bypass_cgroup); [ -n "$proxy_bypass_cgroup" ] && {
for cgroup in $proxy_bypass_cgroup; do
uci add_list nikki.@router_access_control[-1].cgroup="$cgroup"
done
}
uci set nikki.@router_access_control[-1].proxy=0
uci add nikki router_access_control
uci set nikki.@router_access_control[-1].enabled=1
uci set nikki.@router_access_control[-1].proxy=1
uci add_list nikki.proxy.lan_inbound_interface=lan
proxy_access_control_mode=$(uci -q get nikki.proxy.access_control_mode); [ "$proxy_access_control_mode" != "all" ] && {
proxy_acl_ip=$(uci -q get nikki.proxy.acl_ip); [ -n "$proxy_acl_ip" ] && {
for ip in $proxy_acl_ip; do
uci add nikki lan_access_control
uci set nikki.@lan_access_control[-1].enabled=1
uci add_list nikki.@lan_access_control[-1].ip="$ip"
[ "$proxy_access_control_mode" == "allow" ] && uci set nikki.@lan_access_control[-1].proxy=1
[ "$proxy_access_control_mode" == "block" ] && uci set nikki.@lan_access_control[-1].proxy=0
done
}
proxy_acl_ip6=$(uci -q get nikki.proxy.acl_ip6); [ -n "$proxy_acl_ip6" ] && {
for ip6 in $proxy_acl_ip6; do
uci add nikki lan_access_control
uci set nikki.@lan_access_control[-1].enabled=1
uci add_list nikki.@lan_access_control[-1].ip6="$ip6"
[ "$proxy_access_control_mode" == "allow" ] && uci set nikki.@lan_access_control[-1].proxy=1
[ "$proxy_access_control_mode" == "block" ] && uci set nikki.@lan_access_control[-1].proxy=0
done
}
proxy_acl_mac=$(uci -q get nikki.proxy.acl_mac); [ -n "$proxy_acl_mac" ] && {
for mac in $proxy_acl_mac; do
uci add nikki lan_access_control
uci set nikki.@lan_access_control[-1].enabled=1
uci add_list nikki.@lan_access_control[-1].mac="$mac"
[ "$proxy_access_control_mode" == "allow" ] && uci set nikki.@lan_access_control[-1].proxy=1
[ "$proxy_access_control_mode" == "block" ] && uci set nikki.@lan_access_control[-1].proxy=0
done
}
[ "$proxy_access_control_mode" == "block" ] && {
uci add nikki lan_access_control
uci set nikki.@lan_access_control[-1].enabled=1
uci set nikki.@lan_access_control[-1].proxy=1
}
}
uci del nikki.proxy.access_control_mode
uci del nikki.proxy.acl_ip
uci del nikki.proxy.acl_ip6
uci del nikki.proxy.acl_mac
uci del nikki.proxy.acl_interface
uci del nikki.proxy.bypass_user
uci del nikki.proxy.bypass_group
uci del nikki.proxy.bypass_cgroup
}
# commit # commit
uci commit nikki uci commit nikki

View File

@ -27,32 +27,43 @@
const tun_device = uci.get('nikki', 'mixin', 'tun_device'); const tun_device = uci.get('nikki', 'mixin', 'tun_device');
const tcp_transparent_proxy_mode = uci.get('nikki', 'proxy', 'tcp_transparent_proxy_mode'); const tcp_mode = uci.get('nikki', 'proxy', 'tcp_mode');
const udp_transparent_proxy_mode = uci.get('nikki', 'proxy', 'udp_transparent_proxy_mode'); const udp_mode = uci.get('nikki', 'proxy', 'udp_mode');
const ipv4_dns_hijack = uci_bool(uci.get('nikki', 'proxy', 'ipv4_dns_hijack')); const ipv4_dns_hijack = uci_bool(uci.get('nikki', 'proxy', 'ipv4_dns_hijack'));
const ipv6_dns_hijack = uci_bool(uci.get('nikki', 'proxy', 'ipv6_dns_hijack')); const ipv6_dns_hijack = uci_bool(uci.get('nikki', 'proxy', 'ipv6_dns_hijack'));
const ipv4_proxy = uci_bool(uci.get('nikki', 'proxy', 'ipv4_proxy')); const ipv4_proxy = uci_bool(uci.get('nikki', 'proxy', 'ipv4_proxy'));
const ipv6_proxy = uci_bool(uci.get('nikki', 'proxy', 'ipv6_proxy')); const ipv6_proxy = uci_bool(uci.get('nikki', 'proxy', 'ipv6_proxy'));
const fake_ip_ping_hijack = uci_bool(uci.get('nikki', 'proxy', 'fake_ip_ping_hijack')); const fake_ip_ping_hijack = uci_bool(uci.get('nikki', 'proxy', 'fake_ip_ping_hijack'));
const router_proxy = uci_bool(uci.get('nikki', 'proxy', 'router_proxy')); const router_proxy = uci_bool(uci.get('nikki', 'proxy', 'router_proxy'));
const router_access_control = [];
uci.foreach('nikki', 'router_access_control', (access_control) => {
access_control['enabled'] = uci_bool(access_control['enabled']);
access_control['user'] = filter(uci_array(access_control['user']), (x) => index(users, x) >= 0);
access_control['group'] = filter(uci_array(access_control['group']), (x) => index(groups, x) >= 0);
access_control['cgroup'] = filter(uci_array(access_control['cgroup']), (x) => index(cgroups, x) >= 0);
access_control['proxy'] = uci_bool(access_control['proxy']);
push(router_access_control, access_control);
});
const lan_proxy = uci_bool(uci.get('nikki', 'proxy', 'lan_proxy')); const lan_proxy = uci_bool(uci.get('nikki', 'proxy', 'lan_proxy'));
const lan_inbound_interface = uci_array(uci.get('nikki', 'proxy', 'lan_inbound_interface'));
const access_control_mode = uci.get('nikki', 'proxy', 'access_control_mode'); const lan_inbound_device = [];
const acl_ip = uci_array(uci.get('nikki', 'proxy', 'acl_ip')); for (let interface in lan_inbound_interface) {
const acl_ip6 = uci_array(uci.get('nikki', 'proxy', 'acl_ip6')); const device = ubus.call('network.interface', 'status', {'interface': interface})?.l3_device ?? '';
const acl_mac = uci_array(uci.get('nikki', 'proxy', 'acl_mac')); if (device != '') {
const acl_interface = uci_array(uci.get('nikki', 'proxy', 'acl_interface')); push(lan_inbound_device, device);
}
const bypass_user = filter(uci_array(uci.get('nikki', 'proxy', 'bypass_user')), (x) => x != 'root' && index(users, x) >= 0);
const bypass_group = filter(uci_array(uci.get('nikki', 'proxy', 'bypass_group')), (x) => x != 'root' && index(groups, x) >= 0);
let bypass_cgroup = [];
if (cgroups_version == 1) {
push(bypass_cgroup, cgroup_id);
} else if (cgroups_version == 2) {
bypass_cgroup = filter(uci_array(uci.get('nikki', 'proxy', 'bypass_cgroup')), (x) => x != 'nikki' && index(cgroups, x) >= 0);
push(bypass_cgroup, cgroup_name);
} }
const lan_access_control = [];
uci.foreach('nikki', 'lan_access_control', (access_control) => {
access_control['enabled'] = uci_bool(access_control['enabled']);
access_control['ip'] = uci_array(access_control['ip']);
access_control['ip6'] = uci_array(access_control['ip6']);
access_control['mac'] = uci_array(access_control['mac']);
access_control['proxy'] = uci_bool(access_control['proxy']);
push(lan_access_control, access_control);
});
const bypass_dscp = uci_array(uci.get('nikki', 'proxy', 'bypass_dscp')); const bypass_dscp = uci_array(uci.get('nikki', 'proxy', 'bypass_dscp'));
const bypass_china_mainland_ip = uci_bool(uci.get('nikki', 'proxy', 'bypass_china_mainland_ip')); const bypass_china_mainland_ip = uci_bool(uci.get('nikki', 'proxy', 'bypass_china_mainland_ip'));
@ -67,14 +78,6 @@
push(dns_hijack_nfproto, 'ipv6'); push(dns_hijack_nfproto, 'ipv6');
} }
const acl_device = [];
for (let i = 0; i < length(acl_interface); i++) {
const device = ubus.call('network.interface', 'status', {'interface': acl_interface[i]})?.l3_device ?? '';
if (device != '') {
push(acl_device, device);
}
}
const proxy_nfproto = []; const proxy_nfproto = [];
if (ipv4_proxy) { if (ipv4_proxy) {
push(proxy_nfproto, 'ipv4'); push(proxy_nfproto, 'ipv4');
@ -98,8 +101,8 @@ table inet nikki {
flags interval flags interval
{% if (length(dns_hijack_nfproto) > 0): %} {% if (length(dns_hijack_nfproto) > 0): %}
elements = { elements = {
{% for (let x in dns_hijack_nfproto): %} {% for (let nfproto in dns_hijack_nfproto): %}
{{ x }}, {{ nfproto }},
{% endfor %} {% endfor %}
} }
{% endif %} {% endif %}
@ -110,67 +113,13 @@ table inet nikki {
flags interval flags interval
{% if (length(proxy_nfproto) > 0): %} {% if (length(proxy_nfproto) > 0): %}
elements = { elements = {
{% for (let x in proxy_nfproto): %} {% for (let nfproto in proxy_nfproto): %}
{{ x }}, {{ nfproto }},
{% endfor %} {% endfor %}
} }
{% endif %} {% endif %}
} }
set bypass_user {
type uid
flags interval
auto-merge
{% if (length(bypass_user) > 0): %}
elements = {
{% for (let x in bypass_user): %}
{{ x }},
{% endfor %}
}
{% endif %}
}
set bypass_group {
type gid
flags interval
auto-merge
{% if (length(bypass_group) > 0): %}
elements = {
{% for (let x in bypass_group): %}
{{ x }},
{% endfor %}
}
{% endif %}
}
{% if (cgroups_version == 1): %}
set bypass_cgroup {
typeof meta cgroup
flags interval
auto-merge
{% if (length(bypass_cgroup) > 0): %}
elements = {
{% for (let x in bypass_cgroup): %}
{{ x }},
{% endfor %}
}
{% endif %}
}
{% elif (cgroups_version == 2): %}
set bypass_cgroup {
type cgroupsv2
flags interval
auto-merge
{% if (length(bypass_cgroup) > 0): %}
elements = {
{% for (let x in bypass_cgroup): %}
services/{{ x }},
{% endfor %}
}
{% endif %}
}
{% endif %}
set reserved_ip { set reserved_ip {
type ipv4_addr type ipv4_addr
flags interval flags interval
@ -183,6 +132,19 @@ table inet nikki {
auto-merge auto-merge
} }
set lan_inbound_device {
type ifname
flags interval
auto-merge
{% if (length(lan_inbound_device) > 0): %}
elements = {
{% for (let device in lan_inbound_device): %}
{{ device }},
{% endfor %}
}
{% endif %}
}
set china_ip { set china_ip {
type ipv4_addr type ipv4_addr
flags interval flags interval
@ -199,8 +161,8 @@ table inet nikki {
auto-merge auto-merge
{% if (length(proxy_dport) > 0): %} {% if (length(proxy_dport) > 0): %}
elements = { elements = {
{% for (let x in proxy_dport): %} {% for (let dport in proxy_dport): %}
{{ x }}, {{ dport }},
{% endfor %} {% endfor %}
} }
{% endif %} {% endif %}
@ -212,145 +174,215 @@ table inet nikki {
auto-merge auto-merge
{% if (length(bypass_dscp) > 0): %} {% if (length(bypass_dscp) > 0): %}
elements = { elements = {
{% for (let x in bypass_dscp): %} {% for (let dscp in bypass_dscp): %}
{{ x }}, {{ dscp }},
{% endfor %} {% endfor %}
} }
{% endif %} {% endif %}
} }
set acl_ip { chain router_dns_hijack {
type ipv4_addr {% for (let access_control in router_access_control): %}
flags interval {% if (access_control['enabled']): %}
auto-merge {% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}
{% if (length(acl_ip) > 0): %} meta l4proto { tcp, udp } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
elements = {
{% for (let x in acl_ip): %} {% else %}
{{ x }}, {% if (length(access_control['user']) > 0): %}
{% endfor %} meta l4proto { tcp, udp } meta skuid { {% for (let user in access_control['user']): %} {{ user }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
}
{% endif %} {% endif %}
{% if (length(access_control['group']) > 0): %}
meta l4proto { tcp, udp } meta skgid { {% for (let group in access_control['group']): %} {{ group }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}
meta l4proto { tcp, udp } socket cgroupv2 level 2 { {% for (let cgroup in access_control['cgroup']): %} services/{{ cgroup }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
} }
set acl_ip6 { chain router_redirect {
type ipv6_addr {% for (let access_control in router_access_control): %}
flags interval {% if (access_control['enabled']): %}
auto-merge {% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}
{% if (length(acl_ip6) > 0): %} meta l4proto tcp counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
elements = {
{% for (let x in acl_ip6): %} {% else %}
{{ x }}, {% if (length(access_control['user']) > 0): %}
{% endfor %} meta l4proto tcp meta skuid { {% for (let user in access_control['user']): %} {{ user }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
}
{% endif %} {% endif %}
{% if (length(access_control['group']) > 0): %}
meta l4proto tcp meta skgid { {% for (let group in access_control['group']): %} {{ group }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
{% endif %}
{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}
meta l4proto tcp socket cgroupv2 level 2 { {% for (let cgroup in access_control['cgroup']): %} services/{{ cgroup }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
} }
set acl_mac { chain router_tproxy {
type ether_addr {% for (let access_control in router_access_control): %}
flags interval {% if (access_control['enabled']): %}
auto-merge {% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}
{% if (length(acl_mac) > 0): %} meta l4proto { tcp, udp } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
elements = {
{% for (let x in acl_mac): %} {% else %}
{{ x }}, {% if (length(access_control['user']) > 0): %}
{% endfor %} meta l4proto { tcp, udp } meta skuid { {% for (let user in access_control['user']): %} {{ user }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
}
{% endif %} {% endif %}
{% if (length(access_control['group']) > 0): %}
meta l4proto { tcp, udp } meta skgid { {% for (let group in access_control['group']): %} {{ group }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}
meta l4proto { tcp, udp } socket cgroupv2 level 2 { {% for (let cgroup in access_control['cgroup']): %} services/{{ cgroup }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
} }
set acl_device { chain router_tun {
type ifname {% for (let access_control in router_access_control): %}
flags interval {% if (access_control['enabled']): %}
auto-merge {% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}
{% if (length(acl_device) > 0): %} meta l4proto { tcp, udp } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %}
elements = {
{% for (let x in acl_device): %} {% else %}
{{ x }}, {% if (length(access_control['user']) > 0): %}
{% endfor %} meta l4proto { tcp, udp } meta skuid { {% for (let user in access_control['user']): %} {{ user }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %}
}
{% endif %} {% endif %}
{% if (length(access_control['group']) > 0): %}
meta l4proto { tcp, udp } meta skgid { {% for (let group in access_control['group']): %} {{ group }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}
meta l4proto { tcp, udp } socket cgroupv2 level 2 { {% for (let cgroup in access_control['cgroup']): %} services/{{ cgroup }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
} }
chain lan_dns_hijack { chain lan_dns_hijack {
{% if (access_control_mode == 'all'): %} {% for (let access_control in lan_access_control): %}
meta l4proto { tcp, udp } th dport 53 counter redirect to :{{ dns_port }} {% if (access_control['enabled']): %}
{% elif (access_control_mode == 'allow'): %} {% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}
meta l4proto { tcp, udp } th dport 53 ip saddr @acl_ip counter redirect to :{{ dns_port }} meta l4proto { tcp, udp } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
meta l4proto { tcp, udp } th dport 53 ip6 saddr @acl_ip6 counter redirect to :{{ dns_port }}
meta l4proto { tcp, udp } th dport 53 ether saddr @acl_mac counter redirect to :{{ dns_port }} {% else %}
meta l4proto { tcp, udp } th dport 53 iifname @acl_device counter redirect to :{{ dns_port }} {% if (length(access_control['ip']) > 0): %}
{% elif (access_control_mode == 'block'): %} meta l4proto { tcp, udp } ip saddr { {% for (let ip in access_control['ip']): %} {{ ip }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
meta l4proto { tcp, udp } th dport 53 ip saddr @acl_ip counter return
meta l4proto { tcp, udp } th dport 53 ip6 saddr @acl_ip6 counter return
meta l4proto { tcp, udp } th dport 53 ether saddr @acl_mac counter return
meta l4proto { tcp, udp } th dport 53 iifname @acl_device counter return
meta l4proto { tcp, udp } th dport 53 counter redirect to :{{ dns_port }}
{% endif %} {% endif %}
{% if (length(access_control['ip6']) > 0): %}
meta l4proto { tcp, udp } ip6 saddr { {% for (let ip6 in access_control['ip6']): %} {{ ip6 }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% if (length(access_control['mac']) > 0): %}
meta l4proto { tcp, udp } ether saddr { {% for (let mac in access_control['mac']): %} {{ mac }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
} }
chain lan_redirect { chain lan_redirect {
{% if (access_control_mode == 'all'): %} {% for (let access_control in lan_access_control): %}
meta l4proto tcp counter redirect to :{{ redir_port }} {% if (access_control['enabled']): %}
{% elif (access_control_mode == 'allow'): %} {% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}
meta l4proto tcp ip saddr @acl_ip counter redirect to :{{ redir_port }} meta l4proto tcp tcp counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} counter return {% endif %}
meta l4proto tcp ip6 saddr @acl_ip6 counter redirect to :{{ redir_port }}
meta l4proto tcp ether saddr @acl_mac counter redirect to :{{ redir_port }} {% else %}
meta l4proto tcp iifname @acl_device counter redirect to :{{ redir_port }} {% if (length(access_control['ip']) > 0): %}
{% elif (access_control_mode == 'block'): %} meta l4proto tcp ip saddr { {% for (let ip in access_control['ip']): %} {{ ip }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
meta l4proto tcp ip saddr @acl_ip counter return
meta l4proto tcp ip6 saddr @acl_ip6 counter return
meta l4proto tcp ether saddr @acl_mac counter return
meta l4proto tcp iifname @acl_device counter return
meta l4proto tcp counter redirect to :{{ redir_port }}
{% endif %} {% endif %}
{% if (length(access_control['ip6']) > 0): %}
meta l4proto tcp ip6 saddr { {% for (let ip6 in access_control['ip6']): %} {{ ip6 }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
{% endif %}
{% if (length(access_control['mac']) > 0): %}
meta l4proto tcp ether saddr { {% for (let mac in access_control['mac']): %} {{ mac }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
} }
chain lan_tproxy { chain lan_tproxy {
{% if (access_control_mode == 'all'): %} {% for (let access_control in lan_access_control): %}
meta l4proto { tcp, udp } meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% if (access_control['enabled']): %}
{% elif (access_control_mode == 'allow'): %} {% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}
meta l4proto { tcp, udp } ip saddr @acl_ip meta mark set {{ tproxy_fw_mark }} tproxy ip to :{{ tproxy_port }} counter accept meta l4proto { tcp, udp } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
meta l4proto { tcp, udp } ip6 saddr @acl_ip6 meta mark set {{ tproxy_fw_mark }} tproxy ip6 to :{{ tproxy_port }} counter accept
meta l4proto { tcp, udp } ether saddr @acl_mac meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %}
meta l4proto { tcp, udp } iifname @acl_device meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% if (length(access_control['ip']) > 0): %}
{% elif (access_control_mode == 'block'): %} meta l4proto { tcp, udp } ip saddr { {% for (let ip in access_control['ip']): %} {{ ip }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy ip to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
meta l4proto { tcp, udp } ip saddr @acl_ip counter return
meta l4proto { tcp, udp } ip6 saddr @acl_ip6 counter return
meta l4proto { tcp, udp } ether saddr @acl_mac counter return
meta l4proto { tcp, udp } iifname @acl_device counter return
meta l4proto { tcp, udp } meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept
{% endif %} {% endif %}
{% if (length(access_control['ip6']) > 0): %}
meta l4proto { tcp, udp } ip6 saddr { {% for (let ip6 in access_control['ip6']): %} {{ ip6 }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy ip6 to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% if (length(access_control['mac']) > 0): %}
meta l4proto { tcp, udp } ether saddr { {% for (let mac in access_control['mac']): %} {{ mac }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
} }
chain lan_tun { chain lan_tun {
{% if (access_control_mode == 'all'): %} {% for (let access_control in lan_access_control): %}
meta l4proto { tcp, udp } meta mark set {{ tun_fw_mark }} counter {% if (access_control['enabled']): %}
{% elif (access_control_mode == 'allow'): %} {% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}
meta l4proto { tcp, udp } ip saddr @acl_ip meta mark set {{ tun_fw_mark }} counter meta l4proto { tcp, udp } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %}counter return {% endif %}
meta l4proto { tcp, udp } ip6 saddr @acl_ip6 meta mark set {{ tun_fw_mark }} counter
meta l4proto { tcp, udp } ether saddr @acl_mac meta mark set {{ tun_fw_mark }} counter {% else %}
meta l4proto { tcp, udp } iifname @acl_device meta mark set {{ tun_fw_mark }} counter {% if (length(access_control['ip']) > 0): %}
{% elif (access_control_mode == 'block'): %} meta l4proto { tcp, udp } ip saddr { {% for (let ip in access_control['ip']): %} {{ ip }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %}counter return {% endif %}
meta l4proto { tcp, udp } ip saddr @acl_ip counter return
meta l4proto { tcp, udp } ip6 saddr @acl_ip6 counter return
meta l4proto { tcp, udp } ether saddr @acl_mac counter return
meta l4proto { tcp, udp } iifname @acl_device counter return
meta l4proto { tcp, udp } meta mark set {{ tun_fw_mark }} counter
{% endif %} {% endif %}
{% if (length(access_control['ip6']) > 0): %}
meta l4proto { tcp, udp } ip6 saddr { {% for (let ip6 in access_control['ip6']): %} {{ ip6 }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %}counter return {% endif %}
{% endif %}
{% if (length(access_control['mac']) > 0): %}
meta l4proto { tcp, udp } ether saddr { {% for (let mac in access_control['mac']): %} {{ mac }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %}counter return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
} }
{% if (router_proxy): %} {% if (router_proxy): %}
chain nat_output { chain nat_output {
type nat hook output priority filter; policy accept; type nat hook output priority filter; policy accept;
{% if (cgroups_version == 1): %} {% if (cgroups_version == 1): %}
meta cgroup @bypass_cgroup counter return meta cgroup {{ cgroup_id }} counter return
{% elif (cgroups_version == 2): %} {% elif (cgroups_version == 2): %}
socket cgroupv2 level 2 @bypass_cgroup counter return socket cgroupv2 level 2 services/{{ cgroup_name }} counter return
{% endif %} {% endif %}
meta skuid @bypass_user counter return meta nfproto @dns_hijack_nfproto jump router_dns_hijack
meta skgid @bypass_group counter return {% if (tcp_mode == 'redirect'): %}
meta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter redirect to :{{ dns_port }}
{% if (tcp_transparent_proxy_mode == 'redirect'): %}
fib daddr type { local, multicast, broadcast, anycast } counter return fib daddr type { local, multicast, broadcast, anycast } counter return
ct direction reply counter return ct direction reply counter return
ip daddr @reserved_ip counter return ip daddr @reserved_ip counter return
@ -361,7 +393,7 @@ table inet nikki {
meta nfproto ipv6 meta l4proto . th dport != @proxy_dport counter return meta nfproto ipv6 meta l4proto . th dport != @proxy_dport counter return
meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return
meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return
meta nfproto @proxy_nfproto meta l4proto tcp counter redirect to :{{ redir_port }} meta nfproto @proxy_nfproto jump router_redirect
{% endif %} {% endif %}
{% if (fake_ip_ping_hijack): %} {% if (fake_ip_ping_hijack): %}
ip protocol icmp icmp type echo-request ip daddr {{ fake_ip_range }} counter redirect ip protocol icmp icmp type echo-request ip daddr {{ fake_ip_range }} counter redirect
@ -371,12 +403,10 @@ table inet nikki {
chain mangle_output { chain mangle_output {
type route hook output priority mangle; policy accept; type route hook output priority mangle; policy accept;
{% if (cgroups_version == 1): %} {% if (cgroups_version == 1): %}
meta cgroup @bypass_cgroup counter return meta cgroup {{ cgroup_id }} counter return
{% elif (cgroups_version == 2): %} {% elif (cgroups_version == 2): %}
socket cgroupv2 level 2 @bypass_cgroup counter return socket cgroupv2 level 2 services/{{ cgroup_name }} counter return
{% endif %} {% endif %}
meta skuid @bypass_user counter return
meta skgid @bypass_group counter return
fib daddr type { local, multicast, broadcast, anycast } counter return fib daddr type { local, multicast, broadcast, anycast } counter return
ct direction reply counter return ct direction reply counter return
ip daddr @reserved_ip counter return ip daddr @reserved_ip counter return
@ -388,25 +418,25 @@ table inet nikki {
meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return
meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return
meta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter return meta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter return
{% if (tcp_transparent_proxy_mode == 'tproxy'): %} {% if (tcp_mode == 'tproxy'): %}
meta nfproto @proxy_nfproto meta l4proto tcp meta mark set {{ tproxy_fw_mark }} counter meta nfproto @proxy_nfproto meta l4proto tcp jump router_tproxy
{% elif (tcp_transparent_proxy_mode == 'tun'): %} {% elif (tcp_mode == 'tun'): %}
meta nfproto @proxy_nfproto meta l4proto tcp meta mark set {{ tun_fw_mark }} counter meta nfproto @proxy_nfproto meta l4proto tcp jump router_tun
{% endif %} {% endif %}
{% if (udp_transparent_proxy_mode == 'tproxy'): %} {% if (udp_mode == 'tproxy'): %}
meta nfproto @proxy_nfproto meta l4proto udp meta mark set {{ tproxy_fw_mark }} counter meta nfproto @proxy_nfproto meta l4proto udp jump router_tproxy
{% elif (udp_transparent_proxy_mode == 'tun'): %} {% elif (udp_mode == 'tun'): %}
meta nfproto @proxy_nfproto meta l4proto udp meta mark set {{ tun_fw_mark }} counter meta nfproto @proxy_nfproto meta l4proto udp jump router_tun
{% endif %} {% endif %}
} }
chain mangle_prerouting_router { chain mangle_prerouting_router {
type filter hook prerouting priority mangle - 1; policy accept; type filter hook prerouting priority mangle - 1; policy accept;
{% if (tcp_transparent_proxy_mode == 'tproxy' || udp_transparent_proxy_mode == 'tproxy'): %} {% if (tcp_mode == 'tproxy' || udp_mode == 'tproxy'): %}
meta l4proto { tcp, udp } iifname lo meta mark {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept iifname lo meta l4proto { tcp, udp } meta mark {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept
{% endif %} {% endif %}
{% if (tcp_transparent_proxy_mode == 'tun' || udp_transparent_proxy_mode == 'tun'): %} {% if (tcp_mode == 'tun' || udp_mode == 'tun'): %}
meta l4proto { tcp, udp } iifname {{ tun_device }} counter accept iifname {{ tun_device }} meta l4proto { icmp, tcp, udp } counter accept
{% endif %} {% endif %}
} }
{% endif %} {% endif %}
@ -414,8 +444,8 @@ table inet nikki {
{% if (lan_proxy): %} {% if (lan_proxy): %}
chain dstnat { chain dstnat {
type nat hook prerouting priority dstnat + 1; policy accept; type nat hook prerouting priority dstnat + 1; policy accept;
meta nfproto @dns_hijack_nfproto jump lan_dns_hijack iifname @lan_inbound_device meta nfproto @dns_hijack_nfproto jump lan_dns_hijack
{% if (tcp_transparent_proxy_mode == 'redirect'): %} {% if (tcp_mode == 'redirect'): %}
fib daddr type { local, multicast, broadcast, anycast } counter return fib daddr type { local, multicast, broadcast, anycast } counter return
ct direction reply counter return ct direction reply counter return
ip daddr @reserved_ip counter return ip daddr @reserved_ip counter return
@ -426,7 +456,7 @@ table inet nikki {
meta nfproto ipv6 meta l4proto . th dport != @proxy_dport counter return meta nfproto ipv6 meta l4proto . th dport != @proxy_dport counter return
meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return
meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return
meta nfproto @proxy_nfproto jump lan_redirect iifname @lan_inbound_device meta nfproto @proxy_nfproto jump lan_redirect
{% endif %} {% endif %}
{% if (fake_ip_ping_hijack): %} {% if (fake_ip_ping_hijack): %}
ip protocol icmp icmp type echo-request ip daddr {{ fake_ip_range }} counter redirect ip protocol icmp icmp type echo-request ip daddr {{ fake_ip_range }} counter redirect
@ -446,15 +476,15 @@ table inet nikki {
meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return
meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return
meta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter return meta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter return
{% if (tcp_transparent_proxy_mode == 'tproxy'): %} {% if (tcp_mode == 'tproxy'): %}
meta nfproto @proxy_nfproto meta l4proto tcp jump lan_tproxy iifname @lan_inbound_device meta nfproto @proxy_nfproto meta l4proto tcp jump lan_tproxy
{% elif (tcp_transparent_proxy_mode == 'tun'): %} {% elif (tcp_mode == 'tun'): %}
meta nfproto @proxy_nfproto meta l4proto tcp jump lan_tun iifname @lan_inbound_device meta nfproto @proxy_nfproto meta l4proto tcp jump lan_tun
{% endif %} {% endif %}
{% if (udp_transparent_proxy_mode == 'tproxy'): %} {% if (udp_mode == 'tproxy'): %}
meta nfproto @proxy_nfproto meta l4proto udp jump lan_tproxy iifname @lan_inbound_device meta nfproto @proxy_nfproto meta l4proto udp jump lan_tproxy
{% elif (udp_transparent_proxy_mode == 'tun'): %} {% elif (udp_mode == 'tun'): %}
meta nfproto @proxy_nfproto meta l4proto udp jump lan_tun iifname @lan_inbound_device meta nfproto @proxy_nfproto meta l4proto udp jump lan_tun
{% endif %} {% endif %}
} }
{% endif %} {% endif %}

View File

@ -47,7 +47,7 @@ if (uci_bool(uci.get('nikki', 'mixin', 'authentication'))) {
} }
config['tun'] = {}; config['tun'] = {};
if (uci.get('nikki', 'proxy', 'tcp_transparent_proxy_mode') == 'tun' || uci.get('nikki', 'proxy', 'udp_transparent_proxy_mode') == 'tun') { if (uci.get('nikki', 'proxy', 'tcp_mode') == 'tun' || uci.get('nikki', 'proxy', 'udp_mode') == 'tun') {
config['tun']['enable'] = true; config['tun']['enable'] = true;
config['tun']['auto-route'] = false; config['tun']['auto-route'] = false;
config['tun']['auto-redirect'] = false; config['tun']['auto-redirect'] = false;