diff --git a/cf-watch.sh b/cf-watch.sh index ac84b478..dd90a9bb 100755 --- a/cf-watch.sh +++ b/cf-watch.sh @@ -1,48 +1,205 @@ -dev=$1; -conf=$2; +#!/bin/sh + + +family=$1; +interface=$2; +conf_num=$3; + +debug=false; + +archAffix(){ + os=''; + arch=''; + case $(uname) in + Linux) + os='linux'; + case $(uname -m) in + i386 | i686) arch='386' ;; + x86_64 | amd64) arch='amd64' ;; + armv8 | arm64 | aarch64) arch='arm64' ;; + s390x) arch='s390x' ;; + *) echo 'Unsupported CPU!' && exit 1 ;; + esac; + ;; + Darwin) + os='darwin'; + case $(uname -m) in + x86_64 | amd64) arch='amd64' ;; + armv8 | arm64 | aarch64) arch='arm64' ;; + *) echo 'Unsupported CPU!' && exit 1 ;; + esac; + ;; + *) + echo 'Unsupported OS!' && exit 1; + ;; + esac; + echo $os-$arch; +}; + +get_rnd_dec(){ + echo $(od -An -N2 -i /dev/random); +}; + +get_rnd_hex(){ + echo $(od -An -N2 -x /dev/random); +}; + +get_ping_loss(){ + if [ $debug == 'true' ]; then + echo 100; + exit 0; + fi; + loss_percent=$(ping -c 10 -qn $1 | awk '/packet loss/{for(i=6;i<=NF;i++)if($i ~ /packet/)print $((i-1))}'); + loss=${loss_percent%?}; + echo ${loss%.*}; +}; + +cf_v4(){ + set -- '188.114.96.' \ + '188.114.97.' \ + '188.114.98.' \ + '188.114.99.' \ + '162.159.192.' \ + '162.159.193.' \ + '162.159.195.' \ + '162.159.204.'; + index=$((0 - ($(get_rnd_dec) % 8))); + echo $(eval "echo \$$(($#$index))")$((($(get_rnd_dec) % 253) + 1)); +}; + +cf_v6(){ + echo [2606:4700:d$(($(get_rnd_dec) % 2))::$(get_rnd_hex):$(get_rnd_hex):$(get_rnd_hex):$(get_rnd_hex)]; +}; + + +generate_ips(){ + max=$1; + prog=''; + case $2 in + 6) + prog='cf_v6'; + ;; + *) + prog='cf_v4'; + ;; + esac + + set --; + num=0; + while true; do + ip=$($prog); + unique='true'; + for index in $@; do + if [ "$index" == "$ip" ]; then + unique='false'; + fi; + done; + if [ "$unique" == 'true' ]; then + set -- $@ $ip; + num=$(($num + 1)); + fi; + if [ $num -ge $max ]; then + break; + fi; + done; + echo $@; +}; + +speedtest(){ + exe_file='warp'; + if [ ! -f $exe_file ]; then + curl -Sfo $exe_file "https://gitlab.com/Misaka-blog/warp-script/-/raw/main/files/warp-yxip/warp-$1" + fi; + ulimit -n 102400; + chmod +x $exe_file && ./$exe_file >/dev/null 2>&1; + result_file='result.csv' + if [ -f $result_file ]; then + ips=$(cat $result_file | awk -F, 'NR != 1 && NR <= '$(($2 + 1))'{print $1}'); + rm -f $result_file; + echo $ips; + else + if [ $debug != 'true' ]; then + rm -f $exe_file; + fi; + exit 1; + fi; +}; + +get_ip_cadidates(){ + limit=100 + ip_file='ip.txt' + for index in $(generate_ips $limit $family); do + echo "$index" >> $ip_file; + done; + if [ $3 == 'true' ]; then + ip_list=$(speedtest $(archAffix) $1); + else + ip_list=$(head -$1 $ip_file | awk '{print $1":"'$2'}'); + fi; + result=$?; + if [ $result -ne 0 ]; then + ip_list=$(head -$1 $ip_file | awk '{print $1":"'$2'}'); + fi; + rm -f $ip_file; + echo $ip_list; + if [ $result -ne 0 ]; then + exit 1; + fi; +}; + +main(){ + num_cadidates=10 + default_port=4500 + dl_retry_times=3 + watch='1.1.1.1'; + threshold=40 + wait_in_between=5 + loss=$(get_ping_loss $watch); + retry=0; + while [ $loss -ge $threshold ]; do + if [ $retry -lt $dl_retry_times ]; then + cadidates=$(get_ip_cadidates $num_cadidates $default_port true); + else + cadidates=$(get_ip_cadidates $num_cadidates $default_port false); + fi; + if [ $? -eq 1 ]; then + retry=$(($retry + 1)); + fi + for cfip in $cadidates; do + loss=$(get_ping_loss $watch); + if [ $loss -lt $threshold ]; then + break; + fi; + echo "changing $interface endpoint to $cfip"; + if [ $debug == 'true' ]; then + continue; + fi; + if [ ! $interface ]; then + continue; + fi; + wg set $interface peer 'bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=' endpoint $cfip; + sleep $wait_in_between; + done + done; + if [ $debug = 'true' ]; then + exit 0; + fi; + if [ ! $interface ]; then + exit 0; + fi; + if [ ! $conf_num ]; then + exit 0; + fi; + endpoint=$(wg show $interface endpoints | awk '{print $2}'); + if [ $(pfSsh.php playback chgwgpeer $conf_num) != $endpoint ]; then + pfSsh.php playback chgwgpeer $conf_num $(echo $endpoint|awk -F: '{print $1}') $(echo $endpoint|awk -F: '{print $2}') || true; + fi; +}; + pids=$(pgrep -afl $0); if [ $(echo $pids|grep -o $0|wc -l) -gt 1 ]; then exit; fi; -get_rnd(){ - echo $(od -An -N2 -i /dev/random); - return $?; -}; - -get_ping_loss(){ - loss_percent=$(ping -c 10 -qn $1 | awk '/packet loss/{for(i=6;i<=NF;i++)if($i ~ /packet/)print $((i-1))}'); - loss=${loss_percent%?}; - echo ${loss%.*}; - return $?; -}; - -cf_v4(){ - echo 188.114.$((($(get_rnd) % 4) + 96)).$((($(get_rnd) % 253) + 1)); - return $?; -}; - -cf_v6(){ - hex=$(head /dev/urandom | md5sum | head -c 16); - hex1=$(echo $hex | awk '{print substr($0,1,4)}'); - hex2=$(echo $hex | awk '{print substr($0,5,4)}'); - hex3=$(echo $hex | awk '{print substr($0,9,4)}'); - hex4=$(echo $hex | awk '{print substr($0,13,4)}'); - echo 2606:4700:d$(($(get_rnd) % 2))::$hex1:$hex2:$hex3:$hex4; - return $?; -}; - -watch="1.1.1.1"; -loss=$(get_ping_loss $watch); -while [ $loss -gt 40 ]; do - cfip=$(cf_v4); - echo "changing $dev endpoint to $cfip"; - wg set $dev peer "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=" endpoint "$cfip:4500"; - sleep 5; - loss=$(get_ping_loss $watch); -done; -endpoint=$(wg show $dev endpoints | awk '{print $2}'); -if [ $(pfSsh.php playback chgwgpeer $conf) != $endpoint ]; then - pfSsh.php playback chgwgpeer $conf $(echo $endpoint|awk -F: '{print $1}') $(echo $endpoint|awk -F: '{print $2}') || true; -fi; \ No newline at end of file +main