Piwik\Filechecks::getFileIntegrityInformation PHP Method

getFileIntegrityInformation() public static method

Get file integrity information (in PIWIK_INCLUDE_PATH).
public static getFileIntegrityInformation ( ) : array(bool,
return array(bool,
    public static function getFileIntegrityInformation()
    {
        $messages = array();
        $messages[] = true;
        $manifest = PIWIK_INCLUDE_PATH . '/config/manifest.inc.php';
        if (file_exists($manifest)) {
            require_once $manifest;
        }
        if (!class_exists('Piwik\\Manifest')) {
            $messages[] = Piwik::translate('General_WarningFileIntegrityNoManifest') . ' ' . Piwik::translate('General_WarningFileIntegrityNoManifestDeployingFromGit');
            return $messages;
        }
        $files = \Piwik\Manifest::$files;
        $hasMd5file = function_exists('md5_file');
        $hasMd5 = function_exists('md5');
        foreach ($files as $path => $props) {
            $file = PIWIK_INCLUDE_PATH . '/' . $path;
            if (!file_exists($file) || !is_readable($file)) {
                $messages[] = Piwik::translate('General_ExceptionMissingFile', $file);
            } elseif (filesize($file) != $props[0]) {
                if (self::isModifiedPathValid($path)) {
                    continue;
                }
                if (!$hasMd5 || in_array(substr($path, -4), array('.gif', '.ico', '.jpg', '.png', '.swf'))) {
                    // files that contain binary data (e.g., images) must match the file size
                    $messages[] = Piwik::translate('General_ExceptionFilesizeMismatch', array($file, $props[0], filesize($file)));
                } else {
                    // convert end-of-line characters and re-test text files
                    $content = @file_get_contents($file);
                    $content = str_replace("\r\n", "\n", $content);
                    if (strlen($content) != $props[0] || @md5($content) !== $props[1]) {
                        $messages[] = Piwik::translate('General_ExceptionFilesizeMismatch', array($file, $props[0], filesize($file)));
                    }
                }
            } elseif ($hasMd5file && @md5_file($file) !== $props[1]) {
                if (self::isModifiedPathValid($path)) {
                    continue;
                }
                $messages[] = Piwik::translate('General_ExceptionFileIntegrity', $file);
            }
        }
        if (count($messages) > 1) {
            $messages[0] = false;
        }
        if (!$hasMd5file) {
            $messages[] = Piwik::translate('General_WarningFileIntegrityNoMd5file');
        }
        return $messages;
    }

Usage Example

 public function execute()
 {
     $label = $this->translator->translate('Installation_SystemCheckFileIntegrity');
     $messages = Filechecks::getFileIntegrityInformation();
     $ok = array_shift($messages);
     if (empty($messages)) {
         return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK));
     }
     if ($ok) {
         $status = DiagnosticResult::STATUS_WARNING;
         return array(DiagnosticResult::singleResult($label, $status, $messages[0]));
     }
     $comment = $this->translator->translate('General_FileIntegrityWarningExplanation');
     // Keep only the 20 first lines else it becomes unmanageable
     if (count($messages) > 20) {
         $messages = array_slice($messages, 0, 20);
         $messages[] = '...';
     }
     $comment .= '<br/><br/><pre style="overflow-x: scroll;max-width: 600px;">' . implode("\n", $messages) . '</pre>';
     return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment));
 }
All Usage Examples Of Piwik\Filechecks::getFileIntegrityInformation