Files
nis2-agile/scripts/migrate-isms.php
T

77 lines
2.8 KiB
PHP

<?php
/**
* NIS2 Agile - Runner migrazioni SGSI (ISO 27001) — 037 + 038
* ----------------------------------------------------------------------------
* Applica le migrazioni del Modello Organizzativo SGSI usando la STESSA
* connessione PDO dell'app (config/database.php), cosi da colpire il DB
* realmente servito (host MySQL via socket), NON il DB secondario del container.
*
* USO (sull'host, con la connessione dell'app):
* docker exec nis2-app php /var/www/nis2-agile/scripts/migrate-isms.php
*
* Idempotente: le migrazioni usano CREATE TABLE IF NOT EXISTS + INSERT IGNORE.
* Sola lettura su tabelle esistenti: NON modifica nessuna tabella preesistente.
*/
require_once __DIR__ . '/../application/config/config.php';
require_once __DIR__ . '/../application/config/database.php';
$files = [
__DIR__ . '/../docs/sql/037_isms_model.sql',
__DIR__ . '/../docs/sql/038_iso27001_annex_controls.sql',
];
$pdo = Database::getInstance();
$totalStmts = 0;
foreach ($files as $file) {
if (!is_readable($file)) {
fwrite(STDERR, "[migrate-isms] File non leggibile: $file\n");
exit(1);
}
$sql = (string) file_get_contents($file);
// Rimuove i commenti "--" (riga intera E in coda alla riga): un commento puo
// contenere ';' (es. "-- NULL=sempre; cloud") e spezzerebbe lo split. Le
// migrazioni non usano '--' dentro stringhe/valori, quindi e sicuro.
$lines = preg_split('/\r?\n/', $sql);
$clean = [];
foreach ($lines as $l) {
$pos = strpos($l, '--');
if ($pos !== false) {
$l = substr($l, 0, $pos);
}
if (trim($l) === '') {
continue;
}
$clean[] = $l;
}
$sql = implode("\n", $clean);
// Split semplice su ';' (nessun DELIMITER / stored procedure in questi file).
$statements = array_filter(array_map('trim', explode(';', $sql)), fn($s) => $s !== '');
echo "== " . basename($file) . " (" . count($statements) . " statement) ==\n";
foreach ($statements as $stmt) {
try {
$pdo->exec($stmt);
$totalStmts++;
} catch (PDOException $e) {
$head = substr(preg_replace('/\s+/', ' ', $stmt), 0, 80);
fwrite(STDERR, "[ERRORE] su \"$head...\": " . $e->getMessage() . "\n");
exit(1);
}
}
}
// Verifica rapida del seed.
$count = (int) ($pdo->query('SELECT COUNT(*) AS n FROM iso27001_annex_controls')->fetch()['n'] ?? 0);
$byStd = $pdo->query('SELECT standard, COUNT(*) AS n FROM iso27001_annex_controls GROUP BY standard')->fetchAll();
echo "\n[OK] Eseguiti $totalStmts statement.\n";
echo "[OK] iso27001_annex_controls: $count controlli totali.\n";
foreach ($byStd as $r) {
echo " - {$r['standard']}: {$r['n']}\n";
}
echo "[OK] Tabelle SGSI pronte (isms_models, isms_roles, isms_soa, isms_documents).\n";