usbmuxd: Update to latest git
[feed/packages.git] / net / aria2 / files / aria2.init
1 #!/bin/sh /etc/rc.common
2 # Copyright (C) 2016-2017 Hsing-wang Liao <kuoruan@gmail.com>
3 # Licensed to the public under the Apache License 2.0.
4
5 START=99
6 USE_PROCD=1
7
8 NAME=aria2
9 PROG=/usr/bin/aria2c
10
11 _info() {
12 logger -p daemon.info -t "$NAME" "$*"
13 }
14
15 _err() {
16 logger -p daemon.err -t "$NAME" "$*"
17 }
18
19 _make_dir() {
20 local d
21 for d in "$@"; do
22 if [ ! -d "$d" ]; then
23 mkdir -p "$d" 2>/dev/null || return 1
24 fi
25 done
26
27 return 0
28 }
29
30 _create_file() {
31 touch "$@" 2>/dev/null
32 }
33
34 _change_owner() {
35 local u="$1"; shift
36
37 local d
38 for d in "$@"; do
39 if [ -f "$d" ]; then
40 chown "$u" "$d" 2>/dev/null || return 1
41 elif [ -d "$d" ]; then
42 chown -R "$u" "$d" 2>/dev/null || return 1
43 fi
44 done
45
46 return 0
47 }
48
49 _change_file_mode() {
50 local mod="$1"; shift
51 chmod "$mod" "$@" 2>/dev/null
52 }
53
54 _reset_dir_mode() {
55 local d
56 for d in "$@"; do
57 if [ -d "$d" ]; then
58 find "$d" -type d -exec chmod 755 {} \; 2>/dev/null
59 find "$d" -type f -exec chmod 644 {} \; 2>/dev/null
60 fi
61 done
62 }
63
64 append_options() {
65 local o; local v
66 for o in "$@"; do
67 v="$(eval echo "\$$o")"
68 [ -n "$v" ] && \
69 echo "${o//_/-}=$v" >>"$config_file_tmp"
70 done
71 }
72
73 append_setting() {
74 local s="$1"
75 [ -n "$s" ] && \
76 echo "$s" >>"$config_file_tmp"
77 }
78
79 append_header() {
80 local h="$1"
81 [ -n "$h" ] && \
82 echo "header=\"${h}\"" >>"$config_file_tmp"
83 }
84
85 aria2_validate() {
86 uci_validate_section "$NAME" aria2 "$1" \
87 'enabled:bool:0' \
88 'enable_logging:bool' \
89 'enable_proxy:bool' \
90 'config_dir:string:/var/etc/aria2' \
91 'user:string' \
92 'all_proxy:string' \
93 'all_proxy_passwd:string' \
94 'all_proxy_user:string' \
95 'auto_save_interval:range(0,600)' \
96 'bt_enable_lpd:or("true","false")' \
97 'bt_detach_seed_only:or("true","false")' \
98 'bt_load_saved_metadata:or("true","false")' \
99 'bt_prioritize_piece:string' \
100 'bt_max_open_files:uinteger' \
101 'bt_max_peers:uinteger' \
102 'bt_remove_unselected_file:or("true","false")' \
103 'bt_request_peer_speed_limit:string' \
104 'bt_save_metadata:or("true","false")' \
105 'bt_seed_unverified:or("true","false")' \
106 'bt_stop_timeout:uinteger' \
107 'bt_tracker:list(string)' \
108 'ca_certificate:file' \
109 'certificate:file' \
110 'check_certificate:or("true","false"):true' \
111 'check_integrity:or("true","false")' \
112 'connect_timeout:uinteger' \
113 'dht_listen_port:string' \
114 'dir:string' \
115 'disable_ipv6:or("true","false")' \
116 'disk_cache:string' \
117 'enable_dht:or("true","false"):true' \
118 'enable_dht6:or("true","false")' \
119 'enable_peer_exchange:or("true","false")' \
120 'event_poll:or("epoll","kqueue","port","poll","select")' \
121 'file_allocation:or("none","prealloc","trunc","falloc")' \
122 'follow_torrent:or("true","false","mem")' \
123 'force_save:or("true","false")' \
124 'http_accept_gzip:or("true","false")' \
125 'http_no_cache:or("true","false")' \
126 'listen_port:string' \
127 'log:string' \
128 'log_level:or("debug","info","notice","warn","error")' \
129 'lowest_speed_limit:string' \
130 'max_concurrent_downloads:uinteger' \
131 'max_connection_per_server:uinteger' \
132 'max_download_limit:string' \
133 'max_overall_download_limit:string' \
134 'max_overall_upload_limit:string' \
135 'max_tries:uinteger' \
136 'max_upload_limit:string' \
137 'min_split_size:string' \
138 'pause:or("true","false")' \
139 'pause_metadata:or("true","false")' \
140 'peer_id_prefix:string' \
141 'private_key:file' \
142 'retry_wait:uinteger' \
143 'rpc_auth_method:or("none","user_pass","token")' \
144 'rpc_certificate:file' \
145 'rpc_listen_port:range(1024,65535)' \
146 'rpc_passwd:string' \
147 'rpc_private_key:file' \
148 'rpc_secret:string' \
149 'rpc_secure:or("true","false")' \
150 'rpc_user:string' \
151 'save_session_interval:uinteger' \
152 'seed_ratio:ufloat' \
153 'seed_time:ufloat' \
154 'split:uinteger' \
155 'timeout:uinteger' \
156 'user_agent:string'
157 }
158
159 aria2_start() {
160 local section="$1"
161 aria2_validate "$section" || { _err "Validation failed."; return 1; }
162
163 [ "$enabled" = "1" ] || { _info "Instance \"${section}\" disabled."; return 1; }
164 [ -n "$dir" ] || { _err "Please set download dir."; return 1; }
165 [ -d "$dir" ] || { _err "Please create download dir first."; return 1; }
166
167 config_file="${config_dir}/${NAME}.conf.${section}"
168 config_file_tmp="${config_dir}/${NAME}.conf.tmp"
169 session_file="${config_dir}/${NAME}.session.${section}"
170
171 _make_dir "$config_dir" || {
172 _err "Can't create config dir: ${config_dir}"
173 return 1
174 }
175
176 _create_file "$session_file" "$config_file" "$config_file_tmp" || {
177 _err "Can't create files: ${session_file}, ${config_file}, ${config_file_tmp}"
178 return 1
179 }
180
181 # create tmp file
182 cat >"$config_file_tmp" <<-EOF
183 # Auto generated file, changes to this file will be lost.
184 EOF
185
186 append_setting "dir=${dir}"
187 append_setting "enable-rpc=true"
188 append_setting "rpc-allow-origin-all=true"
189 append_setting "rpc-listen-all=true"
190 append_setting "quiet=true"
191 append_setting "continue=true"
192 append_setting "input-file=${session_file}"
193 append_setting "save-session=${session_file}"
194
195 if [ -z "$enable_logging" ]; then
196 append_options "log" "log_level"
197 elif [ "$enable_logging" = "1" ]; then
198 log=${log:-"/var/log/aria2.log"}
199
200 local log_dir
201 log_dir="$(dirname "$log")"
202
203 _make_dir "$log_dir" || {
204 _err "Can't create log dir: ${log_dir}"
205 return 1
206 }
207
208 # create or clear log file
209 echo >"$log"
210
211 append_setting "log=${log}"
212 append_options "log_level"
213 fi
214
215 if [ -z "$enable_proxy" ] || [ "$enable_proxy" = "1" ]; then
216 append_options "all_proxy" "all_proxy_user" "all_proxy_passwd"
217 fi
218
219 unset_auth_method() {
220 uci -q batch <<-EOF
221 set ${NAME}.${section}.rpc_auth_method=""
222 commit $NAME
223 EOF
224 }
225
226 if [ -z "$rpc_auth_method" ]; then
227 if [ -n "$rpc_secret" ]; then
228 append_setting "rpc-secret=${rpc_secret}"
229 elif [ -n "$rpc_user" ]; then
230 append_setting "rpc-user=${rpc_user}"
231 append_setting "rpc-passwd=${rpc_passwd}"
232 else
233 _info "It is recommended to set RPC secret."
234 fi
235 elif [ "$rpc_auth_method" = "token" ]; then
236 if [ -n "$rpc_secret" ]; then
237 append_setting "rpc-secret=${rpc_secret}"
238 else
239 unset_auth_method
240 fi
241 elif [ "$rpc_auth_method" = "user_pass" ]; then
242 if [ -n "$rpc_user" ]; then
243 append_setting "rpc-user=${rpc_user}"
244 append_setting "rpc-passwd=${rpc_passwd}"
245 else
246 _info "Please set RPC user."
247 unset_auth_method
248 fi
249 fi
250
251 if [ ."$rpc_secure" = ."true" ] && [ -n "$rpc_certificate" ]; then
252 append_setting "rpc-secure=true"
253 append_options "rpc_certificate" "rpc_private_key"
254 fi
255
256 if [ ."$check_certificate" = ."true" ]; then
257 append_setting "check-certificate=true"
258 append_options "ca_certificate"
259 elif [ ."$check_certificate" = ."false" ]; then
260 append_setting "check-certificate=false"
261 fi
262
263 if [ ."$enable_dht" = ."true" ]; then
264 dht_file="${config_dir}/dht.dat.${section}"
265 _create_file "$dht_file" || {
266 _err "Can't create DHT file: ${dht_file}"
267 return 1
268 }
269
270 append_setting "enable-dht=true"
271 append_setting "dht-file-path=${dht_file}"
272 fi
273
274 if [ ."$enable_dht6" = ."true" ] && [ ."$disable_ipv6" != ."true" ]; then
275 dht6_file="${config_dir}/dht6.dat.${section}"
276 _create_file "$dht6_file" || {
277 _err "Can't create DHT6 file: ${dht6_file}"
278 return 1
279 }
280
281 append_setting "enable-dht6=true"
282 append_setting "dht-file-path6=${dht6_file}"
283 fi
284
285 if [ -n "$bt_tracker" ]; then
286 local bt_tracker_list; local t
287 for t in $bt_tracker; do
288 if [ -z "$bt_tracker_list" ]; then
289 bt_tracker_list="$t"
290 else
291 bt_tracker_list="${bt_tracker_list},${t}"
292 fi
293 done
294
295 append_setting "bt-tracker=${bt_tracker_list}"
296 fi
297
298 append_options "auto_save_interval" "bt_enable_lpd" "bt_max_open_files" "bt_max_peers" \
299 "bt_remove_unselected_file" "bt_request_peer_speed_limit" "bt_prioritize_piece" \
300 "bt_stop_timeout" "bt_detach_seed_only" "bt_save_metadata" "bt_load_saved_metadata" \
301 "bt_seed_unverified" "certificate" "check_integrity" "connect_timeout" "dht_listen_port" \
302 "disable_ipv6" "disk_cache" "enable_peer_exchange" "event_poll" "file_allocation" \
303 "follow_torrent" "force_save" "http_accept_gzip" "http_no_cache" "listen_port" \
304 "lowest_speed_limit" "max_concurrent_downloads" "max_connection_per_server" \
305 "max_download_limit" "max_overall_download_limit" "max_overall_upload_limit" "max_tries" \
306 "max_upload_limit" "min_split_size" "pause" "pause_metadata" "peer_id_prefix" "private_key" \
307 "retry_wait" "rpc_listen_port" "save_session_interval" "seed_ratio" "seed_time" "split" "timeout" \
308 "user_agent"
309
310 config_list_foreach "$section" "header" append_header
311 config_list_foreach "$section" "extra_settings" append_setting
312
313 sed '/^$/d' "$config_file_tmp" >"$config_file"
314 rm -f "$config_file_tmp"
315
316 _reset_dir_mode "$config_dir"
317 _change_file_mode 600 "$config_file"
318
319 if [ -n "$user" ]; then
320 if ( user_exists "$user" && _change_owner "$user" "$config_dir" "$log" ); then
321 _info "Aria2 will run with user '${user}'."
322 if [ "$user" != "root" ]; then
323 _info "Please make sure user '${user}' has write access to download dir: ${dir}"
324 fi
325 else
326 _info "Setting run user to '${user}' failed, default user will be used."
327 user=
328 fi
329 fi
330
331 procd_open_instance "${NAME}.${section}"
332 procd_set_param command "$PROG"
333 procd_append_param command --conf-path="${config_file}"
334
335 procd_set_param respawn
336 procd_set_param stdout 1
337 procd_set_param stderr 1
338
339 procd_set_param file "$config_file"
340 [ -n "$user" ] && \
341 procd_set_param user "$user"
342
343 procd_add_jail "${NAME}.${section}" log
344 procd_add_jail_mount "$config_file"
345 procd_add_jail_mount_rw "$dir" "$config_dir" "$log"
346 procd_close_instance
347 }
348
349 service_triggers() {
350 procd_add_reload_trigger "$NAME"
351 }
352
353 start_service() {
354 config_load "$NAME"
355 config_foreach aria2_start "aria2"
356 }