diff options
Diffstat (limited to 'modules/dblog/dblog.admin.inc')
-rw-r--r-- | modules/dblog/dblog.admin.inc | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/modules/dblog/dblog.admin.inc b/modules/dblog/dblog.admin.inc new file mode 100644 index 000000000..f2389e6e1 --- /dev/null +++ b/modules/dblog/dblog.admin.inc @@ -0,0 +1,320 @@ +<?php +// $Id$ + +/** + * @file + * Administrative page callbacks for the dblog module. + */ + +/** + * dblog module settings form. + * + * @ingroup forms + * @see system_settings_form(). + */ +function dblog_admin_settings() { + $form['dblog_row_limit'] = array( + '#type' => 'select', + '#title' => t('Discard log entries above the following row limit'), + '#default_value' => variable_get('dblog_row_limit', 1000), + '#options' => drupal_map_assoc(array(100, 1000, 10000, 100000, 1000000)), + '#description' => t('The maximum number of rows to keep in the database log. Older entries will be automatically discarded. Requires crontab.') + ); + + return system_settings_form($form); +} + +/** + * Menu callback; displays a listing of log messages. + */ +function dblog_overview() { + $filter = dblog_build_filter_query(); + $rows = array(); + $icons = array( + WATCHDOG_NOTICE => '', + WATCHDOG_WARNING => theme('image', 'misc/watchdog-warning.png', t('warning'), t('warning')), + WATCHDOG_ERROR => theme('image', 'misc/watchdog-error.png', t('error'), t('error')), + ); + $classes = array( + WATCHDOG_NOTICE => 'dblog-notice', + WATCHDOG_WARNING => 'dblog-warning', + WATCHDOG_ERROR => 'dblog-error', + ); + + $output = drupal_get_form('dblog_filter_form'); + + $header = array( + ' ', + array('data' => t('Type'), 'field' => 'w.type'), + array('data' => t('Date'), 'field' => 'w.wid', 'sort' => 'desc'), + t('Message'), + array('data' => t('User'), 'field' => 'u.name'), + array('data' => t('Operations')), + ); + + $sql = "SELECT w.wid, w.uid, w.severity, w.type, w.timestamp, w.message, w.variables, w.link, u.name FROM {watchdog} w INNER JOIN {users} u ON w.uid = u.uid"; + $tablesort = tablesort_sql($header); + if (!empty($filter['where'])) { + $result = pager_query($sql ." WHERE ". $filter['where'] . $tablesort, 50, 0, NULL, $filter['args']); + } + else { + $result = pager_query($sql . $tablesort, 50); + } + + while ($dblog = db_fetch_object($result)) { + $rows[] = array('data' => + array( + // Cells + $icons[$dblog->severity], + t($dblog->type), + format_date($dblog->timestamp, 'small'), + l(truncate_utf8(_dblog_format_message($dblog), 56, TRUE, TRUE), 'admin/logs/event/'. $dblog->wid, array('html' => TRUE)), + theme('username', $dblog), + $dblog->link, + ), + // Attributes for tr + 'class' => "dblog-". preg_replace('/[^a-z]/i', '-', $dblog->type) .' '. $classes[$dblog->severity] + ); + } + + if (!$rows) { + $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 6)); + } + + $output .= theme('table', $header, $rows, array('id' => 'admin-dblog')); + $output .= theme('pager', NULL, 50, 0); + + return $output; +} + +/** + * Menu callback; generic function to display a page of the most frequent + * dblog events of a specified type. + */ +function dblog_top($type) { + + $header = array( + array('data' => t('Count'), 'field' => 'count', 'sort' => 'desc'), + array('data' => t('Message'), 'field' => 'message') + ); + + $result = pager_query("SELECT COUNT(wid) AS count, message, variables FROM {watchdog} WHERE type = '%s' GROUP BY message, variables ". tablesort_sql($header), 30, 0, "SELECT COUNT(DISTINCT(message)) FROM {watchdog} WHERE type = '%s'", $type); + + $rows = array(); + while ($dblog = db_fetch_object($result)) { + $rows[] = array($dblog->count, truncate_utf8(_dblog_format_message($dblog), 56, TRUE, TRUE)); + } + + if (empty($rows)) { + $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 2)); + } + + $output = theme('table', $header, $rows); + $output .= theme('pager', NULL, 30, 0); + + return $output; +} + +/** + * Menu callback; displays details about a log message. + */ +function dblog_event($id) { + $severity = watchdog_severity_levels(); + $output = ''; + $result = db_query('SELECT w.*, u.name, u.uid FROM {watchdog} w INNER JOIN {users} u ON w.uid = u.uid WHERE w.wid = %d', $id); + if ($dblog = db_fetch_object($result)) { + $rows = array( + array( + array('data' => t('Type'), 'header' => TRUE), + t($dblog->type), + ), + array( + array('data' => t('Date'), 'header' => TRUE), + format_date($dblog->timestamp, 'large'), + ), + array( + array('data' => t('User'), 'header' => TRUE), + theme('username', $dblog), + ), + array( + array('data' => t('Location'), 'header' => TRUE), + l($dblog->location, $dblog->location), + ), + array( + array('data' => t('Referrer'), 'header' => TRUE), + l($dblog->referer, $dblog->referer), + ), + array( + array('data' => t('Message'), 'header' => TRUE), + _dblog_format_message($dblog), + ), + array( + array('data' => t('Severity'), 'header' => TRUE), + $severity[$dblog->severity], + ), + array( + array('data' => t('Hostname'), 'header' => TRUE), + $dblog->hostname, + ), + array( + array('data' => t('Operations'), 'header' => TRUE), + $dblog->link, + ), + ); + $attributes = array('class' => 'dblog-event'); + $output = theme('table', array(), $rows, $attributes); + } + return $output; +} + +/** + * Build query for dblog administration filters based on session. + */ +function dblog_build_filter_query() { + if (empty($_SESSION['dblog_overview_filter'])) { + return; + } + + $filters = dblog_filters(); + + // Build query + $where = $args = array(); + foreach ($_SESSION['dblog_overview_filter'] as $key => $filter) { + $filter_where = array(); + foreach ($filter as $value) { + $filter_where[] = $filters[$key]['where']; + $args[] = $value; + } + if (!empty($filter_where)) { + $where[] = '('. implode(' OR ', $filter_where) .')'; + } + } + $where = !empty($where) ? implode(' AND ', $where) : ''; + + return array( + 'where' => $where, + 'args' => $args, + ); +} + + +/** + * List dblog administration filters that can be applied. + */ +function dblog_filters() { + $filters = array(); + + foreach(_dblog_get_message_types() as $type) { + $types[$type] = $type; + } + + if (!empty($types)) { + $filters['type'] = array( + 'title' => t('Type'), + 'where' => "w.type = '%s'", + 'options' => $types, + ); + } + + $filters['severity'] = array( + 'title' => t('Severity'), + 'where' => 'w.severity = %d', + 'options' => watchdog_severity_levels(), + ); + + return $filters; +} + +/** + * Formats a log message for display. + * + * @param $dblog + * An object with at least the message and variables properties + */ +function _dblog_format_message($dblog) { + // Legacy messages and user specified text + if ($dblog->variables === 'N;') { + return $dblog->message; + } + // Message to translate with injected variables + else { + return t($dblog->message, unserialize($dblog->variables)); + } +} + + +/** + * Return form for dblog administration filters. + * + * @ingroup forms + * @see dblog_filter_form_submit(). + * @see dblog_filter_form_validate(). + */ +function dblog_filter_form() { + $session = &$_SESSION['dblog_overview_filter']; + $session = is_array($session) ? $session : array(); + $filters = dblog_filters(); + + $form['filters'] = array( + '#type' => 'fieldset', + '#title' => t('Filter log messages'), + '#theme' => 'dblog_filters', + '#collapsible' => TRUE, + '#collapsed' => empty($session), + ); + foreach ($filters as $key => $filter) { + $form['filters']['status'][$key] = array( + '#title' => $filter['title'], + '#type' => 'select', + '#multiple' => TRUE, + '#size' => 8, + '#options' => $filter['options'], + ); + if (!empty($session[$key])) { + $form['filters']['status'][$key]['#default_value'] = $session[$key]; + } + } + + $form['filters']['buttons']['submit'] = array( + '#type' => 'submit', + '#value' => t('Filter'), + ); + if (!empty($session)) { + $form['filters']['buttons']['reset'] = array( + '#type' => 'submit', + '#value' => t('Reset') + ); + } + + return $form; +} + +/** + * Validate result from dblog administration filter form. + */ +function dblog_filter_form_validate($form, &$form_state) { + if ($form_state['values']['op'] == t('Filter') && empty($form_state['values']['type']) && empty($form_state['values']['severity'])) { + form_set_error('type', t('You must select something to filter by.')); + } +} + +/** + * Process result from dblog administration filter form. + */ +function dblog_filter_form_submit($form, &$form_state) { + $op = $form_state['values']['op']; + $filters = dblog_filters(); + switch ($op) { + case t('Filter'): + foreach ($filters as $name => $filter) { + if (isset($form_state['values'][$name])) { + $_SESSION['dblog_overview_filter'][$name] = $form_state['values'][$name]; + } + } + break; + case t('Reset'): + $_SESSION['dblog_overview_filter'] = array(); + break; + } + return 'admin/logs/dblog'; +} |