mirror of
				https://github.com/kenzok8/openwrt-packages.git
				synced 2025-10-30 07:50:37 +08:00 
			
		
		
		
	
		
			
	
	
		
			156 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
		
		
			
		
	
	
			156 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| ![github-actions[bot]](/assets/img/avatar_default.png)  | #!/bin/bash /etc/rc.common
 | ||
|  | . /lib/functions.sh | ||
|  | 
 | ||
|  | lang=$(uci get luci.main.lang 2>/dev/null)  | ||
|  | load="/tmp/config.yaml" | ||
|  | CONFIG_YAML_PATH=$(uci get clash.config.use_config 2>/dev/null) | ||
|  | 
 | ||
|  | 
 | ||
|  | if [  -f $CONFIG_YAML_PATH ] && [ "$(ls -l $CONFIG_YAML_PATH|awk '{print int($5)}')" -ne 0 ];then | ||
|  | 	cp $CONFIG_YAML_PATH $load 2>/dev/null		 | ||
|  | fi | ||
|  | 
 | ||
|  | if [ ! -f $load ] || [ "$(ls -l $load|awk '{print int($5)}')" -eq 0 ]; then  | ||
|  |   exit 0 | ||
|  | fi  | ||
|  | 
 | ||
|  | CFG_FILE="/etc/config/clash" | ||
|  | REAL_LOG="/usr/share/clash/clash_real.txt" | ||
|  | 
 | ||
|  | rm -rf /tmp/Proxy_Group /tmp/group_*.yaml /tmp/yaml_group.yaml 2>/dev/null | ||
|  | 
 | ||
|  | 
 | ||
|  | 	if [ $lang == "zh_cn" ];then | ||
|  | 		echo "开始更新策略组配置..." >$REAL_LOG  | ||
|  | 	elif [ $lang == "en" ] || [ $lang == "auto" ];then | ||
|  |     	echo "Start updating policy group config" >$REAL_LOG | ||
|  | 	fi | ||
|  | 
 | ||
|  | 	   sed -i 's/^Proxy Group:/proxy-groups:/g' "$load" | ||
|  | 	   sed -i 's/^proxy-provider:/proxy-providers:/g' "$load" | ||
|  | 	   sed -i 's/^Proxy:/proxies:/g' "$load" | ||
|  | 	   sed -i 's/^Rule:/rules:/g' "$load" | ||
|  | 	   sed -i 's/^rule-provider:/rule-providers:/g' "$load" | ||
|  | 	    | ||
|  | 
 | ||
|  |    group_len=$(sed -n '/^ \{0,\}proxy-groups:/=' "$load" 2>/dev/null) | ||
|  |    provider_len=$(sed -n '/^ \{0,\}proxy-providers:/=' "$load" 2>/dev/null) | ||
|  |    if [ "$provider_len" -ge "$group_len" ]; then | ||
|  |        awk '/proxies:/,/proxy-providers:/{print}' "$load" 2>/dev/null |sed "s/\'//g" 2>/dev/null |sed 's/\"//g' 2>/dev/null |sed 's/\t/ /g' 2>/dev/null |grep name: |awk -F 'name:' '{print $2}' |sed 's/,.*//' |sed 's/^ \{0,\}//' 2>/dev/null |sed 's/ \{0,\}$//' 2>/dev/null |sed 's/ \{0,\}\}\{0,\}$//g' 2>/dev/null >/tmp/Proxy_Group 2>&1 | ||
|  |        sed -i "s/proxy-providers://g" /tmp/Proxy_Group 2>&1 | ||
|  |    else | ||
|  |        awk '/proxies:/,/rules:/{print}' "$load" 2>/dev/null |sed "s/\'//g" 2>/dev/null |sed 's/\"//g' 2>/dev/null |sed 's/\t/ /g' 2>/dev/null |grep name: |awk -F 'name:' '{print $2}' |sed 's/,.*//' |sed 's/^ \{0,\}//' 2>/dev/null |sed 's/ \{0,\}$//' 2>/dev/null |sed 's/ \{0,\}\}\{0,\}$//g' 2>/dev/null >/tmp/Proxy_Group 2>&1 | ||
|  |    fi | ||
|  |     | ||
|  |     | ||
|  |    if [ "$?" -eq "0" ]; then | ||
|  |       echo 'DIRECT' >>/tmp/Proxy_Group | ||
|  |       echo 'REJECT' >>/tmp/Proxy_Group | ||
|  |    else | ||
|  |        | ||
|  | 	  	if [ $lang == "en" ] || [ $lang == "auto" ];then | ||
|  | 			echo "Read error, configuration file exception!" >/tmp/Proxy_Group | ||
|  | 		elif [ $lang == "zh_cn" ];then | ||
|  | 			echo '读取错误,配置文件异常!' >/tmp/Proxy_Group | ||
|  | 		fi | ||
|  |    fi | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | group_len=$(sed -n '/^ \{0,\}proxy-groups:/=' "$load" 2>/dev/null) | ||
|  | provider_len=$(sed -n '/^ \{0,\}proxy-providers:/=' "$load" 2>/dev/null) | ||
|  | ruleprovider_len=$(sed -n '/^ \{0,\}rule-providers:/=' "$load" 2>/dev/null) | ||
|  | if [ "$provider_len" -ge "$group_len" ]; then | ||
|  |    awk '/proxy-groups:/,/proxy-providers:/{print}' "$load" 2>/dev/null |sed 's/\"//g' 2>/dev/null |sed "s/\'//g" 2>/dev/null |sed 's/\t/ /g' 2>/dev/null >/tmp/yaml_group.yaml 2>&1 | ||
|  |    sed -i "s/proxy-providers://g" /tmp/yaml_group.yaml 2>&1 | ||
|  | elif [ "$ruleprovider_len" -ge "$group_len" ]; then | ||
|  |    awk '/proxy-groups:/,/rule-providers:/{print}' "$load" 2>/dev/null |sed 's/\"//g' 2>/dev/null |sed "s/\'//g" 2>/dev/null |sed 's/\t/ /g' 2>/dev/null >/tmp/yaml_group.yaml 2>&1 | ||
|  |    sed -i "s/rule-providers://g" /tmp/yaml_group.yaml 2>&1 | ||
|  | else | ||
|  |    awk '/proxy-groups:/,/Rule:/{print}' "$load" 2>/dev/null |sed 's/\"//g' 2>/dev/null |sed "s/\'//g" 2>/dev/null |sed 's/\t/ /g' 2>/dev/null >/tmp/yaml_group.yaml 2>&1 | ||
|  | fi | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #######READ GROUPS START | ||
|  | 
 | ||
