openstamanager/include/init/requirements.php

501 lines
16 KiB
PHP
Raw Normal View History

2018-06-27 14:25:19 +02:00
<?php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
2021-01-20 15:08:51 +01:00
* Copyright (C) DevCode s.r.l.
2020-09-07 15:04:06 +02:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
2018-06-27 14:25:19 +02:00
// Apache
$modules = [
2018-09-17 18:11:39 +02:00
'mod_rewrite' => [
'server' => 'HTTP_MOD_REWRITE',
'description' => tr('Fornisce un sistema di riscrittura URL basato su regole predefinite'),
],
2023-12-20 13:03:44 +01:00
'mod_mime' => [
'server' => 'text/javascript mjs',
'description' => tr('Consente di associare i tipi di file ai tipi di contenuto corretti.'),
],
2018-06-27 14:25:19 +02:00
];
$sapi_name = php_sapi_name();
2024-02-22 17:12:35 +01:00
$php_interface = '';
switch (true) {
case strpos($sapi_name, 'apache') !== false:
//PHP è in esecuzione come modulo Apache (4)
$php_interface = 'apache';
break;
case strpos($sapi_name, 'fpm-fcgi') !== false:
//PHP è in esecuzione come PHP-FPM FastCGI (3)
$php_interface = 'fpm-fcgi';
break;
case strpos($sapi_name, 'fpm') !== false:
//PHP è in esecuzione come PHP-FPM (9)
$php_interface = 'fpm';
break;
case strpos($sapi_name, 'cgi-fcgi') !== false:
//PHP è in esecuzione come FastCGI (8)
$php_interface = 'cgi-fcgi';
break;
case strpos($sapi_name, 'cgi') !== false:
//PHP è in esecuzione come modulo CGI (2)
$php_interface = 'cgi';
break;
case strpos($sapi_name, 'cli') !== false:
//PHP è in esecuzione dalla riga di comando (command line interface) (1)
$php_interface = 'cli';
break;
case strpos($sapi_name, 'embed') !== false:
//PHP è incorporato in un'applicazione (5)
$php_interface = 'embed';
break;
case strpos($sapi_name, 'litespeed') !== false:
//PHP è in esecuzione come modulo LiteSpeed (6)
$php_interface = 'litespeed';
break;
case strpos($sapi_name, 'isapi') !== false:
//PHP è in esecuzione come modulo ISAPI in IIS (7)
$php_interface = 'isapi';
break;
default:
//Non è possibile determinare il tipo di interfaccia di PHP (0)
$php_interface = 'n.d.';
}
2018-09-17 18:11:39 +02:00
if (function_exists('apache_get_modules')) {
2018-09-14 11:13:38 +02:00
$available_modules = apache_get_modules();
}
2018-06-27 14:25:19 +02:00
$apache = [];
2018-09-17 18:11:39 +02:00
foreach ($modules as $name => $values) {
$description = $values['description'];
2024-02-22 17:03:37 +01:00
2018-09-17 18:11:39 +02:00
$status = isset($available_modules) ? in_array($name, $available_modules) : $_SERVER[$values['server']] == 'On';
2018-06-27 14:25:19 +02:00
2024-02-22 17:03:37 +01:00
if ($name == 'mod_mime' && $php_interface != 'apache') {
$headers = get_headers((!empty($config['redirectHTTPS']) && !isHTTPS(true)) ? 'https://' : 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], 1);
if (isset($headers['Content-Type'])) {
$status = 1;
2024-02-22 17:03:37 +01:00
} else {
$status = 0;
}
}
2018-06-27 14:25:19 +02:00
$apache[] = [
'name' => $name,
'description' => $description,
'status' => $status,
'type' => tr('Modulo'),
];
}
2024-01-15 15:30:45 +01:00
// PHP
2018-06-27 14:25:19 +02:00
$settings = [
2022-02-07 13:36:31 +01:00
'php_version' => [
'type' => 'version',
2022-08-10 14:41:09 +02:00
'description' => '7.3.x - 8.0.x, consigliato almeno 7.4.x',
'minimum' => '7.3.0',
'maximum' => '8.0.99',
2022-02-07 13:36:31 +01:00
],
2018-06-27 14:25:19 +02:00
'zip' => [
'type' => 'ext',
'description' => tr('Permette di leggere e scrivere gli archivi compressi ZIP e i file al loro interno'),
],
'mbstring' => [
'type' => 'ext',
'description' => tr('Permette di gestire i caratteri dello standard UTF-8'),
],
2018-06-27 14:25:19 +02:00
'pdo_mysql' => [
'type' => 'ext',
'description' => tr('Permette di effettuare la connessione al database MySQL'),
],
2018-12-14 12:58:40 +01:00
'dom' => [
'type' => 'ext',
'description' => tr('Permette la gestione dei file standard per la Fatturazione Elettronica'),
],
'xsl' => [
'type' => 'ext',
'description' => tr('Permette di visualizzazione grafica della Fattura Elettronica'),
],
2018-06-27 14:25:19 +02:00
'openssl' => [
'type' => 'ext',
2018-12-14 12:58:40 +01:00
'description' => tr("Permette l'utilizzo di funzioni crittografiche simmetriche e asimmetriche"),
2018-06-27 14:25:19 +02:00
],
'intl' => [
'type' => 'ext',
2018-12-14 12:58:40 +01:00
'description' => tr("Permette l'automazione della conversione dei numeri"),
2018-06-27 14:25:19 +02:00
],
2018-12-14 12:58:40 +01:00
'curl' => [
2018-10-02 18:21:27 +02:00
'type' => 'ext',
2018-12-14 12:58:40 +01:00
'description' => tr('Permette la comunicazione con servizi esterni'),
2018-10-02 18:21:27 +02:00
],
2018-06-27 14:25:19 +02:00
'soap' => [
'type' => 'ext',
'description' => tr('Permette la comunicazione con servizi esterni, quali il database europeo delle Partite IVA (facoltativo)'),
],
2020-10-28 17:35:52 +01:00
'gd' => [
'type' => 'ext',
'description' => tr('Permette la creazione dell\'immagine della firma per il rapportino d\'intervento (facoltativo)'),
],
2022-10-06 10:41:35 +02:00
'fileinfo' => [
'type' => 'ext',
'description' => tr('Permette la creazione dell\'immagine della firma per il rapportino d\'intervento (facoltativo)'),
],
2018-06-27 14:25:19 +02:00
2024-01-15 15:30:45 +01:00
// 'display_errors' => [
2018-10-02 18:21:27 +02:00
// 'type' => 'value',
// 'description' => true,
2024-01-15 15:30:45 +01:00
// ],
'allow_url_fopen' => [
'type' => 'value',
'description' => 1,
],
2023-08-04 14:54:28 +02:00
2018-06-27 14:25:19 +02:00
'upload_max_filesize' => [
'type' => 'value',
2019-05-24 21:49:15 +02:00
'description' => '>32M',
2018-06-27 14:25:19 +02:00
],
2018-06-27 14:25:19 +02:00
'post_max_size' => [
'type' => 'value',
2019-05-24 21:49:15 +02:00
'description' => '>32M',
2018-06-27 14:25:19 +02:00
],
2022-02-07 13:36:31 +01:00
'max_input_vars' => [
'type' => 'value',
'description' => '>5000',
],
'exec' => [
'type' => 'function',
'description' => tr('Permette di importare file con estensione .p7m'),
],
2018-06-27 14:25:19 +02:00
];
$php = [];
foreach ($settings as $name => $values) {
$description = $values['description'];
if ($values['type'] == 'version') {
2022-02-07 13:36:31 +01:00
$description = tr('Valore consigliato: _VALUE_ (Valore attuale: _PHP_VERSION_)', [
'_VALUE_' => $description,
'_PHP_VERSION_' => phpversion(),
]);
2023-08-04 14:54:28 +02:00
$status = ((version_compare(phpversion(), $values['minimum'], '>=') && version_compare(phpversion(), $values['maximum'], '<=')) ? 1 : 0);
2022-02-07 13:36:31 +01:00
} elseif ($values['type'] == 'ext') {
2018-06-27 14:25:19 +02:00
$status = extension_loaded($name);
} elseif ($values['type'] == 'function') {
2024-01-10 15:08:26 +01:00
$status = ((function_exists($name) && is_callable($name)) ? 1 : 0);
2018-06-27 14:25:19 +02:00
} else {
$ini = str_replace(['k', 'M'], ['000', '000000'], ini_get($name));
$real = str_replace(['k', 'M'], ['000', '000000'], $description);
if (string_starts_with($real, '>')) {
2018-06-27 14:25:19 +02:00
$status = $ini >= substr($real, 1);
} elseif (string_starts_with($real, '<')) {
2018-06-27 14:25:19 +02:00
$status = $ini <= substr($real, 1);
} else {
$status = ($real == $ini);
}
if (is_bool($description)) {
$description = !empty($description) ? 'On' : 'Off';
} else {
$description = str_replace(['>', '<'], '', $description);
}
2018-10-30 22:19:15 +01:00
$description = tr('Valore consigliato: _VALUE_ (Valore attuale: _INI_)', [
2018-06-27 14:25:19 +02:00
'_VALUE_' => $description,
2018-10-30 22:19:15 +01:00
'_INI_' => ini_get($name),
2018-06-27 14:25:19 +02:00
]);
}
2023-08-04 14:54:28 +02:00
if ($values['type'] == 'ext') {
$type = tr('Estensione');
} elseif ($values['type'] == 'version') {
$type = tr('Versione');
} elseif ($values['type'] == 'function') {
$type = tr('Funzione');
2024-01-10 15:08:26 +01:00
} else {
2023-08-04 14:54:28 +02:00
$type = tr('Impostazione');
}
2018-06-27 14:25:19 +02:00
$php[] = [
'name' => $name,
'description' => $description,
'status' => $status,
'type' => $type,
];
}
// MySQL
2023-08-04 14:54:28 +02:00
if ($database->isInstalled()) {
2022-03-10 17:29:24 +01:00
$db = [
'mysql_version' => [
'type' => 'version',
'warning' => (($database->isMySQL())? false : true),
'description' => (($database->isMySQL())? '5.7.x - 8.0.x' : '10.x'),
'minimum' => (($database->isMySQL())? '5.7.0' : '10.1.0'),
'maximum' => (($database->isMySQL())? '8.0.99' : '10.6.99'),
2022-03-10 17:29:24 +01:00
],
2023-08-04 14:54:28 +02:00
'sort_buffer_size' => [
'type' => 'value',
2022-12-08 00:11:55 +01:00
'description' => '>2M',
],
2022-03-10 17:29:24 +01:00
];
/*foreach (App::getConfig()['db_options'] as $n => $v){
2023-08-04 14:54:28 +02:00
switch ($n){
case 'sort_buffer_size':
$db[$n] = [
'type' => 'value',
2022-12-08 00:11:55 +01:00
'description' => '>2M',
];
break;
}
2023-08-04 14:54:28 +02:00
}*/
2022-03-10 17:29:24 +01:00
}
foreach ($db as $name => $values) {
$description = $values['description'];
if ($values['type'] == 'version') {
2023-08-04 14:54:28 +02:00
$type = tr('Versione');
$description = tr('Valore consigliato: _VALUE_ (Valore attuale: _MYSQL_VERSION_)', [
'_VALUE_' => $description,
'_MYSQL_VERSION_' => $database->getMySQLVersion(),
]);
2023-08-04 14:54:28 +02:00
$status = ((version_compare($database->getMySQLVersion(), $values['minimum'], '>=') && version_compare($database->getMySQLVersion(), $values['maximum'], '<=')) ? 1 : 0);
if($values['warning'] && $status == 1){
$status = 0;
$description .= '. <i class="fa fa-exclamation-triangle text-danger" ></i><b> '.tr('Al momento MariaDB _MYSQL_VERSION_ non è completamente supportato, si consiglia di passare a MySQL.', ['_MYSQL_VERSION_'=>$database->getMySQLVersion()]).'</b>';
}
2023-08-04 14:54:28 +02:00
} else {
$type = tr('Impostazione');
2024-01-15 15:30:45 +01:00
// Vedo se riesco a recuperare l'impostazione dalle variabili di sessione o globali di mysql
$rs_session_variabile = $dbo->fetchArray('SHOW SESSION VARIABLES LIKE '.prepare($name));
$rs_global_variabile = $dbo->fetchArray('SHOW GLOBAL VARIABLES LIKE '.prepare($name));
2023-08-04 14:54:28 +02:00
if (!empty($rs_session_variabile[0]['Value'])) {
2022-12-08 00:11:55 +01:00
$inc = $rs_session_variabile[0]['Value'];
2023-08-04 14:54:28 +02:00
} elseif (!empty($rs_global_variabile[0]['Value'])) {
2022-12-08 00:11:55 +01:00
$inc = $rs_global_variabile[0]['Value'];
2023-08-04 14:54:28 +02:00
} else {
$inc = str_replace(['k', 'M'], ['000', '000000'], App::getConfig()['db_options'][$name]);
2023-08-04 14:54:28 +02:00
}
$real = str_replace(['k', 'M'], ['000', '000000'], $description);
if (string_starts_with($real, '>')) {
$status = $inc >= substr($real, 1);
} elseif (string_starts_with($real, '<')) {
$status = $inc <= substr($real, 1);
} else {
$status = ($real == $inc);
}
if (is_bool($description)) {
$description = !empty($description) ? 'On' : 'Off';
} else {
$description = str_replace(['>', '<'], '', $description);
}
$description = tr('Valore consigliato: _VALUE_ (Valore attuale: _INC_)', [
'_VALUE_' => $description,
2024-01-15 15:30:45 +01:00
'_INC_' => Util\FileSystem::formatBytes($inc),
]);
}
$mysql[] = [
'name' => $name,
'description' => $description,
'status' => $status,
'type' => $type,
];
}
2018-06-27 14:25:19 +02:00
// Percorsi di servizio
$dirs_to_check = [
$backup_dir => tr('Necessario per il salvataggio dei backup'),
2018-06-27 14:25:19 +02:00
'files' => tr('Necessario per il salvataggio di file inseriti dagli utenti'),
2022-11-08 18:28:52 +01:00
'files/temp' => tr('Necessario per la generazione delle stampe'),
2018-06-27 14:25:19 +02:00
'logs' => tr('Necessario per la gestione dei file di log'),
];
$directories = [];
foreach ($dirs_to_check as $name => $description) {
2024-01-04 14:47:06 +01:00
if ($name == $backup_dir) {
$status = is_writable($name);
2024-01-04 14:47:06 +01:00
} else {
$status = is_writable(base_dir().DIRECTORY_SEPARATOR.$name);
}
2018-06-27 14:25:19 +02:00
$directories[] = [
'name' => $name,
'description' => $description,
'status' => $status,
'type' => tr('Cartella'),
];
}
// File di servizio
$files_to_check = [
'manifest.json' => tr('Necessario per l\'aggiunta a schermata home da terminale (creato al termine della configurazione)'),
'mariadb_10_x.json' => tr('Necessario per il controllo integrità con database MariaDB 10.x'),
'mysql_5_7.json' => tr('Necessario per il controllo integrità con database MySQL 5.7.x'),
'mysql.json' => tr('Necessario per il controllo integrità con database MySQL 8.0.x'),
'checksum.json' => tr('Necessario per il controllo integrità dei files del gestionale'),
'settings.json' => tr('Necessario per il controllo delle impostazioni del gestionale'),
];
$files = [];
foreach ($files_to_check as $name => $description) {
2024-01-19 18:04:08 +01:00
$status = is_readable(base_dir().DIRECTORY_SEPARATOR.$name);
$files[] = [
'name' => $name,
'description' => $description,
'status' => $status,
'type' => tr('File'),
];
}
// Configurazioni OSM
$config_to_check = [
'lang' => [
'type' => 'value',
'operator' => 'strcmp',
'value_to_check' => '|lang|',
'suggested_value' => 'it_IT',
'section' => '',
],
'timestamp' => [
'type' => 'value',
'operator' => 'strcmp',
'value_to_check' => '|timestamp|',
'suggested_value' => 'd/m/Y H:i',
'section' => 'formatter',
],
'date' => [
'type' => 'value',
'operator' => 'strcmp',
'value_to_check' => '|date|',
'suggested_value' => 'd/m/Y',
'section' => 'formatter',
],
'time' => [
'type' => 'value',
'operator' => 'strcmp',
'value_to_check' => '|time|',
'suggested_value' => 'H:i',
'section' => 'formatter',
2023-08-04 14:54:28 +02:00
],
];
$config = [];
2023-08-04 14:54:28 +02:00
foreach ($config_to_check as $name => $values) {
$type = $values['type'];
if ($type == 'value') {
$description = tr('Valore consigliato: _SUGGESTED_ (Valore attuale: _ACTUAL_)', [
'_SUGGESTED_' => $values['suggested_value'],
2023-08-04 14:54:28 +02:00
'_ACTUAL_' => (!empty($values['section']) ? ${$values['section']}[$name] : $$name),
]);
}
2024-01-15 15:30:45 +01:00
$status = ($values['operator'](!empty($values['section']) ? ${$values['section']}[$name] : $$name, $values['value_to_check']) ? 1 : 0);
2023-08-04 14:54:28 +02:00
$config[] = [
'name' => $name,
'description' => $description,
'status' => $status,
'type' => tr('Configurazione'),
];
}
2018-06-27 14:25:19 +02:00
$requirements = [
tr('Apache (_INTERFACE_)', [
'_INTERFACE_' => $php_interface,
]) => $apache,
2022-02-07 13:36:31 +01:00
tr('PHP (_VERSION_ _SUPPORTED_)', [
2018-06-27 14:25:19 +02:00
'_VERSION_' => phpversion(),
2023-08-04 14:54:28 +02:00
'_SUPPORTED_' => ((version_compare(phpversion(), $settings['php_version']['minimum'], '>=') && version_compare(phpversion(), $settings['php_version']['maximum'], '<=')) ? '' : '<small><small class="label label-danger" ><i class="fa fa-warning"></i> '.tr('versioni supportate:').' '.$settings['php_version']['description'].'</small></small>'),
2018-06-27 14:25:19 +02:00
]) => $php,
tr('DBMS (_TYPE_)', [
'_TYPE_' => $database->getType(),
] ) => $mysql,
2018-06-27 14:25:19 +02:00
tr('Percorsi di servizio') => $directories,
tr('File di servizio') => $files,
tr('Configurazioni') => $config,
2018-06-27 14:25:19 +02:00
];
2023-08-04 14:54:28 +02:00
if (!$database->isInstalled() || empty($mysql)) {
2022-03-10 17:29:24 +01:00
unset($requirements['MySQL']);
}
2018-06-27 14:25:19 +02:00
// Tabelle di riepilogo
foreach ($requirements as $key => $values) {
$statuses = array_column($values, 'status');
$general_status = true;
foreach ($statuses as $status) {
$general_status &= $status;
}
echo '
<div class="box box-'.($general_status ? 'success collapsed-box' : 'danger').'">
<div class="box-header with-border">
<h3 class="box-title">'.$key.'</h3>';
if ($general_status) {
echo '
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-plus"></i>
</button>
</div>';
}
echo '
</div>
<div class="box-body no-padding">
<table class="table">';
foreach ($values as $value) {
echo '
<tr class="'.($value['status'] ? 'success' : 'danger').'">
<td style="width: 10px"><i class="fa fa-'.($value['status'] ? 'check' : 'times').'"></i></td>
<td style="width: 120px" >'.$value['type'].'</td>
<td style="width: 300px" >'.$value['name'].'</td>
2018-06-27 14:25:19 +02:00
<td>'.$value['description'].'</td>
</tr>';
}
echo '
</table>
</div>
</div>';
}