Files
BeWoPlaner/Host/status.htm

172 lines
5.7 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>BeWo Serverstatus</title>
<style>
body {
font-family: sans-serif;
padding: 2rem;
background: #f5f5f5;
}
h1 {
color: #333;
}
.ok {
color: green;
font-weight: bold;
}
.err {
color: red;
font-weight: bold;
}
table {
border-collapse: collapse;
width: 100%;
max-width: 600px;
margin-top: 1rem;
}
td, th {
border: 1px solid #ccc;
padding: 8px 12px;
text-align: left;
}
th {
background: #eee;
}
.msg {
white-space: pre-wrap;
}
</style>
</head>
<body>
<h1>BeWo Serverstatus</h1>
<p id="jsprobe" style="background:#ffe08a; padding:6px;">JavaScript wird NICHT ausgeführt (Active Scripting blockiert?)</p>
<script type="text/javascript">
document.getElementById('jsprobe').innerHTML = 'JavaScript laeuft ✔';
document.getElementById('jsprobe').style.background = '#c7f0c7';
</script>
<p id="error" class="err" style="display:none; white-space:pre-wrap; border:1px solid red; padding:8px; background:#fee;"></p>
<p>Tenant: <span id="tenant"></span></p>
<p>Serverzeit: <span id="time"></span></p>
<p>Serverversion: <span id="serverversion"></span></p>
<p>Assemblyversion: <span id="assemblyversion"></span></p>
<p>Datenbank: <span id="db"></span></p>
<h2>Services</h2>
<table>
<thead><tr><th>Service</th><th>Status</th><th>Meldung</th></tr></thead>
<tbody id="services"></tbody>
</table>
<script type="text/javascript">
// ES5 / IE11-kompatibel: kein fetch, async, Template-Strings, URLSearchParams, Arrow-Funktionen.
function getParam(name) {
var query = window.location.search.substring(1);
var pairs = query.split('&');
for (var i = 0; i < pairs.length; i++) {
var kv = pairs[i].split('=');
if (decodeURIComponent(kv[0]) === name) {
return decodeURIComponent((kv[1] || '').replace(/\+/g, ' '));
}
}
return '';
}
function getTenant() {
return getParam('tenant');
}
function getKey() {
return getParam('key');
}
function showError(msg) {
var err = document.getElementById('error');
err.innerHTML = '';
err.appendChild(document.createTextNode(msg));
err.style.display = 'block';
}
function esc(value) {
var div = document.createElement('div');
div.appendChild(document.createTextNode(value == null ? '' : value));
return div.innerHTML;
}
function render(data) {
document.getElementById('error').style.display = 'none';
document.getElementById('tenant').innerHTML = getTenant() || '';
document.getElementById('time').innerHTML = esc(data.ServerTime);
document.getElementById('serverversion').innerHTML = esc(data.ServerVersion);
document.getElementById('assemblyversion').innerHTML = esc(data.AssemblyVersion);
var db = document.getElementById('db');
db.innerHTML = data.DatabaseOk ? '&#10004; OK' : '&#10008; Fehler';
db.className = data.DatabaseOk ? 'ok' : 'err';
var services = data.Services || [];
var rows = '';
for (var i = 0; i < services.length; i++) {
var svc = services[i];
var cls = svc.IsOk ? 'ok' : 'err';
var symbol = svc.IsOk ? '&#10004; OK' : '&#10008; Fehler';
rows += '<tr>'
+ '<td>' + esc(svc.Name) + '</td>'
+ '<td class="' + cls + '">' + symbol + '</td>'
+ '<td class="msg">' + esc(svc.Message) + '</td>'
+ '</tr>';
}
document.getElementById('services').innerHTML = rows;
}
function load() {
var tenant = getTenant();
var url = 'StatusService.svc/Status';
if (tenant) {
url += '?Tenant=' + encodeURIComponent(tenant);
}
// Cache-Buster: IE cached GET-Anfragen sonst aggressiv.
url += (url.indexOf('?') >= 0 ? '&' : '?') + '_=' + new Date().getTime();
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.setRequestHeader('AppStatusApiKey', getKey());
xhr.onreadystatechange = function () {
if (xhr.readyState !== 4) {
return;
}
var raw = xhr.responseText;
var data;
try {
data = JSON.parse(raw);
} catch (e) {
showError('Keine gueltige JSON-Antwort (HTTP ' + xhr.status + '). Antwort: ' + raw);
return;
}
if ((xhr.status < 200 || xhr.status >= 300) && !data.Services) {
showError('Fehler vom Server (HTTP ' + xhr.status + '): ' + raw);
return;
}
render(data);
};
xhr.onerror = function () {
showError('Netzwerkfehler beim Aufruf von ' + url);
};
xhr.send();
}
load();
setInterval(load, 30000); // alle 30 Sek. aktualisieren
</script>
</body>
</html>