ssr-monitor 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #!/bin/sh
  2. #
  3. # Copyright (C) 2017 openwrt-ssr
  4. # Copyright (C) 2017 yushi studio <[email protected]>
  5. #
  6. # This is free software, licensed under the GNU General Public License v3.
  7. # See /LICENSE for more information.
  8. #
  9. . $IPKG_INSTROOT/etc/init.d/shadowsocksr
  10. LOCK_FILE="/var/lock/ssr-monitor.lock"
  11. [ -f "$LOCK_FILE" ] && exit 2
  12. touch "$LOCK_FILE"
  13. server_process_count=$1
  14. redir_tcp_process=$2
  15. redir_udp_process=$3
  16. kcp_process=$4
  17. local_process=$5
  18. pdnsd_process=$6
  19. if [ -z "$pdnsd_process" ]; then
  20. pdnsd_process=0
  21. fi
  22. i=0
  23. GLOBAL_SERVER=$(uci_get_by_type global global_server)
  24. server=$(uci_get_by_name $GLOBAL_SERVER server)
  25. kcp_port=$(uci_get_by_name $GLOBAL_SERVER kcp_port)
  26. server_port=$(uci_get_by_name $GLOBAL_SERVER server_port)
  27. password=$(uci_get_by_name $GLOBAL_SERVER kcp_password)
  28. kcp_param=$(uci_get_by_name $GLOBAL_SERVER kcp_param)
  29. [ "$password" != "" ] && password="--key "${password}
  30. while [ "1" == "1" ]; do #死循环
  31. sleep 000030s
  32. #redir tcp
  33. if [ "$redir_tcp_process" -gt 0 ]; then
  34. icount=$(busybox ps -w | grep ssr-retcp | grep -v grep | wc -l)
  35. if [ "$icount" == 0 ]; then
  36. logger -t "$NAME" "ssrplus redir tcp error.restart!"
  37. echolog "ssrplus redir tcp error.restart!"
  38. /etc/init.d/shadowsocksr restart
  39. exit 0
  40. fi
  41. fi
  42. #redir udp
  43. if [ "$redir_udp_process" -gt 0 ]; then
  44. icount=$(busybox ps -w | grep ssr-reudp | grep -v grep | wc -l)
  45. if [ "$icount" == 0 ]; then
  46. logger -t "$NAME" "ssrplus redir udp error.restart!"
  47. echolog "ssrplus redir udp error.restart!"
  48. /etc/init.d/shadowsocksr restart
  49. exit 0
  50. fi
  51. fi
  52. #server
  53. if [ "$server_process_count" -gt 0 ]; then
  54. icount=$(busybox ps -w | grep ssr-server | grep -v grep | wc -l)
  55. if [ "$icount" -lt "$server_process_count" ]; then #如果进程挂掉就重启它
  56. logger -t "$NAME" "ssrplus server error.restart!"
  57. echolog "ssrplus server error.restart!"
  58. kill -9 $(busybox ps -w | grep ssr-server | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  59. /etc/init.d/shadowsocksr restart
  60. exit 0
  61. fi
  62. fi
  63. #kcptun
  64. if [ "$kcp_process" -gt 0 ]; then
  65. icount=$(busybox ps -w | grep kcptun-client | grep -v grep | wc -l)
  66. if [ "$icount" -lt "$kcp_process" ]; then #如果进程挂掉就重启它
  67. logger -t "$NAME" "ssrplus kcptun error.restart!"
  68. echolog "ssrplus kcptun error.restart!"
  69. killall -q -9 kcptun-client
  70. (/usr/bin/kcptun-client -r $server:$kcp_port -l :$server_port $password $kcp_param &)
  71. fi
  72. fi
  73. #localsocks
  74. if [ "$local_process" -gt 0 ]; then
  75. icount=$(busybox ps -w | grep ssr-local | grep -v grep | wc -l)
  76. if [ "$icount" -lt "$local_process" ]; then #如果进程挂掉就重启它
  77. logger -t "$NAME" "global socks server error.restart!"
  78. echolog "global socks server error.restart!"
  79. kill -9 $(busybox ps -w | grep ssr-local | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  80. /etc/init.d/shadowsocksr restart
  81. exit 0
  82. fi
  83. fi
  84. #dns2tcp
  85. if [ "$pdnsd_process" -eq 1 ]; then
  86. icount=$(busybox ps -w | grep $TMP_BIN_PATH/dns2tcp | grep -v grep | wc -l)
  87. if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它
  88. logger -t "$NAME" "dns2tcp tunnel error.restart!"
  89. echolog "dns2tcp tunnel error.restart!"
  90. dnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53)
  91. kill -9 $(busybox ps -w | grep $TMP_BIN_PATH/dns2tcp | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  92. ln_start_bin $(first_type dns2tcp) dns2tcp -L "127.0.0.1#$dns_port" -R "${dnsserver/:/#}"
  93. fi
  94. #dns2socks
  95. elif [ "$pdnsd_process" -eq 2 ]; then
  96. icount=$(busybox ps -w | grep -e ssrplus-dns -e "dns2socks 127.0.0.1 $tmp_dns_port" | grep -v grep | wc -l)
  97. if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它
  98. logger -t "$NAME" "dns2socks $dnsserver tunnel error.restart!"
  99. echolog "dns2socks $dnsserver tunnel error.restart!"
  100. dnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53)
  101. kill -9 $(busybox ps -w | grep ssrplus-dns | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  102. kill -9 $(busybox ps -w | grep "dns2socks 127.0.0.1 $tmp_dns_port" | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  103. ln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_dns_port ssrplus-dns
  104. ln_start_bin $(first_type dns2socks) dns2socks 127.0.0.1:$tmp_dns_port $dnsserver 127.0.0.1:$dns_port -q
  105. fi
  106. #dns2socks-rust
  107. elif [ "$pdnsd_process" -eq 3 ]; then
  108. icount=$(busybox ps -w | grep -e ssrplus-dns -e "dns2socks-rust -s socks5://127.0.0.1 $tmp_dns_port" | grep -v grep | wc -l)
  109. if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它
  110. logger -t "$NAME" "dns2socks-rust $dnsserver tunnel error.restart!"
  111. echolog "dns2socks-rust $dnsserver tunnel error.restart!"
  112. dnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53)
  113. kill -9 $(busybox ps -w | grep ssrplus-dns | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  114. kill -9 $(busybox ps -w | grep "dns2socks-rust -s socks5://127.0.0.1 $tmp_dns_port" | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  115. ln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_dns_port ssrplus-dns
  116. ln_start_bin $(first_type dns2socks) dns2socks-rust -s socks5://127.0.0.1:$tmp_dns_port -d $dnsserver -l 127.0.0.1:$dns_port -f -c
  117. fi
  118. #mosdns
  119. elif [ "$pdnsd_process" -eq 4 ]; then
  120. icount=$(busybox ps -w | grep $TMP_BIN_PATH/mosdns | grep -v grep | wc -l)
  121. if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它
  122. logger -t "$NAME" "mosdns tunnel error.restart!"
  123. echolog "mosdns tunnel error.restart!"
  124. dnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53)
  125. kill -9 $(busybox ps -w | grep $TMP_BIN_PATH/mosdns | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  126. ln_start_bin $(first_type mosdns) mosdns start -c /etc/mosdns/config.yaml
  127. #dnsproxy
  128. elif [ "$pdnsd_process" -eq 5 ]; then
  129. icount=$(busybox ps -w | grep -e ssrplus-dns -e "dnsproxy -l 127.0.0.1 -p $tmp_dns_port" | grep -v grep | wc -l)
  130. if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它
  131. logger -t "$NAME" "dnsproxy $dnsserver tunnel error.restart!"
  132. echolog "dnsproxy $dnsserver tunnel error.restart!"
  133. local dnsproxy_dnsserver="$(uci_get_by_type global parse_method)"
  134. if [ -n "$dnsproxy_dnsserver" ] && [ "$dnsproxy_dnsserver" != "parse_file" ]; then
  135. dnsserver="$(uci_get_by_type global dnsproxy_tunnel_forward 8.8.4.4:53)"
  136. fi
  137. kill -9 $(busybox ps -w | grep "dnsproxy -l 127.0.0.1 -p $tmp_dns_port" | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  138. dnsproxy_ipv6="$(uci_get_by_type global dnsproxy_ipv6)"
  139. disabled_ipv6="--ipv6-disabled"
  140. fi
  141. if [ "$dnsproxy_dnsserver" != "parse_file" ]; then
  142. ln_start_bin $(first_type dnsproxy) dnsproxy -l 127.0.0.1 -p $tmp_dns_port -p $dns_port -u $dnsserver $disabled_ipv6 --cache --cache-min-ttl=3600
  143. else
  144. dnsproxy_dnsserver_file="$TMP_PATH/dnsproxy_dns.list"
  145. cleaned_file="$TMP_PATH/cleaned_dns.list"
  146. temp_file="$TMP_PATH/temp_dns.list"
  147. > "$cleaned_file"
  148. # 清理输入文件并去重
  149. while IFS= read -r line || [ -n "$line" ]; do
  150. line=$(echo "$line" | sed -E 's/^[ \t\r]+//; s/[ \t\r]+$//')
  151. [ -z "$line" ] && continue
  152. echo "$line" | grep -qE '^#' && continue
  153. echo "$line" >> "$cleaned_file"
  154. done < "/etc/ssrplus/dnsproxy_dns.list"
  155. # 获取清理后文件的MD5
  156. cleaned_md5=$(md5sum "$cleaned_file" | awk '{print $1}')
  157. if [ ! -f "$dnsproxy_dnsserver_file" ]; then
  158. cp "$cleaned_file" "$dnsproxy_dnsserver_file"
  159. else
  160. target_md5=$(md5sum "$dnsproxy_dnsserver_file" | awk '{print $1}')
  161. if [ "$cleaned_md5" != "$target_md5" ]; then
  162. > "$temp_file"
  163. # 保留目标文件中也存在于清理文件的记录(去重)
  164. while IFS= read -r line; do
  165. line=$(echo "$line" | sed -E 's/^[ \t\r]+//; s/[ \t\r]+$//')
  166. if grep -qixF "$line" "$cleaned_file" && ! grep -qixF "$line" "$temp_file"; then
  167. echo "$line" >> "$temp_file"
  168. fi
  169. done < "$dnsproxy_dnsserver_file"
  170. # 添加清理文件中有但目标文件没有的记录(去重)
  171. while IFS= read -r line; do
  172. line=$(echo "$line" | sed -E 's/^[ \t\r]+//; s/[ \t\r]+$//')
  173. if ! grep -qixF "$line" "$temp_file"; then
  174. echo "$line" >> "$temp_file"
  175. fi
  176. done < "$cleaned_file"
  177. temp_md5=$(md5sum "$temp_file" | awk '{print $1}')
  178. if [ "$temp_md5" != "$target_md5" ]; then
  179. mv "$temp_file" "$dnsproxy_dnsserver_file"
  180. else
  181. rm -f "$temp_file"
  182. fi
  183. fi
  184. fi
  185. rm -f "$cleaned_file"
  186. if [ -n "$dnsproxy_dnsserver_file" ] && [ -s "$dnsproxy_dnsserver_file" ]; then
  187. local upstreams_logic_mode="$(uci_get_by_type global upstreams_logic_mode)"
  188. ln_start_bin $(first_type dnsproxy) dnsproxy -l 127.0.0.1 -p $tmp_dns_port -p $dns_port -u $dnsproxy_dnsserver_file $disabled_ipv6 --cache --cache-min-ttl=3600 --upstream-mode=$upstreams_logic_mode
  189. fi
  190. fi
  191. fi
  192. #chinadns-ng(proxy)
  193. elif [ "$pdnsd_process" -eq 6 ]; then
  194. icount=$(busybox ps -w | grep -e ssrplus-dns -e "chinadns-ng -b 127.0.0.1 -l $tmp_dns_port" | grep -v grep | wc -l)
  195. if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它
  196. logger -t "$NAME" "chinadns-ng $dnsserver tunnel error.restart!"
  197. echolog "chinadns-ng $dnsserver tunnel error.restart!"
  198. dnsserver=$(uci_get_by_type global chinadns_ng_tunnel_forward 8.8.4.4:53)
  199. kill -9 $(busybox ps -w | grep "chinadns-ng -b 127.0.0.1 -l $tmp_dns_port" | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  200. local chinadns_ng_proto="$(uci_get_by_type global chinadns_ng_proto)"
  201. local chinadns_ng_dns=""
  202. IFS=','
  203. for chinadns_ng_server in $dnsserver; do
  204. local chinadns_ng_ip="${chinadns_ng_server%%:*}"
  205. local chinadns_ng_port="${chinadns_ng_server##*:}"
  206. [ "$chinadns_ng_ip" = "$chinadns_ng_port" ] && chinadns_ng_port="53"
  207. chinadns_ng_tls_port="853"
  208. case "$chinadns_ng_proto" in
  209. "none")
  210. chinadns_ng_server="${chinadns_ng_ip}#${chinadns_ng_port}"
  211. ;;
  212. "tls")
  213. chinadns_ng_server="${chinadns_ng_proto}://${chinadns_ng_ip}#${chinadns_ng_tls_port}"
  214. ;;
  215. *)
  216. chinadns_ng_server="${chinadns_ng_proto}://${chinadns_ng_ip}#${chinadns_ng_port}"
  217. ;;
  218. esac
  219. chinadns_ng_dns="${chinadns_ng_dns} -t ${chinadns_ng_server}"
  220. done
  221. unset IFS
  222. dnsserver="$chinadns_ng_dns"
  223. ln_start_bin $(first_type chinadns-ng) chinadns-ng -b 127.0.0.1 -l $tmp_dns_port -l $dns_port -p 3 -d gfw $dnsserver -N --filter-qtype 64,65 -f -r --cache 4096 --cache-stale 86400 --cache-refresh 20
  224. fi
  225. fi
  226. #chinadns-ng(china)
  227. if [ "$(uci -q get "dhcp.@dnsmasq[0]._unused_ssrp_changed")" = "1" ]; then
  228. icount=$(busybox ps -w | grep $TMP_BIN_PATH/chinadns-ng | grep -v grep | wc -l)
  229. if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它
  230. logger -t "$NAME" "chinadns-ng tunnel error.restart!"
  231. echolog "chinadns-ng tunnel error.restart!"
  232. chinadns=$(uci_get_by_type global chinadns_forward)
  233. wandns="$(ifstatus wan | jsonfilter -e '@["dns-server"][0]' || echo "119.29.29.29")"
  234. case "$chinadns" in
  235. "wan") chinadns="$wandns" ;;
  236. ""|"wan_114") chinadns="$wandns,114.114.114.114" ;;
  237. esac
  238. kill -9 $(busybox ps -w | grep $TMP_BIN_PATH/chinadns-ng | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  239. ln_start_bin $(first_type chinadns-ng) chinadns-ng -l $china_dns_port -4 china -p 3 -c ${chinadns/:/#} -t 127.0.0.1#$dns_port -N -f -r
  240. fi
  241. fi
  242. done