Beide Module wurden aus einem anderen Kundenprojekt kopiert und bereinigt: Knowledgecenter: - Bild-Cache (1.985 Dateien) geleert, Ordnerstruktur mit .gitkeep behalten - Files-Gallery-Lizenzschlüssel entfernt (config.php) - Kundenspezifische Kategorien gelöscht: Teil I/II/III QM-Struktur, nummerierte QM-Kapitel, Gremien (Präsidium/Finanzausschuss/Landesausschuss), Sitzungsservice-Serie, Protokoll-Abteilungen, Testeinträge - 56 generische Kategorien bleiben (Downloads, Onboarding, Personalthemen …) Tasks: - Alle Betriebsdaten gelöscht (114 Tasks, 914 Submissions, 579 Assignments) - Task-Definitionen und Verlinkungen geleert - Kategoriestruktur bleibt (Allgemein, IT, Personal, Buchhaltung …) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
87 lines
2.4 KiB
PHP
87 lines
2.4 KiB
PHP
<?php
|
|
// Einmalige Migration: legt in jedem bestehenden Beitragsordner unter
|
|
// /userdata/knowledgecenter_update/posts/<hash>/ einen Symlink "shared"
|
|
// an, der auf ../../shared zeigt.
|
|
//
|
|
// Idempotent (bereits vorhandene Einträge werden übersprungen) und
|
|
// CLI-only — niemals direkt per HTTP aufrufbar.
|
|
//
|
|
// Usage:
|
|
// php Installation/add_shared_symlinks.php --dry-run
|
|
// php Installation/add_shared_symlinks.php
|
|
|
|
declare(strict_types=1);
|
|
|
|
if (PHP_SAPI !== 'cli') {
|
|
http_response_code(403);
|
|
exit('CLI only');
|
|
}
|
|
|
|
$dryRun = in_array('--dry-run', $argv, true);
|
|
|
|
$postsDir = realpath(__DIR__ . '/../../../userdata/knowledgecenter_update/posts');
|
|
$sharedDir = realpath(__DIR__ . '/../../../userdata/knowledgecenter_update/shared');
|
|
|
|
if ($postsDir === false) {
|
|
fwrite(STDERR, "FEHLER: posts/-Verzeichnis nicht gefunden\n");
|
|
exit(2);
|
|
}
|
|
if ($sharedDir === false) {
|
|
fwrite(STDERR, "FEHLER: shared/-Verzeichnis nicht gefunden — bitte erst anlegen\n");
|
|
exit(2);
|
|
}
|
|
|
|
echo "Mode: " . ($dryRun ? 'DRY-RUN (keine Änderungen)' : 'LIVE') . "\n";
|
|
echo "Posts: $postsDir\n";
|
|
echo "Shared: $sharedDir\n\n";
|
|
|
|
$dirs = glob($postsDir . '/*', GLOB_ONLYDIR);
|
|
if ($dirs === false) {
|
|
fwrite(STDERR, "FEHLER: glob() lieferte false\n");
|
|
exit(2);
|
|
}
|
|
|
|
$created = 0;
|
|
$skipped = 0;
|
|
$collisions = 0;
|
|
$failed = 0;
|
|
|
|
foreach ($dirs as $dir) {
|
|
$linkPath = $dir . '/shared';
|
|
$name = basename($dir);
|
|
|
|
if (is_link($linkPath)) {
|
|
$skipped++;
|
|
continue;
|
|
}
|
|
if (file_exists($linkPath)) {
|
|
// gleichnamiger echter Ordner/Datei — nicht überschreiben
|
|
echo "[KOLLISION] $name/shared existiert bereits als Ordner/Datei — übersprungen\n";
|
|
$collisions++;
|
|
continue;
|
|
}
|
|
|
|
if ($dryRun) {
|
|
echo "[DRY-RUN] würde anlegen: $name/shared -> ../../shared\n";
|
|
$created++;
|
|
continue;
|
|
}
|
|
|
|
if (@symlink('../../shared', $linkPath)) {
|
|
$created++;
|
|
} else {
|
|
$err = error_get_last();
|
|
echo "[FEHLER] $name/shared konnte nicht angelegt werden: " . ($err['message'] ?? 'unbekannt') . "\n";
|
|
$failed++;
|
|
}
|
|
}
|
|
|
|
echo "\n=== Zusammenfassung ===\n";
|
|
echo "Beitragsordner gesamt: " . count($dirs) . "\n";
|
|
echo "Symlinks " . ($dryRun ? 'geplant' : 'angelegt') . ": $created\n";
|
|
echo "Bereits vorhanden: $skipped\n";
|
|
echo "Kollisionen: $collisions\n";
|
|
echo "Fehlgeschlagen: $failed\n";
|
|
|
|
exit($failed > 0 ? 1 : 0);
|