#!/bin/sh # Copyright (C) Juewuy #修饰singbox配置文件 parse_singbox_dns() { #dns转换 first_dns=$(echo "$1" | cut -d',' -f1 | cut -d' ' -f1) type="" server="" port="" case "$first_dns" in *://*) type="${first_dns%%://*}" tmp="${first_dns#*://}" ;; *) type="udp" tmp="$first_dns" ;; esac case "$tmp" in \[*\]*) server="${tmp%%]*}" server="${server#[}" port="${tmp#*\]}" port="${port#:}" ;; *) server="${tmp%%[:/]*}" port="${tmp#*:}" [ "$port" = "$tmp" ] && port="" ;; esac if [ -z "$port" ]; then case "$type" in udp|tcp) port=53 ;; doh|https) port=443 ;; dot|tls) port=853 ;; *) port=53 ;; esac fi # 输出 echo '"type": "'"$type"'", "server": "'"$server"'", "server_port": '"$port"',' } modify_json() { #提取配置文件以获得outbounds.json,providers.json及route.json "$TMPDIR"/CrashCore format -c $core_config >"$TMPDIR"/format.json echo '{' >"$TMPDIR"/jsons/outbounds.json echo '{' >"$TMPDIR"/jsons/route.json cat "$TMPDIR"/format.json | sed -n '/"outbounds":/,/^ "[a-z]/p' | sed '$d' >>"$TMPDIR"/jsons/outbounds.json [ "$crashcore" = "singboxr" ] && { echo '{' >"$TMPDIR"/jsons/providers.json cat "$TMPDIR"/format.json | sed -n '/^ "providers":/,/^ "[a-z]/p' | sed '$d' >>"$TMPDIR"/jsons/providers.json } cat "$TMPDIR"/format.json | sed -n '/"route":/,/^\( "[a-z]\|}\)/p' | sed '$d' >>"$TMPDIR"/jsons/route.json #生成endpoints.json [ "$ts_service" = ON ] || [ "$wg_service" = ON ] && [ "$zip_type" != upx ] && { . "$CRASHDIR"/configs/gateway.cfg . "$CRASHDIR"/libs/sb_endpoints.sh } #生成log.json cat >"$TMPDIR"/jsons/log.json <"$TMPDIR"/jsons/add_hosts.json </dev/null | grep -Ev '#|\*|\+|Mijia' | sed '/^\s*$/d' | awk '{printf "\"%s\", ",$1}' | sed 's/, $//') fake_ip_filter_suffix=$(cat ${CRASHDIR}/configs/fake_ip_filter ${CRASHDIR}/configs/fake_ip_filter.list 2>/dev/null | grep -v '.\*' | grep -E '\*|\+' | sed 's/^[*+]\.//' | awk '{printf "\"%s\", ",$1}' | sed 's/, $//') fake_ip_filter_regex=$(cat ${CRASHDIR}/configs/fake_ip_filter ${CRASHDIR}/configs/fake_ip_filter.list 2>/dev/null | grep '.\*' | sed 's/\./\\\\./g' | sed 's/\*/.\*/' | sed 's/^+/.\+/' | awk '{printf "\"%s\", ",$1}' | sed 's/, $//') [ -n "$fake_ip_filter_domain" ] && fake_ip_filter_domain="{ \"domain\": [$fake_ip_filter_domain], \"server\": \"dns_direct\" }," [ -n "$fake_ip_filter_suffix" ] && fake_ip_filter_suffix="{ \"domain_suffix\": [$fake_ip_filter_suffix], \"server\": \"dns_direct\" }," [ -n "$fake_ip_filter_regex" ] && fake_ip_filter_regex="{ \"domain_regex\": [$fake_ip_filter_regex], \"server\": \"dns_direct\" }," proxy_dns='{ "query_type": ["A", "AAAA"], "server": "dns_fakeip", "strategy": "'"$strategy"'", "rewrite_ttl": 1 }' #mix模式插入fakeip过滤规则 [ "$dns_mod" = "mix" ] && direct_dns='{ "rule_set": ["cn"], "server": "dns_direct" },' } [ "$dns_mod" = "route" ] && { global_dns=dns_proxy direct_dns='{ "rule_set": ["cn"], "server": "dns_direct" }' } #防泄露设置 [ "$dns_protect" = "OFF" ] && sed -i 's/"server": "dns_proxy"/"server": "dns_direct"/g' "$TMPDIR"/jsons/route.json #生成add_rule_set.json [ "$dns_mod" = "mix" ] || [ "$dns_mod" = "route" ] && ! grep -Eq '"tag" *:[[:space:]]*"cn"' "$CRASHDIR"/jsons/*.json && { [ "$crashcore" = "singboxr" ] && srs_path='"path": "./ruleset/cn.srs",' cat >"$TMPDIR"/jsons/add_rule_set.json <"$TMPDIR"/jsons/dns.json <"$TMPDIR"/jsons/add_route.json <"$TMPDIR"/jsons/certificate.json <"$TMPDIR"/jsons/inbounds.json <>"$TMPDIR"/jsons/tun.json <"$TMPDIR"/jsons/add_outbounds.json <"$TMPDIR"/jsons/experimental.json </dev/null)" ] && { cat "$CRASHDIR"/yamls/rules.yaml | sed '/#.*/d' | sed 's/,no-resolve//g' | grep -oE '\-.*,.*,.*' | sed 's/- DOMAIN-SUFFIX,/{ "domain_suffix": [ "/g' | sed 's/- DOMAIN-KEYWORD,/{ "domain_keyword": [ "/g' | sed 's/- IP-CIDR,/{ "ip_cidr": [ "/g' | sed 's/- SRC-IP-CIDR,/{ "._ip_cidr": [ "/g' | sed 's/- DST-PORT,/{ "port": [ "/g' | sed 's/- SRC-PORT,/{ "._port": [ "/g' | sed 's/- GEOIP,/{ "geoip": [ "/g' | sed 's/- GEOSITE,/{ "geosite": [ "/g' | sed 's/- IP-CIDR6,/{ "ip_cidr": [ "/g' | sed 's/- DOMAIN,/{ "domain": [ "/g' | sed 's/- PROCESS-NAME,/{ "process_name": [ "/g' | sed 's/,/" ], "outbound": "/g' | sed 's/$/" },/g' | sed '1i\{ "route": { "rules": [ ' | sed '$s/,$/ ] } }/' >"$TMPDIR"/jsons/cust_add_rules.json [ ! -s "$TMPDIR"/jsons/cust_add_rules.json ] && rm -rf "$TMPDIR"/jsons/cust_add_rules.json } #清理route.json中的process_name规则以及"auto_detect_interface" sed -i '/"process_name": \[/,/],$/d' "$TMPDIR"/jsons/route.json sed -i '/"process_name": "[^"]*",/d' "$TMPDIR"/jsons/route.json sed -i 's/"auto_detect_interface": true/"auto_detect_interface": false/g' "$TMPDIR"/jsons/route.json #跳过本地tls证书验证 if [ "$skip_cert" != "OFF" ]; then sed -i 's/"insecure": false/"insecure": true/' "$TMPDIR"/jsons/outbounds.json "$TMPDIR"/jsons/providers.json 2>/dev/null else sed -i 's/"insecure": true/"insecure": false/' "$TMPDIR"/jsons/outbounds.json "$TMPDIR"/jsons/providers.json 2>/dev/null fi #判断可用并修饰outbounds&providers&route.json结尾 for file in outbounds providers route; do if [ -n "$(grep ${file} "$TMPDIR"/jsons/${file}.json 2>/dev/null)" ]; then sed -i 's/^ },$/ }/; s/^ ],$/ ]/' "$TMPDIR"/jsons/${file}.json echo '}' >>"$TMPDIR"/jsons/${file}.json else rm -rf "$TMPDIR"/jsons/${file}.json fi done #加载自定义配置文件 mkdir -p "$TMPDIR"/jsons_base #以下为覆盖脚本的自定义文件 for char in log dns ntp certificate experimental; do [ -s "$CRASHDIR"/jsons/${char}.json ] && { ln -sf "$CRASHDIR"/jsons/${char}.json "$TMPDIR"/jsons/cust_${char}.json mv -f "$TMPDIR"/jsons/${char}.json "$TMPDIR"/jsons_base #如果重复则临时备份 } done #以下为增量添加的自定义文件 for char in others endpoints inbounds outbounds providers route services; do [ -s "$CRASHDIR"/jsons/${char}.json ] && { ln -sf "$CRASHDIR"/jsons/${char}.json "$TMPDIR"/jsons/cust_${char}.json } done #测试自定义配置文件 if ! error=$("$TMPDIR"/CrashCore check -D "$BINDIR" -C "$TMPDIR"/jsons 2>&1); then echo $error error_file=$(echo $error | grep -Eo 'cust.*\.json' | sed 's/cust_//g') [ "$error_file" = 'add_rules.json' ] && error_file="$CRASHDIR"/yamls/rules.yaml自定义规则 || error_file="$CRASHDIR"/jsons/$error_file logger "自定义配置文件校验失败,请检查【${error_file}】文件!" 31 logger "尝试使用基础配置文件启动~" 33 #清理自定义配置文件并还原基础配置 rm -rf "$TMPDIR"/jsons/cust_* mv -f "$TMPDIR"/jsons_base/* "$TMPDIR"/jsons 2>/dev/null fi #清理缓存 rm -rf "$TMPDIR"/*.json rm -rf "$TMPDIR"/jsons_base return 0 }