Project

General

Profile

Download (9.49 KB) Statistics
| Branch: | Tag: | Revision:
1 21f0f60d jim-p
<?php
2
/*
3 c5d81585 Renato Botelho
 * diag_smart.php
4 fd9ebcd5 Stephen Beaver
 *
5 c5d81585 Renato Botelho
 * part of pfSense (https://www.pfsense.org)
6 38809d47 Renato Botelho do Couto
 * Copyright (c) 2004-2013 BSD Perimeter
7
 * Copyright (c) 2013-2016 Electric Sheep Fencing
8 8f585441 Luiz Souza
 * Copyright (c) 2014-2021 Rubicon Communications, LLC (Netgate)
9 c5d81585 Renato Botelho
 * Copyright (c) 2006 Eric Friesen
10
 * All rights reserved.
11 fd9ebcd5 Stephen Beaver
 *
12 b12ea3fb Renato Botelho
 * Licensed under the Apache License, Version 2.0 (the "License");
13
 * you may not use this file except in compliance with the License.
14
 * You may obtain a copy of the License at
15 fd9ebcd5 Stephen Beaver
 *
16 b12ea3fb Renato Botelho
 * http://www.apache.org/licenses/LICENSE-2.0
17 fd9ebcd5 Stephen Beaver
 *
18 b12ea3fb Renato Botelho
 * Unless required by applicable law or agreed to in writing, software
19
 * distributed under the License is distributed on an "AS IS" BASIS,
20
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
 * See the License for the specific language governing permissions and
22
 * limitations under the License.
23 fd9ebcd5 Stephen Beaver
 */
