Add support for using TOML as configuration file format

Add basic support for trojan-grpc nodes.
Refactor codes.
This commit is contained in:
Tindy X
2021-09-20 17:02:13 +08:00
parent bc0a8dc925
commit 9797197c85
35 changed files with 2345 additions and 531 deletions

View File

@@ -0,0 +1,30 @@
version = 1
[custom]
enable_rule_generator = false
overwrite_original_rules = false
# Options for custom base configuration file
clash_rule_base = "base/forcerule.yml"
#surge_rule_base = "base/surge.conf"
#surfboard_rule_base = "base/surfboard.conf"
#mellow_rule_base = "base/mellow.conf"
#quan_rule_base = "base/quan.conf"
#quanx_rule_base = "base/quanx.conf"
# Options for adding emojis
#add_emoji = true
#remove_old_emoji = true
# Options for filtering nodes
#include_remarks = []
#exclude_remarks = []
[[custom_groups]]
import = "snippets/groups_forcerule.toml"
#[[rulesets]]
#import = ""
[[template_args]]
key = "clash.dns.port"
value = 5353

322
base/pref.example.toml Normal file
View File

@@ -0,0 +1,322 @@
version = 1
[common]
# API mode, set to true to prevent loading local subscriptions or serving local files directly
api_mode = false
# Access token used for performing critical action through Web interface
api_access_token = "password"
# Default URLs, used when no URL is provided in request, use "|" to separate multiple subscription links, supports local files/URL
default_url = []
# Insert subscription links to requests. Can be used to add node(s) to all exported subscriptions.
enable_insert = true
# URLs to insert before subscription links, can be used to add node(s) to all exported subscriptions, supports local files/URL
insert_url = [""]
# Prepend inserted URLs to subscription links. Nodes in insert_url will be added to groups first with non-group-specific match pattern.
prepend_insert_url = true
# Exclude nodes which remarks match the following patterns. Supports regular expression.
exclude_remarks = ["(到期|剩余流量|时间|官网|产品)"]
# Only include nodes which remarks match the following patterns. Supports regular expression.
#include_remarks = ["V3.*港"]
# Enable script support for filtering nodes
enable_filter = false
# Script used for filtering nodes. Supports inline script and script path. A "filter" function with 1 argument which is a node should be defined in the script.
# Example: Inline script: Set value to content of script.
# Script path: Set value to "path:/path/to/script.js".
#filter_script = '''
#function filter(node) {
# const info = JSON.parse(node.ProxyInfo);
# if(info.EncryptMethod.includes('chacha20'))
# return true;
# return false;
#}
#'''
# Setting an external config file as default when none is specified, supports local files/URL
# default_external_config = "config/example_external_config.toml"
# The file scope limit of the 'rule_base' options in external configs.
base_path = "base"
# Clash config base used by the generator, supports local files/URL
clash_rule_base = "base/all_base.tpl"
# Surge config base used by the generator, supports local files/URL
surge_rule_base = "base/all_base.tpl"
# Surfboard config base used by the generator, supports local files/URL
surfboard_rule_base = "base/all_base.tpl"
# Mellow config base used by the generator, supports local files/URL
mellow_rule_base = "base/all_base.tpl"
# Quantumult config base used by the generator, supports local files/URL
quan_rule_base = "base/all_base.tpl"
# Quantumult X config base used by the generator, supports local files/URL
quanx_rule_base = "base/all_base.tpl"
# Loon config base used by the generator, supports local files/URL
loon_rule_base = "base/all_base.tpl"
# Shadowsocks Android config base used by the generator, supports local files/URL
sssub_rule_base = "base/all_base.tpl"
# Proxy used to download rulesets or subscriptions, set to NONE or empty to disable it, set to SYSTEM to use system proxy.
# Accept cURL-supported proxies (http:// https:// socks4a:// socks5://)
proxy_config = "SYSTEM"
proxy_ruleset = "SYSTEM"
proxy_subscription = "NONE"
# Append a proxy type string ([SS] [SSR] [VMess]) to node remark.
append_proxy_type = false
[[userinfo.stream_rule]]
# Rules to extract stream data from node
# Format: full_match_regex|new_format_regex
# where new_format_regex should be like "total=$1&left=$2&used=$3"
match = '^剩余流量:(.*?)\|总流量:(.*)$'
replace = 'total=$2&left=$1'
[[userinfo.stream_rule]]
match = '^剩余流量:(.*?) (.*)$'
replace = 'total=$1&left=$2'
[[userinfo.stream_rule]]
match = '^Bandwidth: (.*?)/(.*)$'
replace = 'used=$1&total=$2'
[[userinfo.stream_rule]]
match = '^.*剩余(.*?)(?:\s*?)@(?:.*)$'
replace = 'total=$1'
[[userinfo.time_rule]]
# Rules to extract expire time data from node
# Format: full_match_regex|new_format_regex
# where new_format_regex should follow this example: yyyy:mm:dd:hh:mm:ss
match = '^过期时间:(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)$'
replace = '$1:$2:$3:$4:$5:$6'
[[userinfo.time_rule]]
match = '^到期时间:(\d+)-(\d+)-(\d+)$'
replace = '$1:$2:$3:0:0:0'
[[userinfo.time_rule]]
match = '^Smart Access expire: (\d+)/(\d+)/(\d+)$'
replace = '$1:$2:$3:0:0:0'
[node_pref]
udp_flag = true
tcp_fast_open_flag = false
skip_cert_verify_flag = true
tls13_flag = false
sort_flag = false
# Script used for sorting nodes. A "compare" function with 2 arguments which are the 2 nodes to be compared should be defined in the script. Supports inline script and script path.
# Examples can be seen at the filter_script option in [common] section.
#sort_script = '''
#function compare(node_a, node_b) {
# return info_a.Remark > info_b.Remark;
#}
#'''
filter_deprecated_nodes = false
append_sub_userinfo = true
clash_use_new_field_name = true
# Generate style of the proxies section of Clash subscriptions.
# Supported styles: block, flow, compact
# Block: - name: name1 Flow: - {name: name1, key: value} Compact: [{name: name1, key: value},{name: name2, key: value}]
# key: value - {name: name2, key: value}
# - name: name2
# key: value
clash_proxies_style = "flow"
[[node_pref.rename_node]]
match = '\(?((x|X)?(\d+)(\.?\d+)?)((\s?倍率?)|(x|X))\)?'
replace = "$1x"
[managed_config]
# Append a '#!MANAGED-CONFIG' info to Surge configurations
write_managed_config = true
# Address prefix for MANAGED-CONFIG info, without the trailing "/".
managed_config_prefix = "http://127.0.0.1:25500"
# Managed config update interval in seconds, determine how long the config will be updated.
config_update_interval = 86400
# If config_update_strict is set to true, Surge will require a force update after the interval.
config_update_strict = false
# Device ID to be written to rewrite scripts for some version of Quantumult X
quanx_device_id = ""
[surge_external_proxy]
#surge_ssr_path = "/usr/bin/ssr-local"
resolve_hostname = true
[emojis]
add_emoji = false
remove_old_emoji = true
[[emojis.emoji]]
#match = '(流量|时间|应急)'
#emoji = '🏳️‍🌈'
import = "snippets/emoji.toml"
# [[custom_groups]]
# name = "Auto"
# type = "url-test"
# rule = [".*"]
# url = "http://www.gstatic.com/generate_204"
# interval = 300
# tolerance = 150
# lazy = true
# [[custom_groups]]
# name = "Proxy"
# type = "select"
# rule = [".*", "[]DIRECT"]
# disable_udp = false
# [[custom_groups]]
# name = "LoadBalance"
# type = "load-balance"
# rule = [".*", "[]Proxy", "[]DIRECT"]
# interval = 100
# strategy = "consistent-hashing"
# url = "http://www.gstatic.com/generate_204"
[[custom_groups]]
import = "snippets/groups.toml"
[ruleset]
# Enable generating rules with rulesets
enabled = true
# Overwrite the existing rules in rule_base
overwrite_original_rules = false
# Perform a ruleset update on request
update_ruleset_on_request = false
# [[rulesets]]
# group = "Proxy"
# ruleset = "https://raw.githubusercontent.com/DivineEngine/Profiles/master/Surge/Ruleset/Unbreak.list"
# type = "surge-ruleset"
# interval = 86400
[[rulesets]]
import = "snippets/rulesets.toml"
[template]
template_path = "template"
[[template.globals]]
key = "clash.http_port"
value = "7890"
[[template.globals]]
key = "clash.socks_port"
value = "7891"
[[template.globals]]
key = "clash.allow_lan"
value = "true"
[[template.globals]]
key = "clash.log_level"
value = "info"
[[aliases]]
uri = "/clash"
target = "/sub?target=clash"
[[aliases]]
uri = "/clashr"
target = "/sub?target=clashr"
[[aliases]]
uri = "/surge"
target = "/sub?target=surge"
[[aliases]]
uri = "/quan"
target = "/sub?target=quan"
[[aliases]]
uri = "/quanx"
target = "/sub?target=quanx"
[[aliases]]
uri = "/mellow"
target = "/sub?target=mellow"
[[aliases]]
uri = "/surfboard"
target = "/sub?target=surfboard"
[[aliases]]
uri = "/loon"
target = "/sub?target=loon"
[[aliases]]
uri = "/ss"
target = "/sub?target=ss"
[[aliases]]
uri = "/ssd"
target = "/sub?target=ssd"
[[aliases]]
uri = "/sssub"
target = "/sub?target=sssub"
[[aliases]]
uri = "/ssr"
target = "/sub?target=ssr"
[[aliases]]
uri = "/v2ray"
target = "/sub?target=v2ray"
[[aliases]]
uri = "/trojan"
target = "/sub?target=trojan"
[[aliases]]
uri = "/test"
target = "/render?path=templates/test.tpl"
#[[tasks]]
#name = "tick"
#cronexp = "0/10 * * * * ?"
#path = "tick.js"
#timeout = 3
[server]
listen = "0.0.0.0"
port = 25500
serve_file_root = "web"
[advanced]
log_level = "debug"
print_debug_info = true
max_pending_connections = 10240
max_concurrent_threads = 4
max_allowed_rulesets = 64
max_allowed_rules = 0
max_allowed_download_size = 0
enable_cache = true
cache_subscription = 60
cache_config = 300
cache_ruleset = 21600
script_clean_context = true
async_fetch_ruleset = false
skip_failed_links = true

