luci-app-attendedsysupgrade: new api, unify status 2494/head
authorPaul Spooren <mail@aparcar.org>
Fri, 25 Jan 2019 15:14:46 +0000 (16:14 +0100)
committerPaul Spooren <mail@aparcar.org>
Sat, 2 Feb 2019 13:39:31 +0000 (14:39 +0100)
to distinguish between installed packages and requested packages, the
API call is now "installed" instead of "packages".

The clients now decide on their own if they want http or https,
therefore the server doesn't reply with full links, only the path.

Add missing variable declarations in JavaScript code

Fix typos in UI strings

Also unify "info_box" and "error_box" to "status_box"

Signed-off-by: Paul Spooren <mail@aparcar.org>
applications/luci-app-attendedsysupgrade/luasrc/view/attendedsysupgrade.htm
applications/luci-app-attendedsysupgrade/root/www/luci-static/resources/attendedsysupgrade.js

index 0a8c65ebdd66c8791070887c827afff7791737ce..c9259559be09bcc40b77bae4b90f19095caaff44 100644 (file)
@@ -77,8 +77,7 @@
 <div class="cbi-map-descr">
        Easily search and install new releases and package upgrades. Sysupgrade firmware are created on demand based on locally installed packages.
 </div>
-<div style="display: none" id="info_box" class="alert-message info"></div>
-<div style="display: none" id="error_box" class="alert-message danger"></div>
+<div style="display: none" id="status_box" class="alert-message info"></div>
 <div style="display: none" id="packages" class="alert-message success"></div>
 <p>
 <textarea style="display: none; width: 100%;" id="edit_packages" rows="15"></textarea>
index 60f586ded4c163e1a4223bd89b723e3ac12b2838..f4d3d8dc0d5e81324b09db080703644b18f931a6 100644 (file)
@@ -1,14 +1,8 @@
-function $(s) {
-       return document.getElementById(s.substring(1));
-}
+function $(s) { return document.getElementById(s.substring(1)); }
 
-function show(s) {
-       $(s).style.display = 'block';
-}
+function show(s) { $(s).style.display = 'block'; }
 
