mirror of
https://github.com/sirpdboy/sirpdboy-package.git
synced 2025-01-05 10:27:11 +08:00
restore aria2 1.36.0
This commit is contained in:
parent
44ff65fef9
commit
f5079c7cd7
83
aria2/Config.in
Normal file
83
aria2/Config.in
Normal file
@ -0,0 +1,83 @@
|
||||
menu "Aria2 Configuration"
|
||||
depends on PACKAGE_aria2
|
||||
|
||||
choice
|
||||
prompt "SSL Library"
|
||||
default ARIA2_OPENSSL
|
||||
|
||||
config ARIA2_OPENSSL
|
||||
bool "OpenSSL"
|
||||
|
||||
config ARIA2_GNUTLS
|
||||
bool "GnuTLS"
|
||||
|
||||
config ARIA2_NOSSL
|
||||
bool "No SSL Support"
|
||||
|
||||
endchoice
|
||||
|
||||
choice
|
||||
prompt "Crypto Library"
|
||||
depends on !ARIA2_OPENSSL
|
||||
default ARIA2_NOCRYPTO
|
||||
|
||||
config ARIA2_NETTLE
|
||||
bool "Nettle"
|
||||
|
||||
config ARIA2_LIBGCRYPT
|
||||
bool "Libgcrypt"
|
||||
|
||||
config ARIA2_NOCRYPTO
|
||||
bool "No Crypto Library"
|
||||
|
||||
endchoice
|
||||
|
||||
choice
|
||||
prompt "XML Library"
|
||||
default ARIA2_NOXML
|
||||
|
||||
config ARIA2_LIBXML2
|
||||
bool "Libxml2"
|
||||
|
||||
config ARIA2_EXPAT
|
||||
bool "Expat"
|
||||
|
||||
config ARIA2_NOXML
|
||||
bool "No XML Library"
|
||||
|
||||
endchoice
|
||||
|
||||
config ARIA2_GMP
|
||||
bool "GNU Multiple Precision Arithmetic Library"
|
||||
depends on ARIA2_NETTLE
|
||||
default n
|
||||
|
||||
config ARIA2_BITTORRENT
|
||||
bool "Enable Bittorrent Support"
|
||||
depends on ARIA2_OPENSSL || ARIA2_LIBGCRYPT || \
|
||||
(ARIA2_NETTLE && ARIA2_GMP)
|
||||
default y
|
||||
|
||||
config ARIA2_METALINK
|
||||
bool "Enable Metalink Support"
|
||||
depends on !ARIA2_NOXML
|
||||
default y
|
||||
|
||||
config ARIA2_SFTP
|
||||
bool "Enable SFTP Support"
|
||||
default y
|
||||
|
||||
config ARIA2_ASYNC_DNS
|
||||
bool "Enable Async DNS Support"
|
||||
default y
|
||||
|
||||
config ARIA2_COOKIE
|
||||
bool "Enable Firefox3/Chromium Cookie Support"
|
||||
default y
|
||||
|
||||
config ARIA2_WEBSOCKET
|
||||
bool "Enable JSON-RPC over WebSocket Support"
|
||||
depends on ARIA2_OPENSSL || ARIA2_LIBGCRYPT || ARIA2_NETTLE
|
||||
default y
|
||||
|
||||
endmenu
|
122
aria2/Makefile
Normal file
122
aria2/Makefile
Normal file
@ -0,0 +1,122 @@
|
||||
#
|
||||
# Copyright (C) 2012-2018 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=aria2
|
||||
PKG_VERSION:=1.36.0
|
||||
PKG_RELEASE:=21
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
|
||||
PKG_SOURCE_URL:=https://github.com/aria2/aria2/releases/download/release-$(PKG_VERSION)/
|
||||
PKG_HASH:=skip
|
||||
PKG_INSTALL:=1
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
PKG_MAINTAINER:=Imre Kaloz <kaloz@openwrt.org>, \
|
||||
Hsing-Wang Liao <kuoruan@gmail.com>
|
||||
PKG_LICENSE:=GPLv2
|
||||
PKG_LICENSE_FILES:=COPYING
|
||||
PKG_CPE_ID:=cpe:/a:tatsuhiro_tsujikawa:aria2
|
||||
|
||||
PKG_CONFIG_DEPENDS := \
|
||||
CONFIG_ARIA2_NOSSL \
|
||||
CONFIG_ARIA2_OPENSSL \
|
||||
CONFIG_ARIA2_GNUTLS \
|
||||
CONFIG_ARIA2_NOCRYPTO \
|
||||
CONFIG_ARIA2_NETTLE \
|
||||
CONFIG_ARIA2_LIBGCRYPT \
|
||||
CONFIG_ARIA2_LIBXML2 \
|
||||
CONFIG_ARIA2_EXPAT \
|
||||
CONFIG_ARIA2_GMP \
|
||||
CONFIG_ARIA2_BITTORRENT \
|
||||
CONFIG_ARIA2_METALINK \
|
||||
CONFIG_ARIA2_SFTP \
|
||||
CONFIG_ARIA2_ASYNC_DNS \
|
||||
CONFIG_ARIA2_COOKIE \
|
||||
CONFIG_ARIA2_WEBSOCKET
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
include $(INCLUDE_DIR)/nls.mk
|
||||
|
||||
define Package/aria2/config
|
||||
source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
|
||||
define Package/aria2
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
SUBMENU:=File Transfer
|
||||
TITLE:=lightweight download utility
|
||||
URL:=https://aria2.github.io/
|
||||
DEPENDS:=+zlib +libstdcpp +ARIA2_OPENSSL:libopenssl +ARIA2_GNUTLS:libgnutls \
|
||||
+ARIA2_NETTLE:libnettle +ARIA2_LIBGCRYPT:libgcrypt +ARIA2_GMP:libgmp \
|
||||
+ARIA2_LIBXML2:libxml2 +ARIA2_EXPAT:libexpat +ARIA2_SFTP:libssh2 \
|
||||
+ARIA2_ASYNC_DNS:libcares +ARIA2_COOKIE:libsqlite3
|
||||
USERID:=aria2=6800:aria2=6800
|
||||
endef
|
||||
|
||||
define Package/aria2/description
|
||||
aria2 is a lightweight multi-protocol & multi-source command-line download
|
||||
utility
|
||||
endef
|
||||
|
||||
CONFIGURE_ARGS += \
|
||||
--disable-nls \
|
||||
$(if $(CONFIG_ARIA2_NOSSL),--disable,--enable)-ssl \
|
||||
$(if $(CONFIG_ARIA2_BITTORRENT),--enable,--disable)-bittorrent \
|
||||
$(if $(CONFIG_ARIA2_METALINK),--enable,--disable)-metalink \
|
||||
$(if $(CONFIG_ARIA2_WEBSOCKET),--enable,--disable)-websocket \
|
||||
$(if $(CONFIG_ARIA2_OPENSSL),--with,--without)-openssl \
|
||||
$(if $(CONFIG_ARIA2_GNUTLS),--with,--without)-gnutls \
|
||||
$(if $(CONFIG_ARIA2_NETTLE),--with,--without)-libnettle \
|
||||
$(if $(CONFIG_ARIA2_LIBGCRYPT),--with,--without)-libgcrypt \
|
||||
$(if $(CONFIG_ARIA2_GMP),--with,--without)-libgmp \
|
||||
$(if $(CONFIG_ARIA2_LIBXML2),--with,--without)-libxml2 \
|
||||
$(if $(CONFIG_ARIA2_EXPAT),--with,--without)-libexpat \
|
||||
$(if $(CONFIG_ARIA2_SFTP),--with,--without)-libssh2 \
|
||||
$(if $(CONFIG_ARIA2_ASYNC_DNS),--with,--without)-libcares \
|
||||
$(if $(CONFIG_ARIA2_COOKIE),--with,--without)-sqlite3 \
|
||||
--without-libuv \
|
||||
--with-libz
|
||||
|
||||
TARGET_CXXFLAGS += -ffunction-sections -fdata-sections -flto
|
||||
TARGET_LDFLAGS += -Wl,--gc-sections -flto
|
||||
|
||||
define Package/aria2/conffiles
|
||||
/etc/config/aria2
|
||||
endef
|
||||
|
||||
define Download/aria2.conf
|
||||
URL:=https://github.com/P3TERX/aria2.conf/archive
|
||||
URL_FILE:=master.zip
|
||||
FILE:=aria2.conf
|
||||
HASH:=skip
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
$(call Build/Prepare/Default)
|
||||
unzip $(DL_DIR)/aria2.conf -d $(PKG_BUILD_DIR)/
|
||||
sed -i '/rpc-secret/d' $(PKG_BUILD_DIR)/aria2.conf-master/*
|
||||
endef
|
||||
|
||||
|
||||
define Package/aria2/install
|
||||
$(INSTALL_DIR) $(1)/usr/bin
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/aria2c $(1)/usr/bin
|
||||
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_BIN) ./files/aria2.init $(1)/etc/init.d/aria2
|
||||
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_CONF) ./files/aria2.conf $(1)/etc/config/aria2
|
||||
|
||||
$(INSTALL_DIR) $(1)/usr/share/aria2
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/aria2.conf-master/* $(1)/usr/share/aria2/
|
||||
endef
|
||||
|
||||
$(eval $(call Download,aria2.conf))
|
||||
$(eval $(call BuildPackage,aria2))
|
23
aria2/files/aria2.conf
Normal file
23
aria2/files/aria2.conf
Normal file
@ -0,0 +1,23 @@
|
||||
|
||||
# You can use most aria2 command-line options, replace '-' with '_'.
|
||||
# eg. 'rpc-secret' ==> 'rpc_secret'
|
||||
#
|
||||
# We do not support all options at this time. But you can add any option
|
||||
# with 'list extra_settings'.
|
||||
#
|
||||
# You can also add new config sections to define multi instance.
|
||||
#
|
||||
config aria2 'main'
|
||||
option enabled '0'
|
||||
option user 'aria2'
|
||||
option dir '/mnt/sda1/aria2'
|
||||
option config_dir '/var/etc/aria2'
|
||||
option bt_enable_lpd 'true'
|
||||
option enable_dht 'true'
|
||||
option follow_torrent 'true'
|
||||
option file_allocation 'none'
|
||||
option save_session_interval '30'
|
||||
option split '128'
|
||||
option min_split_size '100K'
|
||||
option max_connection_per_server '128'
|
||||
list extra_settings 'dht-file-path=/usr/share/aria2/dht.dat'
|
363
aria2/files/aria2.init
Normal file
363
aria2/files/aria2.init
Normal file
@ -0,0 +1,363 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
# Copyright (C) 2016-2017 Hsing-wang Liao <kuoruan@gmail.com>
|
||||
# Licensed to the public under the Apache License 2.0.
|
||||
|
||||
START=99
|
||||
USE_PROCD=1
|
||||
|
||||
NAME=aria2
|
||||
PROG=/usr/bin/aria2c
|
||||
|
||||
_info() {
|
||||
logger -p daemon.info -t "$NAME" "$*"
|
||||
}
|
||||
|
||||
_err() {
|
||||
logger -p daemon.err -t "$NAME" "$*"
|
||||
}
|
||||
|
||||
_make_dir() {
|
||||
local d
|
||||
for d in "$@"; do
|
||||
if [ ! -d "$d" ]; then
|
||||
mkdir -p "$d" 2>/dev/null || return 1
|
||||
fi
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
_create_file() {
|
||||
touch "$@" 2>/dev/null
|
||||
}
|
||||
|
||||
_change_owner() {
|
||||
local u="$1"; shift
|
||||
|
||||
local d
|
||||
for d in "$@"; do
|
||||
if [ -f "$d" ]; then
|
||||
chown "$u" "$d" 2>/dev/null || return 1
|
||||
elif [ -d "$d" ]; then
|
||||
chown -R "$u" "$d" 2>/dev/null || return 1
|
||||
fi
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
_change_file_mode() {
|
||||
local mod="$1"; shift
|
||||
chmod "$mod" "$@" 2>/dev/null
|
||||
}
|
||||
|
||||
_reset_dir_mode() {
|
||||
local d
|
||||
for d in "$@"; do
|
||||
if [ -d "$d" ]; then
|
||||
find "$d" -type d -exec chmod 755 {} \; 2>/dev/null
|
||||
find "$d" -type f -exec chmod 644 {} \; 2>/dev/null
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
append_options() {
|
||||
local o; local v
|
||||
for o in "$@"; do
|
||||
v="$(eval echo "\$$o")"
|
||||
[ -n "$v" ] && \
|
||||
echo "${o//_/-}=$v" >>"$config_file_tmp"
|
||||
done
|
||||
}
|
||||
|
||||
append_setting() {
|
||||
local s="$1"
|
||||
[ -n "$s" ] && \
|
||||
echo "$s" >>"$config_file_tmp"
|
||||
}
|
||||
|
||||
append_header() {
|
||||
local h="$1"
|
||||
[ -n "$h" ] && \
|
||||
echo "header=\"$h\"" >>"$config_file_tmp"
|
||||
}
|
||||
|
||||
aria2_validate() {
|
||||
uci_load_validate "$NAME" aria2 "$1" "$2" \
|
||||
'enabled:bool:0' \
|
||||
'enable_logging:bool' \
|
||||
'enable_proxy:bool' \
|
||||
'config_dir:string:/var/etc/aria2' \
|
||||
'user:string' \
|
||||
'all_proxy:string' \
|
||||
'all_proxy_passwd:string' \
|
||||
'all_proxy_user:string' \
|
||||
'auto_save_interval:range(0,600)' \
|
||||
'bt_enable_lpd:or("true","false")' \
|
||||
'bt_detach_seed_only:or("true","false")' \
|
||||
'bt_load_saved_metadata:or("true","false")' \
|
||||
'bt_prioritize_piece:string' \
|
||||
'bt_max_open_files:uinteger' \
|
||||
'bt_max_peers:uinteger' \
|
||||
'bt_remove_unselected_file:or("true","false")' \
|
||||
'bt_request_peer_speed_limit:string' \
|
||||
'bt_save_metadata:or("true","false")' \
|
||||
'bt_seed_unverified:or("true","false")' \
|
||||
'bt_stop_timeout:uinteger' \
|
||||
'bt_tracker:list(string)' \
|
||||
'ca_certificate:file' \
|
||||
'certificate:file' \
|
||||
'check_certificate:or("true","false"):true' \
|
||||
'check_integrity:or("true","false")' \
|
||||
'connect_timeout:uinteger' \
|
||||
'dht_listen_port:string' \
|
||||
'dir:string' \
|
||||
'disable_ipv6:or("true","false")' \
|
||||
'disk_cache:string' \
|
||||
'enable_dht:or("true","false"):true' \
|
||||
'enable_dht6:or("true","false")' \
|
||||
'enable_peer_exchange:or("true","false")' \
|
||||
'event_poll:or("epoll","kqueue","port","poll","select")' \
|
||||
'file_allocation:or("none","prealloc","trunc","falloc")' \
|
||||
'follow_torrent:or("true","false","mem")' \
|
||||
'force_save:or("true","false")' \
|
||||
'http_accept_gzip:or("true","false")' \
|
||||
'http_no_cache:or("true","false")' \
|
||||
'listen_port:string' \
|
||||
'log:string' \
|
||||
'log_level:or("debug","info","notice","warn","error")' \
|
||||
'lowest_speed_limit:string' \
|
||||
'max_concurrent_downloads:uinteger' \
|
||||
'max_connection_per_server:uinteger' \
|
||||
'max_download_limit:string' \
|
||||
'max_overall_download_limit:string' \
|
||||
'max_overall_upload_limit:string' \
|
||||
'max_tries:uinteger' \
|
||||
'max_upload_limit:string' \
|
||||
'min_split_size:string' \
|
||||
'pause:or("true","false")' \
|
||||
'pause_metadata:or("true","false")' \
|
||||
'peer_id_prefix:string' \
|
||||
'private_key:file' \
|
||||
'retry_wait:uinteger' \
|
||||
'rpc_auth_method:or("none","user_pass","token")' \
|
||||
'rpc_certificate:file' \
|
||||
'rpc_listen_port:range(1024,65535)' \
|
||||
'rpc_passwd:string' \
|
||||
'rpc_private_key:file' \
|
||||
'rpc_secret:string' \
|
||||
'rpc_secure:or("true","false")' \
|
||||
'rpc_user:string' \
|
||||
'save_session_interval:uinteger' \
|
||||
'seed_ratio:ufloat' \
|
||||
'seed_time:ufloat' \
|
||||
'split:uinteger' \
|
||||
'timeout:uinteger' \
|
||||
'user_agent:string'
|
||||
}
|
||||
|
||||
aria2_start() {
|
||||
local section="$1"
|
||||
[ "$2" = "0" ] || { _err "Validation failed."; return 1; }
|
||||
|
||||
[ "$enabled" = "1" ] || { _info "Instance \"$section\" disabled."; return 1; }
|
||||
[ -n "$dir" ] || { _err "Please set download dir."; return 1; }
|
||||
[ -d "$dir" ] || _make_dir "$dir" || {
|
||||
_err "Can't create download dir: $dir"
|
||||
return 1
|
||||
}
|
||||
|
||||
config_file="$config_dir/$NAME.conf.$section"
|
||||
config_file_tmp="$config_dir/$NAME.conf.tmp"
|
||||
session_file="$config_dir/$NAME.session.$section"
|
||||
|
||||
_make_dir "$config_dir" || {
|
||||
_err "Can't create config dir: $config_dir"
|
||||
return 1
|
||||
}
|
||||
|
||||
_create_file "$session_file" "$config_file" "$config_file_tmp" || {
|
||||
_err "Can't create files: $session_file, $config_file, $config_file_tmp"
|
||||
return 1
|
||||
}
|
||||
|
||||
# create tmp file
|
||||
cat >"$config_file_tmp" <<-EOF
|
||||
# Auto generated file, changes to this file will be lost.
|
||||
EOF
|
||||
|
||||
append_setting "dir=$dir"
|
||||
append_setting "enable-rpc=true"
|
||||
append_setting "rpc-allow-origin-all=true"
|
||||
append_setting "rpc-listen-all=true"
|
||||
append_setting "quiet=true"
|
||||
append_setting "continue=true"
|
||||
append_setting "input-file=$session_file"
|
||||
append_setting "save-session=$session_file"
|
||||
|
||||
if [ -z "$enable_logging" ]; then
|
||||
append_options "log" "log_level"
|
||||
elif [ "$enable_logging" = "1" ]; then
|
||||
log=${log:-"/var/log/aria2.log"}
|
||||
|
||||
local log_dir
|
||||
log_dir="$(dirname "$log")"
|
||||
|
||||
_make_dir "$log_dir" || {
|
||||
_err "Can't create log dir: $log_dir"
|
||||
return 1
|
||||
}
|
||||
|
||||
# create or clear log file
|
||||
echo >"$log"
|
||||
|
||||
append_setting "log=$log"
|
||||
append_options "log_level"
|
||||
fi
|
||||
|
||||
if [ -z "$enable_proxy" ] || [ "$enable_proxy" = "1" ]; then
|
||||
append_options "all_proxy" "all_proxy_user" "all_proxy_passwd"
|
||||
fi
|
||||
|
||||
unset_auth_method() {
|
||||
uci -q batch <<-EOF
|
||||
set $NAME.$section.rpc_auth_method=""
|
||||
commit $NAME
|
||||
EOF
|
||||
}
|
||||
|
||||
if [ -z "$rpc_auth_method" ]; then
|
||||
if [ -n "$rpc_secret" ]; then
|
||||
append_setting "rpc-secret=$rpc_secret"
|
||||
elif [ -n "$rpc_user" ]; then
|
||||
append_setting "rpc-user=$rpc_user"
|
||||
append_setting "rpc-passwd=$rpc_passwd"
|
||||
else
|
||||
_info "It is recommended to set RPC secret."
|
||||
fi
|
||||
elif [ "$rpc_auth_method" = "token" ]; then
|
||||
if [ -n "$rpc_secret" ]; then
|
||||
append_setting "rpc-secret=$rpc_secret"
|
||||
else
|
||||
unset_auth_method
|
||||
fi
|
||||
elif [ "$rpc_auth_method" = "user_pass" ]; then
|
||||
if [ -n "$rpc_user" ]; then
|
||||
append_setting "rpc-user=$rpc_user"
|
||||
append_setting "rpc-passwd=$rpc_passwd"
|
||||
else
|
||||
_info "Please set RPC user."
|
||||
unset_auth_method
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ."$rpc_secure" = ."true" ] && [ -n "$rpc_certificate" ]; then
|
||||
append_setting "rpc-secure=true"
|
||||
append_options "rpc_certificate" "rpc_private_key"
|
||||
fi
|
||||
|
||||
if [ ."$check_certificate" = ."true" ]; then
|
||||
append_setting "check-certificate=true"
|
||||
append_options "ca_certificate"
|
||||
elif [ ."$check_certificate" = ."false" ]; then
|
||||
append_setting "check-certificate=false"
|
||||
fi
|
||||
|
||||
if [ ."$enable_dht" = ."true" ]; then
|
||||
dht_file="$config_dir/dht.dat.$section"
|
||||
_create_file "$dht_file" || {
|
||||
_err "Can't create DHT file: $dht_file"
|
||||
return 1
|
||||
}
|
||||
|
||||
append_setting "enable-dht=true"
|
||||
append_setting "dht-file-path=$dht_file"
|
||||
fi
|
||||
|
||||
if [ ."$enable_dht6" = ."true" ] && [ ."$disable_ipv6" != ."true" ]; then
|
||||
dht6_file="$config_dir/dht6.dat.$section"
|
||||
_create_file "$dht6_file" || {
|
||||
_err "Can't create DHT6 file: $dht6_file"
|
||||
return 1
|
||||
}
|
||||
|
||||
append_setting "enable-dht6=true"
|
||||
append_setting "dht-file-path6=$dht6_file"
|
||||
fi
|
||||
|
||||
if [ -n "$bt_tracker" ]; then
|
||||
local bt_tracker_list; local t
|
||||
for t in $bt_tracker; do
|
||||
if [ -z "$bt_tracker_list" ]; then
|
||||
bt_tracker_list="$t"
|
||||
else
|
||||
bt_tracker_list="$bt_tracker_list,$t"
|
||||
fi
|
||||
done
|
||||
|
||||
append_setting "bt-tracker=$bt_tracker_list"
|
||||
fi
|
||||
|
||||
append_options "auto_save_interval" "bt_enable_lpd" "bt_max_open_files" "bt_max_peers" \
|
||||
"bt_remove_unselected_file" "bt_request_peer_speed_limit" "bt_prioritize_piece" \
|
||||
"bt_stop_timeout" "bt_detach_seed_only" "bt_save_metadata" "bt_load_saved_metadata" \
|
||||
"bt_seed_unverified" "certificate" "check_integrity" "connect_timeout" "dht_listen_port" \
|
||||
"disable_ipv6" "disk_cache" "enable_peer_exchange" "event_poll" "file_allocation" \
|
||||
"follow_torrent" "force_save" "http_accept_gzip" "http_no_cache" "listen_port" \
|
||||
"lowest_speed_limit" "max_concurrent_downloads" "max_connection_per_server" \
|
||||
"max_download_limit" "max_overall_download_limit" "max_overall_upload_limit" "max_tries" \
|
||||
"max_upload_limit" "min_split_size" "pause" "pause_metadata" "peer_id_prefix" "private_key" \
|
||||
"retry_wait" "rpc_listen_port" "save_session_interval" "seed_ratio" "seed_time" "split" "timeout" \
|
||||
"user_agent"
|
||||
|
||||
config_list_foreach "$section" "header" append_header
|
||||
config_list_foreach "$section" "extra_settings" append_setting
|
||||
|
||||
cd /usr/share/aria2 && sh ./tracker.sh >/dev/null 2>&1 &
|
||||
cat /usr/share/aria2/aria2.conf > "$config_file"
|
||||
echo '' >> "$config_file"
|
||||
sed '/^$/d' "$config_file_tmp" >> "$config_file"
|
||||
rm -f "$config_file_tmp"
|
||||
|
||||
_reset_dir_mode "$config_dir"
|
||||
_change_file_mode 600 "$config_file"
|
||||
|
||||
if [ -n "$user" ]; then
|
||||
if ( user_exists "$user" && _change_owner "$user" "$config_dir" "$log" ); then
|
||||
_info "Aria2 will run with user '$user'."
|
||||
if [ "$user" != "root" ]; then
|
||||
_info "Please make sure user '$user' has write access to download dir: $dir"
|
||||
fi
|
||||
else
|
||||
_info "Setting run user to '$user' failed, default user will be used."
|
||||
user=
|
||||
fi
|
||||
fi
|
||||
|
||||
procd_open_instance "$NAME.$section"
|
||||
procd_set_param command "$PROG"
|
||||
procd_append_param command --conf-path="$config_file"
|
||||
|
||||
procd_set_param respawn
|
||||
procd_set_param stdout 1
|
||||
procd_set_param stderr 1
|
||||
|
||||
procd_set_param file "$config_file"
|
||||
[ -n "$user" ] && \
|
||||
procd_set_param user "$user"
|
||||
|
||||
procd_add_jail "$NAME.$section" log
|
||||
procd_add_jail_mount "$ca_certificate" "$certificate" "$rpc_certificate" "$rpc_private_key"
|
||||
procd_add_jail_mount_rw "$dir" "$config_dir" "$log"
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "$NAME"
|
||||
procd_add_validation aria2_validate
|
||||
}
|
||||
|
||||
start_service() {
|
||||
config_load "$NAME"
|
||||
config_foreach aria2_validate "aria2" aria2_start
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
--- /src/OptionHandlerFactory.cc 2018-05-15 20:33:25.000000000 +0800
|
||||
+++ /src/OptionHandlerFactory.cc 2018-07-05 10:40:25.000000000 +0800
|
||||
@@ -440,7 +440,7 @@
|
||||
{
|
||||
OptionHandler* op(new NumberOptionHandler(PREF_MAX_CONNECTION_PER_SERVER,
|
||||
TEXT_MAX_CONNECTION_PER_SERVER,
|
||||
- "1", 1, 16, 'x'));
|
||||
+ "64", 1, -1, 'x'));
|
||||
op->addTag(TAG_BASIC);
|
||||
op->addTag(TAG_FTP);
|
||||
op->addTag(TAG_HTTP);
|
||||
@@ -501,7 +501,7 @@
|
||||
}
|
||||
{
|
||||
OptionHandler* op(new UnitNumberOptionHandler(
|
||||
- PREF_MIN_SPLIT_SIZE, TEXT_MIN_SPLIT_SIZE, "20M", 1_m, 1_g, 'k'));
|
||||
+ PREF_MIN_SPLIT_SIZE, TEXT_MIN_SPLIT_SIZE, "1M", 1_k, 1_g, 'k'));
|
||||
op->addTag(TAG_BASIC);
|
||||
op->addTag(TAG_FTP);
|
||||
op->addTag(TAG_HTTP);
|
||||
@@ -905,7 +905,7 @@ std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
|
||||
}
|
||||
{
|
||||
OptionHandler* op(new UnitNumberOptionHandler(
|
||||
- PREF_PIECE_LENGTH, TEXT_PIECE_LENGTH, "1M", 1_m, 1_g));
|
||||
+ PREF_PIECE_LENGTH, TEXT_PIECE_LENGTH, "1M", 1_k, 1_g));
|
||||
op->addTag(TAG_ADVANCED);
|
||||
op->addTag(TAG_FTP);
|
||||
op->addTag(TAG_HTTP);
|
@ -0,0 +1,61 @@
|
||||
From 66524bee738e98742c908d93c993d0a78a2d9891 Mon Sep 17 00:00:00 2001
|
||||
From: myfreeer <myfreeer@users.noreply.github.com>
|
||||
Date: Sat, 18 Nov 2017 11:55:04 +0800
|
||||
Subject: [PATCH 3/4] download: retry on slow speed and conection close
|
||||
|
||||
This would provide better speed on bad network conditions
|
||||
---
|
||||
src/DownloadCommand.cc | 2 +-
|
||||
src/SocketBuffer.cc | 3 ++-
|
||||
src/SocketCore.cc | 2 +-
|
||||
3 files changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/DownloadCommand.cc b/src/DownloadCommand.cc
|
||||
index 2db41e4..f49eb80 100644
|
||||
--- a/src/DownloadCommand.cc
|
||||
+++ b/src/DownloadCommand.cc
|
||||
@@ -306,7 +306,7 @@ void DownloadCommand::checkLowestDownloadSpeed() const
|
||||
startupIdleTime_) {
|
||||
int nowSpeed = peerStat_->calculateDownloadSpeed();
|
||||
if (nowSpeed <= lowestDownloadSpeedLimit_) {
|
||||
- throw DL_ABORT_EX2(fmt(EX_TOO_SLOW_DOWNLOAD_SPEED, nowSpeed,
|
||||
+ throw DL_RETRY_EX2(fmt(EX_TOO_SLOW_DOWNLOAD_SPEED, nowSpeed,
|
||||
lowestDownloadSpeedLimit_,
|
||||
getRequest()->getHost().c_str()),
|
||||
error_code::TOO_SLOW_DOWNLOAD_SPEED);
|
||||
diff --git a/src/SocketBuffer.cc b/src/SocketBuffer.cc
|
||||
index 62862ff..1906173 100644
|
||||
--- a/src/SocketBuffer.cc
|
||||
+++ b/src/SocketBuffer.cc
|
||||
@@ -39,6 +39,7 @@
|
||||
|
||||
#include "SocketCore.h"
|
||||
#include "DlAbortEx.h"
|
||||
+#include "DlRetryEx.h"
|
||||
#include "message.h"
|
||||
#include "fmt.h"
|
||||
#include "LogFactory.h"
|
||||
@@ -158,7 +159,7 @@ ssize_t SocketBuffer::send()
|
||||
}
|
||||
ssize_t slen = socket_->writeVector(iov, num);
|
||||
if (slen == 0 && !socket_->wantRead() && !socket_->wantWrite()) {
|
||||
- throw DL_ABORT_EX(fmt(EX_SOCKET_SEND, "Connection closed."));
|
||||
+ throw DL_RETRY_EX(fmt(EX_SOCKET_SEND, "Connection closed."));
|
||||
}
|
||||
// A2_LOG_NOTICE(fmt("num=%zu, amount=%d, bufq.size()=%zu, SEND=%d",
|
||||
// num, amount, bufq_.size(), slen));
|
||||
diff --git a/src/SocketCore.cc b/src/SocketCore.cc
|
||||
index 77dc30c..537375a 100644
|
||||
--- a/src/SocketCore.cc
|
||||
+++ b/src/SocketCore.cc
|
||||
@@ -1009,7 +1009,7 @@ bool SocketCore::tlsHandshake(TLSContext* tlsctx, const std::string& hostname)
|
||||
|
||||
if (rv == TLS_ERR_ERROR) {
|
||||
// Damn those error.
|
||||
- throw DL_ABORT_EX(fmt("SSL/TLS handshake failure: %s",
|
||||
+ throw DL_RETRY_EX(fmt("SSL/TLS handshake failure: %s",
|
||||
handshakeError.empty()
|
||||
? tlsSession_->getLastErrorString().c_str()
|
||||
: handshakeError.c_str()));
|
||||
--
|
||||
2.17.1
|
239
aria2/patches/0003-option-add-option-to-retry-on-http-4xx.patch
Normal file
239
aria2/patches/0003-option-add-option-to-retry-on-http-4xx.patch
Normal file
@ -0,0 +1,239 @@
|
||||
From 8adbc01dc5975a64c55fe594d8c758c71e8183b3 Mon Sep 17 00:00:00 2001
|
||||
From: myfreeer <myfreeer@users.noreply.github.com>
|
||||
Date: Sun, 22 Jul 2018 19:59:02 +0800
|
||||
Subject: [PATCH] option: add option to retry on http 400, 403, 406, or unknown
|
||||
|
||||
--retry-on-400[=true|false] Configure whether retry or not when
|
||||
HTTP server returns 400 Bad Request.
|
||||
Only effective if retry-wait > 0.
|
||||
|
||||
Possible Values: true, false
|
||||
Default: false
|
||||
Tags: #advanced, #http
|
||||
|
||||
--retry-on-403[=true|false] Configure whether retry or not when
|
||||
HTTP server returns 403 Forbidden.
|
||||
Only effective if retry-wait > 0.
|
||||
|
||||
Possible Values: true, false
|
||||
Default: false
|
||||
Tags: #advanced, #http
|
||||
|
||||
--retry-on-406[=true|false] Configure whether retry or not when
|
||||
HTTP server returns 406 Not Acceptable.
|
||||
Only effective if retry-wait > 0.
|
||||
|
||||
Possible Values: true, false
|
||||
Default: false
|
||||
Tags: #advanced, #http
|
||||
|
||||
--retry-on-unknown[=true|false] Configure whether retry or not when
|
||||
HTTP server returns unknown status code.
|
||||
Only effective if retry-wait > 0.
|
||||
|
||||
Possible Values: true, false
|
||||
Default: false
|
||||
Tags: #advanced, #http
|
||||
---
|
||||
src/HttpSkipResponseCommand.cc | 42 +++++++++++++++++++++++++++++-----
|
||||
src/OptionHandlerFactory.cc | 40 ++++++++++++++++++++++++++++++++
|
||||
src/prefs.cc | 8 +++++++
|
||||
src/prefs.h | 8 +++++++
|
||||
src/usage_text.h | 16 +++++++++++++
|
||||
5 files changed, 108 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/HttpSkipResponseCommand.cc b/src/HttpSkipResponseCommand.cc
|
||||
index a722d77..de4ad6c 100644
|
||||
--- a/src/HttpSkipResponseCommand.cc
|
||||
+++ b/src/HttpSkipResponseCommand.cc
|
||||
@@ -204,7 +204,7 @@ bool HttpSkipResponseCommand::processResponse()
|
||||
auto statusCode = httpResponse_->getStatusCode();
|
||||
if (statusCode >= 400) {
|
||||
switch (statusCode) {
|
||||
- case 401:
|
||||
+ case 401: // Unauthorized
|
||||
if (getOption()->getAsBool(PREF_HTTP_AUTH_CHALLENGE) &&
|
||||
!httpResponse_->getHttpRequest()->authenticationUsed() &&
|
||||
getDownloadEngine()->getAuthConfigFactory()->activateBasicCred(
|
||||
@@ -213,15 +213,41 @@ bool HttpSkipResponseCommand::processResponse()
|
||||
return prepareForRetry(0);
|
||||
}
|
||||
throw DL_ABORT_EX2(EX_AUTH_FAILED, error_code::HTTP_AUTH_FAILED);
|
||||
- case 404:
|
||||
+ case 404: // Not Found
|
||||
if (getOption()->getAsInt(PREF_MAX_FILE_NOT_FOUND) == 0) {
|
||||
throw DL_ABORT_EX2(MSG_RESOURCE_NOT_FOUND,
|
||||
error_code::RESOURCE_NOT_FOUND);
|
||||
}
|
||||
throw DL_RETRY_EX2(MSG_RESOURCE_NOT_FOUND,
|
||||
error_code::RESOURCE_NOT_FOUND);
|
||||
- case 502:
|
||||
- case 503:
|
||||
+ case 400: // Bad Request
|
||||
+ if (getOption()->getAsBool(PREF_RETRY_ON_400)
|
||||
+ && getOption()->getAsInt(PREF_RETRY_WAIT) > 0) {
|
||||
+ throw DL_RETRY_EX2(fmt(EX_BAD_STATUS, statusCode),
|
||||
+ error_code::HTTP_PROTOCOL_ERROR);
|
||||
+ }
|
||||
+ break;
|
||||
+ case 403: // Forbidden
|
||||
+ if (getOption()->getAsBool(PREF_RETRY_ON_403)
|
||||
+ && getOption()->getAsInt(PREF_RETRY_WAIT) > 0) {
|
||||
+ throw DL_RETRY_EX2(fmt(EX_BAD_STATUS, statusCode),
|
||||
+ error_code::HTTP_PROTOCOL_ERROR);
|
||||
+ }
|
||||
+ break;
|
||||
+ case 406: // Not Acceptable
|
||||
+ if (getOption()->getAsBool(PREF_RETRY_ON_406)
|
||||
+ && getOption()->getAsInt(PREF_RETRY_WAIT) > 0) {
|
||||
+ throw DL_RETRY_EX2(fmt(EX_BAD_STATUS, statusCode),
|
||||
+ error_code::HTTP_PROTOCOL_ERROR);
|
||||
+ }
|
||||
+ break;
|
||||
+ case 408: // Request Timeout
|
||||
+ case 429: // Too Many Requests
|
||||
+ case 502: // Bad Gateway
|
||||
+ case 503: // Service Unavailable
|
||||
+ case 507: // Insufficient Storage
|
||||
+ case 520: // https://github.com/aria2/aria2/issues/1229
|
||||
+ case 521: // https://github.com/aria2/aria2/issues/1229
|
||||
// Only retry if pretry-wait > 0. Hammering 'busy' server is not
|
||||
// a good idea.
|
||||
if (getOption()->getAsInt(PREF_RETRY_WAIT) > 0) {
|
||||
@@ -230,12 +256,16 @@ bool HttpSkipResponseCommand::processResponse()
|
||||
}
|
||||
throw DL_ABORT_EX2(fmt(EX_BAD_STATUS, statusCode),
|
||||
error_code::HTTP_SERVICE_UNAVAILABLE);
|
||||
- case 504:
|
||||
+ case 504: // Gateway Timeout
|
||||
// This is Gateway Timeout, so try again
|
||||
throw DL_RETRY_EX2(fmt(EX_BAD_STATUS, statusCode),
|
||||
error_code::HTTP_SERVICE_UNAVAILABLE);
|
||||
};
|
||||
-
|
||||
+ if (getOption()->getAsBool(PREF_RETRY_ON_UNKNOWN)
|
||||
+ && getOption()->getAsInt(PREF_RETRY_WAIT) > 0) {
|
||||
+ throw DL_RETRY_EX2(fmt(EX_BAD_STATUS, statusCode),
|
||||
+ error_code::HTTP_PROTOCOL_ERROR);
|
||||
+ }
|
||||
throw DL_ABORT_EX2(fmt(EX_BAD_STATUS, statusCode),
|
||||
error_code::HTTP_PROTOCOL_ERROR);
|
||||
}
|
||||
diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc
|
||||
index 5768f7b..decb03e 100644
|
||||
--- a/src/OptionHandlerFactory.cc
|
||||
+++ b/src/OptionHandlerFactory.cc
|
||||
@@ -934,6 +934,46 @@ std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
|
||||
op->setChangeOptionForReserved(true);
|
||||
handlers.push_back(op);
|
||||
}
|
||||
+ {
|
||||
+ OptionHandler* op(new BooleanOptionHandler(
|
||||
+ PREF_RETRY_ON_400, TEXT_RETRY_ON_400, A2_V_FALSE, OptionHandler::OPT_ARG));
|
||||
+ op->addTag(TAG_ADVANCED);
|
||||
+ op->addTag(TAG_HTTP);
|
||||
+ op->setInitialOption(true);
|
||||
+ op->setChangeGlobalOption(true);
|
||||
+ op->setChangeOptionForReserved(true);
|
||||
+ handlers.push_back(op);
|
||||
+ }
|
||||
+ {
|
||||
+ OptionHandler* op(new BooleanOptionHandler(
|
||||
+ PREF_RETRY_ON_403, TEXT_RETRY_ON_403, A2_V_FALSE, OptionHandler::OPT_ARG));
|
||||
+ op->addTag(TAG_ADVANCED);
|
||||
+ op->addTag(TAG_HTTP);
|
||||
+ op->setInitialOption(true);
|
||||
+ op->setChangeGlobalOption(true);
|
||||
+ op->setChangeOptionForReserved(true);
|
||||
+ handlers.push_back(op);
|
||||
+ }
|
||||
+ {
|
||||
+ OptionHandler* op(new BooleanOptionHandler(
|
||||
+ PREF_RETRY_ON_406, TEXT_RETRY_ON_406, A2_V_FALSE, OptionHandler::OPT_ARG));
|
||||
+ op->addTag(TAG_ADVANCED);
|
||||
+ op->addTag(TAG_HTTP);
|
||||
+ op->setInitialOption(true);
|
||||
+ op->setChangeGlobalOption(true);
|
||||
+ op->setChangeOptionForReserved(true);
|
||||
+ handlers.push_back(op);
|
||||
+ }
|
||||
+ {
|
||||
+ OptionHandler* op(new BooleanOptionHandler(
|
||||
+ PREF_RETRY_ON_UNKNOWN, TEXT_RETRY_ON_UNKNOWN, A2_V_FALSE, OptionHandler::OPT_ARG));
|
||||
+ op->addTag(TAG_ADVANCED);
|
||||
+ op->addTag(TAG_HTTP);
|
||||
+ op->setInitialOption(true);
|
||||
+ op->setChangeGlobalOption(true);
|
||||
+ op->setChangeOptionForReserved(true);
|
||||
+ handlers.push_back(op);
|
||||
+ }
|
||||
{
|
||||
OptionHandler* op(new BooleanOptionHandler(
|
||||
PREF_REUSE_URI, TEXT_REUSE_URI, A2_V_TRUE, OptionHandler::OPT_ARG));
|
||||
diff --git a/src/prefs.cc b/src/prefs.cc
|
||||
index 937e927..33eff91 100644
|
||||
--- a/src/prefs.cc
|
||||
+++ b/src/prefs.cc
|
||||
@@ -327,6 +327,14 @@ PrefPtr PREF_ENABLE_ASYNC_DNS6 = makePref("enable-async-dns6");
|
||||
PrefPtr PREF_MAX_DOWNLOAD_RESULT = makePref("max-download-result");
|
||||
// value: 1*digit
|
||||
PrefPtr PREF_RETRY_WAIT = makePref("retry-wait");
|
||||
+// value: true | false
|
||||
+PrefPtr PREF_RETRY_ON_400 = makePref("retry-on-400");
|
||||
+// value: true | false
|
||||
+PrefPtr PREF_RETRY_ON_403 = makePref("retry-on-403");
|
||||
+// value: true | false
|
||||
+PrefPtr PREF_RETRY_ON_406 = makePref("retry-on-406");
|
||||
+// value: true | false
|
||||
+PrefPtr PREF_RETRY_ON_UNKNOWN = makePref("retry-on-unknown");
|
||||
// value: string
|
||||
PrefPtr PREF_ASYNC_DNS_SERVER = makePref("async-dns-server");
|
||||
// value: true | false
|
||||
diff --git a/src/prefs.h b/src/prefs.h
|
||||
index e1f8397..019e774 100644
|
||||
--- a/src/prefs.h
|
||||
+++ b/src/prefs.h
|
||||
@@ -280,6 +280,14 @@ extern PrefPtr PREF_ENABLE_ASYNC_DNS6;
|
||||
extern PrefPtr PREF_MAX_DOWNLOAD_RESULT;
|
||||
// value: 1*digit
|
||||
extern PrefPtr PREF_RETRY_WAIT;
|
||||
+// value: true | false
|
||||
+extern PrefPtr PREF_RETRY_ON_400;
|
||||
+// value: true | false
|
||||
+extern PrefPtr PREF_RETRY_ON_403;
|
||||
+// value: true | false
|
||||
+extern PrefPtr PREF_RETRY_ON_406;
|
||||
+// value: true | false
|
||||
+extern PrefPtr PREF_RETRY_ON_UNKNOWN;
|
||||
// value: string
|
||||
extern PrefPtr PREF_ASYNC_DNS_SERVER;
|
||||
// value: true | false
|
||||
diff --git a/src/usage_text.h b/src/usage_text.h
|
||||
index d73b50d..75d34a0 100644
|
||||
--- a/src/usage_text.h
|
||||
+++ b/src/usage_text.h
|
||||
@@ -64,6 +64,22 @@
|
||||
_(" --retry-wait=SEC Set the seconds to wait between retries. \n" \
|
||||
" With SEC > 0, aria2 will retry download when the\n" \
|
||||
" HTTP server returns 503 response.")
|
||||
+#define TEXT_RETRY_ON_400 \
|
||||
+ _(" --retry-on-400[=true|false] Configure whether retry or not when\n" \
|
||||
+ " HTTP server returns 400 Bad Request.\n" \
|
||||
+ " Only effective if retry-wait > 0.")
|
||||
+#define TEXT_RETRY_ON_403 \
|
||||
+ _(" --retry-on-403[=true|false] Configure whether retry or not when\n" \
|
||||
+ " HTTP server returns 403 Forbidden.\n" \
|
||||
+ " Only effective if retry-wait > 0.")
|
||||
+#define TEXT_RETRY_ON_406 \
|
||||
+ _(" --retry-on-406[=true|false] Configure whether retry or not when\n" \
|
||||
+ " HTTP server returns 406 Not Acceptable.\n" \
|
||||
+ " Only effective if retry-wait > 0.")
|
||||
+#define TEXT_RETRY_ON_UNKNOWN \
|
||||
+ _(" --retry-on-unknown[=true|false] Configure whether retry or not when\n" \
|
||||
+ " HTTP server returns unknown status code.\n" \
|
||||
+ " Only effective if retry-wait > 0.")
|
||||
#define TEXT_TIMEOUT \
|
||||
_(" -t, --timeout=SEC Set timeout in seconds.")
|
||||
#define TEXT_MAX_TRIES \
|
||||
--
|
||||
2.18.0
|
123
aria2/patches/0004-Disable-auto-added-Want-Digest-header.patch
Normal file
123
aria2/patches/0004-Disable-auto-added-Want-Digest-header.patch
Normal file
@ -0,0 +1,123 @@
|
||||
From b938aa51e50852d1b185db3188357073ad374416 Mon Sep 17 00:00:00 2001
|
||||
From: myfreeer <myfreeer@users.noreply.github.com>
|
||||
Date: Sun, 13 Dec 2020 15:40:56 +0800
|
||||
Subject: [PATCH] option: add option to disable Want-Digest header
|
||||
|
||||
Sending this HTTP header should be optional.
|
||||
Should close https://github.com/myfreeer/aria2-build-msys2/issues/10
|
||||
|
||||
--http-want-digest[=true|false] Send Want-Digest HTTP requser header
|
||||
with only limited hash algorithms:
|
||||
SHA-512, SHA-256, and SHA-1.
|
||||
The Want-Digest HTTP header is primarily used
|
||||
in a HTTP request, to ask the responder to
|
||||
provide a digest of the requested resource
|
||||
using the Digest response header
|
||||
|
||||
Possible Values: true, false
|
||||
Default: false
|
||||
Tags: #advanced, #http
|
||||
---
|
||||
src/AbstractProxyRequestCommand.cc | 1 +
|
||||
src/HttpRequestCommand.cc | 1 +
|
||||
src/OptionHandlerFactory.cc | 12 ++++++++++++
|
||||
src/prefs.cc | 2 ++
|
||||
src/prefs.h | 2 ++
|
||||
src/usage_text.h | 8 ++++++++
|
||||
6 files changed, 26 insertions(+)
|
||||
|
||||
diff --git a/src/AbstractProxyRequestCommand.cc b/src/AbstractProxyRequestCommand.cc
|
||||
index bd2bcb3..1feed07 100644
|
||||
--- a/src/AbstractProxyRequestCommand.cc
|
||||
+++ b/src/AbstractProxyRequestCommand.cc
|
||||
@@ -72,6 +72,7 @@ bool AbstractProxyRequestCommand::executeInternal()
|
||||
if (httpConnection_->sendBufferIsEmpty()) {
|
||||
auto httpRequest = make_unique<HttpRequest>();
|
||||
httpRequest->setUserAgent(getOption()->get(PREF_USER_AGENT));
|
||||
+ httpRequest->setNoWantDigest(!getOption()->getAsBool(PREF_HTTP_WANT_DIGEST));
|
||||
httpRequest->setRequest(getRequest());
|
||||
httpRequest->setProxyRequest(proxyRequest_);
|
||||
|
||||
diff --git a/src/HttpRequestCommand.cc b/src/HttpRequestCommand.cc
|
||||
index a2b8e7e..8c50153 100644
|
||||
--- a/src/HttpRequestCommand.cc
|
||||
+++ b/src/HttpRequestCommand.cc
|
||||
@@ -90,6 +90,7 @@ createHttpRequest(const std::shared_ptr<Request>& req,
|
||||
{
|
||||
auto httpRequest = make_unique<HttpRequest>();
|
||||
httpRequest->setUserAgent(option->get(PREF_USER_AGENT));
|
||||
+ httpRequest->setNoWantDigest(!option->getAsBool(PREF_HTTP_WANT_DIGEST));
|
||||
httpRequest->setRequest(req);
|
||||
httpRequest->setFileEntry(fileEntry);
|
||||
httpRequest->setSegment(segment);
|
||||
diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc
|
||||
index a058eb9..9ff615a 100644
|
||||
--- a/src/OptionHandlerFactory.cc
|
||||
+++ b/src/OptionHandlerFactory.cc
|
||||
@@ -1106,6 +1106,18 @@ std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
|
||||
op->setChangeOptionForReserved(true);
|
||||
handlers.push_back(op);
|
||||
}
|
||||
+ {
|
||||
+ OptionHandler* op(
|
||||
+ new BooleanOptionHandler(PREF_HTTP_WANT_DIGEST,
|
||||
+ TEXT_HTTP_WANT_DIGEST,
|
||||
+ A2_V_FALSE, OptionHandler::OPT_ARG));
|
||||
+ op->addTag(TAG_ADVANCED);
|
||||
+ op->addTag(TAG_HTTP);
|
||||
+ op->setInitialOption(true);
|
||||
+ op->setChangeGlobalOption(true);
|
||||
+ op->setChangeOptionForReserved(true);
|
||||
+ handlers.push_back(op);
|
||||
+ }
|
||||
{
|
||||
OptionHandler* op(new BooleanOptionHandler(
|
||||
PREF_ENABLE_HTTP_KEEP_ALIVE, TEXT_ENABLE_HTTP_KEEP_ALIVE, A2_V_TRUE,
|
||||
diff --git a/src/prefs.cc b/src/prefs.cc
|
||||
index 9793706..bdb33e2 100644
|
||||
--- a/src/prefs.cc
|
||||
+++ b/src/prefs.cc
|
||||
@@ -437,6 +437,8 @@ PrefPtr PREF_HTTP_ACCEPT_GZIP = makePref("http-accept-gzip");
|
||||
// value: true | false
|
||||
PrefPtr PREF_CONTENT_DISPOSITION_DEFAULT_UTF8 =
|
||||
makePref("content-disposition-default-utf8");
|
||||
+// values: true | false
|
||||
+PrefPtr PREF_HTTP_WANT_DIGEST = makePref("http-want-digest");
|
||||
|
||||
/**
|
||||
* Proxy related preferences
|
||||
diff --git a/src/prefs.h b/src/prefs.h
|
||||
index f014d9c..c88f2d0 100644
|
||||
--- a/src/prefs.h
|
||||
+++ b/src/prefs.h
|
||||
@@ -389,6 +389,8 @@ extern PrefPtr PREF_HTTP_NO_CACHE;
|
||||
extern PrefPtr PREF_HTTP_ACCEPT_GZIP;
|
||||
// value: true | false
|
||||
extern PrefPtr PREF_CONTENT_DISPOSITION_DEFAULT_UTF8;
|
||||
+// value: true | false
|
||||
+extern PrefPtr PREF_HTTP_WANT_DIGEST;
|
||||
|
||||
/**;
|
||||
* Proxy related preferences
|
||||
diff --git a/src/usage_text.h b/src/usage_text.h
|
||||
index 7a0a981..aee3ac0 100644
|
||||
--- a/src/usage_text.h
|
||||
+++ b/src/usage_text.h
|
||||
@@ -560,6 +560,14 @@
|
||||
" Content-Disposition header as UTF-8 instead of\n" \
|
||||
" ISO-8859-1, for example, the filename parameter,\n" \
|
||||
" but not the extended version filename*.")
|
||||
+#define TEXT_HTTP_WANT_DIGEST \
|
||||
+ _(" --http-want-digest[=true|false] Send Want-Digest HTTP requser header\n" \
|
||||
+ " with only limited hash algorithms:\n" \
|
||||
+ " SHA-512, SHA-256, and SHA-1.\n" \
|
||||
+ " The Want-Digest HTTP header is primarily used\n" \
|
||||
+ " in a HTTP request, to ask the responder to\n" \
|
||||
+ " provide a digest of the requested resource\n" \
|
||||
+ " using the Digest response header")
|
||||
#define TEXT_EVENT_POLL \
|
||||
_(" --event-poll=POLL Specify the method for polling events.")
|
||||
#define TEXT_BT_EXTERNAL_IP \
|
||||
--
|
||||
2.29.2
|
||||
|
18
luci-app-aria2/Makefile
Normal file
18
luci-app-aria2/Makefile
Normal file
@ -0,0 +1,18 @@
|
||||
#
|
||||
# Copyright (C) 2017-2019 Xingwang Liao <kuoruan@gmail.com>
|
||||
#
|
||||
# This is free software, licensed under the MIT License.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
LUCI_TITLE:=LuCI Support for Aria2
|
||||
LUCI_DEPENDS:=+aria2 +ariang
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
PKG_MAINTAINER:=Xingwang Liao <kuoruan@gmail.com>
|
||||
PKG_LICENSE:=MIT
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
39
luci-app-aria2/luasrc/controller/aria2.lua
Normal file
39
luci-app-aria2/luasrc/controller/aria2.lua
Normal file
@ -0,0 +1,39 @@
|
||||
module("luci.controller.aria2",package.seeall)
|
||||
local ucic = luci.model.uci.cursor()
|
||||
local http = require "luci.http"
|
||||
local util = require "luci.util"
|
||||
|
||||
function index()
|
||||
if not nixio.fs.access("/etc/config/aria2")then return end
|
||||
entry({"admin","nas","aria2"},firstchild(),_("Aria2")).dependent=false
|
||||
entry({"admin","nas","aria2","config"},cbi("aria2/config"),_("Configuration"),1)
|
||||
entry({"admin","nas","aria2","file"},form("aria2/files"),_("Files"),2)
|
||||
entry({"admin","nas","aria2","log"},firstchild(),_("Log"),3)
|
||||
entry({"admin","nas","aria2","log","view"},template("aria2/log_template"))
|
||||
entry({"admin","nas","aria2","log","read"},call("action_log_read"))
|
||||
entry({"admin", "nas", "aria2", "clear_log"}, call("clear_log")).leaf = true
|
||||
entry({"admin","nas","aria2","status"},call("action_status"))
|
||||
end
|
||||
|
||||
function action_status()
|
||||
local t={
|
||||
running=(luci.sys.call("pidof aria2c >/dev/null")==0)
|
||||
}
|
||||
http.prepare_content("application/json")
|
||||
http.write_json(t)
|
||||
end
|
||||
|
||||
function clear_log()
|
||||
luci.sys.call("cat > /var/log/aria2_1.log")
|
||||
end
|
||||
|
||||
function action_log_read()
|
||||
local t={log="",syslog=""}
|
||||
local o=ucic:get("aria2","main","log")or"/var/log/aria2.log"
|
||||
if nixio.fs.access(o) then
|
||||
t.log=util.trim(luci.sys.exec("tail -n 50 %s | sed 'x;1!H;$!d;x'"%o))
|
||||
end
|
||||
t.syslog=util.trim(luci.sys.exec("[ -f '/var/log/aria2_1.log' ] && cat /var/log/aria2_1.log"))
|
||||
http.prepare_content("application/json")
|
||||
http.write_json(t)
|
||||
end
|
411
luci-app-aria2/luasrc/model/cbi/aria2/config.lua
Normal file
411
luci-app-aria2/luasrc/model/cbi/aria2/config.lua
Normal file
@ -0,0 +1,411 @@
|
||||
local a=require"luci.sys"
|
||||
local i=require"luci.util"
|
||||
local o,t,e
|
||||
local function n()
|
||||
if a.call("command -v aria2c >/dev/null")~=0 then
|
||||
return nil
|
||||
end
|
||||
local t={}
|
||||
local e
|
||||
for e in i.execi("aria2c -v 2>/dev/null | grep -E '^(aria2 version|Enabled Features)'")do
|
||||
if e:match("^aria2 version")then
|
||||
local a,a,e=e:find("([%d%.]+)$")
|
||||
t.version=e
|
||||
elseif e:match("^Enabled Features")then
|
||||
t.gzip=e:find("GZip")~=nil
|
||||
t.https=e:find("HTTPS")~=nil
|
||||
t.bt=e:find("BitTorrent")~=nil
|
||||
t.sftp=e:find("SFTP")~=nil
|
||||
t.adns=e:find("Async DNS")~=nil
|
||||
t.cookie=e:find("Firefox3 Cookie")~=nil
|
||||
end
|
||||
end
|
||||
return t
|
||||
end
|
||||
local a=n()
|
||||
o=Map("aria2","%s - %s"%{translate("Aria2"),translate("Settings")},
|
||||
"<p>%s</p><p>%s</p>"%{
|
||||
translate("Aria2 is a lightweight multi-protocol & multi-source, cross platform download utility."),
|
||||
translatef("")
|
||||
})
|
||||
if not a then
|
||||
o:section(SimpleSection,nil,"<span style=\"color: red;\">%s</span>"%
|
||||
translate("Error: Can't find aria2c in PATH, please reinstall aria2."))
|
||||
o.reset=false
|
||||
o.submit=false
|
||||
return o
|
||||
end
|
||||
o:append(Template("aria2/settings_header"))
|
||||
t=o:section(NamedSection,"main","aria2")
|
||||
t.addremove=false
|
||||
t.anonymous=true
|
||||
t:tab("basic",translate("Basic Options"))
|
||||
e=t:taboption("basic",Flag,"enabled",translate("Enabled"))
|
||||
e.rmempty=false
|
||||
e=t:taboption("basic",ListValue,"user",translate("Run daemon as user"),
|
||||
translate("Leave blank to use default user."))
|
||||
e:value("")
|
||||
local n
|
||||
for t in i.execi("cat /etc/passwd | cut -d':' -f1")do
|
||||
e:value(t)
|
||||
end
|
||||
mount=t:taboption("basic",Value,"dir",translate("Download directory"),
|
||||
translate("The directory to store the downloaded file. eg. <code>/mnt/sda1</code>"))
|
||||
mount.rmempty=false
|
||||
for t in i.execi("mount | awk '{print $3}' | grep mnt")do
|
||||
mount:value(t)
|
||||
end
|
||||
e=t:taboption("basic",Value,"config_dir",translate("Config file directory"),
|
||||
translate("The directory to store the config file, session file and DHT file."))
|
||||
e.placeholder="/var/etc/aria2"
|
||||
e=t:taboption("basic",Flag,"enable_Pro",translate("Enable Aria2 Pro"),translate("When enabled, the original system configuration directory will be merged."))
|
||||
e.rmempty=false
|
||||
e=t:taboption("basic",Value,"Pro",translate("Aria2 Pro file"),
|
||||
translate("Use the configuration scheme of p3terx to realize the enhancement and expansion of aria2 function."))
|
||||
e:depends("enable_Pro","1")
|
||||
e.default="/usr/share/aria2"
|
||||
e=t:taboption("basic",Flag,"enable_logging",translate("Enable logging"))
|
||||
e.rmempty=false
|
||||
e=t:taboption("basic",Value,"log",translate("Log file"),
|
||||
translate("The file name of the log file."))
|
||||
e:depends("enable_logging","1")
|
||||
e.placeholder="/var/log/aria2.log"
|
||||
e=t:taboption("basic",ListValue,"log_level",translate("Log level"))
|
||||
e:depends("enable_logging","1")
|
||||
e:value("debug",translate("Debug"))
|
||||
e:value("info",translate("Info"))
|
||||
e:value("notice",translate("Notice"))
|
||||
e:value("warn",translate("Warn"))
|
||||
e:value("error",translate("Error"))
|
||||
e.default="warn"
|
||||
e=t:taboption("basic",Value,"max_concurrent_downloads",translate("Max concurrent downloads"))
|
||||
e.placeholder="5"
|
||||
t:tab("rpc",translate("RPC Options"))
|
||||
e=t:taboption("rpc",Flag,"pause",translate("Pause"),translate("Pause download after added."))
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="false"
|
||||
e=t:taboption("rpc",Flag,"pause_metadata",translate("Pause metadata"),
|
||||
translate("Pause downloads created as a result of metadata download."))
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="false"
|
||||
e=t:taboption("rpc",Value,"rpc_listen_port",translate("RPC port"),translate("The webui port defaults to 6800."))
|
||||
e.datatype="range(1024,65535)"
|
||||
e.placeholder="6800"
|
||||
e=t:taboption("rpc",ListValue,"rpc_auth_method",translate("RPC authentication method"))
|
||||
e:value("none",translate("No Authentication"))
|
||||
e:value("user_pass",translate("Username & Password"))
|
||||
e:value("token",translate("Token"))
|
||||
e=t:taboption("rpc",Value,"rpc_user",translate("RPC username"))
|
||||
e:depends("rpc_auth_method","user_pass")
|
||||
e=t:taboption("rpc",Value,"rpc_passwd",translate("RPC password"))
|
||||
e:depends("rpc_auth_method","user_pass")
|
||||
e.password=true
|
||||
e=t:taboption("rpc",Value,"rpc_secret",translate("RPC token"))
|
||||
e:depends("rpc_auth_method","token")
|
||||
e.template="aria2/value_with_btn"
|
||||
e.btntext=translate("generate randomly")
|
||||
e.btnclick="randomToken();"
|
||||
if a.https then
|
||||
e=t:taboption("rpc",Flag,"rpc_secure",translate("RPC secure"),
|
||||
translate("RPC transport will be encrypted by SSL/TLS. The RPC clients must use https"
|
||||
.." scheme to access the server. For WebSocket client, use wss scheme."))
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.rmempty=false
|
||||
e=t:taboption("rpc",Value,"rpc_certificate",translate("RPC certificate"),
|
||||
translate("Use the certificate in FILE for RPC server. The certificate must be either"
|
||||
.." in PKCS12 (.p12, .pfx) or in PEM format.<br/>PKCS12 files must contain the"
|
||||
.." certificate, a key and optionally a chain of additional certificates. Only PKCS12"
|
||||
.." files with a blank import password can be opened!<br/>When using PEM, you have to"
|
||||
.." specify the \"RPC private key\" as well."))
|
||||
e:depends("rpc_secure","true")
|
||||
e.datatype="file"
|
||||
e=t:taboption("rpc",Value,"rpc_private_key",translate("RPC private key"),
|
||||
translate("Use the private key in FILE for RPC server. The private key must be"
|
||||
.." decrypted and in PEM format."))
|
||||
e:depends("rpc_secure","true")
|
||||
e.datatype="file"
|
||||
end
|
||||
e=t:taboption("rpc",Flag,"_use_ws",translate("Use WebSocket"))
|
||||
e=t:taboption("rpc",Value,"_rpc_url",translate("Json-RPC URL"))
|
||||
e.template="aria2/value_with_btn"
|
||||
e.onmouseover="this.focus();this.select();"
|
||||
e.btntext=translate("Show URL")
|
||||
e.btnclick="showRPCURL();"
|
||||
t:tab("http",translate("HTTP/FTP/SFTP Options"))
|
||||
e=t:taboption("http",Flag,"enable_proxy",translate("Enable proxy"))
|
||||
e.rmempty=false
|
||||
e=t:taboption("http",Value,"all_proxy",translate("All proxy"),
|
||||
translate("Use a proxy server for all protocols."))
|
||||
e:depends("enable_proxy","1")
|
||||
e.placeholder="[http://][USER:PASSWORD@]HOST[:PORT]"
|
||||
e=t:taboption("http",Value,"all_proxy_user",translate("Proxy user"))
|
||||
e:depends("enable_proxy","1")
|
||||
e=t:taboption("http",Value,"all_proxy_passwd",translate("Proxy password"))
|
||||
e:depends("enable_proxy","1")
|
||||
e.password=true
|
||||
if a.https then
|
||||
e=t:taboption("http",Flag,"check_certificate",translate("Check certificate"),
|
||||
translate("Verify the peer using certificates specified in \"CA certificate\" option."))
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="true"
|
||||
e.rmempty=false
|
||||
e=t:taboption("http",Value,"ca_certificate",translate("CA certificate"),
|
||||
translate("Use the certificate authorities in FILE to verify the peers. The certificate"
|
||||
.." file must be in PEM format and can contain multiple CA certificates."))
|
||||
e:depends("check_certificate","true")
|
||||
e.datatype="file"
|
||||
e=t:taboption("http",Value,"certificate",translate("Certificate"),
|
||||
translate("Use the client certificate in FILE. The certificate must be either in PKCS12"
|
||||
.." (.p12, .pfx) or in PEM format.<br/>PKCS12 files must contain the certificate, a"
|
||||
.." key and optionally a chain of additional certificates. Only PKCS12 files with a"
|
||||
.." blank import password can be opened!<br/>When using PEM, you have to specify the"
|
||||
.." \"Private key\" as well."))
|
||||
e.datatype="file"
|
||||
e=t:taboption("http",Value,"private_key",translate("Private key"),
|
||||
translate("Use the private key in FILE. The private key must be decrypted and in PEM"
|
||||
.." format. The behavior when encrypted one is given is undefined."))
|
||||
e.datatype="file"
|
||||
end
|
||||
if a.gzip then
|
||||
e=t:taboption("http",Flag,"http_accept_gzip",translate("HTTP accept gzip"),
|
||||
translate("Send <code>Accept: deflate, gzip</code> request header and inflate response"
|
||||
.." if remote server responds with <code>Content-Encoding: gzip</code> or"
|
||||
.." <code>Content-Encoding: deflate</code>."))
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="false"
|
||||
end
|
||||
e=t:taboption("http",Flag,"http_no_cache",translate("HTTP no cache"),
|
||||
translate("Send <code>Cache-Control: no-cache</code> and <code>Pragma: no-cache</code>"
|
||||
.." header to avoid cached content. If disabled, these headers are not sent and you"
|
||||
.." can add Cache-Control header with a directive you like using \"Header\" option."))
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="false"
|
||||
e=t:taboption("http",DynamicList,"header",translate("Header"),
|
||||
translate("Append HEADERs to HTTP request header."))
|
||||
e=t:taboption("http",Value,"connect_timeout",translate("Connect timeout"),
|
||||
translate("Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy server."..
|
||||
" After the connection is established, this option makes no effect and \"Timeout\" option is used instead."))
|
||||
e.datatype="uinteger"
|
||||
e.placeholder="60"
|
||||
e=t:taboption("http",Value,"timeout",translate("Timeout"))
|
||||
e.datatype="uinteger"
|
||||
e.placeholder="60"
|
||||
e=t:taboption("http",Value,"lowest_speed_limit",translate("Lowest speed limit"),
|
||||
"%s %s"%{
|
||||
translate("Close connection if download speed is lower than or equal to this value(bytes per sec). "..
|
||||
"0 means has no lowest speed limit."),
|
||||
translate("You can append K or M.")
|
||||
})
|
||||
e.placeholder="0"
|
||||
e=t:taboption("http",Value,"max_connection_per_server",translate("Max connection per server"),
|
||||
translate("The maximum number of connections to one server for each download."))
|
||||
e.datatype="uinteger"
|
||||
e.placeholder="1"
|
||||
e=t:taboption("http",Value,"split",translate("Max number of split"),
|
||||
translate("Download a file using N connections."))
|
||||
e.datatype="uinteger"
|
||||
e.placeholder="5"
|
||||
e=t:taboption("http",Value,"min_split_size",translate("Min split size"),
|
||||
translate("Don't split less than 2*SIZE byte range. Possible values: 1M-1024M."))
|
||||
e.placeholder="20M"
|
||||
e=t:taboption("http",Value,"max_tries",translate("Max tries"))
|
||||
e.datatype="uinteger"
|
||||
e.placeholder="5"
|
||||
e=t:taboption("http",Value,"retry_wait",translate("Retry wait"),
|
||||
translate("Set the seconds to wait between retries."))
|
||||
e.datatype="uinteger"
|
||||
e.placeholder="0"
|
||||
e=t:taboption("http",Value,"user_agent",translate("User agent"),
|
||||
translate("Set user agent for HTTP(S) downloads."))
|
||||
e.placeholder="aria2/%s"%{a.version and a.version or"$VERSION"}
|
||||
if a.bt then
|
||||
t:tab("bt",translate("BitTorrent Options"))
|
||||
e=t:taboption("bt",Flag,"enable_dht",translate("IPv4 <abbr title=\"Distributed Hash Table\">DHT</abbr> enabled"),
|
||||
"%s %s"%{
|
||||
translate("Enable IPv4 DHT functionality. It also enables UDP tracker support."),
|
||||
translate("This option will be ignored if a private flag is set in a torrent.")
|
||||
})
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="true"
|
||||
e.rmempty=false
|
||||
e=t:taboption("bt",Flag,"enable_dht6",translate("IPv6 <abbr title=\"Distributed Hash Table\">DHT</abbr> enabled"),
|
||||
"%s %s"%{
|
||||
translate("Enable IPv6 DHT functionality."),
|
||||
translate("This option will be ignored if a private flag is set in a torrent.")
|
||||
})
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e=t:taboption("bt",Flag,"bt_enable_lpd",translate("<abbr title=\"Local Peer Discovery\">LPD</abbr> enabled"),
|
||||
"%s %s"%{
|
||||
translate("Enable Local Peer Discovery."),
|
||||
translate("This option will be ignored if a private flag is set in a torrent.")
|
||||
})
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="false"
|
||||
e=t:taboption("bt",Flag,"enable_peer_exchange",translate("Enable peer exchange"),
|
||||
"%s %s"%{
|
||||
translate("Enable Peer Exchange extension."),
|
||||
translate("This option will be ignored if a private flag is set in a torrent.")
|
||||
})
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="true"
|
||||
e.rmempty=false
|
||||
e=t:taboption("bt",Flag,"bt_save_metadata",translate("Sava metadata"),
|
||||
translate("Save meta data as \".torrent\" file. This option has effect only when BitTorrent"
|
||||
.." Magnet URI is used. The file name is hex encoded info hash with suffix \".torrent\"."))
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="false"
|
||||
e=t:taboption("bt",Flag,"bt_remove_unselected_file",translate("Remove unselected file"),
|
||||
translate("Removes the unselected files when download is completed in BitTorrent. Please"
|
||||
.." use this option with care because it will actually remove files from your disk."))
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="false"
|
||||
e=t:taboption("bt",Flag,"bt_seed_unverified",translate("Seed unverified"),
|
||||
translate("Seed previously downloaded files without verifying piece hashes."))
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="false"
|
||||
e=t:taboption("bt",Value,"listen_port",translate("BitTorrent listen port"),
|
||||
translate("Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\","
|
||||
.." \"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are open"
|
||||
.." for incoming TCP traffic."))
|
||||
e.placeholder="6881-6999"
|
||||
e=t:taboption("bt",Value,"dht_listen_port",translate("DHT Listen port"),
|
||||
translate("Set UDP listening port used by DHT(IPv4, IPv6) and UDP tracker. Make sure that the "
|
||||
.."specified ports are open for incoming UDP traffic."))
|
||||
e:depends("enable_dht","true")
|
||||
e:depends("enable_dht6","true")
|
||||
e.placeholder="6881-6999"
|
||||
e=t:taboption("bt",ListValue,"follow_torrent",translate("Follow torrent"))
|
||||
e:value("true",translate("True"))
|
||||
e:value("false",translate("False"))
|
||||
e:value("mem",translate("Keep in memory"))
|
||||
e=t:taboption("bt",Value,"max_overall_upload_limit",translate("Max overall upload limit"),
|
||||
"%s %s"%{
|
||||
translate("Set max overall upload speed in bytes/sec. 0 means unrestricted."),
|
||||
translate("You can append K or M.")
|
||||
})
|
||||
e.placeholder="0"
|
||||
e=t:taboption("bt",Value,"max_upload_limit",translate("Max upload limit"),
|
||||
"%s %s"%{
|
||||
translate("Set max upload speed per each torrent in bytes/sec. 0 means unrestricted."),
|
||||
translate("You can append K or M.")
|
||||
})
|
||||
e.placeholder="0"
|
||||
e=t:taboption("bt",Value,"bt_max_open_files",translate("Max open files"),
|
||||
translate("Specify maximum number of files to open in multi-file BitTorrent download globally."))
|
||||
e.datatype="uinteger"
|
||||
e.placeholder="100"
|
||||
e=t:taboption("bt",Value,"bt_max_peers",translate("Max peers"),
|
||||
translate("Specify the maximum number of peers per torrent, 0 means unlimited."))
|
||||
e.datatype="uinteger"
|
||||
e.placeholder="55"
|
||||
e=t:taboption("bt",Value,"bt_request_peer_speed_limit",translate("Request peer speed limit"),
|
||||
"%s %s"%{
|
||||
translate("If the whole download speed of every torrent is lower than SPEED, aria2"
|
||||
.." temporarily increases the number of peers to try for more download speed."
|
||||
.." Configuring this option with your preferred download speed can increase your"
|
||||
.." download speed in some cases."),
|
||||
translate("You can append K or M.")
|
||||
})
|
||||
e.placeholder="50K"
|
||||
e=t:taboption("bt",Value,"bt_stop_timeout",translate("Stop timeout"),
|
||||
translate("Stop BitTorrent download if download speed is 0 in consecutive N seconds. If 0 is"
|
||||
.." given, this feature is disabled."))
|
||||
e.datatype="uinteger"
|
||||
e.placeholder="0"
|
||||
e=t:taboption("bt",Value,"peer_id_prefix",translate("Prefix of peer ID"),
|
||||
translate("Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length."
|
||||
.." If more than 20 bytes are specified, only first 20 bytes are used. If less than 20"
|
||||
.." bytes are specified, random byte data are added to make its length 20 bytes."))
|
||||
e.placeholder="A2-%s-"%{
|
||||
a.version and string.gsub(a.version,"%.","-")or"$MAJOR-$MINOR-$PATCH"
|
||||
}
|
||||
e=t:taboption("bt",Value,"seed_ratio",translate("Seed ratio"),
|
||||
translate("Specify share ratio. Seed completed torrents until share ratio reaches RATIO."
|
||||
.." You are strongly encouraged to specify equals or more than 1.0 here. Specify 0.0 if"
|
||||
.." you intend to do seeding regardless of share ratio."))
|
||||
e.datatype="ufloat"
|
||||
e.placeholder="1.0"
|
||||
e=t:taboption("bt",Value,"seed_time",translate("Seed time"),
|
||||
translate("Specify seeding time in minutes. If \"Seed ratio\" option is"
|
||||
.." specified along with this option, seeding ends when at least one of the conditions"
|
||||
.." is satisfied. Specifying 0 disables seeding after download completed."))
|
||||
e.datatype="ufloat"
|
||||
e=t:taboption("bt",DynamicList,"bt_tracker",translate("Additional BT tracker"),
|
||||
translate("List of additional BitTorrent tracker's announce URI."))
|
||||
e.placeholder="http://tracker.example.com/announce"
|
||||
end
|
||||
t:tab("advance",translate("Advanced Options"))
|
||||
e=t:taboption("advance",Flag,"disable_ipv6",translate("IPv6 disabled"),
|
||||
translate("Disable IPv6. This is useful if you have to use broken DNS and want to avoid terribly"
|
||||
.." slow AAAA record lookup."))
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="false"
|
||||
e=t:taboption("advance",Value,"auto_save_interval",translate("Auto save interval"),
|
||||
translate("Save a control file(*.aria2) every N seconds. If 0 is given, a control file is not"
|
||||
.." saved during download."))
|
||||
e.datatype="range(0, 600)"
|
||||
e.placeholder="60"
|
||||
e=t:taboption("advance",Value,"save_session_interval",translate("Save session interval"),
|
||||
translate("Save error/unfinished downloads to session file every N seconds. If 0 is given, file"
|
||||
.." will be saved only when aria2 exits."))
|
||||
e.datatype="uinteger"
|
||||
e.placeholder="0"
|
||||
e=t:taboption("advance",Value,"disk_cache",translate("Disk cache"),
|
||||
"%s %s"%{
|
||||
translate("Enable disk cache (in bytes), set 0 to disabled."),
|
||||
translate("You can append K or M.")
|
||||
})
|
||||
e.placeholder="16M"
|
||||
e=t:taboption("advance",ListValue,"file_allocation",translate("File allocation"),
|
||||
translate("Specify file allocation method. If you are using newer file systems such as ext4"
|
||||
.." (with extents support), btrfs, xfs or NTFS(MinGW build only), \"falloc\" is your best choice."
|
||||
.." It allocates large(few GiB) files almost instantly, but it may not be available if your system"
|
||||
.." doesn't have posix_fallocate(3) function. Don't use \"falloc\" with legacy file systems such as"
|
||||
.." ext3 and FAT32 because it takes almost same time as \"prealloc\" and it blocks aria2 entirely"
|
||||
.." until allocation finishes."))
|
||||
e:value("none",translate("None"))
|
||||
e:value("prealloc",translate("prealloc"))
|
||||
e:value("trunc",translate("trunc"))
|
||||
e:value("falloc",translate("falloc"))
|
||||
e.default="falloc"
|
||||
e=t:taboption("advance",Flag,"force_save",translate("Force save"),
|
||||
translate("Save download to session file even if the download is completed or removed."
|
||||
.." This option also saves control file in that situations. This may be useful to save"
|
||||
.." BitTorrent seeding which is recognized as completed state."))
|
||||
e.enabled="true"
|
||||
e.disabled="false"
|
||||
e.default="false"
|
||||
e=t:taboption("advance",Value,"max_overall_download_limit",translate("Max overall download limit"),
|
||||
"%s %s"%{
|
||||
translate("Set max overall download speed in bytes/sec. 0 means unrestricted."),
|
||||
translate("You can append K or M.")
|
||||
})
|
||||
e.placeholder="0"
|
||||
e=t:taboption("advance",Value,"max_download_limit",translate("Max download limit"),
|
||||
"%s %s"%{
|
||||
translate("Set max download speed per each download in bytes/sec. 0 means unrestricted."),
|
||||
translate("You can append K or M.")
|
||||
})
|
||||
e.placeholder="0"
|
||||
t=o:section(NamedSection,"main","aria2",translate("Extra Settings"),
|
||||
translate("Settings in this section will be added to config file."))
|
||||
t.addremove=false
|
||||
t.anonymous=true
|
||||
e=t:option(DynamicList,"extra_settings",translate("Settings list"),
|
||||
translate("List of extra settings. Format: option=value, eg. <code>netrc-path=/tmp/.netrc</code>."))
|
||||
e.placeholder="option=value"
|
||||
return o
|
41
luci-app-aria2/luasrc/model/cbi/aria2/files.lua
Normal file
41
luci-app-aria2/luasrc/model/cbi/aria2/files.lua
Normal file
@ -0,0 +1,41 @@
|
||||
local t,a,e
|
||||
local n=require"nixio.fs"
|
||||
local o=require"luci.util"
|
||||
local i=require"luci.model.uci".cursor()
|
||||
if i:get("aria2","main","Pro")then
|
||||
config_dir=i:get("aria2","main","Pro")or""
|
||||
else
|
||||
config_dir=i:get("aria2","main","config_dir")or""
|
||||
end
|
||||
local s="%s/aria2.conf.main"%config_dir
|
||||
local h="%s/aria2.session"%config_dir
|
||||
local i="/etc/config/aria2"%config_dir
|
||||
t=SimpleForm("aria2","%s - %s"%{translate("Aria2"),translate("Files")},
|
||||
translate("Here shows the files used by aria2."))
|
||||
t.reset=false
|
||||
t.submit=false
|
||||
a=t:section(SimpleSection,nil,translatef("在<code>%s</code>下的config文件内容",i))
|
||||
e=a:option(TextValue,"_session")
|
||||
e.rows=20
|
||||
e.readonly=true
|
||||
e.cfgvalue=function()
|
||||
local e=n.readfile(i)or translate("File does not exist.")
|
||||
return o.trim(e)~=""and e or translate("Empty file.")
|
||||
end
|
||||
a=t:section(SimpleSection,nil,translatef("在<code>%s</code>下的config文件内容",s))
|
||||
e=a:option(TextValue,"_config")
|
||||
e.rows=20
|
||||
e.readonly=true
|
||||
e.cfgvalue=function()
|
||||
local e=n.readfile(s)or translate("File does not exist.")
|
||||
return o.trim(e)~=""and e or translate("Empty file.")
|
||||
end
|
||||
a=t:section(SimpleSection,nil,translatef("在<code>%s</code>下的session文件内容",h))
|
||||
e=a:option(TextValue,"_session")
|
||||
e.rows=20
|
||||
e.readonly=true
|
||||
e.cfgvalue=function()
|
||||
local e=n.readfile(h)or translate("File does not exist.")
|
||||
return o.trim(e)~=""and e or translate("Empty file.")
|
||||
end
|
||||
return t
|
71
luci-app-aria2/luasrc/view/aria2/log_template.htm
Normal file
71
luci-app-aria2/luasrc/view/aria2/log_template.htm
Normal file
@ -0,0 +1,71 @@
|
||||
<%#
|
||||
Copyright 2017-2019 Xingwang Liao <kuoruan@gmail.com>
|
||||
Licensed to the public under the MIT License.
|
||||
-%>
|
||||
|
||||
<% css = [[
|
||||
|
||||
#log_text {
|
||||
padding: 15px;
|
||||
text-align: left;
|
||||
}
|
||||
#log_text pre {
|
||||
word-break: break-all;
|
||||
margin: 0;
|
||||
font-size : 10pt;
|
||||
font-family :Arial;
|
||||
<!-- background-color:#F0F0F0; -->
|
||||
<!-- color : #202020; -->
|
||||
}
|
||||
.description {
|
||||
background-color: #93ccff;
|
||||
font-size : 15pt;
|
||||
|
||||
]]
|
||||
-%>
|
||||
|
||||
<%+header%>
|
||||
|
||||
<script type="text/javascript" src="<%=resource%>/cbi.js?v=git-19.300.11807-7668d3e"></script>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
function clearlog(btn) {
|
||||
XHR.get('<%=url("admin/nas/aria2/clear_log")%>', null,
|
||||
function(x, data) {
|
||||
if(x && x.status == 200) {
|
||||
var log_textarea = document.getElementById('log_textarea');
|
||||
log_textarea.innerHTML = "";
|
||||
log_textarea.scrollTop = log_textarea.scrollHeight;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
XHR.poll(10, '<%=url("admin/nas/aria2/log/read")%>', null,
|
||||
function(x, data) {
|
||||
var logElm = document.getElementById('log_text');
|
||||
if (logElm) {
|
||||
logElm.innerHTML = data
|
||||
? String.format(
|
||||
'<pre>%s%s%s%s</pre>',
|
||||
'<span class="description"><%:Last 50 lines of syslog:%></span><br/><br/>',
|
||||
data.syslog || '<%:No log data.%>',
|
||||
'<br/><br/><span class="description"><%:Last 50 lines of log file:%></span><br/><br/>',
|
||||
data.log || '<%:No log data.%>'
|
||||
)
|
||||
: '<strong><%:Failed to load log data.%></strong>';
|
||||
}
|
||||
}
|
||||
);
|
||||
//]]></script>
|
||||
<div class="cbi-map">
|
||||
<h2 name="content"><%:Aria2%> - <%:Log Data%></h2>
|
||||
<fieldset class="cbi-section">
|
||||
<input class="cbi-button cbi-input-remove" type="button" onclick="clearlog()" value="<%:Clear logs%>" />
|
||||
<div id="log_text">
|
||||
<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
|
||||
<%:Collecting data...%>
|
||||
</div>
|
||||
<div style="text-align:right"><small><%:Refresh every 10 seconds.%></small></div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<%+footer%>
|
118
luci-app-aria2/luasrc/view/aria2/settings_header.htm
Normal file
118
luci-app-aria2/luasrc/view/aria2/settings_header.htm
Normal file
@ -0,0 +1,118 @@
|
||||
<%#
|
||||
Copyright 2017-2019 Xingwang Liao <kuoruan@gmail.com>
|
||||
Licensed to the public under the MIT License.
|
||||
-%>
|
||||
|
||||
<%
|
||||
local ipkg = require "luci.model.ipkg"
|
||||
local has_ui = false
|
||||
|
||||
local uilist = {
|
||||
supported = {
|
||||
["ariang"] = "AriaNg",
|
||||
["webui-aria2"] = "WebUI-Aria2",
|
||||
["yaaw"] = "YAAW"
|
||||
},
|
||||
installed = {}
|
||||
}
|
||||
|
||||
for k in pairs(uilist.supported) do
|
||||
if ipkg.installed(k) then
|
||||
uilist.installed[#uilist.installed + 1] = k
|
||||
has_ui = true
|
||||
end
|
||||
end
|
||||
|
||||
local ar_state = (luci.sys.call("ps 2>/dev/null | grep aria2c 2>/dev/null | grep /usr/bin >/dev/null") == 0)
|
||||
%>
|
||||
|
||||
<fieldset class="cbi-section">
|
||||
<p id="aria2_status">
|
||||
<em><%:Collecting data...%></em>
|
||||
</p>
|
||||
<% if has_ui and ar_state then %>
|
||||
<p>
|
||||
<%:Installed web interface: %>
|
||||
<%- for _, v in pairs(uilist.installed) do %>
|
||||
<input type="button" class="cbi-button cbi-button-apply" style="margin: 0 5px;" value="<%=uilist.supported[v]%>" onclick="openWebInterface('<%=v%>');" />
|
||||
<%- end %>
|
||||
<p>
|
||||
<% end %>
|
||||
</fieldset>
|
||||
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
XHR.poll(5, '<%=url("admin/nas/aria2/status")%>', null,
|
||||
function(x, data) {
|
||||
var tb = document.getElementById('aria2_status');
|
||||
if (data && tb) {
|
||||
tb.innerHTML = data.running
|
||||
? '<em><b><font color=green><%:The Aria2 service is running.%>'
|
||||
: '<em><b><font color=red><%:The Aria2 service is not running.%>';
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
function randomString(len) {
|
||||
var randomStr = '';
|
||||
var restLen = len;
|
||||
while ((restLen = len - randomStr.length) > 0) {
|
||||
randomStr += Math.random().toString(36).substring(2, 2 + restLen);
|
||||
}
|
||||
return randomStr;
|
||||
}
|
||||
|
||||
function randomToken() {
|
||||
var len = 32;
|
||||
var inputLength = prompt('<%:Please input token length:%>', len);
|
||||
if (inputLength === null || inputLength === '') {
|
||||
return;
|
||||
} else if (/^\d+$/.test(inputLength)) {
|
||||
len = parseInt(inputLength);
|
||||
}
|
||||
|
||||
var secretInput = document.getElementById('cbid.aria2.main.rpc_secret');
|
||||
if (secretInput) {
|
||||
secretInput.value = randomString(len);
|
||||
}
|
||||
};
|
||||
|
||||
function showRPCURL() {
|
||||
var portElm = document.getElementById('cbid.aria2.main.rpc_listen_port');
|
||||
var authMethodElm = document.getElementById('cbid.aria2.main.rpc_auth_method');
|
||||
var useWSElm = document.getElementById('cbid.aria2.main._use_ws');
|
||||
var secureElm = document.getElementById('cbid.aria2.main.rpc_secure');
|
||||
|
||||
var port = (portElm && /^\d+$/.test(portElm.value)) ? parseInt(portElm.value) : 6800;
|
||||
var authMethod = (authMethodElm && authMethodElm.value) ? authMethodElm.value : "none";
|
||||
var useWS = (useWSElm && useWSElm.checked) ? true : false;
|
||||
var secure = (secureElm && secureElm.checked) ? true : false;
|
||||
|
||||
var protocol = useWS
|
||||
? (secure ? 'wss' : 'ws')
|
||||
: (secure ? 'https' : 'http');
|
||||
var url = protocol + "://";
|
||||
|
||||
if (authMethod == 'token') {
|
||||
var authToken = document.getElementById('cbid.aria2.main.rpc_secret').value;
|
||||
url += 'token:' + authToken + '@';
|
||||
} else if (authMethod == 'user_pass') {
|
||||
var authUser = document.getElementById('cbid.aria2.main.rpc_user').value;
|
||||
var authPasswd = document.getElementById('cbid.aria2.main.rpc_passwd').value;
|
||||
url += authUser + ':' + authPasswd + '@';
|
||||
}
|
||||
url += window.location.hostname + ':' + port + '/jsonrpc';
|
||||
var rpcUrlElm = document.getElementById('cbid.aria2.main._rpc_url');
|
||||
|
||||
if (rpcUrlElm) {
|
||||
rpcUrlElm.value = url;
|
||||
} else {
|
||||
alert(url)
|
||||
}
|
||||
};
|
||||
|
||||
function openWebInterface(path) {
|
||||
var host = window.location.host;
|
||||
var protocol = window.location.protocol;
|
||||
window.open(protocol + '//' + host + '/' + path);
|
||||
};
|
||||
//]]></script>
|
22
luci-app-aria2/luasrc/view/aria2/value_with_btn.htm
Normal file
22
luci-app-aria2/luasrc/view/aria2/value_with_btn.htm
Normal file
@ -0,0 +1,22 @@
|
||||
<%#
|
||||
Copyright 2017-2019 Xingwang Liao <kuoruan@gmail.com>
|
||||
Licensed to the public under the MIT License.
|
||||
-%>
|
||||
|
||||
<%+cbi/valueheader%>
|
||||
<input data-update="change" type="text" class="cbi-input-text"<%=
|
||||
attr("id", cbid) ..
|
||||
attr("name", cbid) ..
|
||||
attr("value", self:cfgvalue(section) or self.default) ..
|
||||
ifattr(self.size, "size") ..
|
||||
ifattr(self.placeholder, "placeholder") ..
|
||||
ifattr(self.maxlength, "maxlength") ..
|
||||
ifattr(self.datatype, "data-type", self.datatype) ..
|
||||
ifattr(self.onmouseover, "onmouseover")
|
||||
%> />
|
||||
<%- if self.btntext then -%>
|
||||
<div class="cbi-button cbi-button-neutral" title="<%=self.btntext%>" aria-label="<%=self.btntext%>"<%=
|
||||
ifattr(self.btnclick, "onclick", self.btnclick)
|
||||
%>><span style="font-weight: normal;"><%=self.btntext%></span></div>
|
||||
<% end %>
|
||||
<%+cbi/valuefooter%>
|
871
luci-app-aria2/po/zh-cn/aria2.po
Normal file
871
luci-app-aria2/po/zh-cn/aria2.po
Normal file
@ -0,0 +1,871 @@
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:296
|
||||
msgid "<abbr title=\"Local Peer Discovery\">LPD</abbr> enabled"
|
||||
msgstr "启用<abbr title=\"Local Peer Discovery\">LPD</abbr>"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:414
|
||||
msgid "Additional BT tracker"
|
||||
msgstr "额外的BT Tracker"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:419
|
||||
msgid "Advanced Options"
|
||||
msgstr "高级选项"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:169
|
||||
msgid "All proxy"
|
||||
msgstr "全局代理"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:228
|
||||
msgid "Append HEADERs to HTTP request header."
|
||||
msgstr "追加的HTTP请求头。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/controller/aria2.lua:18
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:35
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:14
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/log_template.htm:45
|
||||
msgid "Aria2"
|
||||
msgstr "Aria2"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:37
|
||||
msgid ""
|
||||
"Aria2 is a lightweight multi-protocol & multi-source, cross platform "
|
||||
"download utility."
|
||||
msgstr "Aria2是一个轻量、多线程,跨平台的下载工具。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:428
|
||||
msgid "Auto save interval"
|
||||
msgstr "定时保存会话间隔"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:56
|
||||
msgid "Basic Options"
|
||||
msgstr "基本选项"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:276
|
||||
msgid "BitTorrent Options"
|
||||
msgstr "BT 选项"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:335
|
||||
msgid "BitTorrent listen port"
|
||||
msgstr "BitTorrent监听端口"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:189
|
||||
msgid "CA certificate"
|
||||
msgstr "CA证书"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:195
|
||||
msgid "Certificate"
|
||||
msgstr "证书"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:182
|
||||
msgid "Check certificate"
|
||||
msgstr "检查证书"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:242
|
||||
msgid ""
|
||||
"Close connection if download speed is lower than or equal to this "
|
||||
"value(bytes per sec). 0 means has no lowest speed limit."
|
||||
msgstr ""
|
||||
"如果速度小于或等于这个速度(byte/s),关闭下载下载连接。0表示不限制下载速"
|
||||
"度。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/log_template.htm:49
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/settings_header.htm:29
|
||||
msgid "Collecting data..."
|
||||
msgstr "正在收集数据..."
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:73
|
||||
msgid "Config file directory"
|
||||
msgstr "配置文件目录"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/controller/aria2.lua:21
|
||||
msgid "Configuration"
|
||||
msgstr "配置"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:230
|
||||
msgid "Connect timeout"
|
||||
msgstr "连接超时时间"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:19
|
||||
msgid "Content of config file: <code>%s</code>"
|
||||
msgstr "配置文件的内容:<code>%s</code>"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:29
|
||||
msgid "Content of session file: <code>%s</code>"
|
||||
msgstr "Session文件的内容:<code>%s</code>"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:341
|
||||
msgid "DHT Listen port"
|
||||
msgstr "DHT监听端口"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:87
|
||||
msgid "Debug"
|
||||
msgstr "调试"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:422
|
||||
msgid ""
|
||||
"Disable IPv6. This is useful if you have to use broken DNS and want to avoid "
|
||||
"terribly slow AAAA record lookup."
|
||||
msgstr ""
|
||||
"禁用IPv6。如果你的DNS有问题并希望避免AAAA查询过慢,可以启用此选项。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:440
|
||||
msgid "Disk cache"
|
||||
msgstr "磁盘缓存"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:259
|
||||
msgid "Don't split less than 2*SIZE byte range. Possible values: 1M-1024M."
|
||||
msgstr "当数据小于2*SIZE时不分割。可能的值:1M-1024M。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:254
|
||||
msgid "Download a file using N connections."
|
||||
msgstr "使用N线程下载文件。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:69
|
||||
msgid "Download directory"
|
||||
msgstr "下载文件夹"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:26
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:36
|
||||
msgid "Empty file."
|
||||
msgstr "文件为空。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:280
|
||||
msgid "Enable IPv4 DHT functionality. It also enables UDP tracker support."
|
||||
msgstr "启用IPv4 DHT功能。会同时启用UDP Tracker支持。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:290
|
||||
msgid "Enable IPv6 DHT functionality."
|
||||
msgstr "启用IPv6 DHT功能。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:298
|
||||
msgid "Enable Local Peer Discovery."
|
||||
msgstr "启用本地Peer查找。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:307
|
||||
msgid "Enable Peer Exchange extension."
|
||||
msgstr "启用Peer交换扩展。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:442
|
||||
msgid "Enable disk cache (in bytes), set 0 to disabled."
|
||||
msgstr "启用硬盘缓存(byte),0 表示禁用。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:77
|
||||
msgid "Enable logging"
|
||||
msgstr "启用日志"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:305
|
||||
msgid "Enable peer exchange"
|
||||
msgstr "启用Peer交换"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:166
|
||||
msgid "Enable proxy"
|
||||
msgstr "启用代理"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:58
|
||||
msgid "Enabled"
|
||||
msgstr "启用"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:91
|
||||
msgid "Error"
|
||||
msgstr "错误"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:44
|
||||
msgid "Error: Can't find aria2c in PATH, please reinstall aria2."
|
||||
msgstr "错误:未在PATH中找到aria2c,请重新安装Aria2。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:482
|
||||
msgid "Extra Settings"
|
||||
msgstr "附加选项"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/log_template.htm:39
|
||||
msgid "Failed to load log data."
|
||||
msgstr "获取日志数据失败。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:350
|
||||
msgid "False"
|
||||
msgstr "否"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:447
|
||||
msgid "File allocation"
|
||||
msgstr "文件分配"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:25
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:35
|
||||
msgid "File does not exist."
|
||||
msgstr "文件不存在。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/controller/aria2.lua:24
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:14
|
||||
msgid "Files"
|
||||
msgstr "文件"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:348
|
||||
msgid "Follow torrent"
|
||||
msgstr "自动添加下载的种子"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:460
|
||||
msgid "Force save"
|
||||
msgstr "强制保存"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:129
|
||||
msgid "Generate Randomly"
|
||||
msgstr "随机生成"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:210
|
||||
msgid "HTTP accept gzip"
|
||||
msgstr "HTTP使用Gzip"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:219
|
||||
msgid "HTTP no cache"
|
||||
msgstr "HTTP无缓存"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:164
|
||||
msgid "HTTP/FTP/SFTP Options"
|
||||
msgstr "HTTP/FTP/SFTP选项"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:227
|
||||
msgid "Header"
|
||||
msgstr "请求头"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/files.lua:15
|
||||
msgid "Here shows the files used by aria2."
|
||||
msgstr "这里展示了Aria2使用的文件。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:278
|
||||
msgid "IPv4 <abbr title=\"Distributed Hash Table\">DHT</abbr> enabled"
|
||||
msgstr "启用IPv4<abbr title=\"Distributed Hash Table\">DHT</abbr>"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:288
|
||||
msgid "IPv6 <abbr title=\"Distributed Hash Table\">DHT</abbr> enabled"
|
||||
msgstr "启用IPv6<abbr title=\"Distributed Hash Table\">DHT</abbr>"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:421
|
||||
msgid "IPv6 disabled"
|
||||
msgstr "禁用IPv6"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:379
|
||||
msgid ""
|
||||
"If the whole download speed of every torrent is lower than SPEED, aria2 "
|
||||
"temporarily increases the number of peers to try for more download speed. "
|
||||
"Configuring this option with your preferred download speed can increase your "
|
||||
"download speed in some cases."
|
||||
msgstr ""
|
||||
"如果某个BT任务的下载速度小于配置的速度,Aria2会临时提高Peer的数量来尝试"
|
||||
"获得更大的下载速度。在某些情况下,配置此选项能提高你的下载速度。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:88
|
||||
msgid "Info"
|
||||
msgstr "信息"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/settings_header.htm:33
|
||||
msgid "Installed web interface:"
|
||||
msgstr "已安装的WEB界面:"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:158
|
||||
msgid "Json-RPC URL"
|
||||
msgstr "Json-RPC URL"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:351
|
||||
msgid "Keep in memory"
|
||||
msgstr "保存在内存中"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/log_template.htm:34
|
||||
msgid "Last 50 lines of log file:"
|
||||
msgstr "日志文件的最新50行:"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/log_template.htm:36
|
||||
msgid "Last 50 lines of syslog:"
|
||||
msgstr "系统日志的最新50行:"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:62
|
||||
msgid "Leave blank to use default user."
|
||||
msgstr "留空以使用默认用户。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:415
|
||||
msgid "List of additional BitTorrent tracker's announce URI."
|
||||
msgstr "额外的BT Tracker通告链接。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:488
|
||||
msgid ""
|
||||
"List of extra settings. Format: option=value, eg. <code>netrc-path=/tmp/."
|
||||
"netrc</code>."
|
||||
msgstr ""
|
||||
"额外设置的列表。格式:option=value,例如:<code>netrc-path=/tmp/.netrc</"
|
||||
"code>。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/log_template.htm:48
|
||||
msgid "Loading"
|
||||
msgstr "正在加载"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/controller/aria2.lua:27
|
||||
msgid "Log"
|
||||
msgstr "日志"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/log_template.htm:45
|
||||
msgid "Log Data"
|
||||
msgstr "日志数据"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:80
|
||||
msgid "Log file"
|
||||
msgstr "日志文件"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:85
|
||||
msgid "Log level"
|
||||
msgstr "日志记录等级"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:240
|
||||
msgid "Lowest speed limit"
|
||||
msgstr "最低限速"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:94
|
||||
msgid "Max concurrent downloads"
|
||||
msgstr "最大同时下载任务数"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:248
|
||||
msgid "Max connection per server"
|
||||
msgstr "单服务器最大连接数"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:475
|
||||
msgid "Max download limit"
|
||||
msgstr "最大下载限速"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:253
|
||||
msgid "Max number of split"
|
||||
msgstr "单文件最大线程数"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:367
|
||||
msgid "Max open files"
|
||||
msgstr "最大打开文件数"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:468
|
||||
msgid "Max overall download limit"
|
||||
msgstr "最大全局下载限速"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:353
|
||||
msgid "Max overall upload limit"
|
||||
msgstr "最大全局上传限速"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:372
|
||||
msgid "Max peers"
|
||||
msgstr "最大 Peer 数量"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:262
|
||||
msgid "Max tries"
|
||||
msgstr "最大重试次数"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:360
|
||||
msgid "Max upload limit"
|
||||
msgstr "最大上传限速"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:258
|
||||
msgid "Min split size"
|
||||
msgstr "最小文件分片大小"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:115
|
||||
msgid "No Authentication"
|
||||
msgstr "无认证"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/log_template.htm:35
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/log_template.htm:37
|
||||
msgid "No log data."
|
||||
msgstr "无日志数据。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:454
|
||||
msgid "None"
|
||||
msgstr "无"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:89
|
||||
msgid "Notice"
|
||||
msgstr "注意"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:99
|
||||
msgid "Pause"
|
||||
msgstr "暂停"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:99
|
||||
msgid "Pause download after added."
|
||||
msgstr "在下载任务添加后不开始下载。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:105
|
||||
msgid "Pause downloads created as a result of metadata download."
|
||||
msgstr "暂停下载内容为元数据的下载(磁力链接和 Matalink)。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:104
|
||||
msgid "Pause metadata"
|
||||
msgstr "暂停元数据"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/settings_header.htm:64
|
||||
msgid "Please input token length:"
|
||||
msgstr "请输入密钥长度:"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:393
|
||||
msgid "Prefix of peer ID"
|
||||
msgstr "Peer ID前缀"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:203
|
||||
msgid "Private key"
|
||||
msgstr "私钥"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:177
|
||||
msgid "Proxy password"
|
||||
msgstr "代理密码"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:174
|
||||
msgid "Proxy user"
|
||||
msgstr "代理用户名"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:97
|
||||
msgid "RPC Options"
|
||||
msgstr "RPC选项"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:114
|
||||
msgid "RPC authentication method"
|
||||
msgstr "RPC认证方式"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:140
|
||||
msgid "RPC certificate"
|
||||
msgstr "RPC证书"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:122
|
||||
msgid "RPC password"
|
||||
msgstr "RPC密码"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:110
|
||||
msgid "RPC port"
|
||||
msgstr "RPC端口"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:149
|
||||
msgid "RPC private key"
|
||||
msgstr "RPC私钥"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:133
|
||||
msgid "RPC secure"
|
||||
msgstr "RPC加密"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:126
|
||||
msgid "RPC token"
|
||||
msgstr "RPC令牌"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:134
|
||||
msgid ""
|
||||
"RPC transport will be encrypted by SSL/TLS. The RPC clients must use https "
|
||||
"scheme to access the server. For WebSocket client, use wss scheme."
|
||||
msgstr ""
|
||||
"用SSL/TLS加密RPC连接。RPC客户端必须使用HTTPS协议来连接服务端,对于 "
|
||||
"WebSocket客户端,则使用WSS协议。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:119
|
||||
msgid "RPC username"
|
||||
msgstr "RPC用户名"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/log_template.htm:51
|
||||
msgid "Refresh every 10 seconds."
|
||||
msgstr "每10秒刷新。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:322
|
||||
msgid "Remove unselected file"
|
||||
msgstr "删除未选择的文件"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:323
|
||||
msgid ""
|
||||
"Removes the unselected files when download is completed in BitTorrent. "
|
||||
"Please use this option with care because it will actually remove files from "
|
||||
"your disk."
|
||||
msgstr "BT下载完成时删除未选择的文件。文件将从磁盘中被完全删除,请谨慎使用。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:377
|
||||
msgid "Request peer speed limit"
|
||||
msgstr "单个Peer限速"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:266
|
||||
msgid "Retry wait"
|
||||
msgstr "重试等待"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:61
|
||||
msgid "Run daemon as user"
|
||||
msgstr "以此用户权限运行"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:315
|
||||
msgid "Sava metadata"
|
||||
msgstr "保存元数据"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:429
|
||||
msgid ""
|
||||
"Save a control file(*.aria2) every N seconds. If 0 is given, a control file "
|
||||
"is not saved during download."
|
||||
msgstr ""
|
||||
"每N秒保存下载“控制文件”(*.aria2)。设置0表示在下载过程中不保存控制文件。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:461
|
||||
msgid ""
|
||||
"Save download to session file even if the download is completed or removed. "
|
||||
"This option also saves control file in that situations. This may be useful "
|
||||
"to save BitTorrent seeding which is recognized as completed state."
|
||||
msgstr ""
|
||||
"即使下载已完成或已删除,也将其保存到会话文件。开启此选项也会同时保存“控制文"
|
||||
"件”。此选项可能有助于保持被识别为已完成状态的BT做种。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:435
|
||||
msgid ""
|
||||
"Save error/unfinished downloads to session file every N seconds. If 0 is "
|
||||
"given, file will be saved only when aria2 exits."
|
||||
msgstr ""
|
||||
"每 N 秒将失败的/未完成的下载保存到Session文件。设置0则仅在Aria2退出时保"
|
||||
"存。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:316
|
||||
msgid ""
|
||||
"Save meta data as \".torrent\" file. This option has effect only when "
|
||||
"BitTorrent Magnet URI is used. The file name is hex encoded info hash with "
|
||||
"suffix \".torrent\"."
|
||||
msgstr ""
|
||||
"将元数据保存到\".torrent\"文件。此选项仅在下载连接为BT磁力链接时生效。文"
|
||||
"件名为Hash值,后缀为\".torrent\"。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:434
|
||||
msgid "Save session interval"
|
||||
msgstr "Session保存间隔"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:330
|
||||
msgid "Seed previously downloaded files without verifying piece hashes."
|
||||
msgstr "继续之前的BT任务时, 无需再次校验分片Hash。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:401
|
||||
msgid "Seed ratio"
|
||||
msgstr "做种比率"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:408
|
||||
msgid "Seed time"
|
||||
msgstr "做种时间"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:329
|
||||
msgid "Seed unverified"
|
||||
msgstr "不校验种子"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:211
|
||||
msgid ""
|
||||
"Send <code>Accept: deflate, gzip</code> request header and inflate response "
|
||||
"if remote server responds with <code>Content-Encoding: gzip</code> or "
|
||||
"<code>Content-Encoding: deflate</code>."
|
||||
msgstr ""
|
||||
"发送<code>Accept: deflate, gzip</code>请求头,当服务器响应头包含 "
|
||||
"<code>Content-Encoding: gzip</code>或者<code>Content-Encoding: deflate</"
|
||||
"code>时解压响应数据。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:220
|
||||
msgid ""
|
||||
"Send <code>Cache-Control: no-cache</code> and <code>Pragma: no-cache</code> "
|
||||
"header to avoid cached content. If disabled, these headers are not sent and "
|
||||
"you can add Cache-Control header with a directive you like using \"Header\" "
|
||||
"option."
|
||||
msgstr ""
|
||||
"发送 <code>Cache-Control: no-cache</code>和<code>Pragma: no-cache</code> 请"
|
||||
"求头来防止缓存内容,禁用则不发送。你也可用使用“请求头”选项来设置Cache-"
|
||||
"Control请求头。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:336
|
||||
msgid ""
|
||||
"Set TCP port number for BitTorrent downloads. Accept format: \"6881,6885\", "
|
||||
"\"6881-6999\" and \"6881-6889,6999\". Make sure that the specified ports are "
|
||||
"open for incoming TCP traffic."
|
||||
msgstr ""
|
||||
"为BT下载设置TCP端口。支持的格式:\"6881,6885\",\"6881-6999\" 和 "
|
||||
"\"6881-6889,6999\"。请确保正确放行了这些端口的TCP入站通信。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:342
|
||||
msgid ""
|
||||
"Set UDP listening port used by DHT(IPv4, IPv6) and UDP tracker. Make sure "
|
||||
"that the specified ports are open for incoming UDP traffic."
|
||||
msgstr ""
|
||||
"为DHT(IPv4,IPv6)和UDP tracker设置UDP监听端口。请确保正确放行了这些端"
|
||||
"口的UDP入站通信。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:477
|
||||
msgid ""
|
||||
"Set max download speed per each download in bytes/sec. 0 means unrestricted."
|
||||
msgstr "设置每个任务的最大下载速度(byte/s),0表示不限制。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:470
|
||||
msgid "Set max overall download speed in bytes/sec. 0 means unrestricted."
|
||||
msgstr "设置全局最大下载速度(byte/s),0表示不限制。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:355
|
||||
msgid "Set max overall upload speed in bytes/sec. 0 means unrestricted."
|
||||
msgstr "设置全局最大上传速度,0表示不限制。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:362
|
||||
msgid ""
|
||||
"Set max upload speed per each torrent in bytes/sec. 0 means unrestricted."
|
||||
msgstr "设置每个任务的最大上传速度(byte/s),0表示不限制。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:231
|
||||
msgid ""
|
||||
"Set the connect timeout in seconds to establish connection to HTTP/FTP/proxy "
|
||||
"server. After the connection is established, this option makes no effect and "
|
||||
"\"Timeout\" option is used instead."
|
||||
msgstr ""
|
||||
"设置HTTP、FTP和代理服务器的连接超时时间。当连接建立后,该选项失去作用,"
|
||||
"而“超时时间”选项会被使用。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:267
|
||||
msgid "Set the seconds to wait between retries."
|
||||
msgstr "设置重试的时间间隔。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:272
|
||||
msgid "Set user agent for HTTP(S) downloads."
|
||||
msgstr "为HTTP(S)下载设置UA。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:35
|
||||
msgid "Settings"
|
||||
msgstr "设置"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:483
|
||||
msgid "Settings in this section will be added to config file."
|
||||
msgstr "这个区域中的配置信息将被添加到配置文件中。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:487
|
||||
msgid "Settings list"
|
||||
msgstr "设置列表"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:161
|
||||
msgid "Show URL"
|
||||
msgstr "显示URL"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:448
|
||||
msgid ""
|
||||
"Specify file allocation method. If you are using newer file systems such as "
|
||||
"ext4 (with extents support), btrfs, xfs or NTFS(MinGW build only), \"falloc"
|
||||
"\" is your best choice. It allocates large(few GiB) files almost instantly, "
|
||||
"but it may not be available if your system doesn't have posix_fallocate(3) "
|
||||
"function. Don't use \"falloc\" with legacy file systems such as ext3 and "
|
||||
"FAT32 because it takes almost same time as \"prealloc\" and it blocks aria2 "
|
||||
"entirely until allocation finishes."
|
||||
msgstr ""
|
||||
"指定文件分配方式。如果你使用的文件系统较新,例如:ext4(支持扩展分区),"
|
||||
"btrfs,xfs或者NTFS(仅限 MinGW 版本),强烈推荐 \"falloc\",这种方式几乎能"
|
||||
"立即分配比较大的文件(GB),但是它要求你的系统支持posix_fallocate(3) 函数。"
|
||||
"不要在ext3或者FAT32这些旧文件系统中使用 \"falloc\",因为它花费的时间和 "
|
||||
"\"prealloc\" 几乎一样多,而且在文件分配过程中会阻塞整个Aria2进程。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:368
|
||||
msgid ""
|
||||
"Specify maximum number of files to open in multi-file BitTorrent download "
|
||||
"globally."
|
||||
msgstr "设置BT全局最大同时下载的文件数量。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:409
|
||||
msgid ""
|
||||
"Specify seeding time in minutes. If \"Seed ratio\" option is specified along "
|
||||
"with this option, seeding ends when at least one of the conditions is "
|
||||
"satisfied. Specifying 0 disables seeding after download completed."
|
||||
msgstr ""
|
||||
"指定做种时间(分钟)。如果同时指定了“做种比率”选项,那么将在任一条件满足时停"
|
||||
"止做种。设置0表示下载完成后停止做种。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:402
|
||||
msgid ""
|
||||
"Specify share ratio. Seed completed torrents until share ratio reaches "
|
||||
"RATIO. You are strongly encouraged to specify equals or more than 1.0 here. "
|
||||
"Specify 0.0 if you intend to do seeding regardless of share ratio."
|
||||
msgstr ""
|
||||
"指定做种比率。BT下载完成之后持续做种,直到比率达到指定值。强烈建议将此选项设"
|
||||
"置为大于或等于1.0。设置为0.0来无限做种。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:373
|
||||
msgid "Specify the maximum number of peers per torrent, 0 means unlimited."
|
||||
msgstr "设置每个BT任务的最大 Peer 数量,0表示不限制。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:394
|
||||
msgid ""
|
||||
"Specify the prefix of peer ID. The peer ID in BitTorrent is 20 byte length. "
|
||||
"If more than 20 bytes are specified, only first 20 bytes are used. If less "
|
||||
"than 20 bytes are specified, random byte data are added to make its length "
|
||||
"20 bytes."
|
||||
msgstr ""
|
||||
"配置Peer ID前缀。Peer ID的长度为20字节。如果配置超过了20字节,将仅使用"
|
||||
"前面的20字节。如果配置少于20字节,将添加额外的随机字符来让长度达到20字"
|
||||
"节。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:388
|
||||
msgid ""
|
||||
"Stop BitTorrent download if download speed is 0 in consecutive N seconds. If "
|
||||
"0 is given, this feature is disabled."
|
||||
msgstr ""
|
||||
"当BT任务在N秒的持续时间内的下载速度一直为0,则停止下载。0表示禁用。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:387
|
||||
msgid "Stop timeout"
|
||||
msgstr "停止超时时间"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/settings_header.htm:48
|
||||
msgid "The Aria2 service is not running."
|
||||
msgstr "Aria2 未运行"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/view/aria2/settings_header.htm:47
|
||||
msgid "The Aria2 service is running."
|
||||
msgstr "Aria2 运行中"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:74
|
||||
msgid "The directory to store the config file, session file and DHT file."
|
||||
msgstr "用于放置配置文件,Session文件和DHT文件的目录。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:70
|
||||
msgid "The directory to store the downloaded file. eg. <code>/mnt/sda1</code>"
|
||||
msgstr "用于放置下载文件的目录。例如:<code>/mnt/sda1</code>"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:81
|
||||
msgid "The file name of the log file."
|
||||
msgstr "日志文件名。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:249
|
||||
msgid "The maximum number of connections to one server for each download."
|
||||
msgstr "单一服务器最大连接数量。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:281
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:291
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:299
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:308
|
||||
msgid "This option will be ignored if a private flag is set in a torrent."
|
||||
msgstr "如果种子文件具有“私有”属性,该选项将会被忽略。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:236
|
||||
msgid "Timeout"
|
||||
msgstr "超时"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:117
|
||||
msgid "Token"
|
||||
msgstr "令牌"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:349
|
||||
msgid "True"
|
||||
msgstr "是"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:156
|
||||
msgid "Use WebSocket"
|
||||
msgstr "使用WebSocket"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:170
|
||||
msgid "Use a proxy server for all protocols."
|
||||
msgstr "为所有协议设置代理服务器。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:190
|
||||
msgid ""
|
||||
"Use the certificate authorities in FILE to verify the peers. The certificate "
|
||||
"file must be in PEM format and can contain multiple CA certificates."
|
||||
msgstr ""
|
||||
"使用文件中的证书来验证对端。证书文件必须为PEM格式并且可以包含多个证书。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:141
|
||||
msgid ""
|
||||
"Use the certificate in FILE for RPC server. The certificate must be either "
|
||||
"in PKCS12 (.p12, .pfx) or in PEM format.<br/>PKCS12 files must contain the "
|
||||
"certificate, a key and optionally a chain of additional certificates. Only "
|
||||
"PKCS12 files with a blank import password can be opened!<br/>When using PEM, "
|
||||
"you have to specify the \"RPC private key\" as well."
|
||||
msgstr ""
|
||||
"使用文件中的证书作为RPC服务器。证书必须为PKCS12 (.p12, .pfx) 或者PEM格"
|
||||
"式。<br/>PKCS12 文件必须包含证书,一个密钥和可选的附加证书链。只有导入密码为"
|
||||
"空白的PKCS12文件才能被打开。<br/>使用PEM 时,你必须同时指定“RPC私钥”。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:196
|
||||
msgid ""
|
||||
"Use the client certificate in FILE. The certificate must be either in PKCS12 "
|
||||
"(.p12, .pfx) or in PEM format.<br/>PKCS12 files must contain the "
|
||||
"certificate, a key and optionally a chain of additional certificates. Only "
|
||||
"PKCS12 files with a blank import password can be opened!<br/>When using PEM, "
|
||||
"you have to specify the \"Private key\" as well."
|
||||
msgstr ""
|
||||
"使用文件中的客户端证书。证书必须为PKCS12 (.p12, .pfx) 或者PEM格式。<br/"
|
||||
">PKCS12文件必须包含证书,一个密钥和可选的附加证书链。只有导入密码为空白的 "
|
||||
"PKCS12文件才能被打开。<br/>使用PEM时,你必须同时指定“RPC私钥”。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:150
|
||||
msgid ""
|
||||
"Use the private key in FILE for RPC server. The private key must be "
|
||||
"decrypted and in PEM format."
|
||||
msgstr "使用文件中的私钥作为RPC服务器。私钥必须解密并且为PEM格式。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:204
|
||||
msgid ""
|
||||
"Use the private key in FILE. The private key must be decrypted and in PEM "
|
||||
"format. The behavior when encrypted one is given is undefined."
|
||||
msgstr "使用文件中的私钥。私钥必须解密并且为PEM格式,不支持加密的私钥。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:271
|
||||
msgid "User agent"
|
||||
msgstr "User Agent"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:116
|
||||
msgid "Username & Password"
|
||||
msgstr "用户名与密码"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:183
|
||||
msgid ""
|
||||
"Verify the peer using certificates specified in \"CA certificate\" option."
|
||||
msgstr "使用“CA证书”里配置的证书来验证对端。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:90
|
||||
msgid "Warn"
|
||||
msgstr "警告"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:244
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:356
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:363
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:383
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:443
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:471
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:478
|
||||
msgid "You can append K or M."
|
||||
msgstr "你可以追加K或者M。"
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:457
|
||||
msgid "falloc"
|
||||
msgstr ""
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:455
|
||||
msgid "prealloc"
|
||||
msgstr ""
|
||||
|
||||
#: applications/luci-app-aria2/luasrc/model/cbi/aria2/config.lua:456
|
||||
msgid "trunc"
|
||||
msgstr ""
|
||||
|
||||
msgid "AriaNg"
|
||||
msgstr "打开AriaNg的Web管理界面"
|
||||
|
||||
msgid "WebUI-Aria2"
|
||||
msgstr "打开WebUI-Aria2的Web管理界面"
|
||||
|
||||
msgid "YAAW"
|
||||
msgstr "打开YAAW的Web管理界面"
|
||||
|
||||
msgid "Enable Aria2 Pro"
|
||||
msgstr "启用扩展功能"
|
||||
|
||||
msgid "Aria2 Pro file"
|
||||
msgstr "扩展保存目录"
|
||||
|
||||
msgid "Use the configuration scheme of p3terx to realize the enhancement and expansion of aria2 function."
|
||||
msgstr ""
|
||||
"使用P3TERX的配置方案实现Aria2的增强和扩展,<br/"
|
||||
">默认放置在(包括系统配置)<code>/usr/share/aria2</code>下。"
|
||||
|
||||
msgid "generate randomly"
|
||||
msgstr "随机生成"
|
||||
|
||||
msgid "The webui port defaults to 6800."
|
||||
msgstr "WebUI端口默认6800。"
|
||||
|
||||
msgid "When enabled, the original system configuration directory will be merged."
|
||||
msgstr "启用后,系统配置文件的目录合并此处。"
|
||||
|
||||
msgid "AriaNg"
|
||||
msgstr "打开AriaNg的Web管理界面"
|
||||
|
||||
msgid "WebUI-Aria2"
|
||||
msgstr "打开WebUI-Aria2的Web管理界面"
|
||||
|
||||
msgid "YAAW"
|
||||
msgstr "打开YAAW的Web管理界面"
|
25
luci-app-aria2/root/etc/uci-defaults/40_luci-aria2
Normal file
25
luci-app-aria2/root/etc/uci-defaults/40_luci-aria2
Normal file
@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
delete ucitrack.@aria2[-1]
|
||||
add ucitrack aria2
|
||||
set ucitrack.@aria2[-1].init=aria2
|
||||
commit ucitrack
|
||||
EOF
|
||||
|
||||
if [ ."$(uci -q get aria2.main)" != ."aria2" ]; then
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
add aria2 aria2
|
||||
rename aria2.@aria2[-1]="main"
|
||||
set aria2.main.enabled=0
|
||||
set aria2.main.dir="/var/run/aria2"
|
||||
set aria2.main.config_dir="/var/etc/aria2"
|
||||
add_list aria2.main.header=""
|
||||
add_list aria2.main.bt_tracker=""
|
||||
add_list aria2.main.extra_setting=""
|
||||
commit aria2
|
||||
EOF
|
||||
fi
|
||||
|
||||
rm -f /tmp/luci-indexcache
|
||||
exit 0
|
Loading…
Reference in New Issue
Block a user