Compare commits

...

24 Commits

Author SHA1 Message Date
rhino 079fa0a7da docs: CHANGELOG.md VI3DGL 2026-06-21 01:10:10 +02:00
Gitea Action 3d69675654 ci: CHECKSUMS.txt bei Veröffentlichung erzeugt 2026-06-20 23:06:58 +00:00
Rhino 9a6e0b7143 feat: Veröffentlichen-Knopf (workflow_dispatch) — Release ohne Terminal 2026-06-21 00:49:48 +02:00
Gitea Action fc6e89668c DRIVE: v3.6.0 (2026-06-20T20:09) 2026-06-20 20:09:58 +00:00
Gitea Action f1050ea3b8 FLD-Schichtplanung: v1.0.0 (2026-06-20T20:09) 2026-06-20 20:09:44 +00:00
Gitea Action f8db1abd65 VI3DGL: v1.4.2 (2026-06-20T20:09) 2026-06-20 20:09:31 +00:00
Rhino fcbce978d4 fix(KRITISCH): Exclude strikt als Array (verifiziert mit echtem PowerShell) 2026-06-20 22:09:12 +02:00
Rhino 86447d49b1 fix(KRITISCH): Exclude-Array korrekt aufbauen - ForWipe entpackte zu Skalar, Restore haette .backup/Content geloescht 2026-06-20 22:09:12 +02:00
Gitea Action 430a1db0a7 Portal_Union: v1.0.0 (2026-06-20T19:52) 2026-06-20 19:52:26 +00:00
Gitea Action 8d1f0381bd DRIVE: v3.6.0 (2026-06-20T19:51) 2026-06-20 19:51:20 +00:00
Gitea Action edf6019b45 FLD-Schichtplanung: v1.0.0 (2026-06-20T19:51) 2026-06-20 19:51:06 +00:00
Gitea Action 9628fc2c7b VI3DGL: v1.4.2 (2026-06-20T19:50) 2026-06-20 19:50:50 +00:00
Rhino 7bdb0b0c13 fix: Rollback beachtet .backupignore (Content-Ordner unangetastet) 2026-06-20 21:50:46 +02:00
Rhino b25354723e fix: Snapshot-Ausschlussliste (.backupignore) gegen GB-grosse Content-Ordner 2026-06-20 21:50:46 +02:00
Rhino 64d30948b0 fix: CHECKSUMS am Release erzeugen + Auth via Header 2026-06-20 21:38:31 +02:00
Rhino 9db5217eec fix: Rollback auf ZIP-Snapshot (offline-faehig, kanonische Referenz) 2026-06-20 21:38:30 +02:00
Rhino f29345c1d1 fix: transaktionales Update mit ZIP-Snapshot (1:1) + Auto-Rollback 2026-06-20 21:38:30 +02:00
Rhino 29a47a758b fix: Mirror-Action trigger nur auf release-Branch (kein Auto-Deploy von main) 2026-06-20 20:23:46 +02:00
Rhino 2ce45c9bb6 feat: zentrales rollback.ps1 — stellt Stand vor Update wieder her 2026-06-20 20:23:46 +02:00
Rhino 1486289d45 fix: DistBase → updates.rhino.nrw + erweitertes Backup (data/) + Checksum-Prüfung
Mirror to Public Gitea (updates.rhino.nrw) / mirror (push) Waiting to run
2026-06-20 20:22:46 +02:00
Gitea Action a51d0c0205 DRIVE: v3.6.0 (2026-06-20T17:18)
Mirror to Public Gitea (updates.rhino.nrw) / mirror (push) Waiting to run
2026-06-20 17:18:03 +00:00
Gitea Action 88603b1857 FLD-Schichtplanung: v1.0.0 (2026-06-20T17:17)
Mirror to Public Gitea (updates.rhino.nrw) / mirror (push) Waiting to run
2026-06-20 17:17:32 +00:00
Gitea Action e191320eb8 VI3DGL: v1.4.2 (2026-06-20T17:16)
Mirror to Public Gitea (updates.rhino.nrw) / mirror (push) Waiting to run
2026-06-20 17:16:59 +00:00
Rhino 0c5015f176 ci: add mirror action to public Gitea 2026-06-20 19:14:59 +02:00
17 changed files with 6660 additions and 5959 deletions
+49
View File
@@ -0,0 +1,49 @@
name: 📦 Veröffentlichen → updates.rhino.nrw
# Zwei Wege, denselben Job auszulösen:
# • workflow_dispatch: KNOPF in Gitea (Actions-Tab → "Run workflow") — kein Terminal.
# Veröffentlicht den aktuellen Stand aus 'main' (Staging) nach updates.rhino.nrw.
# • push auf 'release': für das CLI-Skript release.py (Power-User-Weg).
on:
workflow_dispatch:
inputs:
hinweis:
description: "Optional: Version/Notiz (nur fürs Protokoll)"
required: false
push:
branches: [release]
jobs:
mirror:
runs-on: ubuntu-latest
steps:
- name: Checkout (full history)
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: CHECKSUMS.txt pro Projekt frisch erzeugen
run: |
for d in */ ; do
d="${d%/}"
if ls "$d"/sync-bundle-*.txt >/dev/null 2>&1; then
( cd "$d" && sha256sum sync-bundle-*.txt sync-entpacken.bat 2>/dev/null > CHECKSUMS.txt )
echo "CHECKSUMS.txt erzeugt für $d"
fi
done
- name: Commit (nur im Runner, fließt in den public-Mirror)
run: |
git config user.email "action@gitea.rhino.nrw"
git config user.name "Gitea Action"
git add -A
git commit -m "ci: CHECKSUMS.txt bei Veröffentlichung erzeugt" || echo "Keine Änderung."
- name: Push nach Public-Gitea (updates.rhino.nrw)
env:
PUBLIC_GITEA_TOKEN: ${{ secrets.PUBLIC_GITEA_TOKEN }}
run: |
AUTH=$(printf 'rhino:%s' "$PUBLIC_GITEA_TOKEN" | base64 | tr -d '\n')
git -c http.extraHeader="Authorization: Basic $AUTH" \
push http://172.30.0.4:3053/rhino/StatusQuo_Updates.git HEAD:main --force
echo "Veröffentlicht: $(cat VI3DGL/VERSION 2>/dev/null) — Hinweis: ${{ github.event.inputs.hinweis }}"
+3
View File
@@ -0,0 +1,3 @@
b1a4e69eaa33c15a51bc8b082cd305c8d8c3a94a4e4a3f3d5d14040a28221f1e sync-bundle-01.txt
ab0a7311b0deb8ad4b59cfbcb91adc7b97e0a8c52658acfd0faf54f90df02047 sync-bundle-02.txt
95bdd3993481ac8ec937f1adb09bf1851735619dca2dd4283c7608f13f0e1e7e sync-entpacken.bat
+2 -1
View File
@@ -1,4 +1,4 @@
# 29 Dateien in 2 Bundles # 30 Dateien in 2 Bundles
sync-bundle-01.txt DRIVE_Start.bat sync-bundle-01.txt DRIVE_Start.bat
sync-bundle-01.txt DRIVE_Stop.bat sync-bundle-01.txt DRIVE_Stop.bat
sync-bundle-01.txt VERSION sync-bundle-01.txt VERSION
@@ -27,4 +27,5 @@ sync-bundle-01.txt data/governance.template.json
sync-bundle-01.txt data/index.js sync-bundle-01.txt data/index.js
sync-bundle-01.txt favicon.ico sync-bundle-01.txt favicon.ico
sync-bundle-02.txt index.html sync-bundle-02.txt index.html
sync-bundle-02.txt rollback.bat
sync-bundle-02.txt server.ps1 sync-bundle-02.txt server.ps1
+725 -632
View File
File diff suppressed because it is too large Load Diff
+8
View File
@@ -0,0 +1,8 @@
e5f1fe817b91b5d9643ea7c77df0ce71db31dfc731aa2800300f57109f5a0034 sync-bundle-01.txt
58c85e2b8f475288c0c441cf3bdb91c55ae8e9d0c159fbccb189e276fb6a6509 sync-bundle-02.txt
4cc212461953ad756f99f812fd093b90b1dfb2f45c1b0ca4080c73aa077d4c17 sync-bundle-03.txt
a2969b7e51352f303e6c1dd45824b4547f7c9c790516ae7218494a280c94f64e sync-bundle-04.txt
595b27a8ecffded3850dc6808ee22b2564e00bdade317196dc4a721e760e1705 sync-bundle-05.txt
478bbbe43f248720c7bfb5b528443edbe25b609bc748583449082fd1e8357a0b sync-bundle-06.txt
456a7ecdfa06bd4fdb8e23c40b5c0c9016b68927e0225e3763dbf0b5dce3a228 sync-bundle-07.txt
7a01035e06091884352a146208f5afb618e8c381cae8267fe8360bf7c2cd2554 sync-entpacken.bat
+2 -1
View File
@@ -1,4 +1,4 @@
# 143 Dateien in 7 Bundles # 144 Dateien in 7 Bundles
sync-bundle-01.txt FLD_Planung.bat sync-bundle-01.txt FLD_Planung.bat
sync-bundle-01.txt Images/fussball/1._FC_Heidenheim.svg sync-bundle-01.txt Images/fussball/1._FC_Heidenheim.svg
sync-bundle-01.txt Images/fussball/1._FC_Koeln.svg sync-bundle-01.txt Images/fussball/1._FC_Koeln.svg
@@ -138,6 +138,7 @@ sync-bundle-05.txt js/ui/rte.js
sync-bundle-05.txt js/ui/theme-branding.js sync-bundle-05.txt js/ui/theme-branding.js
sync-bundle-05.txt js/ui/toast.js sync-bundle-05.txt js/ui/toast.js
sync-bundle-05.txt js/wochenplan/wochenplan.js sync-bundle-05.txt js/wochenplan/wochenplan.js
sync-bundle-05.txt rollback.bat
sync-bundle-06.txt server.ps1 sync-bundle-06.txt server.ps1
sync-bundle-06.txt style.css sync-bundle-06.txt style.css
sync-bundle-06.txt sync-worker.js sync-bundle-06.txt sync-worker.js
+93
View File
@@ -11737,3 +11737,96 @@ IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHdpbmRvdy5wcmludCgpOwogICAg
ICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5y ICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5y
ZW1vdmUoJ2RydWNrZW4td29jaGVucGxhbicpOyB9LCA1MDApOwogICAgICAgIH0sIDgwKTsKICAg ZW1vdmUoJ2RydWNrZW4td29jaGVucGxhbicpOyB9LCA1MDApOwogICAgICAgIH0sIDgwKTsKICAg
IH0pOwp9Cg== IH0pOwp9Cg==
### FILE: rollback.bat | 5226
QGVjaG8gb2ZmCnNldGxvY2FsCnNldCAiQkRJUj0lfmRwMCIKZWNoby4KZWNobyAgPT09IEZMRC1T
Y2hpY2h0cGxhbnVuZzogUm9sbGJhY2sgKG9mZmxpbmUpID09PQplY2hvICBTdGVsbHQgZGVuIFN0
YW5kIHZvciBkZW0gbGV0enRlbiBVcGRhdGUgd2llZGVyIGhlci4KZWNoby4KcG93ZXJzaGVsbCAt
Tm9Qcm9maWxlIC1FeGVjdXRpb25Qb2xpY3kgQnlwYXNzIC1Db21tYW5kICIkbT0nIyMjIFBTJysn
Q09ERSAjIyMnOyRtZT1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCclfmYwJyk7JHA9JG1lLkluZGV4
T2YoJG0pOyRubD0kbWUuSW5kZXhPZihbY2hhcl0xMCwkcCk7JHJvb3Q9JGVudjpCRElSLlRyaW1F
bmQoJ1wnKTskc3RvcEJhdD0nJzskc3RhcnRCYXQ9J0ZMRF9QbGFudW5nLmJhdCc7SW52b2tlLUV4
cHJlc3Npb24gJG1lLlN1YnN0cmluZygkbmwrMSkiCmVjaG8uCnBhdXNlCmV4aXQgL2IKIyMjIFBT
Q09ERSAjIyMKJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJwojIEVyd2FydGV0IGltIFNj
b3BlOiAkcm9vdCwgJHN0b3BCYXQsICRzdGFydEJhdAokX3N0b3BOYW1lICA9IGlmICgkbnVsbCAt
bmUgJHN0b3BCYXQpICB7ICRzdG9wQmF0IH0gIGVsc2UgeyAnc3RvcC5iYXQnIH0KJF9zdGFydE5h
bWUgPSBpZiAoJG51bGwgLW5lICRzdGFydEJhdCkgeyAkc3RhcnRCYXQgfSBlbHNlIHsgJ2RnbC5i
YXQnIH0KCiMgQXVzc2NobHVzc2xpc3RlIChpZGVudGlzY2ggenUgdXBkYXRlLnBzMSk6IC5iYWNr
dXAgbmllIGFuZmFzc2VuLCBwbHVzIGdyb8OfZQojIENvbnRlbnQtT3JkbmVyIGF1cyAuYmFja3Vw
aWdub3JlIOKAlCBkaWVzZSBibGVpYmVuIGJlaW0gUm9sbGJhY2sgdW52ZXLDpG5kZXJ0LgokX2V4
Y2wgPSBAKCcuYmFja3VwJykKJF9pZ25vcmVGaWxlID0gSm9pbi1QYXRoICRyb290ICcuYmFja3Vw
aWdub3JlJwppZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkX2lnbm9yZUZpbGUpIHsKICAgICRf
ZXh0cmEgPSBAKEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCAkX2lnbm9yZUZpbGUgfCBGb3JFYWNo
LU9iamVjdCB7ICRfLlRyaW0oKSB9IHwKICAgICAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7ICRf
IC1uZSAnJyAtYW5kIC1ub3QgJF8uU3RhcnRzV2l0aCgnIycpIH0pCiAgICAkX2V4Y2wgPSAkX2V4
Y2wgKyAkX2V4dHJhCn0KJF9leGNsID0gQCgkX2V4Y2wpICAgIyBzdHJpa3QgYWxzIEFycmF5ICh2
ZXJoaW5kZXJ0IFNrYWxhci1FbnRwYWNrdW5nKQoKJGJrID0gSm9pbi1QYXRoICRyb290ICcuYmFj
a3VwJwppZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkYmspKSB7CiAgICBXcml0ZS1I
b3N0ICJLZWluIEJhY2t1cC1WZXJ6ZWljaG5pcyBnZWZ1bmRlbi4gU2ljaGVydW5nZW4gZW50c3Rl
aGVuIGF1dG9tYXRpc2NoIGJlaW0gZXJzdGVuIFVwZGF0ZS4iIC1Gb3JlZ3JvdW5kQ29sb3IgUmVk
CiAgICByZXR1cm4KfQokc25hcHMgPSBHZXQtQ2hpbGRJdGVtIC1MaXRlcmFsUGF0aCAkYmsgLUZp
bHRlciAnc25hcHNob3QtKi56aXAnIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlIHwgU29y
dC1PYmplY3QgTmFtZSAtRGVzY2VuZGluZwppZiAoLW5vdCAkc25hcHMpIHsKICAgIFdyaXRlLUhv
c3QgIktlaW5lIFNpY2hlcnVuZ2VuIHZvcmhhbmRlbi4gU2ljaGVydW5nZW4gZW50c3RlaGVuIGF1
dG9tYXRpc2NoIGJlaW0gZXJzdGVuIFVwZGF0ZS4iIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCiAgICBy
ZXR1cm4KfQoKV3JpdGUtSG9zdCAiIgpXcml0ZS1Ib3N0ICJWZXJmw7xnYmFyZSBTaWNoZXJ1bmdl
biAobmV1ZXN0ZSB6dWVyc3QpOiIgLUZvcmVncm91bmRDb2xvciBDeWFuCiRpID0gMApmb3JlYWNo
ICgkcyBpbiAkc25hcHMpIHsKICAgICRzaXplID0gJ3swOk4xfSBNQicgLWYgKCRzLkxlbmd0aCAv
IDFNQikKICAgICR0YWcgID0gaWYgKCRpIC1lcSAwKSB7ICIgIDwtIG5ldWVzdGUiIH0gZWxzZSB7
ICIiIH0KICAgIFdyaXRlLUhvc3QgKCIgIFt7MH1dIHsxfSAgKHsyfSl7M30iIC1mICRpLCAkcy5O
YW1lLCAkc2l6ZSwgJHRhZykKICAgICRpKysKfQpXcml0ZS1Ib3N0ICIiCiRjID0gUmVhZC1Ib3N0
ICJOdW1tZXIgZGVyIFNpY2hlcnVuZyB3w6RobGVuIChFbnRlciA9IG5ldWVzdGUgWzBdKSIKaWYg
KCRjIC1lcSAnJykgeyAkYyA9ICcwJyB9CmlmICgkYyAtbm90bWF0Y2ggJ15cZCskJyAtb3IgW2lu
dF0kYyAtZ2UgJHNuYXBzLkNvdW50KSB7CiAgICBXcml0ZS1Ib3N0ICJVbmfDvGx0aWdlIEF1c3dh
aGwuIEFiZ2Vicm9jaGVuLiIgLUZvcmVncm91bmRDb2xvciBZZWxsb3cKICAgIHJldHVybgp9CiRj
aG9zZW4gPSAkc25hcHNbW2ludF0kY10KJHppcCAgICA9ICRjaG9zZW4uRnVsbE5hbWUKCiMgSW50
ZWdyaXTDpHQgZGVyIFNpY2hlcnVuZyBwcsO8ZmVuLCBCRVZPUiBpcmdlbmRldHdhcyBlcnNldHp0
IHdpcmQKQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uRmlsZVN5
c3RlbQp0cnkgewogICAgJHogPSBbU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEZpbGVdOjpPcGVu
UmVhZCgkemlwKQogICAgJG51bGwgPSAkei5FbnRyaWVzLkNvdW50CiAgICAkei5EaXNwb3NlKCkK
fSBjYXRjaCB7CiAgICBXcml0ZS1Ib3N0ICJGRUhMRVI6IFNpY2hlcnVuZyBpc3QgYmVzY2jDpGRp
Z3Qg4oCUIFJvbGxiYWNrIGFiZ2Vicm9jaGVuOiAkemlwIiAtRm9yZWdyb3VuZENvbG9yIFJlZAog
ICAgcmV0dXJuCn0KCldyaXRlLUhvc3QgIiIKJHluID0gUmVhZC1Ib3N0ICJTdGFuZCAnJCgkY2hv
c2VuLk5hbWUpJyB3aWVkZXJoZXJzdGVsbGVuPyBEZXIgYWt0dWVsbGUgU3RhbmQgd2lyZCBlcnNl
dHp0ISBbai9OXSIKaWYgKCR5biAtbm90aW4gJ2onLCdKJywneScsJ1knKSB7IFdyaXRlLUhvc3Qg
IkFiZ2Vicm9jaGVuLiI7IHJldHVybiB9CgojIFNlcnZlciBzdG9wcGVuCldyaXRlLUhvc3QgIlN0
b3BwZSBTZXJ2ZXIgLi4uIgppZiAoJF9zdG9wTmFtZSAtbmUgJycpIHsKICAgICRzcCA9IEpvaW4t
UGF0aCAkcm9vdCAkX3N0b3BOYW1lCiAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkc3Ap
IHsgJiBjbWQgL2MgImAiJHNwYCIiOyBTdGFydC1TbGVlcCAtU2Vjb25kcyAyIH0KICAgIGVsc2Ug
eyBXcml0ZS1Ib3N0ICIgIChTdG9wLVNrcmlwdCAnJF9zdG9wTmFtZScgbmljaHQgZ2VmdW5kZW4g
4oCUIMO8YmVyc3BydW5nZW4pIiAtRm9yZWdyb3VuZENvbG9yIERhcmtZZWxsb3cgfQp9IGVsc2Ug
eyBXcml0ZS1Ib3N0ICIgIChLZWluIFN0b3AtU2tyaXB0IGtvbmZpZ3VyaWVydCDigJQgw7xiZXJz
cHJ1bmdlbikiIC1Gb3JlZ3JvdW5kQ29sb3IgRGFya1llbGxvdyB9CgojIEFrdHVlbGxlbiBTdGFu
ZCBiZWlzZWl0ZSB2ZXJzY2hpZWJlbiAoU2ljaGVyaGVpdHNuZXR6LCBrZWluIERhdGVudmVybHVz
dCkKJGFzaWRlID0gSm9pbi1QYXRoICRiayAoIl92b3Itcm9sbGJhY2stIiArIChHZXQtRGF0ZSAt
Rm9ybWF0ICd5eXl5TU1kZC1ISG1tc3MnKSkKTmV3LUl0ZW0gLUl0ZW1UeXBlIERpcmVjdG9yeSAt
UGF0aCAkYXNpZGUgLUZvcmNlIHwgT3V0LU51bGwKR2V0LUNoaWxkSXRlbSAtTGl0ZXJhbFBhdGgg
JHJvb3QgLUZvcmNlIHwgV2hlcmUtT2JqZWN0IHsgJF9leGNsIC1ub3Rjb250YWlucyAkXy5OYW1l
IH0gfCBGb3JFYWNoLU9iamVjdCB7CiAgICBNb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICRfLkZ1bGxO
YW1lIC1EZXN0aW5hdGlvbiAoSm9pbi1QYXRoICRhc2lkZSAkXy5OYW1lKSAtRm9yY2UKfQoKIyBT
aWNoZXJ1bmcgd2llZGVyaGVyc3RlbGxlbgp0cnkgewogICAgRXhwYW5kLUFyY2hpdmUgLUxpdGVy
YWxQYXRoICR6aXAgLURlc3RpbmF0aW9uUGF0aCAkcm9vdCAtRm9yY2UKICAgIFdyaXRlLUhvc3Qg
IlN0YW5kIHdpZWRlcmhlcmdlc3RlbGx0OiAkKCRjaG9zZW4uTmFtZSkiIC1Gb3JlZ3JvdW5kQ29s
b3IgR3JlZW4KfSBjYXRjaCB7CiAgICBXcml0ZS1Ib3N0ICJGRUhMRVIgYmVpbSBXaWVkZXJoZXJz
dGVsbGVuIOKAlCBtYWNoZSDDhG5kZXJ1bmcgcsO8Y2tnw6RuZ2lnIC4uLiIgLUZvcmVncm91bmRD
b2xvciBSZWQKICAgIEdldC1DaGlsZEl0ZW0gLUxpdGVyYWxQYXRoICRyb290IC1Gb3JjZSB8IFdo
ZXJlLU9iamVjdCB7ICRfZXhjbCAtbm90Y29udGFpbnMgJF8uTmFtZSB9IHwKICAgICAgICBSZW1v
dmUtSXRlbSAtUmVjdXJzZSAtRm9yY2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAg
IEdldC1DaGlsZEl0ZW0gLUxpdGVyYWxQYXRoICRhc2lkZSAtRm9yY2UgfCBGb3JFYWNoLU9iamVj
dCB7CiAgICAgICAgTW92ZS1JdGVtIC1MaXRlcmFsUGF0aCAkXy5GdWxsTmFtZSAtRGVzdGluYXRp
b24gKEpvaW4tUGF0aCAkcm9vdCAkXy5OYW1lKSAtRm9yY2UKICAgIH0KICAgIFdyaXRlLUhvc3Qg
IlZvcmhlcmlnZXIgWnVzdGFuZCB3aWVkZXJoZXJnZXN0ZWxsdCDigJQga2VpbiBEYXRlbnZlcmx1
c3QuIiAtRm9yZWdyb3VuZENvbG9yIFllbGxvdwogICAgcmV0dXJuCn0KCiMgQmVpc2VpdGUtT3Jk
bmVyIGF1ZnLDpHVtZW46IG51ciBkaWUgbGV0enRlbiAyIGJlaGFsdGVuCkdldC1DaGlsZEl0ZW0g
LUxpdGVyYWxQYXRoICRiayAtRGlyZWN0b3J5IC1GaWx0ZXIgJ192b3Itcm9sbGJhY2stKicgLUVy
cm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUgfAogICAgU29ydC1PYmplY3QgTmFtZSAtRGVzY2Vu
ZGluZyB8IFNlbGVjdC1PYmplY3QgLVNraXAgMiB8CiAgICBSZW1vdmUtSXRlbSAtUmVjdXJzZSAt
Rm9yY2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKCiMgU2VydmVyIHN0YXJ0ZW4KJHN0
cCA9IEpvaW4tUGF0aCAkcm9vdCAkX3N0YXJ0TmFtZQppZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0
aCAkc3RwKSB7CiAgICBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAnY21kLmV4ZScgLUFyZ3VtZW50
TGlzdCAiL2MgYCIkc3RwYCIiIC1XaW5kb3dTdHlsZSBIaWRkZW4KICAgIFdyaXRlLUhvc3QgIlNl
cnZlciBnZXN0YXJ0ZXQuIiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCn0gZWxzZSB7CiAgICBXcml0
ZS1Ib3N0ICJTdGFydC1Ta3JpcHQgJyRfc3RhcnROYW1lJyBuaWNodCBnZWZ1bmRlbiDigJQgYml0
dGUgU2VydmVyIG1hbnVlbGwgc3RhcnRlbi4iIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93Cn0KCldy
aXRlLUhvc3QgIiIKV3JpdGUtSG9zdCAiPT09IFJvbGxiYWNrIGFiZ2VzY2hsb3NzZW4gPT09IiAt
Rm9yZWdyb3VuZENvbG9yIEdyZWVuCldyaXRlLUhvc3QgIiAgICBXaWVkZXJoZXJnZXN0ZWxsdDog
JCgkY2hvc2VuLk5hbWUpIiAtRm9yZWdyb3VuZENvbG9yIEN5YW4K
File diff suppressed because it is too large Load Diff
+2
View File
@@ -0,0 +1,2 @@
0eaeaeadf1c298b6d17fc2ad236a061a832e305815a6398d36d78b98779c3e49 sync-bundle-01.txt
b917548cba1a6a6ada3bf6c71107e9c3496664b65777194eb50340c73fb79597 sync-entpacken.bat
+2 -1
View File
@@ -1,4 +1,4 @@
# 40 Dateien in 1 Bundles # 41 Dateien in 1 Bundles
sync-bundle-01.txt Synchron_test.html sync-bundle-01.txt Synchron_test.html
sync-bundle-01.txt VERSION sync-bundle-01.txt VERSION
sync-bundle-01.txt assets/css/portal.css sync-bundle-01.txt assets/css/portal.css
@@ -39,3 +39,4 @@ sync-bundle-01.txt helfer/Portal-Pflege-starten.bat
sync-bundle-01.txt helfer/hol_bao_medien.ps1 sync-bundle-01.txt helfer/hol_bao_medien.ps1
sync-bundle-01.txt helfer/portal_helfer.ps1 sync-bundle-01.txt helfer/portal_helfer.ps1
sync-bundle-01.txt index.html sync-bundle-01.txt index.html
sync-bundle-01.txt rollback.bat
+92
View File
@@ -13409,3 +13409,95 @@ dCIpOwogICAgc2V0KCJiYW8taWMiLCAic2hpZWxkIik7CiAgICB2YXIgZXQgPSBkb2N1bWVudC5n
ZXRFbGVtZW50QnlJZCgiZWRpdC10YWciKTsgaWYgKGV0KSBldC5pbnNlcnRBZGphY2VudEhUTUwo ZXRFbGVtZW50QnlJZCgiZWRpdC10YWciKTsgaWYgKGV0KSBldC5pbnNlcnRBZGphY2VudEhUTUwo
ImFmdGVyYmVnaW4iLCBQLmljKCJlZGl0IikgKyAiICIpOwogIH0pKCk7Cjwvc2NyaXB0Pgo8L2Jv ImFmdGVyYmVnaW4iLCBQLmljKCJlZGl0IikgKyAiICIpOwogIH0pKCk7Cjwvc2NyaXB0Pgo8L2Jv
ZHk+CjwvaHRtbD4K ZHk+CjwvaHRtbD4K
### FILE: rollback.bat | 5145
QGVjaG8gb2ZmCnNldGxvY2FsCnNldCAiQkRJUj0lfmRwMCIKZWNoby4KZWNobyAgPT09IFBvcnRh
bCBVbmlvbjogUm9sbGJhY2sgKG9mZmxpbmUpID09PQplY2hvICBTdGVsbHQgZGVuIFN0YW5kIHZv
ciBkZW0gbGV0enRlbiBVcGRhdGUgd2llZGVyIGhlci4KZWNoby4KcG93ZXJzaGVsbCAtTm9Qcm9m
aWxlIC1FeGVjdXRpb25Qb2xpY3kgQnlwYXNzIC1Db21tYW5kICIkbT0nIyMjIFBTJysnQ09ERSAj
IyMnOyRtZT1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCclfmYwJyk7JHA9JG1lLkluZGV4T2YoJG0p
OyRubD0kbWUuSW5kZXhPZihbY2hhcl0xMCwkcCk7JHJvb3Q9JGVudjpCRElSLlRyaW1FbmQoJ1wn
KTskc3RvcEJhdD0nSGVsZmVyLWJlZW5kZW4uYmF0Jzskc3RhcnRCYXQ9J1BvcnRhbC1QZmxlZ2Ut
c3RhcnRlbi5iYXQnO0ludm9rZS1FeHByZXNzaW9uICRtZS5TdWJzdHJpbmcoJG5sKzEpIgplY2hv
LgpwYXVzZQpleGl0IC9iCiMjIyBQU0NPREUgIyMjCiRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAn
U3RvcCcKIyBFcndhcnRldCBpbSBTY29wZTogJHJvb3QsICRzdG9wQmF0LCAkc3RhcnRCYXQKJF9z
dG9wTmFtZSAgPSBpZiAoJG51bGwgLW5lICRzdG9wQmF0KSAgeyAkc3RvcEJhdCB9ICBlbHNlIHsg
J3N0b3AuYmF0JyB9CiRfc3RhcnROYW1lID0gaWYgKCRudWxsIC1uZSAkc3RhcnRCYXQpIHsgJHN0
YXJ0QmF0IH0gZWxzZSB7ICdkZ2wuYmF0JyB9CgojIEF1c3NjaGx1c3NsaXN0ZSAoaWRlbnRpc2No
IHp1IHVwZGF0ZS5wczEpOiAuYmFja3VwIG5pZSBhbmZhc3NlbiwgcGx1cyBncm/Dn2UKIyBDb250
ZW50LU9yZG5lciBhdXMgLmJhY2t1cGlnbm9yZSDigJQgZGllc2UgYmxlaWJlbiBiZWltIFJvbGxi
YWNrIHVudmVyw6RuZGVydC4KJF9leGNsID0gQCgnLmJhY2t1cCcpCiRfaWdub3JlRmlsZSA9IEpv
aW4tUGF0aCAkcm9vdCAnLmJhY2t1cGlnbm9yZScKaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGgg
JF9pZ25vcmVGaWxlKSB7CiAgICAkX2V4Y2wgKz0gKEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCAk
X2lnbm9yZUZpbGUgfCBGb3JFYWNoLU9iamVjdCB7ICRfLlRyaW0oKSB9IHwKICAgICAgICAgICAg
ICAgV2hlcmUtT2JqZWN0IHsgJF8gLW5lICcnIC1hbmQgLW5vdCAkXy5TdGFydHNXaXRoKCcjJykg
fSkKfQoKJGJrID0gSm9pbi1QYXRoICRyb290ICcuYmFja3VwJwppZiAoLW5vdCAoVGVzdC1QYXRo
IC1MaXRlcmFsUGF0aCAkYmspKSB7CiAgICBXcml0ZS1Ib3N0ICJLZWluIEJhY2t1cC1WZXJ6ZWlj
aG5pcyBnZWZ1bmRlbi4gU2ljaGVydW5nZW4gZW50c3RlaGVuIGF1dG9tYXRpc2NoIGJlaW0gZXJz
dGVuIFVwZGF0ZS4iIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCiAgICByZXR1cm4KfQokc25hcHMgPSBH
ZXQtQ2hpbGRJdGVtIC1MaXRlcmFsUGF0aCAkYmsgLUZpbHRlciAnc25hcHNob3QtKi56aXAnIC1F
cnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlIHwgU29ydC1PYmplY3QgTmFtZSAtRGVzY2VuZGlu
ZwppZiAoLW5vdCAkc25hcHMpIHsKICAgIFdyaXRlLUhvc3QgIktlaW5lIFNpY2hlcnVuZ2VuIHZv
cmhhbmRlbi4gU2ljaGVydW5nZW4gZW50c3RlaGVuIGF1dG9tYXRpc2NoIGJlaW0gZXJzdGVuIFVw
ZGF0ZS4iIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCiAgICByZXR1cm4KfQoKV3JpdGUtSG9zdCAiIgpX
cml0ZS1Ib3N0ICJWZXJmw7xnYmFyZSBTaWNoZXJ1bmdlbiAobmV1ZXN0ZSB6dWVyc3QpOiIgLUZv
cmVncm91bmRDb2xvciBDeWFuCiRpID0gMApmb3JlYWNoICgkcyBpbiAkc25hcHMpIHsKICAgICRz
aXplID0gJ3swOk4xfSBNQicgLWYgKCRzLkxlbmd0aCAvIDFNQikKICAgICR0YWcgID0gaWYgKCRp
IC1lcSAwKSB7ICIgIDwtIG5ldWVzdGUiIH0gZWxzZSB7ICIiIH0KICAgIFdyaXRlLUhvc3QgKCIg
IFt7MH1dIHsxfSAgKHsyfSl7M30iIC1mICRpLCAkcy5OYW1lLCAkc2l6ZSwgJHRhZykKICAgICRp
KysKfQpXcml0ZS1Ib3N0ICIiCiRjID0gUmVhZC1Ib3N0ICJOdW1tZXIgZGVyIFNpY2hlcnVuZyB3
w6RobGVuIChFbnRlciA9IG5ldWVzdGUgWzBdKSIKaWYgKCRjIC1lcSAnJykgeyAkYyA9ICcwJyB9
CmlmICgkYyAtbm90bWF0Y2ggJ15cZCskJyAtb3IgW2ludF0kYyAtZ2UgJHNuYXBzLkNvdW50KSB7
CiAgICBXcml0ZS1Ib3N0ICJVbmfDvGx0aWdlIEF1c3dhaGwuIEFiZ2Vicm9jaGVuLiIgLUZvcmVn
cm91bmRDb2xvciBZZWxsb3cKICAgIHJldHVybgp9CiRjaG9zZW4gPSAkc25hcHNbW2ludF0kY10K
JHppcCAgICA9ICRjaG9zZW4uRnVsbE5hbWUKCiMgSW50ZWdyaXTDpHQgZGVyIFNpY2hlcnVuZyBw
csO8ZmVuLCBCRVZPUiBpcmdlbmRldHdhcyBlcnNldHp0IHdpcmQKQWRkLVR5cGUgLUFzc2VtYmx5
TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uRmlsZVN5c3RlbQp0cnkgewogICAgJHogPSBbU3lz
dGVtLklPLkNvbXByZXNzaW9uLlppcEZpbGVdOjpPcGVuUmVhZCgkemlwKQogICAgJG51bGwgPSAk
ei5FbnRyaWVzLkNvdW50CiAgICAkei5EaXNwb3NlKCkKfSBjYXRjaCB7CiAgICBXcml0ZS1Ib3N0
ICJGRUhMRVI6IFNpY2hlcnVuZyBpc3QgYmVzY2jDpGRpZ3Qg4oCUIFJvbGxiYWNrIGFiZ2Vicm9j
aGVuOiAkemlwIiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAgcmV0dXJuCn0KCldyaXRlLUhvc3Qg
IiIKJHluID0gUmVhZC1Ib3N0ICJTdGFuZCAnJCgkY2hvc2VuLk5hbWUpJyB3aWVkZXJoZXJzdGVs
bGVuPyBEZXIgYWt0dWVsbGUgU3RhbmQgd2lyZCBlcnNldHp0ISBbai9OXSIKaWYgKCR5biAtbm90
aW4gJ2onLCdKJywneScsJ1knKSB7IFdyaXRlLUhvc3QgIkFiZ2Vicm9jaGVuLiI7IHJldHVybiB9
CgojIFNlcnZlciBzdG9wcGVuCldyaXRlLUhvc3QgIlN0b3BwZSBTZXJ2ZXIgLi4uIgppZiAoJF9z
dG9wTmFtZSAtbmUgJycpIHsKICAgICRzcCA9IEpvaW4tUGF0aCAkcm9vdCAkX3N0b3BOYW1lCiAg
ICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkc3ApIHsgJiBjbWQgL2MgImAiJHNwYCIiOyBT
dGFydC1TbGVlcCAtU2Vjb25kcyAyIH0KICAgIGVsc2UgeyBXcml0ZS1Ib3N0ICIgIChTdG9wLVNr
cmlwdCAnJF9zdG9wTmFtZScgbmljaHQgZ2VmdW5kZW4g4oCUIMO8YmVyc3BydW5nZW4pIiAtRm9y
ZWdyb3VuZENvbG9yIERhcmtZZWxsb3cgfQp9IGVsc2UgeyBXcml0ZS1Ib3N0ICIgIChLZWluIFN0
b3AtU2tyaXB0IGtvbmZpZ3VyaWVydCDigJQgw7xiZXJzcHJ1bmdlbikiIC1Gb3JlZ3JvdW5kQ29s
b3IgRGFya1llbGxvdyB9CgojIEFrdHVlbGxlbiBTdGFuZCBiZWlzZWl0ZSB2ZXJzY2hpZWJlbiAo
U2ljaGVyaGVpdHNuZXR6LCBrZWluIERhdGVudmVybHVzdCkKJGFzaWRlID0gSm9pbi1QYXRoICRi
ayAoIl92b3Itcm9sbGJhY2stIiArIChHZXQtRGF0ZSAtRm9ybWF0ICd5eXl5TU1kZC1ISG1tc3Mn
KSkKTmV3LUl0ZW0gLUl0ZW1UeXBlIERpcmVjdG9yeSAtUGF0aCAkYXNpZGUgLUZvcmNlIHwgT3V0
LU51bGwKR2V0LUNoaWxkSXRlbSAtTGl0ZXJhbFBhdGggJHJvb3QgLUZvcmNlIHwgV2hlcmUtT2Jq
ZWN0IHsgJF9leGNsIC1ub3Rjb250YWlucyAkXy5OYW1lIH0gfCBGb3JFYWNoLU9iamVjdCB7CiAg
ICBNb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICRfLkZ1bGxOYW1lIC1EZXN0aW5hdGlvbiAoSm9pbi1Q
YXRoICRhc2lkZSAkXy5OYW1lKSAtRm9yY2UKfQoKIyBTaWNoZXJ1bmcgd2llZGVyaGVyc3RlbGxl
bgp0cnkgewogICAgRXhwYW5kLUFyY2hpdmUgLUxpdGVyYWxQYXRoICR6aXAgLURlc3RpbmF0aW9u
UGF0aCAkcm9vdCAtRm9yY2UKICAgIFdyaXRlLUhvc3QgIlN0YW5kIHdpZWRlcmhlcmdlc3RlbGx0
OiAkKCRjaG9zZW4uTmFtZSkiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JlZW4KfSBjYXRjaCB7CiAgICBX
cml0ZS1Ib3N0ICJGRUhMRVIgYmVpbSBXaWVkZXJoZXJzdGVsbGVuIOKAlCBtYWNoZSDDhG5kZXJ1
bmcgcsO8Y2tnw6RuZ2lnIC4uLiIgLUZvcmVncm91bmRDb2xvciBSZWQKICAgIEdldC1DaGlsZEl0
ZW0gLUxpdGVyYWxQYXRoICRyb290IC1Gb3JjZSB8IFdoZXJlLU9iamVjdCB7ICRfZXhjbCAtbm90
Y29udGFpbnMgJF8uTmFtZSB9IHwKICAgICAgICBSZW1vdmUtSXRlbSAtUmVjdXJzZSAtRm9yY2Ug
LUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgIEdldC1DaGlsZEl0ZW0gLUxpdGVyYWxQ
YXRoICRhc2lkZSAtRm9yY2UgfCBGb3JFYWNoLU9iamVjdCB7CiAgICAgICAgTW92ZS1JdGVtIC1M
aXRlcmFsUGF0aCAkXy5GdWxsTmFtZSAtRGVzdGluYXRpb24gKEpvaW4tUGF0aCAkcm9vdCAkXy5O
YW1lKSAtRm9yY2UKICAgIH0KICAgIFdyaXRlLUhvc3QgIlZvcmhlcmlnZXIgWnVzdGFuZCB3aWVk
ZXJoZXJnZXN0ZWxsdCDigJQga2VpbiBEYXRlbnZlcmx1c3QuIiAtRm9yZWdyb3VuZENvbG9yIFll
bGxvdwogICAgcmV0dXJuCn0KCiMgQmVpc2VpdGUtT3JkbmVyIGF1ZnLDpHVtZW46IG51ciBkaWUg
bGV0enRlbiAyIGJlaGFsdGVuCkdldC1DaGlsZEl0ZW0gLUxpdGVyYWxQYXRoICRiayAtRGlyZWN0
b3J5IC1GaWx0ZXIgJ192b3Itcm9sbGJhY2stKicgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGlu
dWUgfAogICAgU29ydC1PYmplY3QgTmFtZSAtRGVzY2VuZGluZyB8IFNlbGVjdC1PYmplY3QgLVNr
aXAgMiB8CiAgICBSZW1vdmUtSXRlbSAtUmVjdXJzZSAtRm9yY2UgLUVycm9yQWN0aW9uIFNpbGVu
dGx5Q29udGludWUKCiMgU2VydmVyIHN0YXJ0ZW4KJHN0cCA9IEpvaW4tUGF0aCAkcm9vdCAkX3N0
YXJ0TmFtZQppZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkc3RwKSB7CiAgICBTdGFydC1Qcm9j
ZXNzIC1GaWxlUGF0aCAnY21kLmV4ZScgLUFyZ3VtZW50TGlzdCAiL2MgYCIkc3RwYCIiIC1XaW5k
b3dTdHlsZSBIaWRkZW4KICAgIFdyaXRlLUhvc3QgIlNlcnZlciBnZXN0YXJ0ZXQuIiAtRm9yZWdy
b3VuZENvbG9yIEdyZWVuCn0gZWxzZSB7CiAgICBXcml0ZS1Ib3N0ICJTdGFydC1Ta3JpcHQgJyRf
c3RhcnROYW1lJyBuaWNodCBnZWZ1bmRlbiDigJQgYml0dGUgU2VydmVyIG1hbnVlbGwgc3RhcnRl
bi4iIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93Cn0KCldyaXRlLUhvc3QgIiIKV3JpdGUtSG9zdCAi
PT09IFJvbGxiYWNrIGFiZ2VzY2hsb3NzZW4gPT09IiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCldy
aXRlLUhvc3QgIiAgICBXaWVkZXJoZXJnZXN0ZWxsdDogJCgkY2hvc2VuLk5hbWUpIiAtRm9yZWdy
b3VuZENvbG9yIEN5YW4K
+21
View File
@@ -0,0 +1,21 @@
# Änderungsverlauf — VI3 DGL-Planung
Diese Hinweise werden den Admins **vor** der Installation im Update-Bereich angezeigt.
Neueste Version steht oben. Pro Version kurz und verständlich beschreiben, **was** sich ändert.
## v1.4.3
**Neu**
- Update-Bereich in der Administration: prüft auf neue Versionen, sichert automatisch vollständig und führt nach dem Einspielen einen Selbsttest aus, bevor das System wieder freigegeben wird.
- Dieser Änderungsverlauf wird vor jedem Update angezeigt, damit klar ist, was sich ändert.
**Behoben**
- Bestätigungsdialoge (z. B. „Alle zur Kenntnis nehmen") erschienen hinter offenen Fenstern und ließen sich nicht bedienen — sie liegen jetzt korrekt im Vordergrund.
## v1.4.2
- Wartungsupdate, interne Korrekturen.
## v1.4.1
- Wartungsupdate.
+6
View File
@@ -0,0 +1,6 @@
1711cd2ba677122c72301c42d59a0b420c4fdf43ffab8e05b692e374f4229ed0 sync-bundle-01.txt
693e870a8bd5c3272c8fa2f12ecae8ac0f0436ce3185772007c83eab72da1dd7 sync-bundle-02.txt
eb8544cd9c04d392687792586dd4f31a1b3ff16320f88c47215d2b8c1d4e1d11 sync-bundle-03.txt
63c76655fadf2a2104f2351d38d042762302cf5702fb1c67c4cf9624fabc57c2 sync-bundle-04.txt
f3395812768ce6904f89ca1b9e2e96c1fd2c8896e5c92671a442dbb282b02f11 sync-bundle-05.txt
4aaf26dc578b9a24cd85c81ac907db59f0b343d6119d876f6045b00f2756fe8d sync-entpacken.bat
+2 -1
View File
@@ -1,4 +1,4 @@
# 75 Dateien in 5 Bundles # 76 Dateien in 5 Bundles
sync-bundle-01.txt VERSION sync-bundle-01.txt VERSION
sync-bundle-01.txt Wochenplan.template.html sync-bundle-01.txt Wochenplan.template.html
sync-bundle-01.txt app.js sync-bundle-01.txt app.js
@@ -66,6 +66,7 @@ sync-bundle-03.txt js/sync.js
sync-bundle-03.txt js/ui_dialog.js sync-bundle-03.txt js/ui_dialog.js
sync-bundle-03.txt js/ui_rte.js sync-bundle-03.txt js/ui_rte.js
sync-bundle-03.txt js/wochenplan.js sync-bundle-03.txt js/wochenplan.js
sync-bundle-03.txt rollback.bat
sync-bundle-03.txt server.ps1 sync-bundle-03.txt server.ps1
sync-bundle-03.txt stop.bat sync-bundle-03.txt stop.bat
sync-bundle-03.txt style.css sync-bundle-03.txt style.css
+2660 -2567
View File
File diff suppressed because it is too large Load Diff
+113
View File
@@ -0,0 +1,113 @@
# StatusQuo_Updates/scripts/rollback.ps1
# Kanonisches Rollback-Skript (Referenz). rollback.bat enthaelt diese Logik
# EINGEBETTET und laeuft vollstaendig OFFLINE. Beachtet .backupignore.
# Erwartet im Scope: $root, $stopBat, $startBat
$ErrorActionPreference = 'Stop'
# Erwartet im Scope: $root, $stopBat, $startBat
$_stopName = if ($null -ne $stopBat) { $stopBat } else { 'stop.bat' }
$_startName = if ($null -ne $startBat) { $startBat } else { 'dgl.bat' }
# Ausschlussliste (identisch zu update.ps1): .backup nie anfassen, plus große
# Content-Ordner aus .backupignore — diese bleiben beim Rollback unverändert.
$_excl = @('.backup')
$_ignoreFile = Join-Path $root '.backupignore'
if (Test-Path -LiteralPath $_ignoreFile) {
$_extra = @(Get-Content -LiteralPath $_ignoreFile | ForEach-Object { $_.Trim() } |
Where-Object { $_ -ne '' -and -not $_.StartsWith('#') })
$_excl = $_excl + $_extra
}
$_excl = @($_excl) # strikt als Array (verhindert Skalar-Entpackung)
$bk = Join-Path $root '.backup'
if (-not (Test-Path -LiteralPath $bk)) {
Write-Host "Kein Backup-Verzeichnis gefunden. Sicherungen entstehen automatisch beim ersten Update." -ForegroundColor Red
return
}
$snaps = Get-ChildItem -LiteralPath $bk -Filter 'snapshot-*.zip' -ErrorAction SilentlyContinue | Sort-Object Name -Descending
if (-not $snaps) {
Write-Host "Keine Sicherungen vorhanden. Sicherungen entstehen automatisch beim ersten Update." -ForegroundColor Red
return
}
Write-Host ""
Write-Host "Verfügbare Sicherungen (neueste zuerst):" -ForegroundColor Cyan
$i = 0
foreach ($s in $snaps) {
$size = '{0:N1} MB' -f ($s.Length / 1MB)
$tag = if ($i -eq 0) { " <- neueste" } else { "" }
Write-Host (" [{0}] {1} ({2}){3}" -f $i, $s.Name, $size, $tag)
$i++
}
Write-Host ""
$c = Read-Host "Nummer der Sicherung wählen (Enter = neueste [0])"
if ($c -eq '') { $c = '0' }
if ($c -notmatch '^\d+$' -or [int]$c -ge $snaps.Count) {
Write-Host "Ungültige Auswahl. Abgebrochen." -ForegroundColor Yellow
return
}
$chosen = $snaps[[int]$c]
$zip = $chosen.FullName
# Integrität der Sicherung prüfen, BEVOR irgendetwas ersetzt wird
Add-Type -AssemblyName System.IO.Compression.FileSystem
try {
$z = [System.IO.Compression.ZipFile]::OpenRead($zip)
$null = $z.Entries.Count
$z.Dispose()
} catch {
Write-Host "FEHLER: Sicherung ist beschädigt — Rollback abgebrochen: $zip" -ForegroundColor Red
return
}
Write-Host ""
$yn = Read-Host "Stand '$($chosen.Name)' wiederherstellen? Der aktuelle Stand wird ersetzt! [j/N]"
if ($yn -notin 'j','J','y','Y') { Write-Host "Abgebrochen."; return }
# Server stoppen
Write-Host "Stoppe Server ..."
if ($_stopName -ne '') {
$sp = Join-Path $root $_stopName
if (Test-Path -LiteralPath $sp) { & cmd /c "`"$sp`""; Start-Sleep -Seconds 2 }
else { Write-Host " (Stop-Skript '$_stopName' nicht gefunden — übersprungen)" -ForegroundColor DarkYellow }
} else { Write-Host " (Kein Stop-Skript konfiguriert — übersprungen)" -ForegroundColor DarkYellow }
# Aktuellen Stand beiseite verschieben (Sicherheitsnetz, kein Datenverlust)
$aside = Join-Path $bk ("_vor-rollback-" + (Get-Date -Format 'yyyyMMdd-HHmmss'))
New-Item -ItemType Directory -Path $aside -Force | Out-Null
Get-ChildItem -LiteralPath $root -Force | Where-Object { $_excl -notcontains $_.Name } | ForEach-Object {
Move-Item -LiteralPath $_.FullName -Destination (Join-Path $aside $_.Name) -Force
}
# Sicherung wiederherstellen
try {
Expand-Archive -LiteralPath $zip -DestinationPath $root -Force
Write-Host "Stand wiederhergestellt: $($chosen.Name)" -ForegroundColor Green
} catch {
Write-Host "FEHLER beim Wiederherstellen — mache Änderung rückgängig ..." -ForegroundColor Red
Get-ChildItem -LiteralPath $root -Force | Where-Object { $_excl -notcontains $_.Name } |
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
Get-ChildItem -LiteralPath $aside -Force | ForEach-Object {
Move-Item -LiteralPath $_.FullName -Destination (Join-Path $root $_.Name) -Force
}
Write-Host "Vorheriger Zustand wiederhergestellt — kein Datenverlust." -ForegroundColor Yellow
return
}
# Beiseite-Ordner aufräumen: nur die letzten 2 behalten
Get-ChildItem -LiteralPath $bk -Directory -Filter '_vor-rollback-*' -ErrorAction SilentlyContinue |
Sort-Object Name -Descending | Select-Object -Skip 2 |
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
# Server starten
$stp = Join-Path $root $_startName
if (Test-Path -LiteralPath $stp) {
Start-Process -FilePath 'cmd.exe' -ArgumentList "/c `"$stp`"" -WindowStyle Hidden
Write-Host "Server gestartet." -ForegroundColor Green
} else {
Write-Host "Start-Skript '$_startName' nicht gefunden — bitte Server manuell starten." -ForegroundColor Yellow
}
Write-Host ""
Write-Host "=== Rollback abgeschlossen ===" -ForegroundColor Green
Write-Host " Wiederhergestellt: $($chosen.Name)" -ForegroundColor Cyan
+177 -53
View File
@@ -2,49 +2,129 @@
# Zentraler Updater - wird von update.bat per Invoke-Expression geladen. # Zentraler Updater - wird von update.bat per Invoke-Expression geladen.
# Erwartet im aufrufenden Scope: # Erwartet im aufrufenden Scope:
# $proj - Projektname (z.B. 'VI3DGL', 'FLD-Schichtplanung', 'DRIVE', 'Portal_Union') # $proj - Projektname (z.B. 'VI3DGL', 'FLD-Schichtplanung', 'DRIVE', 'Portal_Union')
# $root - Installationspfad (Verzeichnis mit server.ps1, VERSION usw.) # $root - Installationspfad (Portal-Wurzel mit index.html, VERSION usw.)
# $stopBat - (optional) Dateiname des Stop-Skripts, z.B. 'DRIVE_Stop.bat'. # $stopBat - (optional) Stop-Skript-Dateiname; ''=kein Stop; nicht gesetzt=Fallback 'stop.bat'
# Leerstring '' = kein Stop-Schritt. Nicht gesetzt = Fallback auf 'stop.bat'. # $startBat - (optional) Start-Skript-Dateiname; nicht gesetzt=Fallback 'dgl.bat'
# $startBat - (optional) Dateiname des Start-Skripts, z.B. 'DRIVE_Start.bat'. #
# Nicht gesetzt = Fallback auf 'dgl.bat'. # Strategie: Transaktionales Update mit vollständigem ZIP-Snapshot vor jeder
# Änderung. Bei Fehler wird der vorherige Stand automatisch 1:1 wiederhergestellt.
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
$DistBase = "https://gitea.rhino.nrw/Rhino/StatusQuo_Updates/raw/branch/main/$proj" $DistBase = "https://updates.rhino.nrw/rhino/StatusQuo_Updates/raw/branch/main/$proj"
# Stop/Start-Namen VOR jeder Ueberschreibung aus dem aufrufenden Scope lesen
$_stopName = if ($null -ne $stopBat) { $stopBat } else { 'stop.bat' } $_stopName = if ($null -ne $stopBat) { $stopBat } else { 'stop.bat' }
$_startName = if ($null -ne $startBat) { $startBat } else { 'dgl.bat' } $_startName = if ($null -ne $startBat) { $startBat } else { 'dgl.bat' }
# Lokale Version lesen # ---------------------------------------------------------------------------
# Hilfsfunktionen
# ---------------------------------------------------------------------------
function Stop-Portal {
if ($_stopName -ne '') {
$p = Join-Path $root $_stopName
if (Test-Path -LiteralPath $p) { & cmd /c "`"$p`""; Start-Sleep -Seconds 2 }
else { Write-Host " (Stop-Skript '$_stopName' nicht gefunden — übersprungen)" -ForegroundColor DarkYellow }
} else { Write-Host " (Kein Stop-Skript konfiguriert — übersprungen)" -ForegroundColor DarkYellow }
}
function Start-Portal {
$p = Join-Path $root $_startName
if (Test-Path -LiteralPath $p) {
Start-Process -FilePath 'cmd.exe' -ArgumentList "/c `"$p`"" -WindowStyle Hidden
Write-Host "Server gestartet." -ForegroundColor Green
} else {
Write-Host "Start-Skript '$_startName' nicht gefunden — bitte Server manuell starten." -ForegroundColor Yellow
}
}
# Ausschlussliste: immer .backup/TempUpdate, plus Einträge aus .backupignore
# (große, von Updates NIE berührte Content-Ordner, z.B. _archiv/dokumente).
# Ausgeschlossene Ordner werden weder gesichert noch beim Rollback verändert.
function Get-ExcludeNames {
param([switch]$ForWipe)
# WICHTIG: Array strikt als Array aufbauen. 'if (){@(x)}' würde ein
# 1-Element-Array zu einem Skalar entpacken → '+=' verkettet dann Strings.
$ex = @('.backup')
if (-not $ForWipe) { $ex = $ex + 'TempUpdate' }
$f = Join-Path $root '.backupignore'
if (Test-Path -LiteralPath $f) {
$extra = @(Get-Content -LiteralPath $f | ForEach-Object { $_.Trim() } |
Where-Object { $_ -ne '' -and -not $_.StartsWith('#') })
$ex = $ex + $extra
}
return $ex
}
# Vollständiger Snapshot der Portal-Wurzel als ein ZIP (außer .backup/TempUpdate
# und .backupignore-Einträgen). Erfasst alle Code-Unterordner inkl. data/
# → echtes 1:1 des veränderbaren Stands, inkl. später gelöschter Dateien.
function New-Snapshot {
$ts = Get-Date -Format 'yyyyMMdd-HHmmss'
$bk = Join-Path $root '.backup'
if (-not (Test-Path -LiteralPath $bk)) { New-Item -ItemType Directory -Path $bk -Force | Out-Null }
$zip = Join-Path $bk "snapshot-$ts.zip"
$exclude = @(Get-ExcludeNames)
$items = Get-ChildItem -LiteralPath $root -Force | Where-Object { $exclude -notcontains $_.Name }
if (-not $items) { throw "Portal-Wurzel ist leer — nichts zu sichern." }
Compress-Archive -Path $items.FullName -DestinationPath $zip -CompressionLevel Optimal -Force
# Integrität prüfen (öffnen + Eintragszahl)
Add-Type -AssemblyName System.IO.Compression.FileSystem
$z = [System.IO.Compression.ZipFile]::OpenRead($zip)
$cnt = $z.Entries.Count
$z.Dispose()
if ($cnt -lt 1) { throw "Snapshot ist leer/ungültig." }
# Aufbewahrung: max. 5 Snapshots
Get-ChildItem -LiteralPath $bk -Filter 'snapshot-*.zip' | Sort-Object Name -Descending |
Select-Object -Skip 5 | Remove-Item -Force -ErrorAction SilentlyContinue
return $zip
}
function Restore-Snapshot {
param([string]$Zip)
# Wurzel leeren (außer .backup + .backupignore-Ordner), dann Snapshot zurückspielen.
# Ausgeschlossene Content-Ordner bleiben unangetastet an Ort und Stelle.
$ex = @(Get-ExcludeNames -ForWipe)
Get-ChildItem -LiteralPath $root -Force | Where-Object { $ex -notcontains $_.Name } |
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
Expand-Archive -LiteralPath $Zip -DestinationPath $root -Force
}
# ---------------------------------------------------------------------------
# 1. Versionsvergleich
# ---------------------------------------------------------------------------
$localVer = '0.0.0' $localVer = '0.0.0'
$verFile = Join-Path $root 'VERSION' $verFile = Join-Path $root 'VERSION'
if (Test-Path -LiteralPath $verFile) { $localVer = (Get-Content $verFile -Raw).Trim() } if (Test-Path -LiteralPath $verFile) { $localVer = (Get-Content $verFile -Raw).Trim() }
# Remote-Version abfragen
Write-Host "Prüfe Update für $proj ..." Write-Host "Prüfe Update für $proj ..."
try { try {
$remoteVer = (Invoke-WebRequest -Uri "$DistBase/VERSION" -UseBasicParsing -TimeoutSec 15).Content.Trim() $remoteVer = (Invoke-WebRequest -Uri "$DistBase/VERSION" -UseBasicParsing -TimeoutSec 15).Content.Trim()
} catch { } catch {
Write-Host "FEHLER: Dist-Repo nicht erreichbar. Netzverbindung prüfen." -ForegroundColor Red Write-Host "FEHLER: Update-Server nicht erreichbar. Netzverbindung prüfen." -ForegroundColor Red
return return
} }
Write-Host "Lokal: v$localVer" Write-Host "Lokal: v$localVer"
Write-Host "Remote: v$remoteVer" Write-Host "Remote: v$remoteVer"
if ($localVer -eq $remoteVer) { # Nur echtes Upgrade anbieten (kein versehentlicher Downgrade)
Write-Host "Bereits auf aktuellem Stand. Kein Update nötig." -ForegroundColor Green $isNewer = $false
try { $isNewer = ([System.Version]$remoteVer -gt [System.Version]$localVer) }
catch { $isNewer = ($remoteVer -ne $localVer) } # nicht-numerische Version: Fallback
if (-not $isNewer) {
if ($localVer -eq $remoteVer) { Write-Host "Bereits auf aktuellem Stand. Kein Update nötig." -ForegroundColor Green }
else { Write-Host "Remote (v$remoteVer) ist nicht neuer als lokal (v$localVer) — kein Update." -ForegroundColor Yellow }
return return
} }
$yn = Read-Host "Update von v$localVer auf v$remoteVer installieren? [j/N]" $yn = Read-Host "Update von v$localVer auf v$remoteVer installieren? [j/N]"
if ($yn -notin 'j','J','y','Y') { Write-Host "Abgebrochen."; return } if ($yn -notin 'j','J','y','Y') { Write-Host "Abgebrochen."; return }
# Temp-Ordner # ---------------------------------------------------------------------------
# 2. Bundles herunterladen (Server läuft noch)
# ---------------------------------------------------------------------------
$tmp = Join-Path $root 'TempUpdate' $tmp = Join-Path $root 'TempUpdate'
Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue
New-Item -ItemType Directory -Path $tmp | Out-Null New-Item -ItemType Directory -Path $tmp | Out-Null
# Bundles laden
Write-Host "Lade Manifest ..." Write-Host "Lade Manifest ..."
$manifest = (Invoke-WebRequest -Uri "$DistBase/MANIFEST.txt" -UseBasicParsing -TimeoutSec 30).Content $manifest = (Invoke-WebRequest -Uri "$DistBase/MANIFEST.txt" -UseBasicParsing -TimeoutSec 30).Content
$bundles = ($manifest -split "`n" | Where-Object { $_ -match '^sync-bundle-' } | $bundles = ($manifest -split "`n" | Where-Object { $_ -match '^sync-bundle-' } |
@@ -57,48 +137,92 @@ foreach ($b in $bundles) {
Write-Host " sync-entpacken.bat ..." Write-Host " sync-entpacken.bat ..."
Invoke-WebRequest -Uri "$DistBase/sync-entpacken.bat" -OutFile (Join-Path $tmp 'sync-entpacken.bat') -UseBasicParsing -TimeoutSec 30 Invoke-WebRequest -Uri "$DistBase/sync-entpacken.bat" -OutFile (Join-Path $tmp 'sync-entpacken.bat') -UseBasicParsing -TimeoutSec 30
# Server stoppen # ---------------------------------------------------------------------------
Write-Host "Stoppe Server ..." # 3. Download-Integrität prüfen (SHA256, falls CHECKSUMS.txt vorhanden)
if ($_stopName -ne '') { # Schützt gegen unvollständige/korrupte Downloads — NICHT gegen manipulierte
$_stopPath = Join-Path $root $_stopName # Releases (gleicher Kanal). Authentizität = Release-Disziplin + Tests.
if (Test-Path -LiteralPath $_stopPath) { # ---------------------------------------------------------------------------
& cmd /c "`"$_stopPath`"" Write-Host "Verifiziere Download-Integrität ..."
Start-Sleep -Seconds 2 try {
} else { $chk = (Invoke-WebRequest -Uri "$DistBase/CHECKSUMS.txt" -UseBasicParsing -TimeoutSec 15).Content
Write-Host " (Stop-Skript '$_stopName' nicht gefunden — übersprungen)" -ForegroundColor DarkYellow $allOk = $true
foreach ($line in ($chk -split "`n")) {
$line = $line.Trim()
if ($line -eq '' -or $line.StartsWith('#')) { continue }
$parts = $line -split '\s+', 2
if ($parts.Count -lt 2) { continue }
$expected = $parts[0].ToLower()
$filename = $parts[1].Trim().TrimStart('*') # sha256sum nutzt evtl. '*' Prefix
$localPath = Join-Path $tmp $filename
if (-not (Test-Path -LiteralPath $localPath)) { continue }
$actual = (Get-FileHash -LiteralPath $localPath -Algorithm SHA256).Hash.ToLower()
if ($actual -ne $expected) {
Write-Host "FEHLER: Checksumme stimmt nicht für $filename!" -ForegroundColor Red
$allOk = $false
} }
} else {
Write-Host " (Kein Stop-Skript konfiguriert — übersprungen)" -ForegroundColor DarkYellow
} }
if (-not $allOk) {
# Backup
$ts = Get-Date -Format 'yyyyMMdd-HHmmss'
$bkDir = Join-Path $root ".backup\$ts"
New-Item -ItemType Directory -Path $bkDir -Force | Out-Null
foreach ($ext in '*.ps1','*.html','*.js','*.css','*.bat') {
Get-ChildItem -LiteralPath $root -File -Filter $ext -ErrorAction SilentlyContinue |
Copy-Item -Destination $bkDir
}
Write-Host "Backup: $bkDir"
# Entpacken (sync-entpacken.bat aus TempUpdate → schreibt in Root eine Ebene hoeher)
Write-Host "Entpacke ..."
& cmd /c "`"$(Join-Path $tmp 'sync-entpacken.bat')`""
# VERSION lokal aktualisieren
[System.IO.File]::WriteAllText($verFile, ($remoteVer + "`r`n"), [System.Text.Encoding]::UTF8)
Write-Host "Version auf v$remoteVer aktualisiert." -ForegroundColor Green
# Aufräumen
Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue
Write-Host "Update abgebrochen — keine Datei verändert. Bitte Support kontaktieren." -ForegroundColor Red
# Server neu starten return
$_startPath = Join-Path $root $_startName
if (Test-Path -LiteralPath $_startPath) {
Start-Process -FilePath 'cmd.exe' -ArgumentList "/c `"$_startPath`"" -WindowStyle Hidden
Write-Host "Server gestartet." -ForegroundColor Green
} else {
Write-Host "Start-Skript '$_startName' nicht gefunden — bitte Server manuell starten." -ForegroundColor Yellow
} }
Write-Host " Alle Checksummen OK." -ForegroundColor Green
} catch {
Write-Host " (Keine CHECKSUMS.txt — Integritätsprüfung übersprungen)" -ForegroundColor DarkGray
}
# ---------------------------------------------------------------------------
# 4. Server stoppen
# ---------------------------------------------------------------------------
Write-Host "Stoppe Server ..."
Stop-Portal
# ---------------------------------------------------------------------------
# 5. Snapshot (transaktionssicher: ohne gültiges Backup kein Update)
# ---------------------------------------------------------------------------
Write-Host "Erstelle vollständige Sicherung ..."
try {
$snap = New-Snapshot
$snapSize = '{0:N1} MB' -f ((Get-Item -LiteralPath $snap).Length / 1MB)
Write-Host " Snapshot: $snap ($snapSize)" -ForegroundColor Cyan
} catch {
Write-Host "FEHLER beim Sichern: $($_.Exception.Message)" -ForegroundColor Red
Write-Host "Update abgebrochen — keine Datei verändert. Server wird wieder gestartet." -ForegroundColor Yellow
Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue
Start-Portal
return
}
# ---------------------------------------------------------------------------
# 6. Update anwenden — bei Fehler automatischer Rollback
# ---------------------------------------------------------------------------
Write-Host "Wende Update an ..."
try {
& cmd /c "`"$(Join-Path $tmp 'sync-entpacken.bat')`""
if ($LASTEXITCODE -ne 0) { throw "sync-entpacken.bat meldete Exitcode $LASTEXITCODE" }
[System.IO.File]::WriteAllText($verFile, ($remoteVer + "`r`n"), [System.Text.Encoding]::UTF8)
} catch {
Write-Host "FEHLER beim Anwenden: $($_.Exception.Message)" -ForegroundColor Red
Write-Host "Stelle vorherigen Stand automatisch wieder her ..." -ForegroundColor Yellow
try {
Restore-Snapshot -Zip $snap
Write-Host " Vorheriger Stand (v$localVer) wiederhergestellt." -ForegroundColor Green
} catch {
Write-Host " AUTO-ROLLBACK FEHLGESCHLAGEN! Bitte rollback.bat doppelklicken." -ForegroundColor Red
}
Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue
Start-Portal
return
}
# ---------------------------------------------------------------------------
# 7. Aufräumen + Start
# ---------------------------------------------------------------------------
Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue
Write-Host "Version auf v$remoteVer aktualisiert." -ForegroundColor Green
Start-Portal
Write-Host "" Write-Host ""
Write-Host "=== Update abgeschlossen ===" -ForegroundColor Green Write-Host "=== Update abgeschlossen ===" -ForegroundColor Green
Write-Host " Sicherung: $snap" -ForegroundColor DarkGray
Write-Host " Bei Problemen: rollback.bat doppelklicken (funktioniert auch offline)." -ForegroundColor DarkGray