Index: typo3/sysext/reports/reports/status/class.tx_reports_reports_status_status.php =================================================================== --- typo3/sysext/reports/reports/status/class.tx_reports_reports_status_status.php (revision 10097) +++ typo3/sysext/reports/reports/status/class.tx_reports_reports_status_status.php (working copy) @@ -99,6 +99,29 @@ public function getSeverity() { return $this->severity; } + + /** + * Creates a string representation of a status. + * + * @return string String representation of this status. + */ + public function __toString() { + $severity = array( + self::NOTICE => 'NOTE', + self::INFO => 'INFO', + self::OK => 'OK', + self::WARNING => 'WARN', + self::ERROR => 'ERR', + ); + + // max length 80 characters + $stringRepresentation = + str_pad('[' . $severity[$this->severity] . ']', 7) . + str_pad($this->title, 40) . ' - ' . + substr($this->value, 0, 30); + + return $stringRepresentation; + } } Index: typo3/sysext/reports/reports/locallang.xml =================================================================== --- typo3/sysext/reports/reports/locallang.xml (revision 10097) +++ typo3/sysext/reports/reports/locallang.xml (working copy) @@ -52,6 +52,11 @@ + + + + + \ No newline at end of file Index: typo3/sysext/reports/ext_autoload.php =================================================================== --- typo3/sysext/reports/ext_autoload.php (revision 10097) +++ typo3/sysext/reports/ext_autoload.php (working copy) @@ -16,5 +16,6 @@ 'tx_reports_reports_status_configurationstatus' => $extensionPath . 'reports/status/class.tx_reports_reports_status_configurationstatus.php', 'tx_reports_reports_status_status' => $extensionPath . 'reports/status/class.tx_reports_reports_status_status.php', 'tx_reports_tasks_systemstatusupdatetask' => $extensionPath . 'tasks/class.tx_reports_tasks_systemstatusupdatetask.php', + 'tx_reports_tasks_systemstatusupdatetasknotificationemailfield' => $extensionPath . 'tasks/class.tx_reports_tasks_systemstatusupdatetasknotificationemailfield.php', ); ?> \ No newline at end of file Index: typo3/sysext/reports/ext_localconf.php =================================================================== --- typo3/sysext/reports/ext_localconf.php (revision 10097) +++ typo3/sysext/reports/ext_localconf.php (working copy) @@ -6,9 +6,10 @@ } $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks']['tx_reports_tasks_SystemStatusUpdateTask'] = array( - 'extension' => $_EXTKEY, - 'title' => 'LLL:EXT:' . $_EXTKEY . '/reports/locallang.xml:status_updateTaskTitle', - 'description' => 'LLL:EXT:' . $_EXTKEY . '/reports/locallang.xml:status_updateTaskDescription' + 'extension' => $_EXTKEY, + 'title' => 'LLL:EXT:' . $_EXTKEY . '/reports/locallang.xml:status_updateTaskTitle', + 'description' => 'LLL:EXT:' . $_EXTKEY . '/reports/locallang.xml:status_updateTaskDescription', + 'additionalFields' => 'tx_reports_tasks_SystemStatusUpdateTaskNotificationEmailField' ); $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_befunc.php']['displayWarningMessages']['tx_reports_WarningMessagePostProcessor'] = 'EXT:reports/reports/status/class.tx_reports_reports_status_warningmessagepostprocessor.php:tx_reports_reports_status_WarningMessagePostProcessor'; Index: typo3/sysext/reports/tasks/class.tx_reports_tasks_systemstatusupdatetasknotificationemailfield.php =================================================================== --- typo3/sysext/reports/tasks/class.tx_reports_tasks_systemstatusupdatetasknotificationemailfield.php (revision 0) +++ typo3/sysext/reports/tasks/class.tx_reports_tasks_systemstatusupdatetasknotificationemailfield.php (revision 0) @@ -0,0 +1,147 @@ + +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * Additional field to set the notification email address(es) for system health + * issue notifications. + * + * @author Ingo Renner + * @package TYPO3 + * @subpackage reports + */ +class tx_reports_tasks_SystemStatusUpdateTaskNotificationEmailField implements tx_scheduler_AdditionalFieldProvider { + + + /** + * Additional fields + * + * @var array + */ + protected $fields = array('notificationEmail'); + + /** + * Field prefix. + * + * @var string + */ + protected $fieldPrefix = 'SystemStatusUpdate'; + + /** + * Gets additional fields to render in the form to add/edit a task + * + * @param array $taskInfo Values of the fields from the add/edit task form + * @param tx_scheduler_Task $task The task object being eddited. Null when adding a task! + * @param tx_scheduler_Module $schedulerModule Reference to the scheduler backend module + * @return array A two dimensional array, array('Identifier' => array('fieldId' => array('code' => '', 'label' => '', 'cshKey' => '', 'cshLabel' => '')) + */ + public function getAdditionalFields(array &$taskInfo, $task, tx_scheduler_Module $schedulerModule) { + $fields = array('notificationEmail'); + + if ($schedulerModule->CMD == 'edit') { + $taskInfo[$this->fieldPrefix . 'NotificationEmail'] = $task->getNotificationEmail(); + } + + $additionalFields = array(); + foreach ($fields as $field) { + $fieldName = $this->getFullFieldName($field); + $fieldId = 'task_' . $fieldName; + $fieldHtml = ''; + + $additionalFields[$fieldId] = array( + 'code' => $fieldHtml, + 'label' => 'LLL:EXT:reports/reports/locallang.xml:status_updateTaskField_' . $field, + 'cshKey' => '', + 'cshLabel' => $fieldId + ); + } + + return $additionalFields; + } + + /** + * Validates the additional fields' values + * + * @param array $submittedData An array containing the data submitted by the add/edit task form + * @param tx_scheduler_Module $schedulerModule Reference to the scheduler backend module + * @return boolean True if validation was ok (or selected class is not relevant), false otherwise + */ + public function validateAdditionalFields(array &$submittedData, tx_scheduler_Module $schedulerModule) { + $validInput = TRUE; + $submittedData[$this->fieldPrefix . 'NotificationEmail'] = trim($submittedData[$this->fieldPrefix . 'NotificationEmail']); + + if ( + empty($submittedData[$this->fieldPrefix . 'NotificationEmail']) + || !filter_var($submittedData[$this->fieldPrefix . 'NotificationEmail'], FILTER_VALIDATE_EMAIL) + ) { + $schedulerModule->addMessage( + $GLOBALS['LANG']->sL('LLL:EXT:reports/reports/locallang.xml:status_updateTaskField_notificationEmail_invalid'), + t3lib_FlashMessage::ERROR + ); + $validInput = FALSE; + } + + return $validInput; + } + + /** + * Takes care of saving the additional fields' values in the task's object + * + * @param array $submittedData An array containing the data submitted by the add/edit task form + * @param tx_scheduler_Task $task Reference to the scheduler backend module + * @return void + */ + public function saveAdditionalFields(array $submittedData, tx_scheduler_Task $task) { + + if (!($task instanceof tx_reports_tasks_SystemStatusUpdateTask)) { + throw new InvalidArgumentException( + 'Expected a task of type tx_reports_tasks_SystemStatusUpdateTask, but got ' . get_class($task), + 1295012802 + ); + } + + $task->setNotificationEmail($submittedData[$this->fieldPrefix . 'NotificationEmail']); + } + + /** + * Constructs the full field name which can be used in HTML markup. + * + * @param string $fieldName A raw field name + * @return string Field name ready to use in HTML markup + */ + protected function getFullFieldName($fieldName) { + return $this->fieldPrefix . ucfirst($fieldName); + } + +} + + +if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['ext/reports/tasks/class.tx_reports_tasks_systemstatusupdatetasknotificationemailfield.php'])) { + include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['ext/reports/tasks/class.tx_reports_tasks_systemstatusupdatetasknotificationemailfield.php']); +} + +?> \ No newline at end of file Index: typo3/sysext/reports/tasks/class.tx_reports_tasks_systemstatusupdatetask.php =================================================================== --- typo3/sysext/reports/tasks/class.tx_reports_tasks_systemstatusupdatetask.php (revision 10097) +++ typo3/sysext/reports/tasks/class.tx_reports_tasks_systemstatusupdatetask.php (working copy) @@ -33,6 +33,14 @@ class tx_reports_tasks_SystemStatusUpdateTask extends tx_scheduler_Task { /** + * Email address to send email notification to in case we find problems with + * the system. + * + * @var string + */ + protected $notificationEmail = NULL; + + /** * Executes the System Status Update task, determing the highest severity of * status reports and saving that to the registry to be displayed at login * if necessary. @@ -48,8 +56,109 @@ $registry->set('tx_reports', 'status.highestSeverity', $highestSeverity); + if ($highestSeverity > tx_reports_reports_status_Status::OK) { + $this->sendNotificationEmail($systemStatus); + } + return true; } + + /** + * Gets the notification email address. + * + * @return string Notification email address. + */ + public function getNotificationEmail() { + return $this->notificationEmail; + } + + /** + * Sets the notification email address. + * + * @param string $notificationEmail Notification email address. + */ + public function setNotificationEmail($notificationEmail) { + $this->notificationEmail = $notificationEmail; + } + + /** + * Sends a notification email, reporting system issues. + * + * @param array $systemStatus Array of statuses + */ + protected function sendNotificationEmail(array $systemStatus) { + $systemIssues = array(); + + foreach ($systemStatus as $statusProvider) { + foreach ($statusProvider as $status) { + if ($status->getSeverity() > tx_reports_reports_status_Status::OK) { + $systemIssues[] = (string) $status; + } + } + } + + $fromEmail = $this->getFromAddress(); + + $subject = sprintf( + $GLOBALS['LANG']->getLL('status_updateTask_email_subject'), + $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] + ); + + $message = sprintf( + $GLOBALS['LANG']->getLL('status_problemNotification'), + '', + '' + ); + $message .= CRLF . CRLF; + $message .= $GLOBALS['LANG']->getLL('status_updateTask_email_site') + . ': ' . $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']; + $message .= CRLF . CRLF; + $message .= $GLOBALS['LANG']->getLL('status_updateTask_email_issues') + . ': ' .CRLF; + $message .= implode(CRLF, $systemIssues); + $message .= CRLF . CRLF; + + $mail = t3lib_div::makeInstance('t3lib_mail_Message'); + $mail->setFrom(array($fromEmail => 'TYPO3 CMS')); + $mail->setTo($this->notificationEmail); + $mail->setSubject($subject); + $mail->setBody($message); + + $mail->send(); + } + + /** + * Tries to generate an email address to use for the From field. + * + * @return string email address + */ + protected function getFromAddress() { + $user = 'no-reply'; + $host = php_uname('n'); + + // just get us a domain record we can use + $domainRecord = $GLOBALS['TYPO3_DB']->exec_SELECTgetSingleRow( + 'domainName', + 'sys_domain', + 'hidden = 0', + '', + 'pid ASC, sorting ASC' + ); + + if (!empty($domainRecord['domainName'])) { + $tempUrl = $domainRecord['domainName']; + + if (!t3lib_div::isFirstPartOfStr($tempUrl, 'http')) { + // shouldn't be the case anyways, but you never know + // ... there're crazy people out there + $tempUrl = 'http://' .$tempUrl; + } + + $host = parse_url($tempUrl, PHP_URL_HOST); + } + + return $user . '@' . $host; + } }