1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-01-29 07:02:41 +01:00

Base per controllo di intergità del database

This commit is contained in:
Dasc3er 2020-08-28 11:20:20 +02:00
parent 859a6dca82
commit 7bc18666f6
7 changed files with 257 additions and 11 deletions

1
.gitignore vendored
View File

@ -90,6 +90,7 @@ REVISION
.php_cs.cache
manifest.json
checksum.json
database.json
/tests/_log/*
/tests/_temp/*

View File

@ -10,13 +10,7 @@
],
"homepage": "https://www.openstamanager.com/",
"authors": [{
"name": "Fabio Lovato",
"email": "info@openstamanager.com"
}, {
"name": "Fabio Piovan",
"email": "info@openstamanager.com"
}, {
"name": "Luca Salvà",
"name": "DevCode s.n.c",
"email": "info@openstamanager.com"
}],
"type": "project",

View File

@ -370,6 +370,7 @@ function release(done) {
glob([
'**/*',
'!checksum.json',
'!database.json',
'!.idea/**',
'!.git/**',
'!node_modules/**',
@ -417,6 +418,20 @@ function release(done) {
checksumFile.close();
archive.file('checksum.json', {});
// Aggiunta del file per il controllo di integrità del database
archive.append(shell.exec(`php -r '
error_reporting(0);
$skip_permissions = true;
include_once __DIR__."/core.php";
$info = Update::getDatabaseStructure();
$response = json_encode($info);
echo $response;
'`, {
silent: true
}).stdout, {
name: 'database.json'
});
// Aggiunta del commit corrente nel file REVISION
archive.append(shell.exec('git rev-parse --short HEAD', {
silent: true

View File

@ -58,7 +58,7 @@ foreach ($checksum as $file => $md5) {
// Schermata di visualizzazione degli errori
if (!empty($errors)) {
echo '
<p>'.tr("Segue l'elenco dei file che presentano checksum diverso rispetto a quello regitrato nella versione ufficiale").'.</p>
<p>'.tr("Segue l'elenco dei file che presentano checksum diverso rispetto a quello registrato nella versione ufficiale").'.</p>
<div class="alert alert-warning">
<i class="fa fa-warning"></i>
'.tr('Attenzione: questa funzionalità può presentare dei risultati falsamente positivi, sulla base del contenuto del file _FILE_', [

View File

@ -0,0 +1,163 @@
<?php
include_once __DIR__.'/../../core.php';
function integrity_diff($expected, $current)
{
foreach ($expected as $key => $value) {
if (array_key_exists($key, $current) && is_array($value)) {
if (!is_array($current[$key])) {
$difference[$key] = $value;
} else {
$new_diff = integrity_diff($value, $current[$key]);
if (!empty($new_diff)) {
$difference[$key] = $new_diff;
}
}
} elseif (!array_key_exists($key, $current) || $current[$key] != $value) {
$difference[$key] = [
'current' => $current[$key],
'expected' => $value,
];
}
}
return !isset($difference) ? [] : $difference;
}
$file = basename(__FILE__);
$effettua_controllo = filter('effettua_controllo');
// Schermata di caricamento delle informazioni
if (empty($effettua_controllo)) {
echo '
<div id="righe_controlli">
</div>
<div class="alert alert-info" id="box-loading">
<i class="fa fa-spinner fa-spin"></i> '.tr('Caricamento in corso').'...
</div>
<script>
var content = $("#righe_controlli");
var loader = $("#box-loading");
$(document).ready(function () {
loader.show();
content.html("");
content.load("'.$structure->fileurl($file).'?effettua_controllo=1", function() {
loader.hide();
});
})
</script>';
return;
}
$contents = file_get_contents(DOCROOT.'/database.json');
$data = json_decode($contents, true);
if (empty($data)) {
echo '
<div class="alert alert-warning">
<i class="fa fa-warning"></i> '.tr('Impossibile effettuare controlli di integrità in assenza del file _FILE_', [
'_FILE_' => '<b>database.json</b>',
]).'.
</div>';
return;
}
// Controllo degli errori
$info = Update::getDatabaseStructure();
$results = integrity_diff($data, $info);
// Schermata di visualizzazione degli errori
if (!empty($results)) {
echo '
<p>'.tr("Segue l'elenco delle tabelle del database che presentano una struttura diversa rispetto a quella prevista nella versione ufficiale del gestionale").'.</p>
<div class="alert alert-warning">
<i class="fa fa-warning"></i>
'.tr('Attenzione: questa funzionalità può presentare dei risultati falsamente positivi, sulla base del contenuto del file _FILE_', [
'_FILE_' => '<b>database.json</b>',
]).'.
</div>';
foreach ($results as $table => $errors) {
echo '
<h3>'.$table.'</h3>';
if (array_key_exists('current', $errors) && $errors['current'] == null) {
echo '
<p>'.tr('Tabella assente').'</p>';
continue;
}
$foreign_keys = $errors['foreign_keys'] ?: [];
unset($errors['foreign_keys']);
if (!empty($errors)) {
echo '
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>'.tr('Colonna').'</th>
<th>'.tr('Conflitto').'</th>
</tr>
</thead>
<tbody>';
foreach ($errors as $name => $diff) {
echo '
<tr>
<td>
'.$name.'
</td>
<td>
'.json_encode($diff).'
</td>
</tr>';
}
echo '
</tbody>
</table>';
}
if (!empty($foreign_keys)) {
echo '
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>'.tr('Foreign keys').'</th>
<th>'.tr('Conflitto').'</th>
</tr>
</thead>
<tbody>';
foreach ($foreign_keys as $name => $diff) {
echo '
<tr>
<td>
'.$name.'
</td>
<td>
'.json_encode($diff).'
</td>
</tr>';
}
echo '
</tbody>
</table>';
}
}
} else {
echo '
<div class="alert alert-info">
<i class="fa fa-info-circle"></i> '.tr('Il database non presenta problemi di integrità').'.
</div>';
}

View File

@ -117,7 +117,11 @@ function update() {
}
function checksum(button) {
openModal("'.tr('Controllo di integrità').'", "'.$module->fileurl('checksum.php').'?id_module='.$id_module.'");
openModal("'.tr('Controllo dei file').'", "'.$module->fileurl('checksum.php').'?id_module='.$id_module.'");
}
function database(button) {
openModal("'.tr('Controllo del database').'", "'.$module->fileurl('database.php').'?id_module='.$id_module.'");
}
function search(button) {
@ -170,12 +174,16 @@ function search(button) {
<div class="box box-warning">
<div class="box-header with-border">
<h3 class="box-title">
'.tr("Verifica l'integrità dell'intallazione").' <span class="tip" title="'.tr("Verifica l'integrità della tua installazione attraverso un controllo sui checksum dei file").'."><i class="fa fa-question-circle-o"></i></span>
'.tr("Verifica l'integrità dell'intallazione").' <span class="tip" title="'.tr("Verifica l'integrità della tua installazione attraverso un controllo sui checksum dei file e sulla struttura del database").'."><i class="fa fa-question-circle-o"></i></span>
</h3>
</div>
<div class="box-body">
<button type="button" class="btn btn-primary btn-block" onclick="checksum(this)">
<i class="fa fa-list-alt"></i> '.tr('Controlla').'
<i class="fa fa-list-alt"></i> '.tr('Controlla file').'
</button>
<button type="button" class="btn btn-info btn-block" onclick="database(this)">
<i class="fa fa-database"></i> '.tr('Controlla database').'
</button>
</div>
</div>

View File

@ -302,6 +302,71 @@ class Update
return false;
}
return true;
}
/**
* Restituisce un riepilogo sulla struttura delle tabelle del gestionale.
*
* @throws Exception
*
* @return array
*/
public static function getDatabaseStructure()
{
// Tabelle registrate per il gestionale
$tables = include DOCROOT.'/update/tables.php';
$database = database();
$database_name = $database->getDatabaseName();
$info = [];
foreach ($tables as $table) {
if ($database->tableExists($table)) {
// Individuazione delle colonne per la tabella
$query = 'SHOW COLUMNS FROM `'.$table.'` IN `'.$database_name.'`';
$columns_found = $database->fetchArray($query);
// Organizzazione delle colonne per nome
$columns = [];
foreach ($columns_found as $column) {
$column = array_change_key_case($column);
$name = $column['field'];
unset($column['field']);
$columns[$name] = $column;
}
// Individuazione delle chiavi esterne della tabella
$fk_query = 'SELECT
CONSTRAINT_NAME AS `name`,
COLUMN_NAME AS `column`,
REFERENCED_TABLE_NAME AS `referenced_table`,
REFERENCED_COLUMN_NAME AS `referenced_column`
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_NAME = '.prepare($table).'
AND TABLE_SCHEMA = '.prepare($database_name).'
AND REFERENCED_TABLE_SCHEMA = '.prepare($database_name);
$fks_found = $database->fetchArray($fk_query);
// Organizzazione delle chiavi esterne per nome
$fks = [];
foreach ($fks_found as $fk) {
$fk = array_change_key_case($fk);
$name = $fk['name'];
unset($fk['name']);
$fks[$name] = $fk;
}
$info[$table] = array_merge($columns, [
'foreign_keys' => $fks,
]);
}
}
return $info;
}
/**