. * */ namespace SP\Log; use SP\Config\Config; use SP\Core\Init; use SP\Storage\DB; use SP\Core\Session; use SP\Storage\QueryData; use SP\Util\Checks; use SP\Util\Util; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); /** * Esta clase es la encargada de manejar el registro de eventos */ class Log extends ActionLog { /** * @var int */ public static $numRows = 0; /** * Obtener los eventos guardados. * * @param int $start con el número de registro desde el que empezar * @return false|array con el resultado de la consulta */ public static function getEvents($start) { $query = 'SELECT ' . 'log_id,' . 'FROM_UNIXTIME(log_date) AS log_date,' . 'log_action,' . 'log_level,' . 'log_login,' . 'log_ipAddress,' . 'log_description ' . 'FROM log ' . 'ORDER BY log_id DESC ' . 'LIMIT :start, 50'; $Data = new QueryData(); $Data->setQuery($query); $Data->addParam($start, 'start'); // Obtenemos el número total de registros DB::setFullRowCount(); // Devolver un array siempre DB::setReturnArray(); $queryRes = DB::getResults($Data); if ($queryRes === false) { return false; } self::$numRows = DB::$lastNumRows; return $queryRes; } /** * Limpiar el registro de eventos. * * @return bool con el resultado */ public static function clearEvents() { $query = 'TRUNCATE TABLE log'; $Data = new QueryData(); $Data->setQuery($query); if (DB::getQuery($Data) === false) { return false; } self::writeNewLogAndEmail(_('Vaciar Eventos'), _('Vaciar registro de eventos'), null); return true; } /** * Obtener una nueva instancia de la clase inicializada * * @param string $action La acción realizada * @param string $description La descripción de la acción realizada * @param string $level * @return Log */ public static function writeNewLogAndEmail($action, $description = null, $level = Log::INFO) { $Log = new Log($action, $description, $level); $Log->writeLog(); Email::sendEmail($Log); return $Log; } /** * Escribir un nuevo evento en el registro de eventos * * @param bool $resetDescription Restablecer la descripción * @return bool */ public function writeLog($resetDescription = false) { if ((defined('IS_INSTALLER') && IS_INSTALLER === 1) || Init::$DB_STATUS === 0 ) { error_log('Action: ' . $this->getAction() . ' -- Description: ' . $this->getDescription() . ' -- Details: ' . $this->getDetails()); return false; } if (!Checks::logIsEnabled()) { return false; } if (Checks::syslogIsEnabled()) { $this->sendToSyslog(); } $description = trim($this->getDescription() . PHP_EOL . $this->getDetails()); $query = 'INSERT INTO log SET ' . 'log_date = UNIX_TIMESTAMP(),' . 'log_login = :login,' . 'log_userId = :userId,' . 'log_ipAddress = :ipAddress,' . 'log_action = :action,' . 'log_level = :level,' . 'log_description = :description'; $Data = new QueryData(); $Data->setQuery($query); $Data->addParam(Session::getUserLogin(), 'login'); $Data->addParam(Session::getUserId(), 'userId'); $Data->addParam($_SERVER['REMOTE_ADDR'], 'ipAddress'); $Data->addParam($this->getAction(), 'action'); $Data->addParam($this->getLogLevel(), 'level'); $Data->addParam($description, 'description'); if ($resetDescription === true) { $this->resetDescription(); } return DB::getQuery($Data); } /** * Enviar mensaje al syslog */ private function sendToSyslog() { $description = trim($this->getDescription() . PHP_EOL . $this->getDetails()); $msg = 'CEF:0|sysPass|logger|' . implode('.', Util::getVersion(true)) . '|'; $msg .= $this->getAction() . '|'; $msg .= $description . '|'; $msg .= '0|'; $msg .= sprintf('ip_addr="%s" user_name="%s"', $_SERVER['REMOTE_ADDR'], Session::getUserLogin()); $Syslog = new Syslog(); $Syslog->setIsRemote(Checks::remoteSyslogIsEnabled()); $Syslog->info($msg); } /** * Obtener una nueva instancia de la clase inicializada * * @param string $action La acción realizada * @param string $description La descripción de la acción realizada * @param string $level * @return Log */ public static function newLog($action, $description = null, $level = Log::INFO) { return new Log($action, $description, $level); } /** * Escribir un nuevo evento en el registro de eventos * * @param string $action La acción realizada * @param string $description La descripción de la acción realizada * @param string $level * @return Log */ public static function writeNewLog($action, $description = null, $level = Log::INFO) { $Log = new Log($action, $description, $level); $Log->writeLog(); return $Log; } }