24 21f0f60d jim-p
25 a57d9fa2 jim-p
##|+PRIV
26
##|*IDENT=page-diagnostics-smart
27 9718847b k-paulius
##|*NAME=Diagnostics: S.M.A.R.T. Status
28
##|*DESCR=Allow access to the 'Diagnostics: S.M.A.R.T. Status' page.
29 a57d9fa2 jim-p
##|*MATCH=diag_smart.php*
30
##|-PRIV
31
32 c81ef6e2 Phil Davis
require_once("guiconfig.inc");
33 21f0f60d jim-p
34 d88908cf k-paulius
// What page, aka. action is being wanted
35
// If they "get" a page but don't pass all arguments, smartctl will throw an error
36 7f4268b6 Steve Beaver
$action = $_POST['action'];
37 d88908cf k-paulius
38 9718847b k-paulius
$pgtitle = array(gettext("Diagnostics"), gettext("S.M.A.R.T. Status"));
39 edcd7535 Phil Davis
$pglinks = array("", "@self", "@self");
40 d88908cf k-paulius
41
if ($action != 'config') {
42 d49d6033 k-paulius
	$pgtitle[] = htmlspecialchars(gettext('Information & Tests'));
43 d88908cf k-paulius
} else {
44
	$pgtitle[] = gettext('Config');
45
}
46 7f4268b6 Steve Beaver
47 21f0f60d jim-p
$smartctl = "/usr/local/sbin/smartctl";
48
49 1d92575e jim-p
$test_types = array(
50
	'offline' => gettext('Offline Test'),
51
	'short' => gettext('Short Test'),
52
	'long' => gettext('Long Test'),
53
	'conveyance' => gettext('Conveyance Test')
54
);
55
$info_types = array(
56
	'x' => gettext('All SMART and Non-SMART Information'),
57
	'a' => gettext('All SMART Information'),
58
	'i' => gettext('Device Information'),
59
	'H' => gettext('Device Health'),
60
	'c' => gettext('SMART Capabilities'),
61
	'A' => gettext('SMART Attributes'),
62
);
63
$log_types = array(
64
	'error' => gettext('Summary Error Log'),
65
	'xerror' => gettext('Extended Error Log'),
66
	'selftest' => gettext('SMART Self-Test Log'),
67
	'xselftest' => gettext('Extended Self-Test Log'),
68
	'selective' => gettext('Selective Self-Test Log'),
69
	'directory' => gettext('Log Directory'),
70
	'scttemp' => gettext('Device Temperature Log (ATA Only)'),
71
	'devstat' => gettext('Device Statistics (ATA Only)'),
72
	'sataphy' => gettext('SATA PHY Events (SATA Only)'),
73
	'sasphy' => gettext('SAS PHY Events (SAS Only)'),
74
	'nvmelog' => gettext('NVMe Log (NVMe Only)'),
75
	'ssd' => gettext('SSD Device Statistics (ATA/SCSI)'),
76
);
77 24879bc6 jim-p
78 21f0f60d jim-p
include("head.inc");
79
80 155d9450 sbeaver
// Highlights the words "PASSED", "FAILED", and "WARNING".
81 947141fd Phil Davis
function add_colors($string) {
82 155d9450 sbeaver
	// To add words keep arrays matched by numbers
83 21f0f60d jim-p
	$patterns[0] = '/PASSED/';
84
	$patterns[1] = '/FAILED/';
85
	$patterns[2] = '/Warning/';
86 2eb51b46 Colin Fleming
	$replacements[0] = '<span class="text-success">' . gettext("PASSED") . '</span>';
87
	$replacements[1] = '<span class="text-alert">' . gettext("FAILED") . '</span>';
88
	$replacements[2] = '<span class="text-warning">' . gettext("Warning") . '</span>';
89 21f0f60d jim-p
	ksort($patterns);
90
	ksort($replacements);
91
	return preg_replace($patterns, $replacements, $string);
92
}
93
94 24879bc6 jim-p
$targetdev = basename($_POST['device']);
95 155d9450 sbeaver
96 24879bc6 jim-p
if (!file_exists('/dev/' . $targetdev)) {
97 ff30e319 bruno
	echo gettext("Device does not exist, bailing.");
98 24879bc6 jim-p
	return;
99
}
100 155d9450 sbeaver
101 b4594d39 Chris Buechler
$specplatform = system_identify_specific_platform();
102 66e5d4f2 jim-p
if (($specplatform['name'] == "Hyper-V") || ($specplatform['name'] == "uFW")) {
103
	echo sprintf(gettext("S.M.A.R.T. is not supported on this system (%s)."), $specplatform['descr']);
104 b4594d39 Chris Buechler
	include("foot.inc");
105
	exit;
106
}
107
108 288a2a0f Phil Davis
switch ($action) {
109 21f0f60d jim-p
	// Testing devices
110
	case 'test':
111
	{
112 5c3db960 jim-p
		$test = $_POST['type'];
113 1d92575e jim-p
		if (!in_array($test, array_keys($test_types))) {
114 ff30e319 bruno
			echo gettext("Invalid test type, bailing.");
115 24879bc6 jim-p
			return;
116
		}
117 155d9450 sbeaver
118 24879bc6 jim-p
		$output = add_colors(shell_exec($smartctl . " -t " . escapeshellarg($test) . " /dev/" . escapeshellarg($targetdev)));
119 155d9450 sbeaver
?>
120
		<div class="panel  panel-default">
121 3d7a8696 k-paulius
			<div class="panel-heading"><h2 class="panel-title"><?=gettext('Test Results')?></h2></div>
122 155d9450 sbeaver
			<div class="panel-body">
123
				<pre><?=$output?></pre>
124
			</div>
125
		</div>
126
127 1d2add88 jim-p
		<form action="diag_smart.php" method="post" name="abort">
128 155d9450 sbeaver
			<input type="hidden" name="device" value="<?=$targetdev?>" />
129
			<input type="hidden" name="action" value="abort" />
130
			<nav class="action-buttons">
131 1d92575e jim-p
				<button type="submit" name="submit" class="btn btn-danger" value="<?=gettext("Abort Tests")?>">
132 37676f4e jim-p
					<i class="fa fa-times icon-embed-btn"></i>
133
					<?=gettext("Abort Test")?>
134
				</button>
135
				<a href="<?=$_SERVER['PHP_SELF']?>" class="btn btn-info">
136
					<i class="fa fa-undo icon-embed-btn"></i>
137
					<?=gettext("Back")?>
138
				</a>
139 155d9450 sbeaver
			</nav>
140 21f0f60d jim-p
		</form>
141 155d9450 sbeaver
142
<?php
143 21f0f60d jim-p
		break;
144
	}
145
146
	// Info on devices
147
	case 'info':
148
	{
149
		$type = $_POST['type'];
150 155d9450 sbeaver
151 1d92575e jim-p
		if (!in_array($type, array_keys($info_types))) {
152 155d9450 sbeaver
			print_info_box(gettext("Invalid info type, bailing."), 'danger');
153 24879bc6 jim-p
			return;
154
		}
155 155d9450 sbeaver
156 24879bc6 jim-p
		$output = add_colors(shell_exec($smartctl . " -" . escapeshellarg($type) . " /dev/" . escapeshellarg($targetdev)));
157 155d9450 sbeaver
?>
158
		<div class="panel  panel-default">
159 f17594c7 Sjon Hortensius
			<div class="panel-heading"><h2 class="panel-title"><?=gettext('Information')?></h2></div>
160 155d9450 sbeaver
			<div class="panel-body">
161
				<pre><?=$output?></pre>
162
			</div>
163
		</div>
164
165
		<nav class="action-buttons">
166 37676f4e jim-p
			<a href="<?=$_SERVER['PHP_SELF']?>" class="btn btn-info">
167
				<i class="fa fa-undo icon-embed-btn"></i>
168
				<?=gettext("Back")?>
169
			</a>
170 155d9450 sbeaver
		</nav>
171
<?php
172 21f0f60d jim-p
		break;
173
	}
174
175
	// View logs
176
	case 'logs':
177
	{
178
		$type = $_POST['type'];
179 1d92575e jim-p
		if (!in_array($type, array_keys($log_types))) {
180 155d9450 sbeaver
			print_info_box(gettext("Invalid log type, bailing."), 'danger');
181 24879bc6 jim-p
			return;
182
		}
183 155d9450 sbeaver
184 24879bc6 jim-p
		$output = add_colors(shell_exec($smartctl . " -l " . escapeshellarg($type) . " /dev/" . escapeshellarg($targetdev)));
185 155d9450 sbeaver
?>
186
		<div class="panel  panel-default">
187 f17594c7 Sjon Hortensius
			<div class="panel-heading"><h2 class="panel-title"><?=gettext('Logs')?></h2></div>
188 155d9450 sbeaver
			<div class="panel-body">
189
				<pre><?=$output?></pre>
190
			</div>
191
		</div>
192
193
		<nav class="action-buttons">
194 37676f4e jim-p
			<a href="<?=$_SERVER['PHP_SELF']?>" class="btn btn-info">
195
				<i class="fa fa-undo icon-embed-btn"></i>
196
				<?=gettext("Back")?>
197
			</a>
198 155d9450 sbeaver
		</nav>
199
<?php
200 21f0f60d jim-p
		break;
201
	}
202
203
	// Abort tests
204
	case 'abort':
205
	{
206 24879bc6 jim-p
		$output = shell_exec($smartctl . " -X /dev/" . escapeshellarg($targetdev));
207 155d9450 sbeaver
?>
208
		<div class="panel  panel-default">
209 f17594c7 Sjon Hortensius
			<div class="panel-heading"><h2 class="panel-title"><?=gettext('Abort')?></h2></div>
210 155d9450 sbeaver
			<div class="panel-body">
211
				<pre><?=$output?></pre>
212
			</div>
213
		</div>
214
<?php
215 21f0f60d jim-p
		break;
216
	}
217
218
	// Default page, prints the forms to view info, test, etc...
219 155d9450 sbeaver
	default: {
220 0da0d43e Phil Davis
// Information
221 ea20169a jim-p
		$devs = get_smart_drive_list();
222 21f0f60d jim-p
223 d254b99e Stephen Beaver
		$form = new Form(false);
224
225
		$btnview = new Form_Button(
226 155d9450 sbeaver
			'submit',
227 faab522f Renato Botelho
			'View',
228 37676f4e jim-p
			null,
229 84d961c3 jim-p
			'fa-file-text-o'
230 d254b99e Stephen Beaver
		);
231 37676f4e jim-p
		$btnview->addClass('btn-primary');
232 4d3a1005 NOYB
		$btnview->setAttribute('id');
233
234 155d9450 sbeaver
		$section = new Form_Section('Information');
235 1d92575e jim-p
		$group = new Form_Group('Select a drive and type:');
236 ee12dd78 Peter Feichtinger
		$form->addGlobal(new Form_Input(
237 155d9450 sbeaver
			'action',
238
			null,
239
			'hidden',
240
			'info'
241 4d3a1005 NOYB
		))->setAttribute('id');
242 155d9450 sbeaver
243 1d92575e jim-p
		$group->add(new Form_Select(
244 155d9450 sbeaver
			'device',
245
			'Device: /dev/',
246
			false,
247
			array_combine($devs, $devs)
248 1d92575e jim-p
		))->setHelp(gettext("Device: /dev/"));
249 155d9450 sbeaver
250 1d92575e jim-p
		$group->add(new Form_Select(
251
			'type',
252
			'Type',
253
			false,
254
			$info_types
255
		))->setHelp(gettext("Information Type"));
256
257
		$group->add(new Form_StaticText(
258 d254b99e Stephen Beaver
			'',
259
			$btnview
260
		));
261 1d92575e jim-p
		$section->add($group);
262 155d9450 sbeaver
		$form->add($section);
263
		print($form);
264
265 1d92575e jim-p
// Logs
266 d254b99e Stephen Beaver
		$form = new Form(false);
267
268 1d92575e jim-p
		$btnview =  new Form_Button(
269 155d9450 sbeaver
			'submit',
270 1d92575e jim-p
			'View',
271 37676f4e jim-p
			null,
272 1d92575e jim-p
			'fa-file-text-o'
273 d254b99e Stephen Beaver
		);
274 1d92575e jim-p
		$btnview->addClass('btn-primary');
275
		$btnview->setAttribute('id');
276 155d9450 sbeaver
277 1d92575e jim-p
		$section = new Form_Section('View Logs');
278
		$group = new Form_Group('Select a device and log');
279 ee12dd78 Peter Feichtinger
		$form->addGlobal(new Form_Input(
280 155d9450 sbeaver
			'action',
281
			null,
282
			'hidden',
283 1d92575e jim-p
			'logs'
284 4d3a1005 NOYB
		))->setAttribute('id');
285 155d9450 sbeaver
286 1d92575e jim-p
		$group->add(new Form_Select(
287 155d9450 sbeaver
			'device',
288
			'Device: /dev/',
289
			false,
290
			array_combine($devs, $devs)
291 1d92575e jim-p
		))->setHelp(gettext("Device: /dev/"));
292 155d9450 sbeaver
293 1d92575e jim-p
		$group->add(new Form_Select(
294
			'type',
295
			'Log',
296
			false,
297
			$log_types
298
		))->setHelp(gettext("Log"));
299
300
		$group->add(new Form_StaticText(
301 d254b99e Stephen Beaver
			'',
302 1d92575e jim-p
			$btnview
303 d254b99e Stephen Beaver
		));
304
305 1d92575e jim-p
		$section->add($group);
306 155d9450 sbeaver
		$form->add($section);
307
		print($form);
308
309 1d92575e jim-p
// Tests
310 d254b99e Stephen Beaver
		$form = new Form(false);
311
312 1d92575e jim-p
		$btntest = new Form_Button(
313 155d9450 sbeaver
			'submit',
314 1d92575e jim-p
			'Test',
315 37676f4e jim-p
			null,
316 1d92575e jim-p
			'fa-wrench'
317 d254b99e Stephen Beaver
		);
318 1d92575e jim-p
		$btntest->addClass('btn-primary');
319
		$btntest->setAttribute('id');
320 155d9450 sbeaver
321 1d92575e jim-p
		$section = new Form_Section('Perform self-tests');
322
		$group = new Form_Group('Select a drive and test');
323 ee12dd78 Peter Feichtinger
		$form->addGlobal(new Form_Input(
324 155d9450 sbeaver
			'action',
325
			null,
326
			'hidden',
327 1d92575e jim-p
			'test'
328 4d3a1005 NOYB
		))->setAttribute('id');
329 155d9450 sbeaver
330 1d92575e jim-p
		$group->add(new Form_Select(
331 155d9450 sbeaver
			'device',
332
			'Device: /dev/',
333
			false,
334
			array_combine($devs, $devs)
335 1d92575e jim-p
		))->setHelp(gettext("Device: /dev/"));
336 155d9450 sbeaver
337 1d92575e jim-p
		$group->add(new Form_Select(
338
			'type',
339
			'Test',
340
			false,
341
			$test_types
342
		))->setHelp(gettext("Self-Test Type"));
343
344
		$group->add(new Form_StaticText(
345 d254b99e Stephen Beaver
			'',
346 1d92575e jim-p
			$btntest
347 d254b99e Stephen Beaver
		));
348
349 1d92575e jim-p
		$group->setHelp('Select "Conveyance" for ATA disks only.');
350
		$section->add($group);
351 155d9450 sbeaver
		$form->add($section);
352
		print($form);
353
354
// Abort
355
		$btnabort = new Form_Button(
356
			'submit',
357 1d92575e jim-p
			'Abort Tests',
358 37676f4e jim-p
			null,
359
			'fa-times'
360 155d9450 sbeaver
		);
361
362 37676f4e jim-p
		$btnabort->addClass('btn-danger')->setAttribute('id');
363 155d9450 sbeaver
364 d254b99e Stephen Beaver
		$form = new Form(false);
365 155d9450 sbeaver
366 1d92575e jim-p
		$section = new Form_Section('Abort Tests');
367 155d9450 sbeaver
368 ee12dd78 Peter Feichtinger
		$form->addGlobal(new Form_Input(
369 155d9450 sbeaver
			'action',
370
			null,
371
			'hidden',
372
			'abort'
373 4d3a1005 NOYB
		))->setAttribute('id');
374 155d9450 sbeaver
375
		$section->addInput(new Form_Select(
376
			'device',
377
			'Device: /dev/',
378
			false,
379
			array_combine($devs, $devs)
380 1d92575e jim-p
		))->setHelp(gettext("Aborts all self-tests running on the selected device."));
381 155d9450 sbeaver
382 d254b99e Stephen Beaver
		$section->addInput(new Form_StaticText(
383
			'',
384
			$btnabort
385
		));
386
387 155d9450 sbeaver
		$form->add($section);
388
		print($form);
389
390 21f0f60d jim-p
		break;
391
	}
392
}
393
394 c10cb196 Stephen Beaver
include("foot.inc");