|  | 
 | ||
|  | if [ -f /tmp/yaml_group.yaml ];then | ||
|  | 	while [[ "$( grep -c "config conf_groups" $CFG_FILE )" -ne 0 ]]  | ||
|  | 	do | ||
|  |       uci delete clash.@conf_groups[0] && uci commit clash >/dev/null 2>&1 | ||
|  | 	done | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | count=1 | ||
|  | file_count=1 | ||
|  | match_group_file="/tmp/Proxy_Group" | ||
|  | group_file="/tmp/yaml_group.yaml" | ||
|  | line=$(sed -n '/name:/=' $group_file) | ||
|  | num=$(grep -c "name:" $group_file) | ||
|  |     | ||
|  | cfg_get() | ||
|  | { | ||
|  | 	echo "$(grep "$1" "$2" 2>/dev/null |awk -v tag=$1 'BEGIN{FS=tag} {print $2}' 2>/dev/null |sed 's/,.*//' 2>/dev/null |sed 's/^ \{0,\}//g' 2>/dev/null |sed 's/ \{0,\}$//g' 2>/dev/null |sed 's/ \{0,\}\}\{0,\}$//g' 2>/dev/null)" | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | for n in $line | ||
|  | do | ||
|  |    single_group="/tmp/group_$file_count.yaml" | ||
|  |     | ||
|  |    [ "$count" -eq 1 ] && { | ||
|  |       startLine="$n" | ||
|  |   } | ||
|  | 
 | ||
|  |    count=$(expr "$count" + 1) | ||
|  |    if [ "$count" -gt "$num" ]; then | ||
|  |       endLine=$(sed -n '$=' $group_file) | ||
|  |    else | ||
|  |       endLine=$(expr $(echo "$line" | sed -n "${count}p") - 1) | ||
|  |    fi | ||
|  |    | ||
|  |    sed -n "${startLine},${endLine}p" $group_file >$single_group | ||
|  |    startLine=$(expr "$endLine" + 1) | ||
|  |     | ||
|  |    #type | ||
|  |    group_type="$(cfg_get "type:" "$single_group")" | ||
|  |    #name | ||
|  |    group_name="$(cfg_get "name:" "$single_group")" | ||
|  |    #test_url | ||
|  |     | ||
|  | 	  	if [ $lang == "en" ] || [ $lang == "auto" ];then | ||
|  | 			echo "Now Reading 【$group_type】-【$group_name】 Policy Group..." >$REAL_LOG | ||
|  | 		elif [ $lang == "zh_cn" ];then | ||
|  | 			echo "正在读取【$group_type】-【$group_name】策略组配置..." >$REAL_LOG | ||
|  | 		fi | ||
|  | 		 | ||
|  |    name=clash | ||
|  |    uci_name_tmp=$(uci add $name conf_groups) | ||
|  |    uci_set="uci -q set $name.$uci_name_tmp." | ||
|  |    uci_add="uci -q add_list $name.$uci_name_tmp." | ||
|  |    ${uci_set}name="$group_name" | ||
|  |    ${uci_set}type="$group_type" | ||
|  | 
 | ||
|  | 
 | ||
|  |    file_count=$(( $file_count + 1)) | ||
|  |      | ||
|  | done | ||
|  | 
 | ||
|  | uci commit clash | ||
|  | 
 | ||
|  |  	  	if [ $lang == "en" ] || [ $lang == "auto" ];then | ||
|  | 			echo "Reading Policy Group Completed" >$REAL_LOG | ||
|  | 			sleep 2 | ||
|  | 			echo "Clash for OpenWRT" >$REAL_LOG | ||
|  | 		elif [ $lang == "zh_cn" ];then | ||
|  | 			echo "读取策略组配置完成" >$REAL_LOG | ||
|  | 			sleep 2 | ||
|  | 			echo "Clash for OpenWRT" >$REAL_LOG			 | ||
|  | 		fi | ||
|  | 
 | ||
|  | rm -rf /tmp/Proxy_Group /tmp/group_*.yaml /tmp/yaml_group.yaml $load 2>/dev/null | ||
|  | fi | ||
|  | #######READ GROUPS END |