Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

luci-mod-system: improve sysupgrade page #4754

Merged
merged 2 commits into from Aug 9, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -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,
Expand All @@ -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)
Expand All @@ -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',
Expand All @@ -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)) })
Expand All @@ -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.<br /> DO NOT POWER OFF THE DEVICE!<br /> 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');
Expand Down
Expand Up @@ -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" ],
Expand Down
Expand Up @@ -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 {
Expand Down
30 changes: 12 additions & 18 deletions themes/luci-theme-material/htdocs/luci-static/material/cascade.css
Expand Up @@ -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;
Expand Down Expand Up @@ -1661,6 +1661,7 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child {

.modal ul {
margin-left: 2.2em;
word-break: break-word;
}

.modal li {
Expand All @@ -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;
Expand Down Expand Up @@ -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] {
Expand Down
Expand Up @@ -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;
Expand Down