annotate modules/dblog/dblog.admin.inc @ 11:589fb7c02327 6.5

Drupal 6.5
author Franck Deroche <webmaster@defr.org>
date Tue, 23 Dec 2008 14:32:19 +0100
parents c1f4ac30525a
children
rev   line source
webmaster@1 1 <?php
webmaster@11 2 // $Id: dblog.admin.inc,v 1.6.2.1 2008/09/17 05:47:53 goba Exp $
webmaster@1 3
webmaster@1 4 /**
webmaster@1 5 * @file
webmaster@1 6 * Administrative page callbacks for the dblog module.
webmaster@1 7 */
webmaster@1 8
webmaster@1 9 /**
webmaster@1 10 * dblog module settings form.
webmaster@1 11 *
webmaster@1 12 * @ingroup forms
webmaster@1 13 * @see system_settings_form()
webmaster@1 14 */
webmaster@1 15 function dblog_admin_settings() {
webmaster@1 16 $form['dblog_row_limit'] = array(
webmaster@1 17 '#type' => 'select',
webmaster@1 18 '#title' => t('Discard log entries above the following row limit'),
webmaster@1 19 '#default_value' => variable_get('dblog_row_limit', 1000),
webmaster@1 20 '#options' => drupal_map_assoc(array(100, 1000, 10000, 100000, 1000000)),
webmaster@1 21 '#description' => t('The maximum number of rows to keep in the database log. Older entries will be automatically discarded. (Requires a correctly configured <a href="@cron">cron maintenance task</a>.)', array('@cron' => url('admin/reports/status')))
webmaster@1 22 );
webmaster@1 23
webmaster@1 24 return system_settings_form($form);
webmaster@1 25 }
webmaster@1 26
webmaster@1 27 /**
webmaster@1 28 * Menu callback; displays a listing of log messages.
webmaster@1 29 */
webmaster@1 30 function dblog_overview() {
webmaster@1 31 $filter = dblog_build_filter_query();
webmaster@1 32 $rows = array();
webmaster@1 33 $icons = array(
webmaster@11 34 WATCHDOG_DEBUG => '',
webmaster@11 35 WATCHDOG_INFO => '',
webmaster@11 36 WATCHDOG_NOTICE => '',
webmaster@11 37 WATCHDOG_WARNING => theme('image', 'misc/watchdog-warning.png', t('warning'), t('warning')),
webmaster@11 38 WATCHDOG_ERROR => theme('image', 'misc/watchdog-error.png', t('error'), t('error')),
webmaster@11 39 WATCHDOG_CRITICAL => theme('image', 'misc/watchdog-error.png', t('critical'), t('critical')),
webmaster@11 40 WATCHDOG_ALERT => theme('image', 'misc/watchdog-error.png', t('alert'), t('alert')),
webmaster@11 41 WATCHDOG_EMERG => theme('image', 'misc/watchdog-error.png', t('emergency'), t('emergency')),
webmaster@1 42 );
webmaster@1 43 $classes = array(
webmaster@11 44 WATCHDOG_DEBUG => 'dblog-debug',
webmaster@11 45 WATCHDOG_INFO => 'dblog-info',
webmaster@11 46 WATCHDOG_NOTICE => 'dblog-notice',
webmaster@11 47 WATCHDOG_WARNING => 'dblog-warning',
webmaster@11 48 WATCHDOG_ERROR => 'dblog-error',
webmaster@11 49 WATCHDOG_CRITICAL => 'dblog-critical',
webmaster@11 50 WATCHDOG_ALERT => 'dblog-alert',
webmaster@11 51 WATCHDOG_EMERG => 'dblog-emerg',
webmaster@1 52 );
webmaster@1 53
webmaster@1 54 $output = drupal_get_form('dblog_filter_form');
webmaster@1 55
webmaster@1 56 $header = array(
webmaster@1 57 ' ',
webmaster@1 58 array('data' => t('Type'), 'field' => 'w.type'),
webmaster@1 59 array('data' => t('Date'), 'field' => 'w.wid', 'sort' => 'desc'),
webmaster@1 60 t('Message'),
webmaster@1 61 array('data' => t('User'), 'field' => 'u.name'),
webmaster@1 62 array('data' => t('Operations')),
webmaster@1 63 );
webmaster@1 64
webmaster@1 65 $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";
webmaster@1 66 $tablesort = tablesort_sql($header);
webmaster@1 67 if (!empty($filter['where'])) {
webmaster@1 68 $result = pager_query($sql ." WHERE ". $filter['where'] . $tablesort, 50, 0, NULL, $filter['args']);
webmaster@1 69 }
webmaster@1 70 else {
webmaster@1 71 $result = pager_query($sql . $tablesort, 50);
webmaster@1 72 }
webmaster@1 73
webmaster@1 74 while ($dblog = db_fetch_object($result)) {
webmaster@1 75 $rows[] = array('data' =>
webmaster@1 76 array(
webmaster@1 77 // Cells
webmaster@1 78 $icons[$dblog->severity],
webmaster@1 79 t($dblog->type),
webmaster@1 80 format_date($dblog->timestamp, 'small'),
webmaster@1 81 l(truncate_utf8(_dblog_format_message($dblog), 56, TRUE, TRUE), 'admin/reports/event/'. $dblog->wid, array('html' => TRUE)),
webmaster@1 82 theme('username', $dblog),
webmaster@1 83 $dblog->link,
webmaster@1 84 ),
webmaster@1 85 // Attributes for tr
webmaster@1 86 'class' => "dblog-". preg_replace('/[^a-z]/i', '-', $dblog->type) .' '. $classes[$dblog->severity]
webmaster@1 87 );
webmaster@1 88 }
webmaster@1 89
webmaster@1 90 if (!$rows) {
webmaster@1 91 $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 6));
webmaster@1 92 }
webmaster@1 93
webmaster@1 94 $output .= theme('table', $header, $rows, array('id' => 'admin-dblog'));
webmaster@1 95 $output .= theme('pager', NULL, 50, 0);
webmaster@1 96
webmaster@1 97 return $output;
webmaster@1 98 }
webmaster@1 99
webmaster@1 100 /**
webmaster@1 101 * Menu callback; generic function to display a page of the most frequent
webmaster@1 102 * dblog events of a specified type.
webmaster@1 103 */
webmaster@1 104 function dblog_top($type) {
webmaster@1 105
webmaster@1 106 $header = array(
webmaster@1 107 array('data' => t('Count'), 'field' => 'count', 'sort' => 'desc'),
webmaster@1 108 array('data' => t('Message'), 'field' => 'message')
webmaster@1 109 );
webmaster@1 110
webmaster@1 111 $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);
webmaster@1 112
webmaster@1 113 $rows = array();
webmaster@1 114 while ($dblog = db_fetch_object($result)) {
webmaster@1 115 $rows[] = array($dblog->count, truncate_utf8(_dblog_format_message($dblog), 56, TRUE, TRUE));
webmaster@1 116 }
webmaster@1 117
webmaster@1 118 if (empty($rows)) {
webmaster@1 119 $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 2));
webmaster@1 120 }
webmaster@1 121
webmaster@1 122 $output = theme('table', $header, $rows);
webmaster@1 123 $output .= theme('pager', NULL, 30, 0);
webmaster@1 124
webmaster@1 125 return $output;
webmaster@1 126 }
webmaster@1 127
webmaster@1 128 /**
webmaster@1 129 * Menu callback; displays details about a log message.
webmaster@1 130 */
webmaster@1 131 function dblog_event($id) {
webmaster@1 132 $severity = watchdog_severity_levels();
webmaster@1 133 $output = '';
webmaster@1 134 $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);
webmaster@1 135 if ($dblog = db_fetch_object($result)) {
webmaster@1 136 $rows = array(
webmaster@1 137 array(
webmaster@1 138 array('data' => t('Type'), 'header' => TRUE),
webmaster@1 139 t($dblog->type),
webmaster@1 140 ),
webmaster@1 141 array(
webmaster@1 142 array('data' => t('Date'), 'header' => TRUE),
webmaster@1 143 format_date($dblog->timestamp, 'large'),
webmaster@1 144 ),
webmaster@1 145 array(
webmaster@1 146 array('data' => t('User'), 'header' => TRUE),
webmaster@1 147 theme('username', $dblog),
webmaster@1 148 ),
webmaster@1 149 array(
webmaster@1 150 array('data' => t('Location'), 'header' => TRUE),
webmaster@1 151 l($dblog->location, $dblog->location),
webmaster@1 152 ),
webmaster@1 153 array(
webmaster@1 154 array('data' => t('Referrer'), 'header' => TRUE),
webmaster@1 155 l($dblog->referer, $dblog->referer),
webmaster@1 156 ),
webmaster@1 157 array(
webmaster@1 158 array('data' => t('Message'), 'header' => TRUE),
webmaster@1 159 _dblog_format_message($dblog),
webmaster@1 160 ),
webmaster@1 161 array(
webmaster@1 162 array('data' => t('Severity'), 'header' => TRUE),
webmaster@1 163 $severity[$dblog->severity],
webmaster@1 164 ),
webmaster@1 165 array(
webmaster@1 166 array('data' => t('Hostname'), 'header' => TRUE),
webmaster@1 167 check_plain($dblog->hostname),
webmaster@1 168 ),
webmaster@1 169 array(
webmaster@1 170 array('data' => t('Operations'), 'header' => TRUE),
webmaster@1 171 $dblog->link,
webmaster@1 172 ),
webmaster@1 173 );
webmaster@1 174 $attributes = array('class' => 'dblog-event');
webmaster@1 175 $output = theme('table', array(), $rows, $attributes);
webmaster@1 176 }
webmaster@1 177 return $output;
webmaster@1 178 }
webmaster@1 179
webmaster@1 180 /**
webmaster@1 181 * Build query for dblog administration filters based on session.
webmaster@1 182 */
webmaster@1 183 function dblog_build_filter_query() {
webmaster@1 184 if (empty($_SESSION['dblog_overview_filter'])) {
webmaster@1 185 return;
webmaster@1 186 }
webmaster@1 187
webmaster@1 188 $filters = dblog_filters();
webmaster@1 189
webmaster@1 190 // Build query
webmaster@1 191 $where = $args = array();
webmaster@1 192 foreach ($_SESSION['dblog_overview_filter'] as $key => $filter) {
webmaster@1 193 $filter_where = array();
webmaster@1 194 foreach ($filter as $value) {
webmaster@1 195 $filter_where[] = $filters[$key]['where'];
webmaster@1 196 $args[] = $value;
webmaster@1 197 }
webmaster@1 198 if (!empty($filter_where)) {
webmaster@1 199 $where[] = '('. implode(' OR ', $filter_where) .')';
webmaster@1 200 }
webmaster@1 201 }
webmaster@1 202 $where = !empty($where) ? implode(' AND ', $where) : '';
webmaster@1 203
webmaster@1 204 return array(
webmaster@1 205 'where' => $where,
webmaster@1 206 'args' => $args,
webmaster@1 207 );
webmaster@1 208 }
webmaster@1 209
webmaster@1 210
webmaster@1 211 /**
webmaster@1 212 * List dblog administration filters that can be applied.
webmaster@1 213 */
webmaster@1 214 function dblog_filters() {
webmaster@1 215 $filters = array();
webmaster@1 216
webmaster@1 217 foreach (_dblog_get_message_types() as $type) {
webmaster@1 218 $types[$type] = $type;
webmaster@1 219 }
webmaster@1 220
webmaster@1 221 if (!empty($types)) {
webmaster@1 222 $filters['type'] = array(
webmaster@1 223 'title' => t('Type'),
webmaster@1 224 'where' => "w.type = '%s'",
webmaster@1 225 'options' => $types,
webmaster@1 226 );
webmaster@1 227 }
webmaster@1 228
webmaster@1 229 $filters['severity'] = array(
webmaster@1 230 'title' => t('Severity'),
webmaster@1 231 'where' => 'w.severity = %d',
webmaster@1 232 'options' => watchdog_severity_levels(),
webmaster@1 233 );
webmaster@1 234
webmaster@1 235 return $filters;
webmaster@1 236 }
webmaster@1 237
webmaster@1 238 /**
webmaster@1 239 * Formats a log message for display.
webmaster@1 240 *
webmaster@1 241 * @param $dblog
webmaster@1 242 * An object with at least the message and variables properties
webmaster@1 243 */
webmaster@1 244 function _dblog_format_message($dblog) {
webmaster@1 245 // Legacy messages and user specified text
webmaster@1 246 if ($dblog->variables === 'N;') {
webmaster@1 247 return $dblog->message;
webmaster@1 248 }
webmaster@1 249 // Message to translate with injected variables
webmaster@1 250 else {
webmaster@1 251 return t($dblog->message, unserialize($dblog->variables));
webmaster@1 252 }
webmaster@1 253 }
webmaster@1 254
webmaster@1 255
webmaster@1 256 /**
webmaster@1 257 * Return form for dblog administration filters.
webmaster@1 258 *
webmaster@1 259 * @ingroup forms
webmaster@1 260 * @see dblog_filter_form_submit()
webmaster@1 261 * @see dblog_filter_form_validate()
webmaster@1 262 */
webmaster@1 263 function dblog_filter_form() {
webmaster@1 264 $session = &$_SESSION['dblog_overview_filter'];
webmaster@1 265 $session = is_array($session) ? $session : array();
webmaster@1 266 $filters = dblog_filters();
webmaster@1 267
webmaster@1 268 $form['filters'] = array(
webmaster@1 269 '#type' => 'fieldset',
webmaster@1 270 '#title' => t('Filter log messages'),
webmaster@1 271 '#theme' => 'dblog_filters',
webmaster@1 272 '#collapsible' => TRUE,
webmaster@1 273 '#collapsed' => empty($session),
webmaster@1 274 );
webmaster@1 275 foreach ($filters as $key => $filter) {
webmaster@1 276 $form['filters']['status'][$key] = array(
webmaster@1 277 '#title' => $filter['title'],
webmaster@1 278 '#type' => 'select',
webmaster@1 279 '#multiple' => TRUE,
webmaster@1 280 '#size' => 8,
webmaster@1 281 '#options' => $filter['options'],
webmaster@1 282 );
webmaster@1 283 if (!empty($session[$key])) {
webmaster@1 284 $form['filters']['status'][$key]['#default_value'] = $session[$key];
webmaster@1 285 }
webmaster@1 286 }
webmaster@1 287
webmaster@1 288 $form['filters']['buttons']['submit'] = array(
webmaster@1 289 '#type' => 'submit',
webmaster@1 290 '#value' => t('Filter'),
webmaster@1 291 );
webmaster@1 292 if (!empty($session)) {
webmaster@1 293 $form['filters']['buttons']['reset'] = array(
webmaster@1 294 '#type' => 'submit',
webmaster@1 295 '#value' => t('Reset')
webmaster@1 296 );
webmaster@1 297 }
webmaster@1 298
webmaster@1 299 return $form;
webmaster@1 300 }
webmaster@1 301
webmaster@1 302 /**
webmaster@1 303 * Validate result from dblog administration filter form.
webmaster@1 304 */
webmaster@1 305 function dblog_filter_form_validate($form, &$form_state) {
webmaster@1 306 if ($form_state['values']['op'] == t('Filter') && empty($form_state['values']['type']) && empty($form_state['values']['severity'])) {
webmaster@1 307 form_set_error('type', t('You must select something to filter by.'));
webmaster@1 308 }
webmaster@1 309 }
webmaster@1 310
webmaster@1 311 /**
webmaster@1 312 * Process result from dblog administration filter form.
webmaster@1 313 */
webmaster@1 314 function dblog_filter_form_submit($form, &$form_state) {
webmaster@1 315 $op = $form_state['values']['op'];
webmaster@1 316 $filters = dblog_filters();
webmaster@1 317 switch ($op) {
webmaster@1 318 case t('Filter'):
webmaster@1 319 foreach ($filters as $name => $filter) {
webmaster@1 320 if (isset($form_state['values'][$name])) {
webmaster@1 321 $_SESSION['dblog_overview_filter'][$name] = $form_state['values'][$name];
webmaster@1 322 }
webmaster@1 323 }
webmaster@1 324 break;
webmaster@1 325 case t('Reset'):
webmaster@1 326 $_SESSION['dblog_overview_filter'] = array();
webmaster@1 327 break;
webmaster@1 328 }
webmaster@1 329 return 'admin/reports/dblog';
webmaster@1 330 }