160
base/snippets/emoji.toml Normal file
View File

@@ -0,0 +1,160 @@
[[emoji]]
match = "(?i:流量|时间|应急|过期|Bandwidth|expire)"
emoji = "🏳️‍🌈"
[[emoji]]
match = "AC"
emoji = "🇦🇨"
[[emoji]]
match = "(AR|阿根廷)"
emoji = "🇦🇷"
[[emoji]]
match = "(奥地利|维也纳)"
emoji = "🇦🇹"
[[emoji]]
match = "(AU|Australia|Sydney|澳大利亚|悉尼)"
emoji = "🇦🇺"
[[emoji]]
match = "BE"
emoji = "🇧🇪"
[[emoji]]
match = "(BR|Brazil|巴西|圣保罗)"
emoji = "🇧🇷"
[[emoji]]
match = "(Canada|加拿大|蒙特利尔|温哥华|楓葉|枫叶)"
emoji = "🇨🇦"
[[emoji]]
match = "(瑞士|苏黎世)"
emoji = "🇨🇭"
[[emoji]]
match = "(DE|Germany|法兰克福|德)"
emoji = "🇩🇪"
[[emoji]]
match = "丹麦"
emoji = "🇩🇰"
[[emoji]]
match = "ES"
emoji = "🇪🇸"
[[emoji]]
match = "EU"
emoji = "🇪🇺"
[[emoji]]
match = "(Finland|芬兰|赫尔辛基)"
emoji = "🇫🇮"
[[emoji]]
match = "(FR|France|法国|巴黎)"
emoji = "🇫🇷"
[[emoji]]
match = "(?i:UK|England|United.*?Kingdom|英国|[^-]英|伦敦)"
emoji = "🇬🇧"
[[emoji]]
match = "(?i:HK|Hong.*?Kong|HKT|HKBN|HGC|WTT|CMI|[^-]港)"
emoji = "🇭🇰"
[[emoji]]
match = "(Indonesia|印尼|印度尼西亚|雅加达)"
emoji = "🇮🇩"
[[emoji]]
match = "(Ireland|爱尔兰|都柏林)"
emoji = "🇮🇪"
[[emoji]]
match = "(India|印度|孟买)"
emoji = "🇮🇳"
[[emoji]]
match = "(Italy|意大利|米兰)"
emoji = "🇮🇹"
[[emoji]]
match = "(JP|Japan|日本|[^-]日)"
emoji = "🇯🇵"
[[emoji]]
match = "(KP|朝鲜)"
emoji = "🇰🇵"
[[emoji]]
match = "(KR|Korea|KOR|首尔|韩|韓)"
emoji = "🇰🇷"
[[emoji]]
match = "(MO|Macao|澳门|CTM)"
emoji = "🇲🇴"
[[emoji]]
match = "(MY|Malaysia|马来西亚)"
emoji = "🇲🇾"
[[emoji]]
match = "(NL|Netherlands|荷兰|阿姆斯特丹)"
emoji = "🇳🇱"
[[emoji]]
match = "(PH|Philippines|菲律宾)"
emoji = "🇵🇭"
[[emoji]]
match = "(RO|罗马尼亚)"
emoji = "🇷🇴"
[[emoji]]
match = "(RU|Russia|伯力|莫斯科|圣彼得堡|西伯利亚|新西伯利亚|俄罗斯|[^-]俄)"
emoji = "🇷🇺"
[[emoji]]
match = "(沙特|迪拜)"
emoji = "🇸🇦"
[[emoji]]
match = "(SE|Sweden)"
emoji = "🇸🇪"
[[emoji]]
match = "(SG|Singapore|新加坡|狮城|[^-]新)"
emoji = "🇸🇬"
[[emoji]]
match = "(TH|Thailand|泰国|曼谷)"
emoji = "🇹🇭"
[[emoji]]
match = "(TR|Turkey|土耳其|伊斯坦布尔)"
emoji = "🇹🇷"
[[emoji]]
match = "(?i:US|America|United.*?States|美国|[^-]美|波特兰|达拉斯|俄勒冈|凤凰城|费利蒙|硅谷|拉斯维加斯|洛杉矶|圣何塞|圣克拉拉|西雅图|芝加哥)"
emoji = "🇺🇲"
[[emoji]]
match = "(VN|越南)"
emoji = "🇻🇳"
[[emoji]]
match = "(ZA|南非)"
emoji = "🇿🇦"
[[emoji]]
match = "(?i:TW|Taiwan|新北|彰化|CHT|台湾|[^-]台|HINET)"
emoji = "🇨🇳"
[[emoji]]
match = "(?i:CN|China|回国|中国|江苏|北京|上海|广州|深圳|杭州|徐州|青岛|宁波|镇江|back)"
emoji = "🇨🇳"

