. * * @package phpservermon * @author Pepijn Over * @copyright Copyright (c) 2008-2017 Pepijn Over * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 * @version Release: @package_version@ * @link http://www.phpservermonitor.org/ **/ namespace psm\Module\Server\Controller; use psm\Service\Database; /** * Log module. Create the page to view previous log messages */ class LogController extends AbstractServerController { public function __construct(Database $db, \Twig_Environment $twig) { parent::__construct($db, $twig); $this->setActions(array( 'index', 'delete', ), 'index'); } /** * Prepare the template with a list of all log entries */ protected function executeIndex() { $this->twig->addGlobal('subtitle', psm_get_lang('menu', 'server_log')); $tpl_data = array( 'label_status' => psm_get_lang('log', 'status'), 'label_email' => psm_get_lang('log', 'email'), 'label_sms' => psm_get_lang('log', 'sms'), 'label_pushover' => psm_get_lang('log', 'pushover'), 'label_telegram' => psm_get_lang('log', 'telegram'), 'label_jabber' => psm_get_lang('log', 'jabber'), 'label_title' => psm_get_lang('log', 'title'), 'label_server' => psm_get_lang('servers', 'server'), 'label_type' => psm_get_lang('log', 'type'), 'label_message' => psm_get_lang('system', 'message'), 'label_date' => psm_get_lang('system', 'date'), 'label_users' => ucfirst(psm_get_lang('menu', 'user')), 'label_no_logs' => psm_get_lang('log', 'no_logs'), 'tabs' => array(), ); $sidebar = new \psm\Util\Module\Sidebar($this->twig); $this->setSidebar($sidebar); if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) { $modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER); $this->addModal($modal); $modal->setTitle(psm_get_lang('log', 'delete_title')); $modal->setMessage(psm_get_lang('log', 'delete_message')); $modal->setOKButtonLabel(psm_get_lang('system', 'delete')); $sidebar->addButton( 'clear_logn', psm_get_lang('log', 'clear'), psm_build_url(array('mod' => 'server_log', 'action' => 'delete')), 'trash', 'danger show-modal', psm_get_lang('log', 'delete_title'), 'delete' ); } $log_types = array('status', 'email', 'sms', 'pushover', 'telegram', 'jabber'); foreach ($log_types as $key) { $records = $this->getEntries($key); $log_count = count($records); $tab_data = array( 'id' => $key, 'label' => psm_get_lang('log', $key), 'has_users' => ($key == 'status') ? false : true, 'no_logs' => ($log_count == 0) ? true : false, 'tab_active' => ($key == 'status') ? 'active' : '', ); for ($x = 0; $x < $log_count; $x++) { $record = &$records[$x]; $record['users'] = ''; if ($key == 'status') { $record['server'] = $record['label']; $record['type_icon'] = ($record['server_type'] == 'website') ? 'globe-americas' : 'cogs'; $record['type_title'] = psm_get_lang('servers', 'type_' . $record['server_type']); $ip = '(' . $record['ip']; if (!empty($record['port']) && (($record['server_type'] != 'website') || ($record['port'] != 80))) { $ip .= ':' . $record['port']; } $ip .= ')'; $record['ip'] = $ip; } $record['datetime_format'] = psm_date($record['datetime']); // fix up user list $users = $this->getLogUsers($record['log_id']); if (!empty($users)) { $names = array(); foreach ($users as $user) { $names[] = $user['name']; } $record['users'] = implode('
', $names); $record['user_list'] = implode(' • ', $names); } } $tab_data['entries'] = $records; $tpl_data['tabs'][] = $tab_data; } return $this->twig->render('module/server/log.tpl.html', $tpl_data); } protected function executeDelete() { /** * Empty table log and log_users. * Only when user is admin. */ if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) { $archiver = new \psm\Util\Server\Archiver\LogsArchiver($this->db); $archiver->cleanupall(); } return $this->runAction('index'); } /** * Get all the log entries for a specific $type * * @param string $type status/email/sms * @return \PDOStatement array */ public function getEntries($type) { $sql_join = ''; if ($this->getUser()->getUserLevel() > PSM_USER_ADMIN) { // restrict by user_id $sql_join = "JOIN `" . PSM_DB_PREFIX . "users_servers` AS `us` ON ( `us`.`user_id`={$this->getUser()->getUserId()} AND `us`.`server_id`=`servers`.`server_id` )"; } $entries = $this->db->query( 'SELECT ' . '`servers`.`label`, ' . '`servers`.`ip`, ' . '`servers`.`port`, ' . '`servers`.`type` AS server_type, ' . '`log`.`log_id`, ' . '`log`.`type`, ' . '`log`.`message`, ' . '`log`.`datetime` ' . 'FROM `' . PSM_DB_PREFIX . 'log` AS `log` ' . 'JOIN `' . PSM_DB_PREFIX . 'servers` AS `servers` ON (`servers`.`server_id`=`log`.`server_id`) ' . $sql_join . 'WHERE `log`.`type`=\'' . $type . '\' ' . 'ORDER BY `datetime` DESC ' . 'LIMIT 0,20' ); return $entries; } /** * Get all the user entries for a specific $log_id * * @param $log_id * @return \PDOStatement array */ protected function getLogUsers($log_id) { return $this->db->query( "SELECT u.`user_id`, u.`name` FROM `" . PSM_DB_PREFIX . "log_users` AS lu LEFT JOIN `" . PSM_DB_PREFIX . "users` AS u ON lu.`user_id` = u.`user_id` WHERE lu.`log_id` = " . (int) $log_id . " ORDER BY u.`name` ASC" ); } }