#!/bin/sh # # Copyright (C) 2017 openwrt-ssr # Copyright (C) 2017 yushi studio # # This is free software, licensed under the GNU General Public License v3. # See /LICENSE for more information. # NAME=shadowsocksr uci_get_by_name() { local ret=$(uci get $NAME.$1.$2 2>/dev/null) echo ${ret:=$3} } uci_get_by_type() { local ret=$(uci get $NAME.@$1[0].$2 2>/dev/null) echo ${ret:=$3} } server_process_count=$1 redir_tcp_process=$2 redir_udp_process=$3 tunnel_process=$4 kcp_process=$5 local_process=$6 pdnsd_process=$7 if [ -z "$pdnsd_process" ]; then pdnsd_process=0 fi i=0 GLOBAL_SERVER=$(uci_get_by_type global global_server) server=$(uci_get_by_name $GLOBAL_SERVER server) lkcp_port=$(uci_get_by_name $GLOBAL_SERVER kcp_port) server_port=$(uci_get_by_name $GLOBAL_SERVER server_port) password=$(uci_get_by_name $GLOBAL_SERVER kcp_password) kcp_param=$(uci_get_by_name $GLOBAL_SERVER kcp_param) [ "$password" != "" ] && password="--key "${password} if echo "$server" | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then server=${server} else server=$(cat /etc/ssr_ip) fi while [ "1" == "1" ]; do #死循环 sleep 30 #redir tcp if [ "$redir_tcp_process" -gt 0 ]; then icount=$(busybox ps -w | grep ssr-retcp | grep -v grep | wc -l) if [ "$icount" == 0 ]; then logger -t "$NAME" "ssr redir tcp error.restart!" /etc/init.d/shadowsocksr restart exit 0 fi fi #redir udp if [ "$redir_udp_process" -gt 0 ]; then icount=$(busybox ps -w | grep ssr-reudp | grep -v grep | wc -l) if [ "$icount" == 0 ]; then logger -t "$NAME" "ssr redir udp error.restart!" /etc/init.d/shadowsocksr restart exit 0 fi fi #tunnel if [ "$tunnel_process" -gt 0 ]; then icount=$(busybox ps -w | grep ssr-tunnel | grep -v grep | wc -l) if [ "$icount" == 0 ]; then logger -t "$NAME" "ssr tunnel error.restart!" /etc/init.d/shadowsocksr restart exit 0 fi fi #server if [ "$server_process_count" -gt 0 ]; then icount=$(busybox ps -w | grep ssr-server | grep -v grep | wc -l) if [ "$icount" -lt "$server_process_count" ]; then #如果进程挂掉就重启它 logger -t "$NAME" "ssr server error.restart!" kill -9 $(busybox ps -w | grep ssr-server | grep -v grep | awk '{print $1}') >/dev/null 2>&1 /etc/init.d/shadowsocksr restart fi fi #kcptun if [ "$kcp_process" -gt 0 ]; then icount=$(busybox ps -w | grep kcptun-client | grep -v grep | wc -l) if [ "$icount" -lt "$kcp_process" ]; then #如果进程挂掉就重启它 logger -t "$NAME" "ssr kcptun error.restart!" killall -q -9 kcptun-client (/usr/bin/kcptun-client -r $server:$kcp_port -l :$server_port $password $kcp_param &) fi fi #localsocks if [ "$local_process" -gt 0 ]; then icount=$(busybox ps -w | grep ssr-local | grep -v grep | wc -l) if [ "$icount" -lt "$local_process" ]; then #如果进程挂掉就重启它 logger -t "$NAME" "global socks server error.restart!" kill -9 $(busybox ps -w | grep ssr-local | grep -v grep | awk '{print $1}') >/dev/null 2>&1 /etc/init.d/shadowsocksr restart fi fi #pdnsd if [ "$pdnsd_process" -eq 1 ]; then icount=$(busybox ps -w | grep pdnsd | grep -v grep | wc -l) if [ "$icount" -lt "$pdnsd_process" ]; then #如果进程挂掉就重启它 logger -t "$NAME" "pdnsd tunnel error.restart!" if [ -f /var/run/pdnsd.pid ]; then kill $(cat /var/run/pdnsd.pid) >/dev/null 2>&1 else kill -9 $(ps | grep pdnsd | grep -v grep | awk '{print $1}') >/dev/null 2>&1 fi (/usr/sbin/pdnsd -c /var/etc/pdnsd.conf -d &) fi fi #dns2socks if [ "$pdnsd_process" -eq 2 ]; then icount=$(busybox ps -w | grep -e ssr-dns -e dns2socks | grep -v grep | wc -l) if [ "$icount" -lt 2 ]; then #如果进程挂掉就重启它 logger -t "$NAME" "dns2socks $dnsstr tunnel error.restart!" dnsstr=$(uci_get_by_type global tunnel_forward 8.8.4.4:53) dnsserver=$(echo "$dnsstr" | awk -F ':' '{print $1}') dnsport=$(echo "$dnsstr" | awk -F ':' '{print $2}') killall -q -9 dns2socks kill -9 $(busybox ps -w | grep ssr-dns | grep -v grep | awk '{print $1}') >/dev/null 2>&1 microsocks -i 127.0.0.1 -p 10802 ssr-dns >/dev/null 2>&1 & dns2socks 127.0.0.1:10802 $dnsserver:$dnsport 127.0.0.1:5335 -q >/dev/null 2>&1 & fi fi done