91
base/snippets/groups.toml Normal file
View File

@@ -0,0 +1,91 @@
[[custom_groups]]
name = "🔰 节点选择"
type = "select"
rule = ["[]♻️ 自动选择", "[]🎯 全球直连", ".*"]
[[custom_groups]]
name = "♻️ 自动选择"
type = "url-test"
rule = [".*"]
url = "http://www.gstatic.com/generate_204"
interval = 300
[[custom_groups]]
name = "🎥 NETFLIX"
type = "select"
rule = [
"[]🔰 节点选择",
"[]♻️ 自动选择",
"[]🎯 全球直连",
".*"
]
[[custom_groups]]
name = "⛔️ 广告拦截"
type = "select"
rule = ["[]🛑 全球拦截",
"[]🎯 全球直连",
"[]🔰 节点选择"
]
[[custom_groups]]
name = "🚫 运营劫持"
type = "select"
rule = ["[]🛑 全球拦截",
"[]🎯 全球直连",
"[]🔰 节点选择"]
[[custom_groups]]
name = "🌍 国外媒体"
type = "select"
rule = ["[]🔰 节点选择",
"[]♻️ 自动选择",
"[]🎯 全球直连",
".*"]
[[custom_groups]]
name = "🌏 国内媒体"
type = "select"
rule = ["[]🎯 全球直连",
"(HGC|HKBN|PCCW|HKT|深台|彰化|新北|台|hk|港|tw)",
"[]🔰 节点选择"]
[[custom_groups]]
name = "Ⓜ️ 微软服务"
type = "select"
rule = ["[]🎯 全球直连",
"[]🔰 节点选择",
".*"]
[[custom_groups]]
name = "📲 电报信息"
type = "select"
rule = ["[]🔰 节点选择",
"[]🎯 全球直连",
".*"]
[[custom_groups]]
name = "🍎 苹果服务"
type = "select"
rule = ["[]🔰 节点选择",
"[]🎯 全球直连",
"[]♻️ 自动选择",
".*"]
[[custom_groups]]
name = "🎯 全球直连"
type = "select"
rule = ["[]DIRECT"]
[[custom_groups]]
name = "🛑 全球拦截"
type = "select"
rule = ["[]REJECT", "[]DIRECT"]
[[custom_groups]]
name = "🐟 漏网之鱼"
type = "select"
rule = ["[]🔰 节点选择",
"[]🎯 全球直连",
"[]♻️ 自动选择",
".*"]

