From 0f4f6e89f15aa1dac0bfd676cb8364ef0b6c6e1f Mon Sep 17 00:00:00 2001 From: Ansuel Smith Date: Fri, 29 Jan 2021 19:09:36 +0100 Subject: luci-mod-system: improve sysupgrade page - Add missing -k and -u option from sysupgrade page. - Fix missing check for image verification exit code - Provide the actual reason of the image verification Fixes: #4160 Signed-off-by: Ansuel Smith --- .../luci-static/resources/view/system/flash.js | 80 +++++++++++++++------- .../root/usr/share/rpcd/acl.d/luci-mod-system.json | 6 ++ 2 files changed, 60 insertions(+), 26 deletions(-) diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js index 1207fc63b5..82ab28e03d 100644 --- a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js +++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js @@ -204,8 +204,13 @@ return view.extend({ .then(function(res) { reply.push(res); return reply; }); }, this, ev.target)) .then(L.bind(function(btn, res) { - var keep = E('input', { type: 'checkbox' }), - force = E('input', { type: 'checkbox' }), + /* sysupgrade opts table [0]:checkbox element [1]:check condition [2]:args to pass */ + var opts = { + keep : [ E('input', { type: 'checkbox' }), false, '-n' ], + force : [ E('input', { type: 'checkbox' }), true, '--force' ], + skip_orig : [ E('input', { type: 'checkbox' }), true, '-u' ], + backup_pkgs : [ E('input', { type: 'checkbox' }), true, '-k' ], + }, is_valid = res[1].valid, is_forceable = res[1].forceable, allow_backup = res[1].allow_backup, @@ -220,7 +225,7 @@ return view.extend({ ])); body.push(E('p', {}, E('label', { 'class': 'btn' }, [ - keep, ' ', _('Keep settings and retain the current configuration') + opts.keep[0], ' ', _('Keep settings and retain the current configuration') ]))); if (!is_valid || is_too_big) @@ -239,28 +244,46 @@ return view.extend({ _('The uploaded image file does not contain a supported format. Make sure that you choose the generic image format for your platform.') ])); - if (!allow_backup) + if (!allow_backup) { body.push(E('p', { 'class': 'alert-message' }, [ _('The uploaded firmware does not allow keeping current configuration.') ])); + opts.keep[0].disabled = true; + } else { + opts.keep[0].checked = true; - if (allow_backup) - keep.checked = true; - else - keep.disabled = true; + body.push(E('p', {}, E('label', { 'class': 'btn' }, [ + opts.skip_orig[0], ' ', _('Skip from backup files that are equal to those in /rom') + ]))); - - if ((!is_valid || is_too_big) && is_forceable) - body.push(E('p', { 'class': 'alert-message danger' }, [ - force, ' ', _('Force upgrade: Select \'Force upgrade\' to flash the image even if the image format check fails. Use only if you are sure that the firmware is correct and meant for your device!') - ])); + body.push(E('p', {}, E('label', { 'class': 'btn' }, [ + opts.backup_pkgs[0], ' ', _('Include in backup a list of current installed packages at /etc/backup/installed_packages.txt') + ]))); + }; var cntbtn = E('button', { 'class': 'btn cbi-button-action important', - 'click': ui.createHandlerFn(this, 'handleSysupgradeConfirm', btn, keep, force), - 'disabled': (!is_valid || is_too_big) ? true : null + 'click': ui.createHandlerFn(this, 'handleSysupgradeConfirm', btn, opts), }, [ _('Continue') ]); + if (res[2].code != 0) { + body.push(E('p', { 'class': 'alert-message danger' }, E('label', {}, [ + _('Image check failed:'), + E('br'), E('br'), + res[2].stderr + ]))); + }; + + if ((!is_valid || is_too_big || res[2].code != 0) && is_forceable) { + body.push(E('p', {}, E('label', { 'class': 'btn alert-message danger' }, [ + opts.force[0], ' ', _('Force upgrade'), + E('br'), E('br'), + _('Select \'Force upgrade\' to flash the image even if the image format check fails. Use only if you are sure that the firmware is correct and meant for your device!') + ]))); + cntbtn.disabled = true; + }; + + body.push(E('div', { 'class': 'right' }, [ E('button', { 'class': 'btn', @@ -270,10 +293,16 @@ return view.extend({ }, [ _('Cancel') ]), ' ', cntbtn ])); - force.addEventListener('change', function(ev) { + opts.force[0].addEventListener('change', function(ev) { cntbtn.disabled = !ev.target.checked; }); + opts.keep[0].addEventListener('change', function(ev) { + opts.skip_orig[0].disabled = !ev.target.checked; + opts.backup_pkgs[0].disabled = !ev.target.checked; + + }); + ui.showModal(_('Flash image?'), body); }, this, ev.target)) .catch(function(e) { ui.addNotification(null, E('p', e.message)) }) @@ -282,27 +311,26 @@ return view.extend({ }, this, ev.target)); }, - handleSysupgradeConfirm: function(btn, keep, force, ev) { + handleSysupgradeConfirm: function(btn, opts, ev) { btn.firstChild.data = _('Flashing…'); ui.showModal(_('Flashing…'), [ E('p', { 'class': 'spinning' }, _('The system is flashing now.
DO NOT POWER OFF THE DEVICE!
Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings.')) ]); - var opts = []; - - if (!keep.checked) - opts.push('-n'); + var args = []; - if (force.checked) - opts.push('--force'); + for (var key in opts) + /* if checkbox == condition add args to sysupgrade */ + if (opts[key][0].checked == opts[key][1]) + args.push(opts[key][2]); - opts.push('/tmp/firmware.bin'); + args.push('/tmp/firmware.bin'); /* Currently the sysupgrade rpc call will not return, hence no promise handling */ - fs.exec('/sbin/sysupgrade', opts); + fs.exec('/sbin/sysupgrade', args); - if (keep.checked) + if (opts['keep'][0].checked) ui.awaitReconnect(window.location.host); else ui.awaitReconnect('192.168.1.1', 'openwrt.lan'); diff --git a/modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json b/modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json index c5f801a264..e04bcdb476 100644 --- a/modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json +++ b/modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json @@ -140,7 +140,13 @@ "/sbin/reboot": [ "exec" ], "/sbin/sysupgrade --force /tmp/firmware.bin": [ "exec" ], "/sbin/sysupgrade -n --force /tmp/firmware.bin": [ "exec" ], + "/sbin/sysupgrade --force -k /tmp/firmware.bin": [ "exec" ], + "/sbin/sysupgrade --force -u /tmp/firmware.bin": [ "exec" ], + "/sbin/sysupgrade --force -u -k /tmp/firmware.bin": [ "exec" ], "/sbin/sysupgrade -n /tmp/firmware.bin": [ "exec" ], + "/sbin/sysupgrade -k /tmp/firmware.bin": [ "exec" ], + "/sbin/sysupgrade -u /tmp/firmware.bin": [ "exec" ], + "/sbin/sysupgrade -u -k /tmp/firmware.bin": [ "exec" ], "/sbin/sysupgrade --restore-backup /tmp/backup.tar.gz": [ "exec" ], "/sbin/sysupgrade --test /tmp/firmware.bin": [ "exec" ], "/sbin/sysupgrade /tmp/firmware.bin": [ "exec" ], -- cgit v1.2.3 From be028dce56410166d6950c6036dab97fa8c6a81a Mon Sep 17 00:00:00 2001 From: Ansuel Smith Date: Wed, 4 Aug 2021 18:04:54 +0200 Subject: luci-theme: fix css for flash advanced settings Fix themes for broken display of advanced button in the sysupgrade modal. Signed-off-by: Ansuel Smith --- .../htdocs/luci-static/bootstrap/cascade.css | 1 + .../htdocs/luci-static/material/cascade.css | 30 +++++++++------------- .../htdocs/luci-static/openwrt.org/cascade.css | 2 +- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css b/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css index 5b5b7ac2dc..cc7e84d133 100644 --- a/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css +++ b/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css @@ -1752,6 +1752,7 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { border-style: solid; border-radius: 4px; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); + white-space: unset; } .alert-message .close { diff --git a/themes/luci-theme-material/htdocs/luci-static/material/cascade.css b/themes/luci-theme-material/htdocs/luci-static/material/cascade.css index 10d8a02bdd..450aeca9fc 100644 --- a/themes/luci-theme-material/htdocs/luci-static/material/cascade.css +++ b/themes/luci-theme-material/htdocs/luci-static/material/cascade.css @@ -189,7 +189,7 @@ button, select, input, .cbi-dropdown { - height: 1.8rem; + min-height: 1.8rem; padding: 0; color: rgba(0, 0, 0, .87); border: 0; @@ -1661,6 +1661,7 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child { .modal ul { margin-left: 2.2em; + word-break: break-word; } .modal li { @@ -1673,23 +1674,20 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child { word-break: break-word; } -.modal .label { - font-size: .6rem; - font-weight: normal; - padding: .1rem .3rem; - padding-bottom: 0; - cursor: default; - border-radius: 0; +.modal label.btn { + display: flex; + align-items: center; + white-space: normal; + text-align: left; + text-transform: none; + padding-bottom: 0.2rem; + padding-top: 0.2rem; } -.modal .label.warning { +.modal label.warning { background-color: #f0ad4e !important; } -.modal .btn { - padding: .3rem .6rem; -} - .modal.cbi-modal { max-width: 90%; max-height: none; @@ -2124,11 +2122,7 @@ span[data-tooltip] .label { label > input[type="checkbox"], label > input[type="radio"] { - position: relative; - top: .4rem; - right: .2rem; - margin: 0; - vertical-align: bottom; + margin-right: 0.8rem; } label[data-index][data-depends] { diff --git a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css index e9880a3809..a3a9165d5b 100644 --- a/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css +++ b/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css @@ -658,7 +658,7 @@ img.cbi-image-button { text-align: center; font-weight: bold; line-height: 12px; - height: 22px; + min-height: 22px; line-height: 20px; box-sizing: border-box; cursor: pointer; -- cgit v1.2.3