webmaster@1
|
1 <?php |
webmaster@1
|
2 // $Id: update.report.inc,v 1.10.2.1 2008/02/05 09:59:21 goba Exp $ |
webmaster@1
|
3 |
webmaster@1
|
4 /** |
webmaster@1
|
5 * @file |
webmaster@1
|
6 * Code required only when rendering the available updates report. |
webmaster@1
|
7 */ |
webmaster@1
|
8 |
webmaster@1
|
9 /** |
webmaster@1
|
10 * Menu callback. Generate a page about the update status of projects. |
webmaster@1
|
11 */ |
webmaster@1
|
12 function update_status() { |
webmaster@1
|
13 if ($available = update_get_available(TRUE)) { |
webmaster@1
|
14 module_load_include('inc', 'update', 'update.compare'); |
webmaster@1
|
15 $data = update_calculate_project_data($available); |
webmaster@1
|
16 return theme('update_report', $data); |
webmaster@1
|
17 } |
webmaster@1
|
18 else { |
webmaster@1
|
19 return theme('update_report', _update_no_data()); |
webmaster@1
|
20 } |
webmaster@1
|
21 } |
webmaster@1
|
22 |
webmaster@1
|
23 /** |
webmaster@1
|
24 * Theme project status report. |
webmaster@1
|
25 * |
webmaster@1
|
26 * @ingroup themeable |
webmaster@1
|
27 */ |
webmaster@1
|
28 function theme_update_report($data) { |
webmaster@1
|
29 $last = variable_get('update_last_check', 0); |
webmaster@1
|
30 $output = '<div class="update checked">'. ($last ? t('Last checked: @time ago', array('@time' => format_interval(time() - $last))) : t('Last checked: never')); |
webmaster@1
|
31 $output .= ' <span class="check-manually">('. l(t('Check manually'), 'admin/reports/updates/check') .')</span>'; |
webmaster@1
|
32 $output .= "</div>\n"; |
webmaster@1
|
33 |
webmaster@1
|
34 if (!is_array($data)) { |
webmaster@1
|
35 $output .= '<p>'. $data .'</p>'; |
webmaster@1
|
36 return $output; |
webmaster@1
|
37 } |
webmaster@1
|
38 |
webmaster@1
|
39 $header = array(); |
webmaster@1
|
40 $rows = array(); |
webmaster@1
|
41 |
webmaster@1
|
42 $notification_level = variable_get('update_notification_threshold', 'all'); |
webmaster@1
|
43 |
webmaster@1
|
44 foreach ($data as $project) { |
webmaster@1
|
45 switch ($project['status']) { |
webmaster@1
|
46 case UPDATE_CURRENT: |
webmaster@1
|
47 $class = 'ok'; |
webmaster@1
|
48 $icon = theme('image', 'misc/watchdog-ok.png', t('ok'), t('ok')); |
webmaster@1
|
49 break; |
webmaster@1
|
50 case UPDATE_NOT_SECURE: |
webmaster@1
|
51 case UPDATE_REVOKED: |
webmaster@1
|
52 case UPDATE_NOT_SUPPORTED: |
webmaster@1
|
53 case UPDATE_NOT_CURRENT: |
webmaster@1
|
54 if ($notification_level == 'all' |
webmaster@1
|
55 || $project['status'] != UPDATE_NOT_CURRENT) { |
webmaster@1
|
56 $class = 'error'; |
webmaster@1
|
57 $icon = theme('image', 'misc/watchdog-error.png', t('error'), t('error')); |
webmaster@1
|
58 break; |
webmaster@1
|
59 } |
webmaster@1
|
60 // Otherwise, deliberate no break and use the warning class/icon. |
webmaster@1
|
61 default: |
webmaster@1
|
62 $class = 'warning'; |
webmaster@1
|
63 $icon = theme('image', 'misc/watchdog-warning.png', t('warning'), t('warning')); |
webmaster@1
|
64 break; |
webmaster@1
|
65 } |
webmaster@1
|
66 |
webmaster@1
|
67 $row = '<div class="version-status">'; |
webmaster@1
|
68 switch ($project['status']) { |
webmaster@1
|
69 case UPDATE_NOT_SECURE: |
webmaster@1
|
70 $row .= '<span class="security-error">'. t('Security update required!') .'</span>'; |
webmaster@1
|
71 break; |
webmaster@1
|
72 case UPDATE_REVOKED: |
webmaster@1
|
73 $row .= '<span class="revoked">'. t('Revoked!') .'</span>'; |
webmaster@1
|
74 break; |
webmaster@1
|
75 case UPDATE_NOT_SUPPORTED: |
webmaster@1
|
76 $row .= '<span class="not-supported">'. t('Not supported!') .'</span>'; |
webmaster@1
|
77 break; |
webmaster@1
|
78 case UPDATE_NOT_CURRENT: |
webmaster@1
|
79 $row .= '<span class="not-current">'. t('Update available') .'</span>'; |
webmaster@1
|
80 break; |
webmaster@1
|
81 case UPDATE_CURRENT: |
webmaster@1
|
82 $row .= '<span class="current">'. t('Up to date') .'</span>'; |
webmaster@1
|
83 break; |
webmaster@1
|
84 default: |
webmaster@1
|
85 $row .= check_plain($project['reason']); |
webmaster@1
|
86 break; |
webmaster@1
|
87 } |
webmaster@1
|
88 $row .= '<span class="icon">'. $icon .'</span>'; |
webmaster@1
|
89 $row .= "</div>\n"; |
webmaster@1
|
90 |
webmaster@1
|
91 $row .= '<div class="project">'; |
webmaster@1
|
92 if (isset($project['title'])) { |
webmaster@1
|
93 if (isset($project['link'])) { |
webmaster@1
|
94 $row .= l($project['title'], $project['link']); |
webmaster@1
|
95 } |
webmaster@1
|
96 else { |
webmaster@1
|
97 $row .= check_plain($project['title']); |
webmaster@1
|
98 } |
webmaster@1
|
99 } |
webmaster@1
|
100 else { |
webmaster@1
|
101 $row .= check_plain($project['name']); |
webmaster@1
|
102 } |
webmaster@1
|
103 $row .= ' '. check_plain($project['existing_version']); |
webmaster@1
|
104 if ($project['install_type'] == 'dev' && !empty($project['datestamp'])) { |
webmaster@1
|
105 $row .= ' <span class="version-date">('. format_date($project['datestamp'], 'custom', 'Y-M-d') .')</span>'; |
webmaster@1
|
106 } |
webmaster@1
|
107 $row .= "</div>\n"; |
webmaster@1
|
108 |
webmaster@1
|
109 $row .= "<div class=\"versions\">\n"; |
webmaster@1
|
110 |
webmaster@1
|
111 if (isset($project['recommended'])) { |
webmaster@1
|
112 if ($project['status'] != UPDATE_CURRENT || $project['existing_version'] != $project['recommended']) { |
webmaster@1
|
113 |
webmaster@1
|
114 // First, figure out what to recommend. |
webmaster@1
|
115 // If there's only 1 security update and it has the same version we're |
webmaster@1
|
116 // recommending, give it the same CSS class as if it was recommended, |
webmaster@1
|
117 // but don't print out a separate "Recommended" line for this project. |
webmaster@1
|
118 if (!empty($project['security updates']) && count($project['security updates']) == 1 && $project['security updates'][0]['version'] == $project['recommended']) { |
webmaster@1
|
119 $security_class = ' version-recommended version-recommended-strong'; |
webmaster@1
|
120 } |
webmaster@1
|
121 else { |
webmaster@1
|
122 $security_class = ''; |
webmaster@1
|
123 $version_class = 'version-recommended'; |
webmaster@1
|
124 // Apply an extra class if we're displaying both a recommended |
webmaster@1
|
125 // version and anything else for an extra visual hint. |
webmaster@1
|
126 if ($project['recommended'] != $project['latest_version'] |
webmaster@1
|
127 || !empty($project['also']) |
webmaster@1
|
128 || ($project['install_type'] == 'dev' |
webmaster@1
|
129 && isset($project['dev_version']) |
webmaster@1
|
130 && $project['latest_version'] != $project['dev_version'] |
webmaster@1
|
131 && $project['recommended'] != $project['dev_version']) |
webmaster@1
|
132 || (isset($project['security updates'][0]) |
webmaster@1
|
133 && $project['recommended'] != $project['security updates'][0]) |
webmaster@1
|
134 ) { |
webmaster@1
|
135 $version_class .= ' version-recommended-strong'; |
webmaster@1
|
136 } |
webmaster@1
|
137 $row .= theme('update_version', $project['releases'][$project['recommended']], t('Recommended version:'), $version_class); |
webmaster@1
|
138 } |
webmaster@1
|
139 |
webmaster@1
|
140 // Now, print any security updates. |
webmaster@1
|
141 if (!empty($project['security updates'])) { |
webmaster@1
|
142 foreach ($project['security updates'] as $security_update) { |
webmaster@1
|
143 $row .= theme('update_version', $security_update, t('Security update:'), 'version-security'. $security_class); |
webmaster@1
|
144 } |
webmaster@1
|
145 } |
webmaster@1
|
146 } |
webmaster@1
|
147 |
webmaster@1
|
148 if ($project['recommended'] != $project['latest_version']) { |
webmaster@1
|
149 $row .= theme('update_version', $project['releases'][$project['latest_version']], t('Latest version:'), 'version-latest'); |
webmaster@1
|
150 } |
webmaster@1
|
151 if ($project['install_type'] == 'dev' |
webmaster@1
|
152 && $project['status'] != UPDATE_CURRENT |
webmaster@1
|
153 && isset($project['dev_version']) |
webmaster@1
|
154 && $project['recommended'] != $project['dev_version']) { |
webmaster@1
|
155 $row .= theme('update_version', $project['releases'][$project['dev_version']], t('Development version:'), 'version-latest'); |
webmaster@1
|
156 } |
webmaster@1
|
157 } |
webmaster@1
|
158 |
webmaster@1
|
159 if (isset($project['also'])) { |
webmaster@1
|
160 foreach ($project['also'] as $also) { |
webmaster@1
|
161 $row .= theme('update_version', $project['releases'][$also], t('Also available:'), 'version-also-available'); |
webmaster@1
|
162 } |
webmaster@1
|
163 } |
webmaster@1
|
164 |
webmaster@1
|
165 $row .= "</div>\n"; // versions div. |
webmaster@1
|
166 |
webmaster@1
|
167 $row .= "<div class=\"info\">\n"; |
webmaster@1
|
168 if (!empty($project['extra'])) { |
webmaster@1
|
169 $row .= '<div class="extra">'."\n"; |
webmaster@1
|
170 foreach ($project['extra'] as $key => $value) { |
webmaster@1
|
171 $row .= '<div class="'. $value['class'] .'">'; |
webmaster@1
|
172 $row .= check_plain($value['label']) .': '; |
webmaster@1
|
173 $row .= theme('placeholder', $value['data']); |
webmaster@1
|
174 $row .= "</div>\n"; |
webmaster@1
|
175 } |
webmaster@1
|
176 $row .= "</div>\n"; // extra div. |
webmaster@1
|
177 } |
webmaster@1
|
178 |
webmaster@1
|
179 $row .= '<div class="includes">'; |
webmaster@1
|
180 sort($project['includes']); |
webmaster@1
|
181 $row .= t('Includes: %includes', array('%includes' => implode(', ', $project['includes']))); |
webmaster@1
|
182 $row .= "</div>\n"; |
webmaster@1
|
183 |
webmaster@1
|
184 $row .= "</div>\n"; // info div. |
webmaster@1
|
185 |
webmaster@1
|
186 if (!isset($rows[$project['project_type']])) { |
webmaster@1
|
187 $rows[$project['project_type']] = array(); |
webmaster@1
|
188 } |
webmaster@1
|
189 $rows[$project['project_type']][] = array( |
webmaster@1
|
190 'class' => $class, |
webmaster@1
|
191 'data' => array($row), |
webmaster@1
|
192 ); |
webmaster@1
|
193 } |
webmaster@1
|
194 |
webmaster@1
|
195 $project_types = array( |
webmaster@1
|
196 'core' => t('Drupal core'), |
webmaster@1
|
197 'module' => t('Modules'), |
webmaster@1
|
198 'theme' => t('Themes'), |
webmaster@1
|
199 'disabled-module' => t('Disabled modules'), |
webmaster@1
|
200 'disabled-theme' => t('Disabled themes'), |
webmaster@1
|
201 ); |
webmaster@1
|
202 foreach ($project_types as $type_name => $type_label) { |
webmaster@1
|
203 if (!empty($rows[$type_name])) { |
webmaster@1
|
204 $output .= "\n<h3>". $type_label ."</h3>\n"; |
webmaster@1
|
205 $output .= theme('table', $header, $rows[$type_name], array('class' => 'update')); |
webmaster@1
|
206 } |
webmaster@1
|
207 } |
webmaster@1
|
208 drupal_add_css(drupal_get_path('module', 'update') .'/update.css'); |
webmaster@1
|
209 return $output; |
webmaster@1
|
210 } |
webmaster@1
|
211 |
webmaster@1
|
212 /** |
webmaster@1
|
213 * Theme the version display of a project. |
webmaster@1
|
214 * |
webmaster@1
|
215 * @ingroup themeable |
webmaster@1
|
216 */ |
webmaster@1
|
217 function theme_update_version($version, $tag, $class) { |
webmaster@1
|
218 $output = ''; |
webmaster@1
|
219 $output .= '<table class="version '. $class .'">'; |
webmaster@1
|
220 $output .= '<tr>'; |
webmaster@1
|
221 $output .= '<td class="version-title">'. $tag ."</td>\n"; |
webmaster@1
|
222 $output .= '<td class="version-details">'; |
webmaster@1
|
223 $output .= l($version['version'], $version['release_link']); |
webmaster@1
|
224 $output .= ' <span class="version-date">('. format_date($version['date'], 'custom', 'Y-M-d') .')</span>'; |
webmaster@1
|
225 $output .= "</td>\n"; |
webmaster@1
|
226 $output .= '<td class="version-links">'; |
webmaster@1
|
227 $links = array(); |
webmaster@1
|
228 $links['update-download'] = array( |
webmaster@1
|
229 'title' => t('Download'), |
webmaster@1
|
230 'href' => $version['download_link'], |
webmaster@1
|
231 ); |
webmaster@1
|
232 $links['update-release-notes'] = array( |
webmaster@1
|
233 'title' => t('Release notes'), |
webmaster@1
|
234 'href' => $version['release_link'], |
webmaster@1
|
235 ); |
webmaster@1
|
236 $output .= theme('links', $links); |
webmaster@1
|
237 $output .= '</td>'; |
webmaster@1
|
238 $output .= '</tr>'; |
webmaster@1
|
239 $output .= "</table>\n"; |
webmaster@1
|
240 return $output; |
webmaster@1
|
241 } |