iobroker.eos-admin 7.9.99 → 7.9.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{INSTALL_TEST_V7.9.99.md → INSTALL_TEST_V7.9.100.md} +2 -2
- package/{MERGE_UPDATE_README_V7.9.99.md → MERGE_UPDATE_README_V7.9.100.md} +1 -1
- package/NEXOWATT_EOS_BUILD_INFO.json +19 -20
- package/{PUBLISH_STABLE_V7.9.99.md → PUBLISH_STABLE_V7.9.100.md} +2 -2
- package/README_STABILITY_V7.9.100.md +3 -0
- package/{RELEASE_ACCEPTANCE_V7.9.99.md → RELEASE_ACCEPTANCE_V7.9.100.md} +1 -1
- package/RELEASE_NOTES_V7.9.100.md +11 -0
- package/adminWww/css/eos-auto-update.css +4 -0
- package/adminWww/css/eos-ems-overview.css +1 -1
- package/adminWww/css/nexowatt-native-shell.css +2 -2
- package/adminWww/index.html +21 -19
- package/adminWww/js/eos-account-management.js +1 -1
- package/adminWww/js/eos-assistant.js +1 -1
- package/adminWww/js/eos-auto-update.js +78 -0
- package/adminWww/js/eos-ems-overview.js +1 -1
- package/adminWww/js/eos-release-watch.js +1 -1
- package/adminWww/js/eos-role-bootstrap.js +2 -2
- package/adminWww/js/eos-role-ui.js +2 -2
- package/adminWww/js/nexowatt-native-shell.js +1 -1
- package/adminWww/static/js/nexowatt-stable-login.js +3 -3
- package/adminWww/static/js/{nexowatt-stable-v99.js → nexowatt-stable-v100.js} +2 -2
- package/build/lib/eosAutoUpdate.js +43 -0
- package/build/lib/web.js +48 -0
- package/io-package.json +7 -6
- package/package.json +20 -14
- package/src/lib/eosAutoUpdate.ts +320 -0
- package/tools/nexowatt-account-management-selftest.cjs +1 -1
- package/tools/nexowatt-auto-update-selftest.cjs +34 -0
- package/tools/nexowatt-cache-update-selftest.cjs +6 -5
- package/tools/nexowatt-login-layout-selftest.cjs +3 -3
- package/tools/nexowatt-merge-update-selftest.cjs +1 -1
- package/tools/nexowatt-modern-ui-selftest.cjs +1 -1
- package/tools/nexowatt-runtime-cleanup-selftest.cjs +4 -4
- package/tools/nexowatt-stable-v100-selftest.cjs +27 -0
- package/tools/nexowatt-ui-overview-runtime-selftest.cjs +1 -1
- package/tools/nexowatt-validate-package.cjs +11 -11
- package/README_STABILITY_V7.9.99.md +0 -18
- package/RELEASE_NOTES_V7.9.99.md +0 -9
- package/tools/nexowatt-stable-v99-selftest.cjs +0 -25
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Installationstest 7.9.
|
|
1
|
+
# Installationstest 7.9.100
|
|
2
2
|
|
|
3
3
|
```bash
|
|
4
4
|
cd /opt/iobroker
|
|
5
5
|
iobroker stop eos-admin.0
|
|
6
|
-
npm install --no-save --omit=dev iobroker.eos-admin@7.9.
|
|
6
|
+
npm install --no-save --omit=dev iobroker.eos-admin@7.9.100
|
|
7
7
|
iobroker upload eos-admin
|
|
8
8
|
iobroker restart eos-admin.0
|
|
9
9
|
```
|
|
@@ -1,29 +1,28 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "7.9.
|
|
2
|
+
"version": "7.9.100",
|
|
3
3
|
"channel": "stable-latest",
|
|
4
4
|
"baseFrontend": "validated Admin 7 runtime with truthful EMS overview, in-grid edit controls, short-name password API and release cache invalidation",
|
|
5
5
|
"runtimeEntry": "v84",
|
|
6
|
-
"releaseType": "stable-
|
|
7
|
-
"release": "stable-
|
|
8
|
-
"label": "
|
|
6
|
+
"releaseType": "stable-native-nexowatt-auto-update",
|
|
7
|
+
"release": "stable-native-nexowatt-auto-update",
|
|
8
|
+
"label": "v100",
|
|
9
9
|
"notes": [
|
|
10
|
-
"
|
|
11
|
-
"The
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
10
|
+
"Automatic updates are enabled by default only for installed NexoWatt adapters that have a stable repository entry.",
|
|
11
|
+
"The implementation configures ioBroker native adapterAutoUpgrade policies; EOS does not run an independent package installer.",
|
|
12
|
+
"The Admin/Service user can disable the feature in the EOS cockpit and previous repository/adapter policies are restored.",
|
|
13
|
+
"Third-party adapter upgrade policies remain untouched.",
|
|
14
|
+
"The browser release watcher and cache-safe runtime from 7.9.99 remain active."
|
|
15
15
|
],
|
|
16
16
|
"changes": [
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"Added
|
|
22
|
-
"Added versioned entrypoints, no-store response headers and an automatic release watcher."
|
|
17
|
+
"Added a NexoWatt Stable auto-update manager with repository and installed-adapter detection.",
|
|
18
|
+
"Added an admin-only cockpit toggle and status card.",
|
|
19
|
+
"Added native GET/POST endpoints for update status and enable/disable settings.",
|
|
20
|
+
"Added policy snapshot/restore so disabling reverts only changes owned by EOS.",
|
|
21
|
+
"Added a six-hour reconciliation and repository refresh through the ioBroker host."
|
|
23
22
|
],
|
|
24
|
-
"brandingCacheVersion":
|
|
25
|
-
"shellCacheVersion":
|
|
26
|
-
"nativeShellVersion":
|
|
27
|
-
"shellCacheTag": "
|
|
28
|
-
"repositoryEntry": "nexowatt-eos-admin-repository-entry-
|
|
23
|
+
"brandingCacheVersion": 100,
|
|
24
|
+
"shellCacheVersion": 100,
|
|
25
|
+
"nativeShellVersion": 100,
|
|
26
|
+
"shellCacheTag": "100",
|
|
27
|
+
"repositoryEntry": "nexowatt-eos-admin-repository-entry-v100.json"
|
|
29
28
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Stable-Veröffentlichung 7.9.
|
|
1
|
+
# Stable-Veröffentlichung 7.9.100
|
|
2
2
|
|
|
3
3
|
```powershell
|
|
4
4
|
npm login
|
|
@@ -11,5 +11,5 @@ npm publish --tag latest
|
|
|
11
11
|
Das geprüfte Tarball kann alternativ direkt veröffentlicht werden:
|
|
12
12
|
|
|
13
13
|
```powershell
|
|
14
|
-
npm publish .\iobroker.eos-admin-7.9.
|
|
14
|
+
npm publish .\iobroker.eos-admin-7.9.100.tgz --tag latest
|
|
15
15
|
```
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# NexoWatt EOS Admin 7.9.100 – Stabilität
|
|
2
|
+
|
|
3
|
+
Die native NexoWatt-Autoaktualisierung ist standardmäßig aktiv und kann im Admin-Cockpit deaktiviert werden. Sie setzt ausschließlich für installierte NexoWatt-Adapter aus dem erkannten Stable-Repository die ioBroker-Richtlinie `major`. Fremdadapter bleiben unverändert. Beim Abschalten werden vorherige Richtlinien wiederhergestellt.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# NexoWatt EOS Admin 7.9.100 – Stable Candidate
|
|
2
|
+
|
|
3
|
+
## Automatische NexoWatt Stable-Updates
|
|
4
|
+
|
|
5
|
+
- Standardmäßig aktiviert.
|
|
6
|
+
- Erfasst ausschließlich installierte NexoWatt-Adapter mit einem stabilen Eintrag im erkannten NexoWatt-Repository.
|
|
7
|
+
- Nutzt die native ioBroker-Einstellung `common.automaticUpgrade = major`; kein eigener Paketinstaller.
|
|
8
|
+
- Andere Hersteller und deren vorhandene Update-Richtlinien bleiben unverändert.
|
|
9
|
+
- Im Admin-Cockpit jederzeit deaktivierbar.
|
|
10
|
+
- Beim Deaktivieren werden die zuvor gespeicherten Repository- und Adapterrichtlinien wiederhergestellt.
|
|
11
|
+
- Neu installierte NexoWatt-Adapter werden beim nächsten Abgleich automatisch aufgenommen.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/* NexoWatt EOS native stable auto-update card */
|
|
2
|
+
.eos-nexowatt-auto-update{box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;gap:28px;width:calc(100% - 32px);margin:0 16px 14px;padding:22px 24px;border:1px solid rgba(0,229,138,.28);border-radius:20px;background:linear-gradient(120deg,rgba(0,71,66,.62),rgba(4,25,39,.96) 52%,rgba(4,21,34,.98));color:#effbff;box-shadow:0 16px 36px rgba(0,0,0,.18)}
|
|
3
|
+
.eos-nexowatt-auto-update[data-enabled="false"]{border-color:rgba(117,145,160,.34);background:linear-gradient(120deg,rgba(31,54,65,.72),rgba(4,21,34,.98))}
|
|
4
|
+
.eos-nau-copy{min-width:0;flex:1}.eos-nau-eyebrow{display:block;margin-bottom:5px;color:#00e58a;font-size:.72rem;font-weight:900;letter-spacing:.13em;text-transform:uppercase}.eos-nau-copy h2{margin:0 0 6px;font-size:1.35rem;line-height:1.2}.eos-nau-copy p{max-width:960px;margin:0;color:#a9c2d0;font-size:.82rem;line-height:1.55}.eos-nau-meta{display:flex;flex-wrap:wrap;gap:8px 18px;margin-top:13px;color:#84a8ba;font-size:.72rem}.eos-nau-meta strong{color:#d9f6ee}.eos-nau-adapters{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}.eos-nau-adapters span{padding:5px 9px;border:1px solid rgba(0,229,138,.24);border-radius:999px;background:rgba(0,229,138,.08);color:#b9f6db;font-size:.7rem;font-weight:800}.eos-nau-error{margin-top:10px;padding:8px 10px;border:1px solid rgba(255,183,77,.38);border-radius:9px;background:rgba(255,152,0,.09);color:#ffd18d;font-size:.72rem}.eos-nau-switch{display:grid;grid-template-columns:50px auto;grid-template-rows:auto auto;align-items:center;column-gap:10px;min-width:160px;cursor:pointer}.eos-nau-switch input{position:absolute;opacity:0;pointer-events:none}.eos-nau-track{grid-row:1/3;position:relative;width:50px;height:28px;border:1px solid rgba(130,161,176,.55);border-radius:999px;background:#273e4c;transition:.2s}.eos-nau-thumb{position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;background:#b6c8d1;box-shadow:0 3px 8px rgba(0,0,0,.28);transition:.2s}.eos-nau-switch input:checked+.eos-nau-track{border-color:#00e58a;background:rgba(0,229,138,.26)}.eos-nau-switch input:checked+.eos-nau-track .eos-nau-thumb{left:25px;background:#00e58a}.eos-nau-switch strong{align-self:end;font-size:.82rem}.eos-nau-switch small{align-self:start;color:#83a2b2;font-size:.67rem}.eos-nau-switch input:focus-visible+.eos-nau-track{outline:2px solid #4bdcff;outline-offset:3px}@media(max-width:760px){.eos-nexowatt-auto-update{align-items:flex-start;flex-direction:column}.eos-nau-switch{align-self:flex-end}}
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
.eos-ems-overview-footer { display:grid; }
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
/*
|
|
62
|
+
/* v100: startup and compatibility messages stay compact. */
|
|
63
63
|
.eos-ems-overview-card.is-loading,
|
|
64
64
|
.eos-ems-overview-card.is-unavailable {
|
|
65
65
|
min-height: 0;
|
|
@@ -1292,7 +1292,7 @@ html.eos-route-intro #app-paper [class*="card"] {
|
|
|
1292
1292
|
.eos-assist-header-root .eos-assist-panel { right: 8px !important; width: calc(100vw - 16px); }
|
|
1293
1293
|
}
|
|
1294
1294
|
|
|
1295
|
-
/* NexoWatt EOS 7.9.
|
|
1295
|
+
/* NexoWatt EOS 7.9.100 – orderly login, moderately enlarged. */
|
|
1296
1296
|
html.eos-login,
|
|
1297
1297
|
html.eos-login body {
|
|
1298
1298
|
min-height: 100%;
|
|
@@ -1408,7 +1408,7 @@ html.eos-safe-overview-active #app-paper > :not(.MuiSnackbar-root):not([role="pr
|
|
|
1408
1408
|
.eos-intro-admin-edit-hidden { display: none !important; }
|
|
1409
1409
|
|
|
1410
1410
|
|
|
1411
|
-
/* NexoWatt EOS 7.9.
|
|
1411
|
+
/* NexoWatt EOS 7.9.100 – edit controls belong to the lowest Intro card grid. */
|
|
1412
1412
|
html.eos-route-intro .eos-native-intro-grid {
|
|
1413
1413
|
position: relative !important;
|
|
1414
1414
|
width: 100% !important;
|
package/adminWww/index.html
CHANGED
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
<meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate" />
|
|
9
9
|
<meta http-equiv="Pragma" content="no-cache" />
|
|
10
10
|
<meta http-equiv="Expires" content="0" />
|
|
11
|
-
<script src="./js/eos-release-watch.js?v=
|
|
12
|
-
<script src="./js/eos-manual-write-policy.js?v=
|
|
13
|
-
<script type="module" src="./assets/hostInit-v84.js?v=
|
|
11
|
+
<script src="./js/eos-release-watch.js?v=100"></script>
|
|
12
|
+
<script src="./js/eos-manual-write-policy.js?v=100"></script>
|
|
13
|
+
<script type="module" src="./assets/hostInit-v84.js?v=100"></script>
|
|
14
14
|
|
|
15
15
|
<meta charset="utf-8" />
|
|
16
16
|
<link
|
|
@@ -37,8 +37,9 @@
|
|
|
37
37
|
rel="stylesheet"
|
|
38
38
|
href="css/leaflet.css"
|
|
39
39
|
/>
|
|
40
|
-
<link rel="stylesheet" href="./css/nexowatt-native-shell.css?v=
|
|
41
|
-
<link rel="stylesheet" href="./css/eos-ems-overview.css?v=
|
|
40
|
+
<link rel="stylesheet" href="./css/nexowatt-native-shell.css?v=100" />
|
|
41
|
+
<link rel="stylesheet" href="./css/eos-ems-overview.css?v=100" />
|
|
42
|
+
<link rel="stylesheet" href="./css/eos-auto-update.css?v=100" />
|
|
42
43
|
<link
|
|
43
44
|
rel="manifest"
|
|
44
45
|
href="manifest.json"
|
|
@@ -158,23 +159,24 @@
|
|
|
158
159
|
false,
|
|
159
160
|
);
|
|
160
161
|
</script>
|
|
161
|
-
<link rel="modulepreload" crossorigin href="./assets/preload-helper-BDBacUwf.js?v=
|
|
162
|
-
<link rel="modulepreload" crossorigin href="./assets/iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js?v=
|
|
163
|
-
<script defer src="./js/eos-role-bootstrap.js?v=
|
|
164
|
-
<script defer src="./js/eos-policy-client.js?v=
|
|
165
|
-
<script defer src="./js/eos-branding-sanitizer.js?v=
|
|
166
|
-
<script defer src="./js/nexowatt-native-shell.js?v=
|
|
167
|
-
<script defer src="./js/eos-native-security.js?v=
|
|
168
|
-
<script defer src="./js/eos-basic-settings.js?v=
|
|
169
|
-
<script defer src="./js/eos-role-ui.js?v=
|
|
170
|
-
<script defer src="./js/eos-ems-overview.js?v=
|
|
171
|
-
<script defer src="./js/eos-account-management.js?v=
|
|
172
|
-
<script defer src="./js/eos-
|
|
162
|
+
<link rel="modulepreload" crossorigin href="./assets/preload-helper-BDBacUwf.js?v=100">
|
|
163
|
+
<link rel="modulepreload" crossorigin href="./assets/iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js?v=100">
|
|
164
|
+
<script defer src="./js/eos-role-bootstrap.js?v=100" data-eos-entry="./assets/index-CQZugZ1z-v84.js?v=100"></script>
|
|
165
|
+
<script defer src="./js/eos-policy-client.js?v=100"></script>
|
|
166
|
+
<script defer src="./js/eos-branding-sanitizer.js?v=100"></script>
|
|
167
|
+
<script defer src="./js/nexowatt-native-shell.js?v=100"></script>
|
|
168
|
+
<script defer src="./js/eos-native-security.js?v=100"></script>
|
|
169
|
+
<script defer src="./js/eos-basic-settings.js?v=100"></script>
|
|
170
|
+
<script defer src="./js/eos-role-ui.js?v=100"></script>
|
|
171
|
+
<script defer src="./js/eos-ems-overview.js?v=100"></script>
|
|
172
|
+
<script defer src="./js/eos-account-management.js?v=100"></script>
|
|
173
|
+
<script defer src="./js/eos-auto-update.js?v=100"></script>
|
|
174
|
+
<script defer src="./js/eos-assistant.js?v=100"></script>
|
|
173
175
|
</head>
|
|
174
176
|
<body>
|
|
175
177
|
<noscript>Für NexoWatt EOS muss JavaScript aktiviert sein.</noscript>
|
|
176
178
|
<div id="root"></div>
|
|
177
|
-
<script defer src="static/js/nexowatt-stable-login.js?v=
|
|
178
|
-
<script defer src="static/js/nexowatt-stable-
|
|
179
|
+
<script defer src="static/js/nexowatt-stable-login.js?v=100"></script>
|
|
180
|
+
<script defer src="static/js/nexowatt-stable-v100.js?v=100"></script>
|
|
179
181
|
</body>
|
|
180
182
|
</html>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
const VERSION = '
|
|
4
|
+
const VERSION = 'v100-account-management-password-write';
|
|
5
5
|
const script = document.currentScript || document.querySelector('script[src*="eos-account-management.js"]');
|
|
6
6
|
const base = new URL('../', script?.src || window.location.href);
|
|
7
7
|
const abort = new AbortController();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
'use strict';
|
|
3
|
-
// NexoWatt EOS stable 7.9.
|
|
3
|
+
// NexoWatt EOS stable 7.9.100: EOS Assist remains disabled until the
|
|
4
4
|
// read-only system assistant is rebuilt and accepted separately.
|
|
5
5
|
window.NEXOWATT_EOS_ASSIST_DISABLED = true;
|
|
6
6
|
document.documentElement.classList.add('eos-assist-disabled');
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
'use strict';
|
|
3
|
+
const VERSION = 'v100-nexowatt-stable-auto-update';
|
|
4
|
+
const ROOT_ID = 'eos-nexowatt-auto-update';
|
|
5
|
+
const script = document.currentScript;
|
|
6
|
+
const API = new URL('../nexowatt/updates/', script?.src || document.baseURI).href;
|
|
7
|
+
let busy = false;
|
|
8
|
+
let lastLoad = 0;
|
|
9
|
+
let pollTimer = 0;
|
|
10
|
+
|
|
11
|
+
const role = () => String(window.NEXOWATT_EOS_ACCESS_ROLE || 'admin').toLowerCase();
|
|
12
|
+
const introActive = () => String(location.hash || '').replace(/^#\/?/, '').split(/[/?&]/)[0] === 'tab-intro';
|
|
13
|
+
const esc = value => String(value ?? '').replace(/[&<>'"]/g, char => ({'&':'&','<':'<','>':'>',"'":''','"':'"'}[char]));
|
|
14
|
+
const formatTime = value => value ? new Intl.DateTimeFormat(undefined, { dateStyle: 'short', timeStyle: 'medium' }).format(new Date(value)) : '–';
|
|
15
|
+
|
|
16
|
+
const ensureRoot = () => {
|
|
17
|
+
if (role() !== 'admin' || !introActive()) { document.getElementById(ROOT_ID)?.remove(); return null; }
|
|
18
|
+
let root = document.getElementById(ROOT_ID);
|
|
19
|
+
if (root) return root;
|
|
20
|
+
root = document.createElement('section');
|
|
21
|
+
root.id = ROOT_ID;
|
|
22
|
+
root.className = 'eos-nexowatt-auto-update';
|
|
23
|
+
const hero = document.getElementById('eos-native-overview-hero');
|
|
24
|
+
const ems = document.getElementById('eos-ems-overview-runtime');
|
|
25
|
+
const parent = ems?.parentElement || hero?.parentElement || document.getElementById('app-paper');
|
|
26
|
+
if (!parent) return null;
|
|
27
|
+
if (ems) parent.insertBefore(root, ems); else if (hero?.nextSibling) parent.insertBefore(root, hero.nextSibling); else parent.append(root);
|
|
28
|
+
return root;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const render = status => {
|
|
32
|
+
const root = ensureRoot(); if (!root) return;
|
|
33
|
+
const enabled = status?.enabled !== false;
|
|
34
|
+
const managed = Array.isArray(status?.managedAdapters) ? status.managedAdapters : [];
|
|
35
|
+
const error = String(status?.error || '');
|
|
36
|
+
root.dataset.enabled = String(enabled);
|
|
37
|
+
root.innerHTML = `<div class="eos-nau-copy"><span class="eos-nau-eyebrow">NexoWatt Stable</span><h2>Automatische Adapter-Updates</h2><p>${enabled ? 'Installierte NexoWatt-Adapter werden automatisch aktualisiert, sobald im erkannten Stable-Repository eine neuere stabile Version verfügbar ist.' : 'Automatische NexoWatt-Updates sind deaktiviert. Vorherige ioBroker-Update-Richtlinien wurden wiederhergestellt.'}</p><div class="eos-nau-meta"><span>Repository: <strong>${esc(status?.repository || 'wird erkannt')}</strong></span><span>Letzter Abgleich: <strong>${esc(formatTime(status?.lastSync))}</strong></span><span>Richtlinie: <strong>alle neueren Stable-Versionen</strong></span></div>${managed.length ? `<div class="eos-nau-adapters">${managed.map(name => `<span>${esc(name)}</span>`).join('')}</div>` : ''}${error ? `<div class="eos-nau-error">${esc(error)}</div>` : ''}</div><label class="eos-nau-switch"><input type="checkbox" ${enabled ? 'checked' : ''} ${busy ? 'disabled' : ''}><span class="eos-nau-track"><span class="eos-nau-thumb"></span></span><strong>${enabled ? 'Aktiv' : 'Deaktiviert'}</strong><small>jederzeit änderbar</small></label>`;
|
|
38
|
+
root.querySelector('input')?.addEventListener('change', event => void save(Boolean(event.currentTarget.checked)));
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const request = async (path, options = {}) => {
|
|
42
|
+
const response = await fetch(new URL(path, API), { cache: 'no-store', credentials: 'same-origin', ...options });
|
|
43
|
+
const data = await response.json().catch(() => ({}));
|
|
44
|
+
if (!response.ok) throw new Error(data.error || `HTTP ${response.status}`);
|
|
45
|
+
return data;
|
|
46
|
+
};
|
|
47
|
+
const load = async (force = false) => {
|
|
48
|
+
if (role() !== 'admin' || !introActive()) return;
|
|
49
|
+
if (!force && Date.now() - lastLoad < 5000) return;
|
|
50
|
+
lastLoad = Date.now();
|
|
51
|
+
try { render(await request('status')); }
|
|
52
|
+
catch (error) { render({ enabled: true, error: error?.message || error }); }
|
|
53
|
+
};
|
|
54
|
+
const save = async enabled => {
|
|
55
|
+
if (busy) return;
|
|
56
|
+
busy = true;
|
|
57
|
+
try {
|
|
58
|
+
render({ enabled });
|
|
59
|
+
const status = await request('settings', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-NexoWatt-EOS-Auto-Update': '1' }, body: JSON.stringify({ enabled }) });
|
|
60
|
+
render(status);
|
|
61
|
+
} catch (error) {
|
|
62
|
+
render({ enabled: !enabled, error: error?.message || error });
|
|
63
|
+
} finally { busy = false; }
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
let scheduled = false;
|
|
67
|
+
const schedule = () => { if (scheduled) return; scheduled = true; requestAnimationFrame(() => { scheduled = false; void load(); }); };
|
|
68
|
+
const start = () => {
|
|
69
|
+
void load();
|
|
70
|
+
window.addEventListener('hashchange', () => { lastLoad = 0; schedule(); });
|
|
71
|
+
window.addEventListener('nexowatt-eos-admin-socket-ready', schedule);
|
|
72
|
+
document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'visible') schedule(); });
|
|
73
|
+
new MutationObserver(() => { if (!document.getElementById(ROOT_ID) && introActive()) schedule(); }).observe(document.documentElement, { childList: true, subtree: true });
|
|
74
|
+
pollTimer = window.setInterval(() => void load(true), 30000);
|
|
75
|
+
};
|
|
76
|
+
document.readyState === 'loading' ? document.addEventListener('DOMContentLoaded', start, { once: true }) : start();
|
|
77
|
+
window.NEXOWATT_EOS_AUTO_UPDATE_UI = Object.freeze({ version: VERSION, refresh: load });
|
|
78
|
+
})();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
const VERSION = '
|
|
4
|
+
const VERSION = 'v100-first-login-password-persisted';
|
|
5
5
|
const script = document.currentScript || document.querySelector('script[src*="eos-role-bootstrap.js"]');
|
|
6
6
|
const entry = script?.dataset?.eosEntry || '';
|
|
7
7
|
let launched = false;
|
|
@@ -503,7 +503,7 @@
|
|
|
503
503
|
const { username, password, card, submit } = loginElements();
|
|
504
504
|
if (!username || !password || !card) return;
|
|
505
505
|
card.classList.add('eos-login-card-modern');
|
|
506
|
-
//
|
|
506
|
+
// v100 normal-login first activation: do not add role buttons or a second panel.
|
|
507
507
|
// The account is entered in the existing Loginname field; a blank password is accepted only
|
|
508
508
|
// after the backend confirms that this exact managed account is eligible.
|
|
509
509
|
card.querySelectorAll('.eos-login-role-selector').forEach(element => element.remove());
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
const VERSION = '
|
|
4
|
+
const VERSION = 'v100-native-overview-ems-live-reserve-filter';
|
|
5
5
|
window.NEXOWATT_EOS_ROLE_UI_VERSION = VERSION;
|
|
6
6
|
|
|
7
7
|
const state = {
|
|
@@ -278,7 +278,7 @@
|
|
|
278
278
|
});
|
|
279
279
|
};
|
|
280
280
|
const ensureSafeOverview = () => safe(() => {
|
|
281
|
-
// 7.9.
|
|
281
|
+
// 7.9.100: never cover the real Admin Intro with a second tile surface.
|
|
282
282
|
// Installer and end-user use the native card component; security remains
|
|
283
283
|
// enforced by route/instance filters and backend permissions.
|
|
284
284
|
removeSafeOverview();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
const VERSION = '
|
|
4
|
+
const VERSION = 'v100-nexowatt-native-shell-native-overview';
|
|
5
5
|
const previous = window.NEXOWATT_NATIVE_SHELL;
|
|
6
6
|
if (previous?.version === VERSION) return;
|
|
7
7
|
previous?.destroy?.();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* NexoWatt EOS stable runtime
|
|
1
|
+
/* NexoWatt EOS stable runtime v100 */
|
|
2
2
|
(() => {
|
|
3
3
|
'use strict';
|
|
4
4
|
const MANAGED_USERS = new Set(['installer', 'guest', 'user']);
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
const findSubmit = () => [...document.querySelectorAll('button,input[type="submit"]')].find(element => visible(element) && (/anmelden|login|sign in/i.test((element.textContent || element.value || '').trim()) || element.type === 'submit'));
|
|
15
15
|
const sync = () => {
|
|
16
16
|
if (!isLogin()) return;
|
|
17
|
-
document.documentElement.classList.add('nw-eos-login-
|
|
18
|
-
document.body?.classList.add('nw-eos-login-
|
|
17
|
+
document.documentElement.classList.add('nw-eos-login-v100');
|
|
18
|
+
document.body?.classList.add('nw-eos-login-v100');
|
|
19
19
|
const username = findInput('user');
|
|
20
20
|
const password = findInput('password');
|
|
21
21
|
const submit = findSubmit();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
'use strict';
|
|
3
|
-
const VERSION = '
|
|
3
|
+
const VERSION = 'v100-compact-login-ems-connection';
|
|
4
4
|
const MANAGED_USERS = new Set(['installer', 'guest', 'user']);
|
|
5
5
|
const normalizeUser = value => String(value || '').trim().toLowerCase().replace(/^system\.user\./, '');
|
|
6
6
|
const apply = () => {
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
document.addEventListener('change', schedule, true);
|
|
30
30
|
};
|
|
31
31
|
document.readyState === 'loading' ? document.addEventListener('DOMContentLoaded', start, { once: true }) : start();
|
|
32
|
-
window.
|
|
32
|
+
window.NEXOWATT_EOS_STABLE_V100 = Object.freeze({ version: VERSION, refresh: apply });
|
|
33
33
|
})();
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NexoWattStableUpdateManager = void 0;
|
|
4
|
+
exports.isNexoWattRepositoryEntry = isNexoWattRepositoryEntry;
|
|
5
|
+
const ADMIN_USER = 'system.user.admin';
|
|
6
|
+
const POLICY = 'major';
|
|
7
|
+
const RECONCILE_INTERVAL_MS = 6 * 60 * 60 * 1000;
|
|
8
|
+
const REPOSITORY_REFRESH_DELAY_MS = 2500;
|
|
9
|
+
const clone = value => JSON.parse(JSON.stringify(value));
|
|
10
|
+
const normalizedName = value => String(value || '').trim().replace(/^system\.adapter\./, '').replace(/\.\d+$/, '');
|
|
11
|
+
const stableVersion = value => /^\d+\.\d+\.\d+$/.test(String(value || '').trim());
|
|
12
|
+
function isNexoWattRepositoryEntry(name, entry) {
|
|
13
|
+
const adapterName = normalizedName(entry?.name || name).toLowerCase();
|
|
14
|
+
if (adapterName === 'eos-admin' || adapterName.startsWith('nexowatt-') || adapterName.startsWith('eos-'))
|
|
15
|
+
return true;
|
|
16
|
+
const evidence = JSON.stringify({ name, adapterName, title: entry?.title, desc: entry?.desc, author: entry?.author, authors: entry?.authors, publisher: entry?.publisher, url: entry?.url, meta: entry?.meta, readme: entry?.readme, extIcon: entry?.extIcon, licenseInformation: entry?.licenseInformation }).toLowerCase();
|
|
17
|
+
return evidence.includes('nexowatt') || evidence.includes('github.com/nexowatt/');
|
|
18
|
+
}
|
|
19
|
+
class NexoWattStableUpdateManager {
|
|
20
|
+
adapter;
|
|
21
|
+
timer;
|
|
22
|
+
reconcilePromise;
|
|
23
|
+
refreshTimer;
|
|
24
|
+
retryTimer;
|
|
25
|
+
constructor(adapter) { this.adapter = adapter; }
|
|
26
|
+
get instanceId() { return `system.adapter.${this.adapter.namespace}`; }
|
|
27
|
+
async start() { const status = await this.reconcile('startup'); if (!this.timer) { this.timer = setInterval(() => void this.reconcile('interval'), RECONCILE_INTERVAL_MS); this.timer.unref?.(); } return status; }
|
|
28
|
+
stop() { if (this.timer) clearInterval(this.timer); if (this.refreshTimer) clearTimeout(this.refreshTimer); if (this.retryTimer) clearTimeout(this.retryTimer); this.timer = undefined; this.refreshTimer = undefined; this.retryTimer = undefined; }
|
|
29
|
+
async getStatus(refresh = false) { if (refresh) return this.reconcile('status'); const instance = await this.adapter.getForeignObjectAsync(this.instanceId); return this.statusFromNative(instance?.native || {}); }
|
|
30
|
+
async setEnabled(enabled) { await this.adapter.extendForeignObjectAsync(this.instanceId, { native: { eosNexoWattAutoUpdate: enabled } }, { user: ADMIN_USER }); return this.reconcile(enabled ? 'enabled' : 'disabled'); }
|
|
31
|
+
async reconcile(reason = 'manual') { if (this.reconcilePromise) return this.reconcilePromise; this.reconcilePromise = this.reconcileInternal(reason).finally(() => { this.reconcilePromise = undefined; }); return this.reconcilePromise; }
|
|
32
|
+
statusFromNative(native) { const state = native.eosNexoWattAutoUpdateState || {}; return { enabled: native.eosNexoWattAutoUpdate !== false, repository: String(state.selectedRepository || ''), managedAdapters: Array.isArray(state.managedAdapters) ? state.managedAdapters.map(String).sort() : [], availableStableAdapters: Array.isArray(state.availableStableAdapters) ? state.availableStableAdapters.map(String).sort() : [], lastSync: Number(state.lastSync || 0), lastRepositoryRefresh: Number(state.lastRepositoryRefresh || 0), error: String(state.error || ''), policy: POLICY, source: 'ioBroker-native-auto-upgrade' }; }
|
|
33
|
+
async reconcileInternal(reason) { const instance = await this.adapter.getForeignObjectAsync(this.instanceId); const native = instance?.native || {}; const enabled = native.eosNexoWattAutoUpdate !== false; const state = clone(native.eosNexoWattAutoUpdateState || {}); try { if (!enabled) return await this.disable(state, reason); return await this.enable(state, reason); } catch (error) { const message = error instanceof Error ? error.message : String(error || 'unknownError'); state.error = message; state.lastSync = Date.now(); await this.persist(false, state); this.adapter.log.warn(`[NexoWatt stable updates] ${message}`); return this.statusFromNative({ eosNexoWattAutoUpdate: enabled, eosNexoWattAutoUpdateState: state }); } }
|
|
34
|
+
async readInstalledAdapters() { const view = await this.adapter.getObjectViewAsync('system', 'adapter', { startkey: 'system.adapter.', endkey: 'system.adapter.\u9999' }, { user: ADMIN_USER }); const result = new Map(); for (const row of view?.rows || []) { const object = row?.value || row?.doc; const name = normalizedName(object?.common?.name || row?.id || object?._id); if (name && object?.common?.version) result.set(name, object); } return result; }
|
|
35
|
+
async readRepositorySelection(systemConfig) { const repositories = await this.adapter.getForeignObjectAsync('system.repositories'); const rows = repositories?.native?.repositories || {}; const active = Array.isArray(systemConfig?.common?.activeRepo) ? systemConfig.common.activeRepo.map(String) : []; const candidates = Object.entries(rows).map(([name, repo]) => { const entries = repo?.json && typeof repo.json === 'object' ? repo.json : {}; const stableNames = Object.entries(entries).filter(([entryName, entry]) => stableVersion(entry?.version) && isNexoWattRepositoryEntry(entryName, entry)).map(([entryName, entry]) => normalizedName(entry?.name || entryName)).filter(Boolean); return { name, entries, stableNames: [...new Set(stableNames)].sort(), activeIndex: active.indexOf(name) }; }).filter(row => row.stableNames.length > 0); if (!candidates.length) throw new Error('nexowattStableRepositoryNotFound'); candidates.sort((a, b) => { const aa = a.activeIndex < 0 ? Number.MAX_SAFE_INTEGER : a.activeIndex; const bb = b.activeIndex < 0 ? Number.MAX_SAFE_INTEGER : b.activeIndex; return aa - bb || b.stableNames.length - a.stableNames.length || a.name.localeCompare(b.name); }); return candidates[0]; }
|
|
36
|
+
async enable(state, reason) { const systemConfig = await this.adapter.getForeignObjectAsync('system.config'); if (!systemConfig?.common) throw new Error('systemConfigUnavailable'); const selected = await this.readRepositorySelection(systemConfig); const installed = await this.readInstalledAdapters(); const managedNames = selected.stableNames.filter(name => installed.has(name)).sort(); if (!managedNames.length) throw new Error('noInstalledNexoWattStableAdapters'); state.previousPolicies ||= {}; for (const name of managedNames) { if (!(name in state.previousPolicies)) { const current = installed.get(name)?.common?.automaticUpgrade; state.previousPolicies[name] = current == null ? null : current; } await this.writeAdapterPolicy(name, POLICY); } const common = systemConfig.common; const activeRepo = Array.isArray(common.activeRepo) ? [...common.activeRepo] : []; const auto = common.adapterAutoUpgrade && typeof common.adapterAutoUpgrade === 'object' ? clone(common.adapterAutoUpgrade) : { repositories: {}, defaultPolicy: 'none' }; auto.repositories = auto.repositories && typeof auto.repositories === 'object' ? { ...auto.repositories } : {}; if (state.previousRepositoryEnabled === undefined) state.previousRepositoryEnabled = Object.prototype.hasOwnProperty.call(auto.repositories, selected.name) ? Boolean(auto.repositories[selected.name]) : null; auto.repositories[selected.name] = true; if (!auto.defaultPolicy) auto.defaultPolicy = 'none'; common.adapterAutoUpgrade = auto; if (activeRepo[0] !== selected.name) { if (!state.previousActiveRepo) state.previousActiveRepo = [...activeRepo]; state.ownsActiveRepoOrder = true; common.activeRepo = [selected.name, ...activeRepo.filter(name => name !== selected.name)]; } await this.adapter.setForeignObjectAsync('system.config', systemConfig, { user: ADMIN_USER }); state.selectedRepository = selected.name; state.availableStableAdapters = selected.stableNames; state.managedAdapters = managedNames; state.lastSync = Date.now(); state.error = ''; await this.persist(true, state); this.scheduleRepositoryRefresh(selected.name, state); this.adapter.log.info(`[NexoWatt stable updates] Enabled for ${managedNames.join(', ')} from repository "${selected.name}" (${reason})`); return this.statusFromNative({ eosNexoWattAutoUpdate: true, eosNexoWattAutoUpdateState: state }); }
|
|
37
|
+
async disable(state, reason) { for (const [name, previous] of Object.entries(state.previousPolicies || {})) { const current = await this.adapter.getForeignObjectAsync(`system.adapter.${normalizedName(name)}`); if (current?.common?.automaticUpgrade === POLICY) await this.writeAdapterPolicy(name, previous); } const systemConfig = await this.adapter.getForeignObjectAsync('system.config'); if (systemConfig?.common) { const auto = systemConfig.common.adapterAutoUpgrade && typeof systemConfig.common.adapterAutoUpgrade === 'object' ? clone(systemConfig.common.adapterAutoUpgrade) : null; if (auto && state.selectedRepository) { auto.repositories = auto.repositories && typeof auto.repositories === 'object' ? { ...auto.repositories } : {}; if (auto.repositories[state.selectedRepository] === true) { if (state.previousRepositoryEnabled === null || state.previousRepositoryEnabled === undefined) delete auto.repositories[state.selectedRepository]; else auto.repositories[state.selectedRepository] = state.previousRepositoryEnabled; } systemConfig.common.adapterAutoUpgrade = auto; } if (state.ownsActiveRepoOrder && Array.isArray(state.previousActiveRepo) && Array.isArray(systemConfig.common.activeRepo) && systemConfig.common.activeRepo[0] === state.selectedRepository) systemConfig.common.activeRepo = [...state.previousActiveRepo]; await this.adapter.setForeignObjectAsync('system.config', systemConfig, { user: ADMIN_USER }); } state.previousPolicies = {}; state.previousRepositoryEnabled = undefined; state.previousActiveRepo = undefined; state.ownsActiveRepoOrder = false; state.managedAdapters = []; state.lastSync = Date.now(); state.error = ''; await this.persist(false, state); this.adapter.log.info(`[NexoWatt stable updates] Disabled and previous policies restored (${reason})`); return this.statusFromNative({ eosNexoWattAutoUpdate: false, eosNexoWattAutoUpdateState: state }); }
|
|
38
|
+
async writeAdapterPolicy(name, policy) { const id = `system.adapter.${normalizedName(name)}`; const object = await this.adapter.getForeignObjectAsync(id); if (!object?.common) return; if (policy === null) delete object.common.automaticUpgrade; else object.common.automaticUpgrade = policy; await this.adapter.setForeignObjectAsync(id, object, { user: ADMIN_USER }); }
|
|
39
|
+
async persist(enabled, state) { await this.adapter.extendForeignObjectAsync(this.instanceId, { native: { eosNexoWattAutoUpdate: enabled, eosNexoWattAutoUpdateState: state } }, { user: ADMIN_USER }); }
|
|
40
|
+
scheduleRetry() { if (this.retryTimer) clearTimeout(this.retryTimer); this.retryTimer = setTimeout(() => void this.reconcile('retry'), 60000); this.retryTimer.unref?.(); }
|
|
41
|
+
scheduleRepositoryRefresh(repository, state) { if (!this.adapter.sendToHostAsync || !this.adapter.host) return; if (this.refreshTimer) clearTimeout(this.refreshTimer); this.refreshTimer = setTimeout(() => { void this.adapter.sendToHostAsync?.(this.adapter.host, 'getRepository', { repo: repository, update: true }).then(async () => { const current = await this.adapter.getForeignObjectAsync(this.instanceId); if (current?.native?.eosNexoWattAutoUpdate === false) return; state.lastRepositoryRefresh = Date.now(); await this.persist(true, state); }).catch(error => this.adapter.log.warn(`[NexoWatt stable updates] Repository refresh failed: ${error instanceof Error ? error.message : error}`)); }, REPOSITORY_REFRESH_DELAY_MS); this.refreshTimer.unref?.(); }
|
|
42
|
+
}
|
|
43
|
+
exports.NexoWattStableUpdateManager = NexoWattStableUpdateManager;
|
package/build/lib/web.js
CHANGED
|
@@ -23,6 +23,7 @@ const cookieParser = require("cookie-parser");
|
|
|
23
23
|
const iobroker_mcp_1 = require("iobroker.mcp");
|
|
24
24
|
const eosPassword_1 = require("./eosPassword");
|
|
25
25
|
const eosRequestSecurity_1 = require("./eosRequestSecurity");
|
|
26
|
+
const eosAutoUpdate_1 = require("./eosAutoUpdate");
|
|
26
27
|
let AdapterStore;
|
|
27
28
|
/** Content of a socket-io file */
|
|
28
29
|
let socketIoFile;
|
|
@@ -1250,6 +1251,38 @@ class Web {
|
|
|
1250
1251
|
],
|
|
1251
1252
|
});
|
|
1252
1253
|
}
|
|
1254
|
+
getNexoWattStableUpdateManager() {
|
|
1255
|
+
this.nexowattStableUpdateManager ||= new eosAutoUpdate_1.NexoWattStableUpdateManager(this.adapter);
|
|
1256
|
+
return this.nexowattStableUpdateManager;
|
|
1257
|
+
}
|
|
1258
|
+
async sendNexoWattStableUpdateStatus(req, res) {
|
|
1259
|
+
const access = await this.getEosRequestAccess(req);
|
|
1260
|
+
if (access.role !== 'admin') {
|
|
1261
|
+
res.status(403).json({ error: 'permissionError' });
|
|
1262
|
+
return;
|
|
1263
|
+
}
|
|
1264
|
+
res.status(200).json(await this.getNexoWattStableUpdateManager().getStatus(false));
|
|
1265
|
+
}
|
|
1266
|
+
async saveNexoWattStableUpdateSettings(req, res) {
|
|
1267
|
+
const access = await this.getEosRequestAccess(req);
|
|
1268
|
+
if (access.role !== 'admin') {
|
|
1269
|
+
res.status(403).json({ error: 'permissionError' });
|
|
1270
|
+
return;
|
|
1271
|
+
}
|
|
1272
|
+
if (req.headers['x-nexowatt-eos-auto-update'] !== '1') {
|
|
1273
|
+
res.status(403).json({ error: 'invalidRequest' });
|
|
1274
|
+
return;
|
|
1275
|
+
}
|
|
1276
|
+
if (!this.isEosSameOriginWrite(req)) {
|
|
1277
|
+
res.status(403).json({ error: 'invalidRequestOrigin' });
|
|
1278
|
+
return;
|
|
1279
|
+
}
|
|
1280
|
+
if (typeof req.body?.enabled !== 'boolean') {
|
|
1281
|
+
res.status(400).json({ error: 'invalidEnabledValue' });
|
|
1282
|
+
return;
|
|
1283
|
+
}
|
|
1284
|
+
res.status(200).json(await this.getNexoWattStableUpdateManager().setEnabled(req.body.enabled));
|
|
1285
|
+
}
|
|
1253
1286
|
isEosSameOriginWrite(req) {
|
|
1254
1287
|
return (0, eosRequestSecurity_1.isEosSameOriginRequest)(req.headers);
|
|
1255
1288
|
}
|
|
@@ -1483,6 +1516,21 @@ class Web {
|
|
|
1483
1516
|
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
|
|
1484
1517
|
next();
|
|
1485
1518
|
});*/
|
|
1519
|
+
void this.getNexoWattStableUpdateManager().start().catch(error => {
|
|
1520
|
+
this.adapter.log.warn(`[NexoWatt stable updates] Startup reconciliation failed: ${error instanceof Error ? error.message : error}`);
|
|
1521
|
+
});
|
|
1522
|
+
this.server.app.get('/nexowatt/updates/status', (req, res) => {
|
|
1523
|
+
void this.sendNexoWattStableUpdateStatus(req, res).catch(error => {
|
|
1524
|
+
this.adapter.log.warn(`[NexoWatt stable updates] Cannot read status: ${error instanceof Error ? error.message : error}`);
|
|
1525
|
+
res.status(500).json({ error: 'autoUpdateStatusFailed' });
|
|
1526
|
+
});
|
|
1527
|
+
});
|
|
1528
|
+
this.server.app.post('/nexowatt/updates/settings', (req, res) => {
|
|
1529
|
+
void this.saveNexoWattStableUpdateSettings(req, res).catch(error => {
|
|
1530
|
+
this.adapter.log.warn(`[NexoWatt stable updates] Cannot save settings: ${error instanceof Error ? error.message : error}`);
|
|
1531
|
+
res.status(500).json({ error: 'autoUpdateSettingsFailed' });
|
|
1532
|
+
});
|
|
1533
|
+
});
|
|
1486
1534
|
this.server.app.get('/version', (_req, res) => {
|
|
1487
1535
|
res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');
|
|
1488
1536
|
res.setHeader('Pragma', 'no-cache');
|
package/io-package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "eos-admin",
|
|
4
|
-
"version": "7.9.
|
|
4
|
+
"version": "7.9.100",
|
|
5
5
|
"titleLang": {
|
|
6
6
|
"en": "NexoWatt EOS Admin",
|
|
7
7
|
"de": "NexoWatt EOS Admin",
|
|
@@ -329,7 +329,7 @@
|
|
|
329
329
|
"icon": "admin.svg",
|
|
330
330
|
"messagebox": true,
|
|
331
331
|
"enabled": true,
|
|
332
|
-
"extIcon": "https://unpkg.com/iobroker.eos-admin@7.9.
|
|
332
|
+
"extIcon": "https://unpkg.com/iobroker.eos-admin@7.9.100/admin/admin.svg",
|
|
333
333
|
"keywords": [
|
|
334
334
|
"NexoWatt",
|
|
335
335
|
"EOS",
|
|
@@ -340,7 +340,7 @@
|
|
|
340
340
|
"licensed"
|
|
341
341
|
],
|
|
342
342
|
"compact": true,
|
|
343
|
-
"readme": "https://unpkg.com/iobroker.eos-admin@7.9.
|
|
343
|
+
"readme": "https://unpkg.com/iobroker.eos-admin@7.9.100/README.md",
|
|
344
344
|
"authors": [
|
|
345
345
|
"NexoWatt"
|
|
346
346
|
],
|
|
@@ -408,7 +408,7 @@
|
|
|
408
408
|
"nondeletable": false,
|
|
409
409
|
"allowAdapterUpdate": true,
|
|
410
410
|
"allowAdapterDelete": false,
|
|
411
|
-
"meta": "https://unpkg.com/iobroker.eos-admin@7.9.
|
|
411
|
+
"meta": "https://unpkg.com/iobroker.eos-admin@7.9.100/io-package.json",
|
|
412
412
|
"npmPackage": "iobroker.eos-admin",
|
|
413
413
|
"packetName": "iobroker.eos-admin",
|
|
414
414
|
"publisher": "NexoWatt"
|
|
@@ -549,7 +549,8 @@
|
|
|
549
549
|
"eosAllowPasswordlessFirstLogin": false,
|
|
550
550
|
"eosRequireFirstLoginPasswordChange": true,
|
|
551
551
|
"eosAutoAssignStandardAccounts": true,
|
|
552
|
-
"eosAssistEnabled": false
|
|
552
|
+
"eosAssistEnabled": false,
|
|
553
|
+
"eosNexoWattAutoUpdate": true
|
|
553
554
|
},
|
|
554
555
|
"notifications": [
|
|
555
556
|
{
|
|
@@ -1117,5 +1118,5 @@
|
|
|
1117
1118
|
}
|
|
1118
1119
|
}
|
|
1119
1120
|
},
|
|
1120
|
-
"version": "7.9.
|
|
1121
|
+
"version": "7.9.100"
|
|
1121
1122
|
}
|