'use strict'; 'require form'; 'require view'; 'require uci'; 'require fs'; 'require network'; 'require poll'; 'require tools.widgets as widgets'; 'require tools.nikki as nikki'; return view.extend({ load: function () { return Promise.all([ uci.load('nikki'), network.getNetworks(), ]); }, render: function (data) { const networks = data[1]; let m, s, o, so; m = new form.Map('nikki'); s = m.section(form.NamedSection, 'mixin', 'mixin', _('Mixin Option')); s.tab('general', _('General Config')); o = s.taboption('general', form.ListValue, 'log_level', _('Log Level')); o.optional = true; o.placeholder = _('Unmodified'); o.value('silent'); o.value('error'); o.value('warning'); o.value('info'); o.value('debug'); o = s.taboption('general', form.ListValue, 'mode', _('Mode')); o.optional = true; o.placeholder = _('Unmodified'); o.value('global', _('Global Mode')); o.value('rule', _('Rule Mode')); o.value('direct', _('Direct Mode')); o = s.taboption('general', form.ListValue, 'match_process', _('Match Process')); o.optional = true; o.placeholder = _('Unmodified'); o.value('off'); o.value('strict'); o.value('always'); o = s.taboption('general', form.ListValue, 'outbound_interface', _('Outbound Interface')); o.optional = true; o.placeholder = _('Unmodified'); for (const network of networks) { if (network.getName() === 'loopback') { continue; } o.value(network.getName()); } o = s.taboption('general', form.ListValue, 'ipv6', _('IPv6')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('general', form.ListValue, 'unify_delay', _('Unify Delay')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('general', form.ListValue, 'tcp_concurrent', _('TCP Concurrent')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('general', form.ListValue, 'disable_tcp_keep_alive', _('Disable TCP Keep Alive')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('general', form.Value, 'tcp_keep_alive_idle', _('TCP Keep Alive Idle')); o.datatype = 'uinteger'; o.placeholder = _('Unmodified'); o = s.taboption('general', form.Value, 'tcp_keep_alive_interval', _('TCP Keep Alive Interval')); o.datatype = 'uinteger'; o.placeholder = _('Unmodified'); o = s.taboption('general', form.Value, 'global_client_fingerprint', _('Global Client Fingerprint')); o.placeholder = _('Unmodified'); o.value('random', _('Random')); o.value('chrome', 'Chrome'); o.value('firefox', 'Firefox'); o.value('safari', 'Safari'); o.value('edge', 'Edge'); s.tab('external_control', _('External Control Config')); o = s.taboption('external_control', form.Value, 'ui_path', '*' + ' ' + _('UI Path')); o.placeholder = _('Unmodified'); o.rmempty = false; o = s.taboption('external_control', form.Value, 'ui_name', _('UI Name')); o.placeholder = _('Unmodified'); o = s.taboption('external_control', form.Value, 'ui_url', _('UI Url')); o.placeholder = _('Unmodified'); o.value('https://github.com/Zephyruso/zashboard/archive/refs/heads/gh-pages.zip', 'Zashboard'); o.value('https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip', 'MetaCubeXD'); o.value('https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip', 'YACD'); o.value('https://github.com/MetaCubeX/Razord-meta/archive/refs/heads/gh-pages.zip', 'Razord'); o = s.taboption('external_control', form.Value, 'api_listen', '*' + ' ' + _('API Listen')); o.datatype = 'ipaddrport(1)'; o.placeholder = _('Unmodified'); o.rmempty = false; o = s.taboption('external_control', form.Value, 'api_secret', _('API Secret')); o.password = true; o.placeholder = _('Unmodified'); o = s.taboption('external_control', form.ListValue, 'selection_cache', _('Save Proxy Selection')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); s.tab('inbound', _('Inbound Config')); o = s.taboption('inbound', form.ListValue, 'allow_lan', _('Allow Lan')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('inbound', form.Value, 'http_port', _('HTTP Port')); o.datatype = 'port'; o.placeholder = _('Unmodified'); o = s.taboption('inbound', form.Value, 'socks_port', _('SOCKS Port')); o.datatype = 'port'; o.placeholder = _('Unmodified'); o = s.taboption('inbound', form.Value, 'mixed_port', _('Mixed Port')); o.datatype = 'port'; o.placeholder = _('Unmodified'); o = s.taboption('inbound', form.Value, 'redir_port', '*' + ' ' + _('Redirect Port')); o.datatype = 'port'; o.placeholder = _('Unmodified'); o.rmempty = false; o = s.taboption('inbound', form.Value, 'tproxy_port', '*' + ' ' + _('TPROXY Port')); o.datatype = 'port'; o.placeholder = _('Unmodified'); o.rmempty = false; o = s.taboption('inbound', form.Flag, 'authentication', _('Overwrite Authentication')); o.rmempty = false; o = s.taboption('inbound', form.SectionValue, '_authentications', form.TableSection, 'authentication', _('Edit Authentications')); o.retain = true; o.depends('authentication', '1'); o.subsection.addremove = true; o.subsection.anonymous = true; o.subsection.sortable = true; so = o.subsection.option(form.Flag, 'enabled', _('Enable')); so.rmempty = false; so = o.subsection.option(form.Value, 'username', _('Username')); so.rmempty = false; so = o.subsection.option(form.Value, 'password', _('Password')); so.password = true; so.rmempty = false; s.tab('tun', _('TUN Config')); o = s.taboption('tun', form.Value, 'tun_device', '*' + ' ' + _('Device Name')); o.placeholder = _('Unmodified'); o.rmempty = false; o = s.taboption('tun', form.ListValue, 'tun_stack', _('Stack')); o.optional = true; o.placeholder = _('Unmodified'); o.value('system', 'System'); o.value('gvisor', 'gVisor'); o.value('mixed', 'Mixed'); o = s.taboption('tun', form.Value, 'tun_mtu', _('MTU')); o.datatype = 'uinteger'; o.placeholder = _('Unmodified'); o = s.taboption('tun', form.ListValue, 'tun_gso', _('GSO')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('tun', form.Value, 'tun_gso_max_size', _('GSO Max Size')); o.datatype = 'uinteger'; o.placeholder = _('Unmodified'); o = s.taboption('tun', form.ListValue, 'tun_endpoint_independent_nat', _('Endpoint Independent NAT')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('tun', form.Flag, 'tun_dns_hijack', _('Overwrite DNS Hijack')); o.rmempty = false; o = s.taboption('tun', form.DynamicList, 'tun_dns_hijacks', _('Edit DNS Hijacks')); o.retain = true; o.depends('tun_dns_hijack', '1'); o.value('tcp://any:53'); o.value('udp://any:53'); s.tab('dns', _('DNS Config')); o = s.taboption('dns', form.Value, 'dns_listen', '*' + ' ' + _('DNS Listen')); o.datatype = 'ipaddrport(1)'; o.placeholder = _('Unmodified'); o.rmempty = false; o = s.taboption('dns', form.ListValue, 'dns_ipv6', _('IPv6')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('dns', form.ListValue, 'dns_mode', '*' + ' ' + _('DNS Mode')); o.placeholder = _('Unmodified'); o.value('redir-host', 'Redir-Host'); o.value('fake-ip', 'Fake-IP'); o = s.taboption('dns', form.Value, 'fake_ip_range', '*' + ' ' + _('Fake-IP Range')); o.datatype = 'cidr4'; o.placeholder = _('Unmodified'); o.retain = true; o.rmempty = false; o.depends('dns_mode', 'fake-ip'); o = s.taboption('dns', form.Flag, 'fake_ip_filter', _('Overwrite Fake-IP Filter')); o.rmempty = false; o = s.taboption('dns', form.DynamicList, 'fake_ip_filters', _('Edit Fake-IP Filters')); o.retain = true; o.depends('fake_ip_filter', '1'); o = s.taboption('dns', form.ListValue, 'fake_ip_filter_mode', _('Fake-IP Filter Mode')); o.optional = true; o.placeholder = _('Unmodified'); o.value('blacklist', _('Block Mode')); o.value('whitelist', _('Allow Mode')); o = s.taboption('dns', form.ListValue, 'fake_ip_cache', _('Fake-IP Cache')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('dns', form.ListValue, 'dns_respect_rules', _('Respect Rules')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('dns', form.ListValue, 'dns_doh_prefer_http3', _('DoH Prefer HTTP/3')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('dns', form.ListValue, 'dns_system_hosts', _('Use System Hosts')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('dns', form.ListValue, 'dns_hosts', _('Use Hosts')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('dns', form.Flag, 'hosts', _('Overwrite Hosts')); o.rmempty = false; o = s.taboption('dns', form.SectionValue, '_hosts', form.TableSection, 'hosts', _('Edit Hosts')); o.retain = true; o.depends('hosts', '1'); o.subsection.addremove = true; o.subsection.anonymous = true; o.subsection.sortable = true; so = o.subsection.option(form.Flag, 'enabled', _('Enable')); so.rmempty = false; so = o.subsection.option(form.Value, 'domain_name', _('Domain Name')); so.rmempty = false; so = o.subsection.option(form.DynamicList, 'ip', _('IP')); o = s.taboption('dns', form.Flag, 'dns_nameserver', _('Overwrite Nameserver')); o.rmempty = false; o = s.taboption('dns', form.SectionValue, '_dns_nameservers', form.TableSection, 'nameserver', _('Edit Nameservers')); o.retain = true; o.depends('dns_nameserver', '1'); o.subsection.addremove = true; o.subsection.anonymous = true; o.subsection.sortable = true; so = o.subsection.option(form.Flag, 'enabled', _('Enable')); so.rmempty = false; so = o.subsection.option(form.ListValue, 'type', _('Type')); so.value('default-nameserver'); so.value('proxy-server-nameserver'); so.value('direct-nameserver'); so.value('nameserver'); so.value('fallback'); so = o.subsection.option(form.DynamicList, 'nameserver', _('Nameserver')); o = s.taboption('dns', form.Flag, 'dns_nameserver_policy', _('Overwrite Nameserver Policy')); o.rmempty = false; o = s.taboption('dns', form.SectionValue, '_dns_nameserver_policies', form.TableSection, 'nameserver_policy', _('Edit Nameserver Policies')); o.retain = true; o.depends('dns_nameserver_policy', '1'); o.subsection.addremove = true; o.subsection.anonymous = true; o.subsection.sortable = true; so = o.subsection.option(form.Flag, 'enabled', _('Enable')); so.rmempty = false; so = o.subsection.option(form.Value, 'matcher', _('Matcher')); so.rmempty = false; so = o.subsection.option(form.DynamicList, 'nameserver', _('Nameserver')); s.tab('sniffer', _('Sniffer Config')); o = s.taboption('sniffer', form.ListValue, 'sniffer', _('Enable')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('sniffer', form.ListValue, 'sniffer_sniff_dns_mapping', _('Sniff Redir-Host')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('sniffer', form.ListValue, 'sniffer_sniff_pure_ip', _('Sniff Pure IP')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('sniffer', form.Flag, 'sniffer_force_domain_name', _('Overwrite Force Sniff Domain Name')); o.rmempty = false; o = s.taboption('sniffer', form.DynamicList, 'sniffer_force_domain_names', _('Force Sniff Domain Name')); o.depends('sniffer_force_domain_name', '1'); o = s.taboption('sniffer', form.Flag, 'sniffer_ignore_domain_name', _('Overwrite Ignore Sniff Domain Name')); o.rmempty = false; o = s.taboption('sniffer', form.DynamicList, 'sniffer_ignore_domain_names', _('Ignore Sniff Domain Name')); o.depends('sniffer_ignore_domain_name', '1'); o = s.taboption('sniffer', form.Flag, 'sniffer_sniff', _('Overwrite Sniff By Protocol')); o.rmempty = false; o = s.taboption('sniffer', form.SectionValue, '_sniffer_sniffs', form.TableSection, 'sniff', _('Sniff By Protocol')); o.retain = true; o.depends('sniffer_sniff', '1'); o.subsection.anonymous = true; o.subsection.addremove = false; so = o.subsection.option(form.Flag, 'enabled', _('Enable')); so.rmempty = false; so = o.subsection.option(form.ListValue, 'protocol', _('Protocol')); so.value('HTTP'); so.value('TLS'); so.value('QUIC'); so.readonly = true; so = o.subsection.option(form.DynamicList, 'port', _('Port')); so.datatype = 'portrange'; so = o.subsection.option(form.Flag, 'overwrite_destination', _('Overwrite Destination')); so.rmempty = false; s.tab('rule', _('Rule Config')); o = s.taboption('rule', form.Flag, 'rule_provider', _('Append Rule Provider')); o.rmempty = false; o = s.taboption('rule', form.SectionValue, '_rule_providers', form.GridSection, 'rule_provider', _('Edit Rule Providers')); o.retain = true; o.depends('rule_provider', '1'); o.subsection.anonymous = true; o.subsection.addremove = true; o.subsection.sortable = true; so = o.subsection.option(form.Flag, 'enabled', _('Enable')); so.default = 1; so.editable = true; so.modalonly = false; so.rmempty = false; so = o.subsection.option(form.Value, 'name', _('Name')); so.rmempty = false; so = o.subsection.option(form.ListValue, 'type', _('Type')); so.default = 'http'; so.rmempty = false; so.value('http'); so.value('file'); so = o.subsection.option(form.Value, 'url', _('Url')); so.modalonly = true; so.rmempty = false; so.depends('type', 'http'); so = o.subsection.option(form.Value, 'node', _('Node')); so.default = 'DIRECT'; so.modalonly = true; so.depends('type', 'http'); so.value('GLOBAL'); so.value('DIRECT'); so = o.subsection.option(form.Value, 'file_size_limit', _('File Size Limit')); so.datatype = 'uinteger'; so.default = 0; so.modalonly = true; so.depends('type', 'http'); so = o.subsection.option(form.FileUpload, 'file_path', _('File Path')); so.modalonly = true; so.rmempty = false; so.root_directory = nikki.ruleProvidersDir; so.depends('type', 'file'); so = o.subsection.option(form.ListValue, 'file_format', _('File Format')); so.default = 'yaml'; so.value('mrs'); so.value('yaml'); so.value('text'); so = o.subsection.option(form.ListValue, 'behavior', _('Behavior')); so.default = 'classical'; so.rmempty = false; so.value('classical'); so.value('domain'); so.value('ipcidr'); so = o.subsection.option(form.Value, 'update_interval', _('Update Interval')); so.datatype = 'uinteger'; so.default = 0; so.modalonly = true; so.depends('type', 'http'); o = s.taboption('rule', form.Flag, 'rule', _('Append Rule')); o.rmempty = false; o = s.taboption('rule', form.SectionValue, '_rules', form.TableSection, 'rule', _('Edit Rules')); o.retain = true; o.depends('rule', '1'); o.subsection.anonymous = true; o.subsection.addremove = true; o.subsection.sortable = true; so = o.subsection.option(form.Flag, 'enabled', _('Enable')); so.default = 1; so.rmempty = false; so = o.subsection.option(form.Value, 'type', _('Type')); so.rmempty = false; so.value('RULE-SET', _('Rule Set')); so.value('DOMAIN', _('Domain Name')); so.value('DOMAIN-SUFFIX', _('Domain Name Suffix')); so.value('DOMAIN-KEYWORD', _('Domain Name Keyword')); so.value('DOMAIN-REGEX', _('Domain Name Regex')); so.value('IP-CIDR', _('Destination IP')); so.value('DST-PORT', _('Destination Port')); so.value('PROCESS-NAME', _('Process Name')); so.value('GEOSITE', _('Domain Name Geo')); so.value('GEOIP', _('Destination IP Geo')); so = o.subsection.option(form.Value, 'matcher', _('Matcher')); so.rmempty = false; so = o.subsection.option(form.Value, 'node', _('Node')); so.default = 'GLOBAL'; so.value('GLOBAL'); so.value('DIRECT'); so.value('REJECT'); so.value('REJECT-DROP'); so = o.subsection.option(form.Flag, 'no_resolve', _('No Resolve')); so.rmempty = false; so.depends('type', 'IP-CIDR'); so.depends('type', 'IP-CIDR6'); so.depends('type', 'GEOIP'); s.tab('geox', _('GeoX Config')); o = s.taboption('geox', form.ListValue, 'geoip_format', _('GeoIP Format')); o.optional = true; o.placeholder = _('Unmodified'); o.value('dat', 'DAT'); o.value('mmdb', 'MMDB'); o = s.taboption('geox', form.ListValue, 'geodata_loader', _('GeoData Loader')); o.optional = true; o.placeholder = _('Unmodified'); o.value('standard', _('Standard Loader')); o.value('memconservative', _('Memory Conservative Loader')); o = s.taboption('geox', form.Value, 'geosite_url', _('GeoSite Url')); o.placeholder = _('Unmodified'); o = s.taboption('geox', form.Value, 'geoip_mmdb_url', _('GeoIP(MMDB) Url')); o.placeholder = _('Unmodified'); o = s.taboption('geox', form.Value, 'geoip_dat_url', _('GeoIP(DAT) Url')); o.placeholder = _('Unmodified'); o = s.taboption('geox', form.Value, 'geoip_asn_url', _('GeoIP(ASN) Url')); o.placeholder = _('Unmodified'); o = s.taboption('geox', form.ListValue, 'geox_auto_update', _('GeoX Auto Update')); o.optional = true; o.placeholder = _('Unmodified'); o.value('0', _('Disable')); o.value('1', _('Enable')); o = s.taboption('geox', form.Value, 'geox_update_interval', _('GeoX Update Interval')); o.datatype = 'uinteger'; o.placeholder = _('Unmodified'); s.tab('mixin_file_content', _('Mixin File Content')); o = s.taboption('mixin_file_content', form.Flag, 'mixin_file_content', _('Enable'), _('Please go to the editor tab to edit the file for mixin')); o.rmempty = false; return m.render(); } });