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.
12 logger
-p daemon.info
-t "$NAME" "$*"
16 logger
-p daemon.err
-t "$NAME" "$*"
22 if [ ! -d "$d" ]; then
23 mkdir
-p "$d" 2>/dev
/null ||
return 1
31 touch "$@" 2>/dev
/null
40 chown
"$u" "$d" 2>/dev
/null ||
return 1
41 elif [ -d "$d" ]; then
42 chown
-R "$u" "$d" 2>/dev
/null ||
return 1
51 chmod "$mod" "$@" 2>/dev
/null
58 find "$d" -type d
-exec chmod 755 {} \
; 2>/dev
/null
59 find "$d" -type f
-exec chmod 644 {} \
; 2>/dev
/null
67 v
="$(eval echo "\$
$o")"
69 echo "${o//_/-}=$v" >>"$config_file_tmp"
76 echo "$s" >>"$config_file_tmp"
82 echo "header=\"${h}\"" >>"$config_file_tmp"
86 uci_validate_section
"$NAME" aria2
"$1" \
88 'enable_logging:bool' \
90 'config_dir:string:/var/etc/aria2' \
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' \
110 'check_certificate:or("true","false"):true' \
111 'check_integrity:or("true","false")' \
112 'connect_timeout:uinteger' \
113 'dht_listen_port: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' \
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' \
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")' \
151 'save_session_interval:uinteger' \
152 'seed_ratio:ufloat' \
161 aria2_validate
"$section" ||
{ _err
"Validation failed."; return 1; }
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; }
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}"
171 _make_dir
"$config_dir" ||
{
172 _err
"Can't create config dir: ${config_dir}"
176 _create_file
"$session_file" "$config_file" "$config_file_tmp" ||
{
177 _err
"Can't create files: ${session_file}, ${config_file}, ${config_file_tmp}"
182 cat >"$config_file_tmp" <<-EOF
183 # Auto generated file, changes to this file will be lost.
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}"
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"}
201 log_dir
="$(dirname "$log")"
203 _make_dir
"$log_dir" ||
{
204 _err
"Can't create log dir: ${log_dir}"
208 # create or clear log file
211 append_setting
"log=${log}"
212 append_options
"log_level"
215 if [ -z "$enable_proxy" ] ||
[ "$enable_proxy" = "1" ]; then
216 append_options
"all_proxy" "all_proxy_user" "all_proxy_passwd"
219 unset_auth_method
() {
221 set ${NAME}.${section}.rpc_auth_method=""
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}"
233 _info
"It is recommended to set RPC secret."
235 elif [ "$rpc_auth_method" = "token" ]; then
236 if [ -n "$rpc_secret" ]; then
237 append_setting
"rpc-secret=${rpc_secret}"
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}"
246 _info
"Please set RPC user."
251 if [ .
"$rpc_secure" = .
"true" ] && [ -n "$rpc_certificate" ]; then
252 append_setting
"rpc-secure=true"
253 append_options
"rpc_certificate" "rpc_private_key"
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"
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}"
270 append_setting
"enable-dht=true"
271 append_setting
"dht-file-path=${dht_file}"
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}"
281 append_setting
"enable-dht6=true"
282 append_setting
"dht-file-path6=${dht6_file}"
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
291 bt_tracker_list
="${bt_tracker_list},${t}"
295 append_setting
"bt-tracker=${bt_tracker_list}"
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" \
310 config_list_foreach
"$section" "header" append_header
311 config_list_foreach
"$section" "extra_settings" append_setting
313 sed '/^$/d' "$config_file_tmp" >"$config_file"
314 rm -f "$config_file_tmp"
316 _reset_dir_mode
"$config_dir"
317 _change_file_mode
600 "$config_file"
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}"
326 _info
"Setting run user to '${user}' failed, default user will be used."
331 procd_open_instance
"${NAME}.${section}"
332 procd_set_param
command "$PROG"
333 procd_append_param
command --conf-path="${config_file}"
335 procd_set_param respawn
336 procd_set_param stdout
1
337 procd_set_param stderr
1
339 procd_set_param
file "$config_file"
341 procd_set_param user
"$user"
343 procd_add_jail
"${NAME}.${section}" log
344 procd_add_jail_mount
"$config_file"
345 procd_add_jail_mount_rw
"$dir" "$config_dir" "$log"
350 procd_add_reload_trigger
"$NAME"
355 config_foreach aria2_start
"aria2"