luci-app-qbittorrent: update luci

This commit is contained in:
LEAN-ESX 2019-11-28 01:07:17 -08:00
parent 6dcd971195
commit c4ba9eb960
9 changed files with 685 additions and 103 deletions

View File

@ -1,16 +1,15 @@
# Copyright (C) 2019 Openwrt.org
#
# This is a free software, use it under Apache Licene 2.0 & GNU General Public License v3.0.
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=qbittorrent-nox for LuCI
LUCI_TITLE:=LuCI support for qBittorrent
LUCI_DEPENDS:=+qBittorrent +python
LUCI_PKGARCH:=all
PKG_NAME:=luci-app-qbittorrent
PKG_VERSION=1.0
PKG_RELEASE:=9
PKG_RELEASE:=13
include $(TOPDIR)/feeds/luci/luci.mk

View File

@ -13,4 +13,4 @@ function act_status()
e.running=luci.sys.call("pgrep qbittorrent-nox >/dev/null")==0
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
end

View File

@ -1,5 +1,5 @@
local e=require"luci.model.uci".cursor()
local o=e:get_first("qbittorrent","Preferences","port") or 8080
local o=e:get_first("qbittorrent","main","Port") or 8080
local a=(luci.sys.call("pidof qbittorrent-nox > /dev/null")==0)
@ -8,25 +8,365 @@ if a then
t="<br /><br /><input class=\"cbi-button cbi-button-apply\" type=\"submit\" value=\" "..translate("Open Web Interface").." \" onclick=\"window.open('http://'+window.location.hostname+':"..o.."')\"/>"
end
function titlesplit(Value)
return "<p style=\"font-size:20px;font-weight:bold;color: DodgerBlue\">" .. translate(Value) .. "</p>"
end
m = Map("qbittorrent", translate("qBittorrent"), translate("qBittorrent is a cross-platform free and open-source BitTorrent client")..t)
m:section(SimpleSection).template="qbittorrent/qbittorrent_status"
s = m:section(NamedSection, "main", "qbittorrent")
s_basic = m:section(TypedSection, "basic", translate("Basic Settings"))
s_basic.anonymous = true
s:tab("basic", translate("Basic Settings"))
enable = s_basic:option(Flag, "enable", translate("Enable"))
profile_dir = s_basic:option(Value,"profile_dir",translate("profile_dir"),translate("Store configuration files in the Path"))
profile_dir.default = "/root"
o = s:taboption("basic", Flag, "enabled", translate("Enabled"))
o.default = "1"
s_download = m:section(TypedSection, "Preferences", translate("Download Settings"))
s_download.anonymous = true
download_dir = s_download:option(Value,"download_dir",translate("download_dir"),translate("Store download files in the Path"))
download_dir.default = "/root/download"
o = s:taboption("basic", ListValue, "user", translate("Run daemon as user"))
local u
for u in luci.util.execi("cat /etc/passwd | cut -d ':' -f1") do
o:value(u)
end
s_webui = m:section(TypedSection, "Preferences", translate("WEBUI Settings"))
s_webui.anonymous = true
port = s_webui:option(Value,"port",translate("port"),translate("WEBUI listening port"))
port.default = "8080"
o = s:taboption("basic", Value, "profile", translate("Parent Path for Profile Folder"), translate("The path for storing profile folder using by command: <b>--profile [PATH]</b>."))
o.default = '/tmp'
return m
o = s:taboption("basic", Value, "configuration", translate("Profile Folder Suffix"), translate("Suffix for profile folder, for example, <b>qBittorrent_[NAME]</b>."))
o = s:taboption("basic", Value, "Locale", translate("Locale Language"))
o:value("en", translate("English"))
o:value("zh", translate("Chinese"))
o.default = "en"
o = s:taboption("basic", Flag, "Enabled", translate("Enable Log"), translate("Enable logger to log file."))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("basic", Value, "Path", translate("Log Path"), translate("The path for qbittorrent log."))
o:depends("Enabled", "true")
o = s:taboption("basic", Flag, "Backup", translate("Enable Backup"), translate("Backup log file when oversize the given size."))
o:depends("Enabled", "true")
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("basic", Flag, "DeleteOld", translate("Delete Old Backup"), translate("Delete the old log file."))
o:depends("Enabled", "true")
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("basic", Value, "MaxSizeBytes", translate("Log Max Size"), translate("The max size for qbittorrent log (Unit: Bytes)."))
o:depends("Enabled", "true")
o.placeholder = "66560"
o = s:taboption("basic", Value, "SaveTime", translate("Log Saving Period"), translate("The log file will be deteted after given time. 1d -- 1 day, 1m -- 1 month, 1y -- 1 year"))
o:depends("Enabled", "true")
o.datatype = "string"
s:tab("connection", translate("Connection Settings"))
o = s:taboption("connection", Flag, "UPnP", translate("Use UPnP for Connections"), translate("Use UPnP/ NAT-PMP port forwarding from my router. Refer to the "
.. "<a href='https://en.wikipedia.org/wiki/Port_forwarding' target='_blank'>wiki</a>."))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("connection", Flag, "UseRandomPort", translate("Use Random Port"), translate("Use different port on each startup voids the first"
.. " option, and randomly assigns a different port every time qBittorrent starts up."))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("connection", Value, "PortRangeMin", translate("Connection Port"), translate("Generate Randomly"))
o:depends("UseRandomPort", false)
o.datatype = "range(1024,65535)"
o.template = "qbittorrent/qbt_value"
o.btnclick = "randomToken();"
o = s:taboption("connection", Value, "GlobalDLLimit", translate("Global Download Speed"), translate("Global Download Speed Limit(KiB/s)."))
o.datatype = "float"
o.placeholder = "0"
o = s:taboption("connection", Value, "GlobalUPLimit", translate("Global Upload Speed"), translate("Global Upload Speed Limit(KiB/s)."))
o.datatype = "float"
o.placeholder = "0"
o = s:taboption("connection", Value, "GlobalDLLimitAlt", translate("Alternative Download Speed"), translate("Alternative Download Speed Limit(KiB/s)."))
o.datatype = "float"
o.placeholder = "10"
o = s:taboption("connection", Value, "GlobalUPLimitAlt", translate("Alternative Upload Speed"), translate("Alternative Upload Speed Limit(KiB/s)."))
o.datatype = "float"
o.placeholder = "10"
o = s:taboption("connection", ListValue, "BTProtocol", translate("Enabled protocol"), translate("The protocol that was enabled."))
o:value("Both", translate("TCP and UTP"))
o:value("TCP", translate("TCP"))
o:value("UTP", translate("UTP"))
o.default = "Both"
o = s:taboption("connection", Value, "InetAddress", translate("Inet Address"), translate("The address that respond to the trackers."))
s:tab("downloads", translate("Downloads Settings"))
o = s:taboption("downloads", Flag, "CreateTorrentSubfolder", translate("Create Subfolder"), translate("Create subfolder for torrents with multiple files."))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("downloads", Flag, "StartInPause", translate("Start In Pause"), translate("Do not start the download automatically."))
o.enabled = "true"
o.disabled = "false"
o.default = o.disabled
o = s:taboption("downloads", Flag, "AutoDeleteAddedTorrentFile", translate("Auto Delete Torrent File"), translate("The .torrent files will be deleted afterwards."))
o.enabled = "IfAdded"
o.disabled = "Never"
o.default = o.disabled
o = s:taboption("downloads", Flag, "PreAllocation", translate("Pre Allocation"), translate("Pre-allocate disk space for all files."))
o.enabled = "true"
o.disabled = "false"
o.default = o.disabled
o = s:taboption("downloads", Flag, "UseIncompleteExtension", translate("Use Incomplete Extension"), translate("The incomplete task will be added the extension of !qB."))
o.enabled = "true"
o.disabled = "false"
o.default = o.disabled
o = s:taboption("downloads", Value, "SavePath", translate("Save Path"))
o.placeholder = "/tmp/download"
o = s:taboption("downloads", Flag, "TempPathEnabled", translate("Temp Path Enabled"))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("downloads", Value, "TempPath", translate("Temp Path"), translate("The absolute and relative path can be set."))
o:depends("TempPathEnabled", "true")
o.placeholder = "temp/"
o = s:taboption("downloads", Value, "DiskWriteCacheSize", translate("Disk Cache Size (MiB)"), translate("The value -1 is auto and 0 is disable. In default, it is set to 64MiB."))
o.datatype = "integer"
o.placeholder = "64"
o = s:taboption("downloads", Value, "DiskWriteCacheTTL", translate("Disk Cache TTL (s)"), translate("In default, it is set to 60s."))
o.datatype = "integer"
o.placeholder = "60"
o = s:taboption("downloads", DummyValue, "Saving Management", titlesplit("Saving Management"))
o = s:taboption("downloads", ListValue, "DisableAutoTMMByDefault", translate("Default Torrent Management Mode"))
o:value("true", translate("Manual"))
o:value("false", translate("Automaic"))
o.default = "true"
o = s:taboption("downloads", ListValue, "CategoryChanged", translate("Torrent Category Changed"), translate("Choose the action when torrent category changed."))
o:value("true", translate("Switch torrent to Manual Mode"))
o:value("false", translate("Relocate torrent"))
o.default = "false"
o = s:taboption("downloads", ListValue, "DefaultSavePathChanged", translate("Default Save Path Changed"), translate("Choose the action when default save path changed."))
o:value("true", translate("Switch affected torrent to Manual Mode"))
o:value("false", translate("Relocate affected torrent"))
o.default = "true"
o = s:taboption("downloads", ListValue, "CategorySavePathChanged", translate("Category Save Path Changed"), translate("Choose the action when category save path changed."))
o:value("true", translate("Switch affected torrent to Manual Mode"))
o:value("false", translate("Relocate affected torrent"))
o.default = "true"
o = s:taboption("downloads", Value, "TorrentExportDir", translate("Torrent Export Dir"), translate("The .torrent files will be copied to the target directory."))
o = s:taboption("downloads", Value, "FinishedTorrentExportDir", translate("Finished Torrent Export Dir"), translate("The .torrent files for finished downloads will be copied to the target directory."))
s:tab("bittorrent", translate("Bittorrent Settings"))
o = s:taboption("bittorrent", Flag, "DHT", translate("Enable DHT"), translate("Enable DHT (decentralized network) to find more peers"))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("bittorrent", Flag, "PeX", translate("Enable PeX"), translate("Enable Peer Exchange (PeX) to find more peers"))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("bittorrent", Flag, "LSD", translate("Enable LSD"), translate("Enable Local Peer Discovery to find more peers"))
o.enabled = "true"
o.disabled = "false"
o.default = o.disabled
o = s:taboption("bittorrent", Flag, "uTP_rate_limited", translate("uTP Rate Limit"), translate("Apply rate limit to µTP protocol."))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("bittorrent", ListValue, "Encryption", translate("Encryption Mode"), translate("Enable DHT (decentralized network) to find more peers"))
o:value("0", translate("Prefer Encryption"))
o:value("1", translate("Require Encryption"))
o:value("2", translate("Disable Encryption"))
o.default = "0"
o = s:taboption("bittorrent", Value, "MaxConnecs", translate("Max Connections"), translate("The max number of connections."))
o.datatype = "integer"
o.placeholder = "500"
o = s:taboption("bittorrent", Value, "MaxConnecsPerTorrent", translate("Max Connections Per Torrent"), translate("The max number of connections per torrent."))
o.datatype = "integer"
o.placeholder = "100"
o = s:taboption("bittorrent", Value, "MaxUploads", translate("Max Uploads"), translate("The max number of connected peers."))
o.datatype = "integer"
o.placeholder = "8"
o = s:taboption("bittorrent", Value, "MaxUploadsPerTorrent", translate("Max Uploads Per Torrent"), translate("The max number of connected peers per torrent."))
o.datatype = "integer"
o.placeholder = "4"
o = s:taboption("bittorrent", Value, "MaxRatio", translate("Max Ratio"), translate("The max ratio for seeding. -1 is to disable the seeding."))
o.datatype = "float"
o.placeholder = "-1"
o = s:taboption("bittorrent", ListValue, "MaxRatioAction", translate("Max Ratio Action"), translate("The action when reach the max seeding ratio."))
o:value("0", translate("Pause them"))
o:value("1", translate("Remove them"))
o.defaule = "0"
o = s:taboption("bittorrent", Value, "GlobalMaxSeedingMinutes", translate("Max Seeding Minutes"), translate("Units: minutes"))
o.datatype = "integer"
o = s:taboption("bittorrent", DummyValue, "Queueing Setting", titlesplit("Queueing Setting"))
o = s:taboption("bittorrent", Flag, "QueueingEnabled", translate("Enable Torrent Queueing"))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("bittorrent", Value, "MaxActiveDownloads", translate("Maximum Active Downloads"))
o.datatype = "integer"
o.placeholder = "3"
o = s:taboption("bittorrent", Value, "MaxActiveUploads", translate("Max Active Uploads"))
o.datatype = "integer"
o.placeholder = "3"
o = s:taboption("bittorrent", Value, "MaxActiveTorrents", translate("Max Active Torrents"))
o.datatype = "integer"
o.placeholder = "5"
o = s:taboption("bittorrent", Flag, "IgnoreSlowTorrents", translate("Ignore Slow Torrents"), translate("Do not count slow torrents in these limits."))
o.enabled = "true"
o.disabled = "false"
o.default = o.disabled
o = s:taboption("bittorrent", Value, "SlowTorrentsDownloadRate", translate("Download rate threshold"), translate("Units: KiB/s"))
o.datatype = "integer"
o.placeholder = "2"
o = s:taboption("bittorrent", Value, "SlowTorrentsUploadRate", translate("Upload rate threshold"), translate("Units: KiB/s"))
o.datatype = "integer"
o.placeholder = "2"
o = s:taboption("bittorrent", Value, "SlowTorrentsInactivityTimer", translate("Torrent inactivity timer"), translate("Units: seconds"))
o.datatype = "integer"
o.placeholder = "60"
s:tab("webgui", translate("WebUI Settings"))
o = s:taboption("webgui", Flag, "UseUPnP", translate("Use UPnP for WebUI"), translate("Using the UPnP / NAT-PMP port of the router for connecting to WebUI."))
o.enabled = "true"
o.disabled = "false"
o.default = o.disabled
o = s:taboption("webgui", Value, "Username", translate("Username"), translate("The login name for WebUI."))
o.placeholder = "admin"
o = s:taboption("webgui", Value, "Password", translate("Password"), translate("The login password for WebUI."))
o.password = true
o = s:taboption("webgui", Value, "Port", translate("Listen Port"), translate("The listening port for WebUI."))
o.datatype = "port"
o.placeholder = "8080"
o = s:taboption("webgui", Flag, "CSRFProtection", translate("CSRF Protection"), translate("Enable Cross-Site Request Forgery (CSRF) protection."))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("webgui", Flag, "ClickjackingProtection", translate("Clickjacking Protection"), translate("Enable clickjacking protection."))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("webgui", Flag, "HostHeaderValidation", translate("Host Header Validation"), translate("Validate the host header."))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("webgui", Flag, "LocalHostAuth", translate("Local Host Authentication"), translate("Force authentication for clients on localhost."))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("webgui", Flag, "AuthSubnetWhitelistEnabled", translate("Enable Subnet Whitelist"))
o.enabled = "true"
o.disabled = "false"
o.default = o.disabled
o = s:taboption("webgui", DynamicList, "AuthSubnetWhitelist", translate("Subnet Whitelist"))
o:depends("AuthSubnetWhitelistEnabled", "true")
s:tab("advanced", translate("Advance Settings"))
o = s:taboption("advanced", Flag, "AnonymousMode", translate("Anonymous Mode"), translate("When enabled, qBittorrent will take certain measures to try"
.. " to mask its identity. Refer to the <a href='https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode' target='_blank'>wiki</a>"))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("advanced", Flag, "SuperSeeding", translate("Super Seeding"), translate("The super seeding mode."))
o.enabled = "true"
o.disabled = "false"
o.default = o.disabled
o = s:taboption("advanced", Flag, "IncludeOverhead", translate("Limit Overhead Usage"), translate("The overhead usage is been limitted."))
o.enabled = "true"
o.disabled = "false"
o.default = o.disabled
o = s:taboption("advanced", Flag, "IgnoreLimitsLAN", translate("Ignore LAN Limit"), translate("Ignore the speed limit to LAN."))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("advanced", Flag, "osCache", translate("Use os Cache"))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
o = s:taboption("advanced", Value, "OutgoingPortsMax", translate("Max Outgoing Port"), translate("The max outgoing port."))
o.datatype = "port"
o = s:taboption("advanced", Value, "OutgoingPortsMin", translate("Min Outgoing Port"), translate("The min outgoing port."))
o.datatype = "port"
o = s:taboption("advanced", ListValue, "SeedChokingAlgorithm", translate("Choking Algorithm"), translate("The strategy of choking algorithm."))
o:value("RoundRobin", translate("Round Robin"))
o:value("FastestUpload", translate("Fastest Upload"))
o:value("AntiLeech", translate("Anti-Leech"))
o.default = "FastestUpload"
o = s:taboption("advanced", Flag, "AnnounceToAllTrackers", translate("Announce To All Trackers"))
o.enabled = "true"
o.disabled = "false"
o.default = o.disabled
o = s:taboption("advanced", Flag, "AnnounceToAllTiers", translate("Announce To All Tiers"))
o.enabled = "true"
o.disabled = "false"
o.default = o.enabled
return m