View File

@@ -0,0 +1,74 @@
# for forcerule.yml
[[custom_groups]]
name = "Proxy"
type = "select"
rule = [".*", "[]AUTO", "[]DIRECT", ".*"]
[[custom_groups]]
name = "AUTO"
type = "url-test"
rule = [".*"]
url = "http://www.gstatic.com/generate_204"
interval = 300
[[custom_groups]]
name = "google"
type = "select"
rule = [".*"]
[[custom_groups]]
name = "netflix"
type = "select"
rule = [".*"]
[[custom_groups]]
name = "动画疯"
type = "select"
rule = ["(深台|彰化|新北|台)"]
[[custom_groups]]
name = "fox+"
type = "select"
rule = ["(HGC|HKBN|PCCW|HKT|深台|彰化|新北|台|新加坡|sg|hk|tw)"]
[[custom_groups]]
name = "美区影视"
type = "select"
rule = ["(美|美国)"]
[[custom_groups]]
name = "Global_media"
type = "select"
rule = [".*"]
[[custom_groups]]
name = "Domestic"
type = "select"
rule = ["[]DIRECT", "[]Proxy"]
[[custom_groups]]
name = "Apple"
type = "select"
rule = ["[]DIRECT", "[]Proxy"]
[[custom_groups]]
name = "Final"
type = "select"
rule = ["[]Proxy", "[]DIRECT"]
[[custom_groups]]
name = "屏蔽广告"
type = "select"
rule = ["[]REJECT", "[]DIRECT"]
[[custom_groups]]
name = "UnblockNeteaseMusic"
type = "select"
rule = ["云音乐解锁", "[]DIRECT"]
[[custom_groups]]
name = "Telegram"
type = "select"
rule = ["新加坡", "[]Proxy"]

