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 } |