Merge pull request #1340 from teslamint/patch-1
[feed/packages.git] / net / shadowsocks-libev / files / shadowsocks-libev.init
1 #!/bin/sh /etc/rc.common
2
3 START=90
4 STOP=15
5
6 SERVICE_USE_PID=1
7 SERVICE_WRITE_PID=1
8 SERVICE_DAEMONIZE=1
9 EXTRA_COMMANDS="rules"
10 CONFIG_FILE=/var/etc/shadowsocks-libev.json
11
12 get_config() {
13 config_get_bool enable $1 enable
14 config_get server $1 server
15 config_get server_port $1 server_port
16 config_get local_port $1 local_port
17 config_get timeout $1 timeout
18 config_get password $1 password
19 config_get encrypt_method $1 encrypt_method
20 config_get ignore_list $1 ignore_list
21 config_get udp_mode $1 udp_mode
22 config_get udp_server $1 udp_server
23 config_get udp_server_port $1 udp_server_port
24 config_get udp_local_port $1 udp_local_port
25 config_get udp_timeout $1 udp_timeout
26 config_get udp_password $1 udp_password
27 config_get udp_encrypt_method $1 udp_encrypt_method
28 config_get_bool tunnel_enable $1 tunnel_enable
29 config_get tunnel_port $1 tunnel_port
30 config_get tunnel_forward $1 tunnel_forward
31 config_get lan_ac_mode $1 lan_ac_mode
32 config_get lan_ac_ip $1 lan_ac_ip
33 config_get wan_bp_ip $1 wan_bp_ip
34 config_get wan_fw_ip $1 wan_fw_ip
35 config_get ipt_ext $1 ipt_ext
36 : ${timeout:=60}
37 : ${udp_timeout:=60}
38 : ${tunnel_port:=5300}
39 : ${tunnel_forward:=8.8.4.4:53}
40 }
41
42 start_rules() {
43 local ac_args
44
45 if [ -n "$lan_ac_ip" ]; then
46 case $lan_ac_mode in
47 1) ac_args="w$lan_ac_ip"
48 ;;
49 2) ac_args="b$lan_ac_ip"
50 ;;
51 esac
52 fi
53 /usr/bin/ss-rules \
54 -s "$server" \
55 -l "$local_port" \
56 -S "$udp_server" \
57 -L "$udp_local_port" \
58 -i "$ignore_list" \
59 -a "$ac_args" \
60 -b "$wan_bp_ip" \
61 -w "$wan_fw_ip" \
62 -e "$ipt_ext" \
63 -o $udp
64 return $?
65 }
66
67 start_redir() {
68 cat <<-EOF >$CONFIG_FILE
69 {
70 "server": "$server",
71 "server_port": $server_port,
72 "local_address": "0.0.0.0",
73 "local_port": $local_port,
74 "password": "$password",
75 "timeout": $timeout,
76 "method": "$encrypt_method"
77 }
78 EOF
79 if [ "$udp_mode" = 2 ]; then
80 /usr/bin/ss-redir \
81 -c $CONFIG_FILE \
82 -f /var/run/ss-redir_t.pid
83 cat <<-EOF >$CONFIG_FILE
84 {
85 "server": "$udp_server",
86 "server_port": $udp_server_port,
87 "local_address": "0.0.0.0",
88 "local_port": $udp_local_port,
89 "password": "$udp_password",
90 "timeout": $udp_timeout,
91 "method": "$udp_encrypt_method"
92 }
93 EOF
94 fi
95 /usr/bin/ss-redir \
96 -c $CONFIG_FILE \
97 -f /var/run/ss-redir.pid \
98 $udp
99 return $?
100 }
101
102 start_tunnel() {
103 : ${udp:="-u"}
104 /usr/bin/ss-tunnel \
105 -c $CONFIG_FILE \
106 -l $tunnel_port \
107 -L $tunnel_forward \
108 -f /var/run/ss-tunnel.pid \
109 $udp
110 return $?
111 }
112
113 rules() {
114 config_load shadowsocks-libev
115 config_foreach get_config shadowsocks-libev
116 [ "$enable" = 1 ] || exit 0
117 mkdir -p /var/run /var/etc
118
119 : ${server:?}
120 : ${server_port:?}
121 : ${local_port:?}
122 : ${password:?}
123 : ${encrypt_method:?}
124 case $udp_mode in
125 1) udp="-u"
126 ;;
127 2)
128 udp="-U"
129 : ${udp_server:?}
130 : ${udp_server_port:?}
131 : ${udp_local_port:?}
132 : ${udp_password:?}
133 : ${udp_encrypt_method:?}
134 ;;
135 esac
136
137 start_rules
138 }
139
140 boot() {
141 until iptables-save -t nat | grep -q "^:zone_lan_prerouting"; do
142 sleep 1
143 done
144 start
145 }
146
147 start() {
148 rules && start_redir
149 [ "$tunnel_enable" = 1 ] && start_tunnel
150 }
151
152 stop() {
153 /usr/bin/ss-rules -f
154 killall -q -9 ss-redir
155 killall -q -9 ss-tunnel
156 }