View File

@@ -0,0 +1,177 @@
# short names
[[rename_node]]
match = "中国"
replace = "中"
[[rename_node]]
match = "徐州"
replace = "徐"
[[rename_node]]
match = "深圳"
replace = "深"
[[rename_node]]
match = "上海"
replace = "沪"
[[rename_node]]
match = "广州"
replace = "穗"
[[rename_node]]
match = "宁波"
replace = "甬"
[[rename_node]]
match = "贵阳"
replace = "筑"
[[rename_node]]
match = "武汉"
replace = "汉"
[[rename_node]]
match = "南京"
replace = "宁"
[[rename_node]]
match = "天津"
replace = "津"
[[rename_node]]
match = "北京"
replace = "京"
[[rename_node]]
match = "沈阳"
replace = "沈"
[[rename_node]]
match = "江苏"
replace = "苏"
[[rename_node]]
match = "浙江"
replace = "浙"
[[rename_node]]
match = "安徽"
replace = "皖"
[[rename_node]]
match = "福建"
replace = "闽"
[[rename_node]]
match = "湖南"
replace = "湘"
[[rename_node]]
match = "广东"
replace = "粤"
[[rename_node]]
match = "海南"
replace = "琼"
[[rename_node]]
match = "四川"
replace = "川"
[[rename_node]]
match = "贵州"
replace = "贵"
[[rename_node]]
match = "云南"
replace = "云"
[[rename_node]]
match = "青海"
replace = "青"
[[rename_node]]
match = "台湾"
replace = "台"
[[rename_node]]
match = "香港"
replace = "港"
[[rename_node]]
match = "澳门"
replace = "澳"
[[rename_node]]
match = "美国"
replace = "美"
[[rename_node]]
match = "英国"
replace = "英"
[[rename_node]]
match = "加拿大"
replace = "加"
[[rename_node]]
match = "法国"
replace = "法"
[[rename_node]]
match = "德国"
replace = "德"
[[rename_node]]
match = "瑞士"
replace = "瑞"
[[rename_node]]
match = "日本"
replace = "日"
[[rename_node]]
match = "韩国"
replace = "韩"
[[rename_node]]
match = "芬兰"
replace = "芬"
[[rename_node]]
match = "印度"
replace = "印"
[[rename_node]]
match = "泰国"
replace = "泰"
[[rename_node]]
match = "越南"
replace = "越"
[[rename_node]]
match = "新加坡"
replace = "新"
[[rename_node]]
match = "意大利"
replace = "意"
[[rename_node]]
match = "菲律宾"
replace = "菲"
[[rename_node]]
match = "俄罗斯"
replace = "俄"
[[rename_node]]
match = "土耳其"
replace = "土"
# times RE
[[rename_node]]
match = '\(?((x|X)?(\d+)(\.?\d+)?)((\s?倍率?)|(x|X))\)?'
replace = "$1x"

