diff --git a/src/includes/functions.inc.php b/src/includes/functions.inc.php index d32900cc..7b6e4345 100644 --- a/src/includes/functions.inc.php +++ b/src/includes/functions.inc.php @@ -221,22 +221,42 @@ function psm_update_conf($key, $value) { * everything should have been handled when calling this function * * @param string $server_id + * @param string $type * @param string $message + * + * @return int log_id */ -function psm_add_log($server_id, $type, $message, $user_id = null) { +function psm_add_log($server_id, $type, $message) { global $db; - $db->save( + return $db->save( PSM_DB_PREFIX.'log', array( 'server_id' => $server_id, 'type' => $type, 'message' => $message, - 'user_id' => ($user_id === null) ? '' : $user_id, ) ); } +/** + * This function just adds a user to the log_users table. + * + * @param $log_id + * @param $user_id + */ +function psm_add_log_user($log_id, $user_id) { + global $db; + + $db->save( + PSM_DB_PREFIX . 'log_users', + array( + 'log_id' => $log_id, + 'user_id' => $user_id, + ) + ); +} + /** * This function adds the result of a check to the uptime table for logging purposes. * diff --git a/src/psm/Module/Server/Controller/LogController.php b/src/psm/Module/Server/Controller/LogController.php index 951df2ba..ec1d3a36 100644 --- a/src/psm/Module/Server/Controller/LogController.php +++ b/src/psm/Module/Server/Controller/LogController.php @@ -60,14 +60,6 @@ class LogController extends AbstractServerController { ); $log_types = array('status', 'email', 'sms', 'pushover'); - // get users - $users = $this->db->select(PSM_DB_PREFIX.'users', null, array('user_id','name')); - - $users_labels = array(); - foreach ($users as $user) { - $users_labels[$user['user_id']] = $user['name']; - } - foreach($log_types as $key) { $records = $this->getEntries($key); $log_count = count($records); @@ -95,15 +87,12 @@ class LogController extends AbstractServerController { $record['datetime_format'] = psm_date($record['datetime']); // fix up user list - if(!empty($record['user_id'])) { + $users = $this->getLogUsers($record['log_id']); + if(!empty($users)) { $names = array(); - $users = explode(',', $record['user_id']); - foreach($users as $user_id) { - if(isset($users_labels[$user_id])) { - $names[] = $users_labels[$user_id]; - } + foreach($users as $user) { + $names[] = $user['name']; } - sort($names); $record['users'] = implode('
', $names); $record['user_list'] = implode(' • ', $names); } @@ -135,10 +124,10 @@ class LogController extends AbstractServerController { '`servers`.`ip`, '. '`servers`.`port`, '. '`servers`.`type` AS server_type, '. + '`log`.`log_id`, '. '`log`.`type`, '. '`log`.`message`, '. - '`log`.`datetime`, '. - '`log`.`user_id` '. + '`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 . @@ -148,4 +137,22 @@ class LogController extends AbstractServerController { ); return $entries; } + + /** + * Get all the user entries for a specific $log_id + * + * @param $log_id + * @return 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" + ); + } } diff --git a/src/psm/Util/Install/Installer.php b/src/psm/Util/Install/Installer.php index 41683aef..6c3ee490 100644 --- a/src/psm/Util/Install/Installer.php +++ b/src/psm/Util/Install/Installer.php @@ -206,9 +206,13 @@ class Installer { `type` enum('status','email','sms','pushover') NOT NULL, `message` varchar(255) NOT NULL, `datetime` timestamp NOT NULL default CURRENT_TIMESTAMP, - `user_id` varchar(255) NOT NULL, PRIMARY KEY (`log_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + PSM_DB_PREFIX . 'log_users' => "CREATE TABLE `" . PSM_DB_PREFIX . "log_users` ( + `log_id` int(11) UNSIGNED NOT NULL , + `user_id` int(11) UNSIGNED NOT NULL , + PRIMARY KEY (`log_id`, `user_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", PSM_DB_PREFIX . 'servers' => "CREATE TABLE `" . PSM_DB_PREFIX . "servers` ( `server_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `ip` varchar(500) NOT NULL, @@ -440,5 +444,29 @@ class Installer { $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `website_username` varchar(255) NULL, ADD `website_password` varchar(255) NULL AFTER `website_username`;"; $this->execSQL($queries); + + // Create log_users table + $this->execSQL("CREATE TABLE `" . PSM_DB_PREFIX . "log_users` ( + `log_id` int(11) UNSIGNED NOT NULL , + `user_id` int(11) UNSIGNED NOT NULL , + PRIMARY KEY (`log_id`, `user_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"); + + // Migrate the data + $logs = $this->db->select(PSM_DB_PREFIX . 'log', null, array('log_id', 'user_id')); + foreach ($logs as $log) { + // Validation + if (empty($log['user_id']) || trim($log['user_id']) == '') { + continue; + } + + // Insert into new table + foreach (explode(',', $log['user_id']) as $user_id) { + psm_add_log_user($log['log_id'], $user_id); + } + } + + // Drop old user_id('s) column + $this->execSQL("ALTER TABLE `" . PSM_DB_PREFIX . "log` DROP COLUMN `user_id`;"); } } diff --git a/src/psm/Util/Server/Updater/StatusNotifier.php b/src/psm/Util/Server/Updater/StatusNotifier.php index a87f5547..0edfde98 100644 --- a/src/psm/Util/Server/Updater/StatusNotifier.php +++ b/src/psm/Util/Server/Updater/StatusNotifier.php @@ -198,8 +198,6 @@ class StatusNotifier { * @return boolean */ protected function notifyByEmail($users) { - $userlist = array(); - // build mail object with some default values $mail = psm_build_mail(); $mail->Subject = utf8_decode(psm_parse_msg($this->status_new, 'email_subject', $this->server)); @@ -209,19 +207,21 @@ class StatusNotifier { $mail->Body = utf8_decode($body); $mail->AltBody = str_replace('
', "\n", $body); + if(psm_get_conf('log_email')) { + $log_id = psm_add_log($this->server_id, 'email', $body); + } + // go through empl foreach ($users as $user) { + if(!empty($log_id)) { + psm_add_log_user($log_id, $user['user_id']); + } + // we sent a seperate email to every single user. - $userlist[] = $user['user_id']; $mail->AddAddress($user['email'], $user['name']); $mail->Send(); $mail->ClearAddresses(); } - - if(psm_get_conf('log_email')) { - // save to log - psm_add_log($this->server_id, 'email', $body, implode(',', $userlist)); - } } /** @@ -231,38 +231,51 @@ class StatusNotifier { * @return boolean */ protected function notifyByPushover($users) { - $userlist = array(); - $pushover = psm_build_pushover(); + // Remove users that have no pushover_key + foreach($users as $k => $user) { + if (trim($user['pushover_key']) == '') { + unset($users[$k]); + } + } - if($this->status_new === true) { - $pushover->setPriority(0); - } else { - $pushover->setPriority(2); - $pushover->setRetry(300); //Used with Priority = 2; Pushover will resend the notification every 60 seconds until the user accepts. - $pushover->setExpire(3600); //Used with Priority = 2; Pushover will resend the notification every 60 seconds for 3600 seconds. After that point, it stops sending notifications. - } - $message = psm_parse_msg($this->status_new, 'pushover_message', $this->server); + // Validation + if (empty($users)) { + return; + } + // Pushover + $message = psm_parse_msg($this->status_new, 'pushover_message', $this->server); + $pushover = psm_build_pushover(); + if($this->status_new === true) { + $pushover->setPriority(0); + } else { + $pushover->setPriority(2); + $pushover->setRetry(300); //Used with Priority = 2; Pushover will resend the notification every 60 seconds until the user accepts. + $pushover->setExpire(3600); //Used with Priority = 2; Pushover will resend the notification every 60 seconds for 3600 seconds. After that point, it stops sending notifications. + } $pushover->setTitle(psm_parse_msg($this->status_new, 'pushover_title', $this->server)); $pushover->setMessage(str_replace('
', "\n", $message)); $pushover->setUrl(psm_build_url()); $pushover->setUrlTitle(psm_get_lang('system', 'title')); + // Log + if(psm_get_conf('log_pushover')) { + $log_id = psm_add_log($this->server_id, 'pushover', $message); + } + foreach($users as $user) { - if(trim($user['pushover_key']) == '') { - continue; - } - $userlist[] = $user['user_id']; + // Log + if(!empty($log_id)) { + psm_add_log_user($log_id, $user['user_id']); + } + + // Set recipient + send $pushover->setUser($user['pushover_key']); if($user['pushover_device'] != '') { $pushover->setDevice($user['pushover_device']); } $pushover->send(); - } - - if(psm_get_conf('log_pushover')) { - psm_add_log($this->server_id, 'pushover', $message, implode(',', $userlist)); - } + } } /** @@ -277,24 +290,26 @@ class StatusNotifier { return false; } - // we have to build an userlist for the log table.. - $userlist = array(); + $message = psm_parse_msg($this->status_new, 'sms', $this->server); + + // Log + if(psm_get_conf('log_sms')) { + $log_id = psm_add_log($this->server_id, 'sms', $message); + } // add all users to the recipients list foreach ($users as $user) { - $userlist[] = $user['user_id']; + // Log + if(!empty($log_id)) { + psm_add_log_user($log_id, $user['user_id']); + } + $sms->addRecipients($user['mobile']); } - $message = psm_parse_msg($this->status_new, 'sms', $this->server); - // Send sms $result = $sms->sendSMS($message); - if(psm_get_conf('log_sms')) { - // save to log - psm_add_log($this->server_id, 'sms', $message, implode(',', $userlist)); - } return $result; }