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