Docker services on my home NAS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

861 lines
27 KiB

/*
* Copyright (C) 2015 Binux <roy@binux.me>
*
* This file is part of YAAW (https://github.com/binux/yaaw).
*
* YAAW is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* YAAW is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You may get a copy of the GNU Lesser General Public License
* from http://www.gnu.org/licenses/lgpl.txt
*
*/
if (typeof ARIA2=="undefined"||!ARIA2) var ARIA2=(function(){
var jsonrpc_interface, jsonrpc_protocol, jsonrpc_ws, interval_id, rpc_secret = null,
unique_id = 0, ws_callback = {};
var active_tasks_snapshot="", finished_tasks_list=undefined, tasks_cnt_snapshot="", select_lock=false, need_refresh=false;
var auto_refresh=false;
function get_error(result) {
if (typeof result == "string")
return result;
else if (typeof result.error == "string")
return result.error;
else if (result.error && result.error.message)
return result.error.message;
}
function default_error(result) {
//console.debug(result);
var error_msg = get_error(result);
$("#main-alert .alert").attr("class", "alert alert-error");
$("#main-alert .alert-msg").html("<strong>Error: </strong>"+error_msg);
$("#main-alert").show();
}
function main_alert(_class, msg, timeout) {
var msg_id = (new Date()).getTime();
$("#main-alert .alert").attr("class", "alert "+_class);
$("#main-alert .alert-msg").html(msg);
$("#main-alert").data("msg_id", msg_id).show();
if (timeout) {
window.setTimeout(function() {
if($("#main-alert").data("msg_id") == msg_id) {
$("#main-alert").fadeOut();
}
}, timeout);
}
return msg_id;
}
function bind_event(dom) {
dom.find("[rel=tooltip]").tooltip({"placement": "bottom", trigger : 'hover'});
}
function get_title(result) {
var dir = result.dir;
var title = "Unknown";
if (result.bittorrent && result.bittorrent.info && result.bittorrent.info.name)
title = result.bittorrent.info.name;
else if (result.files[0].path && result.files[0].path.replace(
new RegExp("^"+dir.replace(/\\/g, "/").replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')+"/?"), "").split("/").length) {
title = result.files[0].path.replace(new RegExp("^"+dir.replace(/\\/g, "/").replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')+"/?"), "").split("/");
if (result.bittorrent)
title = title[0];
else
title = title[title.length-1];
} else if (result.files.length && result.files[0].uris.length && result.files[0].uris[0].uri)
title = result.files[0].uris[0].uri;
if (result.files.length > 1) {
var cnt = 0;
for (var i=0; i<result.files.length; i++) {
if (result.files[i].selected == "true")
cnt += 1;
}
if (cnt > 1)
title += " ("+cnt+ " files..)"
}
return title;
}
function request_auth(url) {
return url.match(/^(?:(?![^:@]+:[^:@\/]*@)[^:\/?#.]+:)?(?:\/\/)?(?:([^:@]*(?::[^:@]*)?)?@)?/)[1];
}
function remove_auth(url) {
return url.replace(/^((?![^:@]+:[^:@\/]*@)[^:\/?#.]+:)?(\/\/)?(?:(?:[^:@]*(?::[^:@]*)?)?@)?(.*)/, '$1$2$3');
}
return {
init: function(path, onready) {
var connect_msg_id = main_alert("alert-info", "connecting...");
$("#add-task-option-wrap").empty().append(YAAW.tpl.add_task_option({}));
$("#aria2-gsetting").empty().append(YAAW.tpl.aria2_global_setting({}));
jsonrpc_interface = path || location.protocol+"//"+(location.host.split(":")[0]||"localhost")+":6800"+"/jsonrpc";
var auth_str = request_auth(jsonrpc_interface);
if (auth_str && auth_str.indexOf('token:') == 0) {
rpc_secret = auth_str;
jsonrpc_interface = remove_auth(jsonrpc_interface);
}
if (jsonrpc_interface.indexOf("http") == 0) {
jsonrpc_protocol = "http";
$.jsonRPC.setup({endPoint: jsonrpc_interface, namespace: 'aria2'});
ARIA2.request = ARIA2.request_http;
ARIA2.batch_request = ARIA2.batch_request_http;
if (onready) onready();
if ($("#main-alert").data("msg_id") == connect_msg_id) {
$("#main-alert").fadeOut();
}
} else if (jsonrpc_interface.indexOf("ws") == 0 && WebSocket) {
jsonrpc_protocol = "ws"
jsonrpc_ws = new WebSocket(jsonrpc_interface);
jsonrpc_ws.onmessage = function(event) {
var data = JSON.parse(event.data);
//console.debug(data);
if ($.isArray(data) && data.length) {
var id = data[0].id;
if (ws_callback[id]) {
ws_callback[id].success(data);
delete ws_callback[id];
}
} else {
if (ws_callback[data.id]) {
if (data.error)
ws_callback[data.id].error(data);
else
ws_callback[data.id].success(data);
delete ws_callback[data.id];
};
};
};
jsonrpc_ws.onerror = function(event) {
console.warn("error", event);
main_alert("alert-error", "websocket error. you may need reflush this page to restart.");
ws_callback = {};
};
jsonrpc_ws.onopen = function() {
ARIA2.request = ARIA2.request_ws;
ARIA2.batch_request = ARIA2.batch_request_ws;
if (onready) onready();
if ($("#main-alert").data("msg_id") == connect_msg_id) {
$("#main-alert").fadeOut();
}
};
} else {
main_alert("alert-error", "Unknown protocol");
};
},
request: function(){},
batch_request: function(){},
request_http: function(method, params, success, error) {
if (error == undefined)
error = default_error;
if (rpc_secret) {
params = params || [];
if (!$.isArray(params)) params = [params];
params.unshift(rpc_secret);
}
$.jsonRPC.request(method, {params:params, success:success, error:error});
},
batch_request_http: function(method, params, success, error) {
if (error == undefined)
error = default_error;
var commands = new Array();
$.each(params, function(i, n) {
n = n || [];
if (!$.isArray(n)) n = [n];
if (rpc_secret) {
n.unshift(rpc_secret);
}
commands.push({method: method, params: n});
});
$.jsonRPC.batchRequest(commands, {success:success, error:error});
},
_request_data: function(method, params, id) {
var dataObj = {
jsonrpc: '2.0',
method: 'aria2.'+method,
id: id
}
if(typeof(params) !== 'undefined') {
dataObj.params = params;
}
return dataObj;
},
_get_unique_id: function() {
++unique_id;
return unique_id;
},
request_ws: function(method, params, success, error) {
var id = ARIA2._get_unique_id();
ws_callback[id] = {
'success': success || function(){},
'error': error || default_error,
};
if (rpc_secret) {
params = params || [];
if (!$.isArray(params)) params = [params];
params.unshift(rpc_secret);
}
jsonrpc_ws.send(JSON.stringify(ARIA2._request_data(method, params, id)));
},
batch_request_ws: function(method, params, success, error) {
var data = [];
var id = ARIA2._get_unique_id();
ws_callback[id] = {
'success': success || function(){},
'error': error || default_error,
};
for (var i=0,l=params.length; i<l; i++) {
var n = params[i];
n = n || [];
if (!$.isArray(n)) n = [n];
if (rpc_secret) {
n.unshift(rpc_secret);
}
data.push(ARIA2._request_data(method, n, id))
};
jsonrpc_ws.send(JSON.stringify(data));
},
main_alert: main_alert,
add_task: function(uri, options) {
if (!uri) return false;
if (!$.isArray(uri)) uri = [uri];
if (!options) options = {};
ARIA2.request("addUri", [uri, options],
function(result) {
//console.debug(result);
ARIA2.refresh();
$("#add-task-modal").modal('hide');
YAAW.add_task.clean();
},
function(result) {
//console.debug(result);
var error_msg = get_error(result);
$("#add-task-alert .alert-msg").text(error_msg);
$("#add-task-alert").show();
console.warn("add task error: "+error_msg);
});
},
madd_task: function(uris, options) {
if (!$.isArray(uris)) uris = [uris];
var params = [];
for (var i=0; i<uris.length; i++) {
var uri = uris[i].trim();
if (uri) params.push([[uri], options]);
};
ARIA2.batch_request("addUri", params,
function(result) {
//console.debug(result);
var error = new Array();
$.each(result, function(i, n) {
var error_msg = get_error(n);
if (error_msg) error.push(error_msg);
});
if (error.length == 0) {
ARIA2.refresh();
$("#add-task-modal").modal('hide');
YAAW.add_task.clean();
} else {
var error_msg = error.join("<br />");
$("#add-task-alert .alert-msg").html(error_msg);
$("#add-task-alert").show();
console.warn("add task error: "+error_msg);
}
}
);
},
add_torrent: function(torrent, options) {
if (!torrent) return false;
if (!options) options = {};
ARIA2.request("addTorrent", [torrent, [], options],
function(result) {
//console.debug(result);
ARIA2.refresh();
$("#add-task-modal").modal('hide');
YAAW.add_task.clean();
},
function(result) {
//console.debug(result);
var error_msg = get_error(result);
$("#add-task-alert .alert-msg").text(error_msg);
$("#add-task-alert").show();
console.warn("add task error: "+error_msg);
});
},
add_metalink: function(metalink, options) {
if (!metalink) return false;
if (!options) options = {};
ARIA2.request("addMetalink", [metalink, [], options],
function(result) {
//console.debug(result);
ARIA2.refresh();
$("#add-task-modal").modal('hide');
YAAW.add_task.clean();
},
function(result) {
//console.debug(result);
var error_msg = get_error(result);
$("#add-task-alert .alert-msg").text(error_msg);
$("#add-task-alert").show();
console.warn("add task error: "+error_msg);
});
},
restart_task: function(gids) {
if (!$.isArray(gids)) gids = [gids];
$.each(gids, function(n, gid) {
var result = $("#task-gid-"+gid).data("raw");
var uris = [];
$.each(result.files, function(n, e) {
if (e.uris.length)
uris.push(e.uris[0].uri);
});
if (result.bittorrent) {
var magnet_link = "magnet:?xt=urn:btih:"+result.infoHash;
if (result.bittorrent.info.name)
magnet_link += "&dn="+result.bittorrent.info.name;
if (result.bittorrent.announceList.length)
magnet_link += "&tr="+result.bittorrent.announceList.join("&tr=");
uris.push(magnet_link);
}
if (uris.length > 0) {
ARIA2.request("getOption", [gid], function(result) {
var options = result.result;
ARIA2.madd_task(uris, options);
});
}
});
},
tell_active: function(keys) {
if (select_lock) return;
ARIA2.request("tellActive", keys,
function(result) {
//console.debug(result);
if (select_lock) return;
if (!result.result) {
main_alert("alert-error", "<strong>Error: </strong>rpc result error.", 5000);
}
var snapshot = new Array();
$.each(result.result, function(i, e) {
snapshot.push(e.gid);
});
if (snapshot.sort().join(",") != active_tasks_snapshot) {
active_tasks_snapshot = snapshot.sort().join(",");
need_refresh = true;
if (auto_refresh && !select_lock)
ARIA2.refresh();
}
result = ARIA2.status_fix(result.result);
$("#active-tasks-table").empty().append(YAAW.tpl.active_task({"tasks": result}));
$.each(result, function(n, e) {
$("#task-gid-"+e.gid).data("raw", e);
});
bind_event($("#active-tasks-table"))
}
);
},
check_active_list: function() {
ARIA2.request("tellActive", [["gid"]],
function(result) {
//console.debug(result);
if (!result.result) {
main_alert("alert-error", "<strong>Error: </strong>rpc result error.", 5000);
}
var snapshot = new Array();
$.each(result.result, function(i, e) {
snapshot.push(e.gid);
});
if (snapshot.sort().join(",") != active_tasks_snapshot) {
active_tasks_snapshot = snapshot.sort().join(",");
need_refresh = true;
if (auto_refresh && !select_lock)
ARIA2.refresh();
}
}
);
},
tell_waiting: function(keys) {
if (select_lock) return;
var params = [0, 1000];
if (keys) params.push(keys);
ARIA2.request("tellWaiting", params,
function(result) {
if (select_lock) return;
if (!result.result) {
main_alert("alert-error", "<strong>Error: </strong>rpc result error.", 5000);
}
result = ARIA2.status_fix(result.result);
$("#waiting-tasks-table").empty().append(YAAW.tpl.other_task({"tasks": result}));
$.each(result, function(n, e) {
$("#task-gid-"+e.gid).data("raw", e);
});
bind_event($("#waiting-tasks-table"))
if ($("#other-tasks .task").length == 0)
$("#waiting-tasks-table").append($("#other-task-empty").text())
}
);
},
tell_stopped: function(keys) {
if (select_lock) return;
var params = [0, 1000];
if (keys) params.push(keys);
ARIA2.request("tellStopped", params,
function(result) {
//console.debug(result);
if (select_lock) return;
if (!result.result) {
main_alert("alert-error", "<strong>Error: </strong>rpc result error.", 5000);
}
result = ARIA2.status_fix(result.result);
if (finished_tasks_list === undefined) {
finished_tasks_list = new Array();
$.each(result, function(i, e) {
if (e.status != "complete")
return;
finished_tasks_list.push(e.gid);
});
} else {
$.each(result, function(i, e) {
if (e.status != "complete")
return;
if (finished_tasks_list.indexOf(e.gid) != -1)
return;
if (ARIA2.finish_notification) {
YAAW.notification("Aria2 Task Finished", e.title);
}
finished_tasks_list.push(e.gid);
});
}
$("#stopped-tasks-table").empty().append(YAAW.tpl.other_task({"tasks": result.reverse()}));
$.each(result, function(n, e) {
$("#task-gid-"+e.gid).data("raw", e);
});
bind_event($("#stopped-tasks-table"))
if ($("#waiting-tasks-table .empty-tasks").length > 0 &&
$("#stopped-tasks-table .task").length > 0) {
$("#waiting-tasks-table").empty();
}
}
);
},
status_fix: function(results) {
for (var i=0; i<results.length; i++) {
var result = results[i];
result.title = get_title(result);
if (result.totalLength == 0)
result.progress = 0;
else
result.progress = (result.completedLength * 1.0 / result.totalLength * 100).toFixed(2);
result.eta = (result.totalLength - result.completedLength)/result.downloadSpeed;
result.progressStatus = {
"active" : "progress-striped",
"complete": "progress-success",
"removed" : "progress-warning",
"error" : "progress-danger"
}[result.status];
result.downloadSpeed = parseInt(result.downloadSpeed);
result.uploadSpeed = parseInt(result.uploadSpeed);
result.uploadLength = parseInt(result.uploadLength);
result.completedLength = parseInt(result.completedLength);
result.numSeeders = parseInt(result.numSeeders);
result.connections = parseInt(result.connections);
}
return results;
},
change_pos: function(gid, pos, how) {
ARIA2.request("changePosition", [gid, pos, how],
function(result) {
//console.debug(result);
main_alert("alert-info", "Moved", 1000);
ARIA2.refresh();
}
);
},
change_selected_pos: function(gids, pos, how) {
var params = [];
$.each(gids, function(i, n) {
params.push([n, pos, how]);
});
ARIA2.batch_request("changePosition", params,
function(result) {
//console.debug(result);
main_alert("alert-info", "Moved", 1000);
ARIA2.refresh();
}
);
},
pause: function(gids) {
if (!$.isArray(gids)) gids = [gids];
ARIA2.batch_request("pause", gids,
function(result) {
//console.debug(result);
var error = new Array();
$.each(result, function(i, n) {
var error_msg = get_error(n);
if (error_msg) error.push(error_msg);
});
if (error.length == 0) {
main_alert("alert-info", "Paused", 1000);
ARIA2.refresh();
} else {
main_alert("alert-error", error.join("<br />"), 3000);
}
}
);
},
unpause: function(gids) {
if (!$.isArray(gids)) gids = [gids];
ARIA2.batch_request("unpause", gids,
function(result) {
//console.debug(result);
var error = new Array();
$.each(result, function(i, n) {
var error_msg = get_error(n);
if (error_msg) error.push(error_msg);
});
if (error.length == 0) {
main_alert("alert-info", "Started", 1000);
ARIA2.refresh();
} else {
main_alert("alert-error", error.join("<br />"), 3000);
}
}
);
},
remove: function(gids) {
if (!$.isArray(gids)) gids = [gids];
ARIA2.batch_request("remove", gids,
function(result) {
//console.debug(result);
var error = new Array();
$.each(result, function(i, n) {
var error_msg = get_error(n);
if (error_msg) error.push(error_msg);
});
if (error.length == 0) {
main_alert("alert-info", "Removed", 1000);
ARIA2.refresh();
} else {
main_alert("alert-error", error.join("<br />"), 3000);
}
}
);
},
remove_result: function(gids) {
if (!$.isArray(gids)) gids = [gids];
ARIA2.batch_request("removeDownloadResult", gids,
function(result) {
//console.debug(result);
var error = new Array();
$.each(result, function(i, n) {
var error_msg = get_error(n);
if (error_msg) error.push(error_msg);
});
if (error.length == 0) {
main_alert("alert-info", "Removed", 1000);
ARIA2.tell_stopped();
} else {
main_alert("alert-error", error.join("<br />"), 3000);
}
}
);
},
get_options: function(gid) {
ARIA2.request("getOption", [gid],
function(result) {
//console.debug(result);
$("#ib-options").empty().append(YAAW.tpl.ib_options(result.result));
if ($("#task-gid-"+gid).attr("data-status") == "active")
$("#ib-options-form *[name]:not(.active-allowed)").attr("disabled", true);
}
);
},
change_options: function(gid, options) {
ARIA2.request("changeOption", [gid, options],
function(result) {
//console.debug(result);
main_alert("alert-info", "option updated", 1000);
}
);
},
get_peers: function(gid) {
ARIA2.request("getPeers", [gid],
function(result) {
console.debug(result);
$("#ib-peers").empty().append(YAAW.tpl.ib_peers(result.result));
}
);
},
pause_all: function() {
ARIA2.request("pauseAll", [],
function(result) {
//console.debug(result);
ARIA2.refresh();
main_alert("alert-info", "Paused all tasks. Please wait for action such as contacting BitTorrent tracker.", 2000);
}
);
},
unpause_all: function() {
ARIA2.request("unpauseAll", [],
function(result) {
//console.debug(result);
ARIA2.refresh();
main_alert("alert-info", "Unpaused all tasks.", 2000);
}
);
},
purge_download_result: function() {
ARIA2.request("purgeDownloadResult", [],
function(result) {
//console.debug(result);
ARIA2.refresh();
main_alert("alert-info", "Removed all completed/error/removed downloads tasks.", 2000);
}
);
},
get_global_option: function() {
ARIA2.request("getGlobalOption", [],
function(result) {
if (!result.result)
main_alert("alert-error", "<strong>Error: </strong>rpc result error.", 5000);
result = result.result;
$("#aria2-gsetting").empty().append(YAAW.tpl.aria2_global_setting(result));
}
);
},
init_add_task_option: function() {
ARIA2.request("getGlobalOption", [],
function(result) {
if (!result.result)
main_alert("alert-error", "<strong>Error: </strong>rpc result error.", 5000);
result = result.result;
result["parameterized-uri"] = (result["parameterized-uri"] == "true" ? true : false)
$("#add-task-option-wrap").empty().append(YAAW.tpl.add_task_option(result));
}
);
},
change_global_option: function(options) {
ARIA2.request("changeGlobalOption", [options],
function(result) {
if (!result.result)
main_alert("alert-error", "<strong>Error: </strong>rpc result error.", 5000);
else
main_alert("alert-success", "Saved", 2000);
}
);
},
global_stat: function() {
ARIA2.request("getGlobalStat", [],
function(result) {
if (!result.result) {
main_alert("alert-error", "<strong>Error: </strong>rpc result error.", 5000);
}
result = result.result;
var _tasks_cnt_snapshot = ""+result.numActive+","+result.numWaiting+","+result.numStopped;
if (_tasks_cnt_snapshot != tasks_cnt_snapshot) {
tasks_cnt_snapshot = _tasks_cnt_snapshot;
need_refresh = true;
if (auto_refresh && !select_lock)
ARIA2.refresh();
}
$("#global-speed").empty().append(YAAW.tpl.global_speed(result));
var title = "↓"+YAAW.tpl.view.format_size_0()(result.downloadSpeed);
if (result.uploadSpeed > 0)
title += " ↑"+YAAW.tpl.view.format_size_0()(result.uploadSpeed);
title += " - YAAW@NAS64";
document.title = title;
}
);
},
get_version: function() {
ARIA2.request("getVersion", [],
function(result) {
if (!result.result) {
main_alert("alert-error", "<strong>Error: </strong>rpc result error.", 5000);
}
$("#global-version").text("Aria2 "+result.result.version || "");
}
);
},
get_status: function(gid) {
ARIA2.request("tellStatus", [gid],
function(result) {
if (!result.result) {
main_alert("alert-error", "<strong>Error: </strong>rpc result error.", 5000);
}
result = result.result;
result.uris = [];
for (var i=0; i<result.files.length; i++) {
var file = result.files[i];
file.title = file.path.replace(new RegExp("^"+result.dir.replace(/\\/g, "[\\/]")+"/?"), "");
file.selected = file.selected == "true" ? true : false;
if (file.uris && file.uris.length) {
for (var j=0; j<file.uris.length; j++) {
var uri = file.uris[j].uri;
if (result.uris.indexOf(uri) == -1) {
result.uris.push(uri);
}
}
}
};
console.log(result.uris);
$("#ib-status").empty().append(YAAW.tpl.ib_status(result));
$("#ib-files .file-list").empty().append(YAAW.tpl.files_tree(result.files));
if ($("#task-gid-"+gid).attr("data-status") == "active")
$("#ib-file-save").hide();
if (result.bittorrent) {
$("#ib-peers-a").show();
}
}
);
},
change_option: function(gid, options) {
ARIA2.request("changeOption", [gid, options],
function(result) {
if (!result.result) {
main_alert("alert-error", "<strong>Error: </strong>rpc result error.", 5000);
} else {
main_alert("alert-success", "Change Options OK!", 2000);
}
}
);
},
/********************************************************/
refresh: function() {
if (!select_lock) {
need_refresh = false;
ARIA2.tell_active();
ARIA2.tell_waiting();
ARIA2.tell_stopped();
}
},
select_lock: function (bool) {
select_lock = bool;
},
auto_refresh: function(interval) {
if (interval_id)
window.clearInterval(interval_id);
if (!(interval > 0)) {
auto_refresh = false;
return ;
}
interval_id = window.setInterval(function() {
ARIA2.global_stat();
if (select_lock) {
if (need_refresh) {
main_alert("", "Task list have changed since last update. Click 'Refresh' button to update task list.");
}
} else {
if (need_refresh) {
ARIA2.refresh();
} else {
ARIA2.tell_active();
}
}
}, interval);
auto_refresh = true;
},
finish_notification: 1,
}
})();