luci-app-attendedsysupgrade: use correct linter settings

The previous settings would use spaces which messed up things since LuCI
uses tabs everywhere.

Also removed a stray console.log

Signed-off-by: Paul Spooren <mail@aparcar.org>
This commit is contained in:
Paul Spooren 2021-08-31 09:22:13 -10:00
parent f092eec6b6
commit 641bfe3967
2 changed files with 377 additions and 346 deletions

View file

@ -7,8 +7,7 @@ return view.extend({
var m, s, o; var m, s, o;
m = new form.Map('attendedsysupgrade', _('Attended Sysupgrade'), m = new form.Map('attendedsysupgrade', _('Attended Sysupgrade'),
_('Attendedsysupgrade Configuration.') _('Attendedsysupgrade Configuration.'));
);
s = m.section(form.TypedSection, 'server', _('Server')); s = m.section(form.TypedSection, 'server', _('Server'));
s.anonymous = true; s.anonymous = true;
@ -30,5 +29,5 @@ return view.extend({
o.rmempty = false; o.rmempty = false;
return m.render(); return m.render();
} },
}); });

View file

@ -15,13 +15,13 @@ var callPackagelist = rpc.declare({
var callSystemBoard = rpc.declare({ var callSystemBoard = rpc.declare({
object: 'system', object: 'system',
method: 'board' method: 'board',
}); });
var callUpgradeStart = rpc.declare({ var callUpgradeStart = rpc.declare({
object: 'rpc-sys', object: 'rpc-sys',
method: 'upgrade_start', method: 'upgrade_start',
params: ["keep"] params: [ 'keep' ],
}); });
function get_branch(version) { function get_branch(version) {
@ -30,63 +30,76 @@ function get_branch(version) {
// 21.02-SNAPSHOT -> 21.02 // 21.02-SNAPSHOT -> 21.02
// 21.02.0-rc1 -> 21.02 // 21.02.0-rc1 -> 21.02
// 19.07.8 -> 19.07 // 19.07.8 -> 19.07
return version.replace("-SNAPSHOT", "").split(".").slice(0, 2).join("."); return version.replace('-SNAPSHOT', '').split('.').slice(0, 2).join('.');
} }
function get_revision_count(revision) { function get_revision_count(revision) {
return parseInt(revision.substring(1).split("-")[0]) return parseInt(revision.substring(1).split('-')[0]);
} }
function error_api_connect(response) { function error_api_connect(response) {
console.log(response)
ui.showModal(_('Error connecting to upgrade server'), [ ui.showModal(_('Error connecting to upgrade server'), [
E('p', {}, _(`Could not reach API at "${response.url}. Please try again later.`)), E('p', {},
_('Could not reach API at "%s". Please try again later.')
.format(response.url)),
E('pre', {}, response.responseText), E('pre', {}, response.responseText),
E('div', { E('div', {
'class': 'right' class: 'right',
}, [ },
[
E('div', { E('div', {
'class': 'btn', class: 'btn',
'click': ui.hideModal click: ui.hideModal,
}, _('Close')) },
]) _('Close')),
]),
]); ]);
} }
function install_sysupgrade(url, keep, sha256) { function install_sysupgrade(url, keep, sha256) {
displayStatus("notice spinning", E('p', _('Downloading firmware from server to browser'))); displayStatus('notice spinning',
request.get(url, { E('p', _('Downloading firmware from server to browser')));
request
.get(url, {
headers: { headers: {
'Content-Type': 'application/x-www-form-urlencoded' 'Content-Type': 'application/x-www-form-urlencoded',
}, },
responseType: 'blob' responseType: 'blob',
}) })
.then(response => { .then((response) => {
var form_data = new FormData(); var form_data = new FormData();
form_data.append("sessionid", rpc.getSessionID()); form_data.append('sessionid', rpc.getSessionID());
form_data.append("filename", "/tmp/firmware.bin"); form_data.append('filename', '/tmp/firmware.bin');
form_data.append("filemode", 600); form_data.append('filemode', 600);
form_data.append("filedata", response.blob()); form_data.append('filedata', response.blob());
displayStatus("notice spinning", E('p', _('Uploading firmware from browser to device'))); displayStatus('notice spinning',
request.get(`${L.env.cgi_base}/cgi-upload`, { E('p', _('Uploading firmware from browser to device')));
request
.get(`${L.env.cgi_base}/cgi-upload`, {
method: 'PUT', method: 'PUT',
content: form_data content: form_data,
}) })
.then(response => response.json()) .then((response) => response.json())
.then(response => { .then((response) => {
if (response.sha256sum != sha256) { if (response.sha256sum != sha256) {
displayStatus("warning", [ displayStatus('warning', [
E('b', _('Wrong checksum')), E('b', _('Wrong checksum')),
E('p', _('Error during download of firmware. Please try again')), E('p',
_('Error during download of firmware. Please try again')),
E('div', { E('div', {
'class': 'btn', class: 'btn',
'click': ui.hideModal click: ui.hideModal,
}, _('Close')) },
_('Close')),
]); ]);
} else { } else {
displayStatus('warning spinning', E('p', _('Installing the sysupgrade. Do not unpower device!'))); displayStatus(
L.resolveDefault(callUpgradeStart(keep), {}).then(response => { 'warning spinning',
E('p',
_('Installing the sysupgrade. Do not unpower device!')));
L.resolveDefault(callUpgradeStart(keep), {})
.then((response) => {
if (keep) { if (keep) {
ui.awaitReconnect(window.location.host); ui.awaitReconnect(window.location.host);
} else { } else {
@ -102,7 +115,7 @@ function request_sysupgrade(server_url, data) {
var res, req; var res, req;
if (data.request_hash) { if (data.request_hash) {
req = request.get(`${server_url}/api/v1/build/${data.request_hash}`) req = request.get(`${server_url}/api/v1/build/${data.request_hash}`);
} else { } else {
req = request.post(`${server_url}/api/v1/build`, { req = request.post(`${server_url}/api/v1/build`, {
profile: data.board_name, profile: data.board_name,
@ -110,16 +123,16 @@ function request_sysupgrade(server_url, data) {
version: data.version, version: data.version,
packages: data.packages, packages: data.packages,
diff_packages: true, diff_packages: true,
}) });
} }
req.then(response => { req.then((response) => {
switch (response.status) { switch (response.status) {
case 200: case 200:
res = response.json() res = response.json();
var image; var image;
for (image of res.images) { for (image of res.images) {
if (image.type == "sysupgrade") { if (image.type == 'sysupgrade') {
break; break;
} }
} }
@ -127,112 +140,128 @@ function request_sysupgrade(server_url, data) {
var sysupgrade_url = `${server_url}/store/${res.bin_dir}/${image.name}`; var sysupgrade_url = `${server_url}/store/${res.bin_dir}/${image.name}`;
var keep = E('input', { var keep = E('input', {
type: 'checkbox' type: 'checkbox',
}) });
keep.checked = true; keep.checked = true;
var fields = [ var fields = [
_('Version'), `${res.version_number} ${res.version_code}`, _('Version'),
_('File'), E('a', { `${res.version_number} ${res.version_code}`,
'href': sysupgrade_url _('File'),
}, image.name), E('a', {
_('SHA256'), image.sha256, href: sysupgrade_url,
_('Build Date'), res.build_at, },
_('Target'), res.target, image.name),
_('SHA256'),
image.sha256,
_('Build Date'),
res.build_at,
_('Target'),
res.target,
]; ];
var table = E('div', { var table = E('div', {
'class': 'table' class: 'table',
}); });
for (var i = 0; i < fields.length; i += 2) { for (var i = 0; i < fields.length; i += 2) {
table.appendChild(E('div', { table.appendChild(E('tr', {
'class': 'tr' class: 'tr',
}, [ },
E('div', { [
'class': 'td left', E('td', {
'width': '33%' class: 'td left',
}, [fields[i]]), width: '33%',
E('div', { },
'class': 'td left' [ fields[i] ]),
}, [(fields[i + 1] != null) ? fields[i + 1] : '?']) E('td', {
class: 'td left',
},
[ fields[i + 1] ]),
])); ]));
} }
var modal_body = [ var modal_body = [
table, table,
E('p', {}, E('label', { E('p', {class: 'mt-2'},
'class': 'btn' E('label', {
}, [ class: 'btn',
keep, ' ', _('Keep settings and retain the current configuration') },
[
keep, ' ',
_('Keep settings and retain the current configuration')
])), ])),
E('div', { E('div', {
'class': 'right' class: 'right',
}, [ },
[
E('div', { E('div', {
'class': 'btn', class: 'btn',
'click': ui.hideModal click: ui.hideModal,
}, _('Cancel')), },
_('Cancel')),
' ', ' ',
E('div', { E('div', {
'class': 'btn cbi-button-action', class: 'btn cbi-button-action',
'click': function() { click: function() {
install_sysupgrade(sysupgrade_url, keep.checked, image.sha256) install_sysupgrade(sysupgrade_url, keep.checked,
} image.sha256);
}, _('Install Sysupgrade')) },
]) },
] _('Install Sysupgrade')),
]),
];
ui.showModal(_('Successfully created sysupgrade image'), modal_body); ui.showModal(_('Successfully created sysupgrade image'), modal_body);
} }
break; break;
case 202: case 202:
res = response.json() res = response.json();
data.request_hash = res.request_hash; data.request_hash = res.request_hash;
if ("queue_position" in res) if ('queue_position' in res)
displayStatus("notice spinning", E('p', _('Request in build queue position %d'.format(res.queue_position)))); displayStatus('notice spinning',
E('p', _('Request in build queue position %s')
.format(res.queue_position)));
else else
displayStatus("notice spinning", E('p', _('Building firmware sysupgrade image'))); displayStatus('notice spinning',
E('p', _('Building firmware sysupgrade image')));
setTimeout(function() { setTimeout(function() { request_sysupgrade(server_url, data); }, 5000);
request_sysupgrade(server_url, data);
}, 5000);
break; break;
case 400: // bad request case 400: // bad request
case 422: // bad package case 422: // bad package
case 500: // build failed case 500: // build failed
res = response.json() res = response.json();
var body = [ var body = [
E('p', {}, res.detail), E('p', {}, res.detail),
E('p', {}, _("Please report the error message and request")), E('p', {}, _('Please report the error message and request')),
E('b', {}, _("Request to server:")), E('b', {}, _('Request to server:')),
E('pre', {}, JSON.stringify(data, null, 4)), E('pre', {}, JSON.stringify(data, null, 4)),
];
]
if (res.stdout) { if (res.stdout) {
body.push(E('b', {}, "STDOUT:")) body.push(E('b', {}, 'STDOUT:'));
body.push(E('pre', {}, res.stdout)) body.push(E('pre', {}, res.stdout));
} }
if (res.stderr) { if (res.stderr) {
body.push(E('b', {}, "STDERR:")) body.push(E('b', {}, 'STDERR:'));
body.push(E('pre', {}, res.stderr)) body.push(E('pre', {}, res.stderr));
} }
body = body.concat([ body = body.concat([
E('div', { E('div', {
'class': 'right' class: 'right',
}, [ },
[
E('div', { E('div', {
'class': 'btn', class: 'btn',
'click': ui.hideModal click: ui.hideModal,
}, _('Close')) },
]) _('Close')),
]),
]); ]);
ui.showModal(_('Error building the sysupgrade'), body); ui.showModal(_('Error building the sysupgrade'), body);
break; break;
@ -241,23 +270,21 @@ function request_sysupgrade(server_url, data) {
} }
async function check_sysupgrade(server_url, system_board, packages) { async function check_sysupgrade(server_url, system_board, packages) {
var { var {board_name} = system_board;
board_name var {target, version, revision} = system_board.release;
} = system_board;
var {
target,
version,
revision
} = system_board.release;
var current_branch = get_branch(version); var current_branch = get_branch(version);
var advanced_mode = uci.get_first('attendedsysupgrade', 'client', 'advanced_mode') || 0; var advanced_mode =
uci.get_first('attendedsysupgrade', 'client', 'advanced_mode') || 0;
var candidates = []; var candidates = [];
var response; var response;
displayStatus("notice spinning", E('p', _(`Searching for an available sysupgrade of ${version} - ${revision}`))); displayStatus('notice spinning',
E('p', _('Searching for an available sysupgrade of %s - %s')
.format(version, revision)));
if (version.endsWith("SNAPSHOT")) { if (version.endsWith('SNAPSHOT')) {
response = await request.get(`${server_url}/api/v1/revision/${version}/${target}`) response =
await request.get(`${server_url}/api/v1/revision/${version}/${target}`);
if (!response.ok) { if (!response.ok) {
error_api_connect(response); error_api_connect(response);
return; return;
@ -270,7 +297,7 @@ async function check_sysupgrade(server_url, system_board, packages) {
} }
} else { } else {
response = await request.get(`${server_url}/api/overview`, { response = await request.get(`${server_url}/api/overview`, {
timeout: 8000 timeout: 8000,
}); });
if (!response.ok) { if (!response.ok) {
@ -278,7 +305,7 @@ async function check_sysupgrade(server_url, system_board, packages) {
return; return;
} }
const latest = response.json().latest const latest = response.json().latest;
for (let remote_version of latest) { for (let remote_version of latest) {
var remote_branch = get_branch(remote_version); var remote_branch = get_branch(remote_version);
@ -311,8 +338,8 @@ async function check_sysupgrade(server_url, system_board, packages) {
target: target, target: target,
version: candidates[0], version: candidates[0],
packages: Object.keys(packages).sort(), packages: Object.keys(packages).sort(),
} },
} };
m = new form.JSONMap(mapdata, ''); m = new form.JSONMap(mapdata, '');
@ -328,43 +355,46 @@ async function check_sysupgrade(server_url, system_board, packages) {
o = s.option(form.DynamicList, 'packages', 'Packages'); o = s.option(form.DynamicList, 'packages', 'Packages');
} }
m.render().then(function(form_rendered) {
m.render()
.then(function(form_rendered) {
ui.showModal(_('New upgrade available'), [ ui.showModal(_('New upgrade available'), [
form_rendered, form_rendered,
E('div', { E('div', {
'class': 'right' class: 'right',
}, [ },
[
E('div', { E('div', {
'class': 'btn', class: 'btn',
'click': ui.hideModal click: ui.hideModal,
}, _('Cancel')), },
_('Cancel')),
' ', ' ',
E('div', { E('div', {
'class': 'btn cbi-button-action', class: 'btn cbi-button-action',
'click': function() { click: function() {
m.save().then(foo => { m.save().then((foo) => {
request_sysupgrade( request_sysupgrade(server_url, mapdata.request);
server_url, mapdata.request
)
}); });
} },
}, _('Request Sysupgrade')) },
]) _('Request Sysupgrade')),
]),
]); ]);
}); });
} else { } else {
ui.showModal(_('No upgrade available'), [ ui.showModal(_('No upgrade available'), [
E('p', {}, _(`The device runs the latest firmware version ${version} - ${revision}`)), E('p', {},
_('The device runs the latest firmware version %s - %s')
.format(version, revision)),
E('div', { E('div', {
'class': 'right' class: 'right',
}, [ },
[
E('div', { E('div', {
'class': 'btn', class: 'btn',
'click': ui.hideModal click: ui.hideModal,
}, _('Close')) },
]) _('Close')),
]),
]); ]);
} }
} }
@ -388,33 +418,35 @@ return view.extend({
return Promise.all([ return Promise.all([
L.resolveDefault(callPackagelist(), {}), L.resolveDefault(callPackagelist(), {}),
L.resolveDefault(callSystemBoard(), {}), L.resolveDefault(callSystemBoard(), {}),
uci.load('attendedsysupgrade') uci.load('attendedsysupgrade'),
]); ]);
}, },
render: function(res) { render: function(res) {
var packages = res[0].packages; var packages = res[0].packages;
var system_board = res[1]; var system_board = res[1];
var auto_search = uci.get_first('attendedsysupgrade', 'client', 'auto_search') || 1; var auto_search =
uci.get_first('attendedsysupgrade', 'client', 'auto_search') || 1;
var server_url = uci.get_first('attendedsysupgrade', 'server', 'url'); var server_url = uci.get_first('attendedsysupgrade', 'server', 'url');
var view = [ var view = [
E('h2', _("Attended Sysupgrade")), E('h2', _('Attended Sysupgrade')),
E('p', _('The attended sysupgrade service allows to easily upgrade vanilla and custom firmware images.')), E('p',
E('p', _('This is done by building a new firmware on demand via an online service.')) _('The attended sysupgrade service allows to easily upgrade vanilla and custom firmware images.')),
E('p',
_('This is done by building a new firmware on demand via an online service.')),
]; ];
if (auto_search == 1) { if (auto_search == 1) {
check_sysupgrade(server_url, system_board, packages) check_sysupgrade(server_url, system_board, packages);
} }
view.push(E('p', { view.push(E('p', {
'class': 'btn cbi-button-positive', class: 'btn cbi-button-positive',
'click': function() { click:
check_sysupgrade(server_url, system_board, packages) function() { check_sysupgrade(server_url, system_board, packages); },
} },
}, _('Search for sysupgrade'))); _('Search for sysupgrade')));
return view; return view;
}, },
}); });