Spaces:
No application file
No application file
| namespace Mautic\ConfigBundle\Model; | |
| use Doctrine\DBAL\Connection; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Helper\PathsHelper; | |
| use Mautic\CoreBundle\Loader\ParameterLoader; | |
| use Mautic\InstallBundle\Configurator\Step\CheckStep; | |
| use Mautic\InstallBundle\Install\InstallService; | |
| use Symfony\Contracts\Translation\TranslatorInterface; | |
| class SysinfoModel | |
| { | |
| /** | |
| * @var string|null | |
| */ | |
| protected $phpInfo; | |
| /** | |
| * @var array<string,bool>|null | |
| */ | |
| protected $folders; | |
| public function __construct( | |
| protected PathsHelper $pathsHelper, | |
| protected CoreParametersHelper $coreParametersHelper, | |
| private TranslatorInterface $translator, | |
| protected Connection $connection, | |
| private InstallService $installService, | |
| private CheckStep $checkStep | |
| ) { | |
| } | |
| /** | |
| * Method to get the PHP info. | |
| * | |
| * @return string | |
| */ | |
| public function getPhpInfo() | |
| { | |
| if (!is_null($this->phpInfo)) { | |
| return $this->phpInfo; | |
| } | |
| if (function_exists('phpinfo') && 'cli' !== php_sapi_name()) { | |
| ob_start(); | |
| $currentTz = date_default_timezone_get(); | |
| date_default_timezone_set('UTC'); | |
| phpinfo(INFO_GENERAL | INFO_CONFIGURATION | INFO_MODULES); | |
| $phpInfo = ob_get_contents(); | |
| ob_end_clean(); | |
| preg_match_all('#<body[^>]*>(.*)</body>#siU', $phpInfo, $output); | |
| $output = preg_replace('#<table[^>]*>#', '<table class="table table-striped">', $output[1][0]); | |
| $output = preg_replace('#(\w),(\w)#', '\1, \2', $output); | |
| $output = preg_replace('#<hr />#', '', $output); | |
| $output = str_replace('<div class="center">', '', $output); | |
| $output = preg_replace('#<tr class="h">(.*)<\/tr>#', '<thead><tr class="h">$1</tr></thead><tbody>', $output); | |
| $output = str_replace('</table>', '</tbody></table>', $output); | |
| $output = str_replace('</div>', '', $output); | |
| $this->phpInfo = $output; | |
| // ensure TZ is set back to default | |
| date_default_timezone_set($currentTz); | |
| } elseif (function_exists('phpversion')) { | |
| $this->phpInfo = $this->translator->trans('mautic.sysinfo.phpinfo.phpversion', ['%phpversion%' => phpversion()]); | |
| } else { | |
| $this->phpInfo = $this->translator->trans('mautic.sysinfo.phpinfo.missing'); | |
| } | |
| return $this->phpInfo; | |
| } | |
| /** | |
| * @return string[] | |
| */ | |
| public function getRecommendations(): array | |
| { | |
| return $this->installService->checkOptionalSettings($this->checkStep); | |
| } | |
| /** | |
| * @return string[] | |
| */ | |
| public function getRequirements(): array | |
| { | |
| return $this->installService->checkRequirements($this->checkStep); | |
| } | |
| /** | |
| * Method to get important folders with a writable flag. | |
| * | |
| * @return array | |
| */ | |
| public function getFolders() | |
| { | |
| if (!is_null($this->folders)) { | |
| return $this->folders; | |
| } | |
| $importantFolders = [ | |
| ParameterLoader::getLocalConfigFile($this->pathsHelper->getSystemPath('root').'/app'), | |
| $this->coreParametersHelper->get('cache_path'), | |
| $this->coreParametersHelper->get('log_path'), | |
| $this->coreParametersHelper->get('upload_dir'), | |
| $this->pathsHelper->getSystemPath('images', true), | |
| $this->pathsHelper->getSystemPath('translations', true), | |
| ]; | |
| foreach ($importantFolders as $folder) { | |
| $folderPath = realpath($folder); | |
| $folderKey = $folderPath ?: $folder; | |
| $isWritable = $folderPath && is_writable($folderPath); | |
| $this->folders[$folderKey] = $isWritable; | |
| } | |
| return $this->folders; | |
| } | |
| /** | |
| * Method to tail (a few last rows) of a file. | |
| * | |
| * @param int $lines | |
| */ | |
| public function getLogTail($lines = 10): ?string | |
| { | |
| $log = $this->coreParametersHelper->get('log_path').'/mautic_'.MAUTIC_ENV.'-'.date('Y-m-d').'.php'; | |
| if (!file_exists($log)) { | |
| return null; | |
| } | |
| return $this->tail($log, $lines); | |
| } | |
| public function getDbInfo(): array | |
| { | |
| return [ | |
| 'version' => $this->connection->executeQuery('SELECT VERSION()')->fetchOne(), | |
| 'driver' => $this->connection->getParams()['driver'], | |
| 'platform' => $this->connection->getDatabasePlatform()::class, | |
| ]; | |
| } | |
| /** | |
| * Method to tail (a few last rows) of a file. | |
| * | |
| * @param int $lines | |
| * @param int $buffer | |
| */ | |
| public function tail($filename, $lines = 10, $buffer = 4096): string | |
| { | |
| $f = fopen($filename, 'rb'); | |
| $output = ''; | |
| fseek($f, -1, SEEK_END); | |
| if ("\n" != fread($f, 1)) { | |
| --$lines; | |
| } | |
| while (ftell($f) > 0 && $lines >= 0) { | |
| $seek = min(ftell($f), $buffer); | |
| fseek($f, -$seek, SEEK_CUR); | |
| $output = ($chunk = fread($f, $seek)).$output; | |
| fseek($f, -mb_strlen($chunk, '8bit'), SEEK_CUR); | |
| $lines -= substr_count($chunk, "\n"); | |
| } | |
| while ($lines++ < 0) { | |
| $output = substr($output, strpos($output, "\n") + 1); | |
| } | |
| fclose($f); | |
| return $output; | |
| } | |
| } | |