summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-app-aria2/luasrc
diff options
context:
space:
mode:
Diffstat (limited to 'applications/luci-app-aria2/luasrc')
-rw-r--r--applications/luci-app-aria2/luasrc/controller/aria2.lua42
-rw-r--r--applications/luci-app-aria2/luasrc/model/cbi/aria2.lua196
-rw-r--r--applications/luci-app-aria2/luasrc/view/aria2/web_script.htm77
3 files changed, 315 insertions, 0 deletions
diff --git a/applications/luci-app-aria2/luasrc/controller/aria2.lua b/applications/luci-app-aria2/luasrc/controller/aria2.lua
new file mode 100644
index 000000000..17289305d
--- /dev/null
+++ b/applications/luci-app-aria2/luasrc/controller/aria2.lua
@@ -0,0 +1,42 @@
+--[[
+LuCI - Lua Configuration Interface - aria2 support
+
+Copyright 2014-2015 nanpuyue <nanpuyue@gmail.com>
+Modified by kuoruan <kuoruan@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+]]--
+
+module("luci.controller.aria2", package.seeall)
+
+function index()
+ if not nixio.fs.access("/etc/config/aria2") then
+ return
+ end
+
+ local page = entry({"admin", "services", "aria2"}, cbi("aria2"), _("Aria2 Settings"))
+ page.dependent = true
+
+ entry({"admin", "services", "aria2", "status"}, call("status")).leaf = true
+
+end
+
+function status()
+ local sys = require "luci.sys"
+ local ipkg = require "luci.model.ipkg"
+ local http = require "luci.http"
+ local uci = require "luci.model.uci".cursor()
+
+ local status = {
+ running = (sys.call("pidof aria2c > /dev/null") == 0),
+ yaaw = ipkg.installed("yaaw"),
+ webui = ipkg.installed("webui-aria2")
+ }
+
+ http.prepare_content("application/json")
+ http.write_json(status)
+end
diff --git a/applications/luci-app-aria2/luasrc/model/cbi/aria2.lua b/applications/luci-app-aria2/luasrc/model/cbi/aria2.lua
new file mode 100644
index 000000000..780aea33d
--- /dev/null
+++ b/applications/luci-app-aria2/luasrc/model/cbi/aria2.lua
@@ -0,0 +1,196 @@
+--[[
+LuCI - Lua Configuration Interface - Aria2 support
+
+Copyright 2014-2016 nanpuyue <nanpuyue@gmail.com>
+Modified by maz-1 <ohmygod19993@gmail.com>
+Modified by kuoruan <kuoruan@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+]]--
+
+local sys = require "luci.sys"
+local util = require "luci.util"
+local uci = require "luci.model.uci".cursor()
+
+local cfgbtn = "<input type=\"button\" value=\"" .. translate("Generate Randomly") .. "\" onclick=\"randomSecret(32);\" />"
+local sessionbtn = "<input class=\"cbi-button mar-10\" type=\"button\" value=\"" .. translate("View Json-RPC URL") .. "\" onclick=\"showRPCURL();\" />"
+local aria2rpctxt = "<input class=\"mar-10\" id=\"aria2rpcpath\" onmouseover=\"obj=document.getElementById(this.id);obj.focus();obj.select()\" />"
+local use_websocket = "<input id=\"use_websocket\" type=\"checkbox\" /><label for=\"use_websocket\">" .. translate("Use WebSocket") .. "</label>"
+
+function ipkg_ver(pkg)
+ local version = nil
+ local control = io.open("/usr/lib/opkg/info/%s.control" % pkg, "r")
+ if control then
+ local ln
+ repeat
+ ln = control:read("*l")
+ if ln and ln:match("^Version: ") then
+ version = ln:gsub("^Version: ", ""):gsub("-%d", "")
+ break
+ end
+ until not ln
+ control:close()
+ end
+ return version
+end
+
+function ipkg_ver_lined(pkg)
+ return ipkg_ver(pkg):gsub("%.", "-")
+end
+
+m = Map("aria2", translate("Aria2"), translate("Aria2 is a multi-protocol &amp; multi-source download utility, here you can configure the settings."))
+
+m:section(SimpleSection).template = "aria2/web_script"
+
+s = m:section(TypedSection, "aria2", translate("Aria2 Settings"))
+s.addremove = false
+s.anonymous = true
+
+s:tab("general", translate("General Settings"))
+s:tab("file", translate("Files and Locations"))
+s:tab("task", translate("Task Settings"))
+s:tab("bittorrent", translate("BitTorrent Settings"))
+
+o = s:taboption("general", Flag, "enabled", translate("Enabled"))
+o.rmempty = false
+
+user = s:taboption("general", ListValue, "user", translate("Run daemon as user"))
+local p_user
+for _, p_user in util.vspairs(util.split(sys.exec("cat /etc/passwd | cut -f 1 -d :"))) do
+ user:value(p_user)
+end
+
+o = s:taboption("general", Value, "rpc_listen_port", translate("RPC port"))
+o.datatype = "port"
+o.placeholder = "6800"
+
+rpc_auth_method = s:taboption("general", ListValue, "rpc_auth_method", translate("RPC authentication method"))
+rpc_auth_method:value("none", translate("No Authentication"))
+rpc_auth_method:value("user_pass", translate("Username & Password"))
+rpc_auth_method:value("token", translate("Token"))
+
+o = s:taboption("general", Value, "rpc_user", translate("RPC username"))
+o:depends("rpc_auth_method", "user_pass")
+o.rmempty = false
+
+o = s:taboption("general", Value, "rpc_passwd", translate("RPC password"))
+o:depends("rpc_auth_method", "user_pass")
+o.password = true
+o.rmempty = false
+
+o = s:taboption("general", Value, "rpc_secret", translate("RPC Token"), "<br/>" .. cfgbtn)
+o:depends("rpc_auth_method", "token")
+o.rmempty = false
+
+o = s:taboption("file", Value, "config_dir", translate("Config file directory"))
+o.placeholder = "/var/etc/aria2"
+
+o = s:taboption("file", Value, "dir", translate("Default download directory"))
+o.rmempty = false
+
+s:taboption("file", Value, "disk_cache", translate("Disk cache"), translate("in bytes, You can append K or M."))
+
+o = s:taboption("file", ListValue, "file_allocation", translate("Preallocation"), translate("\"Falloc\" is not available in all cases."))
+o:value("none", translate("Off"))
+o:value("prealloc", translate("Prealloc"))
+o:value("trunc", translate("Trunc"))
+o:value("falloc", translate("Falloc"))
+
+overall_speed_limit = s:taboption("task", Flag, "overall_speed_limit", translate("Overall speed limit enabled"))
+
+o = s:taboption("task", Value, "max_overall_download_limit", translate("Overall download limit"), translate("in bytes/sec, You can append K or M."))
+o:depends("overall_speed_limit", "1")
+
+o = s:taboption("task", Value, "max_overall_upload_limit", translate("Overall upload limit"), translate("in bytes/sec, You can append K or M."))
+o:depends("overall_speed_limit", "1")
+
+task_speed_limit = s:taboption("task", Flag, "task_speed_limit", translate("Per task speed limit enabled"))
+
+o = s:taboption("task", Value, "max_download_limit", translate("Per task download limit"), translate("in bytes/sec, You can append K or M."))
+o:depends("task_speed_limit", "1")
+
+o = s:taboption("task", Value, "max_upload_limit", translate("Per task upload limit"), translate("in bytes/sec, You can append K or M."))
+o:depends("task_speed_limit", "1")
+
+o = s:taboption("task", Value, "max_concurrent_downloads", translate("Max concurrent downloads"))
+o.placeholder = "5"
+
+o = s:taboption("task", Value, "max_connection_per_server", translate("Max connection per server"), "1-16")
+o.datetype = "range(1, 16)"
+o.placeholder = "1"
+
+o = s:taboption("task", Value, "min_split_size", translate("Min split size"), "1M-1024M")
+o.placeholder = "20M"
+
+o = s:taboption("task", Value, "split", translate("Max number of split"))
+o.placeholder = "5"
+
+o = s:taboption("task", Value, "save_session_interval", translate("Autosave session interval"), translate("Sec"))
+o.default = "30"
+
+o = s:taboption("task", Value, "user_agent", translate("User agent value"))
+o.placeholder = "aria2/" .. ipkg_ver("aria2")
+
+o = s:taboption("bittorrent", Flag, "enable_dht", translate("<abbr title=\"Distributed Hash Table\">DHT</abbr> enabled"))
+o.enabled = "true"
+o.disabled = "false"
+
+o = s:taboption("bittorrent", Flag, "bt_enable_lpd", translate("<abbr title=\"Local Peer Discovery\">LPD</abbr> enabled"))
+o.enabled = "true"
+o.disabled = "false"
+
+o = s:taboption("bittorrent", Flag, "follow_torrent", translate("Follow torrent"))
+o.enabled = "true"
+o.disabled = "false"
+
+o = s:taboption("bittorrent", Value, "listen_port", translate("BitTorrent listen port"))
+o.placeholder = "6881-6999"
+
+o = s:taboption("bittorrent", Value, "bt_max_peers", translate("Max number of peers per torrent"))
+o.placeholder = "55"
+
+bt_tracker_enable = s:taboption("bittorrent", Flag, "bt_tracker_enable", translate("Additional Bt tracker enabled"))
+bt_tracker = s:taboption("bittorrent", DynamicList, "bt_tracker", translate("List of additional Bt tracker"))
+bt_tracker:depends("bt_tracker_enable", "1")
+bt_tracker.rmempty = true
+
+function bt_tracker.cfgvalue(self, section)
+ local rv = {}
+ local val = Value.cfgvalue(self, section)
+ if type(val) == "table" then
+ val = table.concat(val, ",")
+ elseif not val then
+ val = ""
+ end
+ for v in val:gmatch("[^,%s]+") do
+ rv[#rv+1] = v
+ end
+ return rv
+end
+
+function bt_tracker.write(self, section, value)
+ local rv = {}
+ for v in util.imatch(value) do
+ rv[#rv+1] = v
+ end
+ Value.write(self, section, table.concat(rv, ","))
+end
+
+o = s:taboption("bittorrent", Value, "peer_id_prefix", translate("Prefix of peer ID"))
+o.placeholder = "A2-" .. ipkg_ver_lined("aria2") .. "-"
+
+s = m:section(TypedSection, "aria2", translate("Extra Settings"))
+s.addremove = false
+s.anonymous = true
+
+o = s:option(DynamicList, "extra_settings", translate("List of extra settings"))
+o.placeholder = "option=value"
+o.rmempty = true
+
+m:section(SimpleSection, nil, sessionbtn .. use_websocket .. aria2rpctxt)
+
+return m
diff --git a/applications/luci-app-aria2/luasrc/view/aria2/web_script.htm b/applications/luci-app-aria2/luasrc/view/aria2/web_script.htm
new file mode 100644
index 000000000..933c6af70
--- /dev/null
+++ b/applications/luci-app-aria2/luasrc/view/aria2/web_script.htm
@@ -0,0 +1,77 @@
+<script type="text/javascript">//<![CDATA[
+XHR.poll(5, '<%=url([[admin]], [[services]], [[aria2]], [[status]])%>', null,
+ function(x, data) {
+ var tb = document.getElementById('aria2_status');
+ if (data && tb) {
+ if (data.running) {
+ var links = '<em><%:The Aria2 service is running.%></em>';
+ if (data.yaaw) {
+ links += '<input class="cbi-button mar-10" type="button" value="<%:Open YAAW%>" onclick="openWebUI(\'yaaw\');" />';
+ }
+ if (data.webui) {
+ links += '<input class="cbi-button mar-10" type="button" value="<%:Open WebUI-Aria2%>" onclick="openWebUI(\'webui-aria2\');" />';
+ }
+ tb.innerHTML = links;
+ } else {
+ tb.innerHTML = '<em><%:The Aria2 service is not running.%></em>';
+ }
+ }
+ }
+);
+
+function randomString(len) {
+ len = len || 32;
+ var $chars = 'abcdefghijklmnopqrstuvwxyz1234567890';
+ var maxPos = $chars.length;
+ var pwd = '';
+ for (i = 0; i < len; i++) {
+ pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
+ }
+ return pwd;
+};
+
+function randomSecret() {
+ var Token = document.getElementById("cbid.aria2.main.rpc_secret");
+ Token.value = randomString(32);
+};
+
+function showRPCURL() {
+ var websocket = document.getElementById("use_websocket");
+ var protocol = (websocket.checked) ? "ws" : "http";
+ var newTextNode = document.getElementById("aria2rpcpath");
+ var auth_method = document.getElementById("cbid.aria2.main.rpc_auth_method");
+ var auth_port = document.getElementById("cbid.aria2.main.rpc_listen_port");
+ if (auth_port.value == "") {
+ auth_port_value = "6800"
+ } else {
+ auth_port_value = auth_port.value
+ };
+ if (auth_method.value == "token") {
+ var auth_token = document.getElementById("cbid.aria2.main.rpc_secret");
+ newTextNode.value = protocol + "://token:" + auth_token.value + "@" + document.domain + ":" + auth_port_value + "/jsonrpc";
+ } else if (auth_method.value == "user_pass") {
+ var auth_user = document.getElementById("cbid.aria2.main.rpc_user");
+ var auth_passwd = document.getElementById("cbid.aria2.main.rpc_passwd");
+ newTextNode.value = protocol + "://" + auth_user.value + ":" + auth_passwd.value + "@" + document.domain + ":" + auth_port_value + "/jsonrpc";
+ } else {
+ newTextNode.value = protocol + "://" + document.domain + ":" + auth_port_value + "/jsonrpc";
+ }
+};
+
+function openWebUI(path) {
+ var curWwwPath = window.document.location.href;
+ var pathName = window.document.location.pathname;
+ var pos = curWwwPath.indexOf(pathName);
+ var localhostPath = curWwwPath.substring(0, pos);
+ var url = "http:" + localhostPath.substring(window.location.protocol.length) + "/" + path;
+ window.open(url)
+};
+//]]>
+</script>
+<style>.mar-10 {margin-left: 10px; margin-right: 10px;}</style>
+<fieldset class="cbi-section">
+ <legend><%:Aria2 Status%></legend>
+ <p id="aria2_status">
+ <em><%:Collecting data...%></em>
+ </p>
+</fieldset>