Compare commits

..
1 Commits
Author SHA1 Message Date
Rhino f53d2203b0 feat: CHECKSUMS.txt Placeholder (triggert Mirror-Action auf release) 2026-06-20 20:25:50 +02:00
22 changed files with 12562 additions and 13805 deletions
+7 -34
View File
@@ -1,15 +1,9 @@
name: 📦 Veröffentlichen → updates.rhino.nrw name: Mirror to Public Gitea (updates.rhino.nrw)
# Zwei Wege, denselben Job auszulösen: # Trigger: Nur wenn explizit auf den 'release'-Branch gepusht wird.
# • workflow_dispatch: KNOPF in Gitea (Actions-Tab → "Run workflow") — kein Terminal. # Das stellt sicher, dass nur geprüfte, validierte Stände ausgeliefert werden.
# Veröffentlicht den aktuellen Stand aus 'main' (Staging) nach updates.rhino.nrw. # Workflow auf main: git push origin main:release
# • push auf 'release': für das CLI-Skript release.py (Power-User-Weg).
on: on:
workflow_dispatch:
inputs:
hinweis:
description: "Optional: Version/Notiz (nur fürs Protokoll)"
required: false
push: push:
branches: [release] branches: [release]
@@ -22,28 +16,7 @@ jobs:
with: with:
fetch-depth: 0 fetch-depth: 0
- name: CHECKSUMS.txt pro Projekt frisch erzeugen - name: Push mirror to Public Gitea (als 'main')
run: | run: |
for d in */ ; do git remote add public "http://rhino:${{ secrets.PUBLIC_GITEA_TOKEN }}@172.30.0.4:3053/rhino/StatusQuo_Updates.git"
d="${d%/}" git push public HEAD:main --force
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 }}"
+4
View File
@@ -0,0 +1,4 @@
# SHA256-Checksummen der Sync-Bundles
# Generiert mit: sha256sum VI3DGL/sync-bundle-*.txt > VI3DGL/CHECKSUMS.txt
# Wird von update.ps1 verifiziert bevor Dateien ersetzt werden.
# Leere Datei = Prüfung wird übersprungen (abwärtskompatibel).
-3
View File
@@ -1,3 +0,0 @@
b1a4e69eaa33c15a51bc8b082cd305c8d8c3a94a4e4a3f3d5d14040a28221f1e sync-bundle-01.txt
ab0a7311b0deb8ad4b59cfbcb91adc7b97e0a8c52658acfd0faf54f90df02047 sync-bundle-02.txt
95bdd3993481ac8ec937f1adb09bf1851735619dca2dd4283c7608f13f0e1e7e sync-entpacken.bat
+1 -2
View File
@@ -1,4 +1,4 @@
# 30 Dateien in 2 Bundles # 29 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,5 +27,4 @@ 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
-93
View File
@@ -9735,99 +9735,6 @@ ICAgIH0sIDE1MDApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbG9jYWxT
dG9yYWdlLnJlbW92ZUl0ZW0oJ2RyaXZlLXJlc3VtZS1kb2MnKTsKICAgICAgICAgICAgfQogICAg dG9yYWdlLnJlbW92ZUl0ZW0oJ2RyaXZlLXJlc3VtZS1kb2MnKTsKICAgICAgICAgICAgfQogICAg
ICAgIH0KICAgIH0gY2F0Y2goZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdk ICAgIH0KICAgIH0gY2F0Y2goZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdk
cml2ZS1yZXN1bWUtZG9jJyk7CiAgICB9Cn0pOwo8L3NjcmlwdD4KCjwvYm9keT4KPC9odG1sPgo= cml2ZS1yZXN1bWUtZG9jJyk7CiAgICB9Cn0pOwo8L3NjcmlwdD4KCjwvYm9keT4KPC9odG1sPgo=
### FILE: rollback.bat | 5232
QGVjaG8gb2ZmCnNldGxvY2FsCnNldCAiQkRJUj0lfmRwMCIKZWNoby4KZWNobyAgPT09IEQuUi5J
LlYuRS46IFJvbGxiYWNrIChvZmZsaW5lKSA9PT0KZWNobyAgU3RlbGx0IGRlbiBTdGFuZCB2b3Ig
ZGVtIGxldHp0ZW4gVXBkYXRlIHdpZWRlciBoZXIuCmVjaG8uCnBvd2Vyc2hlbGwgLU5vUHJvZmls
ZSAtRXhlY3V0aW9uUG9saWN5IEJ5cGFzcyAtQ29tbWFuZCAiJG09JyMjIyBQUycrJ0NPREUgIyMj
JzskbWU9W0lPLkZpbGVdOjpSZWFkQWxsVGV4dCgnJX5mMCcpOyRwPSRtZS5JbmRleE9mKCRtKTsk
bmw9JG1lLkluZGV4T2YoW2NoYXJdMTAsJHApOyRyb290PSRlbnY6QkRJUi5UcmltRW5kKCdcJyk7
JHN0b3BCYXQ9J0RSSVZFX1N0b3AuYmF0Jzskc3RhcnRCYXQ9J0RSSVZFX1N0YXJ0LmJhdCc7SW52
b2tlLUV4cHJlc3Npb24gJG1lLlN1YnN0cmluZygkbmwrMSkiCmVjaG8uCnBhdXNlCmV4aXQgL2IK
IyMjIFBTQ09ERSAjIyMKJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJwojIEVyd2FydGV0
IGltIFNjb3BlOiAkcm9vdCwgJHN0b3BCYXQsICRzdGFydEJhdAokX3N0b3BOYW1lICA9IGlmICgk
bnVsbCAtbmUgJHN0b3BCYXQpICB7ICRzdG9wQmF0IH0gIGVsc2UgeyAnc3RvcC5iYXQnIH0KJF9z
dGFydE5hbWUgPSBpZiAoJG51bGwgLW5lICRzdGFydEJhdCkgeyAkc3RhcnRCYXQgfSBlbHNlIHsg
J2RnbC5iYXQnIH0KCiMgQXVzc2NobHVzc2xpc3RlIChpZGVudGlzY2ggenUgdXBkYXRlLnBzMSk6
IC5iYWNrdXAgbmllIGFuZmFzc2VuLCBwbHVzIGdyb8OfZQojIENvbnRlbnQtT3JkbmVyIGF1cyAu
YmFja3VwaWdub3JlIOKAlCBkaWVzZSBibGVpYmVuIGJlaW0gUm9sbGJhY2sgdW52ZXLDpG5kZXJ0
LgokX2V4Y2wgPSBAKCcuYmFja3VwJykKJF9pZ25vcmVGaWxlID0gSm9pbi1QYXRoICRyb290ICcu
YmFja3VwaWdub3JlJwppZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkX2lnbm9yZUZpbGUpIHsK
ICAgICRfZXh0cmEgPSBAKEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCAkX2lnbm9yZUZpbGUgfCBG
b3JFYWNoLU9iamVjdCB7ICRfLlRyaW0oKSB9IHwKICAgICAgICAgICAgICAgIFdoZXJlLU9iamVj
dCB7ICRfIC1uZSAnJyAtYW5kIC1ub3QgJF8uU3RhcnRzV2l0aCgnIycpIH0pCiAgICAkX2V4Y2wg
PSAkX2V4Y2wgKyAkX2V4dHJhCn0KJF9leGNsID0gQCgkX2V4Y2wpICAgIyBzdHJpa3QgYWxzIEFy
cmF5ICh2ZXJoaW5kZXJ0IFNrYWxhci1FbnRwYWNrdW5nKQoKJGJrID0gSm9pbi1QYXRoICRyb290
ICcuYmFja3VwJwppZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkYmspKSB7CiAgICBX
cml0ZS1Ib3N0ICJLZWluIEJhY2t1cC1WZXJ6ZWljaG5pcyBnZWZ1bmRlbi4gU2ljaGVydW5nZW4g
ZW50c3RlaGVuIGF1dG9tYXRpc2NoIGJlaW0gZXJzdGVuIFVwZGF0ZS4iIC1Gb3JlZ3JvdW5kQ29s
b3IgUmVkCiAgICByZXR1cm4KfQokc25hcHMgPSBHZXQtQ2hpbGRJdGVtIC1MaXRlcmFsUGF0aCAk
YmsgLUZpbHRlciAnc25hcHNob3QtKi56aXAnIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVl
IHwgU29ydC1PYmplY3QgTmFtZSAtRGVzY2VuZGluZwppZiAoLW5vdCAkc25hcHMpIHsKICAgIFdy
aXRlLUhvc3QgIktlaW5lIFNpY2hlcnVuZ2VuIHZvcmhhbmRlbi4gU2ljaGVydW5nZW4gZW50c3Rl
aGVuIGF1dG9tYXRpc2NoIGJlaW0gZXJzdGVuIFVwZGF0ZS4iIC1Gb3JlZ3JvdW5kQ29sb3IgUmVk
CiAgICByZXR1cm4KfQoKV3JpdGUtSG9zdCAiIgpXcml0ZS1Ib3N0ICJWZXJmw7xnYmFyZSBTaWNo
ZXJ1bmdlbiAobmV1ZXN0ZSB6dWVyc3QpOiIgLUZvcmVncm91bmRDb2xvciBDeWFuCiRpID0gMApm
b3JlYWNoICgkcyBpbiAkc25hcHMpIHsKICAgICRzaXplID0gJ3swOk4xfSBNQicgLWYgKCRzLkxl
bmd0aCAvIDFNQikKICAgICR0YWcgID0gaWYgKCRpIC1lcSAwKSB7ICIgIDwtIG5ldWVzdGUiIH0g
ZWxzZSB7ICIiIH0KICAgIFdyaXRlLUhvc3QgKCIgIFt7MH1dIHsxfSAgKHsyfSl7M30iIC1mICRp
LCAkcy5OYW1lLCAkc2l6ZSwgJHRhZykKICAgICRpKysKfQpXcml0ZS1Ib3N0ICIiCiRjID0gUmVh
ZC1Ib3N0ICJOdW1tZXIgZGVyIFNpY2hlcnVuZyB3w6RobGVuIChFbnRlciA9IG5ldWVzdGUgWzBd
KSIKaWYgKCRjIC1lcSAnJykgeyAkYyA9ICcwJyB9CmlmICgkYyAtbm90bWF0Y2ggJ15cZCskJyAt
b3IgW2ludF0kYyAtZ2UgJHNuYXBzLkNvdW50KSB7CiAgICBXcml0ZS1Ib3N0ICJVbmfDvGx0aWdl
IEF1c3dhaGwuIEFiZ2Vicm9jaGVuLiIgLUZvcmVncm91bmRDb2xvciBZZWxsb3cKICAgIHJldHVy
bgp9CiRjaG9zZW4gPSAkc25hcHNbW2ludF0kY10KJHppcCAgICA9ICRjaG9zZW4uRnVsbE5hbWUK
CiMgSW50ZWdyaXTDpHQgZGVyIFNpY2hlcnVuZyBwcsO8ZmVuLCBCRVZPUiBpcmdlbmRldHdhcyBl
cnNldHp0IHdpcmQKQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24u
RmlsZVN5c3RlbQp0cnkgewogICAgJHogPSBbU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEZpbGVd
OjpPcGVuUmVhZCgkemlwKQogICAgJG51bGwgPSAkei5FbnRyaWVzLkNvdW50CiAgICAkei5EaXNw
b3NlKCkKfSBjYXRjaCB7CiAgICBXcml0ZS1Ib3N0ICJGRUhMRVI6IFNpY2hlcnVuZyBpc3QgYmVz
Y2jDpGRpZ3Qg4oCUIFJvbGxiYWNrIGFiZ2Vicm9jaGVuOiAkemlwIiAtRm9yZWdyb3VuZENvbG9y
IFJlZAogICAgcmV0dXJuCn0KCldyaXRlLUhvc3QgIiIKJHluID0gUmVhZC1Ib3N0ICJTdGFuZCAn
JCgkY2hvc2VuLk5hbWUpJyB3aWVkZXJoZXJzdGVsbGVuPyBEZXIgYWt0dWVsbGUgU3RhbmQgd2ly
ZCBlcnNldHp0ISBbai9OXSIKaWYgKCR5biAtbm90aW4gJ2onLCdKJywneScsJ1knKSB7IFdyaXRl
LUhvc3QgIkFiZ2Vicm9jaGVuLiI7IHJldHVybiB9CgojIFNlcnZlciBzdG9wcGVuCldyaXRlLUhv
c3QgIlN0b3BwZSBTZXJ2ZXIgLi4uIgppZiAoJF9zdG9wTmFtZSAtbmUgJycpIHsKICAgICRzcCA9
IEpvaW4tUGF0aCAkcm9vdCAkX3N0b3BOYW1lCiAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0
aCAkc3ApIHsgJiBjbWQgL2MgImAiJHNwYCIiOyBTdGFydC1TbGVlcCAtU2Vjb25kcyAyIH0KICAg
IGVsc2UgeyBXcml0ZS1Ib3N0ICIgIChTdG9wLVNrcmlwdCAnJF9zdG9wTmFtZScgbmljaHQgZ2Vm
dW5kZW4g4oCUIMO8YmVyc3BydW5nZW4pIiAtRm9yZWdyb3VuZENvbG9yIERhcmtZZWxsb3cgfQp9
IGVsc2UgeyBXcml0ZS1Ib3N0ICIgIChLZWluIFN0b3AtU2tyaXB0IGtvbmZpZ3VyaWVydCDigJQg
w7xiZXJzcHJ1bmdlbikiIC1Gb3JlZ3JvdW5kQ29sb3IgRGFya1llbGxvdyB9CgojIEFrdHVlbGxl
biBTdGFuZCBiZWlzZWl0ZSB2ZXJzY2hpZWJlbiAoU2ljaGVyaGVpdHNuZXR6LCBrZWluIERhdGVu
dmVybHVzdCkKJGFzaWRlID0gSm9pbi1QYXRoICRiayAoIl92b3Itcm9sbGJhY2stIiArIChHZXQt
RGF0ZSAtRm9ybWF0ICd5eXl5TU1kZC1ISG1tc3MnKSkKTmV3LUl0ZW0gLUl0ZW1UeXBlIERpcmVj
dG9yeSAtUGF0aCAkYXNpZGUgLUZvcmNlIHwgT3V0LU51bGwKR2V0LUNoaWxkSXRlbSAtTGl0ZXJh
bFBhdGggJHJvb3QgLUZvcmNlIHwgV2hlcmUtT2JqZWN0IHsgJF9leGNsIC1ub3Rjb250YWlucyAk
Xy5OYW1lIH0gfCBGb3JFYWNoLU9iamVjdCB7CiAgICBNb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICRf
LkZ1bGxOYW1lIC1EZXN0aW5hdGlvbiAoSm9pbi1QYXRoICRhc2lkZSAkXy5OYW1lKSAtRm9yY2UK
fQoKIyBTaWNoZXJ1bmcgd2llZGVyaGVyc3RlbGxlbgp0cnkgewogICAgRXhwYW5kLUFyY2hpdmUg
LUxpdGVyYWxQYXRoICR6aXAgLURlc3RpbmF0aW9uUGF0aCAkcm9vdCAtRm9yY2UKICAgIFdyaXRl
LUhvc3QgIlN0YW5kIHdpZWRlcmhlcmdlc3RlbGx0OiAkKCRjaG9zZW4uTmFtZSkiIC1Gb3JlZ3Jv
dW5kQ29sb3IgR3JlZW4KfSBjYXRjaCB7CiAgICBXcml0ZS1Ib3N0ICJGRUhMRVIgYmVpbSBXaWVk
ZXJoZXJzdGVsbGVuIOKAlCBtYWNoZSDDhG5kZXJ1bmcgcsO8Y2tnw6RuZ2lnIC4uLiIgLUZvcmVn
cm91bmRDb2xvciBSZWQKICAgIEdldC1DaGlsZEl0ZW0gLUxpdGVyYWxQYXRoICRyb290IC1Gb3Jj
ZSB8IFdoZXJlLU9iamVjdCB7ICRfZXhjbCAtbm90Y29udGFpbnMgJF8uTmFtZSB9IHwKICAgICAg
ICBSZW1vdmUtSXRlbSAtUmVjdXJzZSAtRm9yY2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGlu
dWUKICAgIEdldC1DaGlsZEl0ZW0gLUxpdGVyYWxQYXRoICRhc2lkZSAtRm9yY2UgfCBGb3JFYWNo
LU9iamVjdCB7CiAgICAgICAgTW92ZS1JdGVtIC1MaXRlcmFsUGF0aCAkXy5GdWxsTmFtZSAtRGVz
dGluYXRpb24gKEpvaW4tUGF0aCAkcm9vdCAkXy5OYW1lKSAtRm9yY2UKICAgIH0KICAgIFdyaXRl
LUhvc3QgIlZvcmhlcmlnZXIgWnVzdGFuZCB3aWVkZXJoZXJnZXN0ZWxsdCDigJQga2VpbiBEYXRl
bnZlcmx1c3QuIiAtRm9yZWdyb3VuZENvbG9yIFllbGxvdwogICAgcmV0dXJuCn0KCiMgQmVpc2Vp
dGUtT3JkbmVyIGF1ZnLDpHVtZW46IG51ciBkaWUgbGV0enRlbiAyIGJlaGFsdGVuCkdldC1DaGls
ZEl0ZW0gLUxpdGVyYWxQYXRoICRiayAtRGlyZWN0b3J5IC1GaWx0ZXIgJ192b3Itcm9sbGJhY2st
KicgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUgfAogICAgU29ydC1PYmplY3QgTmFtZSAt
RGVzY2VuZGluZyB8IFNlbGVjdC1PYmplY3QgLVNraXAgMiB8CiAgICBSZW1vdmUtSXRlbSAtUmVj
dXJzZSAtRm9yY2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKCiMgU2VydmVyIHN0YXJ0
ZW4KJHN0cCA9IEpvaW4tUGF0aCAkcm9vdCAkX3N0YXJ0TmFtZQppZiAoVGVzdC1QYXRoIC1MaXRl
cmFsUGF0aCAkc3RwKSB7CiAgICBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAnY21kLmV4ZScgLUFy
Z3VtZW50TGlzdCAiL2MgYCIkc3RwYCIiIC1XaW5kb3dTdHlsZSBIaWRkZW4KICAgIFdyaXRlLUhv
c3QgIlNlcnZlciBnZXN0YXJ0ZXQuIiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCn0gZWxzZSB7CiAg
ICBXcml0ZS1Ib3N0ICJTdGFydC1Ta3JpcHQgJyRfc3RhcnROYW1lJyBuaWNodCBnZWZ1bmRlbiDi
gJQgYml0dGUgU2VydmVyIG1hbnVlbGwgc3RhcnRlbi4iIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93
Cn0KCldyaXRlLUhvc3QgIiIKV3JpdGUtSG9zdCAiPT09IFJvbGxiYWNrIGFiZ2VzY2hsb3NzZW4g
PT09IiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCldyaXRlLUhvc3QgIiAgICBXaWVkZXJoZXJnZXN0
ZWxsdDogJCgkY2hvc2VuLk5hbWUpIiAtRm9yZWdyb3VuZENvbG9yIEN5YW4K
### FILE: server.ps1 | 52721 ### FILE: server.ps1 | 52721
IyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 IyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQojIEQuUi5JLlYuRS4gUG9ydGFsIHYxLjAgLSBMb2thbGVy PT09PT09PT09PT09PT09PT09PT09PQojIEQuUi5JLlYuRS4gUG9ydGFsIHYxLjAgLSBMb2thbGVy
-8
View File
@@ -1,8 +0,0 @@
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
+1 -2
View File
@@ -1,4 +1,4 @@
# 144 Dateien in 7 Bundles # 143 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,7 +138,6 @@ 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,96 +11737,3 @@ 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
-2
View File
@@ -1,2 +0,0 @@
0eaeaeadf1c298b6d17fc2ad236a061a832e305815a6398d36d78b98779c3e49 sync-bundle-01.txt
b917548cba1a6a6ada3bf6c71107e9c3496664b65777194eb50340c73fb79597 sync-entpacken.bat
+1 -2
View File
@@ -1,4 +1,4 @@
# 41 Dateien in 1 Bundles # 40 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,4 +39,3 @@ 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,95 +13409,3 @@ 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
-51
View File
@@ -1,51 +0,0 @@
## v1.4.5
**Behoben**
- Mitarbeitende **ohne** Berechtigung für Statistik, Logbuch oder Administration bekamen beim Öffnen der Planung im Hintergrund einen Fehler, weil die Seite auf einen gesperrten Bereich zugreifen wollte. Die Planung lädt jetzt für alle sauber.
- Wenn für SuperUser/Gesamtverantwortliche ein offener Hinweis vorlag (der rote Balken oben), ließ sich die Planung nicht mehr bis ganz nach unten scrollen. Das ist behoben.
- Beim Öffnen der Browser-Entwicklerwerkzeuge entstand eine unnötige Fehlermeldung im Server-Protokoll. Das Protokoll wird unverändert weitergeschrieben — nur die Fehlmeldung entfällt.
- Die Planungstabelle lässt sich jetzt mit dem Mausrad **überall** scrollen — auch wenn der Zeiger über der Namensspalte (links) liegt. Vorher reagierte nur das eigentliche Schichtenfeld.
**Geändert**
- Offene Hinweise erscheinen nicht mehr als roter Kopfbalken, sondern öffnen sich beim Anmelden in einem Fenster. Dort lassen sich alle oder einzelne Hinweise „zur Kenntnis nehmen" oder **aufschieben**. Aufgeschobene Hinweise bleiben am roten Zähler neben dem Namen (oben rechts) sichtbar, und das Fenster öffnet sich beim nächsten Anmelden von selbst wieder.
## v1.4.4
**Behoben**
- Update-Prüfung hinter dem Behörden-Proxy: Der Server konnte das Update-Repository nicht erreichen („Proxyauthentifizierung erforderlich") — der Update-Check und das Einspielen funktionieren jetzt.
- „Update installieren" lief auf dem Produktiv-Server auf einen Fehler (500). Der Updater findet jetzt zuverlässig die richtige Programm-Ablage und startet sauber.
- Die angezeigte aktuelle Version war fälschlich „0.0.0", wodurch immer ein Update vorgeschlagen wurde. Es wird jetzt die echte installierte Version angezeigt.
**Neu**
- Selbsttest („laufen alle Funktionen?") prüft zusätzlich, ob das Update-System bereitsteht und ob die Live-Daten am richtigen Ort gefunden werden.
## 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.
# Ä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
@@ -1,6 +0,0 @@
3bf6c933d322d4016ce015a1f9a8caccc9f14ea38efefc4c95258e2928ba1cf4 sync-bundle-01.txt
0fa67c68a2db905415d5980796e22f364d5557ee411d82d462566f2966db606e sync-bundle-02.txt
fca4ebd7bf7e8d8f8b7eb3b860aff6129942c24f447847b43f565fd5895e37e2 sync-bundle-03.txt
34a06c58c9eec3fe4766ba6e98bd4540fa4d98ff1c36c713a90c6c39d487b4bd sync-bundle-04.txt
f3395812768ce6904f89ca1b9e2e96c1fd2c8896e5c92671a442dbb282b02f11 sync-bundle-05.txt
5eb48ce445514b1898f2a33dda9250a31087ddc1a0d98028af13c2eb8653212d sync-entpacken.bat
+1 -5
View File
@@ -1,9 +1,7 @@
# 79 Dateien in 5 Bundles # 75 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
sync-bundle-01.txt check.bat
sync-bundle-01.txt check.ps1
sync-bundle-01.txt data/mainframe.html sync-bundle-01.txt data/mainframe.html
sync-bundle-01.txt data/sanitizer.html sync-bundle-01.txt data/sanitizer.html
sync-bundle-01.txt dgl.bat sync-bundle-01.txt dgl.bat
@@ -68,7 +66,6 @@ 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
@@ -76,5 +73,4 @@ sync-bundle-03.txt sync-check.html
sync-bundle-04.txt sync-check.js sync-bundle-04.txt sync-check.js
sync-bundle-04.txt sync-manifest.json sync-bundle-04.txt sync-manifest.json
sync-bundle-04.txt sync-worker.js sync-bundle-04.txt sync-worker.js
sync-bundle-04.txt update.bat
sync-bundle-05.txt xlsx.full.min.js sync-bundle-05.txt xlsx.full.min.js
+1 -1
View File
@@ -1 +1 @@
1.4.5 1.4.2
+2514 -2899
View File
File diff suppressed because it is too large Load Diff
+2683 -2764
View File
File diff suppressed because it is too large Load Diff
+7169 -7472
View File
File diff suppressed because it is too large Load Diff
+23 -32
View File
@@ -615,15 +615,15 @@ ICAgIFEoJyNidG4tc3RhcnQnKS5kaXNhYmxlZCA9IGZhbHNlOwogIH0pOwp9CgpRKCcjYnRuLXN0
YXJ0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdGFydCk7Ci8vIEF1dG8tU3RhcnQgYmVp YXJ0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdGFydCk7Ci8vIEF1dG8tU3RhcnQgYmVp
bSBPZWZmbmVuCnN0YXJ0KCk7Cg== bSBPZWZmbmVuCnN0YXJ0KCk7Cg==
### FILE: sync-manifest.json | 6024 ### FILE: sync-manifest.json | 6024
ewogICJnZW5lcmllcnQiOiAgIjIwMjYtMDYtMjNUMTE6NTg6MThaIiwKICAiYnJhbmNoIjogICAg ewogICJnZW5lcmllcnQiOiAgIjIwMjYtMDYtMjBUMDg6MTg6NTlaIiwKICAiYnJhbmNoIjogICAg
ICJtYWluIiwKICAiY29tbWl0IjogICAgICI3NTI2MzA1IiwKICAiYWxnb3JpdGhtdXMiOiJzaGEy ICJtYWluIiwKICAiY29tbWl0IjogICAgICIyOWU1ZTgxIiwKICAiYWxnb3JpdGhtdXMiOiJzaGEy
NTYiLAogICJkYXRlaWVuIjogewogICAgIldvY2hlbnBsYW4uaHRtbCI6IHsgInNoYTI1NiI6ICJl NTYiLAogICJkYXRlaWVuIjogewogICAgIldvY2hlbnBsYW4uaHRtbCI6IHsgInNoYTI1NiI6ICIz
NWE3MWQ2NTkyYzU0OTNlNzM0NzUwY2I5NTRiZmE3OGYxZTE4NDZhZTUwYzYzN2U1YTBlMjVjMjA0 MDY4NDMxMjU3NDBjOGJmMjgxY2RkN2VlMTZiMmEyNDI1ZWU2NDBkNDdhOGNkYWVkNzE2OWMwOGY4
NTYxNmI2IiwgImJ5dGVzIjogMjE1Mjc2IH0sCiAgICAiV29jaGVucGxhbi50ZW1wbGF0ZS5odG1s OWIzOGQwIiwgImJ5dGVzIjogMjE0OTM1IH0sCiAgICAiV29jaGVucGxhbi50ZW1wbGF0ZS5odG1s
IjogeyAic2hhMjU2IjogIjM4NjM0OGFhZjgxN2FmYjA1MmRlZGU5Nzc5YTljOWM0ZTg5ZGFjMWVh IjogeyAic2hhMjU2IjogIjM4NjM0OGFhZjgxN2FmYjA1MmRlZGU5Nzc5YTljOWM0ZTg5ZGFjMWVh
OGRhYjBkMTEyMjdiMjRjNTgyNmIxNDMiLCAiYnl0ZXMiOiAyNjM4MCB9LAogICAgImFwcC5qcyI6 OGRhYjBkMTEyMjdiMjRjNTgyNmIxNDMiLCAiYnl0ZXMiOiAyNjM4MCB9LAogICAgImFwcC5qcyI6
IHsgInNoYTI1NiI6ICJkZmIyOGZiMDNmYTAwZTY3MjU0ZGUxOTJkZGQ1YjJjYTYwZjQ5ZGMxODY5 IHsgInNoYTI1NiI6ICI5NjEzM2VhZDkwMDRhYTNmMDA4MzI2YmFkZWE1ZTY1ZmVmNTRkZDY3YTli
N2Y5YzdmYTdjMTNiNjAxNjM5NzQxIiwgImJ5dGVzIjogMTQ5NzU5IH0sCiAgICAiZGlhZ25vc2Uu ZTVkMjg2MDU1NDFiMDZlM2Y1MzA5IiwgImJ5dGVzIjogMTQzMDk4IH0sCiAgICAiZGlhZ25vc2Uu
aHRtbCI6IHsgInNoYTI1NiI6ICIwYmY1MDdjMmZmZTI3NjNkNTE2ZjFhYmZiZDlkOTRlMjI3NDgw aHRtbCI6IHsgInNoYTI1NiI6ICIwYmY1MDdjMmZmZTI3NjNkNTE2ZjFhYmZiZDlkOTRlMjI3NDgw
OTk5ZTNjY2ZkNDJjNGQ1YjQzZWNmZTg5YjI3IiwgImJ5dGVzIjogMjUzOCB9LAogICAgImRpYWdu OTk5ZTNjY2ZkNDJjNGQ1YjQzZWNmZTg5YjI3IiwgImJ5dGVzIjogMjUzOCB9LAogICAgImRpYWdu
b3NlLmpzIjogeyAic2hhMjU2IjogImVjOTBkMDRkZmE2MzZmYjA5MDNlZjE3MTlmOTM4YWQwYmY1 b3NlLmpzIjogeyAic2hhMjU2IjogImVjOTBkMDRkZmE2MzZmYjA5MDNlZjE3MTlmOTM4YWQwYmY1
@@ -632,9 +632,9 @@ aWNvbi5pY28iOiB7ICJzaGEyNTYiOiAiMjU0Y2Y1NWJkNzQ0ZDAxYTE0NjFkMjM4NzVkN2JkYjI1
NDI0MWQ4ZmY4MjZhM2QwY2Y2ZDhkN2MwY2Q1Y2NhYSIsICJieXRlcyI6IDQ0NDMgfSwKICAgICJo NDI0MWQ4ZmY4MjZhM2QwY2Y2ZDhkN2MwY2Q1Y2NhYSIsICJieXRlcyI6IDQ0NDMgfSwKICAgICJo
ZWFydGJlYXQtd29ya2VyLmpzIjogeyAic2hhMjU2IjogIjEzMDBiNmJhNGU4OWI2MWViYWFmOGY2 ZWFydGJlYXQtd29ya2VyLmpzIjogeyAic2hhMjU2IjogIjEzMDBiNmJhNGU4OWI2MWViYWFmOGY2
YTk5OGMyMGM5YTFhNzQ2N2E5ZTc5M2RiMDRhM2Y1NmY1NTk2ZWEyNWEiLCAiYnl0ZXMiOiAyNzUx YTk5OGMyMGM5YTFhNzQ2N2E5ZTc5M2RiMDRhM2Y1NmY1NTk2ZWEyNWEiLCAiYnl0ZXMiOiAyNzUx
IH0sCiAgICAiaW5kZXguaHRtbCI6IHsgInNoYTI1NiI6ICIzMzk2NDRiZmQwODFjZGFmNGMzMmJl IH0sCiAgICAiaW5kZXguaHRtbCI6IHsgInNoYTI1NiI6ICJmMjA2M2UxNWVkNjNiZDE3MWE1NmZm
ODk0NTIxNDc1NmRkZDRjOTdiYmQ2NWI5MjljNjg4NWIzNGQzYzExZjQ3IiwgImJ5dGVzIjogMTMz ZGQ1NWViYzk5ODIxYjRjNjg2MzlhNTZkMmJkMTBiNWIyYWE5OGU1YTY1IiwgImJ5dGVzIjogMTI5
NTc1IH0sCiAgICAiaW5mby5odG1sIjogeyAic2hhMjU2IjogIjdmMDE2ZjUzZjVjMWQ1YjE3NzUw MjExIH0sCiAgICAiaW5mby5odG1sIjogeyAic2hhMjU2IjogIjdmMDE2ZjUzZjVjMWQ1YjE3NzUw
MTFlNTlkZTg5MTIzMGU0ZTc3MjAyY2JmOTFiOGVhODRhMTk1OGZlN2M1NzYiLCAiYnl0ZXMiOiAx MTFlNTlkZTg5MTIzMGU0ZTc3MjAyY2JmOTFiOGVhODRhMTk1OGZlN2M1NzYiLCAiYnl0ZXMiOiAx
Mjc2NSB9LAogICAgImpzL2FkbWluLmpzIjogeyAic2hhMjU2IjogIjkyZjEzM2QzMDE0YmM4Nzdi Mjc2NSB9LAogICAgImpzL2FkbWluLmpzIjogeyAic2hhMjU2IjogIjkyZjEzM2QzMDE0YmM4Nzdi
NGUyYTA5ZmNmNjcyZWFhNzNkYTE5ZGNhN2MyZTU0ZTRkZWIxNzMyYjMwYTk4NDUiLCAiYnl0ZXMi NGUyYTA5ZmNmNjcyZWFhNzNkYTE5ZGNhN2MyZTU0ZTRkZWIxNzMyYjMwYTk4NDUiLCAiYnl0ZXMi
@@ -656,9 +656,9 @@ OiB7ICJzaGEyNTYiOiAiYjI4OTNmYTNhZmMyNGQyYjQ0YzI1OTM0NjU3Nzk2NDlhZjliMjA3YmMy
NzYxODJhMzMxYzVjMTc4MmZjZjRkNCIsICJieXRlcyI6IDQzMjc4IH0sCiAgICAianMvYWRtaW5f NzYxODJhMzMxYzVjMTc4MmZjZjRkNCIsICJieXRlcyI6IDQzMjc4IH0sCiAgICAianMvYWRtaW5f
c3RhbmRhcmRyZWNodGUuanMiOiB7ICJzaGEyNTYiOiAiYWU2OTEyMDhmYzk4MmQwMmZlYzhhOGY1 c3RhbmRhcmRyZWNodGUuanMiOiB7ICJzaGEyNTYiOiAiYWU2OTEyMDhmYzk4MmQwMmZlYzhhOGY1
ZTliNDBlMDI2MzhmMzdiZWU0NGY0ZDRmZTAxZjdlMTEwNjUyZDU3NCIsICJieXRlcyI6IDkyMzcg ZTliNDBlMDI2MzhmMzdiZWU0NGY0ZDRmZTAxZjdlMTEwNjUyZDU3NCIsICJieXRlcyI6IDkyMzcg
fSwKICAgICJqcy9hZG1pbl9zdGF0aXN0aWsuanMiOiB7ICJzaGEyNTYiOiAiN2U5MTQ2ZWUyZjli fSwKICAgICJqcy9hZG1pbl9zdGF0aXN0aWsuanMiOiB7ICJzaGEyNTYiOiAiMDc2NTUxODllMGUx
YmE1NTFjZjRkNzU0MjU5NzQyYWM1NDAyM2ZiY2IyYTM2YWI5M2Y0ZDkzMjUwZDQ0N2YwZSIsICJi YmE1YWE4ZjMyYzI5M2IzNGJjN2RiZmNiMTUxY2NiY2QxNDlmM2IwODI0MTVmOTg0MTQ3NiIsICJi
eXRlcyI6IDg1NTggfSwKICAgICJqcy9hZG1pbl9zdGF0aXN0aWtfYnVpbGRlci5qcyI6IHsgInNo eXRlcyI6IDgyNTkgfSwKICAgICJqcy9hZG1pbl9zdGF0aXN0aWtfYnVpbGRlci5qcyI6IHsgInNo
YTI1NiI6ICI0NGZjYjgyODBiZmQ3MmUwNjUxMDZiNjdkNTBlYzg2NjY2MTZmNWEyOGQ0NTYyZjc1 YTI1NiI6ICI0NGZjYjgyODBiZmQ3MmUwNjUxMDZiNjdkNTBlYzg2NjY2MTZmNWEyOGQ0NTYyZjc1
MzVhYzAxNTU1NjQ2MzU1IiwgImJ5dGVzIjogMzA0OTQgfSwKICAgICJqcy9iZXNldHp1bmcuanMi MzVhYzAxNTU1NjQ2MzU1IiwgImJ5dGVzIjogMzA0OTQgfSwKICAgICJqcy9iZXNldHp1bmcuanMi
OiB7ICJzaGEyNTYiOiAiZjMxY2NmN2E1NzBkNjQ3MjNlOTVkNjIwZWI2ODY5NmVjODE2ZmUwYjJl OiB7ICJzaGEyNTYiOiAiZjMxY2NmN2E1NzBkNjQ3MjNlOTVkNjIwZWI2ODY5NmVjODE2ZmUwYjJl
@@ -687,21 +687,21 @@ OTNkNmQwYjRjMzJlZTM1Zjg1MmI1NGRlZWU2NjIzYmViNjQ3ODhhMzg1MzhkNjFkNzEyNjQyYjFm
NDkwYTA0IiwgImJ5dGVzIjogMzU4OTMgfSwKICAgICJqcy9ncmlkX3JlbmRlci5qcyI6IHsgInNo NDkwYTA0IiwgImJ5dGVzIjogMzU4OTMgfSwKICAgICJqcy9ncmlkX3JlbmRlci5qcyI6IHsgInNo
YTI1NiI6ICIzMTM5ZjZlMmVmZDVjMTE5ZTExMzQ2OTVmZjQyMmIzYzg0YTE0MGUwMjNmZGZjNWVl YTI1NiI6ICIzMTM5ZjZlMmVmZDVjMTE5ZTExMzQ2OTVmZjQyMmIzYzg0YTE0MGUwMjNmZGZjNWVl
YTUwNjZlZDZlOWM2YzM2IiwgImJ5dGVzIjogMzcwNjQgfSwKICAgICJqcy9oaW53ZWlzZS5qcyI6 YTUwNjZlZDZlOWM2YzM2IiwgImJ5dGVzIjogMzcwNjQgfSwKICAgICJqcy9oaW53ZWlzZS5qcyI6
IHsgInNoYTI1NiI6ICIxNWVmN2EyOGFkOGViYjM1Y2FlMmE0OWIwYzVlNDAxODliMGU2MTQ1OThm IHsgInNoYTI1NiI6ICIyYjlmMzY4ZTc4MjE3MWVmMDhlZTk0ZDY1ODkzZDBhZGMyOWZiZjEyN2M1
YzI3ODI3YjYwMTZjMDFkMjg5OGIzIiwgImJ5dGVzIjogMTg5MzEgfSwKICAgICJqcy9pbXBvcnRf ZWY2MzNjYWZjZTczZTBkOTBjY2E4IiwgImJ5dGVzIjogMTkwNjEgfSwKICAgICJqcy9pbXBvcnRf
ZXhjZWwuanMiOiB7ICJzaGEyNTYiOiAiZjJhYTBkNjgyYjY1MWJlMDM4Y2IwY2U4MDc2NDczMDAw ZXhjZWwuanMiOiB7ICJzaGEyNTYiOiAiZjJhYTBkNjgyYjY1MWJlMDM4Y2IwY2U4MDc2NDczMDAw
YmQxODA5OWU2MzkxMTljNzE0YmQyNjc3NTdiNTM5MCIsICJieXRlcyI6IDkxMjI1IH0sCiAgICAi YmQxODA5OWU2MzkxMTljNzE0YmQyNjc3NTdiNTM5MCIsICJieXRlcyI6IDkxMjI1IH0sCiAgICAi
anMvbG9nYnVjaC5qcyI6IHsgInNoYTI1NiI6ICI0Yjc3MjJkZWZhZDQyYjJkZTM0ZjhhYjJhZWNj anMvbG9nYnVjaC5qcyI6IHsgInNoYTI1NiI6ICI0Yjc3MjJkZWZhZDQyYjJkZTM0ZjhhYjJhZWNj
OGRhNTUxNDdjZmU3MDkwMDc1YzM1MmViMWRiMDI2YjA2OWZlIiwgImJ5dGVzIjogMzY4NjggfSwK OGRhNTUxNDdjZmU3MDkwMDc1YzM1MmViMWRiMDI2YjA2OWZlIiwgImJ5dGVzIjogMzY4NjggfSwK
ICAgICJqcy9zY2hpY2h0dGVhbS5qcyI6IHsgInNoYTI1NiI6ICI2Mjk3YWFhNTQ0ZTlmMDYxODRj ICAgICJqcy9zY2hpY2h0dGVhbS5qcyI6IHsgInNoYTI1NiI6ICI2Mjk3YWFhNTQ0ZTlmMDYxODRj
NjZlYzM3MGMwZTE3Y2UxZDE5NTAwZjI3ODMxZjE2YWVhM2QyMGUyMzhjMDc2IiwgImJ5dGVzIjog NjZlYzM3MGMwZTE3Y2UxZDE5NTAwZjI3ODMxZjE2YWVhM2QyMGUyMzhjMDc2IiwgImJ5dGVzIjog
NjE2NCB9LAogICAgImpzL3N0YXRpc3Rpay5qcyI6IHsgInNoYTI1NiI6ICI4N2U4MmQxMzY0NTIz NjE2NCB9LAogICAgImpzL3N0YXRpc3Rpay5qcyI6IHsgInNoYTI1NiI6ICJjMzJmMzhjZjQzNzA4
NGJiNTlhNGVlMWY3NTIzZTRiZDE1ZTQzZDJiOWEyNWI5ZjJmNjljYzNmMDYxZGIxMTI5IiwgImJ5 MTkyNjQyOTYxNTAzNDEzNmE5NDMwMzc3NWNiMmQxY2E0ZTRlMjFhNmQ5MzY3M2RhODJmIiwgImJ5
dGVzIjogMTIxMDQ5IH0sCiAgICAianMvc3RhdGlzdGlrX2NoYXJ0cy5qcyI6IHsgInNoYTI1NiI6 dGVzIjogMTIyMDM1IH0sCiAgICAianMvc3RhdGlzdGlrX2NoYXJ0cy5qcyI6IHsgInNoYTI1NiI6
ICJjOGYzODNjYmIxYTA2YjE0N2JlZmNjNDYyOTdiMmU5YTU3Y2I1YTM0YzRjN2IxYTg0YWU5YWRh ICJjOGYzODNjYmIxYTA2YjE0N2JlZmNjNDYyOTdiMmU5YTU3Y2I1YTM0YzRjN2IxYTg0YWU5YWRh
OWZiZmU0NzcwIiwgImJ5dGVzIjogMTg1MTEgfSwKICAgICJqcy9zdGF0aXN0aWtfZW5naW5lLmpz OWZiZmU0NzcwIiwgImJ5dGVzIjogMTg1MTEgfSwKICAgICJqcy9zdGF0aXN0aWtfZW5naW5lLmpz
IjogeyAic2hhMjU2IjogImMwZTc3Yjg2ZDY5YjFhYWIwOGNhMjI2N2E0ZThiNmVlZmY1OGNjZjQ5 IjogeyAic2hhMjU2IjogIjIzYTRhYzc5NTViNTBiYjI0NzY3NjNjMjkyYzAyNGM1OGUxNDA1YjZh
N2E3ZDIyMjY2NWMxZmY4MzY5Y2YzODIiLCAiYnl0ZXMiOiAyMTM2OCB9LAogICAgImpzL3N5bmMu NzkzM2E4MTI5MWMwYWY0YTBjNTM3Y2IiLCAiYnl0ZXMiOiAxOTAxMCB9LAogICAgImpzL3N5bmMu
anMiOiB7ICJzaGEyNTYiOiAiNWZiYWEwZDU0OTA0NzQ2MGNkYTQzOTFjMzFmZTY5YzE4YzUxNWNi anMiOiB7ICJzaGEyNTYiOiAiNWZiYWEwZDU0OTA0NzQ2MGNkYTQzOTFjMzFmZTY5YzE4YzUxNWNi
YzhjNDViNDE4ZWNmYmI2MDdhMGQ2MzBiZiIsICJieXRlcyI6IDE5NDc0IH0sCiAgICAianMvdWlf YzhjNDViNDE4ZWNmYmI2MDdhMGQ2MzBiZiIsICJieXRlcyI6IDE5NDc0IH0sCiAgICAianMvdWlf
ZGlhbG9nLmpzIjogeyAic2hhMjU2IjogIjk5YTQzM2RkMGJhMDlhNjE5ZDFlZGI5YWMyN2I4YmUw ZGlhbG9nLmpzIjogeyAic2hhMjU2IjogIjk5YTQzM2RkMGJhMDlhNjE5ZDFlZGI5YWMyN2I4YmUw
@@ -710,9 +710,9 @@ ImpzL3VpX3J0ZS5qcyI6IHsgInNoYTI1NiI6ICJhMzkzYTY5ZDBlNDI3NWIyMTAwMGEwM2RkZDRi
YzU0ODQzMmE5ZjNkNmJmNzQzNWY4MmQ3N2IzZTQ1YzQ0NTYzIiwgImJ5dGVzIjogNjk1MSB9LAog YzU0ODQzMmE5ZjNkNmJmNzQzNWY4MmQ3N2IzZTQ1YzQ0NTYzIiwgImJ5dGVzIjogNjk1MSB9LAog
ICAgImpzL3dvY2hlbnBsYW4uanMiOiB7ICJzaGEyNTYiOiAiNGY5MTRmYzg1NDNjYTc2OWM1OWNl ICAgImpzL3dvY2hlbnBsYW4uanMiOiB7ICJzaGEyNTYiOiAiNGY5MTRmYzg1NDNjYTc2OWM1OWNl
OGU3MzdhNDZjMjg2MDdmMDEzYWRkMjY1NzgyZjgzZWMxZDI3NGEzNjgxMiIsICJieXRlcyI6IDE1 OGU3MzdhNDZjMjg2MDdmMDEzYWRkMjY1NzgyZjgzZWMxZDI3NGEzNjgxMiIsICJieXRlcyI6IDE1
MjA0IH0sCiAgICAic3R5bGUuY3NzIjogeyAic2hhMjU2IjogIjQyOWZlZmIzNDIyZDE1YzEwNzQy MjA0IH0sCiAgICAic3R5bGUuY3NzIjogeyAic2hhMjU2IjogIjYzNjkyOWRjMjM4M2I2YjA0OGRk
YjhiY2E4ZTU1NDVjMzRjMGVlYjE4MWM5MDFlNzBkOWQ2MWUzZjg3OTE4YTgiLCAiYnl0ZXMiOiAy NmFmY2M2NDFjYTc4NDc2MWY4MjU3N2U4NDZiODFiMmJhODdiYzFlNzg5ZDMiLCAiYnl0ZXMiOiAy
MzM5MTcgfSwKICAgICJzeW5jLWNoZWNrLmh0bWwiOiB7ICJzaGEyNTYiOiAiMjRkZjA3OTliODVk MzQ1MzIgfSwKICAgICJzeW5jLWNoZWNrLmh0bWwiOiB7ICJzaGEyNTYiOiAiMjRkZjA3OTliODVk
NjEyOTFkNWRkZjAyNGExN2M1MzM3OWQ5MGM3OWM5ZGE3MmJhNjlkODEzZTAxNGQ2ZjkyZiIsICJi NjEyOTFkNWRkZjAyNGExN2M1MzM3OWQ5MGM3OWM5ZGE3MmJhNjlkODEzZTAxNGQ2ZjkyZiIsICJi
eXRlcyI6IDQyNDkgfSwKICAgICJzeW5jLWNoZWNrLmpzIjogeyAic2hhMjU2IjogImU2YTM5NTQ0 eXRlcyI6IDQyNDkgfSwKICAgICJzeW5jLWNoZWNrLmpzIjogeyAic2hhMjU2IjogImU2YTM5NTQ0
YWFhYjc0NjkxYzA5N2Y5NGYxZDUwMGZhNGU5NWVlNjU4NGI0ZDkwNGViZjk5Nzc3MTc4Njk3NzQi YWFhYjc0NjkxYzA5N2Y5NGYxZDUwMGZhNGU5NWVlNjU4NGI0ZDkwNGViZjk5Nzc3MTc4Njk3NzQi
@@ -858,12 +858,3 @@ fQp9OwoKLy8gSW5pdGlhbC1QdWxzIGRpcmVrdCBiZWltIFdvcmtlci1Jbml0ICh2b3IgZGVyIGVy
c3RlbiAnc3RhcnQnLU5hY2hyaWNodCkuCi8vIERhbWl0IHNpZWh0IG1haW4gc2Nob24sIGRhc3Mg c3RlbiAnc3RhcnQnLU5hY2hyaWNodCkuCi8vIERhbWl0IHNpZWh0IG1haW4gc2Nob24sIGRhc3Mg
ZGFzIE1vZHVsIHVlYmVyaGF1cHQgZ2VwYXJzdCB3dXJkZS4Kc2VsZi5wb3N0TWVzc2FnZSh7IHR5 ZGFzIE1vZHVsIHVlYmVyaGF1cHQgZ2VwYXJzdCB3dXJkZS4Kc2VsZi5wb3N0TWVzc2FnZSh7IHR5
cGU6ICdwdWxzJywgdHM6IERhdGUubm93KCksIHBoYXNlOiAnaW5pdCcgfSk7CnN0YXJ0ZW4oKTsK cGU6ICdwdWxzJywgdHM6IERhdGUubm93KCksIHBoYXNlOiAnaW5pdCcgfSk7CnN0YXJ0ZW4oKTsK
### FILE: update.bat | 402
QGVjaG8gb2ZmCmVjaG8uCmVjaG8gPT09IFZJMyBER0wtUGxhbnVuZzogVXBkYXRlID09PQplY2hv
Lgpwb3dlcnNoZWxsIC1Ob1Byb2ZpbGUgLUV4ZWN1dGlvblBvbGljeSBCeXBhc3MgLUNvbW1hbmQg
XgogICIkcHJvaj0nVkkzREdMJzsgJHJvb3Q9JyV+ZHAwJy5UcmltRW5kKCdcJyk7ICRzdG9wQmF0
PSdzdG9wLmJhdCc7ICRzdGFydEJhdD0nZGdsLmJhdCc7IiBeCiAgIiRzPShJbnZva2UtV2ViUmVx
dWVzdCAnaHR0cHM6Ly91cGRhdGVzLnJoaW5vLm5ydy9yaGluby9TdGF0dXNRdW9fVXBkYXRlcy9y
YXcvYnJhbmNoL21haW4vc2NyaXB0cy91cGRhdGUucHMxJyAtVXNlQmFzaWNQYXJzaW5nIC1UaW1l
b3V0U2VjIDMwKS5Db250ZW50OyIgXgogICJJbnZva2UtRXhwcmVzc2lvbiAkcyIKZWNoby4KcGF1
c2UK
+1 -2
View File
@@ -52,8 +52,7 @@ if ($r -eq $true) { $ok++ } elseif ($r -eq $false) { $bad++ }
Write-Host '' Write-Host ''
if ($bad -eq 0) { if ($bad -eq 0) {
Write-Host ('FERTIG: ' + $ok + ' Dateien aktualisiert.') -ForegroundColor Green Write-Host ('FERTIG: ' + $ok + ' Dateien aktualisiert.') -ForegroundColor Green
Write-Host 'Jetzt server.ps1 neu starten, dann in der Portal-Wurzel check.bat' -ForegroundColor Green Write-Host 'Jetzt server.ps1 neu starten und zur Kontrolle sync-check.html oeffnen.' -ForegroundColor Green
Write-Host 'doppelklicken (Selbsttest "laufen alle Funktionen?") - alles GRUEN = Stand ok.' -ForegroundColor Green
} else { } else {
Write-Host ('FERTIG mit Warnungen: ' + $ok + ' ok, ' + $bad + ' mit falscher Laenge.') -ForegroundColor Yellow Write-Host ('FERTIG mit Warnungen: ' + $ok + ' ok, ' + $bad + ' mit falscher Laenge.') -ForegroundColor Yellow
} }
+68 -79
View File
@@ -1,108 +1,97 @@
# StatusQuo_Updates/scripts/rollback.ps1 # StatusQuo_Updates/scripts/rollback.ps1
# Kanonisches Rollback-Skript (Referenz). rollback.bat enthaelt diese Logik # Stellt den Stand vor dem letzten Update wieder her.
# EINGEBETTET und laeuft vollstaendig OFFLINE. Beachtet .backupignore. # Erwartet im aufrufenden Scope (wie update.ps1):
# Erwartet im Scope: $root, $stopBat, $startBat # $root - Installationspfad
# $stopBat - (optional) Stop-Skript-Dateiname oder ''
# $startBat - (optional) Start-Skript-Dateiname
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
# Erwartet im Scope: $root, $stopBat, $startBat
$_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' }
# Ausschlussliste (identisch zu update.ps1): .backup nie anfassen, plus große # Verfügbare Backups suchen
# Content-Ordner aus .backupignore — diese bleiben beim Rollback unverändert. $_backupBase = Join-Path $root '.backup'
$_excl = @('.backup') if (-not (Test-Path -LiteralPath $_backupBase)) {
$_ignoreFile = Join-Path $root '.backupignore' Write-Host "FEHLER: Kein Backup-Verzeichnis gefunden!" -ForegroundColor Red
if (Test-Path -LiteralPath $_ignoreFile) { Write-Host " Gesucht: $_backupBase"
$_extra = @(Get-Content -LiteralPath $_ignoreFile | ForEach-Object { $_.Trim() } | Write-Host " Backups werden automatisch beim nächsten Update angelegt."
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 return
} }
$snaps = Get-ChildItem -LiteralPath $bk -Filter 'snapshot-*.zip' -ErrorAction SilentlyContinue | Sort-Object Name -Descending
if (-not $snaps) { $_backups = Get-ChildItem -LiteralPath $_backupBase -Directory |
Write-Host "Keine Sicherungen vorhanden. Sicherungen entstehen automatisch beim ersten Update." -ForegroundColor Red Where-Object { $_.Name -match '^\d{8}-\d{6}$' } | Sort-Object Name -Descending
if ($_backups.Count -eq 0) {
Write-Host "FEHLER: Keine Backups vorhanden." -ForegroundColor Red
Write-Host " Backups werden automatisch beim nächsten Update angelegt."
return return
} }
Write-Host "" Write-Host ""
Write-Host "Verfügbare Sicherungen (neueste zuerst):" -ForegroundColor Cyan Write-Host "Verfügbare Backups:" -ForegroundColor Cyan
$i = 0 $_i = 0
foreach ($s in $snaps) { foreach ($bk in $_backups) {
$size = '{0:N1} MB' -f ($s.Length / 1MB) $suffix = if ($_i -eq 0) { " ← neuestes" } else { "" }
$tag = if ($i -eq 0) { " <- neueste" } else { "" } Write-Host (" [{0}] {1}{2}" -f $_i, $bk.Name, $suffix)
Write-Host (" [{0}] {1} ({2}){3}" -f $i, $s.Name, $size, $tag) $_i++
$i++
} }
Write-Host "" Write-Host ""
$c = Read-Host "Nummer der Sicherung wählen (Enter = neueste [0])" $_choice = Read-Host "Backup-Nummer wählen (Enter = neuestes [0])"
if ($c -eq '') { $c = '0' } if ($_choice -eq '') { $_choice = '0' }
if ($c -notmatch '^\d+$' -or [int]$c -ge $snaps.Count) { if ($_choice -notmatch '^\d+$' -or [int]$_choice -ge $_backups.Count) {
Write-Host "Ungültige Auswahl. Abgebrochen." -ForegroundColor Yellow Write-Host "Ungültige Auswahl. Abgebrochen." -ForegroundColor Yellow
return 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
}
$_selected = $_backups[[int]$_choice]
Write-Host "" Write-Host ""
$yn = Read-Host "Stand '$($chosen.Name)' wiederherstellen? Der aktuelle Stand wird ersetzt! [j/N]" Write-Host "Stelle wieder her: $($_selected.Name)" -ForegroundColor Yellow
$yn = Read-Host "Rollback durchführen? Aktuelle Dateien werden überschrieben! [j/N]"
if ($yn -notin 'j','J','y','Y') { Write-Host "Abgebrochen."; return } if ($yn -notin 'j','J','y','Y') { Write-Host "Abgebrochen."; return }
# Server stoppen # Server stoppen
Write-Host "Stoppe Server ..." Write-Host "Stoppe Server ..."
if ($_stopName -ne '') { if ($_stopName -ne '') {
$sp = Join-Path $root $_stopName $_stopPath = Join-Path $root $_stopName
if (Test-Path -LiteralPath $sp) { & cmd /c "`"$sp`""; Start-Sleep -Seconds 2 } if (Test-Path -LiteralPath $_stopPath) {
else { Write-Host " (Stop-Skript '$_stopName' nicht gefunden — übersprungen)" -ForegroundColor DarkYellow } & cmd /c "`"$_stopPath`""
} else { Write-Host " (Kein Stop-Skript konfiguriert — übersprungen)" -ForegroundColor DarkYellow } Start-Sleep -Seconds 2
} else {
# Aktuellen Stand beiseite verschieben (Sicherheitsnetz, kein Datenverlust) Write-Host " (Stop-Skript '$_stopName' nicht gefunden — übersprungen)" -ForegroundColor DarkYellow
$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 } else {
return Write-Host " (Kein Stop-Skript konfiguriert — übersprungen)" -ForegroundColor DarkYellow
} }
# Beiseite-Ordner aufräumen: nur die letzten 2 behalten # Nutzerdaten wiederherstellen
Get-ChildItem -LiteralPath $bk -Directory -Filter '_vor-rollback-*' -ErrorAction SilentlyContinue | $_dataBackup = Join-Path $_selected.FullName 'data'
Sort-Object Name -Descending | Select-Object -Skip 2 | if (Test-Path -LiteralPath $_dataBackup) {
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $dataTarget = Join-Path $root 'data'
if (Test-Path -LiteralPath $dataTarget) {
# Aktuellen data/-Ordner vor Überschreiben sichern
$safeName = "data_vor_rollback_$(Get-Date -Format 'yyyyMMdd-HHmmss')"
Rename-Item -LiteralPath $dataTarget -NewName $safeName -ErrorAction SilentlyContinue
}
Copy-Item -Path $_dataBackup -Destination $dataTarget -Recurse -Force
$dataCount = (Get-ChildItem -LiteralPath $dataTarget -Recurse -File -ErrorAction SilentlyContinue).Count
Write-Host "Nutzerdaten wiederhergestellt ($dataCount Dateien)." -ForegroundColor Green
} else {
Write-Host " (Kein Nutzerdaten-Backup in diesem Stand)" -ForegroundColor DarkYellow
}
# Server starten # Code-Dateien wiederherstellen
$stp = Join-Path $root $_startName $_codeFiles = Get-ChildItem -LiteralPath $_selected.FullName -File -ErrorAction SilentlyContinue
if (Test-Path -LiteralPath $stp) { foreach ($f in $_codeFiles) {
Start-Process -FilePath 'cmd.exe' -ArgumentList "/c `"$stp`"" -WindowStyle Hidden Copy-Item -Path $f.FullName -Destination (Join-Path $root $f.Name) -Force
}
Write-Host "Code-Dateien wiederhergestellt ($($_codeFiles.Count) Dateien)." -ForegroundColor Green
# Server neu starten
$_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 Write-Host "Server gestartet." -ForegroundColor Green
} else { } else {
Write-Host "Start-Skript '$_startName' nicht gefunden — bitte Server manuell starten." -ForegroundColor Yellow Write-Host "Start-Skript '$_startName' nicht gefunden — bitte Server manuell starten." -ForegroundColor Yellow
@@ -110,4 +99,4 @@ if (Test-Path -LiteralPath $stp) {
Write-Host "" Write-Host ""
Write-Host "=== Rollback abgeschlossen ===" -ForegroundColor Green Write-Host "=== Rollback abgeschlossen ===" -ForegroundColor Green
Write-Host " Wiederhergestellt: $($chosen.Name)" -ForegroundColor Cyan Write-Host " Wiederhergestellt: $($_selected.Name)" -ForegroundColor Cyan
+88 -163
View File
@@ -2,111 +2,24 @@
# 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 (Portal-Wurzel mit index.html, VERSION usw.) # $root - Installationspfad (Verzeichnis mit server.ps1, VERSION usw.)
# $stopBat - (optional) Stop-Skript-Dateiname; ''=kein Stop; nicht gesetzt=Fallback 'stop.bat' # $stopBat - (optional) Dateiname des Stop-Skripts, z.B. 'DRIVE_Stop.bat'.
# $startBat - (optional) Start-Skript-Dateiname; nicht gesetzt=Fallback 'dgl.bat' # Leerstring '' = kein Stop-Schritt. Nicht gesetzt = Fallback auf 'stop.bat'.
# # $startBat - (optional) Dateiname des Start-Skripts, z.B. 'DRIVE_Start.bat'.
# Strategie: Transaktionales Update mit vollständigem ZIP-Snapshot vor jeder # Nicht gesetzt = Fallback auf 'dgl.bat'.
# Änderung. Bei Fehler wird der vorherige Stand automatisch 1:1 wiederhergestellt.
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
$DistBase = "https://updates.rhino.nrw/rhino/StatusQuo_Updates/raw/branch/main/$proj" $DistBase = "https://updates.rhino.nrw/rhino/StatusQuo_Updates/raw/branch/main/$proj"
# Behoerden-Proxy verlangt Authentifizierung (407) -> dem System-Proxy einmalig # Stop/Start-Namen VOR jeder Ueberschreibung aus dem aufrufenden Scope lesen
# die angemeldeten Windows-Credentials (Negotiate/NTLM des laufenden Benutzers)
# mitgeben, sonst scheitert JEDER Download (VERSION/MANIFEST/Bundles/CHECKSUMS)
# unten mit '(407) Proxyauthentifizierung erforderlich'. Wirkt global ueber
# DefaultWebProxy fuer alle folgenden Invoke-WebRequest-Aufrufe.
try {
$p = [System.Net.WebRequest]::GetSystemWebProxy()
if ($p) {
$p.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
[System.Net.WebRequest]::DefaultWebProxy = $p
}
} catch {}
$_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()
@@ -118,26 +31,20 @@ try {
Write-Host "Lokal: v$localVer" Write-Host "Lokal: v$localVer"
Write-Host "Remote: v$remoteVer" Write-Host "Remote: v$remoteVer"
# Nur echtes Upgrade anbieten (kein versehentlicher Downgrade) if ($localVer -eq $remoteVer) {
$isNewer = $false Write-Host "Bereits auf aktuellem Stand. Kein Update nötig." -ForegroundColor Green
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-' } |
@@ -150,92 +57,110 @@ 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
# --------------------------------------------------------------------------- # --- CHECKSUMMEN VERIFIZIEREN (optional — wird übersprungen wenn keine CHECKSUMS.txt vorhanden) ---
# 3. Download-Integrität prüfen (SHA256, falls CHECKSUMS.txt vorhanden) Write-Host "Verifiziere Checksummen ..."
# Schützt gegen unvollständige/korrupte Downloads — NICHT gegen manipulierte
# Releases (gleicher Kanal). Authentizität = Release-Disziplin + Tests.
# ---------------------------------------------------------------------------
Write-Host "Verifiziere Download-Integrität ..."
try { try {
$chk = (Invoke-WebRequest -Uri "$DistBase/CHECKSUMS.txt" -UseBasicParsing -TimeoutSec 15).Content $chkContent = (Invoke-WebRequest -Uri "$DistBase/CHECKSUMS.txt" -UseBasicParsing -TimeoutSec 15).Content
$allOk = $true $allOk = $true
foreach ($line in ($chk -split "`n")) { foreach ($line in ($chkContent -split "`n")) {
$line = $line.Trim() $line = $line.Trim()
if ($line -eq '' -or $line.StartsWith('#')) { continue } if ($line -eq '' -or $line.StartsWith('#')) { continue }
# Format: SHA256HASH filename
$parts = $line -split '\s+', 2 $parts = $line -split '\s+', 2
if ($parts.Count -lt 2) { continue } if ($parts.Count -lt 2) { continue }
$expected = $parts[0].ToLower() $expected = $parts[0].ToLower()
$filename = $parts[1].Trim().TrimStart('*') # sha256sum nutzt evtl. '*' Prefix $filename = $parts[1].Trim()
$localPath = Join-Path $tmp $filename $localPath = Join-Path $tmp $filename
if (-not (Test-Path -LiteralPath $localPath)) { continue } if (-not (Test-Path -LiteralPath $localPath)) { continue }
$actual = (Get-FileHash -LiteralPath $localPath -Algorithm SHA256).Hash.ToLower() $actual = (Get-FileHash -LiteralPath $localPath -Algorithm SHA256).Hash.ToLower()
if ($actual -ne $expected) { if ($actual -ne $expected) {
Write-Host "FEHLER: Checksumme stimmt nicht für $filename!" -ForegroundColor Red Write-Host "FEHLER: Checksumme stimmt nicht für $filename!" -ForegroundColor Red
Write-Host " Erwartet: $expected" -ForegroundColor Red
Write-Host " Erhalten: $actual" -ForegroundColor Red
$allOk = $false $allOk = $false
} }
} }
if (-not $allOk) { if (-not $allOk) {
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 Write-Host "Update abgebrochen — keine Dateien verändert. Bitte Support kontaktieren." -ForegroundColor Red
return return
} }
Write-Host " Alle Checksummen OK." -ForegroundColor Green Write-Host " Alle Checksummen OK." -ForegroundColor Green
} catch { } catch {
Write-Host " (Keine CHECKSUMS.txt — Integritätsprüfung übersprungen)" -ForegroundColor DarkGray # CHECKSUMS.txt nicht vorhanden — Prüfung überspringen (abwärtskompatibel)
Write-Host " (Keine CHECKSUMS.txt — Prüfung übersprungen)" -ForegroundColor DarkGray
} }
# --- END CHECKSUMMEN ---
# --------------------------------------------------------------------------- # Server stoppen
# 4. Server stoppen
# ---------------------------------------------------------------------------
Write-Host "Stoppe Server ..." Write-Host "Stoppe Server ..."
Stop-Portal if ($_stopName -ne '') {
$_stopPath = Join-Path $root $_stopName
# --------------------------------------------------------------------------- if (Test-Path -LiteralPath $_stopPath) {
# 5. Snapshot (transaktionssicher: ohne gültiges Backup kein Update) & cmd /c "`"$_stopPath`""
# --------------------------------------------------------------------------- Start-Sleep -Seconds 2
Write-Host "Erstelle vollständige Sicherung ..." } else {
try { Write-Host " (Stop-Skript '$_stopName' nicht gefunden — übersprungen)" -ForegroundColor DarkYellow
$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 } else {
Start-Portal Write-Host " (Kein Stop-Skript konfiguriert — übersprungen)" -ForegroundColor DarkYellow
return
} }
# --------------------------------------------------------------------------- # --- BACKUP (vor jeder Dateiänderung) ---
# 7. Aufräumen + Start $ts = Get-Date -Format 'yyyyMMdd-HHmmss'
# --------------------------------------------------------------------------- $bkDir = Join-Path $root ".backup\$ts"
Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue New-Item -ItemType Directory -Path $bkDir -Force | Out-Null
# 1. Nutzerdaten sichern (kritisch!)
$_dataPath = Join-Path $root 'data'
if (Test-Path -LiteralPath $_dataPath) {
Copy-Item -Path $_dataPath -Destination (Join-Path $bkDir 'data') -Recurse -Force
$dataCount = (Get-ChildItem -LiteralPath $_dataPath -Recurse -File -ErrorAction SilentlyContinue).Count
Write-Host " Nutzerdaten gesichert ($dataCount Dateien)" -ForegroundColor Cyan
} else {
Write-Host " (Kein data/-Ordner gefunden — übersprungen)" -ForegroundColor DarkGray
}
# 2. Code-Dateien sichern
foreach ($ext in '*.ps1','*.html','*.js','*.css','*.bat','VERSION') {
Get-ChildItem -LiteralPath $root -File -Filter $ext -ErrorAction SilentlyContinue |
Copy-Item -Destination $bkDir -Force
}
Write-Host "Backup erstellt: $bkDir" -ForegroundColor Cyan
# 3. Alte Backups bereinigen (max. 5 behalten)
$_backupBase = Join-Path $root '.backup'
$_allBackups = Get-ChildItem -LiteralPath $_backupBase -Directory -ErrorAction SilentlyContinue |
Where-Object { $_.Name -match '^\d{8}-\d{6}$' } | Sort-Object Name -Descending
if ($_allBackups.Count -gt 5) {
$_allBackups | Select-Object -Skip 5 | ForEach-Object {
Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue
}
Write-Host " (Nur 5 neueste Backups behalten)" -ForegroundColor DarkGray
}
# --- END BACKUP ---
# Entpacken (sync-entpacken.bat aus TempUpdate → schreibt in Root eine Ebene hoeher)
Write-Host "Entpacke Update-Dateien ..."
& 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 Write-Host "Version auf v$remoteVer aktualisiert." -ForegroundColor Green
Start-Portal
# Aufräumen
Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue
# Server neu starten
$_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 "" Write-Host ""
Write-Host "=== Update abgeschlossen ===" -ForegroundColor Green Write-Host "=== Update abgeschlossen ===" -ForegroundColor Green
Write-Host " Sicherung: $snap" -ForegroundColor DarkGray Write-Host " Backup liegt unter: $bkDir" -ForegroundColor DarkGray
Write-Host " Bei Problemen: rollback.bat doppelklicken (funktioniert auch offline)." -ForegroundColor DarkGray Write-Host " Bei Problemen: rollback.bat doppelklicken!" -ForegroundColor DarkGray