diff --git a/applications/luci-app-attendedsysupgrade/luasrc/controller/attendedsysupgrade.lua b/applications/luci-app-attendedsysupgrade/luasrc/controller/attendedsysupgrade.lua
deleted file mode 100644
index 1bd050af6691..000000000000
--- a/applications/luci-app-attendedsysupgrade/luasrc/controller/attendedsysupgrade.lua
+++ /dev/null
@@ -1,5 +0,0 @@
-module("luci.controller.attendedsysupgrade", package.seeall)
-
-function index()
- entry({"admin", "system", "attended_sysupgrade"}, template("attendedsysupgrade"), _("Attended Sysupgrade"), 1)
-end
diff --git a/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm b/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm
deleted file mode 100644
index c9259559be09..000000000000
--- a/applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm
+++ /dev/null
@@ -1,123 +0,0 @@
-<%
--- all lua code provided by https://github.com/jow-/
--- thank you very much!
-
- function apply_acls(filename, session)
- local json = require "luci.jsonc"
- local util = require "luci.util"
- local fs = require "nixio.fs"
-
- local grants = { }
-
- local acl = json.parse(fs.readfile(filename))
- if type(acl) ~= "table" then
- return
- end
-
- local group, perms
- for group, perms in pairs(acl) do
- local perm, scopes
- for perm, scopes in pairs(perms) do
- if type(scopes) == "table" then
- local scope, objects
- for scope, objects in pairs(scopes) do
- if type(objects) == "table" then
- if not grants[scope] then
- grants[scope] = { }
- end
-
- if next(objects) == 1 then
- local _, object
- for _, object in ipairs(objects) do
- if not grants[scope][object] then
- grants[scope][object] = { }
- end
- table.insert(grants[scope][object], perm)
- end
- else
- local object, funcs
- for object, funcs in pairs(objects) do
- if type(funcs) == "table" then
- local _, func
- for _, func in ipairs(funcs) do
- if not grants[scope][object] then
- grants[scope][object] = { }
- end
- table.insert(grants[scope][object], func)
- end
- end
- end
- end
- end
- end
- end
- end
- end
-
- local _, scope, object, func
- for scope, _ in pairs(grants) do
- local objects = { }
- for object, _ in pairs(_) do
- for _, func in ipairs(_) do
- table.insert(objects, { object, func })
- end
- end
-
- util.ubus("session", "grant", {
- ubus_rpc_session = session,
- scope = scope, objects = objects
- })
- end
- end
-
- apply_acls("/usr/share/rpcd/acl.d/attendedsysupgrade.json", luci.dispatcher.context.authsession)
-%>
-<%+header%>
-
<%:Attended Sysupgrade%>
-
- Easily search and install new releases and package upgrades. Sysupgrade firmware are created on demand based on locally installed packages.
-
-
-
-
-
-
-
-
-
-
-
-<%+footer%>
diff --git a/applications/luci-app-attendedsysupgrade/po/templates/attendedsysupgrade.pot b/applications/luci-app-attendedsysupgrade/po/templates/attendedsysupgrade.pot
deleted file mode 100644
index f5f87dd3172a..000000000000
--- a/applications/luci-app-attendedsysupgrade/po/templates/attendedsysupgrade.pot
+++ /dev/null
@@ -1,7 +0,0 @@
-msgid ""
-msgstr "Content-Type: text/plain; charset=UTF-8"
-
-#: applications/luci-app-attendedsysupgrade/luasrc/controller/attendedsysupgrade.lua:4
-#: applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm:76
-msgid "Attended Sysupgrade"
-msgstr ""
diff --git a/applications/luci-app-attendedsysupgrade/root/www/luci-static/resources/attendedsysupgrade.js b/applications/luci-app-attendedsysupgrade/root/www/luci-static/resources/attendedsysupgrade.js
deleted file mode 100644
index 2cf5cc6e1b47..000000000000
--- a/applications/luci-app-attendedsysupgrade/root/www/luci-static/resources/attendedsysupgrade.js
+++ /dev/null
@@ -1,427 +0,0 @@
-function $(s) {
- return document.getElementById(s.substring(1));
-}
-
-function show(s) {
- $(s).style.display = 'block';
-}
-
-function hide(s) {
- $(s).style.display = 'none';
-}
-
-function set_server() {
- hide("#status_box");
- data.url = $("#server").value;
- ubus_call("uci", "set", {
- "config": "attendedsysupgrade",
- "section": "server",
- values: {
- "url": data.url
- }
- })
- ubus_call("uci", "commit", {
- "config": "attendedsysupgrade"
- })
- var server_button = $("#server")
- server_button.type = 'button';
- server_button.className = 'cbi-button cbi-button-edit';
- server_button.parentElement.removeChild($("#button_set"));
- server_button.onclick = edit_server;
-}
-
-function edit_server() {
- $("#server").type = 'text';
- $("#server").onkeydown = function(event) {
- if (event.key === 'Enter') {
- set_server();
- return false;
- }
- }
- $("#server").className = '';
- $("#server").onclick = null;
-
- var button_set = document.createElement("input");
- button_set.type = "button";
- button_set.value = "Save";
- button_set.name = "button_set";
- button_set.id = "button_set";
- button_set.className = 'cbi-button cbi-button-save';
- button_set.onclick = set_server
- $("#server").parentElement.appendChild(button_set);
-}
-
-function edit_packages() {
- data.edit_packages = true
- hide("#edit_button");
- $("#edit_packages").value = data.packages.join("\n");
- show("#edit_packages");
-}
-
-// requests to the upgrade server
-function server_request(path, callback) {
- var request = new XMLHttpRequest();
- request.open("POST", data.url + "/" + path, true);
- request.setRequestHeader("Content-type", "application/json");
- request.send(JSON.stringify(request_dict));
- request.onerror = function(e) {
- set_status("danger", "upgrade server down")
- show("#server_div");
- }
- request.addEventListener('load', function(event) {
- callback(request)
- });
-}
-
-// initial setup, get system information
-function setup() {
- ubus_call("rpc-sys", "packagelist", {}, "packages");
- ubus_call("system", "board", {}, "release");
- ubus_call("system", "board", {}, "board_name");
- ubus_call("system", "board", {}, "model");
- ubus_call("system", "info", {}, "memory");
- uci_get({
- "config": "attendedsysupgrade",
- "section": "server",
- "option": "url"
- })
- uci_get({
- "config": "attendedsysupgrade",
- "section": "client",
- "option": "upgrade_packages"
- })
- uci_get({
- "config": "attendedsysupgrade",
- "section": "client",
- "option": "advanced_mode"
- })
- uci_get({
- "config": "attendedsysupgrade",
- "section": "client",
- "option": "auto_search"
- })
- setup_ready();
-}
-
-function setup_ready() {
- // checks if a async ubus calls have finished
- if (ubus_counter != ubus_closed) {
- setTimeout(setup_ready, 300)
- } else {
- if (data.auto_search == 1) {
- upgrade_check();
- } else {
- show("#upgrade_button");
- show("#server_div");
- $("#server").value = data.url;
- }
- }
-}
-
-function uci_get(option) {
- // simple wrapper to get a uci value store in data.
- ubus_call("uci", "get", option, option["option"])
-}
-
-ubus_counter = 0;
-ubus_closed = 0;
-
-function ubus_call(command, argument, params, variable) {
- var request_data = {};
- request_data.jsonrpc = "2.0";
- request_data.id = ubus_counter;
- request_data.method = "call";
- request_data.params = [data.ubus_rpc_session, command, argument, params]
- var request_json = JSON.stringify(request_data)
- ubus_counter++;
- var request = new XMLHttpRequest();
- request.open("POST", ubus_url, true);
- request.setRequestHeader("Content-type", "application/json");
- request.onload = function(event) {
- if (request.status === 200) {
- var response = JSON.parse(request.responseText)
- if (!("error" in response) && "result" in response) {
- if (response.result.length === 2) {
- if (command === "uci") {
- data[variable] = response.result[1].value
- } else {
- data[variable] = response.result[1][variable]
- }
- }
- } else {
- set_status("danger", "Ubus call failed: Request: " + request_json + " Response: " + JSON.stringify(response))
- }
- ubus_closed++;
- }
- }
- request.send(request_json);
-}
-
-function set_status(type, message, loading, show_log) {
- $("#status_box").className = "alert-message " + type;
- var loading_image = '';
- if (loading) {
- loading_image = ' ';
- }
- if (show_log && data.log) {
- message += ' Build log
'
- }
- $("#status_box").innerHTML = loading_image + message;
- show("#status_box")
-}
-
-function upgrade_check() {
- // Asks server for new firmware
- // If data.upgrade_packages is set to true search for new package versions as well
- hide("#status_box");
- hide("#server_div");
- set_status("info", "Searching for upgrades", true);
- request_dict.distro = data.release.distribution;
- request_dict.version = data.release.version;
- request_dict.target = data.release.target;
- request_dict.revision = data.release.revision;
- request_dict.installed = data.packages;
- request_dict.upgrade_packages = data.upgrade_packages
- server_request("api/upgrade-check", upgrade_check_callback)
-}
-
-function upgrade_check_callback(request_text) {
- var request_json = JSON.parse(request_text)
-
- // create simple output to tell user what's going to be upgrade (release/packages)
- var info_output = ""
- if (request_json.version) {
- info_output += "New release " + request_json.version + " available "
- info_output += "Installed version: " + data.release.version
- request_dict.version = request_json.version;
- }
- if (request_json.upgrades) {
- if (request_json.upgrades != {}) {
- info_output += "Package upgrades available "
- for (var upgrade in request_json.upgrades) {
- info_output += "" + upgrade + " : " + request_json.upgrades[upgrade][1] + " to " + request_json.upgrades[upgrade][0] + " "
- }
- }
- }
- data.packages = request_json.packages
- set_status("success", info_output)
-
- if (data.advanced_mode == 1) {
- show("#edit_button");
- }
- var upgrade_button = $("#upgrade_button")
- upgrade_button.value = "Request firmware";
- upgrade_button.style.display = "block";
- upgrade_button.disabled = false;
- upgrade_button.onclick = upgrade_request;
-}
-
-function upgrade_request() {
- // Request firmware using the following parameters
- // distro, version, target, board_name/model, packages
- $("#upgrade_button").disabled = true;
- hide("#edit_packages");
- hide("#edit_button");
- hide("#keep_container");
-
- // remove "installed" entry as unused by build requests
- delete request_dict.installed
- // add board info to let server determine profile
- request_dict.board_name = data.board_name
- request_dict.board = data.board_name
- request_dict.model = data.model
-
- if (data.edit_packages == true) {
- request_dict.packages = $("#edit_packages").value.split("\n")
- } else {
- request_dict.packages = data.packages;
- }
- server_request("api/upgrade-request", upgrade_request_callback)
-}
-
-function upgrade_request_callback(request) {
- // ready to download
- var request_json = JSON.parse(request)
- data.files = request_json.files
- data.sysupgrade = request_json.sysupgrade
- data.log = request_json.log
-
- var info_output = 'Firmware created Created file: ' + data.sysupgrade + '
'
- set_status("success", info_output, false, true);
-
- show("#keep_container");
- var upgrade_button = $("#upgrade_button")
- upgrade_button.disabled = false;
- upgrade_button.style.display = "block";
- upgrade_button.value = "Flash firmware";
- upgrade_button.onclick = download_image;
-}
-
-function flash_image() {
- // Flash image via rpc-sys upgrade_start
- set_status("warning", "Flashing firmware. Don't unpower device", true)
- ubus_call("rpc-sys", "upgrade_start", {
- "keep": $("#keep").checked
- }, 'message');
- ping_max = 3600; // in seconds
- setTimeout(ping_ubus, 10000)
-}
-
-function ping_ubus() {
- // Tries to connect to ubus. If the connection fails the device is likely still rebooting.
- // If more time than ping_max passes update may failed
- if (ping_max > 0) {
- ping_max--;
- var request = new XMLHttpRequest();
- request.open("GET", ubus_url, true);
- request.addEventListener('error', function(event) {
- set_status("warning", "Rebooting device - please wait!", true);
- setTimeout(ping_ubus, 5000)
- });
- request.addEventListener('load', function(event) {
- set_status("success", "Success! Please reload web interface");
- $("#upgrade_button").value = "Reload page";
- show("#upgrade_button");
- $("#upgrade_button").disabled = false;
- $("#upgrade_button").onclick = function() {
- location.reload();
- }
- });
- request.send();
- } else {
- set_status("danger", "Web interface could not reconnect to your device. Please reload web interface or check device manually")
- }
-}
-
-function upload_image(blob) {
- // Uploads received blob data to the server using cgi-io
- set_status("info", "Uploading firmware to device", true);
- var request = new XMLHttpRequest();
- var form_data = new FormData();
-
- form_data.append("sessionid", data.ubus_rpc_session)
- form_data.append("filename", "/tmp/firmware.bin")
- form_data.append("filemode", 755) // insecure?
- form_data.append("filedata", blob)
-
- request.addEventListener('load', function(event) {
- request_json = JSON.parse(request.responseText)
- flash_image();
- });
-
- request.addEventListener('error', function(event) {
- set_status("danger", "Upload of firmware failed, please retry by reloading web interface")
- });
-
- request.open('POST', origin + '/cgi-bin/cgi-upload');
- request.send(form_data);
-}
-
-
-function download_image() {
- // Download image from server once the url was received by upgrade_request
- hide("#keep_container");
- hide("#upgrade_button");
- var download_request = new XMLHttpRequest();
- download_request.open("GET", data.url + data.files + data.sysupgrade);
- download_request.responseType = "arraybuffer";
-
- download_request.onload = function() {
- if (this.status === 200) {
- var blob = new Blob([download_request.response], {
- type: "application/octet-stream"
- });
- upload_image(blob)
- }
- };
- set_status("info", "Downloading firmware to web browser memory", true);
- download_request.send();
-}
-
-function server_request(path, callback) {
- var request_json;
- var request = new XMLHttpRequest();
- request.open("POST", data.url + "/" + path, true);
- request.setRequestHeader("Content-type", "application/json");
- request.send(JSON.stringify(request_dict));
- request.onerror = function(e) {
- set_status("danger", "Upgrade server down or could not connect")
- show("#server_div");
- }
- request.addEventListener('load', function(event) {
- var request_text = request.responseText;
- if (request.status === 200) {
- callback(request_text)
-
- } else if (request.status === 202) {
- var imagebuilder = request.getResponseHeader("X-Imagebuilder-Status");
- if (imagebuilder === "queue") {
- // in queue
- var queue = request.getResponseHeader("X-Build-Queue-Position");
- set_status("info", "In build queue position " + queue, true)
- console.log("queued");
- } else if (imagebuilder === "building") {
- set_status("info", "Building image", true);
- console.log("building");
- } else {
- // fallback if for some reasons the headers are missing e.g. browser blocks access
- set_status("info", "Processing request", true);
- console.log(imagebuilder)
- }
- setTimeout(function() {
- server_request(path, callback)
- }, 5000)
-
- } else if (request.status === 204) {
- // no upgrades available
- set_status("success", "No upgrades available")
-
- } else if (request.status === 400) {
- // bad request
- request_json = JSON.parse(request_text)
- set_status("danger", request_json.error)
-
- } else if (request.status === 409) {
- // bad request
- request_json = JSON.parse(request_text)
- data.log = request_json.log
- set_status("danger", "Incompatible package selection. See build log for details", false, true)
-
- } else if (request.status === 412) {
- // this is a bit generic
- set_status("danger", "Unsupported device, release, target, subtraget or board")
-
- } else if (request.status === 413) {
- set_status("danger", "No firmware created due to image size. Try again with less packages selected.")
-
- } else if (request.status === 422) {
- var package_missing = request.getResponseHeader("X-Unknown-Package");
- set_status("danger", "Unknown package in request: " + package_missing + " ")
- } else if (request.status === 500) {
- request_json = JSON.parse(request_text)
-
- var error_box_content = "Internal server error "
- error_box_content += request_json.error
- if (request_json.log != undefined) {
- data.log = request_json.log
- }
- set_status("danger", error_box_content, false, true)
-
- } else if (request.status === 501) {
- set_status("danger", "No sysupgrade file produced, may not supported by model.")
- } else if (request.status === 502) {
- // python part offline
- set_status("danger", "Server down for maintenance")
- setTimeout(function() {
- server_request(path, callback)
- }, 30000)
- } else if (request.status === 503) {
- set_status("danger", "Server overloaded")
- setTimeout(function() {
- server_request(path, callback)
- }, 30000)
- }
- });
-}
-request_dict = {}
-document.onload = setup()
diff --git a/applications/luci-app-attendedsysupgrade/Makefile b/applications/luci-app-sysupgrade/Makefile
similarity index 85%
rename from applications/luci-app-attendedsysupgrade/Makefile
rename to applications/luci-app-sysupgrade/Makefile
index dbb572bd28dc..c03897f5dfb9 100644
--- a/applications/luci-app-attendedsysupgrade/Makefile
+++ b/applications/luci-app-sysupgrade/Makefile
@@ -3,7 +3,7 @@
include $(TOPDIR)/rules.mk
-LUCI_TITLE:=LuCI support for attended sysupgrades
+LUCI_TITLE:=LuCI support for sysupgrades
LUCI_DEPENDS:=+luci-base +uhttpd-mod-ubus +attendedsysupgrade-common +cgi-io
include ../../luci.mk
diff --git a/applications/luci-app-sysupgrade/luasrc/controller/sysupgrade.lua b/applications/luci-app-sysupgrade/luasrc/controller/sysupgrade.lua
new file mode 100644
index 000000000000..27dada1e3b3e
--- /dev/null
+++ b/applications/luci-app-sysupgrade/luasrc/controller/sysupgrade.lua
@@ -0,0 +1,5 @@
+module("luci.controller.sysupgrade", package.seeall)
+
+function index()
+ entry({"admin", "system", "sysupgrade"}, template("sysupgrade"), _("Sysupgrade"), 1)
+end
diff --git a/applications/luci-app-sysupgrade/luasrc/view/sysupgrade.htm b/applications/luci-app-sysupgrade/luasrc/view/sysupgrade.htm
new file mode 100644
index 000000000000..5cd6f6e96318
--- /dev/null
+++ b/applications/luci-app-sysupgrade/luasrc/view/sysupgrade.htm
@@ -0,0 +1,51 @@
+<%
+
+if pcall(dofile, "/etc/openwrt_release") and _G.DISTRIB_RELEASE then
+ version = _G.DISTRIB_RELEASE
+else
+ version = "SNAPSHOT"
+end
+
+%>
+<%+header%>
+<%:Sysupgrade%>
+Check if a new version of OpenWrt is available for your device and apply the update accordingly.
+
+
+
+
+
+
+
+
+
+ Keep current configuration/settings (requires a compatible firmware):
+
+
+
+
+ Retain all the packages (uses Attended Sysupgrade Server ):
+
+
+
+ You chose to not retain packages. This means any package installed by you will be lost after the upgrade like a hard-reset.
+
+
+
+
+
+
+
+
+
+
+
+
+
+<%+footer%>
\ No newline at end of file
diff --git a/applications/luci-app-attendedsysupgrade/po/es/attendedsysupgrade.po b/applications/luci-app-sysupgrade/po/es/sysupgrade.po
similarity index 69%
rename from applications/luci-app-attendedsysupgrade/po/es/attendedsysupgrade.po
rename to applications/luci-app-sysupgrade/po/es/sysupgrade.po
index 5e0b75f102d0..08727698cf54 100644
--- a/applications/luci-app-attendedsysupgrade/po/es/attendedsysupgrade.po
+++ b/applications/luci-app-sysupgrade/po/es/sysupgrade.po
@@ -12,7 +12,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: es\n"
-#: applications/luci-app-attendedsysupgrade/luasrc/controller/attendedsysupgrade.lua:4
-#: applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm:76
-msgid "Attended Sysupgrade"
+#: applications/luci-app-sysupgrade/luasrc/controller/sysupgrade.lua:4
+#: applications/luci-app-sysupgrade/luasrc/view/sysupgrade.htm:76
+msgid "Sysupgrade"
msgstr "Sysupgrade asistido"
diff --git a/applications/luci-app-sysupgrade/po/templates/sysupgrade.pot b/applications/luci-app-sysupgrade/po/templates/sysupgrade.pot
new file mode 100644
index 000000000000..6ebf81779500
--- /dev/null
+++ b/applications/luci-app-sysupgrade/po/templates/sysupgrade.pot
@@ -0,0 +1,7 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: applications/luci-app-sysupgrade/luasrc/controller/sysupgrade.lua:4
+#: applications/luci-app-sysupgrade/luasrc/view/sysupgrade.htm:76
+msgid "Sysupgrade"
+msgstr ""
diff --git a/applications/luci-app-attendedsysupgrade/root/etc/uci-defaults/40_luci-attendedsysupgrade b/applications/luci-app-sysupgrade/root/etc/uci-defaults/40_luci-sysupgrade
similarity index 100%
rename from applications/luci-app-attendedsysupgrade/root/etc/uci-defaults/40_luci-attendedsysupgrade
rename to applications/luci-app-sysupgrade/root/etc/uci-defaults/40_luci-sysupgrade
diff --git a/applications/luci-app-attendedsysupgrade/root/usr/share/rpcd/acl.d/attendedsysupgrade.json b/applications/luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json
similarity index 74%
rename from applications/luci-app-attendedsysupgrade/root/usr/share/rpcd/acl.d/attendedsysupgrade.json
rename to applications/luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json
index 75493192604f..950dd189d904 100644
--- a/applications/luci-app-attendedsysupgrade/root/usr/share/rpcd/acl.d/attendedsysupgrade.json
+++ b/applications/luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json
@@ -1,6 +1,6 @@
{
"attendedsysupgrade": {
- "description": "attended sysupgrade via rpcd and luci",
+ "description": "sysupgrade via rpcd and luci",
"read": {
"ubus": {
"rpc-sys": [
@@ -16,7 +16,7 @@
]
},
"uci": [
- "attendedsysupgrade"
+ "sysupgrade"
]
},
"write": {
@@ -24,7 +24,7 @@
"upload"
],
"uci": [
- "attendedsysupgrade"
+ "sysupgrade"
]
}
}
diff --git a/applications/luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js b/applications/luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js
new file mode 100644
index 000000000000..03bbcdc28f96
--- /dev/null
+++ b/applications/luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js
@@ -0,0 +1,362 @@
+var loader = ' ';
+var device_info = {};
+var remote_versions = [];
+var UNEXPECTED_ERROR = 'Unexpected error occurred. For more, check browser logs.';
+var newer_version = '';
+var newer_version_available = false;
+var buildStatusCheckInterval = 3600;
+var multiple_new_major_versions_available = false;
+var asu = 'https://cors-anywhere.herokuapp.com/https://aparcar.stephen304.com/api/';
+var asu_root = 'https://cors-anywhere.herokuapp.com/https://aparcar.stephen304.com/';
+var imageURL;
+var ping_max;
+
+
+const sleep = m => new Promise(r => setTimeout(r, m));
+
+function $(s) {
+ return document.getElementById(s.substring(1));
+}
+
+function showInfo(html) {
+ clearLoggers();
+ $('#info').style.display = 'block';
+ $('#info').innerHTML = html;
+}
+
+function showError(html) {
+ clearLoggers();
+ $('#error').style.display = 'block';
+ $('#error').innerHTML = html;
+}
+
+function showSuccess(html) {
+ clearLoggers();
+ $('#success').style.display = 'block';
+ $('#success').innerHTML = html;
+}
+
+function hideInfo() {
+ $('#info').style.display = 'none';
+}
+
+function hideError() {
+ $('#error').style.display = 'none';
+}
+
+function hideSuccess() {
+ $('#success').style.display = 'none';
+}
+
+function clearLoggers() {
+ hideInfo();
+ hideError();
+ hideSuccess();
+}
+
+function showUpdateControls() {
+ $('#download').style.display = 'block';
+}
+
+function unexpectedError(err) {
+ showError(UNEXPECTED_ERROR);
+ console.log(err);
+}
+
+function toggleRetainPackageWarning() {
+ if ($('#packages').checked) {
+ $('#packages-warning').style.display = 'none';
+ } else {
+ $('#packages-warning').style.display = 'block';
+ }
+}
+
+function toggleRetainSettingsWarning() {
+ if ($('#keep').checked) {
+ $('#keep-warning').style.display = 'none';
+ } else {
+ $('#keep-warning').style.display = 'block';
+ }
+}
+
+function serverRequest(url, method = 'GET', data = {}, sendResponseOnly = true) {
+ return new Promise(async function(resolve, reject) {
+ var request_options = {
+ method,
+ };
+ if (method === 'POST') {
+ request_options.headers = {
+ 'Content-type': 'application/json',
+ };
+ request_options.body = JSON.stringify(data);
+ }
+ var request = await fetch(url, request_options);
+ if (sendResponseOnly) {
+ var response = await request.json();
+ if (request.status >= 200 && request.status < 400) {
+ if (sendResponseOnly) {
+ resolve(response);
+ } else {
+ resolve(request);
+ }
+ } else {
+ reject(request);
+ }
+ } else {
+ resolve(request);
+ }
+ });
+}
+
+function ubusCall(command, argument, params = {}) {
+ return new Promise(async function(resolve, reject) {
+ var request = await fetch(ubus_url, {
+ method: 'POST',
+ headers: {
+ 'Content-type': 'application/json',
+ },
+ body: JSON.stringify({
+ jsonrpc: '2.0',
+ method: 'call',
+ params: [ubus_rpc_session, command, argument, params]
+ })
+ });
+ var response = await request.json();
+ if (request.ok) {
+ if (!('error' in response) && 'result' in response) {
+ if (response.result.length === 2) {
+ if (command === "uci") {
+ resolve(response.result[1].value);
+ } else {
+ resolve(response.result[1]);
+ }
+ }
+ } else {
+ reject(request);
+ }
+ } else {
+ reject(request);
+ }
+ });
+}
+
+async function getDeviceInfo() {
+ showInfo(loader + ' Loading device information...');
+ try {
+ device_info = await ubusCall('system', 'board');
+ clearLoggers();
+ device_info.release.revision_id = device_info.release.revision.split('-')[0];
+ device_info.board_name = device_info.board_name.replace(',', '_');
+ var packages = await ubusCall('rpc-sys', 'packagelist');
+ device_info.packages = packages['packages'];
+ $('#device-info').innerHTML = `
+ Current System: ${device_info.release.version} /${device_info.release.revision}
+ `;
+ } catch (errRequest) {
+ unexpectedError(errRequest);
+ }
+}
+
+async function getVersionsFromOpenwrtServer() {
+ showInfo(loader + ' Looking for available updates...');
+ try {
+ var versionsResponse = await serverRequest(openwrt_server + 'versions.json');
+ clearLoggers();
+ remote_versions = versionsResponse['versions'];
+ for(var i = 0; i < remote_versions.length; i++) {
+ var revision_id = remote_versions[i].revision.split('-')[0];
+ if (device_info.release.version.toLowerCase() === 'snapshot') {
+ if (remote_versions[i].name.toLowerCase() === 'snapshot') {
+ if (revision_id > device_info.release.revision_id) {
+ newer_version = remote_versions[i];
+ newer_version_available = true;
+ break;
+ }
+ }
+ } else if (remote_versions[i].name.toLowerCase() !== 'snapshot') {
+ var major_version_diff = parseInt(remote_versions[i].name.split('.')[0]) - parseInt(device_info.release.version.split('.')[0]);
+ if (major_version_diff <= 1) {
+ if (!newer_version_available) {
+ newer_version = remote_versions[i];
+ newer_version_available = true;
+ } else if (remote_versions[i].name > newer_version.name) {
+ newer_version = remote_versions[i];
+ }
+ } else {
+ multiple_new_major_versions_available = true;
+ }
+ }
+ }
+ } catch (errRequest) {
+ unexpectedError(errRequest);
+ }
+}
+
+async function checkForUpdates() {
+ newer_version_available = false;
+ await getVersionsFromOpenwrtServer();
+ if (newer_version_available) {
+ if (multiple_new_major_versions_available) {
+ showSuccess('There are multiple major updates availble for the system. By clicking the Download and Update button, your system will be updated to ' + newer_version.name + ' only. If you require to update to the latest version, please repeat the steps after this update.');
+ }
+ else {
+ showSuccess(`
+ A new version (${newer_version.name} /${newer_version.revision} ) is available!
+ `);
+ }
+ showUpdateControls();
+ } else {
+ showSuccess('Your device is already upto date!');
+ }
+}
+
+async function downloadAndApplyImage() {
+ try {
+ if ($('#packages').checked) {
+ await buildImage();
+ }
+ await downloadImage();
+ await flashImage();
+ } catch (errRequest) {
+ unexpectedError(errRequest);
+ }
+}
+
+async function buildImage() {
+ return new Promise(async function(resolve, reject) {
+ showInfo(loader + ' Building Image...')
+ try {
+ var build_request = await serverRequest(asu + 'build-request', 'POST', {
+ profile: device_info.board_name,
+ defaults: '',
+ distro: 'openwrt',
+ packages: device_info.packages,
+ target: device_info.release.target,
+ version: newer_version.name.toLowerCase(),
+ }, false);
+ var response = await build_request.json();
+ if (build_request.status === 202 && 'request_hash' in response) {
+ await sleep(buildStatusCheckInterval);
+ await checkBuildStatus(response['request_hash']);
+ resolve();
+ } else if (build_request.status === 200) {
+ response.images.forEach(image => {
+ if (image.type === 'sysupgrade') {
+ imageURL = asu_root + response.image_folder + '/' + image.name;
+ }
+ });
+ resolve();
+ }
+ } catch (errRequest) {
+ reject(errRequest);
+ }
+ });
+}
+
+async function checkBuildStatus(request_hash) {
+ return new Promise(async function(resolve, reject) {
+ try {
+ var build_check_request = await serverRequest(asu + 'build-request/' + request_hash, 'GET', {}, false);
+ var response = await build_check_request.json();
+ if (build_check_request.status === 202) {
+ await sleep(buildStatusCheckInterval);
+ await checkBuildStatus(request_hash);
+ resolve();
+ } else if (build_check_request.status === 200) {
+ response.images.forEach(image => {
+ if (image.type === 'sysupgrade') {
+ imageURL = asu_root + response.image_folder + '/' + image.name;
+ }
+ });
+ resolve();
+ }
+ } catch (errRequest) {
+ reject(errRequest);
+ }
+ });
+}
+
+function downloadImage() {
+ showInfo(loader + ' Downloading image onto your device...');
+ return new Promise(function(resolve, reject) {
+ var download_request = new XMLHttpRequest();
+ download_request.open("GET", imageURL);
+ download_request.responseType = "arraybuffer";
+
+ download_request.onload = function() {
+ if (this.status === 200) {
+ var blob = new Blob([download_request.response], {
+ type: "application/octet-stream"
+ });
+ var upload_request = new XMLHttpRequest();
+ var form_data = new FormData();
+
+ form_data.append("sessionid", ubus_rpc_session)
+ form_data.append("filename", "/tmp/firmware.bin")
+ form_data.append("filemode", 755) // insecure?
+ form_data.append("filedata", blob)
+
+ upload_request.onload = function() {
+ request_json = JSON.parse(upload_request.responseText);
+ resolve(request_json);
+ };
+
+ upload_request.onerror = function() {
+ reject(upload_request.responseText);
+ };
+
+ upload_request.open('POST', origin + '/cgi-bin/cgi-upload');
+ upload_request.send(form_data);
+ }
+ };
+ download_request.onerror = function() {
+ reject(download_request.responseText);
+ };
+ download_request.send();
+ });
+}
+
+async function flashImage() {
+ return new Promise(async function(resolve, reject) {
+ showInfo(loader + ' Flashing firmware. Don\'t unpower device');
+ try {
+ await ubusCall('rpc-sys', 'upgrade_start', {
+ 'keep': $('#keep').checked
+ });
+ ping_max = 3600;
+ await sleep(10000);
+ await pingUbus();
+ resolve();
+ } catch (err) {
+ reject(err);
+ }
+ });
+}
+
+function pingUbus() {
+ return new Promise(async function(resolve, reject) {
+ if (ping_max > 0) {
+ ping_max--;
+ var request = new XMLHttpRequest();
+ request.open("GET", ubus_url, true);
+ request.onload = async function(event) {
+ showSuccess('Successfully updated your device!');
+ await getDeviceInfo();
+ };
+ request.onerror = function() {
+ showInfo(loader + ' Rebooting device - please wait!');
+ sleep(5000);
+ pingUbus();
+ };
+ request.send();
+ } else {
+ showError('Web interface could not reconnect to your device. Please reload web interface or check device manually');
+ }
+ });
+}
+
+request_dict = {};
+document.onload = init();
+function init() {
+ getDeviceInfo();
+};