Files
awo-hamburg-intranet/module/knowledgecenter_update/Installation/add_shared_symlinks.php

87 lines
2.4 KiB
PHP
Raw Normal View History

<?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);