242 lines
6.4 KiB
HTML
242 lines
6.4 KiB
HTML
<%
|
|
local system_version = require "luci.model.cbi.gpsysupgrade.sysupgrade".get_system_version()
|
|
-%>
|
|
<%+header%>
|
|
<h2 name="content"><%:System upgrade%></h2>
|
|
<%- local c = require("luci.model.uci").cursor():changes(); if c and next(c) then -%>
|
|
<p class="alert-message warning"><%:Warning: There are unsaved changes that will get lost on reboot!%></p>
|
|
<%- end -%>
|
|
|
|
<script type="text/javascript">
|
|
//<![CDATA[
|
|
var sysUpgradeInfo;
|
|
var tokenStr = '<%=token%>';
|
|
var clickToForceUpdateText = '<%:It is the latest version,Reflash?%>';
|
|
var updateSuccessText = '<%:Upgrade successful%>';
|
|
var clickToUpdateText = '<%:Click to Upgrade%>';
|
|
var inProgressText = '<%:Upgrading...%>';
|
|
var unexpectedErrorText = '<%:Unexpected error%>';
|
|
var updateInProgressNotice = '<%:Upgrading, are you sure to close?%>';
|
|
var downloadingText = '<%:Downloading...%>';
|
|
var flashing = '<%:Flashing...%>';
|
|
var checking = '<%:Checking...%>';
|
|
|
|
window.onload = function() {
|
|
var sysupCheckBtn = document.getElementById('_sysup-check_btn');
|
|
checkUpdate_sysup(sysupCheckBtn)
|
|
};
|
|
|
|
function addPageNotice_sysup() {
|
|
window.onbeforeunload = function(e) {
|
|
e.returnValue = updateInProgressNotice;
|
|
return updateInProgressNotice;
|
|
};
|
|
}
|
|
|
|
function removePageNotice_sysup() {
|
|
window.onbeforeunload = null;
|
|
}
|
|
|
|
function onUpdateSuccess_sysup(btn) {
|
|
alert(updateSuccessText);
|
|
|
|
if(btn) {
|
|
btn.value = updateSuccessText;
|
|
btn.placeholder = updateSuccessText;
|
|
btn.disabled = true;
|
|
}
|
|
|
|
window.setTimeout(function() {
|
|
window.location.reload();
|
|
}, 1000);
|
|
}
|
|
|
|
function onRequestError_sysup(btn, errorMessage) {
|
|
btn.disabled = false;
|
|
btn.value = btn.placeholder;
|
|
|
|
if(errorMessage) {
|
|
alert(errorMessage);
|
|
}
|
|
}
|
|
|
|
function onBtnClick_sysup(btn) {
|
|
if(sysUpgradeInfo === undefined) {
|
|
checkUpdate_sysup(btn);
|
|
} else {
|
|
doUpdate_sysup(btn);
|
|
}
|
|
}
|
|
|
|
function checkUpdate_sysup(btn) {
|
|
btn.disabled = true;
|
|
btn.value = checking;
|
|
|
|
addPageNotice_sysup();
|
|
|
|
var ckeckDetailElm = document.getElementById(btn.id + '-detail');
|
|
var updateLogs = document.getElementById('updatelogs');
|
|
|
|
XHR.get('<%=url([[admin]], [[services]], [[gpsysupgrade]], [[sysversion_check]])%>', {
|
|
token: tokenStr,
|
|
model: ''
|
|
}, function(x,json) {
|
|
removePageNotice_sysup();
|
|
|
|
if(json.code) {
|
|
sysUpgradeInfo = undefined;
|
|
onRequestError_sysup(btn, json.error);
|
|
} else {
|
|
document.querySelector('#retain').style.display = '';
|
|
if(json.update) {
|
|
sysUpgradeInfo = json;
|
|
btn.disabled = false;
|
|
btn.value = clickToUpdateText;
|
|
btn.placeholder = clickToUpdateText;
|
|
|
|
if(ckeckDetailElm) {
|
|
var urlNode = '';
|
|
if(json.version) {
|
|
if(json.notice) {
|
|
urlNode = '<em style="color:red;">最新版本号:' + json.version + ' 正式版</em>';
|
|
} else {
|
|
urlNode = '<em style="color:red;">最新版本号:' + json.version + ' 尝鲜版</em>';
|
|
}
|
|
}
|
|
if(json.logs) {
|
|
logs = '<div class="alert alert-message">' + json.logs + '</div>';
|
|
}
|
|
ckeckDetailElm.innerHTML = urlNode;
|
|
updateLogs.innerHTML = logs;
|
|
|
|
}
|
|
} else {
|
|
sysUpgradeInfo = json;
|
|
btn.disabled = false;
|
|
btn.value = clickToForceUpdateText;
|
|
btn.placeholder = clickToForceUpdateText;
|
|
}
|
|
}
|
|
},300);
|
|
}
|
|
|
|
function doUpdate_sysup(btn) {
|
|
btn.disabled = true;
|
|
btn.value = downloadingText;
|
|
|
|
addPageNotice_sysup();
|
|
|
|
var sysUpgradeUrl = '<%=url([[admin]], [[services]], [[gpsysupgrade]], [[sysversion_update]])%>';
|
|
// Download file
|
|
XHR.get(sysUpgradeUrl, {
|
|
token: tokenStr,
|
|
url: sysUpgradeInfo ? sysUpgradeInfo.url : '',
|
|
md5: sysUpgradeInfo ? sysUpgradeInfo.md5 : ''
|
|
}, function(x,json) {
|
|
if(json.code) {
|
|
removePageNotice_sysup();
|
|
onRequestError_sysup(btn, json.error);
|
|
} else {
|
|
btn.value = flashing;
|
|
message.style.display = '';
|
|
label.innerHTML = '<%:Upgrade successful, Waiting for device...%>';
|
|
|
|
var opts = "-u";
|
|
if (!kconfig.checked){
|
|
opts = "-n";
|
|
}
|
|
|
|
if (kopkg.checked){
|
|
opts = "-k";
|
|
}
|
|
if (!kconfig.checked && kopkg.checked){
|
|
opts = "-n -k";
|
|
}
|
|
removePageNotice_sysup();
|
|
setTimeout(check, 8000);
|
|
XHR.get(sysUpgradeUrl, {
|
|
token: tokenStr,
|
|
task: 'flash',
|
|
file: json.file,
|
|
retain: opts
|
|
}, function(x,json) {
|
|
},300)
|
|
}
|
|
},300)
|
|
}
|
|
//]]>
|
|
|
|
</script>
|
|
|
|
<div class="cbi-value">
|
|
<label class="value-title" style="float:left;">
|
|
<%:Current system version%>
|
|
</label>
|
|
|
|
<div class="cbi-value-description">
|
|
<span>【 <%=system_version%> 】</span>
|
|
<span id="_sysup-check_btn-detail"></span>
|
|
</div>
|
|
<style>
|
|
#updatelogs .alert-message p{
|
|
text-align:left;
|
|
}
|
|
#updatelogs .alert-message a{
|
|
color: orangered;
|
|
text-decoration: underline;
|
|
}
|
|
.red{
|
|
color: orangered;
|
|
}
|
|
#updatelogs h4{
|
|
padding-bottom:0;
|
|
}
|
|
#updatelogs h4.title{
|
|
font-size:130%
|
|
}
|
|
</style>
|
|
<pre id="updatelogs" style="font-family:Microsoft Yahei;line-height:1.5rem;white-space:pre-line;"></div>
|
|
<div id="retain" style="display:none;margin:0.5rem;">
|
|
<p style="margin-top:0.4rem;"><button class="btn"><input type="checkbox" checked id="kconfig"> <%:Keep settings and retain the current configuration%></button></p>
|
|
<p style="margin-top:0.5rem;"><button class="btn"><input type="checkbox" checked id="kopkg"> <%:Retain the current packages%></button></p>
|
|
</div>
|
|
<input class="cbi-button cbi-input-apply cbi-button-reset" type="button" id="_sysup-check_btn" onclick="onBtnClick_sysup(this);" value="<%:Check update%>" style="margin-top:0.5rem;"/>
|
|
|
|
</div>
|
|
<p class="alert-message notice reboot-message" style="display:none">
|
|
<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
|
|
<span><%:Device is rebooting...%></span>
|
|
</p>
|
|
<script type="text/javascript">
|
|
//<![CDATA[
|
|
var tries = 0,
|
|
kconfig = document.querySelector('#kconfig'),
|
|
kopkg = document.querySelector('#kopkg');
|
|
var message = document.querySelector('p.reboot-message');
|
|
var label = message.querySelector('span');
|
|
|
|
function ok() {
|
|
window.location = '<%=url("admin")%>';
|
|
}
|
|
|
|
function check() {
|
|
window.setTimeout(ping, 3000);
|
|
}
|
|
|
|
function ping() {
|
|
var img = document.createElement('img');
|
|
|
|
img.onload = ok;
|
|
img.onerror = check;
|
|
img.src = '<%=resource%>/icons/loading.gif?' + Math.random();
|
|
|
|
if (tries++ >= 30) {
|
|
message.classList.remove('notice');
|
|
message.classList.add('warning');
|
|
label.innerHTML = '<%:Device unreachable! Still waiting for device...%>';
|
|
}
|
|
}
|
|
//]]>
|
|
</script>
|
|
<%+footer%>
|