├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml └── workflows │ ├── clear_cache.yml │ ├── close_issues.yml │ ├── compile_dev_core.yml │ ├── compile_meta_core.yml │ ├── compile_new_ipk.yml │ ├── compile_premium_core.yml │ ├── delete_old_workflow.yml │ ├── master_release_sync.yml │ └── update_third_party_resources.yml ├── LICENSE ├── README.md ├── announcement ├── img ├── BTC-Wallet.png ├── ETH-Wallet.png ├── USDT-Wallet.png ├── config-subscribe.png ├── config-subscribe1.png ├── config.png ├── game-settings.png ├── game1.png ├── game2.png ├── log.png ├── logo.png ├── meta.png ├── proxy1.png ├── proxy2.png ├── proxy3.png ├── proxy4.png ├── servers.png ├── set1.png ├── set10.png ├── set11.png ├── set12.png ├── set2.png ├── set3.png ├── set4.png ├── set6.png ├── set7.png ├── set8.png ├── set9.png ├── settings.png ├── state.png ├── state1.png ├── state2.png ├── state3.png ├── state4.png └── state5.png └── luci-app-openclash ├── Makefile ├── luasrc ├── controller │ └── openclash.lua ├── model │ └── cbi │ │ └── openclash │ │ ├── client.lua │ │ ├── config-overwrite.lua │ │ ├── config-subscribe-edit.lua │ │ ├── config-subscribe.lua │ │ ├── config.lua │ │ ├── custom-dns-edit.lua │ │ ├── game-rules-file-manage.lua │ │ ├── game-rules-manage.lua │ │ ├── groups-config.lua │ │ ├── log.lua │ │ ├── other-file-edit.lua │ │ ├── other-rules-edit.lua │ │ ├── proxy-provider-config.lua │ │ ├── proxy-provider-file-manage.lua │ │ ├── rule-providers-config.lua │ │ ├── rule-providers-file-manage.lua │ │ ├── rule-providers-manage.lua │ │ ├── rule-providers-settings.lua │ │ ├── servers-config.lua │ │ ├── servers.lua │ │ └── settings.lua ├── openclash.lua └── view │ └── openclash │ ├── cfg_check.htm │ ├── config_editor.htm │ ├── debug.htm │ ├── developer.htm │ ├── dler_login.htm │ ├── dlercloud.htm │ ├── download_rule.htm │ ├── dvalue.htm │ ├── flush_fakeip_cache.htm │ ├── input_file_name.htm │ ├── input_rename.htm │ ├── log.htm │ ├── myip.htm │ ├── other_button.htm │ ├── other_stream_option.htm │ ├── select_git_cdn.htm │ ├── server_url.htm │ ├── status.htm │ ├── sub_info_show.htm │ ├── switch_dashboard.htm │ ├── switch_mode.htm │ ├── tblsection.htm │ ├── tblsection_dns.htm │ ├── toolbar_show.htm │ ├── update.htm │ ├── update_config.htm │ └── upload.htm ├── po └── zh-cn │ └── openclash.zh-cn.po ├── root ├── etc │ ├── config │ │ └── openclash │ ├── init.d │ │ └── openclash │ ├── openclash │ │ ├── Country.mmdb │ │ ├── GeoIP.dat │ │ ├── GeoSite.dat │ │ ├── china_ip6_route.ipset │ │ ├── china_ip_route.ipset │ │ ├── custom │ │ │ ├── openclash_custom_chnroute6_pass.list │ │ │ ├── openclash_custom_chnroute_pass.list │ │ │ ├── openclash_custom_domain_dns.list │ │ │ ├── openclash_custom_domain_dns_policy.list │ │ │ ├── openclash_custom_fake_filter.list │ │ │ ├── openclash_custom_fallback_filter.yaml │ │ │ ├── openclash_custom_firewall_rules.sh │ │ │ ├── openclash_custom_hosts.list │ │ │ ├── openclash_custom_localnetwork_ipv4.list │ │ │ ├── openclash_custom_localnetwork_ipv6.list │ │ │ ├── openclash_custom_overwrite.sh │ │ │ ├── openclash_custom_rules.list │ │ │ ├── openclash_custom_rules_2.list │ │ │ └── openclash_custom_sniffer.yaml │ │ ├── game_rules │ │ │ ├── CS-GO.rules │ │ │ ├── Monster-Hunter-World.rules │ │ │ └── Steam.rules │ │ └── rule_provider │ │ │ ├── ABC │ │ │ ├── AI Suite │ │ │ ├── Abema_TV │ │ │ ├── Amazon │ │ │ ├── Apple │ │ │ ├── Apple_Music │ │ │ ├── Apple_News │ │ │ ├── Apple_TV │ │ │ ├── BBC_iPlayer │ │ │ ├── Bahamut │ │ │ ├── Bilibili │ │ │ ├── Crypto │ │ │ ├── DAZN │ │ │ ├── Discord │ │ │ ├── Discovery_Plus │ │ │ ├── Disney_Plus │ │ │ ├── Domestic │ │ │ ├── Domestic_IPs │ │ │ ├── F1_TV │ │ │ ├── FCM │ │ │ ├── Fox+ │ │ │ ├── Fox_Now │ │ │ ├── Google FCM │ │ │ ├── HBO │ │ │ ├── HBO_Go │ │ │ ├── HBO_Max │ │ │ ├── Hulu │ │ │ ├── Hulu_Japan │ │ │ ├── IQI │ │ │ ├── IQYI │ │ │ ├── JOOX │ │ │ ├── Japonx │ │ │ ├── KKBOX │ │ │ ├── KKTV │ │ │ ├── LAN │ │ │ ├── Letv │ │ │ ├── Line_TV │ │ │ ├── Microsoft │ │ │ ├── Netease_Music │ │ │ ├── Netflix │ │ │ ├── Niconico │ │ │ ├── PBS │ │ │ ├── Pandora │ │ │ ├── PayPal │ │ │ ├── Pornhub │ │ │ ├── Proxy │ │ │ ├── Reject │ │ │ ├── Scholar │ │ │ ├── Soundcloud │ │ │ ├── Special │ │ │ ├── Speedtest │ │ │ ├── Spotify │ │ │ ├── Steam │ │ │ ├── Telegram │ │ │ ├── Tencent_Video │ │ │ ├── ViuTV │ │ │ ├── WeTV │ │ │ ├── YouTube │ │ │ ├── Youku │ │ │ ├── encoreTVB │ │ │ ├── iQiyi │ │ │ ├── miHoYo │ │ │ └── myTV_SUPER │ └── uci-defaults │ │ └── luci-openclash ├── usr │ └── share │ │ ├── openclash │ │ ├── YAML.rb │ │ ├── cfg_unused_servers_del.sh │ │ ├── clash_version.sh │ │ ├── log.sh │ │ ├── openclash.sh │ │ ├── openclash_chnroute.sh │ │ ├── openclash_core.sh │ │ ├── openclash_curl.sh │ │ ├── openclash_custom_domain_dns.sh │ │ ├── openclash_debug.sh │ │ ├── openclash_debug_dns.lua │ │ ├── openclash_debug_getcon.lua │ │ ├── openclash_dler_checkin.lua │ │ ├── openclash_download_dashboard.sh │ │ ├── openclash_download_rule_list.sh │ │ ├── openclash_geoasn.sh │ │ ├── openclash_geoip.sh │ │ ├── openclash_geosite.sh │ │ ├── openclash_get_network.lua │ │ ├── openclash_history_get.sh │ │ ├── openclash_ipdb.sh │ │ ├── openclash_ps.sh │ │ ├── openclash_rule.sh │ │ ├── openclash_streaming_unlock.lua │ │ ├── openclash_update.sh │ │ ├── openclash_urlencode.lua │ │ ├── openclash_version.sh │ │ ├── openclash_watchdog.sh │ │ ├── res │ │ │ ├── default.yaml │ │ │ ├── game_rules.list │ │ │ ├── lhie1.yaml │ │ │ ├── rule_providers.list │ │ │ └── sub_ini.list │ │ ├── ruby.sh │ │ ├── ui │ │ │ ├── dashboard │ │ │ │ ├── CNAME │ │ │ │ ├── assets │ │ │ │ │ ├── index-41a41303.css │ │ │ │ │ ├── index-abc6db04.js │ │ │ │ │ ├── logo-b453e72f.png │ │ │ │ │ └── vendor-0c169955.js │ │ │ │ ├── index.html │ │ │ │ ├── manifest.webmanifest │ │ │ │ ├── sw.js │ │ │ │ └── workbox-4de3aa5f.js │ │ │ ├── metacubexd │ │ │ │ ├── CNAME │ │ │ │ ├── apple-touch-icon-180x180.png │ │ │ │ ├── assets │ │ │ │ │ ├── Config-B1EwbU18.js │ │ │ │ │ ├── Connections-WHEuHC_k.js │ │ │ │ │ ├── DocumentTitle-qgMGpI7d.js │ │ │ │ │ ├── FiraSans-Regular-BN6hITtY.ttf │ │ │ │ │ ├── IconReload-bqqdFQ5q.js │ │ │ │ │ ├── Logs-DmnD-Vbh.js │ │ │ │ │ ├── Overview-BigJMrEz.js │ │ │ │ │ ├── Proxies-DCaTGxZZ.js │ │ │ │ │ ├── Rules-T7FAMMsr.js │ │ │ │ │ ├── Setup-2nY6XKtT.js │ │ │ │ │ ├── Twemoji.Mozilla-BSQKJ6aF.ttf │ │ │ │ │ ├── fira-sans-cyrillic-400-normal-9itZEwnn.woff2 │ │ │ │ │ ├── fira-sans-cyrillic-400-normal-DivIpeVh.woff │ │ │ │ │ ├── fira-sans-cyrillic-ext-400-normal-Ct_d_4pr.woff │ │ │ │ │ ├── fira-sans-cyrillic-ext-400-normal-DVFiJ7cT.woff2 │ │ │ │ │ ├── fira-sans-greek-400-normal-B4JJYYvj.woff │ │ │ │ │ ├── fira-sans-greek-400-normal-xziLJ4od.woff2 │ │ │ │ │ ├── fira-sans-greek-ext-400-normal-BA5_ngob.woff │ │ │ │ │ ├── fira-sans-greek-ext-400-normal-DDGpGFz4.woff2 │ │ │ │ │ ├── fira-sans-latin-400-normal-CRr34ncs.woff │ │ │ │ │ ├── fira-sans-latin-400-normal-DqUVgETp.woff2 │ │ │ │ │ ├── fira-sans-latin-ext-400-normal-BsVau5p6.woff2 │ │ │ │ │ ├── fira-sans-latin-ext-400-normal-Cah6ivqJ.woff │ │ │ │ │ ├── fira-sans-vietnamese-400-normal-CiKzo2z6.woff │ │ │ │ │ ├── fira-sans-vietnamese-400-normal-D5T8w5kG.woff2 │ │ │ │ │ ├── index-BfxF6Zjo.js │ │ │ │ │ ├── index-Bg_1VLqf.css │ │ │ │ │ ├── index-CXfh_Ffl.js │ │ │ │ │ └── time-M8P-MK1v.js │ │ │ │ ├── favicon.ico │ │ │ │ ├── favicon.svg │ │ │ │ ├── index.html │ │ │ │ ├── manifest.webmanifest │ │ │ │ ├── maskable-icon-512x512.png │ │ │ │ ├── pwa-192x192.png │ │ │ │ ├── pwa-512x512.png │ │ │ │ ├── pwa-64x64.png │ │ │ │ ├── registerSW.js │ │ │ │ ├── sw.js │ │ │ │ └── workbox-3e8df8c8.js │ │ │ ├── yacd │ │ │ │ ├── CNAME │ │ │ │ ├── Twemoji_Mozilla.ttf │ │ │ │ ├── _headers │ │ │ │ ├── apple-touch-icon-precomposed.png │ │ │ │ ├── assets │ │ │ │ │ ├── BaseModal-e9f180d4.css │ │ │ │ │ ├── BaseModal-f42f892a.js │ │ │ │ │ ├── Config-0abd223e.js │ │ │ │ │ ├── Config-7eb3f1bb.css │ │ │ │ │ ├── Connections-796224c1.css │ │ │ │ │ ├── Connections-c9877694.js │ │ │ │ │ ├── Fab-0b65516b.css │ │ │ │ │ ├── Fab-47e19297.js │ │ │ │ │ ├── Input-e46653b4.js │ │ │ │ │ ├── Logs-7103293e.js │ │ │ │ │ ├── Logs-beb8fc98.css │ │ │ │ │ ├── Proxies-70a463d2.js │ │ │ │ │ ├── Proxies-dfd53d55.css │ │ │ │ │ ├── Rules-162ef666.css │ │ │ │ │ ├── Rules-a8c74e6e.js │ │ │ │ │ ├── Select-04258549.js │ │ │ │ │ ├── Select-20369999.css │ │ │ │ │ ├── TextFitler-3b17a569.js │ │ │ │ │ ├── TextFitler-cbc3b0fe.css │ │ │ │ │ ├── Twemoji_Mozilla-6d90152e.ttf │ │ │ │ │ ├── chart-lib-9fcc76b8.js │ │ │ │ │ ├── debounce-c1ba2006.js │ │ │ │ │ ├── en-f84bd3d3.js │ │ │ │ │ ├── index-1a05af9b.js │ │ │ │ │ ├── index-6d3641b0.js │ │ │ │ │ ├── index-7d3e766d.css │ │ │ │ │ ├── index-84fa0cb3.js │ │ │ │ │ ├── inter-latin-400-normal-0364d368.woff2 │ │ │ │ │ ├── inter-latin-400-normal-3ea830d4.woff │ │ │ │ │ ├── inter-latin-800-normal-a51ac27d.woff2 │ │ │ │ │ ├── inter-latin-800-normal-d08d7178.woff │ │ │ │ │ ├── logs-ca50193b.js │ │ │ │ │ ├── memoize-one.esm-efa1e849.js │ │ │ │ │ ├── play-cb571d64.js │ │ │ │ │ ├── roboto-mono-latin-400-normal-7295944e.woff2 │ │ │ │ │ ├── roboto-mono-latin-400-normal-dffdffa7.woff │ │ │ │ │ ├── rotate-cw-e799f805.js │ │ │ │ │ ├── useRemainingViewPortHeight-dbe2192e.js │ │ │ │ │ ├── vi-75c7db25.js │ │ │ │ │ ├── zh-cn-d82b820c.js │ │ │ │ │ └── zh-tw-9cdfa61b.js │ │ │ │ ├── index.html │ │ │ │ ├── logo.png │ │ │ │ ├── manifest.webmanifest │ │ │ │ ├── registerSW.js │ │ │ │ ├── sw.js │ │ │ │ ├── yacd.ico │ │ │ │ └── yacd.png │ │ │ └── zashboard │ │ │ │ ├── apple-touch-icon.png │ │ │ │ ├── assets │ │ │ │ ├── NotoColorEmoji-flagsonly-CWWDk9km.ttf │ │ │ │ ├── index-CZi4yu0u.css │ │ │ │ ├── index-btPsSEfJ.js │ │ │ │ └── metacubex-BlQkOUXT.jpg │ │ │ │ ├── favicon.ico │ │ │ │ ├── favicon.svg │ │ │ │ ├── icon.svg │ │ │ │ ├── index.html │ │ │ │ ├── manifest.webmanifest │ │ │ │ ├── pwa-192x192.png │ │ │ │ ├── pwa-512x512.png │ │ │ │ ├── pwa-maskable-192x192.png │ │ │ │ ├── pwa-maskable-512x512.png │ │ │ │ ├── registerSW.js │ │ │ │ ├── sw.js │ │ │ │ └── workbox-3e8df8c8.js │ │ ├── yml_change.sh │ │ ├── yml_groups_get.sh │ │ ├── yml_groups_name_ch.sh │ │ ├── yml_groups_name_get.sh │ │ ├── yml_groups_set.sh │ │ ├── yml_proxys_get.sh │ │ ├── yml_proxys_set.sh │ │ └── yml_rules_change.sh │ │ ├── rpcd │ │ └── acl.d │ │ │ └── luci-app-openclash.json │ │ └── ucitrack │ │ └── luci-app-openclash.json └── www │ └── luci-static │ └── resources │ └── openclash │ ├── addon │ ├── dialog │ │ ├── dialog.css │ │ └── dialog.js │ ├── display │ │ ├── autorefresh.js │ │ ├── fullscreen.css │ │ └── fullscreen.js │ ├── edit │ │ └── matchbrackets.js │ ├── fold │ │ ├── foldcode.js │ │ ├── foldgutter.css │ │ ├── foldgutter.js │ │ └── indent-fold.js │ ├── lint │ │ ├── js-yaml.min.js │ │ ├── lint.css │ │ ├── lint.js │ │ └── yaml-lint.js │ ├── merge │ │ ├── diff_match_patch.js │ │ ├── merge.css │ │ └── merge.js │ ├── scroll │ │ └── annotatescrollbar.js │ ├── search │ │ ├── jump-to-line.js │ │ ├── match-highlighter.js │ │ ├── matchesonscrollbar.css │ │ ├── matchesonscrollbar.js │ │ ├── search.js │ │ └── searchcursor.js │ └── selection │ │ └── active-line.js │ ├── img │ ├── Sponsor.svg │ ├── Star.svg │ ├── Telegram.svg │ ├── Tutorials.svg │ ├── Wiki.svg │ ├── arrow-clockwise-light.svg │ ├── eye-light.svg │ ├── eye-slash-light.svg │ ├── logo.png │ ├── megaphone-simple.svg │ ├── version.svg │ └── wrench-light.svg │ ├── lib │ ├── codemirror.css │ └── codemirror.js │ ├── mode │ ├── lua │ │ └── lua.js │ ├── shell │ │ └── shell.js │ └── yaml │ │ └── yaml.js │ └── theme │ ├── idea.css │ ├── material-log.css │ └── material.css └── tools └── po2lmo ├── Makefile └── src ├── po2lmo ├── po2lmo.c ├── template_lmo.c └── template_lmo.h /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: vernesong 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | 3 | contact_links: 4 | 5 | - name: 发表Issue前请先在Issues与Discussions中搜索相关内容 6 | url: https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md#在提问之前 7 | about: 请有意义且描述明确的描述问题症状而非你的猜测 问题解决后加个简短的补充说明 8 | 9 | - name: 启动成功后无法访问个别网站 | 启动成功后个别网站不想走代理流量 10 | url: https://www.bing.com/search?q=clash+rule+写+教&ensearch=1 11 | about: 想要了解clash规则编写相关的问题 12 | 13 | - name: CLASH CORE | PERIUM CORE & 内核问题 | 节点协议加密方式 | 规则 | 内核功能建议 14 | url: https://github.com/Dreamacro/clash/issues/new/choose 15 | about: 原版内核 | P核 16 | 17 | - name: META CORE | MIHOMO CORE & 内核问题 | 节点协议加密方式 | 规则 | 内核功能建议 18 | url: https://github.com/MetaCubeX/mihomo/issues/new/choose 19 | about: M核 20 | 21 | - name: 在线订阅转换问题 | 在线订阅转换增加节点协议加密方式 | 在线订阅转换功能建议 22 | url: https://github.com/tindy2013/subconverter/issues/new/choose 23 | about: 提供并增加预设订阅转换服务地址请通过上方 功能请求 发表 24 | 25 | - name: DASHBOARD & 控制面板问题 | 面板功能建议 26 | url: https://github.com/Dreamacro/clash-dashboard/issues/new/choose 27 | about: 面板问题先请尝试 更换近期未使用过面板设备 或 使用浏览器隐私匿名无痕...模式 访问 28 | 29 | - name: YACD & 控制面板问题 | 面板功能建议 30 | url: https://github.com/haishanh/yacd/issues/new/choose 31 | about: 面板问题先请尝试 更换近期未使用过面板设备 或 使用浏览器隐私匿名无痕...模式 访问 32 | 33 | - name: METACUBEXD & 控制面板问题 | 面板功能建议 34 | url: https://github.com/MetaCubeX/metacubexd/issues/new/choose 35 | about: 面板问题先请尝试 更换近期未使用过面板设备 或 使用浏览器隐私匿名无痕...模式 访问 36 | 37 | - name: YACD-META & 控制面板问题 | 面板功能建议 38 | url: https://github.com/MetaCubeX/Yacd-meta/issues/new/choose 39 | about: 面板问题先请尝试 更换近期未使用过面板设备 或 使用浏览器隐私匿名无痕...模式 访问 40 | 41 | - name: DASHBOARD-META & 控制面板问题 | 面板功能建议 42 | url: https://github.com/MetaCubeX/Razord-meta/issues/new/choose 43 | about: 面板问题先请尝试 更换近期未使用过面板设备 或 使用浏览器隐私匿名无痕...模式 访问 44 | 45 | - name: 我想讨论OpenClash的某个功能 | 我不确定是什么问题 | 我的问题不属于上述选项 | 我的问题无法得到原作者原仓库的帮助 46 | url: https://github.com/vernesong/OpenClash/discussions/new/choose 47 | about: 礼多人不怪 而且有时还很有帮助 48 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: 功能请求 2 | description: Suggest an idea for this project 3 | title: "[Feature] " 4 | labels: [enhancement] 5 | body: 6 | 7 | - type: checkboxes 8 | id: verify_step 9 | attributes: 10 | label: Verify Steps 11 | description: "在提交之前,请确认 / Please verify that you've followed these steps" 12 | options: 13 | - label: Tracker 我已经在 [Issue Tracker](……/) 中找过我要提出的问题 14 | required: true 15 | - label: Latest 我已经**使用最新 Dev 版本**查看过,并不包含该功能特性或者还不完善 16 | required: true 17 | - label: Relevant 我知道 OpenClash 与 内核(Core)、控制面板(Dashboard)、在线订阅转换(Subconverter)等项目之间**无直接关系**,仅相互调用 18 | required: true 19 | - label: Definite 这确实是 OpenClash 应包含的特性 20 | required: true 21 | - label: Contributors 我有能力协助 OpenClash 开发或完善此功能特性 22 | required: false 23 | - label: Meaningless 我提交的**是无意义的**催促更新或修复请求 24 | required: false 25 | 26 | - type: textarea 27 | attributes: 28 | label: Describe the Feature 29 | description: | 30 | 清晰明了地描述您的想法. 例如你想实现什么 Feature 特性或功能? 如何实现该功能? 目前 OpenClash 的行为是什么? 31 | validations: 32 | required: true 33 | 34 | - type: textarea 35 | attributes: 36 | label: Describe Alternatives 37 | description: | 38 | 对您考虑过的任何替代解决方案或备选功能进行清晰、简洁的描述. 39 | validations: 40 | required: false 41 | -------------------------------------------------------------------------------- /.github/workflows/clear_cache.yml: -------------------------------------------------------------------------------- 1 | name: Clean jsDelivr Cache 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | - dev 8 | - core 9 | - package 10 | paths-ignore: 11 | - 'README.md' 12 | - 'LICENSE' 13 | 14 | jobs: 15 | jsDelivr: 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - name: Apt Update 20 | env: 21 | DEBIAN_FRONTEND: noninteractive 22 | run: | 23 | sudo apt-get update 24 | sudo apt-get -y install jq 25 | 26 | - uses: actions/checkout@v4 27 | 28 | # https://github.com/marketplace/actions/git-changesets 29 | - id: changed_files 30 | name: git-changesets 31 | uses: collin-miller/git-changesets@v1 32 | with: 33 | # Default format is 'csv'. Other valid options are 'space-delimited' and 'json'. 34 | format: json 35 | 36 | - name: Clean jsDelivr Cache 37 | run: | 38 | echo '${{ steps.changed_files.outputs.added_modified }}' | jq -r '.[]' | while read file; do 39 | # echo ${{ steps.changed_files.outputs.all }} 40 | curl -sL --retry 3 "https://purge.jsdelivr.net/gh/vernesong/OpenClash@${{ github.ref_name }}/${file}" 41 | done 42 | -------------------------------------------------------------------------------- /.github/workflows/close_issues.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Mark and close stale issues 3 | 4 | on: 5 | schedule: 6 | - cron: "30 8 * * *" 7 | 8 | jobs: 9 | stale: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/stale@v5 15 | with: 16 | stale-issue-message: 'This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 5 days' 17 | days-before-stale: 60 18 | days-before-close: 5 19 | operations-per-run: 200 20 | -------------------------------------------------------------------------------- /.github/workflows/delete_old_workflow.yml: -------------------------------------------------------------------------------- 1 | name: Delete old workflow runs 2 | on: 3 | schedule: 4 | - cron: '0 0 1 * *' 5 | # Run monthly, at 00:00 on the 1st day of month. 6 | 7 | jobs: 8 | del_runs: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Delete workflow runs 12 | uses: Mattraks/delete-workflow-runs@v2 13 | with: 14 | token: ${{ github.token }} 15 | repository: ${{ github.repository }} 16 | retain_days: 30 17 | keep_minimum_runs: 6 -------------------------------------------------------------------------------- /.github/workflows/master_release_sync.yml: -------------------------------------------------------------------------------- 1 | name: Sync Core and Package to Master When release 2 | on: 3 | push: 4 | tags: 5 | - "v*" 6 | workflow_dispatch: 7 | 8 | jobs: 9 | Sync_core_to_master: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Apt Update 13 | env: 14 | DEBIAN_FRONTEND: noninteractive 15 | run: | 16 | sudo apt-get update 17 | sudo apt-get -y install git 18 | 19 | - name: Clone OpenClash Repository 20 | uses: actions/checkout@v4 21 | with: 22 | ref: core 23 | 24 | - name: Sync dev core to master 25 | run: | 26 | if [ -n "$(diff -r ./master/ ./dev/)" ]; then 27 | rm -rf ./master/premium/* 28 | rm -rf ./master/dev/* 29 | rm -rf ./master/meta/* 30 | rm -rf ./master/core_version 31 | cp -rf "./dev/." "./master/" 32 | git config user.name 'github-actions[bot]' 33 | git config user.email 'github-actions[bot]@users.noreply.github.com' 34 | git add . 35 | git commit -m "Release: Auto sync dev core" 36 | git push 37 | else 38 | echo "master core already sync to dev, exit" 39 | fi 40 | 41 | - name: Clone OpenClash Repository 42 | uses: actions/checkout@v4 43 | with: 44 | ref: package 45 | 46 | - name: Sync dev package to master 47 | run: | 48 | if [ -n "$(diff -r ./master/ ./dev/)" ]; then 49 | rm -rf ./master/README.md 50 | rm -rf ./master/luci-app-openclash* 51 | rm -rf ./master/version 52 | cp -rf "./dev/." "./master/" 53 | git config user.name 'github-actions[bot]' 54 | git config user.email 'github-actions[bot]@users.noreply.github.com' 55 | git add . 56 | git commit -m "Release: Auto sync dev package" 57 | git push 58 | else 59 | echo "master package already sync to dev, exit" 60 | fi 61 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019-2024 vernesong 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /announcement: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "zh": "Smart 策略组内核现已支持 policy-priority 参数来自定义调整节点权重,请自行替换测试、使用。", 4 | "en": "The Smart policy group core now supports the policy-priority parameter to customize node weights. Please replace it for testing and use." 5 | }, 6 | { 7 | "zh": "如在更新内核后出现【Parse config error: path is not subpath of home directory】的错误时请在最新版插件设置页面启用【跳过安全路径检查】选项。", 8 | "en": "If you get [Parse config error: path is not subpath of home directory] after updating the core, please enable [Skip Safe Path Check] option in the settings page of the latest dev version of the OpenClash." 9 | } 10 | ] -------------------------------------------------------------------------------- /img/BTC-Wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/BTC-Wallet.png -------------------------------------------------------------------------------- /img/ETH-Wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/ETH-Wallet.png -------------------------------------------------------------------------------- /img/USDT-Wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/USDT-Wallet.png -------------------------------------------------------------------------------- /img/config-subscribe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/config-subscribe.png -------------------------------------------------------------------------------- /img/config-subscribe1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/config-subscribe1.png -------------------------------------------------------------------------------- /img/config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/config.png -------------------------------------------------------------------------------- /img/game-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/game-settings.png -------------------------------------------------------------------------------- /img/game1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/game1.png -------------------------------------------------------------------------------- /img/game2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/game2.png -------------------------------------------------------------------------------- /img/log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/log.png -------------------------------------------------------------------------------- /img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/logo.png -------------------------------------------------------------------------------- /img/meta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/meta.png -------------------------------------------------------------------------------- /img/proxy1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/proxy1.png -------------------------------------------------------------------------------- /img/proxy2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/proxy2.png -------------------------------------------------------------------------------- /img/proxy3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/proxy3.png -------------------------------------------------------------------------------- /img/proxy4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/proxy4.png -------------------------------------------------------------------------------- /img/servers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/servers.png -------------------------------------------------------------------------------- /img/set1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/set1.png -------------------------------------------------------------------------------- /img/set10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/set10.png -------------------------------------------------------------------------------- /img/set11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/set11.png -------------------------------------------------------------------------------- /img/set12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/set12.png -------------------------------------------------------------------------------- /img/set2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/set2.png -------------------------------------------------------------------------------- /img/set3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/set3.png -------------------------------------------------------------------------------- /img/set4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/set4.png -------------------------------------------------------------------------------- /img/set6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/set6.png -------------------------------------------------------------------------------- /img/set7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/set7.png -------------------------------------------------------------------------------- /img/set8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/set8.png -------------------------------------------------------------------------------- /img/set9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/set9.png -------------------------------------------------------------------------------- /img/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/settings.png -------------------------------------------------------------------------------- /img/state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/state.png -------------------------------------------------------------------------------- /img/state1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/state1.png -------------------------------------------------------------------------------- /img/state2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/state2.png -------------------------------------------------------------------------------- /img/state3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/state3.png -------------------------------------------------------------------------------- /img/state4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/state4.png -------------------------------------------------------------------------------- /img/state5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/img/state5.png -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/model/cbi/openclash/log.lua: -------------------------------------------------------------------------------- 1 | -- 2 | local NXFS = require "nixio.fs" 3 | local SYS = require "luci.sys" 4 | local HTTP = require "luci.http" 5 | 6 | m = Map("openclash", translate("Server Logs")) 7 | s = m:section(TypedSection, "openclash") 8 | m.pageaction = false 9 | s.anonymous = true 10 | s.addremove=false 11 | 12 | log = s:option(TextValue, "clog") 13 | log.readonly=true 14 | log.pollcheck=true 15 | log.template="openclash/log" 16 | log.description = translate("") 17 | log.rows = 29 18 | 19 | m:append(Template("openclash/toolbar_show")) 20 | m:append(Template("openclash/config_editor")) 21 | 22 | return m -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/model/cbi/openclash/other-file-edit.lua: -------------------------------------------------------------------------------- 1 | local NXFS = require "nixio.fs" 2 | local SYS = require "luci.sys" 3 | local HTTP = require "luci.http" 4 | local fs = require "luci.openclash" 5 | local file_path = "" 6 | local edit_file_name = "/tmp/openclash_edit_file_name" 7 | 8 | for i = 2, #(arg) do 9 | file_path = file_path .. "/" .. luci.http.urlencode(arg[i]) 10 | end 11 | 12 | if not fs.isfile(file_path) and file_path ~= "" then 13 | file_path = luci.http.urldecode(file_path) 14 | end 15 | 16 | --re-get file path to save 17 | if NXFS.readfile(edit_file_name) ~= file_path and fs.isfile(file_path) then 18 | NXFS.writefile(edit_file_name, file_path) 19 | else 20 | if not fs.isfile(file_path) and fs.isfile(edit_file_name) then 21 | file_path = NXFS.readfile(edit_file_name) 22 | fs.unlink(edit_file_name) 23 | end 24 | end 25 | 26 | m = Map("openclash", translate("File Edit")) 27 | m.pageaction = false 28 | m.redirect = luci.dispatcher.build_url("admin/services/openclash/"..arg[1]) 29 | s = m:section(TypedSection, "openclash") 30 | s.anonymous = true 31 | s.addremove=false 32 | 33 | o = s:option(TextValue, "edit_file") 34 | o.rows = 50 35 | o.wrap = "off" 36 | 37 | function o.write(self, section, value) 38 | if value then 39 | value = value:gsub("\r\n?", "\n") 40 | local old_value = NXFS.readfile(file_path) 41 | if value ~= old_value then 42 | NXFS.writefile(file_path, value) 43 | end 44 | end 45 | end 46 | 47 | function o.cfgvalue(self, section) 48 | return NXFS.readfile(file_path) or "" 49 | end 50 | 51 | local t = { 52 | {Commit, Back} 53 | } 54 | 55 | a = m:section(Table, t) 56 | 57 | o = a:option(Button, "Commit", " ") 58 | o.inputtitle = translate("Commit Settings") 59 | o.inputstyle = "apply" 60 | o.write = function() 61 | luci.http.redirect(m.redirect) 62 | end 63 | 64 | o = a:option(Button,"Back", " ") 65 | o.inputtitle = translate("Back Settings") 66 | o.inputstyle = "reset" 67 | o.write = function() 68 | luci.http.redirect(m.redirect) 69 | end 70 | 71 | m:append(Template("openclash/config_editor")) 72 | m:append(Template("openclash/toolbar_show")) 73 | return m -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/view/openclash/cfg_check.htm: -------------------------------------------------------------------------------- 1 | <%+cbi/valueheader%> 2 |
3 | <% 4 | local val = self:cfgvalue(section) 5 | if val == translate("Enable") or val == translate("Enabled") or val == translate("Config Normal") or val == translate("Exist") then 6 | %> 7 |
8 | <% 9 | else 10 | %> 11 |
12 | <% 13 | end 14 | write(pcdata(val)) 15 | %> 16 |
17 |
18 | <%+cbi/valuefooter%> 19 | -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/view/openclash/download_rule.htm: -------------------------------------------------------------------------------- 1 | <%+cbi/valueheader%> 2 | 3 | 37 | 38 | 39 | 40 | 41 | <%+cbi/valuefooter%> 42 | -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/view/openclash/dvalue.htm: -------------------------------------------------------------------------------- 1 | <%+cbi/valueheader%> 2 |
3 |
4 | <%:Note: Please Upload File According To File Type, File Will Be Saved To The Prompt Path%> 5 |
6 |
7 | <% 8 | local val = self:cfgvalue(section) or self.default or "" 9 | write(pcdata(val)) 10 | %> 11 |
12 |
13 | <%+cbi/valuefooter%> 14 | -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/view/openclash/flush_fakeip_cache.htm: -------------------------------------------------------------------------------- 1 | <%+cbi/valueheader%> 2 | 3 | 34 | 35 | 36 | 37 | <%+cbi/valuefooter%> 38 | -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/view/openclash/input_file_name.htm: -------------------------------------------------------------------------------- 1 | <%+cbi/valueheader%> 2 | 18 | 19 | <%+cbi/valuefooter%> 20 | -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/view/openclash/input_rename.htm: -------------------------------------------------------------------------------- 1 | <%+cbi/valueheader%> 2 | 22 | 23 | <%+cbi/valuefooter%> 24 | -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/view/openclash/other_button.htm: -------------------------------------------------------------------------------- 1 | <%+cbi/valueheader%> 2 | <% if self:cfgvalue(section) ~= false then %> 3 | " style="display: <%= display %>" type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> /> 4 | <% else %> 5 | - 6 | <% end %> 7 | <%+cbi/valuefooter%> 8 | -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/view/openclash/switch_mode.htm: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 9 |
5 |

