From 6aabe1eca7363098f8831a4f47cc943e0f1d7f4c Mon Sep 17 00:00:00 2001 From: Davy Rolink Date: Wed, 1 Oct 2014 20:50:37 +0200 Subject: [PATCH 1/4] save log_users in a separate table, so that we can add additional data to each log_user in the near future --- src/includes/functions.inc.php | 26 +++++- src/psm/Util/Install/Installer.class.php | 6 +- .../Server/Updater/StatusNotifier.class.php | 89 +++++++++++-------- 3 files changed, 81 insertions(+), 40 deletions(-) diff --git a/src/includes/functions.inc.php b/src/includes/functions.inc.php index e888a940..7b7a9ff3 100644 --- a/src/includes/functions.inc.php +++ b/src/includes/functions.inc.php @@ -199,22 +199,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/Util/Install/Installer.class.php b/src/psm/Util/Install/Installer.class.php index 30e3ad25..7fb96507 100644 --- a/src/psm/Util/Install/Installer.class.php +++ b/src/psm/Util/Install/Installer.class.php @@ -204,9 +204,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(100) NOT NULL, diff --git a/src/psm/Util/Server/Updater/StatusNotifier.class.php b/src/psm/Util/Server/Updater/StatusNotifier.class.php index 154b4c3e..1460b907 100644 --- a/src/psm/Util/Server/Updater/StatusNotifier.class.php +++ b/src/psm/Util/Server/Updater/StatusNotifier.class.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 = psm_parse_msg($this->status_new, 'email_subject', $this->server); @@ -209,19 +207,23 @@ class StatusNotifier { $mail->Body = $body; $mail->AltBody = str_replace('
', "\n", $body); + // Log + if(psm_get_conf('log_email')) { + $log_id = psm_add_log($this->server_id, 'email', $body); + } + // go through empl foreach ($users as $user) { + // Log + 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 +233,51 @@ class StatusNotifier { * @return boolean */ protected function notifyByPushover($users) { - $userlist = array(); - $pushover = psm_build_pushover(); + // Clean-up users + 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 +292,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')) { + 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; } From aaa073d9fd70aa98217b8bad5e8de207d2c6e33e Mon Sep 17 00:00:00 2001 From: Davy Rolink Date: Thu, 2 Oct 2014 20:55:22 +0200 Subject: [PATCH 2/4] 3.1.1 upgrade --- src/includes/psmconfig.inc.php | 2 +- src/psm/Util/Install/Installer.class.php | 37 ++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/includes/psmconfig.inc.php b/src/includes/psmconfig.inc.php index 9876bc88..45d09266 100644 --- a/src/includes/psmconfig.inc.php +++ b/src/includes/psmconfig.inc.php @@ -29,7 +29,7 @@ /** * Current PSM version */ -define('PSM_VERSION', '3.1.0'); +define('PSM_VERSION', '3.1.1'); /** * URL to check for updates. Will not be checked if turned off on config page. diff --git a/src/psm/Util/Install/Installer.class.php b/src/psm/Util/Install/Installer.class.php index 7fb96507..da82f765 100644 --- a/src/psm/Util/Install/Installer.class.php +++ b/src/psm/Util/Install/Installer.class.php @@ -78,7 +78,7 @@ class Installer { // different DB version, check if the version requires any changes // @todo this is currently a manual check for each version, similar to upgrade().. not a clean way - if(version_compare($version_db, '3.1.0', '<')) { + if(version_compare($version_db, '3.1.1', '<')) { return true; } else { // change database version to current version so this check won't be required next time @@ -209,7 +209,7 @@ class Installer { 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`), + 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, @@ -286,6 +286,10 @@ class Installer { // upgrade to 3.1.0 $this->upgrade310(); } + if(version_compare($version_from, '3.1.1', '<')) { + // upgrade to 3.1.1 + $this->upgrade311(); + } psm_update_conf('version', $version_to); } @@ -425,4 +429,33 @@ class Installer { $this->execSQL($queries); } + + /** + * Upgrade for v3.1.1 release (all log-users relations are in a separate table) + */ + protected function upgrade311() { + // 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`;"); + } } From 58b104c1fb315b9aefd211ca41b187ed6666bcae Mon Sep 17 00:00:00 2001 From: Davy Rolink Date: Thu, 2 Oct 2014 21:33:51 +0200 Subject: [PATCH 3/4] log users displaying for the new log-users data structure --- .../Server/Controller/LogController.class.php | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/psm/Module/Server/Controller/LogController.class.php b/src/psm/Module/Server/Controller/LogController.class.php index 2b6e465f..c63d980c 100644 --- a/src/psm/Module/Server/Controller/LogController.class.php +++ b/src/psm/Module/Server/Controller/LogController.class.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" + ); + } } From 3cc48dff2de8c9090147bd1fff19001ada8ec922 Mon Sep 17 00:00:00 2001 From: Davy Rolink Date: Thu, 2 Oct 2014 22:00:08 +0200 Subject: [PATCH 4/4] bugfix, missing $log_id --- src/psm/Util/Server/Updater/StatusNotifier.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/psm/Util/Server/Updater/StatusNotifier.class.php b/src/psm/Util/Server/Updater/StatusNotifier.class.php index 1460b907..67cdf561 100644 --- a/src/psm/Util/Server/Updater/StatusNotifier.class.php +++ b/src/psm/Util/Server/Updater/StatusNotifier.class.php @@ -296,7 +296,7 @@ class StatusNotifier { // Log if(psm_get_conf('log_sms')) { - psm_add_log($this->server_id, 'sms', $message); + $log_id = psm_add_log($this->server_id, 'sms', $message); } // add all users to the recipients list