-function hide(s) {
-       $(s).style.display = 'none';
-}
+function hide(s) { $(s).style.display = 'none'; }
 
 function set_server() {
        hide("#error_box");
@@ -33,13 +27,12 @@ function edit_server() {
        $("#server").className = '';
        $("#server").onclick = null;
 
-       button_set = document.createElement("input");
+       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-edit';
-       button_set.style = 'background-image: url("/luci-static/resources/cbi/save.gif");'
+       button_set.className = 'cbi-button cbi-button-save';
        button_set.onclick = set_server
        $("#server").parentElement.appendChild(button_set);
 }
@@ -61,7 +54,7 @@ function server_request(request_dict, path, callback) {
        request.setRequestHeader("Content-type", "application/json");
        request.send(JSON.stringify(request_dict));
        request.onerror = function(e) {
-               error_box("upgrade server down")
+               set_status("danger", "upgrade server down")
                show("#server_div");
        }
        request.addEventListener('load', function(event) {
@@ -111,7 +104,7 @@ function ubus_call(command, argument, params, variable) {
        request_data.id = ubus_counter;
        request_data.method = "call";
        request_data.params = [ data.ubus_rpc_session, command, argument, params ]
-       request_json = JSON.stringify(request_data)
+       var request_json = JSON.stringify(request_data)
        ubus_counter++;
        var request = new XMLHttpRequest();
        request.open("POST", ubus_url, true);
@@ -128,7 +121,7 @@ function ubus_call(command, argument, params, variable) {
                                        }
                                }
                        } else {
-                               error_box("<b>Ubus call faild:</b><br />Request: " + request_json + "<br />Response: " + JSON.stringify(response))
+                               set_status("danger", "<b>Ubus call failed:</b><br />Request: " + request_json + "<br />Response: " + JSON.stringify(response))
                        }
                        ubus_closed++;
                }
@@ -136,22 +129,14 @@ function ubus_call(command, argument, params, variable) {
        request.send(request_json);
 }
 
-function info_box(info_output, loading) {
-       // Shows notification if upgrade is available
-       // If loading is true then an "processing" animation is added
-       show("#info_box");
+function set_status(type, message, loading) {
+       $("#status_box").className = "alert-message " + type;
        var loading_image = '';
        if(loading) {
-               loading_image = '<img src="/luci-static/resources/icons/loading.gif" alt="Loading" style="vertical-align:middle">';
+               loading_image = '<img src="/luci-static/resources/icons/loading.gif" alt="Loading" style="vertical-align:middle"> ';
        }
-       $("#info_box").innerHTML = loading_image + info_output;
-}
-
-function error_box(error_output) {
-       // Shows erros in red box
-       show("#error_box");
-       $("#error_box").innerHTML = error_output;
-       hide("#info_box");
+       $("#status_box").innerHTML = loading_image + message;
+       show("#status_box")
 }
 
 function upgrade_check() {
@@ -159,10 +144,11 @@ function upgrade_check() {
        // If data.upgrade_packages is set to true search for new package versions as well
        hide("#error_box");
        hide("#server_div");
-       info_box("Searching for upgrades", true);
+       set_status("info", "Searching for upgrades", true);
        var request_dict = {}
        request_dict.version = data.release.version;
-       request_dict.packages = data.packages;
+       request_dict.revision = data.release.revision;
+       request_dict.installed = data.packages;
        request_dict.upgrade_packages = data.upgrade_packages
        server_request(request_dict, "api/upgrade-check", upgrade_check_callback)
 }
@@ -170,7 +156,7 @@ function upgrade_check() {
 function upgrade_check_callback(request_text) {
        var request_json = JSON.parse(request_text)
 
-       // create simple output to tell user whats going to be upgrade (release/packages)
+       // create simple output to tell user what's going to be upgrade (release/packages)
        var info_output = ""
        if(request_json.version != undefined) {
                info_output += "<h3>New firmware release available</h3>"
@@ -179,12 +165,12 @@ function upgrade_check_callback(request_text) {
        }
        if(request_json.upgrades != undefined) {
                info_output += "<h3>Package upgrades available</h3>"
-               for (upgrade in request_json.upgrades) {
+               for (var upgrade in request_json.upgrades) {
                        info_output += "<b>" + upgrade + "</b>: " + request_json.upgrades[upgrade][1] + " to " + request_json.upgrades[upgrade][0] + "<br />"
                }
        }
        data.packages = request_json.packages
-       info_box(info_output)
+       set_status("success", info_output)
 
        if(data.advanced_mode == 1) {
                show("#edit_button");
@@ -201,7 +187,7 @@ function upgrade_request() {
        // Request the image
        // Needed values
        // version/release
-       // board_name or model (server tries to find the corrent profile)
+       // board_name or model (server tries to find the correct profile)
        // packages
        // The rest is added by server_request()
        $("#upgrade_button").disabled = true;
@@ -229,13 +215,11 @@ function upgrade_request_callback(request) {
        data.sysupgrade_url = request_json.sysupgrade;
 
        var filename_split = data.sysupgrade_url.split("/")
-       data.filename = filename_split[filename_split.length - 1]
+       var filename = filename_split[filename_split.length - 1]
 
-       info_output = 'Firmware created: <a href="' + data.sysupgrade_url + '"><b>' + data.filename + '</b></a>'
-       if(data.advanced_mode == 1) {
-               info_output += '<br /><a target="_blank" href="' + data.sysupgrade_url + '.log">Build log</a>'
-       }
-       info_box(info_output);
+       var info_output = 'Firmware created: <a href="' + data.url + data.sysupgrade_url + '"><b>' + filename + '</b></a>'
+       info_output += ' <a target="_blank" href="'  + data.url + request_json.log + '">Build log</a>'
+       set_status("info", info_output);
 
        show("#keep_container");
        var upgrade_button = $("#upgrade_button")
@@ -247,7 +231,7 @@ function upgrade_request_callback(request) {
 
 function flash_image() {
        // Flash image via rpc-sys upgrade_start
-       info_box("Flashing firmware. Don't unpower device", true)
+       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)
@@ -261,11 +245,11 @@ function ping_ubus() {
                var request = new XMLHttpRequest();
                request.open("GET", ubus_url, true);
                request.addEventListener('error', function(event) {
-                       info_box("Rebooting device", true);
-                       setTimeout(ping_ubus, 1000)
+                       set_status("warning", "Rebooting device", true);
+                       setTimeout(ping_ubus, 5000)
                });
                request.addEventListener('load', function(event) {
-                       info_box("Success! Please reload web interface");
+                       set_status("success", "Success! Please reload web interface");
                        $("#upgrade_button").value = "Reload page";
                        show("#upgrade_button");
                        $("#upgrade_button").disabled = false;
@@ -273,7 +257,7 @@ function ping_ubus() {
                });
                request.send();
        } else {
-               error_box("Web interface could not reconnect to your device. Please reload web interface or check device manually")
+               set_status("danger", "Web interface could not reconnect to your device. Please reload web interface or check device manually")
        }
 }
 
@@ -293,7 +277,7 @@ function upload_image(blob) {
        });
 
        request.addEventListener('error', function(event) {
-               info_box("Upload of firmware failed, please retry by reloading web interface")
+               set_status("info", "Upload of firmware failed, please retry by reloading web interface")
        });
 
        request.open('POST', origin + '/cgi-bin/cgi-upload');
@@ -315,11 +299,12 @@ function download_image() {
                        upload_image(blob)
                }
        };
-       info_box("Downloading firmware", true);
+       set_status("info", "Downloading firmware", true);
        download_request.send();
 }
 
 function server_request(request_dict, path, callback) {
+       var request_json;
        request_dict.distro = data.release.distribution;
        request_dict.target = data.release.target.split("\/")[0];
        request_dict.subtarget = data.release.target.split("\/")[1];
@@ -328,11 +313,11 @@ function server_request(request_dict, path, callback) {
        request.setRequestHeader("Content-type", "application/json");
        request.send(JSON.stringify(request_dict));
        request.onerror = function(e) {
-               error_box("Upgrade server down or could not connect")
+               set_status("danger", "Upgrade server down or could not connect")
                show("#server_div");
        }
        request.addEventListener('load', function(event) {
-               request_text = request.responseText;
+               var request_text = request.responseText;
                if (request.status === 200) {
                        callback(request_text)
 
@@ -341,62 +326,60 @@ function server_request(request_dict, path, callback) {
                        if(imagebuilder === "queue") {
                                // in queue
                                var queue = request.getResponseHeader("X-Build-Queue-Position");
-                               info_box("In build queue position " + queue, true)
+                               set_status("info", "In build queue position " + queue, true)
                                console.log("queued");
                        } else if(imagebuilder === "initialize") {
-                               info_box("Setting up ImageBuilder", true)
+                               set_status("info", "Setting up ImageBuilder", true)
                                console.log("Setting up imagebuilder");
                        } else if(imagebuilder === "building") {
-                               info_box("Building image", true);
+                               set_status("info", "Building image", true);
                                console.log("building");
                        } else {
                                // fallback if for some reasons the headers are missing e.g. browser blocks access
-                               info_box("Processing request", true);
+                               set_status("info", "Processing request", true);
                                console.log(imagebuilder)
                        }
                        setTimeout(function() { server_request(request_dict, path, callback) }, 5000)
 
                } else if (request.status === 204) {
                        // no upgrades available
-                       info_box("No upgrades available")
+                       set_status("success", "No upgrades available")
 
                } else if (request.status === 400) {
                        // bad request
                        request_json = JSON.parse(request_text)
-                       error_box(request_json.error)
+                       set_status("danger", request_json.error)
 
                } else if (request.status === 412) {
                        // this is a bit generic
-                       error_box("Unsupported device, release, target, subtraget or board")
+                       set_status("danger", "Unsupported device, release, target, subtraget or board")
 
                } else if (request.status === 413) {
-               error_box("No firmware created due to image size. Try again with less packages selected.")
+               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");
-                       error_box("Unknown package in request: <b>" + package_missing + "</b>")
+                       set_status("danger", "Unknown package in request: <b>" + package_missing + "</b>")
                } else if (request.status === 500) {
                        request_json = JSON.parse(request_text)
 
-                       error_box_content = "<b>Internal server error</b><br />"
+                       var error_box_content = "<b>Internal server error</b><br />"
                        error_box_content += request_json.error
                        if(request_json.log != undefined) {
                                data.log_url = request_json.log
                        }
-                       error_box(error_box_content)
+                       set_status("danger", error_box_content)
 
                } else if (request.status === 501) {
-                       error_box("No sysupgrade file produced, may not supported by modell.")
-
+                       set_status("danger", "No sysupgrade file produced, may not supported by model.")
                } else if (request.status === 502) {
                        // python part offline
-                       error_box("Server down for maintenance")
+                       set_status("danger", "Server down for maintenance")
                        setTimeout(function() { server_request(request_dict, path, callback) }, 30000)
                } else if (request.status === 503) {
-                       error_box("Server overloaded")
+                       set_status("danger", "Server overloaded")
                        setTimeout(function() { server_request(request_dict, path, callback) }, 30000)
                }
        });
 }
 document.onload = setup()
-