View File

@@ -0,0 +1,80 @@
[[rulesets]]
group = "🎯 全球直连"
ruleset = "rules/LocalAreaNetwork.list"
[[rulesets]]
group = "Ⓜ️ 微软服务"
ruleset = "rules/MSServices.list"
[[rulesets]]
group = "🎯 全球直连"
ruleset = "rules/DivineEngine/Surge/Ruleset/Unbreak.list"
[[rulesets]]
group = "🛑 全球拦截"
ruleset = "rules/NobyDa/Surge/AdRule.list"
[[rulesets]]
group = "🛑 全球拦截"
ruleset = "rules/DivineEngine/Surge/Ruleset/Guard/Hijacking.list"
[[rulesets]]
group = ";🎥 NETFLIX"
ruleset = "rules/DivineEngine/Surge/Ruleset/StreamingMedia/Video/Netflix.list"
[[rulesets]]
group = "🌍 国外媒体"
ruleset = "rules/DivineEngine/Surge/Ruleset/StreamingMedia/Streaming.list"
[[rulesets]]
group = "🌏 国内媒体"
ruleset = "rules/lhie1/Surge/Surge 3/Provider/Media/Bilibili.list"
[[rulesets]]
group = "🌏 国内媒体"
ruleset = "rules/lhie1/Surge/Surge 3/Provider/Media/iQiyi.list"
[[rulesets]]
group = "🌏 国内媒体"
ruleset = "rules/lhie1/Surge/Surge 3/Provider/Media/Letv.list"
[[rulesets]]
group = "🌏 国内媒体"
ruleset = "rules/lhie1/Surge/Surge 3/Provider/Media/MOO.list"
[[rulesets]]
group = "🌏 国内媒体"
ruleset = "rules/lhie1/Surge/Surge 3/Provider/Media/Tencent Video.list"
[[rulesets]]
group = "🌏 国内媒体"
ruleset = "rules/lhie1/Surge/Surge 3/Provider/Media/Youku.list"
[[rulesets]]
group = "📲 电报信息"
ruleset = "rules/DivineEngine/Surge/Ruleset/Extra/Telegram/Telegram.list"
[[rulesets]]
group = "🔰 节点选择"
ruleset = "rules/DivineEngine/Surge/Ruleset/Global.list"
[[rulesets]]
group = "🍎 苹果服务"
ruleset = "rules/DivineEngine/Surge/Ruleset/Extra/Apple/Apple.list"
[[rulesets]]
group = "🎯 全球直连"
ruleset = "rules/DivineEngine/Surge/Ruleset/China.list"
[[rulesets]]
group = "🎯 全球直连"
ruleset = "rules/NobyDa/Surge/Download.list"
[[rulesets]]
group = "🎯 全球直连"
ruleset = "[]GEOIP,CN"
[[rulesets]]
group = "🐟 漏网之鱼"
ruleset = "[]FINAL"