View File

@ -0,0 +1,36 @@
<%#
Copyright 2019 xxx <xxx@xxx.com>
Licensed to the public under the Apache License 2.0.
-%>
<div class="cbi-value<% if self.error and self.error[section] then %> cbi-value-error<% end %> <% if self.last_child then %> cbi-value-last <% end %>" id="cbi-<%=self.config.."-"..section.."-"..self.option%>" data-index="<%=self.index%>" data-depends="<%=pcdata(self:deplist2json(section))%>">
<%- if self.title and #self.title > 0 then -%>
<label class="cbi-value-title"<%= attr("for", cbid) %>><%-=self.title-%></label>
<div class="cbi-value-field">
<%- end -%>
<input data-update="change"<%=
attr("id", cbid) ..
attr("name", cbid) ..
attr("type", self.password and "password" or "text") ..
attr("class", self.password and "cbi-input-password" or "cbi-input-text") ..
attr("value", self:cfgvalue(section) or self.default) ..
ifattr(self.size, "size") ..
ifattr(self.placeholder, "placeholder") ..
ifattr(self.readonly, "readonly") ..
ifattr(self.maxlength, "maxlength") ..
ifattr(self.datatype, "data-type", self.datatype) ..
ifattr(self.datatype, "data-optional", self.optional or self.rmempty) ..
ifattr(self.onmouseover, "onmouseover")
%> />
<% if self.description and #self.description > 0 then -%>
<div class="cbi-value-description">
<input class="cbi-button cbi-input-<%=self.inputstyle or "button" %>" type="button"<%=
attr("value", self.description) ..
ifattr(self.btnclick, "onclick", self.btnclick)
%> />
</div>
<%- end %>
<%- if self.title and #self.title > 0 then -%>
</div>
<%- end -%>
</div>

