| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- <?php
- /**
- * Classe serverLog
- *
- * Cette classe gère les journaux du serveur, y compris l'affichage des logs,
- * la détection des types de logs, et le filtrage des informations sensibles.
- */
- class serverLog {
- /**
- * Affiche un log avec un style approprié en fonction de son contenu.
- *
- * @param string $_log Le message de log à afficher.
- */
- public static function printLog(string $_log){
- if (serverLog::detectLogsAttempts($_log)) {
- self::printLogAttempts($_log);
- } elseif (serverLog::detectApacheLog($_log)) {
- self::printColoredApacheLog($_log );
- } elseif (stripos($_log, 'error') !== false) {
- echo '<div style="color: salmon;">' . $_log . '</div>';
- } elseif (stripos($_log, 'fatal') !== false) {
- echo '<div style="color: #FF5252;">' . $_log . '</div>';
- } elseif (stripos($_log, 'warn') !== false OR stripos($_log, 'alert') !== false) {
- echo '<div style="color: orange;">' . $_log . '</div>';
- } elseif (stripos($_log, 'notice') !== false) {
- echo '<div style="color: white;">' . $_log . '</div>';
- } else {
- echo '<div style="color: grey;">' . $_log . '</div>';
- }
- }
- /**
- * Filtre un log pour masquer les informations sensibles avant de l'afficher.
- *
- * @param string $_log Le message de log à filtrer.
- */
- public static function filtreLog(string $_log){
- $log = self::hidePassword($_log);
- $log = self::hideEmail($log);
- self::printLog($log);
- }
- /**
- * Détecte si une chaîne correspond au format des tentatives de connexion.
- *
- * @param string $str La chaîne à analyser.
- * @return bool Vrai si la chaîne correspond, faux sinon.
- */
- private static function detectLogsAttempts(string $str): bool {
- return preg_match(
- '/^\d{1,3}(\.\d{1,3}){3},\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},/',
- $str
- ) === 1;
- }
- /**
- * Affiche un log formaté pour les tentatives de connexion.
- *
- * @param string $_log Le message de log à afficher.
- */
- public static function printLogAttempts(string $_log){
- $parts = explode(',', $_log, 4);
- if (count($parts) === 4) {
- echo '<div class="notice">'
- . '<span style="color:#4FC3F7;">' . htmlspecialchars($parts[0]) . '</span>, '
- . '<span style="color:#81C784;">' . htmlspecialchars($parts[1]) . '</span>, '
- . '<span style="color:#FFD54F;">' . htmlspecialchars($parts[2]) . '</span>, '
- . '<span style="color:#FF8A65;">' . htmlspecialchars($parts[3]) . '</span>'
- . '</div>';
- return;
- }
- }
- /**
- * Détecte si une chaîne correspond au format des logs Apache.
- *
- * @param string $str La chaîne à analyser.
- * @return bool Vrai si la chaîne correspond, faux sinon.
- */
- private static function detectApacheLog(string $str): bool {
- return preg_match(
- '/^\[(?<date>[A-Za-z]{3} [A-Za-z]{3} \d{2} [\d:.]+ \d{4})\] \[(?<type>[^\]]+)\] \[pid (?<pid>\d+):tid (?<tid>\d+)\] \[client (?<client>[^\]]+)\] (?<msg>.*?)(?:, referer: (?<referer>.+))?$/',
- $str
- ) === 1;
- }
- /**
- * Affiche un log Apache avec des couleurs pour chaque partie.
- *
- * @param string $line La ligne de log Apache à afficher.
- */
- public static function printColoredApacheLog(string $line) {
- $regex = '/^\[(?<date>[A-Za-z]{3} [A-Za-z]{3} \d{2} [\d:.]+ \d{4})\] \[(?<type>[^\]]+)\] \[pid (?<pid>\d+):tid (?<tid>\d+)\] \[client (?<client>[^\]]+)\] (?<msg>.*?)(?:, referer: (?<referer>.+))?$/';
- if (preg_match($regex, $line, $matches)) {
- echo '<div class="notice">'
- . '<span style="color:#4FC3F7;">[' . htmlspecialchars($matches['date']) . ']</span> '
- . '<span style="color:#FFD54F;">[' . htmlspecialchars($matches['type']) . ']</span> '
- . '<span style="color:#BDBDBD;">[pid ' . htmlspecialchars($matches['pid']) . ':tid ' . htmlspecialchars($matches['tid']) . ']</span> '
- . '<span style="color:#81C784;">[client ' . htmlspecialchars($matches['client']) . ']</span> '
- . '<span style="color:#FF8A65;">' . htmlspecialchars($matches['msg']) . '</span>';
- if (!empty($matches['referer'])) {
- echo ' <span style="color:#90CAF9;">referer: ' . htmlspecialchars($matches['referer']) . '</span>';
- }
- echo '</div>';
- } else {
- echo '<div style="color:grey;">' . htmlspecialchars($line) . '</div>';
- }
- }
- /**
- * Vérifie si un log contient le chemin du dossier www.
- *
- * @param string $_log Le message de log à analyser.
- * @return bool Vrai si le chemin est trouvé, faux sinon.
- */
- private static function ifFolderWww(string $_log){
- return (stripos($_log, DOCUMENT_ROOT) !== false) ? TRUE : FALSE;
- }
- /**
- * Vérifie si un log contient le domaine CMS.
- *
- * @param string $_log Le message de log à analyser.
- * @return bool Vrai si le domaine est trouvé, faux sinon.
- */
- private static function ifFolderDomain(string $_log){
- return (stripos($_log, DOMAIN_CMS) !== false) ? TRUE : FALSE;
- }
- /**
- * Vérifie si un log est général (ni dossier www, ni domaine CMS).
- *
- * @param string $_log Le message de log à analyser.
- * @return bool Vrai si le log est général, faux sinon.
- */
- private static function ifGeneral(string $_log){
- return (stripos($_log, "/var/www/") == FALSE AND stripos($_log, "https://") == FALSE) ? TRUE : FALSE;
- }
- /**
- * Masque les mots de passe dans une chaîne de log.
- *
- * @param string $input La chaîne à traiter.
- * @return string La chaîne avec les mots de passe masqués.
- */
- private static function hidePassword($input) {
- return preg_replace("/('password'\s*=>\s*)'[^']*'/", "$1'##PASSWORD##'", $input);
- }
- /**
- * Masque les adresses e-mail dans une chaîne de log.
- *
- * @param string $input La chaîne à traiter.
- * @return string La chaîne avec les adresses e-mail masquées.
- */
- private static function hideEmail($input) {
- return preg_replace("/('email'\s*=>\s*)'[^']*'/", "$1'##EMAIL##'", $input);
- }
- /**
- * Affiche les logs d'un fichier dans la console, avec des options de recherche et de limite.
- *
- * @param string $_logFile Le chemin du fichier de log à lire.
- */
- public static function consoleLog(string $_logFile){
- if (!is_readable($_logFile)) {
- echo "Le fichier n'est pas accessible en lecture.";
- exit();
- }
- $lines = file($_logFile);
- $search = strtolower($_GET['search'] ?? '');
- $limit = strtolower($_GET['limit'] ?? 50); // A défaut les 50 derniers logs
- if ($search) {
- $lines = array_filter($lines, fn($line) => stripos($line, $search) !== false);
- }
- $lines = array_reverse($lines);
- foreach (array_slice($lines, 0, $limit) as $line) {
- serverLog::filtreLog($line);
- }
- }
- }
|