mirror of
https://github.com/Laxilef/OTGateway.git
synced 2025-12-11 18:54:28 +05:00
231 lines
7.8 KiB
HTML
231 lines
7.8 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title data-i18n>upgrade.title</title>
|
|
<link rel="stylesheet" href="/static/app.css?{BUILD_TIME}">
|
|
</head>
|
|
|
|
<body>
|
|
<header class="container">
|
|
<nav>
|
|
<ul>
|
|
<li>
|
|
<a href="/">
|
|
<div class="logo" data-i18n>logo</div>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
<ul>
|
|
<li>
|
|
<select id="lang" aria-label="Lang">
|
|
<option value="en" selected>EN</option>
|
|
<option value="cn">CN</option>
|
|
<option value="it">IT</option>
|
|
<option value="nl">NL</option>
|
|
<option value="ru">RU</option>
|
|
</select>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</header>
|
|
|
|
<main class="container">
|
|
<article>
|
|
<div>
|
|
<hgroup>
|
|
<h2 data-i18n>upgrade.section.backupAndRestore</h2>
|
|
<p data-i18n>upgrade.section.backupAndRestore.desc</p>
|
|
</hgroup>
|
|
|
|
<form action="/api/backup/restore" id="restore">
|
|
<label for="restore-file">
|
|
<span data-i18n>upgrade.settingsFile</span>
|
|
<input type="file" name="settings" id="restore-file" accept=".json">
|
|
</label>
|
|
|
|
<div role="group">
|
|
<button type="submit" data-i18n>button.restore</button>
|
|
<button type="button" class="secondary" onclick="window.location='/api/backup/save';" data-i18n>button.backup</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</article>
|
|
|
|
<article>
|
|
<div>
|
|
<hgroup>
|
|
<h2 data-i18n>upgrade.section.upgrade</h2>
|
|
<p data-i18n>upgrade.section.upgrade.desc</p>
|
|
</hgroup>
|
|
|
|
<form action="/api/upgrade" id="upgrade">
|
|
<fieldset class="primary">
|
|
<label>
|
|
<span data-i18n>upgrade.fw</span>:
|
|
<div class="grid">
|
|
<input type="file" name="fw" accept=".bin">
|
|
<button type="button" class="fwResult hidden" disabled></button>
|
|
</div>
|
|
</label>
|
|
|
|
<label>
|
|
<span data-i18n>upgrade.fs</span>:
|
|
<div class="grid">
|
|
<input type="file" name="fs" accept=".bin">
|
|
<button type="button" class="fsResult hidden" disabled></button>
|
|
</div>
|
|
</label>
|
|
</fieldset>
|
|
|
|
<ul>
|
|
<li><mark data-i18n>upgrade.note.disclaimer1</mark></li>
|
|
<li><mark data-i18n>upgrade.note.disclaimer2</mark></li>
|
|
</ul>
|
|
|
|
<button type="submit" data-i18n>button.upgrade</button>
|
|
</form>
|
|
</div>
|
|
</article>
|
|
</main>
|
|
|
|
<footer class="container">
|
|
<small>
|
|
<b>Made by Laxilef</b>
|
|
• <a href="https://github.com/Laxilef/OTGateway/blob/master/LICENSE" target="_blank" class="secondary" data-i18n>nav.license</a>
|
|
• <a href="https://github.com/Laxilef/OTGateway/blob/master/" target="_blank" class="secondary" data-i18n>nav.source</a>
|
|
• <a href="https://github.com/Laxilef/OTGateway/wiki" target="_blank" class="secondary" data-i18n>nav.help</a>
|
|
• <a href="https://github.com/Laxilef/OTGateway/issues" target="_blank" class="secondary" data-i18n>nav.issues</a>
|
|
• <a href="https://github.com/Laxilef/OTGateway/releases" target="_blank" class="secondary" data-i18n>nav.releases</a>
|
|
</small>
|
|
</footer>
|
|
|
|
<script src="/static/app.js?{BUILD_TIME}"></script>
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
const lang = new Lang(document.getElementById('lang'));
|
|
lang.build();
|
|
|
|
setupRestoreBackupForm('#restore');
|
|
|
|
const upgradeForm = document.querySelector('#upgrade');
|
|
if (upgradeForm) {
|
|
upgradeForm.reset();
|
|
const statusToText = (status) => {
|
|
switch (status) {
|
|
case 0:
|
|
return "None";
|
|
case 1:
|
|
return "No file";
|
|
case 2:
|
|
return "Success";
|
|
case 3:
|
|
return "Prohibited";
|
|
case 4:
|
|
return "Size mismatch";
|
|
case 5:
|
|
return "Error on start";
|
|
case 6:
|
|
return "Error on write";
|
|
case 7:
|
|
return "Error on finish";
|
|
default:
|
|
return "Unknown";
|
|
}
|
|
};
|
|
|
|
upgradeForm.addEventListener('submit', async (event) => {
|
|
event.preventDefault();
|
|
|
|
hide('.fwResult');
|
|
hide('.fsResult');
|
|
|
|
let button = upgradeForm.querySelector('button[type="submit"]');
|
|
button.textContent = i18n('button.uploading');
|
|
button.setAttribute('disabled', true);
|
|
button.setAttribute('aria-busy', true);
|
|
|
|
try {
|
|
let fd = new FormData();
|
|
|
|
const fw = upgradeForm.querySelector("[name='fw']").files;
|
|
if (fw.length > 0) {
|
|
fd.append("fw_size", fw[0].size);
|
|
fd.append("fw", fw[0]);
|
|
}
|
|
|
|
const fs = upgradeForm.querySelector("[name='fs']").files;
|
|
if (fs.length > 0) {
|
|
fd.append("fs_size", fs[0].size);
|
|
fd.append("fs", fs[0]);
|
|
}
|
|
|
|
let response = await fetch(upgradeForm.action, {
|
|
method: "POST",
|
|
cache: "no-cache",
|
|
credentials: "include",
|
|
body: fd
|
|
});
|
|
|
|
if (response.status != 202 && response.status != 406) {
|
|
throw new Error('Response not valid');
|
|
}
|
|
|
|
const result = await response.json();
|
|
let resItem = upgradeForm.querySelector('.fwResult');
|
|
if (resItem && result.firmware.status > 1) {
|
|
resItem.textContent = statusToText(result.firmware.status);
|
|
resItem.classList.remove('hidden');
|
|
|
|
if (result.firmware.status == 2) {
|
|
resItem.classList.remove('failed');
|
|
resItem.classList.add('success');
|
|
} else {
|
|
resItem.classList.remove('success');
|
|
resItem.classList.add('failed');
|
|
|
|
if (result.firmware.error != "") {
|
|
resItem.textContent += `: ${result.firmware.error}`;
|
|
}
|
|
}
|
|
}
|
|
|
|
resItem = upgradeForm.querySelector('.fsResult');
|
|
if (resItem && result.filesystem.status > 1) {
|
|
resItem.textContent = statusToText(result.filesystem.status);
|
|
resItem.classList.remove('hidden');
|
|
|
|
if (result.filesystem.status == 2) {
|
|
resItem.classList.remove('failed');
|
|
resItem.classList.add('success');
|
|
} else {
|
|
resItem.classList.remove('success');
|
|
resItem.classList.add('failed');
|
|
|
|
if (result.filesystem.error != "") {
|
|
resItem.textContent += `: ${result.filesystem.error}`;
|
|
}
|
|
}
|
|
}
|
|
|
|
} catch (err) {
|
|
console.log(err);
|
|
button.textContent = i18n('button.error');
|
|
button.classList.add('failed');
|
|
|
|
} finally {
|
|
setTimeout(() => {
|
|
button.removeAttribute('aria-busy');
|
|
button.removeAttribute('disabled');
|
|
button.classList.remove('success', 'failed');
|
|
button.textContent = i18n(button.dataset.i18n);
|
|
upgradeForm.reset();
|
|
}, 10000);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html> |