6 | <%:Collecting data...%> 7 |

8 |
10 |
11 | 12 | 45 | 46 | -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/view/openclash/update_config.htm: -------------------------------------------------------------------------------- 1 | <%+cbi/valueheader%> 2 | <% 3 | local fs = require "luci.openclash" 4 | local filename = fs.filename(self:cfgvalue(section)) or "config" 5 | local display = self.display or "" 6 | local idname = math.random(1000)..(string.match(filename, "[%w_]+") or "") 7 | %> 8 | 19 | 20 | <% 21 | if display == "" then 22 | %> 23 | 24 | <% 25 | end 26 | %> 27 | <%+cbi/valuefooter%> 28 | -------------------------------------------------------------------------------- /luci-app-openclash/luasrc/view/openclash/upload.htm: -------------------------------------------------------------------------------- 1 | <%+cbi/valueheader%> 2 |
3 |
15 | <%+cbi/valuefooter%> 16 | 17 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/Country.mmdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/etc/openclash/Country.mmdb -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/GeoIP.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/etc/openclash/GeoIP.dat -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/GeoSite.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/etc/openclash/GeoSite.dat -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_chnroute6_pass.list: -------------------------------------------------------------------------------- 1 | #baidu.com 2 | #2400:da00::dbf:0:100 3 | ##解决绕过大陆后谷歌商店无法更新 4 | services.googleapis.cn 5 | googleapis.cn 6 | xn--ngstr-lra8j.com -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_chnroute_pass.list: -------------------------------------------------------------------------------- 1 | #baidu.com 2 | #114.114.114.114 3 | ##解决绕过大陆后谷歌商店无法更新 4 | services.googleapis.cn 5 | googleapis.cn 6 | xn--ngstr-lra8j.com -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_domain_dns.list: -------------------------------------------------------------------------------- 1 | #baidu.com -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_domain_dns_policy.list: -------------------------------------------------------------------------------- 1 | #'www.baidu.com': '114.114.114.114' 2 | #'+.internal.crop.com': '10.0.0.1' 3 | #"_vlmcs._tcp.lan": '127.0.0.1:53' 4 | #"geosite:category-games@cn": [https://doh.pub/dns-query, 114.114.114.114, 223.5.5.5] 5 | #"geosite:google": [tls://8.8.4.4, https://1.0.0.1/dns-query] 6 | #"geosite:cn": [https://doh.pub/dns-query, 114.114.114.114, 223.5.5.5] -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_fallback_filter.yaml: -------------------------------------------------------------------------------- 1 | # If IP addresses resolved with servers in `nameservers` are in the specified 2 | # subnets below, they are considered invalid and results from `fallback` 3 | # servers are used instead. 4 | # 5 | # IP address resolved with servers in `nameserver` is used when 6 | # `fallback-filter.geoip` is true and when GEOIP of the IP address is `CN`. 7 | # 8 | # If `fallback-filter.geoip` is false, results from `nameserver` nameservers 9 | # are always used if not match `fallback-filter.ipcidr`. 10 | # 11 | # This is a countermeasure against DNS pollution attacks. 12 | 13 | fallback-filter: 14 | geoip: true 15 | geoip-code: CN 16 | ipcidr: 17 | - ::/128 18 | - ::1/128 19 | - 2001::/32 20 | - 0.0.0.0/8 21 | - 10.0.0.0/8 22 | - 100.64.0.0/10 23 | - 127.0.0.0/8 24 | - 169.254.0.0/16 25 | - 172.16.0.0/12 26 | - 192.0.0.0/24 27 | - 192.0.2.0/24 28 | - 192.88.99.0/24 29 | - 192.168.0.0/16 30 | - 198.18.0.0/15 31 | - 198.51.100.0/24 32 | - 203.0.113.0/24 33 | - 224.0.0.0/4 34 | - 240.0.0.0/4 35 | - 255.255.255.255/32 36 | domain: 37 | - "+.google.com" 38 | - "+.facebook.com" 39 | - "+.youtube.com" 40 | - "+.githubusercontent.com" 41 | - "+.googlevideo.com" 42 | - "+.msftconnecttest.com" 43 | - "+.msftncsi.com" 44 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_firewall_rules.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . /usr/share/openclash/log.sh 3 | . /lib/functions.sh 4 | 5 | # This script is called by /etc/init.d/openclash 6 | # Add your custom firewall rules here, they will be added after the end of the OpenClash iptables rules 7 | 8 | LOG_OUT "Tip: Start Add Custom Firewall Rules..." 9 | 10 | exit 0 -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_hosts.list: -------------------------------------------------------------------------------- 1 | # Static hosts for DNS server and connection establishment (like /etc/hosts) 2 | # 3 | # Wildcard hostnames are supported (e.g. *.clash.dev, *.foo.*.example.com) 4 | # Non-wildcard domain names have a higher priority than wildcard domain names 5 | # e.g. foo.example.com > *.example.com > .example.com 6 | # P.S. +.foo.com equals to .foo.com and foo.com 7 | 8 | # '*.clash.dev': 127.0.0.1 9 | # '.dev': 127.0.0.1 10 | # 'alpha.clash.dev': '::1' 11 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_localnetwork_ipv4.list: -------------------------------------------------------------------------------- 1 | 0.0.0.0/8 2 | 10.0.0.0/8 3 | 100.64.0.0/10 4 | 127.0.0.0/8 5 | 169.254.0.0/16 6 | 172.16.0.0/12 7 | 192.168.0.0/16 8 | 224.0.0.0/4 9 | 240.0.0.0/4 -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_localnetwork_ipv6.list: -------------------------------------------------------------------------------- 1 | ::/128 2 | ::1/128 3 | ::ffff:0:0/96 4 | ::ffff:0:0:0/96 5 | 64:ff9b::/96 6 | 100::/64 7 | 2001::/32 8 | 2001:20::/28 9 | 2001:db8::/32 10 | 2002::/16 11 | fc00::/7 12 | fe80::/10 13 | ff00::/8 -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_rules.list: -------------------------------------------------------------------------------- 1 | rules: 2 | ##- PROCESS-NAME,curl,DIRECT #匹配路由自身进程(curl直连) 3 | ##- DOMAIN-SUFFIX,google.com,Proxy #匹配域名后缀(交由Proxy代理服务器组) 4 | ##- DOMAIN-KEYWORD,google,Proxy #匹配域名关键字(交由Proxy代理服务器组) 5 | ##- DOMAIN,google.com,Proxy #匹配域名(交由Proxy代理服务器组) 6 | ##- DOMAIN-SUFFIX,ad.com,REJECT #匹配域名后缀(拒绝) 7 | ##- IP-CIDR,127.0.0.0/8,DIRECT #匹配数据目标IP(直连) 8 | ##- SRC-IP-CIDR,192.168.1.201/32,DIRECT #匹配数据发起IP(直连) 9 | ##- DST-PORT,80,DIRECT #匹配数据目标端口(直连) 10 | ##- SRC-PORT,7777,DIRECT #匹配数据源端口(直连) 11 | ##- GEOSITE,category-public-tracker,DIRECT #匹配GEOSITE数据库规则(直连) 12 | ##- DOMAIN-REGEX,^abc.*com,PROXY #正则匹配域名 13 | ##- RULE-SET,providername,PROXY #匹配规则集 14 | 15 | ##- IP-CIDR6,2620:0:2d0:200::7/32,PROXY 16 | ##- IP-SUFFIX,8.8.8.8/24,PROXY 17 | ##- IP-ASN,13335,DIRECT 18 | 19 | ##- SRC-GEOIP,cn,DIRECT 20 | ##- SRC-IP-ASN,9808,DIRECT 21 | ##- SRC-IP-SUFFIX,192.168.1.201/8,DIRECT 22 | 23 | ##- IN-PORT,7890,PROXY 24 | ##- IN-TYPE,SOCKS/HTTP,PROXY 25 | ##- IN-USER,mihomo,PROXY 26 | ##- IN-NAME,ss,PROXY 27 | 28 | ##- PROCESS-NAME-REGEX,curl$,PROXY 29 | ##- PROCESS-NAME-REGEX,(?i)Telegram,PROXY 30 | ##- PROCESS-NAME-REGEX,.*telegram.*,PROXY 31 | 32 | ##- NETWORK,udp,DIRECT 33 | ##- DSCP,4,DIRECT 34 | 35 | ##- AND,((DOMAIN,baidu.com),(NETWORK,UDP)),DIRECT 36 | ##- OR,((NETWORK,UDP),(DOMAIN,baidu.com)),REJECT 37 | ##- NOT,((DOMAIN,baidu.com)),PROXY 38 | ##- SUB-RULE,(NETWORK,tcp),sub-rule 39 | 40 | ##排序在上的规则优先生效,如添加(去除规则前的#号): 41 | ##IP段:192.168.1.2-192.168.1.200 直连 42 | ##- SRC-IP-CIDR,192.168.1.2/31,DIRECT 43 | ##- SRC-IP-CIDR,192.168.1.4/30,DIRECT 44 | ##- SRC-IP-CIDR,192.168.1.8/29,DIRECT 45 | ##- SRC-IP-CIDR,192.168.1.16/28,DIRECT 46 | ##- SRC-IP-CIDR,192.168.1.32/27,DIRECT 47 | ##- SRC-IP-CIDR,192.168.1.64/26,DIRECT 48 | ##- SRC-IP-CIDR,192.168.1.128/26,DIRECT 49 | ##- SRC-IP-CIDR,192.168.1.192/29,DIRECT 50 | ##- SRC-IP-CIDR,192.168.1.200/32,DIRECT 51 | 52 | ##IP段:192.168.1.202-192.168.1.255 直连 53 | ##- SRC-IP-CIDR,192.168.1.202/31,DIRECT 54 | ##- SRC-IP-CIDR,192.168.1.204/30,DIRECT 55 | ##- SRC-IP-CIDR,192.168.1.208/28,DIRECT 56 | ##- SRC-IP-CIDR,192.168.1.224/27,DIRECT 57 | 58 | ##此时IP为192.168.1.1和192.168.1.201的客户端流量走代理(策略),其余客户端不走代理 59 | ##因为Fake-IP模式下,IP地址为192.168.1.1的路由器自身流量可走代理(策略),所以需要排除 60 | 61 | ##仅设置路由器自身直连: 62 | ##- SRC-IP-CIDR,192.168.1.1/32,DIRECT 63 | ##- SRC-IP-CIDR,198.18.0.1/32,DIRECT 64 | 65 | ##DDNS 66 | ##- DOMAIN-KEYWORD,synology,DIRECT 67 | ##- DOMAIN-KEYWORD,quickconnect,DIRECT 68 | ##- DOMAIN-SUFFIX,checkip.dyndns.org,DIRECT 69 | ##- DOMAIN-SUFFIX,checkipv6.dyndns.org,DIRECT 70 | ##- DOMAIN-SUFFIX,checkip.synology.com,DIRECT 71 | ##- DOMAIN-SUFFIX,ifconfig.co,DIRECT 72 | ##- DOMAIN-SUFFIX,api.myip.com,DIRECT 73 | ##- DOMAIN-SUFFIX,ip-api.com,DIRECT 74 | ##- DOMAIN-SUFFIX,ipapi.co,DIRECT 75 | ##- DOMAIN-SUFFIX,ip6.seeip.org,DIRECT 76 | ##- DOMAIN-SUFFIX,members.3322.org,DIRECT 77 | 78 | ##在线IP段转CIDR地址:http://ip2cidr.com -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_rules_2.list: -------------------------------------------------------------------------------- 1 | rules: 2 | ##- DOMAIN-SUFFIX,google.com,Proxy #匹配域名后缀(交由Proxy代理服务器组) 3 | ##- DOMAIN-KEYWORD,google,Proxy #匹配域名关键字(交由Proxy代理服务器组) 4 | ##- DOMAIN,google.com,Proxy #匹配域名(交由Proxy代理服务器组) 5 | ##- DOMAIN-SUFFIX,ad.com,REJECT #匹配域名后缀(拒绝) 6 | ##- IP-CIDR,127.0.0.0/8,DIRECT #匹配数据目标IP(直连) 7 | ##- SRC-IP-CIDR,192.168.1.201/32,DIRECT #匹配数据发起IP(直连) 8 | ##- DST-PORT,80,DIRECT #匹配数据目标端口(直连) 9 | ##- SRC-PORT,7777,DIRECT #匹配数据源端口(直连) 10 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/custom/openclash_custom_sniffer.yaml: -------------------------------------------------------------------------------- 1 | # 嗅探域名 可选配置 2 | sniffer: 3 | ## 对 redir-host 类型识别的流量进行强制嗅探 4 | ## 如:Tun、Redir 和 TProxy 并 DNS 为 redir-host 皆属于 5 | force-dns-mapping: true 6 | ## 对所有未获取到域名的流量进行强制嗅探 7 | parse-pure-ip: true 8 | # 是否使用嗅探结果作为实际访问,默认 true 9 | # 全局配置,优先级低于 sniffer.sniff 实际配置 10 | override-destination: true 11 | sniff: # TLS 和 QUIC 默认如果不配置 ports 默认嗅探 443 12 | QUIC: 13 | ports: [ 443 ] 14 | 15 | TLS: 16 | ports: [443, 8443] 17 | 18 | # 默认嗅探 80 19 | HTTP: 20 | ports: [80, 8080-8880] 21 | # 是否使用嗅探结果作为实际访问 22 | override-destination: true 23 | force-domain: 24 | # - '+' # Force all domain to use sniffer 25 | - "+.netflix.com" 26 | - "+.nflxvideo.net" 27 | - "+.amazonaws.com" 28 | - "+.media.dssott.com" 29 | ## 对嗅探结果进行跳过 30 | skip-domain: 31 | - '+.apple.com' 32 | - Mijia Cloud 33 | - dlg.io.mi.com 34 | - +.oray.com 35 | - +.sunlogin.net 36 | - +.push.apple.com 37 | #- geosite:cn 38 | # skip-src-address: # 对于来源ip跳过嗅探 39 | # - 192.168.0.3/32 40 | # skip-dst-address: # 对于目标ip跳过嗅探 41 | # - 192.168.0.3/32 42 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/ABC: -------------------------------------------------------------------------------- 1 | payload: 2 | # > ABC 3 | - DOMAIN-SUFFIX,edgedatg.com 4 | - DOMAIN-SUFFIX,go.com 5 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/AI Suite: -------------------------------------------------------------------------------- 1 | payload: 2 | # > ChatGPT 3 | - DOMAIN-SUFFIX,ai.com 4 | - DOMAIN-SUFFIX,chatgpt.com 5 | - DOMAIN-SUFFIX,openai.com 6 | 7 | # > Chat GPT API & CDN 8 | - DOMAIN-SUFFIX,cdn.oaistatic.com 9 | - DOMAIN,chat.openai.com.cdn.cloudflare.net 10 | - DOMAIN,openaiapi-site.azureedge.net 11 | - DOMAIN,openaicom-api-bdcpf8c6d2e9atf6.z01.azurefd.net 12 | - DOMAIN,openaicomproductionae4b.blob.core.windows.net 13 | - DOMAIN,production-openaicom-storage.azureedge.net 14 | 15 | - DOMAIN-SUFFIX,oaistatic.com 16 | - DOMAIN-SUFFIX,oaiusercontent.com 17 | 18 | - DOMAIN-SUFFIX,o33249.ingest.sentry.io 19 | 20 | # > Claude 21 | - DOMAIN-SUFFIX,anthropic.com 22 | - DOMAIN-SUFFIX,claude.ai 23 | 24 | # > Copilot 25 | - DOMAIN-SUFFIX,copilot.microsoft.com 26 | 27 | # > Gemini 28 | - DOMAIN-SUFFIX,gemini.google.com 29 | - DOMAIN-SUFFIX,generativelanguage.googleapis.com 30 | - DOMAIN-SUFFIX,proactivebackend-pa.googleapis.com 31 | 32 | # > Meta AI 33 | - DOMAIN-SUFFIX,meta.ai 34 | 35 | # > Perplexity AI 36 | - DOMAIN-SUFFIX,perplexity.ai 37 | 38 | # > Siri 39 | - DOMAIN-SUFFIX,apple-relay.apple.com 40 | - DOMAIN,guzzoni.smoot.apple.com -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Abema_TV: -------------------------------------------------------------------------------- 1 | payload: 2 | # > AbemaTV 3 | # - USER-AGENT,AbemaTV* 4 | - PROCESS-NAME,tv.abema 5 | - DOMAIN-SUFFIX,abema.io 6 | - DOMAIN-SUFFIX,abema.tv 7 | - DOMAIN-SUFFIX,akamaized.net 8 | - DOMAIN-SUFFIX,ameba.jp 9 | - DOMAIN-SUFFIX,hayabusa.io 10 | - DOMAIN-KEYWORD,abematv.akamaized.net 11 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Amazon: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Amazon Prime Video 3 | # - USER-AGENT,InstantVideo.US* 4 | # - USER-AGENT,Prime%20Video* 5 | 6 | - DOMAIN-KEYWORD,avoddashs 7 | 8 | - DOMAIN-SUFFIX,aiv-cdn.net 9 | - DOMAIN-SUFFIX,aiv-delivery.net 10 | - DOMAIN-SUFFIX,amazonprimevideos.com 11 | - DOMAIN-SUFFIX,amazonvideo.cc 12 | - DOMAIN-SUFFIX,amazonvideo.com 13 | - DOMAIN-SUFFIX,amazonvideodirect.cc 14 | - DOMAIN-SUFFIX,atv-ext.amazon.com 15 | - DOMAIN-SUFFIX,atv-ext-eu.amazon.com 16 | - DOMAIN-SUFFIX,atv-ext-fe.amazon.com 17 | - DOMAIN-SUFFIX,atv-ps.amazon.com 18 | - DOMAIN-SUFFIX,atv-ps-eu.amazon.co.uk 19 | - DOMAIN-SUFFIX,atv-ps-eu.amazon.com 20 | - DOMAIN-SUFFIX,atv-ps-fe.amazon.co.jp 21 | - DOMAIN-SUFFIX,atv-ps-fe.amazon.com 22 | - DOMAIN-SUFFIX,fls-na.amazon.com 23 | - DOMAIN-SUFFIX,media-amazon.com 24 | - DOMAIN-SUFFIX,primevideo.cc 25 | - DOMAIN-SUFFIX,primevideo.com 26 | - DOMAIN-SUFFIX,prime-video.com 27 | - DOMAIN-SUFFIX,primevideo.info 28 | - DOMAIN-SUFFIX,primevideo.org 29 | - DOMAIN-SUFFIX,primevideo.tv 30 | - DOMAIN-SUFFIX,pv-cdn.net 31 | - DOMAIN-SUFFIX,video.a2z.com 32 | 33 | - DOMAIN,avodmp4s3ww-a.akamaihd.net 34 | - DOMAIN,d1v5ir2lpwr8os.cloudfront.net 35 | - DOMAIN,d1y002tclu9djj.cloudfront.net 36 | - DOMAIN,d22qjgkvxw22r6.cloudfront.net 37 | - DOMAIN,d25xi40x97liuc.cloudfront.net 38 | - DOMAIN,dmqdd6hw24ucf.cloudfront.net 39 | - DOMAIN,d27xxe7juh1us6.cloudfront.net 40 | 41 | - DOMAIN,dualstack.pefs-alb-266603904.eu-west-1.elb.amazonaws.com 42 | 43 | # // 美区网页版需二选一走代理,如 URL-REGEX 则需 MITM www.amazon.com 44 | # // DOMAIN,www.amazon.com 45 | # URL-REGEX,^https?:\/\/www\.amazon\.com\/(Amazon-Video|gp\/video)\/ 46 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Apple: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Apple API 3 | - DOMAIN-KEYWORD,apple.com.akadns.net 4 | - DOMAIN-KEYWORD,icloud.com.akadns.net 5 | - DOMAIN-SUFFIX,aaplimg.com 6 | - DOMAIN-SUFFIX,apple.co 7 | - DOMAIN-SUFFIX,apple.com 8 | - DOMAIN-SUFFIX,apple-cloudkit.com 9 | - DOMAIN-SUFFIX,apple-mapkit.com 10 | - DOMAIN-SUFFIX,appsto.re 11 | - DOMAIN-SUFFIX,cdn-apple.com 12 | - DOMAIN-SUFFIX,icloud.com 13 | - DOMAIN-SUFFIX,icloud-content.com 14 | - DOMAIN-SUFFIX,itunes.com 15 | - DOMAIN-SUFFIX,me.com 16 | - DOMAIN-SUFFIX,mzstatic.com 17 | - IP-CIDR,17.0.0.0/8,no-resolve 18 | - IP-CIDR,63.92.224.0/19,no-resolve 19 | - IP-CIDR,65.199.22.0/23,no-resolve 20 | - IP-CIDR,139.178.128.0/18,no-resolve 21 | - IP-CIDR,144.178.0.0/19,no-resolve 22 | - IP-CIDR,144.178.36.0/22,no-resolve 23 | - IP-CIDR,144.178.48.0/20,no-resolve 24 | - IP-CIDR,192.35.50.0/24,no-resolve 25 | - IP-CIDR,198.183.17.0/24,no-resolve 26 | - IP-CIDR,205.180.175.0/24,no-resolve 27 | 28 | # > Apple News 29 | - DOMAIN-SUFFIX,apple.comscoreresearch.com 30 | - DOMAIN-SUFFIX,apple.news 31 | 32 | # > Apple Maps 33 | - PROCESS-NAME,com.apple.geod 34 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Apple_Music: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Apple Music 3 | # - USER-AGENT,Music* 4 | - PROCESS-NAME,music 5 | - DOMAIN-SUFFIX,applemusic.com 6 | - DOMAIN-SUFFIX,blobstore.apple.com 7 | - DOMAIN-SUFFIX,music.apple.com 8 | - DOMAIN,aod.itunes.apple.com 9 | - DOMAIN,aod-ssl.itunes.apple.com 10 | - DOMAIN,audio.itunes.apple.com 11 | - DOMAIN,audio-ssl.itunes.apple.com 12 | - DOMAIN,mvod.itunes.apple.com 13 | - DOMAIN,streamingaudio.itunes.apple.com 14 | 15 | # iCloud Music Library 16 | - DOMAIN-SUFFIX,blobstore.apple.com 17 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Apple_News: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Apple News and Apple Map TOMTOM Version 3 | # - USER-AGENT,AppleNews* 4 | # - USER-AGENT,com.apple.news* 5 | - DOMAIN,gspe1-ssl.ls.apple.com 6 | # - USER-AGENT,News* 7 | # - DOMAIN,apple.comscoreresearch.com 8 | # - DOMAIN,gateway.icloud.com 9 | # - DOMAIN,news-client.apple.com 10 | # - DOMAIN,news-edge.apple.com 11 | # - DOMAIN,news-events.apple.com 12 | # - DOMAIN-SUFFIX,apple.news 13 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Apple_TV: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Apple TV 3 | - DOMAIN,np-edge.itunes.apple.com 4 | - DOMAIN,play-edge.itunes.apple.com 5 | - DOMAIN-SUFFIX,tv.apple.com 6 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/BBC_iPlayer: -------------------------------------------------------------------------------- 1 | payload: 2 | # > BBC iPlayer 3 | - PROCESS-NAME,bbc.iplayer.android 4 | - DOMAIN-KEYWORD,bbcfmt 5 | - DOMAIN,aod-dash-uk-live.akamaized.net 6 | - DOMAIN,aod-hls-uk-live.akamaized.net 7 | - DOMAIN,vod-dash-uk-live.akamaized.net 8 | - DOMAIN,vod-thumb-uk-live.akamaized.net 9 | - DOMAIN-SUFFIX,bbc.co 10 | - DOMAIN-SUFFIX,bbc.co.uk 11 | - DOMAIN-SUFFIX,bbc.com 12 | - DOMAIN-SUFFIX,bbcfmt.hs.llnwd.net 13 | - DOMAIN-SUFFIX,bbci.co 14 | - DOMAIN-SUFFIX,bbci.co.uk 15 | - DOMAIN-SUFFIX,bidi.net.uk 16 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Bahamut: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Bahamut 3 | # - USER-AGENT,Anime* 4 | - PROCESS-NAME,tw.com.gamer.android.animad 5 | - DOMAIN-SUFFIX,bahamut.com.tw 6 | - DOMAIN-SUFFIX,gamer.com.tw 7 | - DOMAIN,gamer-cds.cdn.hinet.net 8 | - DOMAIN,gamer2-cds.cdn.hinet.net 9 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Bilibili: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Bilibili 3 | # - USER-AGENT,bili* 4 | - DOMAIN-SUFFIX,acg.tv 5 | - DOMAIN-SUFFIX,acgvideo.com 6 | - DOMAIN-SUFFIX,b23.tv 7 | - DOMAIN-SUFFIX,bilibili.com 8 | - DOMAIN-SUFFIX,bilibili.tv 9 | - DOMAIN-SUFFIX,biliapi.net 10 | - DOMAIN-SUFFIX,biliapi.com 11 | - DOMAIN-SUFFIX,bilivideo.com 12 | - DOMAIN-SUFFIX,hdslb.com 13 | - DOMAIN,upos-hz-mirrorakam.akamaized.net 14 | # Hong Kong, Macau, Taiwan 15 | # - USER-AGENT,bili-inter* 16 | - DOMAIN,apiintl.biliapi.net 17 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/DAZN: -------------------------------------------------------------------------------- 1 | payload: 2 | # > DAZN 3 | # - USER-AGENT,DAZN* 4 | 5 | - PROCESS-NAME,com.dazn 6 | 7 | - DOMAIN-KEYWORD,voddazn 8 | 9 | - DOMAIN-SUFFIX,dazn.com 10 | - DOMAIN-SUFFIX,dazn-api.com 11 | - DOMAIN-SUFFIX,dazndn.com 12 | - DOMAIN-SUFFIX,daznedge.net 13 | - DOMAIN-SUFFIX,daznfeeds.com 14 | - DOMAIN-SUFFIX,daznservices.com 15 | - DOMAIN-SUFFIX,indazn.com 16 | - DOMAIN-SUFFIX,indaznlab.com 17 | 18 | - DOMAIN,daznfeeds.com.edgekey.net 19 | - DOMAIN,dca-lm-livedazn.secure.footprint.net 20 | - DOMAIN,h-dazn.online-metrix.net 21 | - DOMAIN,images-daznservices-com.cdn.ampproject.org 22 | - DOMAIN,d151l6v8er5bdm.cloudfront.net 23 | 24 | - IP-CIDR,185.42.236.0/24,no-resolve 25 | - IP-CIDR,185.42.238.0/24,no-resolve -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Discord: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Discord 3 | - DOMAIN-SUFFIX,discord.com 4 | - DOMAIN-SUFFIX,discord.gg 5 | - DOMAIN-SUFFIX,discord.media 6 | - DOMAIN-SUFFIX,discordapp.com 7 | - DOMAIN-SUFFIX,discordapp.net 8 | - DOMAIN-SUFFIX,discordstatus.com -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Discovery_Plus: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Discovery Plus 3 | - PROCESS-NAME,com.discovery.discoveryplus.mobile 4 | - DOMAIN-SUFFIX,content-ause1-ur-discovery1.uplynk.com 5 | - DOMAIN-SUFFIX,disco-api.com 6 | - DOMAIN-SUFFIX,discoveryplus.com 7 | - DOMAIN-SUFFIX,fwmrm.net 8 | - DOMAIN-SUFFIX,getblueshift.com 9 | - DOMAIN-SUFFIX,litix.io 10 | - DOMAIN-SUFFIX,mobile-collector.newrelic.com 11 | - DOMAIN-SUFFIX,uplynk.com 12 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Disney_Plus: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Disney Plus 3 | # - USER-AGENT,Disney* 4 | 5 | - PROCESS-NAME,com.disney.disneyplus 6 | 7 | - DOMAIN-SUFFIX,adobedtm.com 8 | - DOMAIN-SUFFIX,bam.nr-date.net 9 | - DOMAIN-SUFFIX,bamgrid.com 10 | - DOMAIN-SUFFIX,braze.com 11 | - DOMAIN-SUFFIX,cdn.optimizely.com 12 | - DOMAIN-SUFFIX,d9.flashtalking.com 13 | - DOMAIN-SUFFIX,disney.demdex.net 14 | - DOMAIN-SUFFIX,disney.my.sentry.io 15 | - DOMAIN-SUFFIX,disneyplus.bn5x.net 16 | - DOMAIN-SUFFIX,disneyplus.com 17 | - DOMAIN-SUFFIX,disneyplus.com.ssl.sc.omtrdc.net 18 | - DOMAIN-SUFFIX,disney-plus.net 19 | - DOMAIN-SUFFIX,disney-portal.my.onetrust.com 20 | - DOMAIN-SUFFIX,dssott.com 21 | - DOMAIN-SUFFIX,registerdisney.go.com -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/F1_TV: -------------------------------------------------------------------------------- 1 | payload: 2 | # > F1 TV 3 | - DOMAIN,d2n9h2wits23hf.cloudfront.net 4 | - DOMAIN,f1prodlive.akamaized.net 5 | - DOMAIN,mobile-collector.newrelic.com 6 | - DOMAIN-SUFFIX,bitmovin.com 7 | - DOMAIN-SUFFIX,f1esports.com 8 | - DOMAIN-SUFFIX,f1manager.com 9 | - DOMAIN-SUFFIX,f1play.com 10 | - DOMAIN-SUFFIX,formula1.com 11 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/FCM: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Google FCM 3 | - DOMAIN,alt1-mtalk.google.com 4 | - DOMAIN,alt2-mtalk.google.com 5 | - DOMAIN,alt3-mtalk.google.com 6 | - DOMAIN,alt4-mtalk.google.com 7 | - DOMAIN,alt5-mtalk.google.com 8 | - DOMAIN,alt6-mtalk.google.com 9 | - DOMAIN,alt7-mtalk.google.com 10 | - DOMAIN,alt8-mtalk.google.com 11 | - DOMAIN,mtalk.google.com 12 | - IP-CIDR,64.233.177.188/32,no-resolve 13 | - IP-CIDR,64.233.186.188/32,no-resolve 14 | - IP-CIDR,64.233.187.188/32,no-resolve 15 | - IP-CIDR,64.233.188.188/32,no-resolve 16 | - IP-CIDR,64.233.189.188/32,no-resolve 17 | - IP-CIDR,74.125.23.188/32,no-resolve 18 | - IP-CIDR,74.125.24.188/32,no-resolve 19 | - IP-CIDR,74.125.28.188/32,no-resolve 20 | - IP-CIDR,74.125.127.188/32,no-resolve 21 | - IP-CIDR,74.125.137.188/32,no-resolve 22 | - IP-CIDR,74.125.203.188/32,no-resolve 23 | - IP-CIDR,74.125.204.188/32,no-resolve 24 | - IP-CIDR,74.125.206.188/32,no-resolve 25 | - IP-CIDR,108.177.125.188/32,no-resolve 26 | - IP-CIDR,142.250.4.188/32,no-resolve 27 | - IP-CIDR,142.250.10.188/32,no-resolve 28 | - IP-CIDR,142.250.31.188/32,no-resolve 29 | - IP-CIDR,142.250.96.188/32,no-resolve 30 | - IP-CIDR,172.217.194.188/32,no-resolve 31 | - IP-CIDR,172.217.218.188/32,no-resolve 32 | - IP-CIDR,172.217.219.188/32,no-resolve 33 | - IP-CIDR,172.253.63.188/32,no-resolve 34 | - IP-CIDR,172.253.122.188/32,no-resolve 35 | - IP-CIDR,173.194.175.188/32,no-resolve 36 | - IP-CIDR,173.194.218.188/32,no-resolve 37 | - IP-CIDR,209.85.233.188/32,no-resolve -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Fox+: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Fox+ (HK|TW|SG) 3 | # - USER-AGENT,FOXPlus* 4 | - DOMAIN-SUFFIX,akamaized.net 5 | - DOMAIN-SUFFIX,foxplus.com 6 | - DOMAIN-SUFFIX,theplatform.com 7 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Fox_Now: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Fox Now 3 | # - USER-AGENT,FOX%20NOW* 4 | - DOMAIN-SUFFIX,fox.com 5 | - DOMAIN-SUFFIX,foxdcg.com 6 | - DOMAIN-SUFFIX,uplynk.com 7 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Google FCM: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Google FCM 3 | - DOMAIN,alt1-mtalk.google.com 4 | - DOMAIN,alt2-mtalk.google.com 5 | - DOMAIN,alt3-mtalk.google.com 6 | - DOMAIN,alt4-mtalk.google.com 7 | - DOMAIN,alt5-mtalk.google.com 8 | - DOMAIN,alt6-mtalk.google.com 9 | - DOMAIN,alt7-mtalk.google.com 10 | - DOMAIN,alt8-mtalk.google.com 11 | - DOMAIN,mtalk.google.com 12 | - IP-CIDR,64.233.177.188/32,no-resolve 13 | - IP-CIDR,64.233.186.188/32,no-resolve 14 | - IP-CIDR,64.233.187.188/32,no-resolve 15 | - IP-CIDR,64.233.188.188/32,no-resolve 16 | - IP-CIDR,64.233.189.188/32,no-resolve 17 | - IP-CIDR,74.125.23.188/32,no-resolve 18 | - IP-CIDR,74.125.24.188/32,no-resolve 19 | - IP-CIDR,74.125.28.188/32,no-resolve 20 | - IP-CIDR,74.125.127.188/32,no-resolve 21 | - IP-CIDR,74.125.137.188/32,no-resolve 22 | - IP-CIDR,74.125.203.188/32,no-resolve 23 | - IP-CIDR,74.125.204.188/32,no-resolve 24 | - IP-CIDR,74.125.206.188/32,no-resolve 25 | - IP-CIDR,108.177.125.188/32,no-resolve 26 | - IP-CIDR,142.250.4.188/32,no-resolve 27 | - IP-CIDR,142.250.10.188/32,no-resolve 28 | - IP-CIDR,142.250.31.188/32,no-resolve 29 | - IP-CIDR,142.250.96.188/32,no-resolve 30 | - IP-CIDR,172.217.194.188/32,no-resolve 31 | - IP-CIDR,172.217.218.188/32,no-resolve 32 | - IP-CIDR,172.217.219.188/32,no-resolve 33 | - IP-CIDR,172.253.63.188/32,no-resolve 34 | - IP-CIDR,172.253.122.188/32,no-resolve 35 | - IP-CIDR,173.194.175.188/32,no-resolve 36 | - IP-CIDR,173.194.218.188/32,no-resolve 37 | - IP-CIDR,209.85.233.188/32,no-resolve -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/HBO: -------------------------------------------------------------------------------- 1 | payload: 2 | # > HBO Max 3 | - PROCESS-NAME,com.hbo.hbonow 4 | - DOMAIN-SUFFIX,hbo.com 5 | - DOMAIN-SUFFIX,hbogo.com 6 | - DOMAIN-SUFFIX,hbonow.com 7 | - DOMAIN-SUFFIX,hbomax.com 8 | - DOMAIN-SUFFIX,hbomaxcdn.com 9 | 10 | # > HBO GO 11 | - DOMAIN,44wilhpljf.execute-api.ap-southeast-1.amazonaws.com 12 | - DOMAIN,bcbolthboa-a.akamaihd.net 13 | - DOMAIN,cf-images.ap-southeast-1.prod.boltdns.net 14 | - DOMAIN,dai3fd1oh325y.cloudfront.net 15 | - DOMAIN,hboasia1-i.akamaihd.net 16 | - DOMAIN,hboasia2-i.akamaihd.net 17 | - DOMAIN,hboasia3-i.akamaihd.net 18 | - DOMAIN,hboasia4-i.akamaihd.net 19 | - DOMAIN,hboasia5-i.akamaihd.net 20 | - DOMAIN,players.brightcove.net 21 | - DOMAIN,s3-ap-southeast-1.amazonaws.com 22 | - DOMAIN-SUFFIX,hbogoasia.com 23 | - DOMAIN-SUFFIX,hbogoasia.hk 24 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/HBO_Go: -------------------------------------------------------------------------------- 1 | payload: 2 | # > HBO Max 3 | # - USER-AGENT,HBO%20GO%20PROD* 4 | 5 | # - DOMAIN-KEYWORD,hboasia 6 | - DOMAIN-KEYWORD,hbogoasia 7 | 8 | - DOMAIN-SUFFIX,hboasia.com 9 | - DOMAIN-SUFFIX,hbogo.co.th 10 | - DOMAIN-SUFFIX,hbogo.com 11 | - DOMAIN-SUFFIX,hbogo.eu 12 | - DOMAIN-SUFFIX,hbogoasia.com 13 | - DOMAIN-SUFFIX,hbogoasia.id 14 | - DOMAIN-SUFFIX,hbogoasia.ph 15 | 16 | - DOMAIN,hbolb.onwardsmg.com 17 | - DOMAIN,hbounify-prod.evergent.com 18 | # - DOMAIN,bcbolthboa-a.akamaihd.net 19 | - DOMAIN,dai3fd1oh325y.cloudfront.net 20 | # - DOMAIN,hboasialive.akamaized.net 21 | # - DOMAIN,hbogoprod-vod.akamaized.net -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/HBO_Max: -------------------------------------------------------------------------------- 1 | payload: 2 | # > HBO Max 3 | # - USER-AGENT,HBOMAX* 4 | 5 | - DOMAIN-SUFFIX,hbo.com 6 | - DOMAIN-SUFFIX,hbomax.com 7 | - DOMAIN-SUFFIX,hbomaxcdn.com 8 | - DOMAIN-SUFFIX,hbonow.com 9 | - DOMAIN-SUFFIX,hbomax.com 10 | 11 | - DOMAIN,execute-api.ap-southeast-1.amazonaws.com -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Hulu: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Hulu 3 | - PROCESS-NAME,com.hulu.plus 4 | 5 | - DOMAIN-SUFFIX,hulu.com 6 | - DOMAIN-SUFFIX,hulu.hb.omtrdc.net 7 | - DOMAIN-SUFFIX,hulu.sc.omtrdc.net 8 | - DOMAIN-SUFFIX,huluad.com 9 | - DOMAIN-SUFFIX,huluim.com 10 | - DOMAIN-SUFFIX,hulumail.com 11 | - DOMAIN-SUFFIX,huluqa.com 12 | - DOMAIN-SUFFIX,hulustream.com 13 | 14 | - DOMAIN,cs428.wpc.edgecastcdn.net 15 | - DOMAIN,cws-hulu.conviva.com 16 | - DOMAIN,hulu.com.c.footprint.net 17 | - DOMAIN,hulu.map.fastly.net 18 | 19 | - IP-CIDR,8.28.124.0/23 20 | - IP-CIDR,199.60.116.0/24 21 | - IP-CIDR,199.200.48.0/22 22 | - IP-CIDR,208.91.156.0/22 23 | - IP-CIDR6,2620:100:3000::/40 -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Hulu_Japan: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Hulu(フールー) 3 | - PROCESS-NAME,jp.happyon.android 4 | - DOMAIN-SUFFIX,happyon.jp 5 | - DOMAIN-SUFFIX,hulu.jp 6 | - DOMAIN-SUFFIX,prod.hjholdings.tv 7 | - DOMAIN-SUFFIX,streaks.jp 8 | - DOMAIN-SUFFIX,yb.uncn.jp 9 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/IQI: -------------------------------------------------------------------------------- 1 | payload: 2 | # > iQIYI Intl 3 | # - USER-AGENT,iQIYI* 4 | # - USER-AGENT,QIYIVideo* 5 | # - USER-AGENT,QYPlayer* 6 | # - USER-AGENT,QTP* 7 | # - PROCESS-NAME,com.iqiyi.i18n 8 | # - PROCESS-NAME,com.iqiyi.i18n.tv 9 | - DOMAIN-SUFFIX,inter.iqiyi.com 10 | - DOMAIN-SUFFIX,iq.com 11 | # 首页 12 | - DOMAIN-SUFFIX,intl.iqiyi.com 13 | # 历史 14 | - DOMAIN,intl-rcd.iqiyi.com 15 | # 收藏 16 | - DOMAIN,intl-subscription.iqiyi.com 17 | # 播放 18 | - IP-CIDR,104.85.165.17/32,no-resolve 19 | - IP-CIDR,110.238.107.47/32,no-resolve 20 | - IP-CIDR,118.26.32.162/32,no-resolve 21 | - IP-CIDR,159.138.102.146/32,no-resolve 22 | - IP-CIDR,184.51.102.0/24,no-resolve 23 | - IP-CIDR,203.74.95.130/28,no-resolve 24 | - IP-CIDR,203.80.97.203/32,no-resolve 25 | - IP-CIDR,210.71.227.202/32,no-resolve 26 | - IP-CIDR,23.200.145.146/32,no-resolve 27 | - IP-CIDR,23.210.215.186/32,no-resolve 28 | - IP-CIDR,23.211.15.0/24,no-resolve 29 | - IP-CIDR,23.219.172.0/24,no-resolve 30 | - IP-CIDR,23.40.242.10/32,no-resolve 31 | - IP-CIDR,23.59.252.0/24,no-resolve 32 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/IQYI: -------------------------------------------------------------------------------- 1 | payload: 2 | # > IQIYI 3 | # - USER-AGENT,*QIYI* 4 | # - USER-AGENT,iQiYi* 5 | - DOMAIN-SUFFIX,iqiyi.com 6 | - DOMAIN-SUFFIX,iqiyipic.com 7 | - DOMAIN-SUFFIX,iq.com 8 | - DOMAIN-SUFFIX,qy.net 9 | - DOMAIN-SUFFIX,gitv.tv 10 | - DOMAIN-SUFFIX,71.am 11 | - DOMAIN-KEYWORD,qiyi 12 | - DOMAIN,cache.video.iqiyi.com 13 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/JOOX: -------------------------------------------------------------------------------- 1 | payload: 2 | # > JOOX 3 | - PROCESS-NAME,com.tencent.ibg.joox 4 | - PROCESS-NAME,com.tencent.ibg.jooxtv 5 | - DOMAIN-SUFFIX,joox.com 6 | - DOMAIN-KEYWORD,jooxweb-api 7 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Japonx: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Japonx 3 | - DOMAIN-KEYWORD,japonx 4 | - DOMAIN-KEYWORD,japronx 5 | - DOMAIN-SUFFIX,japonx.com 6 | - DOMAIN-SUFFIX,japonx.tv 7 | - DOMAIN-SUFFIX,japonx.net 8 | - DOMAIN-SUFFIX,japonx.vip 9 | - DOMAIN-SUFFIX,japronx.com 10 | - DOMAIN-SUFFIX,japronx.tv 11 | - DOMAIN-SUFFIX,japronx.net 12 | - DOMAIN-SUFFIX,japronx.vip 13 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/KKBOX: -------------------------------------------------------------------------------- 1 | payload: 2 | # > KKBOX 3 | - DOMAIN-SUFFIX,kkbox.com 4 | - DOMAIN-SUFFIX,kkbox.com.tw 5 | - DOMAIN-SUFFIX,kfs.io 6 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/KKTV: -------------------------------------------------------------------------------- 1 | payload: 2 | # > KKTV 3 | - PROCESS-NAME,com.kktv.kktv 4 | - DOMAIN-SUFFIX,kktv.me 5 | - DOMAIN-SUFFIX,kktv.com.tw 6 | - DOMAIN,kktv-theater.kk.stream 7 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/LAN: -------------------------------------------------------------------------------- 1 | payload: 2 | - DOMAIN-SUFFIX,local 3 | - IP-CIDR,127.0.0.0/8 4 | - IP-CIDR,172.16.0.0/12 5 | - IP-CIDR,192.168.0.0/16 6 | - IP-CIDR,10.0.0.0/8 7 | - IP-CIDR,17.0.0.0/8 8 | - IP-CIDR,100.64.0.0/10 9 | - IP-CIDR6,fe80::/10 10 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Letv: -------------------------------------------------------------------------------- 1 | payload: 2 | # > letv 3 | - DOMAIN-SUFFIX,api.mob.app.letv.com 4 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Line_TV: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Line TV 3 | # - USER-AGENT,LINE* 4 | - DOMAIN-SUFFIX,d3c7rimkq79yfu.cloudfront.net 5 | - DOMAIN-SUFFIX,linetv.tw 6 | - DOMAIN-SUFFIX,profile.line-scdn.net 7 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Netease_Music: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Netease Music 3 | - DOMAIN-SUFFIX,163yun.com 4 | - DOMAIN-SUFFIX,api.iplay.163.com 5 | - DOMAIN-SUFFIX,hz.netease.com 6 | - DOMAIN-SUFFIX,mam.netease.com 7 | - DOMAIN-SUFFIX,music.163.com 8 | - IP-CIDR,101.71.154.241/32,no-resolve 9 | - IP-CIDR,103.126.92.132/32,no-resolve 10 | - IP-CIDR,103.126.92.133/32,no-resolve 11 | - IP-CIDR,112.13.119.17/32,no-resolve 12 | - IP-CIDR,112.13.122.1/32,no-resolve 13 | - IP-CIDR,115.236.118.33/32,no-resolve 14 | - IP-CIDR,115.236.121.1/32,no-resolve 15 | - IP-CIDR,118.24.63.156/32,no-resolve 16 | - IP-CIDR,193.112.159.225/32,no-resolve 17 | - IP-CIDR,223.252.199.66/32,no-resolve 18 | - IP-CIDR,223.252.199.67/32,no-resolve 19 | - IP-CIDR,39.105.63.80/32,no-resolve 20 | - IP-CIDR,45.254.48.1/32,no-resolve 21 | - IP-CIDR,47.100.127.239/32,no-resolve 22 | - IP-CIDR,59.111.160.195/32,no-resolve 23 | - IP-CIDR,59.111.160.197/32,no-resolve 24 | - IP-CIDR,59.111.181.35/32,no-resolve 25 | - IP-CIDR,59.111.181.38/32,no-resolve 26 | - IP-CIDR,59.111.181.60/32,no-resolve 27 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Netflix: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Netflix 3 | - DOMAIN-SUFFIX,flxvpn.net 4 | - DOMAIN-SUFFIX,netflix.ca 5 | - DOMAIN-SUFFIX,netflix.com 6 | - DOMAIN-SUFFIX,netflix.com.au 7 | - DOMAIN-SUFFIX,netflixdnstest10.com 8 | - DOMAIN-SUFFIX,netflixdnstest1.com 9 | - DOMAIN-SUFFIX,netflixdnstest2.com 10 | - DOMAIN-SUFFIX,netflixdnstest3.com 11 | - DOMAIN-SUFFIX,netflixdnstest4.com 12 | - DOMAIN-SUFFIX,netflixdnstest5.com 13 | - DOMAIN-SUFFIX,netflixdnstest6.com 14 | - DOMAIN-SUFFIX,netflixdnstest7.com 15 | - DOMAIN-SUFFIX,netflixdnstest8.com 16 | - DOMAIN-SUFFIX,netflixdnstest9.com 17 | - DOMAIN-SUFFIX,netflixinvestor.com 18 | - DOMAIN-SUFFIX,netflix.net 19 | - DOMAIN-SUFFIX,netflixstudios.com 20 | - DOMAIN-SUFFIX,netflixtechblog.com 21 | - DOMAIN-SUFFIX,nflxext.com 22 | - DOMAIN-SUFFIX,nflximg.com 23 | - DOMAIN-SUFFIX,nflximg.net 24 | - DOMAIN-SUFFIX,nflxso.net 25 | - DOMAIN-SUFFIX,nflxvideo.net 26 | 27 | - DOMAIN-SUFFIX,e13252.dscg.akamaiedge.net 28 | - DOMAIN-SUFFIX,h-netflix.online-metrix.net 29 | - DOMAIN-SUFFIX,onetrust.com 30 | - DOMAIN-SUFFIX,cookielaw.org 31 | 32 | - IP-CIDR,23.246.0.0/18,no-resolve 33 | - IP-CIDR,37.77.184.0/21,no-resolve 34 | - IP-CIDR,38.72.126.0/24,no-resolve 35 | - IP-CIDR,45.57.0.0/17,no-resolve 36 | - IP-CIDR,64.120.128.0/17,no-resolve 37 | - IP-CIDR,66.197.128.0/17,no-resolve 38 | - IP-CIDR,69.53.224.0/19,no-resolve 39 | - IP-CIDR,103.87.204.0/22,no-resolve 40 | - IP-CIDR,108.175.32.0/20,no-resolve 41 | - IP-CIDR,185.2.220.0/22,no-resolve 42 | - IP-CIDR,185.9.188.0/22,no-resolve 43 | - IP-CIDR,192.173.64.0/18,no-resolve 44 | - IP-CIDR,198.38.96.0/19,no-resolve 45 | - IP-CIDR,198.45.48.0/20,no-resolve 46 | - IP-CIDR,208.75.76.0/22,no-resolve 47 | - IP-CIDR,34.210.42.111/32,no-resolve 48 | - IP-CIDR,52.89.124.203/32,no-resolve 49 | - IP-CIDR,54.148.37.5/32,no-resolve 50 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Niconico: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Niconico 3 | - DOMAIN-SUFFIX,dmc.nico 4 | - DOMAIN-SUFFIX,nicovideo.jp 5 | - DOMAIN-SUFFIX,nicodic.jp 6 | - DOMAIN-SUFFIX,nicomanga.jp 7 | - DOMAIN-SUFFIX,niconico.com 8 | - DOMAIN-SUFFIX,nicoseiga.jp 9 | - DOMAIN-SUFFIX,nimg.jp 10 | - DOMAIN-SUFFIX,simg.jp 11 | - DOMAIN-SUFFIX,socdm.com 12 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/PBS: -------------------------------------------------------------------------------- 1 | payload: 2 | # > PBS 3 | # - USER-AGENT,PBS* 4 | - DOMAIN-SUFFIX,pbs.org 5 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Pandora: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Pandora 3 | - PROCESS-NAME,com.pandora.android 4 | - DOMAIN-SUFFIX,pandora.com 5 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/PayPal: -------------------------------------------------------------------------------- 1 | payload: 2 | # > PayPal 3 | # - USER-AGENT,PayPal* 4 | - DOMAIN-KEYWORD,paypal 5 | - DOMAIN-SUFFIX,paypal.com 6 | - DOMAIN-SUFFIX,paypalobjects.com 7 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Pornhub: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Pornhub 3 | - DOMAIN-SUFFIX,phncdn.com 4 | - DOMAIN-SUFFIX,phprcdn.com 5 | - DOMAIN-SUFFIX,pornhub.com 6 | - DOMAIN-SUFFIX,pornhubpremium.com 7 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Scholar: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Scholar 3 | - DOMAIN-SUFFIX,acm.org 4 | - DOMAIN-SUFFIX,acs.org 5 | - DOMAIN-SUFFIX,aip.org 6 | - DOMAIN-SUFFIX,ams.org 7 | - DOMAIN-SUFFIX,annualreviews.org 8 | - DOMAIN-SUFFIX,aps.org 9 | - DOMAIN-SUFFIX,ascelibrary.org 10 | - DOMAIN-SUFFIX,asm.org 11 | - DOMAIN-SUFFIX,asme.org 12 | - DOMAIN-SUFFIX,astm.org 13 | - DOMAIN-SUFFIX,blackwell-synergy.com 14 | - DOMAIN-SUFFIX,bmj.com 15 | - DOMAIN-SUFFIX,cabdirect.org 16 | - DOMAIN-SUFFIX,cambridge.org 17 | - DOMAIN-SUFFIX,cas.org 18 | - DOMAIN-SUFFIX,cell.com 19 | - DOMAIN-SUFFIX,clarivate.com 20 | # - DOMAIN-SUFFIX,cnki.net 21 | # - DOMAIN-SUFFIX,cqvip.com 22 | - DOMAIN-SUFFIX,csiro.au 23 | - DOMAIN-SUFFIX,deepdyve.com 24 | - DOMAIN-SUFFIX,ebscohost.com 25 | - DOMAIN-SUFFIX,els-cdn.com 26 | - DOMAIN-SUFFIX,elsevier.com 27 | - DOMAIN-SUFFIX,emerald.com 28 | - DOMAIN-SUFFIX,endnote.com 29 | - DOMAIN-SUFFIX,engineeringvillage.com 30 | - DOMAIN-SUFFIX,icevirtuallibrary.com 31 | - DOMAIN-SUFFIX,ieee.org 32 | - DOMAIN-SUFFIX,imf.org 33 | - DOMAIN-SUFFIX,iop.org 34 | - DOMAIN-SUFFIX,jamanetwork.com 35 | - DOMAIN-SUFFIX,jbc.org 36 | - DOMAIN-SUFFIX,jhu.edu 37 | - DOMAIN-SUFFIX,jstor.org 38 | - DOMAIN-SUFFIX,karger.com 39 | - DOMAIN-SUFFIX,libguides.com 40 | - DOMAIN-SUFFIX,madsrevolution.net 41 | - DOMAIN-SUFFIX,mdpi.com 42 | - DOMAIN-SUFFIX,mpg.de 43 | - DOMAIN-SUFFIX,myilibrary.com 44 | - DOMAIN-SUFFIX,nature.com 45 | - DOMAIN-SUFFIX,ncbi.nlm.nih.gov 46 | - DOMAIN-SUFFIX,oecd-ilibrary.org 47 | - DOMAIN-SUFFIX,osapublishing.org 48 | - DOMAIN-SUFFIX,oup.com 49 | - DOMAIN-SUFFIX,ovid.com 50 | - DOMAIN-SUFFIX,oxfordartonline.com 51 | - DOMAIN-SUFFIX,oxfordbibliographies.com 52 | - DOMAIN-SUFFIX,oxfordmusiconline.com 53 | # - DOMAIN-SUFFIX,pkulaw.com 54 | - DOMAIN-SUFFIX,pnas.org 55 | - DOMAIN-SUFFIX,proquest.com 56 | - DOMAIN-SUFFIX,readcube.com 57 | - DOMAIN-SUFFIX,researchgate.net 58 | - DOMAIN-SUFFIX,rsc.org 59 | - DOMAIN-SUFFIX,sagepub.com 60 | - DOMAIN-SUFFIX,sci-hub.tw 61 | - DOMAIN-SUFFIX,sciencedirect.com 62 | - DOMAIN-SUFFIX,sciencemag.org 63 | - DOMAIN-SUFFIX,scitation.org 64 | - DOMAIN-SUFFIX,scopus.com 65 | - DOMAIN-SUFFIX,semanticscholar.org 66 | - DOMAIN-SUFFIX,siam.org 67 | - DOMAIN-SUFFIX,spiedigitallibrary.org 68 | - DOMAIN-SUFFIX,springer.com 69 | - DOMAIN-SUFFIX,springerlink.com 70 | - DOMAIN-SUFFIX,tandfonline.com 71 | - DOMAIN-SUFFIX,un.org 72 | - DOMAIN-SUFFIX,uni-bielefeld.de 73 | # - DOMAIN-SUFFIX,wanfangdata.com 74 | - DOMAIN-SUFFIX,webofknowledge.com 75 | - DOMAIN-SUFFIX,westlaw.com 76 | # - DOMAIN-SUFFIX,westlawchina.com 77 | - DOMAIN-SUFFIX,wiley.com 78 | - DOMAIN-SUFFIX,worldbank.org 79 | - DOMAIN-SUFFIX,worldscientific.com 80 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Soundcloud: -------------------------------------------------------------------------------- 1 | payload: 2 | # > SoundCloud 3 | # - USER-AGENT,SoundCloud* 4 | 5 | - DOMAIN-SUFFIX,sndcdn.com 6 | - DOMAIN-SUFFIX,soundcloud.app.goo.gl 7 | - DOMAIN-SUFFIX,soundcloud.com 8 | - DOMAIN-SUFFIX,soundcloudmail.com -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Speedtest: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Fast 3 | - DOMAIN-SUFFIX,fast.com 4 | 5 | # > Speedtest by Ookla 6 | # - USER-AGENT,SpeedTest* 7 | - DOMAIN-KEYWORD,speedtest 8 | - DOMAIN-SUFFIX,ooklaserver.net 9 | - DOMAIN,speed.dler.io 10 | 11 | # > Speed Test by Cloudflare 12 | - DOMAIN-SUFFIX,speed.cloudflare.com 13 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Spotify: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Spotify 3 | # - USER-AGENT,Spotify* 4 | 5 | - PROCESS-NAME,com.spotify.music 6 | 7 | - DOMAIN-SUFFIX,pscdn.co 8 | - DOMAIN-SUFFIX,scdn.co 9 | - DOMAIN-SUFFIX,spoti.fi 10 | - DOMAIN-SUFFIX,spotify.com 11 | - DOMAIN-SUFFIX,spotifycdn.com 12 | - DOMAIN-SUFFIX,spotifycdn.net 13 | - DOMAIN-SUFFIX,spotifycharts.com 14 | - DOMAIN-SUFFIX,spotifycodes.com 15 | - DOMAIN-SUFFIX,spotifyjobs.com 16 | - DOMAIN-SUFFIX,spotifynewsroom.jp 17 | - DOMAIN-SUFFIX,spotilocal.com 18 | - DOMAIN-SUFFIX,tospotify.com -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Steam: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Steam 3 | - DOMAIN-SUFFIX,fanatical.com 4 | - DOMAIN-SUFFIX,humblebundle.com 5 | - DOMAIN-SUFFIX,playartifact.com 6 | - DOMAIN-SUFFIX,s.team 7 | - DOMAIN-SUFFIX,steam-chat.com 8 | - DOMAIN-SUFFIX,steamcommunity.com 9 | - DOMAIN-SUFFIX,steampowered.com 10 | - DOMAIN-SUFFIX,steamgames.com 11 | - DOMAIN-SUFFIX,steamstatic.com 12 | - DOMAIN-SUFFIX,steamusercontent.com 13 | - DOMAIN-SUFFIX,underlords.com 14 | - DOMAIN-SUFFIX,valvesoftware.com -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Telegram: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Telegram 3 | - DOMAIN-SUFFIX,t.me 4 | - DOMAIN-SUFFIX,tx.me 5 | - DOMAIN-SUFFIX,tdesktop.com 6 | - DOMAIN-SUFFIX,telegra.ph 7 | - DOMAIN-SUFFIX,telegram.me 8 | - DOMAIN-SUFFIX,telegram.org 9 | - DOMAIN-SUFFIX,telegram-cdn.org 10 | - DOMAIN-SUFFIX,telesco.pe 11 | 12 | - IP-CIDR,91.105.192.0/23,no-resolve 13 | - IP-CIDR,91.108.56.0/22,no-resolve 14 | - IP-CIDR,91.108.4.0/22,no-resolve 15 | - IP-CIDR,91.108.8.0/22,no-resolve 16 | - IP-CIDR,91.108.12.0/22,no-resolve 17 | - IP-CIDR,91.108.16.0/22,no-resolve 18 | - IP-CIDR,91.108.20.0/22,no-resolve 19 | - IP-CIDR,149.154.160.0/20,no-resolve 20 | - IP-CIDR,185.76.151.0/24,no-resolve 21 | - IP-CIDR6,2001:67c:4e8::/48,no-resolve 22 | - IP-CIDR6,2001:b28:f23d::/48,no-resolve 23 | - IP-CIDR6,2001:b28:f23f::/48,no-resolve 24 | - IP-CIDR6,2a0a:f280::/32,no-resolve 25 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Tencent_Video: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Tencent Video 3 | - DOMAIN-SUFFIX,v.smtcdns.com 4 | - DOMAIN-SUFFIX,vv.video.qq.com 5 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/ViuTV: -------------------------------------------------------------------------------- 1 | payload: 2 | # > ViuTV 3 | - PROCESS-NAME,com.hktve.viutv 4 | 5 | - DOMAIN-SUFFIX,bootstrapcdn.com 6 | - DOMAIN-SUFFIX,cloudfront.net 7 | - DOMAIN-SUFFIX,cognito-identity.us-east-1.amazonaws.com 8 | - DOMAIN-SUFFIX,firebaseio.com 9 | - DOMAIN-SUFFIX,jwpcdn.com 10 | - DOMAIN-SUFFIX,jwplayer.com 11 | - DOMAIN-SUFFIX,mobileanalytics.us-east-1.amazonaws.com 12 | - DOMAIN-SUFFIX,nowe.com 13 | - DOMAIN-SUFFIX,viu.com 14 | - DOMAIN-SUFFIX,viu.tv 15 | - DOMAIN-SUFFIX,viu.now.com 16 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/WeTV: -------------------------------------------------------------------------------- 1 | payload: 2 | # > WeTV 3 | - PROCESS-NAME,com.tencent.qqlivei18n 4 | - DOMAIN-SUFFIX,wetv.vip 5 | - DOMAIN-SUFFIX,wetvinfo.com 6 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/Youku: -------------------------------------------------------------------------------- 1 | payload: 2 | # > Youku 3 | - DOMAIN-SUFFIX,youku.com 4 | - IP-CIDR,106.11.0.0/16,no-resolve 5 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/encoreTVB: -------------------------------------------------------------------------------- 1 | payload: 2 | # > encoreTVB 3 | - PROCESS-NAME,com.tvbusa.encore 4 | - DOMAIN-SUFFIX,encoretvb.com 5 | - DOMAIN,content.jwplatform.com 6 | - DOMAIN,videos-f.jwpsrv.com 7 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/iQiyi: -------------------------------------------------------------------------------- 1 | payload: 2 | # > iQiyi 3 | - PROCESS-NAME,com.qiyi.video 4 | - DOMAIN,intel-cache.m.iqiyi.com 5 | - DOMAIN,intel-cache.video.iqiyi.com 6 | - DOMAIN,intl-rcd.iqiyi.com 7 | - DOMAIN,intl-subscription.iqiyi.com 8 | - DOMAIN-SUFFIX,inter.iqiyi.com 9 | - DOMAIN-SUFFIX,inter.ptqy.gitv.tv 10 | - DOMAIN-SUFFIX,intl.iqiyi.com 11 | - DOMAIN-SUFFIX,iq.com 12 | 13 | - IP-CIDR,23.211.15.99/32,no-resolve 14 | - IP-CIDR,103.5.34.153/32,no-resolve 15 | - IP-CIDR,104.109.129.153/32,no-resolve 16 | - IP-CIDR,110.238.107.47/32,no-resolve 17 | - IP-CIDR,118.26.32.178/32,no-resolve 18 | - IP-CIDR,203.74.95.131/32,no-resolve 19 | - IP-CIDR,203.74.95.139/32,no-resolve 20 | - IP-CIDR,203.211.4.169/32,no-resolve 21 | - IP-CIDR,203.211.4.193/32,no-resolve 22 | - IP-CIDR,210.201.32.8/32,no-resolve 23 | - IP-CIDR,210.201.32.11/32,no-resolve 24 | 25 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/miHoYo: -------------------------------------------------------------------------------- 1 | payload: 2 | # > miHoYo 3 | - DOMAIN-SUFFIX,bh3.com 4 | - DOMAIN-SUFFIX,hoyolab.com 5 | - DOMAIN-SUFFIX,hoyoverse.com 6 | - DOMAIN-SUFFIX,mihayo.com 7 | - DOMAIN-SUFFIX,mihoyo.com 8 | - DOMAIN-SUFFIX,miyoushe.com 9 | - DOMAIN-SUFFIX,yuanshen.com 10 | -------------------------------------------------------------------------------- /luci-app-openclash/root/etc/openclash/rule_provider/myTV_SUPER: -------------------------------------------------------------------------------- 1 | payload: 2 | # > myTV_SUPER 3 | # - USER-AGENT,mytv* 4 | - DOMAIN-KEYWORD,nowtv100 5 | - DOMAIN-KEYWORD,rthklive 6 | - DOMAIN-SUFFIX,mytvsuper.com 7 | - DOMAIN-SUFFIX,tvb.com 8 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/YAML.rb: -------------------------------------------------------------------------------- 1 | module YAML 2 | class << self 3 | alias_method :load, :unsafe_load if YAML.respond_to? :unsafe_load 4 | end 5 | 6 | def self.LOG(info) 7 | puts Time.new.strftime("%Y-%m-%d %H:%M:%S") + " #{info}" 8 | end 9 | end -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/cfg_unused_servers_del.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . /lib/functions.sh 3 | 4 | cfg_unused_servers_del() 5 | { 6 | 7 | local section="$1" 8 | config_get_bool "enabled" "$section" "enabled" "1" 9 | 10 | if [ "$enabled" = "1" ]; then 11 | return 12 | fi 13 | 14 | #删除未选中节点 15 | uci delete openclash."$section" 2>/dev/null 16 | } 17 | 18 | config_load "openclash" 19 | config_foreach cfg_unused_servers_del "servers" 20 | uci commit openclash 21 | 22 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/clash_version.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | . /usr/share/openclash/openclash_curl.sh 3 | 4 | set_lock() { 5 | exec 884>"/tmp/lock/openclash_clash_version.lock" 2>/dev/null 6 | flock -x 884 2>/dev/null 7 | } 8 | 9 | del_lock() { 10 | flock -u 884 2>/dev/null 11 | rm -rf "/tmp/lock/openclash_clash_version.lock" 2>/dev/null 12 | } 13 | 14 | set_lock 15 | 16 | TIME=$(date "+%Y-%m-%d-%H") 17 | CHTIME=$(date "+%Y-%m-%d-%H" -r "/tmp/clash_last_version" 2>/dev/null) 18 | DOWNLOAD_FILE="/tmp/clash_last_version" 19 | RELEASE_BRANCH=$(uci -q get openclash.config.release_branch || echo "master") 20 | github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0) 21 | if [ -n "$1" ]; then 22 | github_address_mod="$1" 23 | fi 24 | 25 | if [ "$TIME" != "$CHTIME" ]; then 26 | if [ "$github_address_mod" != "0" ]; then 27 | if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then 28 | DOWNLOAD_URL="${github_address_mod}gh/vernesong/OpenClash@core/${RELEASE_BRANCH}/core_version" 29 | else 30 | DOWNLOAD_URL="${github_address_mod}https://raw.githubusercontent.com/vernesong/OpenClash/core/${RELEASE_BRANCH}/core_version" 31 | fi 32 | else 33 | DOWNLOAD_URL="https://raw.githubusercontent.com/vernesong/OpenClash/core/${RELEASE_BRANCH}/core_version" 34 | fi 35 | 36 | DOWNLOAD_FILE_CURL "$DOWNLOAD_URL" "$DOWNLOAD_FILE" 37 | fi 38 | del_lock 39 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/log.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | START_LOG="/tmp/openclash_start.log" 4 | LOG_FILE="/tmp/openclash.log" 5 | 6 | LOG_OUT() 7 | { 8 | if [ -n "${1}" ]; then 9 | echo -e "${1}" > $START_LOG 10 | echo -e "$(date "+%Y-%m-%d %H:%M:%S") ${1}" >> $LOG_FILE 11 | fi 12 | } 13 | 14 | LOG_INFO() 15 | { 16 | if [ -n "${1}" ]; then 17 | echo -e "$(date "+%Y-%m-%d %H:%M:%S") ${1}" >> $LOG_FILE 18 | fi 19 | } 20 | 21 | LOG_ALERT() 22 | { 23 | echo -e "$(tail -n 20 $LOG_FILE |grep -E 'level=fatal|level=error|FTL\ \[Config\]' |awk 'END {print}')" > $START_LOG 24 | sleep 3 25 | } 26 | 27 | SLOG_CLEAN() 28 | { 29 | echo "" > $START_LOG 30 | } -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_curl.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | . /usr/share/openclash/log.sh 3 | 4 | DOWNLOAD_FILE_CURL() { 5 | [ -z "$1" ] || [ -z "$2" ] && return 1 6 | DOWNLOAD_URL=$1 7 | DOWNLOAD_PATH=$2 8 | DOWNLOAD_UA=$3 9 | [ -z "$DOWNLOAD_UA" ] && DOWNLOAD_UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" 10 | OUTPUT=$(curl -w "%{http_code}" -SsL --connect-timeout 30 -m 60 --speed-time 30 --speed-limit 1 --retry 2 -H "User-Agent: ${DOWNLOAD_UA}" "$DOWNLOAD_URL" -o "$DOWNLOAD_PATH" 2>&1) 11 | EXIR_CODE=${PIPESTATUS[0]} 12 | HTTP_CODE=$(echo "$OUTPUT" | tail -n1) 13 | OUTPUT=$(echo "$OUTPUT" | sed '$d' | sed ':a;N;$!ba; s/\n/ /g') 14 | if [ "$EXIR_CODE" -ne 0 ] || [ "$HTTP_CODE" -ne 200 ]; then 15 | LOG_OUT "【$DOWNLOAD_PATH】Download Failed:【$OUTPUT】" 16 | rm -rf $DOWNLOAD_PATH 17 | SLOG_CLEAN 18 | return 1 19 | else 20 | return 0 21 | fi 22 | } 23 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_custom_domain_dns.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . /usr/share/openclash/log.sh 3 | 4 | set_lock() { 5 | exec 883>"/tmp/lock/openclash_cus_domian.lock" 2>/dev/null 6 | flock -x 883 2>/dev/null 7 | } 8 | 9 | del_lock() { 10 | flock -u 883 2>/dev/null 11 | rm -rf "/tmp/lock/openclash_cus_domian.lock" 12 | } 13 | 14 | set_lock 15 | 16 | # 获取默认的 DNSMASQ 配置 ID 17 | DEFAULT_DNSMASQ_CFGID="$(uci -q show "dhcp.@dnsmasq[0]" | awk 'NR==1 {split($0, conf, /[.=]/); print conf[2]}')" 18 | # 从 conf-dir 行中提取配置目录路径 19 | if [ -f "/tmp/etc/dnsmasq.conf.$DEFAULT_DNSMASQ_CFGID" ]; then 20 | DNSMASQ_CONF_DIR="$(awk -F '=' '/^conf-dir=/ {print $2}' "/tmp/etc/dnsmasq.conf.$DEFAULT_DNSMASQ_CFGID")" 21 | else 22 | DNSMASQ_CONF_DIR="/tmp/dnsmasq.d" 23 | fi 24 | # 设置 DNSMASQ_CONF_DIR,并去除路径末尾的斜杠 25 | DNSMASQ_CONF_DIR=${DNSMASQ_CONF_DIR%*/} 26 | rm -rf ${DNSMASQ_CONF_DIR}/dnsmasq_openclash_custom_domain.conf >/dev/null 2>&1 27 | if [ "$(uci get openclash.config.enable_custom_domain_dns_server 2>/dev/null)" = "1" ] && [ "$(uci get openclash.config.enable_redirect_dns 2>/dev/null)" = "1" ]; then 28 | LOG_OUT "Setting Secondary DNS Server List..." 29 | 30 | custom_domain_dns_server=$(uci get openclash.config.custom_domain_dns_server 2>/dev/null) 31 | [ -z "$custom_domain_dns_server" ] && { 32 | custom_domain_dns_server="114.114.114.114" 33 | } 34 | 35 | if [ -s "/etc/openclash/custom/openclash_custom_domain_dns.list" ]; then 36 | mkdir -p ${DNSMASQ_CONF_DIR} 37 | awk -v tag="$custom_domain_dns_server" '!/^$/&&!/^#/{printf("server=/%s/"'tag'"\n",$0)}' /etc/openclash/custom/openclash_custom_domain_dns.list >>${DNSMASQ_CONF_DIR}/dnsmasq_openclash_custom_domain.conf 2>/dev/null 38 | fi 39 | fi 40 | 41 | del_lock 42 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_debug_dns.lua: -------------------------------------------------------------------------------- 1 | #!/usr/bin/lua 2 | 3 | require "nixio" 4 | require "luci.util" 5 | require "luci.sys" 6 | local uci = require("luci.model.uci").cursor() 7 | local json = require "luci.jsonc" 8 | local datatype = require "luci.cbi.datatypes" 9 | local fs = require "luci.openclash" 10 | 11 | local addr = arg[1] 12 | local resolve = arg[2] 13 | 14 | local function debug_dns() 15 | local info, ip, host 16 | ip = fs.lanip() 17 | local port = uci:get("openclash", "config", "cn_port") 18 | local passwd = uci:get("openclash", "config", "dashboard_password") or "" 19 | 20 | if datatype.hostname(addr) and ip and port then 21 | info_v4 = luci.sys.exec(string.format('curl -sL -m 3 -H "Content-Type: application/json" -H "Authorization: Bearer %s" -XGET http://"%s":"%s"/dns/query?name="%s"', passwd, ip, port, addr)) 22 | info_v6 = luci.sys.exec(string.format('curl -sL -m 3 -H "Content-Type: application/json" -H "Authorization: Bearer %s" -XGET \"http://"%s":"%s"/dns/query?name="%s"&type=AAAA\"', passwd, ip, port, addr)) 23 | if info_v4 then 24 | info_v4 = json.parse(info_v4) 25 | end 26 | if info_v6 then 27 | info_v6 = json.parse(info_v6) 28 | end 29 | for _, info in pairs({info_v4, info_v6}) do 30 | if info and not resolve then 31 | print("Status: "..(info.Status)) 32 | print("TC: "..tostring(info.TC)) 33 | print("RD: "..tostring(info.RD)) 34 | print("RA: "..tostring(info.RA)) 35 | print("AD: "..tostring(info.AD)) 36 | print("CD: "..tostring(info.CD)) 37 | print("") 38 | print("Question: ") 39 | for _, v in pairs(info.Question) do 40 | print(" Name: "..(v.Name)) 41 | print(" Qtype: "..(v.Qtype)) 42 | print(" Qclass: "..(v.Qclass)) 43 | print("") 44 | end 45 | if info.Answer then 46 | print("Answer: ") 47 | for _, v in pairs(info.Answer) do 48 | print(" TTL: "..(v.TTL)) 49 | print(" data: "..(v.data:gsub("\n?", ""))) 50 | print(" name: "..(v.name)) 51 | print(" type: "..(v.type)) 52 | print("") 53 | end 54 | end 55 | if info.Additional then 56 | print("Additional: ") 57 | for _, v in pairs(info.Additional) do 58 | print(" TTL: "..(v.TTL)) 59 | print(" data: "..(v.data:gsub("\n?", ""))) 60 | print(" name: "..(v.name)) 61 | print(" type: "..(v.type)) 62 | print("") 63 | end 64 | end 65 | if info.Authority then 66 | print("Authority: ") 67 | for _, v in pairs(info.Authority) do 68 | print(" TTL: "..(v.TTL)) 69 | print(" data: "..(v.data:gsub("\n?", ""))) 70 | print(" name: "..(v.name)) 71 | print(" type: "..(v.type)) 72 | print("") 73 | end 74 | end 75 | end 76 | if info and resolve then 77 | if info.Answer then 78 | for _, v in pairs(info.Answer) do 79 | if v.type == 1 or v.type == 28 then 80 | print(v.data) 81 | end 82 | end 83 | end 84 | end 85 | end 86 | end 87 | os.exit(0) 88 | end 89 | 90 | debug_dns() 91 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_debug_getcon.lua: -------------------------------------------------------------------------------- 1 | #!/usr/bin/lua 2 | 3 | require "nixio" 4 | require "luci.util" 5 | require "luci.sys" 6 | local uci = require("luci.model.uci").cursor() 7 | local fs = require "luci.openclash" 8 | local json = require "luci.jsonc" 9 | local datatype = require "luci.cbi.datatypes" 10 | local addr = arg[1] 11 | 12 | local function s(e) 13 | local t=0 14 | local a={' KB',' MB',' GB',' TB',' PB'} 15 | repeat 16 | e=e/1024 17 | t=t+1 18 | until(e<=1024) 19 | return string.format("%.1f",e)..a[t] 20 | end 21 | 22 | local function debug_getcon() 23 | local info, ip, host, diag_info 24 | ip = fs.lanip() 25 | local port = uci:get("openclash", "config", "cn_port") 26 | local passwd = uci:get("openclash", "config", "dashboard_password") or "" 27 | if ip and port then 28 | info = luci.sys.exec(string.format('curl -sL -m 3 -H "Content-Type: application/json" -H "Authorization: Bearer %s" -XGET http://"%s":"%s"/connections', passwd, ip, port)) 29 | if info then 30 | info = json.parse(info) 31 | end 32 | if info then 33 | for i = 1, #(info.connections) do 34 | if info.connections[i].metadata.host == "" then 35 | host = "Empty" 36 | else 37 | host = info.connections[i].metadata.host 38 | end 39 | if not addr then 40 | luci.sys.exec(string.format('echo "%s. SourceIP:【%s】 - Host:【%s】 - DestinationIP:【%s】 - Network:【%s】 - RulePayload:【%s】 - Lastchain:【%s】" >> /tmp/openclash_debug.log', i, (info.connections[i].metadata.sourceIP), host, (info.connections[i].metadata.destinationIP), (info.connections[i].metadata.network), (info.connections[i].rulePayload),(info.connections[i].chains[1]))) 41 | else 42 | if datatype.hostname(addr) and string.lower(addr) == host or datatype.ipaddr(addr) and addr == (info.connections[i].metadata.destinationIP) then 43 | print("id: "..(info.connections[i].id)) 44 | print("start: "..(info.connections[i].start)) 45 | print("download: "..s(info.connections[i].download)) 46 | print("upload: "..s(info.connections[i].upload)) 47 | print("rule: "..(info.connections[i].rule)) 48 | print("rulePayload: "..(info.connections[i].rulePayload)) 49 | print("chains: ") 50 | for o = 1, #(info.connections[i].chains) do 51 | print(" "..o..": "..(info.connections[i].chains[o])) 52 | end 53 | print("metadata: ") 54 | print(" sourceIP: "..(info.connections[i].metadata.sourceIP)) 55 | print(" sourcePort: "..(info.connections[i].metadata.sourcePort)) 56 | print(" host: "..host) 57 | print(" destinationIP: "..(info.connections[i].metadata.destinationIP)) 58 | print(" destinationPort: "..(info.connections[i].metadata.destinationPort)) 59 | print(" network: "..(info.connections[i].metadata.network)) 60 | print(" type: "..(info.connections[i].metadata.type)) 61 | print("") 62 | end 63 | end 64 | end 65 | end 66 | end 67 | os.exit(0) 68 | end 69 | 70 | debug_getcon() -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_dler_checkin.lua: -------------------------------------------------------------------------------- 1 | #!/usr/bin/lua 2 | 3 | require "nixio" 4 | require "luci.util" 5 | require "luci.sys" 6 | local uci = require("luci.model.uci").cursor() 7 | local fs = require "luci.openclash" 8 | local json = require "luci.jsonc" 9 | 10 | local function dler_checkin() 11 | local info, path, checkin 12 | local token = uci:get("openclash", "config", "dler_token") 13 | local email = uci:get("openclash", "config", "dler_email") 14 | local passwd = uci:get("openclash", "config", "dler_passwd") 15 | local enable = uci:get("openclash", "config", "dler_checkin") or 0 16 | local interval = uci:get("openclash", "config", "dler_checkin_interval") or 1 17 | local multiple = uci:get("openclash", "config", "dler_checkin_multiple") or 1 18 | path = "/tmp/dler_checkin" 19 | if token and email and passwd and enable == "1" then 20 | checkin = string.format("curl -sL -H 'Content-Type: application/json' -d '{\"email\":\"%s\", \"passwd\":\"%s\", \"multiple\":\"%s\"}' -X POST https://dler.cloud/api/v1/checkin -o %s", email, passwd, multiple, path) 21 | if fs.readfile(path) == "" or not fs.readfile(path) then 22 | luci.sys.exec(checkin) 23 | else 24 | if (os.time() - fs.mtime(path) > interval*3600+1) then 25 | fs.unlink(path) 26 | luci.sys.exec(checkin) 27 | else 28 | os.exit(0) 29 | end 30 | end 31 | if fs.readfile(path) == "" or not fs.readfile(path) then 32 | fs.writefile(path, " ") 33 | end 34 | info = fs.readfile(path) 35 | if info then 36 | info = json.parse(info) 37 | end 38 | if info and info.ret == 200 then 39 | luci.sys.exec(string.format('echo "%s Dler Cloud Checkin Successful, Result:【%s】" >> /tmp/openclash.log', os.date("%Y-%m-%d %H:%M:%S"), info.data.checkin)) 40 | else 41 | if info and info.msg then 42 | luci.sys.exec(string.format('echo "%s Dler Cloud Checkin Failed, Result:【%s】" >> /tmp/openclash.log', os.date("%Y-%m-%d %H:%M:%S"), info.msg)) 43 | else 44 | luci.sys.exec(string.format('echo "%s Dler Cloud Checkin Failed! Please Check And Try Again..." >> /tmp/openclash.log', os.date("%Y-%m-%d %H:%M:%S"))) 45 | end 46 | end 47 | end 48 | os.exit(0) 49 | end 50 | 51 | dler_checkin() -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_geoasn.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | . /usr/share/openclash/openclash_ps.sh 3 | . /usr/share/openclash/log.sh 4 | . /usr/share/openclash/openclash_curl.sh 5 | 6 | set_lock() { 7 | exec 874>"/tmp/lock/openclash_geoasn.lock" 2>/dev/null 8 | flock -x 874 2>/dev/null 9 | } 10 | 11 | del_lock() { 12 | flock -u 874 2>/dev/null 13 | rm -rf "/tmp/lock/openclash_geoasn.lock" 2>/dev/null 14 | } 15 | 16 | set_lock 17 | 18 | small_flash_memory=$(uci get openclash.config.small_flash_memory 2>/dev/null) 19 | GEOASN_CUSTOM_URL=$(uci get openclash.config.geoasn_custom_url 2>/dev/null) 20 | github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0) 21 | restart=0 22 | 23 | if [ "$small_flash_memory" != "1" ]; then 24 | geoasn_path="/etc/openclash/ASN.mmdb" 25 | mkdir -p /etc/openclash 26 | else 27 | geoasn_path="/tmp/etc/openclash/ASN.mmdb" 28 | mkdir -p /tmp/etc/openclash 29 | fi 30 | LOG_OUT "Start Downloading Geo ASN Database..." 31 | if [ -z "$GEOASN_CUSTOM_URL" ]; then 32 | if [ "$github_address_mod" != "0" ]; then 33 | if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then 34 | DOWNLOAD_URL="${github_address_mod}gh/xishang0128/geoip@release/GeoLite2-ASN.mmdb" 35 | else 36 | DOWNLOAD_URL="${github_address_mod}https://github.com/xishang0128/geoip/releases/latest/download/GeoLite2-ASN.mmdb" 37 | fi 38 | else 39 | DOWNLOAD_URL="https://github.com/xishang0128/geoip/releases/latest/download/GeoLite2-ASN.mmdb" 40 | fi 41 | else 42 | DOWNLOAD_URL=$GEOASN_CUSTOM_URL 43 | fi 44 | DOWNLOAD_FILE_CURL "$DOWNLOAD_URL" "/tmp/GeoLite2-ASN.mmdb" 45 | if [ "$?" -eq 0 ] && [ -s "/tmp/GeoLite2-ASN.mmdb" ]; then 46 | LOG_OUT "Geo ASN Database Download Success, Check Updated..." 47 | cmp -s /tmp/GeoLite2-ASN.mmdb "$geoasn_path" 48 | if [ "$?" -ne "0" ]; then 49 | LOG_OUT "Geo ASN Database Has Been Updated, Starting To Replace The Old Version..." 50 | rm -rf "/etc/openclash/GeoLite2-ASN.mmdb" 51 | mv /tmp/GeoLite2-ASN.mmdb "$geoasn_path" >/dev/null 2>&1 52 | LOG_OUT "Geo ASN Database Update Successful!" 53 | restart=1 54 | else 55 | LOG_OUT "Updated Geo ASN Database No Change, Do Nothing..." 56 | fi 57 | else 58 | LOG_OUT "Geo ASN Database Update Error, Please Try Again Later..." 59 | fi 60 | 61 | if [ "$restart" -eq 1 ] && [ "$(unify_ps_prevent)" -eq 0 ]; then 62 | /etc/init.d/openclash restart >/dev/null 2>&1 & 63 | elif [ "$restart" -eq 0 ] && [ "$(unify_ps_prevent)" -eq 0 ] && [ "$(uci -q get openclash.config.restart)" -eq 1 ]; then 64 | /etc/init.d/openclash restart >/dev/null 2>&1 & 65 | uci -q set openclash.config.restart=0 66 | uci -q commit openclash 67 | elif [ "$restart" -eq 1 ] && [ "$(unify_ps_prevent)" -eq 0 ]; then 68 | uci -q set openclash.config.restart=1 69 | uci -q commit openclash 70 | fi 71 | 72 | rm -rf /tmp/GeoLite2-ASN.mmdb >/dev/null 2>&1 73 | SLOG_CLEAN 74 | del_lock 75 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_geoip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | . /usr/share/openclash/openclash_ps.sh 3 | . /usr/share/openclash/log.sh 4 | . /usr/share/openclash/openclash_curl.sh 5 | 6 | set_lock() { 7 | exec 873>"/tmp/lock/openclash_geoip.lock" 2>/dev/null 8 | flock -x 873 2>/dev/null 9 | } 10 | 11 | del_lock() { 12 | flock -u 873 2>/dev/null 13 | rm -rf "/tmp/lock/openclash_geoip.lock" 2>/dev/null 14 | } 15 | 16 | set_lock 17 | 18 | small_flash_memory=$(uci get openclash.config.small_flash_memory 2>/dev/null) 19 | GEOIP_CUSTOM_URL=$(uci get openclash.config.geoip_custom_url 2>/dev/null) 20 | github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0) 21 | restart=0 22 | 23 | if [ "$small_flash_memory" != "1" ]; then 24 | geoip_path="/etc/openclash/GeoIP.dat" 25 | mkdir -p /etc/openclash 26 | else 27 | geoip_path="/tmp/etc/openclash/GeoIP.dat" 28 | mkdir -p /tmp/etc/openclash 29 | fi 30 | LOG_OUT "Start Downloading GeoIP Dat..." 31 | if [ -z "$GEOIP_CUSTOM_URL" ]; then 32 | if [ "$github_address_mod" != "0" ]; then 33 | if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then 34 | DOWNLOAD_URL="${github_address_mod}gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat" 35 | else 36 | DOWNLOAD_URL="${github_address_mod}https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat" 37 | fi 38 | else 39 | DOWNLOAD_URL="https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat" 40 | fi 41 | else 42 | DOWNLOAD_URL=$GEOIP_CUSTOM_URL 43 | fi 44 | DOWNLOAD_FILE_CURL "$DOWNLOAD_URL" "/tmp/GeoIP.dat" 45 | if [ "$?" -eq 0 ] && [ -s "/tmp/GeoIP.dat" ]; then 46 | LOG_OUT "GeoIP Dat Download Success, Check Updated..." 47 | cmp -s /tmp/GeoIP.dat "$geoip_path" 48 | if [ "$?" -ne "0" ]; then 49 | LOG_OUT "GeoIP Dat Has Been Updated, Starting To Replace The Old Version..." 50 | rm -rf "/etc/openclash/geoip.dat" 51 | mv /tmp/GeoIP.dat "$geoip_path" >/dev/null 2>&1 52 | LOG_OUT "GeoIP Dat Update Successful!" 53 | restart=1 54 | else 55 | LOG_OUT "Updated GeoIP Dat No Change, Do Nothing..." 56 | fi 57 | else 58 | LOG_OUT "GeoIP Dat Update Error, Please Try Again Later..." 59 | fi 60 | 61 | if [ "$restart" -eq 1 ] && [ "$(unify_ps_prevent)" -eq 0 ]; then 62 | /etc/init.d/openclash restart >/dev/null 2>&1 & 63 | elif [ "$restart" -eq 0 ] && [ "$(unify_ps_prevent)" -eq 0 ] && [ "$(uci -q get openclash.config.restart)" -eq 1 ]; then 64 | /etc/init.d/openclash restart >/dev/null 2>&1 & 65 | uci -q set openclash.config.restart=0 66 | uci -q commit openclash 67 | elif [ "$restart" -eq 1 ] && [ "$(unify_ps_prevent)" -eq 0 ]; then 68 | uci -q set openclash.config.restart=1 69 | uci -q commit openclash 70 | fi 71 | 72 | rm -rf /tmp/GeoIP.dat >/dev/null 2>&1 73 | SLOG_CLEAN 74 | del_lock 75 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_geosite.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | . /usr/share/openclash/openclash_ps.sh 3 | . /usr/share/openclash/log.sh 4 | . /usr/share/openclash/openclash_curl.sh 5 | 6 | set_lock() { 7 | exec 874>"/tmp/lock/openclash_geosite.lock" 2>/dev/null 8 | flock -x 874 2>/dev/null 9 | } 10 | 11 | del_lock() { 12 | flock -u 874 2>/dev/null 13 | rm -rf "/tmp/lock/openclash_geosite.lock" 2>/dev/null 14 | } 15 | 16 | set_lock 17 | 18 | small_flash_memory=$(uci get openclash.config.small_flash_memory 2>/dev/null) 19 | GEOSITE_CUSTOM_URL=$(uci get openclash.config.geosite_custom_url 2>/dev/null) 20 | github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0) 21 | restart=0 22 | 23 | if [ "$small_flash_memory" != "1" ]; then 24 | geosite_path="/etc/openclash/GeoSite.dat" 25 | mkdir -p /etc/openclash 26 | else 27 | geosite_path="/tmp/etc/openclash/GeoSite.dat" 28 | mkdir -p /tmp/etc/openclash 29 | fi 30 | LOG_OUT "Start Downloading GeoSite Database..." 31 | if [ -z "$GEOSITE_CUSTOM_URL" ]; then 32 | if [ "$github_address_mod" != "0" ]; then 33 | if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then 34 | DOWNLOAD_URL="${github_address_mod}gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat" 35 | else 36 | DOWNLOAD_URL="${github_address_mod}https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat" 37 | fi 38 | else 39 | DOWNLOAD_URL="https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat" 40 | fi 41 | else 42 | DOWNLOAD_URL=$GEOSITE_CUSTOM_URL 43 | fi 44 | DOWNLOAD_FILE_CURL "$DOWNLOAD_URL" "/tmp/GeoSite.dat" 45 | if [ "$?" -eq 0 ] && [ -s "/tmp/GeoSite.dat" ]; then 46 | LOG_OUT "GeoSite Database Download Success, Check Updated..." 47 | cmp -s /tmp/GeoSite.dat "$geosite_path" 48 | if [ "$?" -ne "0" ]; then 49 | LOG_OUT "GeoSite Database Has Been Updated, Starting To Replace The Old Version..." 50 | rm -rf "/etc/openclash/geosite.dat" 51 | mv /tmp/GeoSite.dat "$geosite_path" >/dev/null 2>&1 52 | LOG_OUT "GeoSite Database Update Successful!" 53 | restart=1 54 | else 55 | LOG_OUT "Updated GeoSite Database No Change, Do Nothing..." 56 | fi 57 | else 58 | LOG_OUT "GeoSite Database Update Error, Please Try Again Later..." 59 | fi 60 | 61 | if [ "$restart" -eq 1 ] && [ "$(unify_ps_prevent)" -eq 0 ]; then 62 | /etc/init.d/openclash restart >/dev/null 2>&1 & 63 | elif [ "$restart" -eq 0 ] && [ "$(unify_ps_prevent)" -eq 0 ] && [ "$(uci -q get openclash.config.restart)" -eq 1 ]; then 64 | /etc/init.d/openclash restart >/dev/null 2>&1 & 65 | uci -q set openclash.config.restart=0 66 | uci -q commit openclash 67 | elif [ "$restart" -eq 1 ] && [ "$(unify_ps_prevent)" -eq 0 ]; then 68 | uci -q set openclash.config.restart=1 69 | uci -q commit openclash 70 | fi 71 | 72 | rm -rf /tmp/GeoSite.dat >/dev/null 2>&1 73 | SLOG_CLEAN 74 | del_lock 75 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_history_get.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . /lib/functions.sh 3 | . /usr/share/openclash/openclash_ps.sh 4 | 5 | set_lock() { 6 | exec 881>"/tmp/lock/openclash_history_get.lock" 2>/dev/null 7 | flock -x 881 2>/dev/null 8 | } 9 | 10 | del_lock() { 11 | flock -u 881 2>/dev/null 12 | rm -rf "/tmp/lock/openclash_history_get.lock" 2>/dev/null 13 | } 14 | 15 | close_all_conection() { 16 | SECRET=$(uci -q get openclash.config.dashboard_password) 17 | lan_interface_name=$(uci -q get openclash.config.lan_interface_name || echo "0") 18 | if [ "$lan_interface_name" = "0" ]; then 19 | LAN_IP=$(uci -q get network.lan.ipaddr |awk -F '/' '{print $1}' 2>/dev/null || ip address show $(uci -q -p /tmp/state get network.lan.ifname || uci -q -p /tmp/state get network.lan.device) | grep -w "inet" 2>/dev/null |grep -Eo 'inet [0-9\.]+' | awk '{print $2}' |head -1 || ip addr show 2>/dev/null | grep -w 'inet' | grep 'global' | grep 'brd' | grep -Eo 'inet [0-9\.]+' | awk '{print $2}' | head -n 1) 20 | else 21 | LAN_IP=$(ip address show $lan_interface_name | grep -w "inet" 2>/dev/null |grep -Eo 'inet [0-9\.]+' | awk '{print $2}' |head -1) 22 | fi 23 | PORT=$(uci -q get openclash.config.cn_port) 24 | curl -m 2 -H "Authorization: Bearer ${SECRET}" -H "Content-Type:application/json" -X DELETE http://"$LAN_IP":"$PORT"/connections >/dev/null 2>&1 25 | } 26 | 27 | set_lock 28 | 29 | if [ "$1" = "close_all_conection" ]; then 30 | close_all_conection 31 | del_lock 32 | exit 0 33 | fi 34 | 35 | CONFIG_FILE=$(unify_ps_cfgname) 36 | CONFIG_NAME=$(echo "$CONFIG_FILE" |awk -F '/' '{print $4}' 2>/dev/null) 37 | small_flash_memory=$(uci -q get openclash.config.small_flash_memory) 38 | HISTORY_PATH_OLD="/etc/openclash/history/${CONFIG_NAME%.*}" 39 | HISTORY_PATH="/etc/openclash/history/${CONFIG_NAME%.*}.db" 40 | core_version=$(uci -q get openclash.config.core_version || echo 0) 41 | CACHE_PATH_OLD="/etc/openclash/.cache" 42 | source "/etc/openwrt_release" 43 | 44 | if [ -z "$CONFIG_FILE" ] || [ ! -f "$CONFIG_FILE" ]; then 45 | CONFIG_FILE=$(uci get openclash.config.config_path 2>/dev/null) 46 | CONFIG_NAME=$(echo "$CONFIG_FILE" |awk -F '/' '{print $5}' 2>/dev/null) 47 | HISTORY_PATH_OLD="/etc/openclash/history/${CONFIG_NAME%.*}" 48 | HISTORY_PATH="/etc/openclash/history/${CONFIG_NAME%.*}.db" 49 | fi 50 | 51 | if [ -n "$(pidof clash)" ] && [ -f "$CONFIG_FILE" ]; then 52 | if [ "$small_flash_memory" == "1" ] || [ -n "$(echo $core_version |grep mips)" ] || [ -n "$(echo $DISTRIB_ARCH |grep mips)" ] || [ -n "$(opkg status libc 2>/dev/null |grep 'Architecture' |awk -F ': ' '{print $2}' |grep mips)" ] || [ -n "$(apk list libc 2>/dev/null |grep mips)" ]; then 53 | CACHE_PATH="/tmp/etc/openclash/cache.db" 54 | if [ -f "$CACHE_PATH" ]; then 55 | cmp -s "$CACHE_PATH" "$HISTORY_PATH" 56 | if [ "$?" -ne "0" ]; then 57 | cp "$CACHE_PATH" "$HISTORY_PATH" 2>/dev/null 58 | fi 59 | fi 60 | fi 61 | if [ -f "$CACHE_PATH_OLD" ]; then 62 | cmp -s "$CACHE_PATH_OLD" "$HISTORY_PATH_OLD" 63 | if [ "$?" -ne "0" ]; then 64 | cp "$CACHE_PATH_OLD" "$HISTORY_PATH_OLD" 2>/dev/null 65 | fi 66 | fi 67 | fi 68 | 69 | del_lock -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_ipdb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | . /usr/share/openclash/openclash_ps.sh 3 | . /usr/share/openclash/log.sh 4 | . /usr/share/openclash/openclash_curl.sh 5 | 6 | set_lock() { 7 | exec 880>"/tmp/lock/openclash_ipdb.lock" 2>/dev/null 8 | flock -x 880 2>/dev/null 9 | } 10 | 11 | del_lock() { 12 | flock -u 880 2>/dev/null 13 | rm -rf "/tmp/lock/openclash_ipdb.lock" 2>/dev/null 14 | } 15 | 16 | set_lock 17 | 18 | small_flash_memory=$(uci get openclash.config.small_flash_memory 2>/dev/null) 19 | GEOIP_CUSTOM_URL=$(uci get openclash.config.geo_custom_url 2>/dev/null) 20 | github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0) 21 | restart=0 22 | 23 | if [ "$small_flash_memory" != "1" ]; then 24 | geoip_path="/etc/openclash/Country.mmdb" 25 | mkdir -p /etc/openclash 26 | else 27 | geoip_path="/tmp/etc/openclash/Country.mmdb" 28 | mkdir -p /tmp/etc/openclash 29 | fi 30 | LOG_OUT "Start Downloading Geoip Database..." 31 | if [ -z "$GEOIP_CUSTOM_URL" ]; then 32 | if [ "$github_address_mod" != "0" ]; then 33 | if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then 34 | DOWNLOAD_URL="${github_address_mod}gh/alecthw/mmdb_china_ip_list@release/lite/Country.mmdb" 35 | else 36 | DOWNLOAD_URL="${github_address_mod}https://raw.githubusercontent.com/alecthw/mmdb_china_ip_list/release/lite/Country.mmdb" 37 | fi 38 | else 39 | DOWNLOAD_URL="https://raw.githubusercontent.com/alecthw/mmdb_china_ip_list/release/lite/Country.mmdb" 40 | fi 41 | else 42 | DOWNLOAD_URL=$GEOIP_CUSTOM_URL 43 | fi 44 | DOWNLOAD_FILE_CURL "$DOWNLOAD_URL" "/tmp/Country.mmdb" 45 | if [ "$?" -eq 0 ] && [ -s "/tmp/Country.mmdb" ]; then 46 | LOG_OUT "Geoip Database Download Success, Check Updated..." 47 | cmp -s /tmp/Country.mmdb "$geoip_path" 48 | if [ "$?" -ne 0 ]; then 49 | LOG_OUT "Geoip Database Has Been Updated, Starting To Replace The Old Version..." 50 | mv /tmp/Country.mmdb "$geoip_path" >/dev/null 2>&1 51 | LOG_OUT "Geoip Database Update Successful!" 52 | restart=1 53 | else 54 | LOG_OUT "Updated Geoip Database No Change, Do Nothing..." 55 | fi 56 | else 57 | LOG_OUT "Geoip Database Update Error, Please Try Again Later..." 58 | fi 59 | 60 | if [ "$restart" -eq 1 ] && [ "$(unify_ps_prevent)" -eq 0 ]; then 61 | /etc/init.d/openclash restart >/dev/null 2>&1 & 62 | elif [ "$restart" -eq 0 ] && [ "$(unify_ps_prevent)" -eq 0 ] && [ "$(uci -q get openclash.config.restart)" -eq 1 ]; then 63 | /etc/init.d/openclash restart >/dev/null 2>&1 & 64 | uci -q set openclash.config.restart=0 65 | uci -q commit openclash 66 | elif [ "$restart" -eq 1 ] && [ "$(unify_ps_prevent)" -eq 0 ]; then 67 | uci -q set openclash.config.restart=1 68 | uci -q commit openclash 69 | fi 70 | 71 | rm -rf /tmp/Country.mmdb >/dev/null 2>&1 72 | SLOG_CLEAN 73 | del_lock -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_ps.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | unify_ps_status() { 4 | if [ "$(ps --version 2>&1 |grep -c procps-ng)" -eq 1 ]; then 5 | echo "$(ps -efw |grep -v grep |grep -c "$1")" 6 | else 7 | echo "$(ps -w |grep -v grep |grep -c "$1")" 8 | fi 9 | } 10 | 11 | unify_ps_pids() { 12 | if [ "$(ps --version 2>&1 |grep -c procps-ng)" -eq 1 ]; then 13 | echo "$(ps -efw |grep "$1" |grep -v grep |awk '{print $2}' 2>/dev/null)" 14 | else 15 | echo "$(ps -w |grep "$1" |grep -v grep |awk '{print $1}' 2>/dev/null)" 16 | fi 17 | } 18 | 19 | unify_ps_prevent() { 20 | if [ "$(ps --version 2>&1 |grep -c procps-ng)" -eq 1 ]; then 21 | echo "$(ps -efw |grep -v grep |grep -c "/etc/init.d/openclash")" 22 | else 23 | echo "$(ps -w |grep -v grep |grep -c "/etc/init.d/openclash")" 24 | fi 25 | } 26 | 27 | unify_ps_cfgname() { 28 | if [ "$(ps --version 2>&1 |grep -c procps-ng)" -eq 1 ]; then 29 | echo "$(ps -efw |grep /etc/openclash/clash 2>/dev/null |grep -v grep |awk -F '-f ' '{print $2}' 2>/dev/null)" 30 | else 31 | echo "$(ps -w |grep /etc/openclash/clash 2>/dev/null |grep -v grep |awk -F '-f ' '{print $2}' 2>/dev/null)" 32 | fi 33 | } -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_urlencode.lua: -------------------------------------------------------------------------------- 1 | #!/usr/bin/lua 2 | 3 | require "nixio" 4 | require "luci.util" 5 | require "luci.sys" 6 | local HTTP = require "luci.http" 7 | local url = arg[1] 8 | 9 | if not url then os.exit(0) end 10 | 11 | print(HTTP.urlencode(url) or url) 12 | 13 | os.exit(0) -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/openclash_version.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | . /usr/share/openclash/openclash_curl.sh 3 | 4 | set_lock() { 5 | exec 869>"/tmp/lock/openclash_version.lock" 2>/dev/null 6 | flock -x 869 2>/dev/null 7 | } 8 | 9 | del_lock() { 10 | flock -u 869 2>/dev/null 11 | rm -rf "/tmp/lock/openclash_version.lock" 2>/dev/null 12 | } 13 | 14 | set_lock 15 | 16 | TIME=$(date "+%Y-%m-%d-%H") 17 | CHTIME=$(date "+%Y-%m-%d-%H" -r "/tmp/openclash_last_version" 2>/dev/null) 18 | DOWNLOAD_FILE="/tmp/openclash_last_version" 19 | RELEASE_BRANCH=$(uci -q get openclash.config.release_branch || echo "master") 20 | if [ -x "/bin/opkg" ]; then 21 | OP_CV=$(rm -f /var/lock/opkg.lock && opkg status luci-app-openclash 2>/dev/null |grep 'Version' |awk -F 'Version: ' '{print $2}' |awk -F '.' '{print $2$3}' 2>/dev/null) 22 | elif [ -x "/usr/bin/apk" ]; then 23 | OP_CV=$(apk list luci-app-openclash 2>/dev/null|grep 'installed' | grep -oE '[0-9]+(\.[0-9]+)*' | head -1 |awk -F '.' '{print $2$3}' 2>/dev/null) 24 | fi 25 | OP_LV=$(sed -n 1p $DOWNLOAD_FILE 2>/dev/null |awk -F 'v' '{print $2}' |awk -F '.' '{print $2$3}' 2>/dev/null) 26 | github_address_mod=$(uci -q get openclash.config.github_address_mod || echo 0) 27 | if [ -n "$1" ]; then 28 | github_address_mod="$1" 29 | fi 30 | 31 | if [ "$TIME" != "$CHTIME" ]; then 32 | if [ "$github_address_mod" != "0" ]; then 33 | if [ "$github_address_mod" == "https://cdn.jsdelivr.net/" ] || [ "$github_address_mod" == "https://fastly.jsdelivr.net/" ] || [ "$github_address_mod" == "https://testingcf.jsdelivr.net/" ]; then 34 | DOWNLOAD_URL="${github_address_mod}gh/vernesong/OpenClash@package/${RELEASE_BRANCH}/version" 35 | else 36 | DOWNLOAD_URL="${github_address_mod}https://raw.githubusercontent.com/vernesong/OpenClash/package/${RELEASE_BRANCH}/version" 37 | fi 38 | else 39 | DOWNLOAD_URL="https://raw.githubusercontent.com/vernesong/OpenClash/package/${RELEASE_BRANCH}/version" 40 | fi 41 | 42 | DOWNLOAD_FILE_CURL "$DOWNLOAD_URL" "$DOWNLOAD_FILE" 43 | 44 | if [ "$?" -eq 0 ]; then 45 | OP_LV=$(sed -n 1p $DOWNLOAD_FILE 2>/dev/null |awk -F 'v' '{print $2}' |awk -F '.' '{print $2$3}' 2>/dev/null) 46 | if [ "$(expr "$OP_CV" \>= "$OP_LV")" = "1" ]; then 47 | sed -i '/^https:/,$d' $DOWNLOAD_FILE 48 | fi 49 | fi 50 | fi 51 | del_lock -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/dashboard/CNAME: -------------------------------------------------------------------------------- 1 | clash.razord.top -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/dashboard/assets/logo-b453e72f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/dashboard/assets/logo-b453e72f.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/dashboard/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Clash 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/dashboard/manifest.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"Clash Dashboard","short_name":"Clash Dashboard","start_url":"/","display":"standalone","background_color":"#ffffff","lang":"en","scope":"./","icons":[{"src":"//cdn.jsdelivr.net/gh/Dreamacro/clash-dashboard/src/assets/Icon.png","sizes":"512x512","type":"image/png"}]} 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/dashboard/sw.js: -------------------------------------------------------------------------------- 1 | if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()})).then((()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e})));self.define=(i,t)=>{const r=e||("document"in self?document.currentScript.src:"")||location.href;if(s[r])return;let o={};const l=e=>n(e,r),d={module:{uri:r},exports:o,require:l};s[r]=Promise.all(i.map((e=>d[e]||l(e)))).then((e=>(t(...e),o)))}}define(["./workbox-4de3aa5f"],(function(e){"use strict";self.addEventListener("message",(e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()})),e.precacheAndRoute([{url:"assets/index-41a41303.css",revision:null},{url:"assets/index-abc6db04.js",revision:null},{url:"assets/vendor-0c169955.js",revision:null},{url:"index.html",revision:"9a8a6ecd862a646bcb1c971fed6d9e82"},{url:"manifest.webmanifest",revision:"d3dd1da0aa7614180924343e65244285"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))})); 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/CNAME: -------------------------------------------------------------------------------- 1 | d.metacubex.one 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/DocumentTitle-qgMGpI7d.js: -------------------------------------------------------------------------------- 1 | import{d as t,bx as r}from"./index-BfxF6Zjo.js";const o=({children:e})=>t(r,{get children(){return[e," - MetaCubeXD"]}});export{o as D}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/FiraSans-Regular-BN6hITtY.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/FiraSans-Regular-BN6hITtY.ttf -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/IconReload-bqqdFQ5q.js: -------------------------------------------------------------------------------- 1 | import{N as o}from"./index-BfxF6Zjo.js";/** 2 | * @license @tabler/icons-solidjs v3.31.0 - MIT 3 | * 4 | * This source code is licensed under the MIT license. 5 | * See the LICENSE file in the root directory of this source tree. 6 | */var e=o("outline","reload","IconReload",[["path",{d:"M19.933 13.041a8 8 0 1 1 -9.925 -8.788c3.899 -1 7.935 1.007 9.425 4.747"}],["path",{d:"M20 4v5h-5"}]]);export{e as I}; 7 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/Twemoji.Mozilla-BSQKJ6aF.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/Twemoji.Mozilla-BSQKJ6aF.ttf -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-cyrillic-400-normal-9itZEwnn.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-cyrillic-400-normal-9itZEwnn.woff2 -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-cyrillic-400-normal-DivIpeVh.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-cyrillic-400-normal-DivIpeVh.woff -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-cyrillic-ext-400-normal-Ct_d_4pr.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-cyrillic-ext-400-normal-Ct_d_4pr.woff -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-cyrillic-ext-400-normal-DVFiJ7cT.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-cyrillic-ext-400-normal-DVFiJ7cT.woff2 -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-greek-400-normal-B4JJYYvj.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-greek-400-normal-B4JJYYvj.woff -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-greek-400-normal-xziLJ4od.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-greek-400-normal-xziLJ4od.woff2 -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-greek-ext-400-normal-BA5_ngob.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-greek-ext-400-normal-BA5_ngob.woff -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-greek-ext-400-normal-DDGpGFz4.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-greek-ext-400-normal-DDGpGFz4.woff2 -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-latin-400-normal-CRr34ncs.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-latin-400-normal-CRr34ncs.woff -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-latin-400-normal-DqUVgETp.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-latin-400-normal-DqUVgETp.woff2 -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-latin-ext-400-normal-BsVau5p6.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-latin-ext-400-normal-BsVau5p6.woff2 -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-latin-ext-400-normal-Cah6ivqJ.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-latin-ext-400-normal-Cah6ivqJ.woff -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-vietnamese-400-normal-CiKzo2z6.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-vietnamese-400-normal-CiKzo2z6.woff -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-vietnamese-400-normal-D5T8w5kG.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/fira-sans-vietnamese-400-normal-D5T8w5kG.woff2 -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/assets/time-M8P-MK1v.js: -------------------------------------------------------------------------------- 1 | import{W as a,b4 as m}from"./index-BfxF6Zjo.js";const s=o=>a(o).locale(m()).fromNow();export{s as f}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/favicon.ico -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/manifest.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"MetaCubeXD","short_name":"MetaCubeXD","description":"Mihomo Dashboard, The Official One, XD","start_url":"./","display":"standalone","background_color":"#ffffff","theme_color":"#000000","lang":"en","scope":"./","icons":[{"src":"pwa-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/pwa-512x512.png","sizes":"512x512","type":"image/png"},{"src":"pwa-512x512.png","sizes":"512x512","type":"image/png","purpose":"any maskable"}]} 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/maskable-icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/maskable-icon-512x512.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/pwa-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/pwa-192x192.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/pwa-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/pwa-512x512.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/pwa-64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/metacubexd/pwa-64x64.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/registerSW.js: -------------------------------------------------------------------------------- 1 | if('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('./sw.js', { scope: './' })})} -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/metacubexd/sw.js: -------------------------------------------------------------------------------- 1 | if(!self.define){let s,e={};const i=(i,n)=>(i=new URL(i+".js",n).href,e[i]||new Promise((e=>{if("document"in self){const s=document.createElement("script");s.src=i,s.onload=e,document.head.appendChild(s)}else s=i,importScripts(i),e()})).then((()=>{let s=e[i];if(!s)throw new Error(`Module ${i} didn’t register its module`);return s})));self.define=(n,r)=>{const l=s||("document"in self?document.currentScript.src:"")||location.href;if(e[l])return;let o={};const t=s=>i(s,l),u={module:{uri:l},exports:o,require:t};e[l]=Promise.all(n.map((s=>u[s]||t(s)))).then((s=>(r(...s),o)))}}define(["./workbox-3e8df8c8"],(function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"assets/Config-B1EwbU18.js",revision:null},{url:"assets/Connections-WHEuHC_k.js",revision:null},{url:"assets/DocumentTitle-qgMGpI7d.js",revision:null},{url:"assets/IconReload-bqqdFQ5q.js",revision:null},{url:"assets/index-BfxF6Zjo.js",revision:null},{url:"assets/index-Bg_1VLqf.css",revision:null},{url:"assets/index-CXfh_Ffl.js",revision:null},{url:"assets/Logs-DmnD-Vbh.js",revision:null},{url:"assets/Overview-BigJMrEz.js",revision:null},{url:"assets/Proxies-DCaTGxZZ.js",revision:null},{url:"assets/Rules-T7FAMMsr.js",revision:null},{url:"assets/Setup-2nY6XKtT.js",revision:null},{url:"assets/time-M8P-MK1v.js",revision:null},{url:"index.html",revision:"761f846e47c016c7f82446639da40073"},{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"favicon.svg",revision:"f5b3372f312fbbe60a6ed8c03741ff80"},{url:"pwa-192x192.png",revision:"c45f48fc59b5bf47e6cbf1626aff51fc"},{url:"pwa-512x512.png",revision:"a311504ae6a46bd29b5678a410aaafc6"},{url:"manifest.webmanifest",revision:"9367f610ffbd3bb959a69b706013d50e"}],{}),s.cleanupOutdatedCaches(),s.registerRoute(new s.NavigationRoute(s.createHandlerBoundToURL("index.html")))})); 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/CNAME: -------------------------------------------------------------------------------- 1 | yacd.metacubex.one -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/Twemoji_Mozilla.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/Twemoji_Mozilla.ttf -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/_headers: -------------------------------------------------------------------------------- 1 | # for netlify hosting 2 | # https://docs.netlify.com/routing/headers/#syntax-for-the-headers-file 3 | 4 | /* 5 | X-Frame-Options: DENY 6 | X-XSS-Protection: 1; mode=block 7 | X-Content-Type-Options: nosniff 8 | Referrer-Policy: same-origin 9 | /*.css 10 | Cache-Control: public, max-age=31536000, immutable 11 | /*.js 12 | Cache-Control: public, max-age=31536000, immutable 13 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/BaseModal-e9f180d4.css: -------------------------------------------------------------------------------- 1 | ._overlay_ukhe7_1{background-color:#0009}._cnt_ukhe7_5{position:absolute;background-color:var(--bg-modal);color:var(--color-text);line-height:1.4;opacity:.6;transition:all .3s ease;box-shadow:#0000001f 0 4px 4px,#0000003d 0 16px 32px}._afterOpen_ukhe7_15{opacity:1} 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/BaseModal-f42f892a.js: -------------------------------------------------------------------------------- 1 | import{r as y,R as p,p as s,c as f,m as v,b as h,M as m,x as O}from"./index-1a05af9b.js";function l(){return l=Object.assign||function(e){for(var n=1;n=0)&&Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}function b(e,n){if(e==null)return{};var r={},t=Object.keys(e),o,a;for(a=0;a=0)&&(r[o]=e[o]);return r}var c=y.forwardRef(function(e,n){var r=e.color,t=r===void 0?"currentColor":r,o=e.size,a=o===void 0?24:o,u=g(e,["color","size"]);return p.createElement("svg",l({ref:n,xmlns:"http://www.w3.org/2000/svg",width:a,height:a,viewBox:"0 0 24 24",fill:"none",stroke:t,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},u),p.createElement("polyline",{points:"6 9 12 15 18 9"}))});c.propTypes={color:s.string,size:s.oneOfType([s.string,s.number])};c.displayName="ChevronDown";const k=c,w="_overlay_ukhe7_1",d="_cnt_ukhe7_5",_="_afterOpen_ukhe7_15",i={overlay:w,cnt:d,afterOpen:_},{useMemo:j}=O;function C({isOpen:e,onRequestClose:n,children:r}){const t=j(()=>({base:f(v.content,i.cnt),afterOpen:i.afterOpen,beforeClose:""}),[]);return h(m,{isOpen:e,onRequestClose:n,className:t,overlayClassName:f(v.overlay,i.overlay),children:r})}export{C as B,k as C}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/Config-7eb3f1bb.css: -------------------------------------------------------------------------------- 1 | ._root_1vck5_4,._section_1vck5_5{display:grid;grid-template-columns:repeat(auto-fill,minmax(49%,1fr));max-width:900px;grid-gap:5px;gap:5px}@media screen and (min-width: 30em){._root_1vck5_4,._section_1vck5_5{gap:15px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}}._root_1vck5_4,._section_1vck5_5{padding:6px 15px 10px}@media screen and (min-width: 30em){._root_1vck5_4,._section_1vck5_5{padding:10px 40px 15px}}._wrapSwitch_1vck5_30{height:40px;display:flex;align-items:center}._sep_1vck5_36{max-width:900px;padding:0 15px}@media screen and (min-width: 30em){._sep_1vck5_36{padding:0 40px}}._sep_1vck5_36>div{border-top:1px dashed #373737}._label_1vck5_49{padding:15px 0;font-size:small}._fieldset_1hnn2_1{margin:0;padding:0;border:0;display:flex;flex-wrap:wrap;flex-direction:row}._input_1hnn2_10+._cnt_1hnn2_10{border:1px solid transparent;border-radius:4px;cursor:pointer;margin-bottom:5px}._input_1hnn2_10:focus+._cnt_1hnn2_10{border-color:var(--color-focus-blue)}._input_1hnn2_10:checked+._cnt_1hnn2_10{border-color:var(--color-focus-blue)} 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/Fab-47e19297.js: -------------------------------------------------------------------------------- 1 | import{b as e,j as b,x as y,r as l}from"./index-1a05af9b.js";const E="_spining_4i8sg_1",F="_spining_keyframes_4i8sg_1",M={spining:E,spining_keyframes:F},{useState:j}=y;function B({children:s}){return e("span",{className:M.spining,children:s})}const H={right:10,bottom:10},L=({children:s,...n})=>e("button",{type:"button",...n,className:"rtf--ab",children:s}),v=({children:s,...n})=>e("button",{type:"button",className:"rtf--mb",...n,children:s}),O={bottom:24,right:24},R=({event:s="hover",style:n=O,alwaysShowTitle:o=!1,children:f,icon:g,mainButtonStyles:h,onClick:p,text:d,..._})=>{const[a,r]=j(!1),c=o||!a,u=()=>r(!0),m=()=>r(!1),x=()=>s==="hover"&&u(),k=()=>s==="hover"&&m(),N=t=>p?p(t):(t.persist(),s==="click"?a?m():u():null),$=(t,i)=>{t.persist(),r(!1),setTimeout(()=>{i(t)},1)},C=()=>l.Children.map(f,(t,i)=>l.isValidElement(t)?b("li",{className:`rtf--ab__c ${"top"in n?"top":""}`,children:[l.cloneElement(t,{"data-testid":`action-button-${i}`,"aria-label":t.props.text||`Menu button ${i+1}`,"aria-hidden":c,tabIndex:a?0:-1,...t.props,onClick:I=>{t.props.onClick&&$(I,t.props.onClick)}}),t.props.text&&e("span",{className:`${"right"in n?"right":""} ${o?"always-show":""}`,"aria-hidden":c,children:t.props.text})]}):null);return e("ul",{onMouseEnter:x,onMouseLeave:k,className:`rtf ${a?"open":"closed"}`,"data-testid":"fab",style:n,..._,children:b("li",{className:"rtf--mb__c",children:[e(v,{onClick:N,style:h,"data-testid":"main-button",role:"button","aria-label":"Floating menu",tabIndex:0,children:g}),d&&e("span",{className:`${"right"in n?"right":""} ${o?"always-show":""}`,"aria-hidden":c,children:d}),e("ul",{children:C()})]})})};export{L as A,R as F,B as I,H as p}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/Input-e46653b4.js: -------------------------------------------------------------------------------- 1 | import{b as s,T as a,R as f}from"./index-1a05af9b.js";const{useState:i,useRef:l,useEffect:p,useCallback:m}=f;function C(t){return s("input",{className:a.input,...t})}function R({value:t,...r}){const[u,n]=i(t),e=l(t);p(()=>{e.current!==t&&n(t),e.current=t},[t]);const c=m(o=>n(o.target.value),[n]);return s("input",{className:a.input,value:u,onChange:c,...r})}export{C as I,R as S}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/Logs-beb8fc98.css: -------------------------------------------------------------------------------- 1 | ._RuleSearch_ue4xf_1{padding:0 40px 5px}@media (max-width: 768px){._RuleSearch_ue4xf_1{padding:0 25px 5px}}._RuleSearchContainer_ue4xf_10{position:relative;height:40px}@media (max-width: 768px){._RuleSearchContainer_ue4xf_10{height:30px}}._inputWrapper_ue4xf_20{position:absolute;top:50%;transform:translateY(-50%);left:0;width:100%}._input_ue4xf_20{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:var(--color-text-secondary);display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px 0 35px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._iconWrapper_ue4xf_45{position:absolute;top:50%;transform:translateY(-50%);left:10px;line-height:0}._logMeta_pycfb_1{font-size:.8em;margin-bottom:5px;display:block;line-height:1.55em}._logType_pycfb_8{flex-shrink:0;text-align:center;width:66px;border-radius:100px;padding:3px 5px;margin:0 8px}._logTime_pycfb_17{flex-shrink:0;color:#fb923c}._logText_pycfb_22{flex-shrink:0;color:#888;align-items:center;line-height:1.35em;width:100%}@media (max-width: 768px){._logText_pycfb_22{display:inline-block}}._logsWrapper_pycfb_37{margin:45px;padding:10px;background-color:var(--bg-log-info-card);border-radius:4px;color:var(--color-text);overflow-y:auto}@media (max-width: 768px){._logsWrapper_pycfb_37{margin:25px}}._logsWrapper_pycfb_37 .log{margin-bottom:10px}._logPlaceholder_pycfb_54{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#2d2d30}._logPlaceholder_pycfb_54 div:nth-child(2){color:var(--color-text-secondary);font-size:1.4em;opacity:.6}._logPlaceholderIcon_pycfb_67{opacity:.3} 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/Rules-162ef666.css: -------------------------------------------------------------------------------- 1 | ._RuleProviderItem_ly9yn_1{display:grid;grid-template-columns:40px 1fr 46px;height:100%}._left_ly9yn_7{display:inline-flex;align-items:center;color:var(--color-text-secondary);opacity:.4}._middle_ly9yn_14{display:grid;grid-template-rows:1fr auto auto;align-items:center}._gray_ly9yn_20{color:#777}._refreshButtonWrapper_ly9yn_24{display:grid;align-items:center;justify-items:center;place-items:center;opacity:0;transition:opacity .2s}._RuleProviderItem_ly9yn_1:hover ._refreshButtonWrapper_ly9yn_24{opacity:1}._rule_1e5p9_4{display:flex;align-items:center;padding:6px 15px}@media screen and (min-width: 30em){._rule_1e5p9_4{padding:10px 40px}}._left_1e5p9_15{width:40px;padding-right:15px;color:var(--color-text-secondary);opacity:.4}._a_1e5p9_22{display:flex;align-items:center;font-size:1em;opacity:.8}._b_1e5p9_29{flex-grow:1;padding:10px 0;font-family:Roboto Mono,Menlo,monospace;font-size:1em}@media screen and (min-width: 30em){._b_1e5p9_29{font-size:1em}}._type_1e5p9_41{width:110px;color:#3b5f76}._size_1e5p9_46{width:110px}._payloadAndSize_1e5p9_50{display:flex;align-items:center}._header_10x16_4{display:grid;grid-template-columns:1fr minmax(auto,290px);align-items:center;padding-right:15px}._RuleProviderItemWrapper_10x16_11{padding:6px 15px}@media screen and (min-width: 30em){._RuleProviderItemWrapper_10x16_11{padding:10px 40px}} 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/Select-04258549.js: -------------------------------------------------------------------------------- 1 | import{b as c}from"./index-1a05af9b.js";const r="_select_gfkcv_1",a={select:r};function m({options:s,selected:t,onChange:l,...n}){return c("select",{className:a.select,value:t,onChange:l,...n,children:s.map(([e,o])=>c("option",{value:e,children:o},e))})}export{m as S}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/Select-20369999.css: -------------------------------------------------------------------------------- 1 | ._select_gfkcv_1{height:35px;line-height:1.5;width:100%;font-size:small;padding-left:15px;appearance:none;background-color:var(--color-input-bg);color:var(--color-text);padding-right:20px;border-radius:4px;border:1px solid var(--color-input-border);background-image:url(data:image/svg+xml,%0A%20%20%20%20%3Csvg%20width%3D%228%22%20height%3D%2224%22%20viewBox%3D%220%200%208%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%207L7%2011H1L4%207Z%22%20fill%3D%22%23999999%22%20%2F%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%2017L1%2013L7%2013L4%2017Z%22%20fill%3D%22%23999999%22%20%2F%3E%0A%20%20%20%20%3C%2Fsvg%3E%0A%20%20);background-position:right 8px center;background-repeat:no-repeat}._select_gfkcv_1:hover,._select_gfkcv_1:focus{outline:none!important}._select_gfkcv_1:hover,._select_gfkcv_1:focus{border-color:#343434;color:var(--color-text-highlight);background-image:var(--select-bg-hover)}._select_gfkcv_1:focus{box-shadow:#4299e199 0 0 0 3px}._select_gfkcv_1 option{background-color:var(--color-background)} 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/TextFitler-3b17a569.js: -------------------------------------------------------------------------------- 1 | import{c as r,b as n,a3 as u,x as l}from"./index-1a05af9b.js";import{R as p}from"./rotate-cw-e799f805.js";import{d as x}from"./debounce-c1ba2006.js";const _="_rotate_1dspl_1",g="_isRotating_1dspl_5",d="_rotating_1dspl_1",c={rotate:_,isRotating:g,rotating:d};function N({isRotating:t}){const e=r(c.rotate,{[c.isRotating]:t});return n("span",{className:e,children:n(p,{width:16})})}const{useCallback:m,useState:R,useMemo:h}=l;function f(t){const[,e]=u(t),[o,i]=R(""),s=h(()=>x(e,300),[e]);return[m(a=>{i(a.target.value),s(a.target.value)},[s]),o]}const T="_input_uqa0o_1",b={input:T};function j(t){const[e,o]=f(t.textAtom);return n("input",{className:b.input,type:"text",value:o,onChange:e,placeholder:t.placeholder})}export{N as R,j as T}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/TextFitler-cbc3b0fe.css: -------------------------------------------------------------------------------- 1 | ._rotate_1dspl_1{display:inline-flex}._isRotating_1dspl_5{animation:_rotating_1dspl_1 3s infinite linear;animation-fill-mode:forwards}@keyframes _rotating_1dspl_1{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._input_uqa0o_1{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:var(--color-text-secondary);display:inline-block;font-size:inherit;outline:none;padding:8px 15px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%;height:36px}._input_uqa0o_1:focus{border:1px solid var(--color-focus-blue)} 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/Twemoji_Mozilla-6d90152e.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/Twemoji_Mozilla-6d90152e.ttf -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/debounce-c1ba2006.js: -------------------------------------------------------------------------------- 1 | function O(e){var n=typeof e;return e!=null&&(n=="object"||n=="function")}var M=typeof global=="object"&&global&&global.Object===Object&&global;const R=M;var w=typeof self=="object"&&self&&self.Object===Object&&self,B=R||w||Function("return this")();const W=B;var F=function(){return W.Date.now()};const S=F;var G=/\s/;function U(e){for(var n=e.length;n--&&G.test(e.charAt(n)););return n}var _=/^\s+/;function D(e){return e&&e.slice(0,U(e)+1).replace(_,"")}var H=W.Symbol;const y=H;var L=Object.prototype,X=L.hasOwnProperty,q=L.toString,g=y?y.toStringTag:void 0;function z(e){var n=X.call(e,g),i=e[g];try{e[g]=void 0;var o=!0}catch{}var f=q.call(e);return o&&(n?e[g]=i:delete e[g]),f}var J=Object.prototype,K=J.toString;function Q(e){return K.call(e)}var V="[object Null]",Y="[object Undefined]",$=y?y.toStringTag:void 0;function Z(e){return e==null?e===void 0?Y:V:$&&$ in Object(e)?z(e):Q(e)}function ee(e){return e!=null&&typeof e=="object"}var ne="[object Symbol]";function te(e){return typeof e=="symbol"||ee(e)&&Z(e)==ne}var E=0/0,re=/^[-+]0x[0-9a-f]+$/i,ie=/^0b[01]+$/i,oe=/^0o[0-7]+$/i,ae=parseInt;function k(e){if(typeof e=="number")return e;if(te(e))return E;if(O(e)){var n=typeof e.valueOf=="function"?e.valueOf():e;e=O(n)?n+"":n}if(typeof e!="string")return e===0?e:+e;e=D(e);var i=ie.test(e);return i||oe.test(e)?ae(e.slice(2),i?2:8):re.test(e)?E:+e}var fe="Expected a function",ce=Math.max,ue=Math.min;function se(e,n,i){var o,f,s,u,r,c,d=0,v=!1,l=!1,T=!0;if(typeof e!="function")throw new TypeError(fe);n=k(n)||0,O(i)&&(v=!!i.leading,l="maxWait"in i,s=l?ce(k(i.maxWait)||0,n):s,T="trailing"in i?!!i.trailing:T);function j(t){var a=o,b=f;return o=f=void 0,d=t,u=e.apply(b,a),u}function N(t){return d=t,r=setTimeout(m,n),v?j(t):u}function P(t){var a=t-c,b=t-d,I=n-a;return l?ue(I,s-b):I}function h(t){var a=t-c,b=t-d;return c===void 0||a>=n||a<0||l&&b>=s}function m(){var t=S();if(h(t))return x(t);r=setTimeout(m,P(t))}function x(t){return r=void 0,T&&o?j(t):(o=f=void 0,u)}function A(){r!==void 0&&clearTimeout(r),d=0,o=c=f=r=void 0}function C(){return r===void 0?u:x(S())}function p(){var t=S(),a=h(t);if(o=arguments,f=this,c=t,a){if(r===void 0)return N(c);if(l)return clearTimeout(r),r=setTimeout(m,n),j(c)}return r===void 0&&(r=setTimeout(m,n)),u}return p.cancel=A,p.flush=C,p}export{se as d}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/en-f84bd3d3.js: -------------------------------------------------------------------------------- 1 | const e={All:"All",Overview:"Overview",Proxies:"Proxies",Rules:"Rules",Conns:"Conns",Config:"Config",Logs:"Logs",Upload:"Upload",Download:"Download","Upload Total":"Upload Total","Download Total":"Download Total","Active Connections":"Active Connections","Memory Usage":"Memory Usage","Pause Refresh":"Pause Refresh","Resume Refresh":"Resume Refresh",close_all_connections:"Close All Connections",close_filter_connections:"Close all connections after filtering",Search:"Search",Up:"Up",Down:"Down","Test Latency":"Test Latency",settings:"settings",sort_in_grp:"Sorting in group",hide_unavail_proxies:"Hide unavailable proxies",auto_close_conns:"Automatically close old connections",order_natural:"Original order in config file",order_latency_asc:"By latency from small to big",order_latency_desc:"By latency from big to small",order_name_asc:"By name alphabetically (A-Z)",order_name_desc:"By name alphabetically (Z-A)",Connections:"Connections",current_backend:"Current Backend",Active:"Active",switch_backend:"Switch backend",Closed:"Closed",switch_theme:"Switch theme",theme:"theme",about:"about",no_logs:"No logs yet, hang tight...",chart_style:"Chart Style",latency_test_url:"Latency Test URL",lang:"Language",update_all_rule_provider:"Update all rule providers",update_all_proxy_provider:"Update all proxy providers",reload_config_file:"Reload config file",restart_core:"Restart core",upgrade_core:"Upgrade core",update_geo_databases_file:"Update GEO Databases ",flush_fake_ip_pool:"Flush fake-ip data",enable_tun_device:"Enable TUN Device",allow_lan:"Allow LAN",tls_sniffing:"Sniffer",c_host:"Host",c_sni:"Sniff Host",c_process:"Process",c_dl:"DL",c_ul:"UL",c_dl_speed:"DL Speed",c_ul_speed:"UP Speed",c_chains:"Chains",c_rule:"Rule",c_time:"Time",c_source:"Source",c_destination_ip:"Destination IP",c_type:"Type",c_ctrl:"Close",close_all_confirm:"Are you sure you want to close all connections?",close_all_confirm_yes:"I'm sure",close_all_confirm_no:"No",manage_column:"Custom columns",reset_column:"Reset columns",device_name:"Device Tag",delete:"Delete",add_tag:"Add tag",client_tag:"Client tags",sourceip_tip:"Prefix with / for regular expressions, otherwise it's a complete match",disconnect:"Close Connection",internel:"Internal Connection"};export{e as data}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/inter-latin-400-normal-0364d368.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/inter-latin-400-normal-0364d368.woff2 -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/inter-latin-400-normal-3ea830d4.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/inter-latin-400-normal-3ea830d4.woff -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/inter-latin-800-normal-a51ac27d.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/inter-latin-800-normal-a51ac27d.woff2 -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/inter-latin-800-normal-d08d7178.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/inter-latin-800-normal-d08d7178.woff -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/logs-ca50193b.js: -------------------------------------------------------------------------------- 1 | import{$,a0 as w,a1 as u}from"./index-1a05af9b.js";const v="/logs",D=new TextDecoder("utf-8"),L=()=>Math.floor((1+Math.random())*65536).toString(16);let h=!1,i=!1,f="",s,g;function m(e,n){let t;try{t=JSON.parse(e)}catch{console.log("JSON.parse error",JSON.parse(e))}const r=new Date,l=M(r);t.time=l,t.id=+r-0+L(),t.even=h=!h,n(t)}function M(e){const n=e.getFullYear()%100,t=u(e.getMonth()+1,2),r=u(e.getDate(),2),l=u(e.getHours(),2),o=u(e.getMinutes(),2),c=u(e.getSeconds(),2);return`${n}-${t}-${r} ${l}:${o}:${c}`}function p(e,n){return e.read().then(({done:t,value:r})=>{const l=D.decode(r,{stream:!t});f+=l;const o=f.split(` 2 | `),c=o[o.length-1];for(let d=0;de[t]).join("|")}let b,a;function k(e,n){if(e.logLevel==="uninit"||i||s&&s.readyState===1)return;g=n;const t=$(e,v);s=new WebSocket(t),s.addEventListener("error",()=>{y(e,n)}),s.addEventListener("message",function(r){m(r.data,n)})}function O(){s.close(),a&&a.abort()}function R(e){!g||!s||(s.close(),i=!1,k(e,g))}function y(e,n){if(a&&S(e)!==b)a.abort();else if(i)return;i=!0,b=S(e),a=new AbortController;const t=a.signal,{url:r,init:l}=w(e);fetch(r+v+"?level="+e.logLevel,{...l,signal:t}).then(o=>{const c=o.body.getReader();p(c,n)},o=>{i=!1,!t.aborted&&console.log("GET /logs error:",o.message)})}export{k as f,R as r,O as s}; 3 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/memoize-one.esm-efa1e849.js: -------------------------------------------------------------------------------- 1 | function h(e,r){if(e==null)return{};var t={},u=Object.keys(e),n,a;for(a=0;a=0)&&(t[n]=e[n]);return t}var o=Number.isNaN||function(r){return typeof r=="number"&&r!==r};function l(e,r){return!!(e===r||o(e)&&o(r))}function g(e,r){if(e.length!==r.length)return!1;for(var t=0;t=0)&&Object.prototype.propertyIsEnumerable.call(t,e)&&(r[e]=t[e])}return r}function y(t,o){if(t==null)return{};var r={},e=Object.keys(t),n,i;for(i=0;i=0)&&(r[n]=t[n]);return r}var c=g.forwardRef(function(t,o){var r=t.color,e=r===void 0?"currentColor":r,n=t.size,i=n===void 0?24:n,l=v(t,["color","size"]);return s.createElement("svg",p({ref:o,xmlns:"http://www.w3.org/2000/svg",width:i,height:i,viewBox:"0 0 24 24",fill:"none",stroke:e,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},l),s.createElement("rect",{x:"6",y:"4",width:"4",height:"16"}),s.createElement("rect",{x:"14",y:"4",width:"4",height:"16"}))});c.propTypes={color:a.string,size:a.oneOfType([a.string,a.number])};c.displayName="Pause";const b=c;function f(){return f=Object.assign||function(t){for(var o=1;o=0)&&Object.prototype.propertyIsEnumerable.call(t,e)&&(r[e]=t[e])}return r}function O(t,o){if(t==null)return{};var r={},e=Object.keys(t),n,i;for(i=0;i=0)&&(r[n]=t[n]);return r}var u=g.forwardRef(function(t,o){var r=t.color,e=r===void 0?"currentColor":r,n=t.size,i=n===void 0?24:n,l=h(t,["color","size"]);return s.createElement("svg",f({ref:o,xmlns:"http://www.w3.org/2000/svg",width:i,height:i,viewBox:"0 0 24 24",fill:"none",stroke:e,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},l),s.createElement("polygon",{points:"5 3 19 12 5 21 5 3"}))});u.propTypes={color:a.string,size:a.oneOfType([a.string,a.number])};u.displayName="Play";const w=u;export{w as P,b as a}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/roboto-mono-latin-400-normal-7295944e.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/roboto-mono-latin-400-normal-7295944e.woff2 -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/roboto-mono-latin-400-normal-dffdffa7.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/roboto-mono-latin-400-normal-dffdffa7.woff -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/rotate-cw-e799f805.js: -------------------------------------------------------------------------------- 1 | import{r as c,R as s,p as a}from"./index-1a05af9b.js";function p(){return p=Object.assign||function(t){for(var n=1;n=0)&&Object.prototype.propertyIsEnumerable.call(t,e)&&(r[e]=t[e])}return r}function g(t,n){if(t==null)return{};var r={},e=Object.keys(t),o,i;for(i=0;i=0)&&(r[o]=t[o]);return r}var l=c.forwardRef(function(t,n){var r=t.color,e=r===void 0?"currentColor":r,o=t.size,i=o===void 0?24:o,f=u(t,["color","size"]);return s.createElement("svg",p({ref:n,xmlns:"http://www.w3.org/2000/svg",width:i,height:i,viewBox:"0 0 24 24",fill:"none",stroke:e,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},f),s.createElement("polyline",{points:"23 4 23 10 17 10"}),s.createElement("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"}))});l.propTypes={color:a.string,size:a.oneOfType([a.string,a.number])};l.displayName="RotateCw";const y=l;export{y as R}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/useRemainingViewPortHeight-dbe2192e.js: -------------------------------------------------------------------------------- 1 | import{x as r}from"./index-1a05af9b.js";const{useState:s,useRef:u,useCallback:a,useLayoutEffect:c}=r;function d(){const t=u(null),[n,i]=s(200),e=a(()=>{const{top:o}=t.current.getBoundingClientRect();i(window.innerHeight-o)},[]);return c(()=>(e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}),[e]),[t,n]}export{d as u}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/vi-75c7db25.js: -------------------------------------------------------------------------------- 1 | const n={All:"Tất cả",Overview:"Tổng quan",Proxies:"Proxy",Rules:"Quy tắc",Conns:"Kết nối",Config:"Cấu hình",Logs:"Nhật ký",Upload:"Tải lên",Download:"Tải xuống","Upload Total":"Tổng tải lên","Download Total":"Tổng tải xuống","Active Connections":"Kết nối hoạt động","Memory Usage":"Sử dụng bộ nhớ","Pause Refresh":"Tạm dừng làm mới","Resume Refresh":"Tiếp tục làm mới",close_all_connections:"Đóng tất cả kết nối",close_filter_connections:"Đóng tất cả kết nối sau khi lọc",Search:"Tìm kiếm",Up:"Lên",Down:"Xuống","Test Latency":"Kiểm tra độ trễ",settings:"Cài đặt",sort_in_grp:"Sắp xếp trong nhóm",hide_unavail_proxies:"Ẩn proxy không khả dụng",auto_close_conns:"Tự động đóng kết nối cũ",order_natural:"Thứ tự ban đầu trong tệp cấu hình",order_latency_asc:"Theo độ trễ từ nhỏ đến lớn",order_latency_desc:"Theo độ trễ từ lớn đến nhỏ",order_name_asc:"Theo tên theo thứ tự bảng chữ cái (A-Z)",order_name_desc:"Theo tên theo thứ tự bảng chữ cái (Z-A)",Connections:"Kết nối",current_backend:"Backend hiện tại",Active:"Hoạt động",switch_backend:"Chuyển đổi backend",Closed:"Đã đóng",switch_theme:"Chuyển đổi giao diện",theme:"Giao diện",about:"Về chúng tôi",no_logs:"Chưa có nhật ký, hãy kiên nhẫn...",chart_style:"Kiểu biểu đồ",latency_test_url:"URL kiểm tra độ trễ",lang:"Ngôn ngữ",update_all_rule_provider:"Cập nhật tất cả nhà cung cấp quy tắc",update_all_proxy_provider:"Cập nhật tất cả nhà cung cấp proxy",reload_config_file:"Tải lại tệp cấu hình",restart_core:"Khởi động lõi lại Clash",upgrade_core:"Nâng cấp lõi Clash",update_geo_databases_file:"Cập nhật tệp cơ sở dữ liệu GEO",flush_fake_ip_pool:"Xóa bộ nhớ đệm fake-ip",enable_tun_device:"Bật thiết bị TUN",allow_lan:"Cho phép LAN",tls_sniffing:"Bộ giám sát gói tin Sniffer",c_host:"Máy chủ",c_sni:"Phát hiện máy chủ Sniff ",c_process:"Quá trình",c_dl:"Tải Xuống",c_ul:"Tải Lên",c_dl_speed:"Tốc độ Tải Xuống",c_ul_speed:"Tốc độ Tải lên",c_chains:"Chuỗi",c_rule:"Quy tắc",c_time:"Thời gian",c_source:"Nguồn",c_destination_ip:"Địa chỉ IP đích",c_type:"Loại",c_ctrl:"Đóng",close_all_confirm:"Bạn có chắc chắn muốn đóng tất cả kết nối không?",close_all_confirm_yes:"Chắc chắn",close_all_confirm_no:"Không",manage_column:"Quản lý cột",reset_column:"Đặt lại cột",device_name:"Thẻ thiết bị",delete:"Xóa",add_tag:"Thêm thẻ",client_tag:"Thẻ khách hàng",sourceip_tip:"Thêm / vào đầu để sử dụng biểu thức chính quy, nếu không sẽ là kết quả khớp chính xác(By Ohoang7)",disconnect:"Đóng kết nối",internel:"Kết nối nội bộ"};export{n as data}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/zh-cn-d82b820c.js: -------------------------------------------------------------------------------- 1 | const e={All:"全部",Overview:"概览",Proxies:"代理",Rules:"规则",Conns:"连接",Config:"配置",Logs:"日志",Upload:"上传",Download:"下载","Upload Total":"上传总量","Download Total":"下载总量","Active Connections":"活动连接","Memory Usage":"内存使用情况",Memory:"内存","Pause Refresh":"暂停刷新","Resume Refresh":"继续刷新",close_all_connections:"关闭所有连接",close_filter_connections:"关闭所有过滤后的连接",Search:"查找",Up:"上传",Down:"下载","Test Latency":"延迟测速",settings:"设置",sort_in_grp:"代理组条目排序",hide_unavail_proxies:"隐藏不可用代理",auto_close_conns:"切换代理时自动断开旧连接",order_natural:"原 config 文件中的排序",order_latency_asc:"按延迟从小到大",order_latency_desc:"按延迟从大到小",order_name_asc:"按名称字母排序 (A-Z)",order_name_desc:"按名称字母排序 (Z-A)",Connections:"连接",current_backend:"当前后端",Active:"活动",switch_backend:"切换后端",Closed:"已断开",switch_theme:"切换主题",theme:"主题",about:"关于",no_logs:"暂无日志...",chart_style:"流量图样式",latency_test_url:"延迟测速 URL",lang:"语言",update_all_rule_provider:"更新所有 rule provider",update_all_proxy_provider:"更新所有 proxy provider",reload_config_file:"重载配置文件",update_geo_databases_file:"更新 GEO 数据库文件",flush_fake_ip_pool:"清空 FakeIP 数据库",enable_tun_device:"开启 TUN 转发",allow_lan:"允许局域网连接",tls_sniffing:"SNI 嗅探",c_host:"域名",c_sni:"嗅探域名",c_process:"进程",c_dl:"下载",c_ul:"上传",c_dl_speed:"下载速率",c_ul_speed:"上传速率",c_chains:"节点链",c_rule:"规则",c_time:"连接时间",c_source:"来源",c_destination_ip:"目标IP",c_type:"类型",c_ctrl:"关闭",restart_core:"重启核心",upgrade_core:"更新核心",close_all_confirm:"确定关闭所有连接?",close_all_confirm_yes:"确定",close_all_confirm_no:"取消",manage_column:"管理列",reset_column:"重置列",device_name:"设备名",delete:"删除",add_tag:"添加标签",client_tag:"客户端标签",sourceip_tip:"/开头为正则,否则为全匹配",disconnect:"断开连接",internel:"内部链接"};export{e as data}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/assets/zh-tw-9cdfa61b.js: -------------------------------------------------------------------------------- 1 | const e={All:"全部",Overview:"概覽",Proxies:"代理",Rules:"規則",Conns:"連線",Config:"設定",Logs:"紀錄",Upload:"上傳",Download:"下載","Upload Total":"總上傳","Download Total":"總下載","Active Connections":"活動中連線","Memory Usage":"記憶體使用狀況",Memory:"記憶體","Pause Refresh":"暫停重整","Resume Refresh":"繼續重整",close_all_connections:"斷開所有連線",close_filter_connections:"斷開所有過濾後的連線",Search:"搜尋",Up:"上傳",Down:"下載","Test Latency":"測試延遲速度",settings:"設定",sort_in_grp:"依代理群組排序",hide_unavail_proxies:"隱藏不可用的代理伺服器",auto_close_conns:"切換代理伺服器時自動斷開舊連線",order_natural:"原 config 文件中的順序",order_latency_asc:"按延遲從小到大",order_latency_desc:"按延遲從大到小",order_name_asc:"按名稱字母順序排序 (A-Z)",order_name_desc:"按名稱字母順序排序 (Z-A)",Connections:"連線",current_backend:"當前後端",Active:"活動中",switch_backend:"切換後端",Closed:"已斷線",switch_theme:"切換主題",theme:"主題",about:"關於",no_logs:"暫時沒有紀錄…",chart_style:"流量圖樣式",latency_test_url:"延遲測速 URL",lang:"語言",update_all_rule_provider:"更新所有規則提供者",update_all_proxy_provider:"更新所有代理伺服器提供者",reload_config_file:"重新載入設定檔",update_geo_databases_file:"更新 GEO 資料庫文件",flush_fake_ip_pool:"清除 Fake IP 資料庫",enable_tun_device:"開啟 TUN 轉發",allow_lan:"允許區域網路連接",tls_sniffing:"SNI 嗅探",c_host:"網域名稱",c_sni:"嗅探網域名稱",c_process:"處理程序",c_dl:"下載",c_ul:"上傳",c_dl_speed:"下載速度",c_ul_speed:"上傳速度",c_chains:"節點鍊",c_rule:"規則",c_time:"連線時間",c_source:"來源",c_destination_ip:"目標 IP",c_type:"類型",c_ctrl:"關閉",restart_core:"重啟核心",upgrade_core:"更新核心",close_all_confirm:"確定關閉所有連接?",close_all_confirm_yes:"確定",close_all_confirm_no:"取消",manage_column:"管理列",reset_column:"重置列",device_name:"設備名稱",delete:"刪除",add_tag:"新增標籤",client_tag:"客戶端標籤",sourceip_tip:"/開頭為正規表達式,否則為全面配對",disconnect:"斷開連線",internel:"內部連線"};export{e as data}; 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | yacd 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/logo.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/manifest.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"yacd","short_name":"yacd","start_url":"./","display":"standalone","background_color":"#ffffff","lang":"en","scope":"./","icons":[{"src":"apple-touch-icon-precomposed.png","sizes":"512x512","type":"image/png"}]} 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/registerSW.js: -------------------------------------------------------------------------------- 1 | if('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('./sw.js', { scope: './' })})} -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/yacd.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/yacd.ico -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/yacd/yacd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/yacd/yacd.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/zashboard/apple-touch-icon.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/assets/NotoColorEmoji-flagsonly-CWWDk9km.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/zashboard/assets/NotoColorEmoji-flagsonly-CWWDk9km.ttf -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/assets/metacubex-BlQkOUXT.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/zashboard/assets/metacubex-BlQkOUXT.jpg -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/zashboard/favicon.ico -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | zashboard 6 | 10 | 14 | 18 | 23 | 29 | 33 | 34 | 35 | 36 | 37 |
38 | 39 | 40 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/manifest.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"zashboard","short_name":"zashboard","description":"a dashboard using clash api","start_url":"./","display":"standalone","background_color":"#ffffff","theme_color":"#000000","lang":"en","scope":"./","icons":[{"src":"./pwa-192x192.png","sizes":"192x192","type":"image/png","purpose":"any"},{"src":"./pwa-512x512.png","sizes":"512x512","type":"image/png","purpose":"any"},{"src":"./pwa-maskable-192x192.png","sizes":"192x192","type":"image/png","purpose":"maskable"},{"src":"./pwa-maskable-512x512.png","sizes":"512x512","type":"image/png","purpose":"maskable"}]} 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/pwa-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/zashboard/pwa-192x192.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/pwa-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/zashboard/pwa-512x512.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/pwa-maskable-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/zashboard/pwa-maskable-192x192.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/pwa-maskable-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/usr/share/openclash/ui/zashboard/pwa-maskable-512x512.png -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/registerSW.js: -------------------------------------------------------------------------------- 1 | if('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('./sw.js', { scope: './' })})} -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/ui/zashboard/sw.js: -------------------------------------------------------------------------------- 1 | if(!self.define){let e,i={};const s=(s,n)=>(s=new URL(s+".js",n).href,i[s]||new Promise((i=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=i,document.head.appendChild(e)}else e=s,importScripts(s),i()})).then((()=>{let e=i[s];if(!e)throw new Error(`Module ${s} didn’t register its module`);return e})));self.define=(n,r)=>{const f=e||("document"in self?document.currentScript.src:"")||location.href;if(i[f])return;let d={};const c=e=>s(e,f),o={module:{uri:f},exports:d,require:c};i[f]=Promise.all(n.map((e=>o[e]||c(e)))).then((e=>(r(...e),d)))}}define(["./workbox-3e8df8c8"],(function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"assets/index-btPsSEfJ.js",revision:null},{url:"assets/index-CZi4yu0u.css",revision:null},{url:"index.html",revision:"025848d28f9df131cdb90f7dcd82e46d"},{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"favicon.svg",revision:"7f1c4521acc10694fefef8f72dd2ea5f"},{url:"pwa-192x192.png",revision:"021df52501f4357c03eebd808f40dc6a"},{url:"pwa-512x512.png",revision:"d2f759aaabcb2c44ff52b27fde3de6e0"},{url:"pwa-maskable-192x192.png",revision:"7cd11dc5f0490b349d23eef5591d10e5"},{url:"pwa-maskable-512x512.png",revision:"8c97dc367a85a5a1eba523b24f79d03b"},{url:"manifest.webmanifest",revision:"6437e90df75a01bce95a7c03b16fc311"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))})); 2 | -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/yml_groups_name_ch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | . /lib/functions.sh 3 | 4 | set_lock() { 5 | exec 882>"/tmp/lock/openclash_name_ch.lock" 2>/dev/null 6 | flock -x 882 2>/dev/null 7 | } 8 | 9 | del_lock() { 10 | flock -u 882 2>/dev/null 11 | rm -rf "/tmp/lock/openclash_name_ch.lock" 12 | } 13 | 14 | cfg_groups_set() 15 | { 16 | 17 | CFG_FILE="/etc/config/openclash" 18 | local section="$1" 19 | local name old_name_cfg old_name 20 | config_get "name" "$section" "name" "" 21 | config_get "old_name_cfg" "$section" "old_name_cfg" "" 22 | config_get "old_name" "$section" "old_name" "" 23 | 24 | if [ -z "$name" ]; then 25 | return 26 | fi 27 | 28 | if [ -z "$old_name_cfg" ]; then 29 | uci -q set openclash."$section".old_name_cfg="$name" 30 | uci -q commit openclash 31 | fi 32 | 33 | if [ -z "$old_name" ]; then 34 | uci -q set openclash."$section".old_name="$name" 35 | uci -q commit openclash 36 | fi 37 | 38 | #名字变化时处理配置文件 39 | if [ "$name" != "$old_name_cfg" ] && [ ! -z "$old_name_cfg" ]; then 40 | convert_name=$(echo "$name" | sed 's/\//\\\//g' 2>/dev/null) 41 | convert_old_name_cfg=$(echo "$old_name_cfg" | sed 's/\//\\\//g' 2>/dev/null) 42 | sed -i "s/old_name_cfg \'${convert_old_name_cfg}\'/old_name_cfg \'${convert_name}\'/g" $CFG_FILE 2>/dev/null 43 | sed -i "s/groups \'${convert_old_name_cfg}\'/groups \'${convert_name}\'/g" $CFG_FILE 2>/dev/null 44 | sed -i "s/option group \'${convert_old_name_cfg}\'/option group \'${convert_name}\'/g" $CFG_FILE 2>/dev/null 45 | sed -i "s/option specific_group \'${convert_old_name_cfg}\'/option specific_group \'${convert_name}\'/g" $CFG_FILE 2>/dev/null 46 | sed -i "s/other_group \'${convert_old_name_cfg}\'/other_group \'${convert_name}\'/g" $CFG_FILE 2>/dev/null 47 | sed -i "s/new_servers_group \'${convert_old_name_cfg}\'/new_servers_group \'${convert_name}\'/g" $CFG_FILE 2>/dev/null 48 | sed -i "s/relay_groups \'${convert_old_name_cfg}\'/relay_groups \'${convert_name}\'/g" $CFG_FILE 2>/dev/null 49 | #第三方规则处理 50 | OTHER_RULE_NAMES=("GlobalTV" "AsianTV" "MainlandTV" "Proxy" "Youtube" "Bilibili" "Bahamut" "HBOMax" "Pornhub" "Apple" "GoogleFCM" "Scholar" "Microsoft" "Netflix" "Disney Plus" "Spotify" "Steam" "TikTok" "Speedtest" "Telegram" "PayPal" "Netease_Music" "AdBlock" "Domestic" "Others" "miHoYo" "AI_Suite" "AppleTV" "Crypto" "Discord" "HTTPDNS") 51 | for i in ${OTHER_RULE_NAMES[@]}; do 52 | sed -i "s/option ${i} \'${convert_old_name_cfg}\'/option ${i} \'${convert_name}\'/g" $CFG_FILE 2>/dev/null 53 | done 2>/dev/null 54 | config_load "openclash" 55 | fi 56 | 57 | } 58 | 59 | set_lock 60 | config_load "openclash" 61 | config_foreach cfg_groups_set "groups" 62 | del_lock -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/openclash/yml_groups_name_get.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . /usr/share/openclash/ruby.sh 3 | 4 | CFG_FILE=$(uci -q get openclash.config.config_path) 5 | UPDATE_CONFIG_FILE=$(uci -q get openclash.config.config_update_path) 6 | 7 | if [ ! -z "$UPDATE_CONFIG_FILE" ]; then 8 | CFG_FILE="$UPDATE_CONFIG_FILE" 9 | fi 10 | 11 | if [ -z "$CFG_FILE" ]; then 12 | for file_name in /etc/openclash/config/* 13 | do 14 | if [ -f "$file_name" ]; then 15 | CFG_FILE=$file_name 16 | break 17 | fi 18 | done 19 | fi 20 | 21 | if [ -f "$CFG_FILE" ]; then 22 | rm -rf "/tmp/Proxy_Group" 2>/dev/null 23 | ruby_read_hash_arr "$CFG_FILE" "['proxy-groups']" "['name']" >/tmp/Proxy_Group 2>&1 24 | 25 | if [ -f "/tmp/Proxy_Group" ]; then 26 | echo 'DIRECT' >>/tmp/Proxy_Group 27 | echo 'REJECT' >>/tmp/Proxy_Group 28 | echo 'REJECT-DROP' >>/tmp/Proxy_Group 29 | echo 'PASS' >>/tmp/Proxy_Group 30 | echo 'GLOBAL' >>/tmp/Proxy_Group 31 | else 32 | return 1 33 | fi 34 | else 35 | return 1 36 | fi -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/rpcd/acl.d/luci-app-openclash.json: -------------------------------------------------------------------------------- 1 | { 2 | "luci-app-openclash": { 3 | "description": "Grant UCI access for luci-app-openclash", 4 | "read": { 5 | "uci": [ "openclash" ] 6 | }, 7 | "write": { 8 | "uci": [ "openclash" ] 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /luci-app-openclash/root/usr/share/ucitrack/luci-app-openclash.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": "openclash", 3 | "init": "openclash" 4 | } 5 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/addon/dialog/dialog.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-dialog { 2 | position: absolute; 3 | left: 0; right: 0; 4 | background: inherit; 5 | z-index: 15; 6 | padding: .1em .8em; 7 | overflow: hidden; 8 | color: inherit; 9 | } 10 | 11 | .CodeMirror-dialog-top { 12 | border-bottom: 1px solid #eee; 13 | top: 0; 14 | } 15 | 16 | .CodeMirror-dialog-bottom { 17 | border-top: 1px solid #eee; 18 | bottom: 0; 19 | } 20 | 21 | .CodeMirror-dialog input { 22 | border: none; 23 | outline: none; 24 | background: transparent; 25 | width: 20em; 26 | color: inherit; 27 | font-family: monospace; 28 | } 29 | 30 | .CodeMirror-dialog button { 31 | font-size: 70%; 32 | } 33 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/addon/display/autorefresh.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: https://codemirror.net/5/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror")) 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror"], mod) 9 | else // Plain browser env 10 | mod(CodeMirror) 11 | })(function(CodeMirror) { 12 | "use strict" 13 | 14 | CodeMirror.defineOption("autoRefresh", false, function(cm, val) { 15 | if (cm.state.autoRefresh) { 16 | stopListening(cm, cm.state.autoRefresh) 17 | cm.state.autoRefresh = null 18 | } 19 | if (val && cm.display.wrapper.offsetHeight == 0) 20 | startListening(cm, cm.state.autoRefresh = {delay: val.delay || 250}) 21 | }) 22 | 23 | function startListening(cm, state) { 24 | function check() { 25 | if (cm.display.wrapper.offsetHeight) { 26 | stopListening(cm, state) 27 | if (cm.display.lastWrapHeight != cm.display.wrapper.clientHeight) 28 | cm.refresh() 29 | } else { 30 | state.timeout = setTimeout(check, state.delay) 31 | } 32 | } 33 | state.timeout = setTimeout(check, state.delay) 34 | state.hurry = function() { 35 | clearTimeout(state.timeout) 36 | state.timeout = setTimeout(check, 50) 37 | } 38 | CodeMirror.on(window, "mouseup", state.hurry) 39 | CodeMirror.on(window, "keyup", state.hurry) 40 | } 41 | 42 | function stopListening(_cm, state) { 43 | clearTimeout(state.timeout) 44 | CodeMirror.off(window, "mouseup", state.hurry) 45 | CodeMirror.off(window, "keyup", state.hurry) 46 | } 47 | }); 48 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/addon/display/fullscreen.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-fullscreen { 2 | position: fixed; 3 | top: 0; left: 0; right: 0; bottom: 0; 4 | height: auto; 5 | z-index: 9; 6 | } 7 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/addon/display/fullscreen.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: https://codemirror.net/5/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror")); 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror"], mod); 9 | else // Plain browser env 10 | mod(CodeMirror); 11 | })(function(CodeMirror) { 12 | "use strict"; 13 | 14 | CodeMirror.defineOption("fullScreen", false, function(cm, val, old) { 15 | if (old == CodeMirror.Init) old = false; 16 | if (!old == !val) return; 17 | if (val) setFullscreen(cm); 18 | else setNormal(cm); 19 | }); 20 | 21 | function setFullscreen(cm) { 22 | var wrap = cm.getWrapperElement(); 23 | cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, 24 | width: wrap.style.width, height: wrap.style.height}; 25 | wrap.style.width = ""; 26 | wrap.style.height = "auto"; 27 | wrap.className += " CodeMirror-fullscreen"; 28 | document.documentElement.style.overflow = "hidden"; 29 | cm.refresh(); 30 | } 31 | 32 | function setNormal(cm) { 33 | var wrap = cm.getWrapperElement(); 34 | wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, ""); 35 | document.documentElement.style.overflow = ""; 36 | var info = cm.state.fullScreenRestore; 37 | wrap.style.width = info.width; wrap.style.height = info.height; 38 | window.scrollTo(info.scrollLeft, info.scrollTop); 39 | cm.refresh(); 40 | } 41 | }); 42 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/addon/fold/foldgutter.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-foldmarker { 2 | color: blue; 3 | text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px; 4 | font-family: arial; 5 | line-height: .3; 6 | cursor: pointer; 7 | } 8 | .CodeMirror-foldgutter { 9 | width: .7em; 10 | } 11 | .CodeMirror-foldgutter-open, 12 | .CodeMirror-foldgutter-folded { 13 | cursor: pointer; 14 | } 15 | .CodeMirror-foldgutter-open:after { 16 | content: "\25BE"; 17 | } 18 | .CodeMirror-foldgutter-folded:after { 19 | content: "\25B8"; 20 | } 21 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/addon/fold/indent-fold.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: https://codemirror.net/5/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror")); 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror"], mod); 9 | else // Plain browser env 10 | mod(CodeMirror); 11 | })(function(CodeMirror) { 12 | "use strict"; 13 | 14 | function lineIndent(cm, lineNo) { 15 | var text = cm.getLine(lineNo) 16 | var spaceTo = text.search(/\S/) 17 | if (spaceTo == -1 || /\bcomment\b/.test(cm.getTokenTypeAt(CodeMirror.Pos(lineNo, spaceTo + 1)))) 18 | return -1 19 | return CodeMirror.countColumn(text, null, cm.getOption("tabSize")) 20 | } 21 | 22 | CodeMirror.registerHelper("fold", "indent", function(cm, start) { 23 | var myIndent = lineIndent(cm, start.line) 24 | if (myIndent < 0) return 25 | var lastLineInFold = null 26 | 27 | // Go through lines until we find a line that definitely doesn't belong in 28 | // the block we're folding, or to the end. 29 | for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) { 30 | var indent = lineIndent(cm, i) 31 | if (indent == -1) { 32 | } else if (indent > myIndent) { 33 | // Lines with a greater indent are considered part of the block. 34 | lastLineInFold = i; 35 | } else { 36 | // If this line has non-space, non-comment content, and is 37 | // indented less or equal to the start line, it is the start of 38 | // another block. 39 | break; 40 | } 41 | } 42 | if (lastLineInFold) return { 43 | from: CodeMirror.Pos(start.line, cm.getLine(start.line).length), 44 | to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length) 45 | }; 46 | }); 47 | 48 | }); 49 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/addon/lint/yaml-lint.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: https://codemirror.net/5/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror")); 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror"], mod); 9 | else // Plain browser env 10 | mod(CodeMirror); 11 | })(function(CodeMirror) { 12 | "use strict"; 13 | 14 | // Depends on js-yaml.js from https://github.com/nodeca/js-yaml 15 | 16 | // declare global: jsyaml 17 | 18 | CodeMirror.registerHelper("lint", "yaml", function(text) { 19 | var found = []; 20 | if (!window.jsyaml) { 21 | if (window.console) { 22 | window.console.error("Error: window.jsyaml not defined, CodeMirror YAML linting cannot run."); 23 | } 24 | return found; 25 | } 26 | try { jsyaml.loadAll(text); } 27 | catch(e) { 28 | var loc = e.mark, 29 | // js-yaml YAMLException doesn't always provide an accurate lineno 30 | // e.g., when there are multiple yaml docs 31 | // --- 32 | // --- 33 | // foo:bar 34 | from = loc ? CodeMirror.Pos(loc.line, loc.column) : CodeMirror.Pos(0, 0), 35 | to = from; 36 | found.push({ from: from, to: to, message: e.message }); 37 | } 38 | return found; 39 | }); 40 | 41 | }); 42 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/addon/search/jump-to-line.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: https://codemirror.net/5/LICENSE 3 | 4 | // Defines jumpToLine command. Uses dialog.js if present. 5 | 6 | (function(mod) { 7 | if (typeof exports == "object" && typeof module == "object") // CommonJS 8 | mod(require("../../lib/codemirror"), require("../dialog/dialog")); 9 | else if (typeof define == "function" && define.amd) // AMD 10 | define(["../../lib/codemirror", "../dialog/dialog"], mod); 11 | else // Plain browser env 12 | mod(CodeMirror); 13 | })(function(CodeMirror) { 14 | "use strict"; 15 | 16 | // default search panel location 17 | CodeMirror.defineOption("search", {bottom: false}); 18 | 19 | function dialog(cm, text, shortText, deflt, f) { 20 | if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom}); 21 | else f(prompt(shortText, deflt)); 22 | } 23 | 24 | function getJumpDialog(cm) { 25 | return cm.phrase("Jump to line:") + ' ' + cm.phrase("(Use line:column or scroll% syntax)") + ''; 26 | } 27 | 28 | function interpretLine(cm, string) { 29 | var num = Number(string) 30 | if (/^[-+]/.test(string)) return cm.getCursor().line + num 31 | else return num - 1 32 | } 33 | 34 | CodeMirror.commands.jumpToLine = function(cm) { 35 | var cur = cm.getCursor(); 36 | dialog(cm, getJumpDialog(cm), cm.phrase("Jump to line:"), (cur.line + 1) + ":" + cur.ch, function(posStr) { 37 | if (!posStr) return; 38 | 39 | var match; 40 | if (match = /^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(posStr)) { 41 | cm.setCursor(interpretLine(cm, match[1]), Number(match[2])) 42 | } else if (match = /^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(posStr)) { 43 | var line = Math.round(cm.lineCount() * Number(match[1]) / 100); 44 | if (/^[-+]/.test(match[1])) line = cur.line + line + 1; 45 | cm.setCursor(line - 1, cur.ch); 46 | } else if (match = /^\s*\:?\s*([\+\-]?\d+)\s*/.exec(posStr)) { 47 | cm.setCursor(interpretLine(cm, match[1]), cur.ch); 48 | } 49 | }); 50 | }; 51 | 52 | CodeMirror.keyMap["default"]["Alt-G"] = "jumpToLine"; 53 | }); 54 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/addon/search/matchesonscrollbar.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-search-match { 2 | background: gold; 3 | border-top: 1px solid orange; 4 | border-bottom: 1px solid orange; 5 | -moz-box-sizing: border-box; 6 | box-sizing: border-box; 7 | opacity: .5; 8 | } 9 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/addon/selection/active-line.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: https://codemirror.net/5/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror")); 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror"], mod); 9 | else // Plain browser env 10 | mod(CodeMirror); 11 | })(function(CodeMirror) { 12 | "use strict"; 13 | var WRAP_CLASS = "CodeMirror-activeline"; 14 | var BACK_CLASS = "CodeMirror-activeline-background"; 15 | var GUTT_CLASS = "CodeMirror-activeline-gutter"; 16 | 17 | CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) { 18 | var prev = old == CodeMirror.Init ? false : old; 19 | if (val == prev) return 20 | if (prev) { 21 | cm.off("beforeSelectionChange", selectionChange); 22 | clearActiveLines(cm); 23 | delete cm.state.activeLines; 24 | } 25 | if (val) { 26 | cm.state.activeLines = []; 27 | updateActiveLines(cm, cm.listSelections()); 28 | cm.on("beforeSelectionChange", selectionChange); 29 | } 30 | }); 31 | 32 | function clearActiveLines(cm) { 33 | for (var i = 0; i < cm.state.activeLines.length; i++) { 34 | cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS); 35 | cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS); 36 | cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS); 37 | } 38 | } 39 | 40 | function sameArray(a, b) { 41 | if (a.length != b.length) return false; 42 | for (var i = 0; i < a.length; i++) 43 | if (a[i] != b[i]) return false; 44 | return true; 45 | } 46 | 47 | function updateActiveLines(cm, ranges) { 48 | var active = []; 49 | for (var i = 0; i < ranges.length; i++) { 50 | var range = ranges[i]; 51 | var option = cm.getOption("styleActiveLine"); 52 | if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty()) 53 | continue 54 | var line = cm.getLineHandleVisualStart(range.head.line); 55 | if (active[active.length - 1] != line) active.push(line); 56 | } 57 | if (sameArray(cm.state.activeLines, active)) return; 58 | cm.operation(function() { 59 | clearActiveLines(cm); 60 | for (var i = 0; i < active.length; i++) { 61 | cm.addLineClass(active[i], "wrap", WRAP_CLASS); 62 | cm.addLineClass(active[i], "background", BACK_CLASS); 63 | cm.addLineClass(active[i], "gutter", GUTT_CLASS); 64 | } 65 | cm.state.activeLines = active; 66 | }); 67 | } 68 | 69 | function selectionChange(cm, sel) { 70 | updateActiveLines(cm, sel.ranges); 71 | } 72 | }); 73 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/Sponsor.svg: -------------------------------------------------------------------------------- 1 | Sponsor: -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/Star.svg: -------------------------------------------------------------------------------- 1 | Star: -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/Telegram.svg: -------------------------------------------------------------------------------- 1 | Telegram: -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/Tutorials.svg: -------------------------------------------------------------------------------- 1 | Tutorials: -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/Wiki.svg: -------------------------------------------------------------------------------- 1 | Wiki: -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/arrow-clockwise-light.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/eye-light.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/eye-slash-light.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/root/www/luci-static/resources/openclash/img/logo.png -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/megaphone-simple.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/version.svg: -------------------------------------------------------------------------------- 1 | Current Version: v0.00.00Current Versionv0.00.00 -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/img/wrench-light.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /luci-app-openclash/root/www/luci-static/resources/openclash/theme/idea.css: -------------------------------------------------------------------------------- 1 | /** 2 | Name: IDEA default theme 3 | From IntelliJ IDEA by JetBrains 4 | */ 5 | 6 | .cm-s-idea span.cm-meta { color: #808000; } 7 | .cm-s-idea span.cm-number { color: #0000FF; } 8 | .cm-s-idea span.cm-keyword { line-height: 1em; font-weight: bold; color: #000080; } 9 | .cm-s-idea span.cm-atom { font-weight: bold; color: #000080; } 10 | .cm-s-idea span.cm-def { color: #000000; } 11 | .cm-s-idea span.cm-variable { color: black; } 12 | .cm-s-idea span.cm-variable-2 { color: black; } 13 | .cm-s-idea span.cm-variable-3, .cm-s-idea span.cm-type { color: black; } 14 | .cm-s-idea span.cm-property { color: black; } 15 | .cm-s-idea span.cm-operator { color: black; } 16 | .cm-s-idea span.cm-comment { color: #808080; } 17 | .cm-s-idea span.cm-string { color: #008000; } 18 | .cm-s-idea span.cm-string-2 { color: #008000; } 19 | .cm-s-idea span.cm-qualifier { color: #555; } 20 | .cm-s-idea span.cm-error { line-height: 1em; font-weight: bold; color: #FF0000; } 21 | .cm-s-idea span.cm-attribute { color: #0000FF; } 22 | .cm-s-idea span.cm-tag { color: #000080; } 23 | .cm-s-idea span.cm-link { color: #0000FF; } 24 | .cm-s-idea span.cm-tip { color: #ff6f00; } 25 | .cm-s-idea span.cm-watchdog { color: #b300ff; } 26 | .cm-s-idea span.cm-warn { line-height: 1em; font-weight: bold; color: #ff00bb; } 27 | .cm-s-idea .CodeMirror-activeline-background { background: #FFFAE3; } 28 | 29 | .cm-s-idea span.cm-builtin { color: #30a; } 30 | .cm-s-idea span.cm-bracket { color: #cc7; } 31 | .cm-s-idea { font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, sans-serif;} 32 | 33 | 34 | .cm-s-idea .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } 35 | 36 | .CodeMirror-hints.idea { 37 | font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; 38 | color: #616569; 39 | background-color: #ebf3fd !important; 40 | } 41 | 42 | .CodeMirror-hints.idea .CodeMirror-hint-active { 43 | background-color: #a2b8c9 !important; 44 | color: #5c6065 !important; 45 | } -------------------------------------------------------------------------------- /luci-app-openclash/tools/po2lmo/Makefile: -------------------------------------------------------------------------------- 1 | 2 | INSTALL = install 3 | PREFIX = /usr/bin 4 | 5 | po2lmo: src/po2lmo.o src/template_lmo.o 6 | $(CC) $(LDFLAGS) -o src/po2lmo src/po2lmo.o src/template_lmo.o 7 | 8 | install: 9 | $(INSTALL) -m 755 src/po2lmo $(PREFIX) 10 | 11 | clean: 12 | $(RM) src/po2lmo src/*.o 13 | -------------------------------------------------------------------------------- /luci-app-openclash/tools/po2lmo/src/po2lmo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vernesong/OpenClash/fdfd0320789a5f58194b5093de919d425bd4f858/luci-app-openclash/tools/po2lmo/src/po2lmo -------------------------------------------------------------------------------- /luci-app-openclash/tools/po2lmo/src/template_lmo.h: -------------------------------------------------------------------------------- 1 | /* 2 | * lmo - Lua Machine Objects - General header 3 | * 4 | * Copyright (C) 2009-2012 Jo-Philipp Wich 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | #ifndef _TEMPLATE_LMO_H_ 20 | #define _TEMPLATE_LMO_H_ 21 | 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | #include 35 | #include 36 | 37 | #if (defined(__GNUC__) && defined(__i386__)) 38 | #define sfh_get16(d) (*((const uint16_t *) (d))) 39 | #else 40 | #define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\ 41 | +(uint32_t)(((const uint8_t *)(d))[0]) ) 42 | #endif 43 | 44 | 45 | struct lmo_entry { 46 | uint32_t key_id; 47 | uint32_t val_id; 48 | uint32_t offset; 49 | uint32_t length; 50 | } __attribute__((packed)); 51 | 52 | typedef struct lmo_entry lmo_entry_t; 53 | 54 | 55 | struct lmo_archive { 56 | int fd; 57 | int length; 58 | uint32_t size; 59 | lmo_entry_t *index; 60 | char *mmap; 61 | char *end; 62 | struct lmo_archive *next; 63 | }; 64 | 65 | typedef struct lmo_archive lmo_archive_t; 66 | 67 | 68 | struct lmo_catalog { 69 | char lang[6]; 70 | struct lmo_archive *archives; 71 | struct lmo_catalog *next; 72 | }; 73 | 74 | typedef struct lmo_catalog lmo_catalog_t; 75 | 76 | 77 | uint32_t sfh_hash(const char *data, int len); 78 | uint32_t lmo_canon_hash(const char *data, int len); 79 | 80 | lmo_archive_t * lmo_open(const char *file); 81 | void lmo_close(lmo_archive_t *ar); 82 | 83 | 84 | extern lmo_catalog_t *_lmo_catalogs; 85 | extern lmo_catalog_t *_lmo_active_catalog; 86 | 87 | int lmo_load_catalog(const char *lang, const char *dir); 88 | int lmo_change_catalog(const char *lang); 89 | int lmo_translate(const char *key, int keylen, char **out, int *outlen); 90 | void lmo_close_catalog(const char *lang); 91 | 92 | #endif 93 | --------------------------------------------------------------------------------