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