mirror of
https://github.com/remittor/zapret-openwrt.git
synced 2026-01-27 04:40:34 +03:00
210 lines
7.2 KiB
JavaScript
210 lines
7.2 KiB
JavaScript
'use strict';
|
|
'require baseclass';
|
|
'require fs';
|
|
'require poll';
|
|
'require uci';
|
|
'require ui';
|
|
'require view';
|
|
'require view.zapret2.tools as tools';
|
|
|
|
const btn_style_neutral = 'btn';
|
|
const btn_style_action = 'btn cbi-button-action';
|
|
const btn_style_positive = 'btn cbi-button-save important';
|
|
const btn_style_negative = 'btn cbi-button-reset important';
|
|
const btn_style_warning = 'btn cbi-button-negative';
|
|
const btn_style_success = 'btn cbi-button-success important';
|
|
|
|
const fn_update_pkg_sh = '/opt/'+tools.appName+'/update-pkg.sh';
|
|
|
|
return baseclass.extend({
|
|
releasesUrlPrefix : 'https://raw.githubusercontent.com/remittor/zapret-openwrt/gh-pages/releases/',
|
|
|
|
appendLog: function(msg, end = '\n')
|
|
{
|
|
this.logArea.value += msg + end;
|
|
this.logArea.scrollTop = this.logArea.scrollHeight;
|
|
},
|
|
|
|
setBtnMode: function(check, install, cancel)
|
|
{
|
|
this.btn_check.disabled = check ? false : true;
|
|
this.btn_install.disabled = install ? false : true;
|
|
this.btn_cancel.disabled = cancel ? false : true;
|
|
},
|
|
|
|
setStage: function(stage, btn_flag = true)
|
|
{
|
|
if (stage == 0) this.setBtnMode(1, 0, 1);
|
|
if (stage == 1) this.setBtnMode(0, 0, 1);
|
|
if (stage == 2) this.setBtnMode(1, 1, 1);
|
|
if (stage == 3) this.setBtnMode(0, 0, 0);
|
|
if (stage == 8) this.setBtnMode(0, 0, 1);
|
|
if (stage >= 9) this.setBtnMode(0, 0, 0);
|
|
this.stage = stage;
|
|
},
|
|
|
|
checkUpdates: async function(ev)
|
|
{
|
|
this._action = 'checkUpdates';
|
|
this.setStage(1);
|
|
this.pkg_url = null;
|
|
this.appendLog(_('Checking for updates...'));
|
|
let cmd = [ fn_update_pkg_sh, '-c' ]; // check for updates
|
|
if (document.getElementById('cfg_exclude_prereleases').checked == false) {
|
|
cmd.push('-p'); // include prereleases ZIP-files
|
|
}
|
|
this.forced_reinstall = document.getElementById('cfg_forced_reinstall').checked;
|
|
return tools.execAndRead({
|
|
cmd: cmd,
|
|
log: '/tmp/'+tools.appName+'_pkg_check.log',
|
|
logArea: this.logArea,
|
|
callback: this.execAndReadCallback,
|
|
cbarg: this, // wnd
|
|
});
|
|
},
|
|
|
|
installUpdates: async function(ev)
|
|
{
|
|
if (!this.pkg_url || this.pkg_url.length < 10) {
|
|
this.appendLog('ERROR: pkg_url = null');
|
|
this.setStage(9);
|
|
return;
|
|
}
|
|
this._action = 'installUpdates';
|
|
this.setStage(3);
|
|
this.appendLog(_('Install updates...'));
|
|
let cmd = [ fn_update_pkg_sh, '-u', this.pkg_url ]; // update packages
|
|
if (document.getElementById('cfg_forced_reinstall').checked == true) {
|
|
cmd.push('-f'); // forced reinstall if same version
|
|
}
|
|
//this._test = 1; cmd.push('-t'); cmd.push('45'); // only for testing
|
|
return tools.execAndRead({
|
|
cmd: cmd,
|
|
log: '/tmp/'+tools.appName+'_pkg_install.log',
|
|
logArea: this.logArea,
|
|
hiderow: /^ \* resolve_conffiles.*(?:\r?\n|$)/gm,
|
|
callback: this.execAndReadCallback,
|
|
cbarg: this, // wnd
|
|
});
|
|
},
|
|
|
|
execAndReadCallback: function(wnd, rc, txt = '')
|
|
{
|
|
//console.log('execAndReadCallback = ' + rc + '; _action = ' + wnd._action);
|
|
if (rc == 0 && txt) {
|
|
let code = txt.match(/^RESULT:\s*\(([^)]+)\)\s+.+$/m);
|
|
if (wnd._action == 'checkUpdates') {
|
|
wnd.appendLog('=========================================================');
|
|
if (code && code[1] == 'E') {
|
|
wnd.btn_install.textContent = _('Reinstall');
|
|
} else {
|
|
wnd.btn_install.textContent = _('Install');
|
|
}
|
|
let pkg_url = txt.match(/^ZAP_PKG_URL\s*=\s*(.+)$/m);
|
|
if (code && pkg_url) {
|
|
if (!wnd.forced_reinstall) {
|
|
if (code[1] == 'E' || code[1] == 'G') {
|
|
wnd.setStage(0); // install not needed
|
|
return;
|
|
}
|
|
}
|
|
wnd.pkg_url = pkg_url[1];
|
|
wnd.setStage(2); // enable all buttons
|
|
return; // install allowed
|
|
}
|
|
}
|
|
if (wnd._action == 'installUpdates') {
|
|
if (wnd._test || (code && code[1] == '+')) {
|
|
wnd.setStage(9);
|
|
wnd.appendLog('Please update WEB-page (press F5)');
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
wnd.setStage(0);
|
|
if (rc >= 500) {
|
|
if (txt) {
|
|
wnd.appendLog(txt.startsWith('ERROR') ? txt : 'ERROR: ' + txt);
|
|
} else {
|
|
wnd.appendLog('ERROR: ' + wnd._action + ': Terminated with error code = ' + rc);
|
|
}
|
|
} else {
|
|
wnd.appendLog('ERROR: Process finished with retcode = ' + rc);
|
|
}
|
|
wnd.appendLog('=========================================================');
|
|
},
|
|
|
|
openUpdateDialog: function(pkg_arch)
|
|
{
|
|
this.stage = 0;
|
|
this.pkg_arch = pkg_arch;
|
|
this.pkg_url = null;
|
|
|
|
let exclude_prereleases = E('label', [
|
|
E('input', { type: 'checkbox', id: 'cfg_exclude_prereleases', checked: true }),
|
|
' ', _('Exclude PreReleases')
|
|
]);
|
|
|
|
let forced_reinstall = E('label', [
|
|
E('input', { type: 'checkbox', id: 'cfg_forced_reinstall'}),
|
|
' ', _('Forced reinstall packages')
|
|
]);
|
|
|
|
this.logArea = E('textarea', {
|
|
'id': 'widget.modal_content',
|
|
'readonly': true,
|
|
'style': 'width:100% !important; font-family: monospace;',
|
|
'rows': 20,
|
|
'wrap': 'off',
|
|
});
|
|
|
|
this.btn_cancel = E('button', {
|
|
'id': 'btn_cancel',
|
|
'name': 'btn_cancel',
|
|
'class': btn_style_warning,
|
|
}, _('Cancel'));
|
|
this.btn_cancel.onclick = ui.hideModal;
|
|
|
|
this.btn_check = E('button', {
|
|
'id': 'btn_check',
|
|
'name': 'btn_check',
|
|
'class': btn_style_action,
|
|
}, _('Check'));
|
|
this.btn_check.onclick = ui.createHandlerFn(this, this.checkUpdates);
|
|
|
|
this.btn_install = E('button', {
|
|
'id': 'btn_install',
|
|
'name': 'btn_install',
|
|
'class': btn_style_positive,
|
|
}, _('Install'));
|
|
this.btn_install.onclick = ui.createHandlerFn(this, async () => {
|
|
let res = await this.installUpdates();
|
|
if (true) {
|
|
setTimeout(() => {
|
|
this.btn_install.disabled = true;
|
|
}, 0);
|
|
}
|
|
});
|
|
|
|
this.setStage(0);
|
|
|
|
ui.showModal(_('Check for updates and install'), [
|
|
E('div', { 'class': 'cbi-section' }, [
|
|
exclude_prereleases,
|
|
E('br'), E('br'),
|
|
forced_reinstall,
|
|
E('br'), E('br'),
|
|
E('hr'),
|
|
this.logArea,
|
|
]),
|
|
E('div', { 'class': 'right' }, [
|
|
this.btn_check,
|
|
' ',
|
|
this.btn_install,
|
|
' ',
|
|
this.btn_cancel,
|
|
])
|
|
]);
|
|
}
|
|
});
|