View File

@ -1,11 +1,19 @@
config basic
option program_dir '/usr/bin'
option library_dir '/usr/lib'
option profile_dir '/root'
option enable '0'
config Preferences
option download_dir '/root/download'
option port '8080'
config qbittorrent 'main'
option user 'root'
option Locale 'zh'
option BTProtocol 'Both'
option DisableAutoTMMByDefault 'true'
option CategoryChanged 'false'
option DefaultSavePathChanged 'true'
option CategorySavePathChanged 'true'
option Encryption '0'
option MaxRatioAction '0'
option CSRFProtection 'false'
option SeedChokingAlgorithm 'FastestUpload'
option Enabled 'false'
option Port '8080'
option profile '/opt'
option enabled '0'

View File

@ -1,77 +1,264 @@
#!/bin/sh /etc/rc.common
# Licensed to the public under the Apache License 2.0.
# ubus call service list
START=99
get_config()
{
config_get_bool enable $1 enable 0
USE_PROCD=1
NAME=qbittorrent
args=/usr/bin/qbittorrent-nox
QBT_PID_FILE=/var/run/qbittorrent.pid
QBT_INI_FILE=/tmp/qBittorrent/config/qBittorrent.conf
QBT_INSTANCE=""
_info() {
logger -p daemon.info -t "$NAME" "$*"
}
config_qbittorrent()
{
local download_dir
local port
config_get download_dir $1 download_dir
config_get port $1 port
if [ -f $2/qBittorrent/config/qBittorrent.conf ]; then
sed -i 's/WebUI\\Port=[0-9]*/WebUI\\Port='"$port"'/g' $2/qBittorrent/config/qBittorrent.conf
sed -i 's/Downloads\\SavePath=[a-z,/]*//g' $2/qBittorrent/config/qBittorrent.conf
echo "Downloads\SavePath=$down" >> $2/qBittorrent/config/qBittorrent.conf
else
cat>$2/qBittorrent/config/qBittorrent.conf<<EOF
[AutoRun]
enabled=false
program=
_err() {
logger -p daemon.err -t "$NAME" "$*"
}
validate_QBT () {
uci_validate_section "$NAME" vlmcsd "$1" \
'enabled:bool:1' \
'user:string:root' \
'profile:string:/tmp' \
'configuration:string' \
'DHT:or("true","false"):true' \
'Encryption:or("0","1","2"):0' \
'LSD:or("true","false"):true' \
'MaxConnecs:integer' \
'MaxConnecsPerTorrent:integer' \
'MaxRatio:float' \
'MaxRatioAction:or("0","1")' \
'MaxUploads:integer' \
'MaxUploadsPerTorrent:integer' \
'PeX:or("true","false"):true' \
'uTP_rate_limited:or("true","false"):true' \
'PortRangeMin:port' \
'InetAddress:string' \
'UPnP:or("true","false"):true' \
'GlobalDLLimit:float' \
'GlobalDLLimitAlt:float' \
'GlobalUPLimit:float' \
'GlobalUPLimitAlt:float' \
'DiskWriteCacheSize:integer' \
'DiskWriteCacheTTL:integer' \
'FinishedTorrentExportDir:string' \
'PreAllocation:or("true","false"):false' \
'SavePath:string:/tmp/download' \
'StartInPause:or("true","false"):false' \
'TempPathEnabled:or("true","false"):true' \
'TempPath:string:temp/' \
'UseIncompleteExtension:or("true","false"):false' \
'TorrentExportDir:string' \
'Locale:string:en' \
'UseRandomPort:or("true","false"):true' \
'IgnoreSlowTorrents:or("true","false")' \
'MaxActiveDownloads:integer' \
'MaxActiveTorrents:integer' \
'MaxActiveUploads:integer' \
'QueueingEnabled:or("true","false")' \
'AuthSubnetWhitelist:string' \
'AuthSubnetWhitelistEnabled:or("true","false"):false' \
'ClickjackingProtection:or("true","false"):true' \
'CSRFProtection:or("true","false"):true' \
'HostHeaderValidation:or("true","false"):true' \
'LocalHostAuth:or("true","false"):true' \
'Password:string' \
'Port:port:8080' \
'Username:string' \
'UseUPnP:or("true","false"):true' \
'AnonymousMode:or("true","false"):true' \
'AnnounceToAllTrackers:or("true","false")' \
'IgnoreLimitsLAN:or("true","false"):true' \
'IncludeOverhead:or("true","false"):false' \
'osCache:or("true","false")' \
'OutgoingPortsMax:port' \
'OutgoingPortsMin:port' \
'AnnounceToAllTiers:or("true","false")' \
'BTProtocol:or("Both","TCP","UTP")' \
'CreateTorrentSubfolder:or("true","false"):true' \
'DisableAutoTMMByDefault:or("true","false"):true' \
'SuperSeeding:or("true","false"):false' \
'GlobalMaxSeedingMinutes:integer' \
'SeedChokingAlgorithm:or("RoundRobin","FastestUpload","AntiLeech")' \
'SlowTorrentsDownloadRate:integer' \
'SlowTorrentsInactivityTimer:integer' \
'SlowTorrentsUploadRate:integer' \
'CategoryChanged:or("true","false"):false' \
'CategorySavePathChanged:or("true","false"):true' \
'DefaultSavePathChanged:or("true","false"):true' \
'AutoDeleteAddedTorrentFile:or("Never","IfAdded"):Never' \
'Enabled:or("true","false")' \
'Path:string' \
'Backup:or("true","false")' \
'DeleteOld:or("true","false")' \
'MaxSizeBytes:integer' \
'SaveTime:string'
}
sed_options () {
local Anchor=$1
local category=$( echo $2 | sed 's/\s/\\\\/g' )
shift
shift
if [ $( sed -n '/^\['"$Anchor"'\]/p' $QBT_INI_FILE | wc -l ) -lt 1 ]; then
sed -i '$a\\n\['"$Anchor"'\]' "$QBT_INI_FILE"
fi
local o; local v; local ol
for o in "$@"; do
v=$( echo "$(eval echo "\$$o")" | sed 's/[\/\.]/\\&/g' )
[ -n "$category" ] && ol="$category\\\\$o" || ol="$o"
[ -n "$v" ] && {
if [ $( sed -n '/^'"$ol"'=/p' $QBT_INI_FILE | wc -l ) -lt 1 ]; then
sed -i '/'"$Anchor"'/a'"$ol"'='"$v" "$QBT_INI_FILE"
else
sed -i 's/'"$ol"'=.*/'"$ol"'='"$v"'/g' "$QBT_INI_FILE"
fi
} || {
sed -i '/'"$ol"'=.*/d' "$QBT_INI_FILE"
}
done
}
config_QBT () {
local Password_ha1="";local Age="";local AgeType=""
[ -n "$Password" ] && \
Password_ha1="@ByteArray($(echo -n $Password|md5sum|grep -oE '[a-z0-9]{32}'))"
[ -n "$SaveTime" ] && {
[ -n "$(echo $SaveTime | sed 's/[0-9dmyDMY]//g')" ] && { _err "Error save time setted."; return 1; }
Age="$(echo $SaveTime | sed 's/[dmyDMY]//g')"
AgeType="$(echo $SaveTime | sed 's/[0-9]//g' | sed 's/[dD]/0/g' | sed 's/[mM]/1/g' | sed 's/[yY]/2/g')"
}
[ -f "$QBT_INI_FILE" ] || {
cat>"$QBT_INI_FILE"<<EOF
[LegalNotice]
Accepted=true
[Network]
Cookies=@Invalid()
[Preferences]
General\Locale=zh
Downloads\SavePath=$download_dir
General\Locale=zh
WebUI\Port=$port
WebUI\CSRFProtection=false
EOF
fi
}
run_qbittorrent()
{
local enable
config_get_bool enable $1 enable
if [ $enable ]; then
local profile_dir
config_get profile_dir $1 profile_dir
config_foreach config_qbittorrent 'Preferences' $profile_dir
if [ "$profile_dir" != "" ]; then
config_get library_dir $1 library_dir
config_get program_dir $1 program_dir
export PATH=$PATH:$program_dir
export LD_LIBRARY_PATH=$library_dir
qbittorrent-nox -d --profile=$profile_dir
else
echo "no profile_dir,stop!"
fi
}
sed_options "Core" "" \
"AutoDeleteAddedTorrentFile"
sed_options "BitTorrent" "Session DisableAutoTMMTriggers" \
"CategoryChanged" "CategorySavePathChanged" "DefaultSavePathChanged"
sed_options "BitTorrent" "Session" \
"AnnounceToAllTiers" "BTProtocol" "CreateTorrentSubfolder" "DisableAutoTMMByDefault" "GlobalMaxSeedingMinutes" \
"SeedChokingAlgorithm" "SlowTorrentsDownloadRate" "SlowTorrentsInactivityTimer" "SlowTorrentsUploadRate"
sed_options "Preferences" "WebUI" \
"AuthSubnetWhitelistEnabled" "AuthSubnetWhitelist" "CSRFProtection" \
"ClickjackingProtection" "HostHeaderValidation" "LocalHostAuth" \
"Password_ha1" "Port" "Username" "UseUPnP"
sed_options "Preferences" "Queueing" \
"IgnoreSlowTorrents" "MaxActiveDownloads" "MaxActiveTorrents" "MaxActiveUploads" \
"QueueingEnabled"
sed_options "Preferences" "General" \
"Locale" "UseRandomPort"
sed_options "Preferences" "Downloads" \
"DiskWriteCacheSize" "DiskWriteCacheTTL" "FinishedTorrentExportDir" "PreAllocation" \
"SavePath" "StartInPause" "TempPathEnabled" "TempPath" "TorrentExportDir" \
"UseIncompleteExtension"
sed_options "Preferences" "Connection" \
"GlobalDLLimit" "GlobalDLLimitAlt" "GlobalUPLimit" "GlobalUPLimitAlt" \
"PortRangeMin" "InetAddress" "UPnP"
sed_options "Preferences" "Bittorrent" \
"DHT" "Encryption" "LSD" "MaxConnecs" "MaxConnecsPerTorrent" "MaxRatio" \
"MaxRatioAction" "MaxUploads" "MaxUploadsPerTorrent" "PeX" "uTP_rate_limited"
sed_options "Preferences" "Advanced" \
"AnnounceToAllTrackers" "AnonymousMode" "IgnoreLimitsLAN" "IncludeOverhead" "osCache" "OutgoingPortsMax" \
"OutgoingPortsMin" "SuperSeeding"
sed_options "Application" "FileLogger" \
"Enabled" "Path" "Backup" "DeleteOld" "MaxSizeBytes" "Age" "AgeType"
fi
}
start()
{
stop
local profile_path
config_load 'qbittorrent'
config_foreach get_config basic
[ $enable -eq 0 ] && exit 0
config_foreach run_qbittorrent 'basic'
init_QBT(){
local section="$1"
QBT_INSTANCE="${NAME}.${section}"
validate_QBT "$section" || { _err "Validation failed."; return 1; }
[ x"$enabled" = x0 ] && {
_info "Instance \"${section}\" disabled.";
procd_kill "$NAME" "$QBT_INSTANCE" >/dev/null 2>&1;
return 1;
}
local confdir="qBittorrent"
[ -n "$configuration" ] && {
confdir="qBittorrent_$configuration"
}
[ -d "$profile/$confdir/config" ] || {
mkdir -m 0755 -p "$profile/$confdir/config"
}
[ "$user" != "root" ] && {
[ -d "$confdir" ] && {
local groupnow="$(ls -l $profile | grep $confdir | awk '{print $3})"
local usernow="$(ls -l $profile | grep $confdir | awk '{print $4})"
[ "$usernow" != "$user" ] && { _err "Permission denied!"; return 1; }
} || {
chmod -R g+w "$profile/$confdir"
chown -R "$user":"$user" "$profile/$confdir"
}
}
[ "$AuthSubnetWhitelistEnabled" = true ] && {
AuthSubnetWhitelist="$( echo $AuthSubnetWhitelist | sed 's/ /,/g')"
} || {
AuthSubnetWhitelist="@Invalid()"
}
QBT_INI_FILE="$profile/$confdir/config/qBittorrent.conf"
config_QBT
procd_open_instance $QBT_INSTANCE
procd_set_param command $args
procd_append_param command --profile="$profile"
[ -n "$configuration" ] && {
procd_append_param command --configuration="$configuration"
}
procd_set_param respawn
procd_set_param user $user
procd_set_param file $QBT_INI_FILE
procd_set_param pidfile $QBT_PID_FILE
procd_close_instance
}
stop()
service_triggers()
{
killall qbittorrent-nox >/dev/null 2>&1
return 0
procd_add_reload_trigger "$NAME"
}
start_service() {
config_load "$NAME"
config_foreach init_QBT "$NAME"
}
reload_service() {
restart
}
restart() {
stop
sleep 2
start
}

View File

@ -0,0 +1,21 @@
#!/bin/sh
uci -q batch <<-EOF >/dev/null
delete ucitrack.@qbittorrent[-1]
add ucitrack qbittorrent
set ucitrack.@qbittorrent[-1].init=qbittorrent
commit ucitrack
EOF
if [ ."$(uci -q get qbittorrent.main)" != ."qbittorrent" ]; then
uci -q batch <<-EOF >/dev/null
add qbittorrent qbittorrent
rename qbittorrent.@qbittorrent[-1]="main"
set qbittorrent.main.enabled=0
set qbittorrent.main.profile="/tmp"
commit qbittorrent
EOF
fi
rm -f /tmp/luci-indexcache
exit 0

View File

@ -1,12 +0,0 @@
#!/bin/sh
uci -q batch <<-EOF >/dev/null
delete ucitrack.@qbittorrent[-1]
add ucitrack qbittorrent
set ucitrack.@qbittorrent[-1].init=qbittorrent
commit ucitrack
EOF
/etc/init.d/qbittorrent stop
rm -f /tmp/luci-indexcache
exit 0

View File

@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=rblibtorrent
PKG_VERSION:=1.1.13
PKG_RELEASE=1
PKG_RELEASE=2
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/arvidn/libtorrent.git
@ -41,12 +41,15 @@ EXTRA_CXXFLAGS += $(if $(CONFIG_GCC_VERSION_4_8),-std=gnu++11,-std=gnu++14)
TARGET_LDFLAGS += -lstdc++
CONFIGURE_ARGS += \
--prefix /usr \
--enable-shared \
--enable-static \
--disable-debug \
--disable-rpath \
--enable-encryption \
--with-boost=$(STAGING_DIR)/usr
--enable-deprecated-functions \
--with-gnu-ld \
--with-openssl=$(STAGING_DIR)/usr \
--with-boost=$(STAGING_DIR)/usr \
--with-libiconv \
--with-libiconv-prefix=$(ICONV_PREFIX)
define Build/Configure
cd $(PKG_BUILD_DIR) ; \