diff options
author | jim-p <jimp@pfsense.org> | 2010-07-12 17:18:04 -0400 |
---|---|---|
committer | jim-p <jimp@pfsense.org> | 2010-07-12 17:18:04 -0400 |
commit | 21f0f60de583cd02343e5e186d75b5f367de30be (patch) | |
tree | 197481bc9de1572a49a292587ea5588e6bab7d03 | |
parent | df8d74dee38c56785c9c54385f3a4cb8f8dc74fa (diff) | |
download | pfsense-21f0f60de583cd02343e5e186d75b5f367de30be.zip pfsense-21f0f60de583cd02343e5e186d75b5f367de30be.tar.gz |
Add Diagnostics > SMART Status for ATA HDDs. (Some functionality disabled, still needs hooked into notifications, and service code for smartd)
-rw-r--r-- | usr/local/www/diag_smart.php | 436 | ||||
-rwxr-xr-x | usr/local/www/fbegin.inc | 1 |
2 files changed, 437 insertions, 0 deletions
diff --git a/usr/local/www/diag_smart.php b/usr/local/www/diag_smart.php new file mode 100644 index 0000000..47ec2b1 --- /dev/null +++ b/usr/local/www/diag_smart.php @@ -0,0 +1,436 @@ +<?php +/* + Part of pfSense + + Copyright (C) 2006, Eric Friesen + All rights reserved + + Some modifications: + Copyright (C) 2010 - Jim Pingle +*/ + +require("guiconfig.inc"); + +$pgtitle = array("Diagnostics", "S.M.A.R.T. Monitor Tools"); +$smartctl = "/usr/local/sbin/smartctl"; +$smartd = "/usr/local/sbin/smartd"; +$start_script = "/usr/local/etc/rc.d/smartd.sh"; + +include("head.inc"); +?> + +<style> +<!-- + +input { + font-family: courier new, courier; + font-weight: normal; + font-size: 9pt; +} + +pre { + border: 2px solid #435370; + background: #F0F0F0; + padding: 1em; + font-family: courier new, courier; + white-space: pre; + line-height: 10pt; + font-size: 10pt; +} + +.label { + font-family: tahoma, verdana, arial, helvetica; + font-size: 11px; + font-weight: bold; +} + +.button { + font-family: tahoma, verdana, arial, helvetica; + font-weight: bold; + font-size: 11px; +} + +--> +</style> +</head> +<body link="#0000CC" vlink="#0000CC" alink="#0000CC"> + +<?php +include("fbegin.inc"); + +// Highlates the words "PASSED", "FAILED", and "WARNING". +function add_colors($string) +{ + // To add words keep arrayes matched by numbers + $patterns[0] = '/PASSED/'; + $patterns[1] = '/FAILED/'; + $patterns[2] = '/Warning/'; + $replacements[0] = '<b><font color="#00ff00">PASSED</font></b>'; + $replacements[1] = '<b><font color="#ff0000">FAILED</font></b>'; + $replacements[2] = '<font color="#ff0000">Warning</font>'; + ksort($patterns); + ksort($replacements); + return preg_replace($patterns, $replacements, $string); +} + +// Edits smartd.conf file, adds or removes email for failed disk reporting +function update_email($email) +{ + // Did they pass an email? + if(!empty($email)) + { + // Put it in the smartd.conf file + shell_exec("/usr/bin/sed -i old 's/^DEVICESCAN.*/DEVICESCAN -H -m " . $email . "/' /usr/local/etc/smartd.conf"); + } + // Nope + else + { + // Remove email flags in smartd.conf + shell_exec("/usr/bin/sed -i old 's/^DEVICESCAN.*/DEVICESCAN/' /usr/local/etc/smartd.conf"); + } +} + +function smartmonctl($action) +{ + global $start_script; + shell_exec($start_script . $action); +} + +// What page, aka. action is being wanted +// If they "get" a page but don't pass all arguments, smartctl will throw an error +$action = (isset($_POST['action']) ? $_POST['action'] : $_GET['action']); +switch($action) +{ + // Testing devices + case 'test': + { + $test = $_POST['testType']; + $output = add_colors(shell_exec($smartctl . " -t " . $test . " /dev/" . $_POST['device'])); + echo '<pre>' . $output . ' + <form action="smartmon.php" method="post" name="abort"> + <input type="hidden" name="device" value="' . $_POST['device'] . '" /> + <input type="hidden" name="action" value="abort" /> + <input type="submit" name="submit" value="Abort" /> + </form> + </pre>'; + break; + } + + // Info on devices + case 'info': + { + $type = $_POST['type']; + $output = add_colors(shell_exec($smartctl . " -" . $type . " /dev/" . $_POST['device'])); + echo "<pre>$output</pre>"; + break; + } + + // View logs + case 'logs': + { + $type = $_POST['type']; + $output = add_colors(shell_exec($smartctl . " -l " . $type . " /dev/" . $_POST['device'])); + echo "<pre>$output</pre>"; + break; + } + + // Abort tests + case 'abort': + { + $output = shell_exec($smartctl . " -X /dev/" . $_POST['device']); + echo "<pre>$output</pre>"; + break; + } + + // Config changes, users email in xml config and write changes to smartd.conf + case 'config': + { + if(isset($_POST['submit'])) + { + // DOES NOT WORK YET... + if($_POST['testemail']) + { +// FIXME shell_exec($smartd . " -M test -m " . $config['system']['smartmonemail']); + $savemsg = "Email sent to " . $config['system']['smartmonemail']; + smartmonctl("stop"); + smartmonctl("start"); + } + else + { + $config['system']['smartmonemail'] = $_POST['smartmonemail']; + write_config(); + + // Don't know what all this means, but it addes the config changed header when config is saved + $retval = 0; + config_lock(); + if(stristr($retval, "error") <> true) + $savemsg = get_std_save_message($retval); + else + $savemsg = $retval; + config_unlock(); + + if($_POST['email']) + { + // Write the changes to the smartd.conf file + update_email($_POST['smartmonemail']); + } + + // Send sig HUP to smartd, rereads the config file + shell_exec("/usr/bin/killall -HUP smartd"); + } + } + // Was the config changed? if so , print the message + if ($savemsg) print_info_box($savemsg); + // Get users email from the xml file + $pconfig['smartmonemail'] = $config['system']['smartmonemail']; + + ?> + <!-- Print the tabs across the top --> + <table width="100%" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td> + <?php + $tab_array = array(); + $tab_array[0] = array("Information/Tests", false, $_SERVER['PHP_SELF'] . "?action=default"); + $tab_array[1] = array("Config", true, $_SERVER['PHP_SELF'] . "?action=config"); + display_top_tabs($tab_array); + ?> + </td> + </tr> + </table> +<!-- user email address --> + <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="config"> + <table width="100%" border="0" cellpadding="6" cellspacing="0"> + <tbody> + <tr> + <td colspan="2" valign="top" class="listtopic">Config</td> + </tr> + <tr> + <td width="22%" valign="top" class="vncell">Email Adress</td> + <td width="78%" class="vtable"> + <input type="text" name="smartmonemail" value="<?=$pconfig['smartmonemail']?>"/> + </td> + </tr> + <tr> + <td width="22%" valign="top"> </td> + <td width="78%"> + <input type="hidden" name="action" value="config" /> + <input type="hidden" name="email" value="true" /> + <input type="submit" name="submit" value="Save" class="formbtn" /> + </td> + </tr> + </tbody> + </table> + </form> + +<!-- test email --> + <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="config"> + <table width="100%" border="0" cellpadding="6" cellspacing="0"> + <tbody> + <tr> + <td colspan="2" valign="top" class="listtopic">Test email</td> + </tr> + <tr> + <td width="22%" valign="top" class="vncell"> </td> + <td width="78%" class="vtable"> + Send test email to <?=$config['system']['smartmonemail']?> + </td> + </tr> + <tr> + <td width="22%" valign="top"> </td> + <td width="78%"> + <input type="hidden" name="action" value="config" /> + <input type="hidden" name="testemail" value="true" /> + <input type="submit" name="submit" value="Send" class="formbtn" /> + </td> + </tr> + </tbody> + </table> + </form> + + <?php + break; + } + + // Default page, prints the forms to view info, test, etc... + default: + { + // Get all AD* and DA* (IDE and SCSI) devices currently installed and stores them in the $devs array + exec("ls /dev | grep '^[ad][da]*[0-9]$'", $devs); + ?> + <table width="100%" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td> + <?php + $tab_array = array(); + $tab_array[0] = array("Information/Tests", true, $_SERVER['PHP_SELF']); + //$tab_array[1] = array("Config", false, $_SERVER['PHP_SELF'] . "?action=config"); + display_top_tabs($tab_array); + ?> + </td> + </tr> + </table> +<!--INFO--> + <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="info"> + <table width="100%" border="0" cellpadding="6" cellspacing="0"> + <tbody> + <tr> + <td colspan="2" valign="top" class="listtopic">Info</td> + </tr> + <tr> + <td width="22%" valign="top" class="vncell">Info type</td> + <td width="78%" class="vtable"> + <input type="radio" name="type" value="i" />Info<br /> + <input type="radio" name="type" value="H" checked />Health<br /> + <input type="radio" name="type" value="c" />SMART Capabilities<br /> + <input type="radio" name="type" value="A" />Attributes<br /> + <input type="radio" name="type" value="a" />All<br /> + </td> + </tr> + <tr> + <td width="22%" valign="top" class="vncell">Device: /dev/</td> + <td width="78%" class="vtable"> + <select name="device"> + <?php + foreach($devs as $dev) + { + echo "<option value=" . $dev . ">" . $dev; + } + ?> + </select> + </td> + </tr> + <tr> + <td width="22%" valign="top"> </td> + <td width="78%"> + <input type="hidden" name="action" value="info" /> + <input type="submit" name="submit" value="View" class="formbtn" /> + </td> + </tr> + </tbody> + </table> + </form> +<!--TESTS--> + <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="tests"> + <table width="100%" border="0" cellpadding="6" cellspacing="0"> + <tbody> + <tr> + <td colspan="2" valign="top" class="listtopic">Perform Self Tests</td> + </tr> + <tr> + <td width="22%" valign="top" class="vncell">Test type</td> + <td width="78%" class="vtable"> + <input type="radio" name="testType" value="offline" />Offline<br /> + <input type="radio" name="testType" value="short" checked />Short<br /> + <input type="radio" name="testType" value="long" />Long<br /> + <input type="radio" name="testType" value="conveyance" />Conveyance (ATA Disks Only)<br /> + </td> + </tr> + <tr> + <td width="22%" valign="top" class="vncell">Device: /dev/</td> + <td width="78%" class="vtable"> + <select name="device"> + <?php + foreach($devs as $dev) + { + echo "<option value=" . $dev . ">" . $dev; + } + ?> + </select> + </td> + </tr> + <tr> + <td width="22%" valign="top"> </td> + <td width="78%"> + <input type="hidden" name="action" value="test" /> + <input type="submit" name="submit" value="Test" class="formbtn" /> + </td> + </tr> + </tbody> + </table> + </form> +<!--LOGS--> + <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="logs"> + <table width="100%" border="0" cellpadding="6" cellspacing="0"> + <tbody> + <tr> + <td colspan="2" valign="top" class="listtopic">View Logs</td> + </tr> + <tr> + <td width="22%" valign="top" class="vncell">Log type</td> + <td width="78%" class="vtable"> + <input type="radio" name="type" value="error" checked />Error<br /> + <input type="radio" name="type" value="selftest" />Self Test<br /> + </td> + </tr> + <tr> + <td width="22%" valign="top" class="vncell">Device: /dev/</td> + <td width="78%" class="vtable"> + <select name="device"> + <?php + foreach($devs as $dev) + { + echo "<option value=" . $dev . ">" . $dev; + } + ?> + </select> + </td> + </tr> + <tr> + <td width="22%" valign="top"> </td> + <td width="78%"> + <input type="hidden" name="action" value="logs" /> + <input type="submit" name="submit" value="View" class="formbtn" /> + </td> + </tr> + </tbody> + </table> + </form> +<!--ABORT--> + <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="abort"> + <table width="100%" border="0" cellpadding="6" cellspacing="0"> + <tbody> + <tr> + <td colspan="2" valign="top" class="listtopic">Abort tests</td> + </tr> + <tr> + <td width="22%" valign="top" class="vncell">Device: /dev/</td> + <td width="78%" class="vtable"> + <select name="device"> + <?php + foreach($devs as $dev) + { + echo "<option value=" . $dev . ">" . $dev; + } + ?> + </select> + </td> + </tr> + <tr> + <td width="22%" valign="top"> </td> + <td width="78%"> + <input type="hidden" name="action" value="abort" /> + <input type="submit" name="submit" value="Abort" class="formbtn" onclick="return confirm('Do you really want to abort the test?')" /> + </td> + </tr> + </tbody> + </table> + </form> + + <?php + break; + } +} + +// print back button on pages +if(isset($_POST['submit']) && $_POST['submit'] != "Save") +{ + echo '<br /><a href="' . $_SERVER['PHP_SELF'] . '">Back</a>'; +} +?> +<br /> +<?php if ($ulmsg) echo "<p><strong>" . $ulmsg . "</strong></p>\n"; ?> + +<?php include("fend.inc"); ?> +</body> +</html>
\ No newline at end of file diff --git a/usr/local/www/fbegin.inc b/usr/local/www/fbegin.inc index c775aaa..8552fbc 100755 --- a/usr/local/www/fbegin.inc +++ b/usr/local/www/fbegin.inc @@ -193,6 +193,7 @@ $diagnostics_menu[] = array("pfTOP", "/diag_system_pftop.php"); $diagnostics_menu[] = array("Reboot", "/reboot.php"); $diagnostics_menu[] = array("Routes", "/diag_routes.php"); $diagnostics_menu[] = array("Show Bogons", "/diag_showbogons.php"); +$diagnostics_menu[] = array("SMART Status", "/diag_smart.php"); $diagnostics_menu[] = array("States", "/diag_dump_states.php"); $diagnostics_menu[] = array("States Summary", "/diag_states_summary.php"); $diagnostics_menu[] = array("System Activity", "/diag_system_activity.php"); |