aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/Makefile.am2
-rw-r--r--plugins/check_ide-smart.c302
2 files changed, 176 insertions, 128 deletions
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 8f25623d..683cd51b 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -21,7 +21,7 @@ check_tcp_programs = check_ftp check_imap check_nntp check_pop check_udp2 \
EXTRA_PROGRAMS = check_mysql check_radius check_pgsql check_snmp check_hpjd \
check_swap check_fping check_ldap check_game check_dig \
- check_nagios check_by_ssh check_dns check_nt
+ check_nagios check_by_ssh check_dns check_nt check_ide-smart
EXTRA_DIST = t utils.c netutils.c popen.c utils.h netutils.h popen.h common.h \
getaddrinfo.c getaddrinfo.h gethostbyname.c gethostbyname.h
diff --git a/plugins/check_ide-smart.c b/plugins/check_ide-smart.c
index 47d9d840..ecd8a4e1 100644
--- a/plugins/check_ide-smart.c
+++ b/plugins/check_ide-smart.c
@@ -16,7 +16,7 @@
* - Returns 2 on prefailure
* - Returns -1 not too often
*
- * ide-smart 1.3 - IDE S.M.A.R.T. cheking tool
+ * ide-smart 1.3 - IDE S.M.A.R.T. checking tool
* Copyright (C) 1998-1999 Ragnar Hojland Espinosa <ragnar@lightside.dhis.org>
* 1998 Gadi Oxman <gadio@netvision.net.il>
*
@@ -33,15 +33,13 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
+ */
-#include <stdio.h>
-#include <sys/types.h>
+#include "common.h"
+#include "utils.h"
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
#include <linux/hdreg.h>
#include <linux/types.h>
#include <errno.h>
@@ -56,13 +54,15 @@
#define ADVISORY 1
#define OPERATIONAL 0
#define UNKNOWN -1
- typedef struct threshold_s
+
+typedef struct threshold_s
{
__u8 id;
__u8 threshold;
__u8 reserved[10];
}
__attribute__ ((packed)) threshold_t;
+
typedef struct thresholds_s
{
__u16 revision;
@@ -72,6 +72,7 @@ typedef struct thresholds_s
__u8 checksum;
}
__attribute__ ((packed)) thresholds_t;
+
typedef struct value_s
{
__u8 id;
@@ -80,6 +81,7 @@ typedef struct value_s
__u8 vendor[8];
}
__attribute__ ((packed)) value_t;
+
typedef struct values_s
{
__u16 revision;
@@ -95,49 +97,46 @@ typedef struct values_s
__u8 checksum;
}
__attribute__ ((packed)) values_t;
+
struct
{
__u8 value;
char *text;
- }
+}
+
offline_status_text[] =
-{
- {
- 0x00, "NeverStarted"}
- , {
- 0x02, "Completed"}
- , {
- 0x04, "Suspended"}
- , {
- 0x05, "Aborted"}
- , {
- 0x06, "Failed"}
- , {
- 0, 0}
-};
+ {
+ {0x00, "NeverStarted"},
+ {0x02, "Completed"},
+ {0x04, "Suspended"},
+ {0x05, "Aborted"},
+ {0x06, "Failed"},
+ {0, 0}
+ };
+
struct
{
__u8 value;
char *text;
- }
+}
+
smart_command[] =
-{
- {
- SMART_ENABLE, "SMART_ENABLE"}
- , {
- SMART_DISABLE, "SMART_DISABLE"}
- , {
- SMART_IMMEDIATE_OFFLINE, "SMART_IMMEDIATE_OFFLINE"}
- , {
- SMART_AUTO_OFFLINE, "SMART_AUTO_OFFLINE"}
-, };
+ {
+ {SMART_ENABLE, "SMART_ENABLE"},
+ {SMART_DISABLE, "SMART_DISABLE"},
+ {SMART_IMMEDIATE_OFFLINE, "SMART_IMMEDIATE_OFFLINE"},
+ {SMART_AUTO_OFFLINE, "SMART_AUTO_OFFLINE"}
+ };
/* Index to smart_command table, keep in order */
enum SmartCommand
-{ SMART_CMD_ENABLE, SMART_CMD_DISABLE, SMART_CMD_IMMEDIATE_OFFLINE,
+ { SMART_CMD_ENABLE,
+ SMART_CMD_DISABLE,
+ SMART_CMD_IMMEDIATE_OFFLINE,
SMART_CMD_AUTO_OFFLINE
-};
+ };
+
char *
get_offline_text (int status)
{
@@ -149,19 +148,25 @@ get_offline_text (int status)
}
return "unknown";
}
+
int
smart_read_values (int fd, values_t * values)
{
- __u8 args[4 + 512] = {
- WIN_SMART, 0, SMART_READ_VALUES, 1,};
+ int e;
+ __u8 args[4 + 512];
+ args[0] = WIN_SMART;
+ args[1] = 0;
+ args[2] = SMART_READ_VALUES;
+ args[3] = 1;
if (ioctl (fd, HDIO_DRIVE_CMD, &args)) {
- int e = errno;
- printf ("Critical: SMART_READ_VALUES: %s\n", strerror (errno));
+ e = errno;
+ printf (_("Critical: SMART_READ_VALUES: %s\n"), strerror (errno));
return e;
}
memcpy (values, args + 4, 512);
return 0;
}
+
int
values_not_passed (values_t * p, thresholds_t * t)
{
@@ -184,6 +189,7 @@ values_not_passed (values_t * p, thresholds_t * t)
}
return (passed ? -failed : 2);
}
+
int
net_saint (values_t * p, thresholds_t * t)
{
@@ -219,34 +225,40 @@ net_saint (values_t * p, thresholds_t * t)
}
switch (status) {
case PREFAILURE:
- printf ("Critical: %d Harddrive PreFailure%cDetected! "
- "%d/%d tests failed.\n", prefailure, prefailure > 1 ? 's' : ' ',
- failed, total);
+ printf (_("Critical: %d Harddrive PreFailure%cDetected! %d/%d tests failed.\n"),
+ prefailure,
+ prefailure > 1 ? 's' : ' ',
+ failed,
+ total);
break;
case ADVISORY:
- printf ("Warning: %d Harddrive Advisor%s Detected. "
- "%d/%d tests failed.\n", advisory, advisory > 1 ? "ies" : "y",
- failed, total);
+ printf (_("Warning: %d Harddrive Advisor%s Detected. %d/%d tests failed.\n"),
+ advisory,
+ advisory > 1 ? "ies" : "y",
+ failed,
+ total);
break;
case OPERATIONAL:
- printf ("Status: Operational (%d/%d tests passed)\n", passed, total);
+ printf (_("Status: Operational (%d/%d tests passed)\n"), passed, total);
break;
default:
- printf ("Error: Status '%d' uknown. %d/%d tests passed\n", status,
- passed, total);
+ printf (_("Error: Status '%d' uknown. %d/%d tests passed\n"), status,
+ passed, total);
status = -1;
break;
}
return status;
}
+
void
print_value (value_t * p, threshold_t * t)
{
printf ("Id=%3d, Status=%2d {%s , %s}, Value=%3d, Threshold=%3d, %s\n",
- p->id, p->status, p->status & 1 ? "PreFailure" : "Advisory ",
- p->status & 2 ? "OnLine " : "OffLine", p->value, t->threshold,
- p->value > t->threshold ? "Passed" : "Failed");
+ p->id, p->status, p->status & 1 ? "PreFailure" : "Advisory ",
+ p->status & 2 ? "OnLine " : "OffLine", p->value, t->threshold,
+ p->value > t->threshold ? "Passed" : "Failed");
}
+
void
print_values (values_t * p, thresholds_t * t)
{
@@ -259,18 +271,26 @@ print_values (values_t * p, thresholds_t * t)
}
}
printf
- ("OffLineStatus=%d {%s}, AutoOffLine=%s, OffLineTimeout=%d minutes\n",
- p->offline_status, get_offline_text (p->offline_status & 0x7f),
- (p->offline_status & 0x80 ? "Yes" : "No"), p->offline_timeout / 60);
- printf ("OffLineCapability=%d {%s %s %s}\n", p->offline_capability,
- p->offline_capability & 1 ? "Immediate" : "",
- p->offline_capability & 2 ? "Auto" : "",
- p->offline_capability & 4 ? "AbortOnCmd" : "SuspendOnCmd");
- printf ("SmartRevision=%d, CheckSum=%d, SmartCapability=%d {%s %s}\n",
- p->revision, p->checksum, p->smart_capability,
- p->smart_capability & 1 ? "SaveOnStandBy" : "",
- p->smart_capability & 2 ? "AutoSave" : "");
+ (_("OffLineStatus=%d {%s}, AutoOffLine=%s, OffLineTimeout=%d minutes\n"),
+ p->offline_status,
+ get_offline_text (p->offline_status & 0x7f),
+ (p->offline_status & 0x80 ? "Yes" : "No"),
+ p->offline_timeout / 60);
+ printf
+ (_("OffLineCapability=%d {%s %s %s}\n"),
+ p->offline_capability,
+ p->offline_capability & 1 ? "Immediate" : "",
+ p->offline_capability & 2 ? "Auto" : "",
+ p->offline_capability & 4 ? "AbortOnCmd" : "SuspendOnCmd");
+ printf
+ (_("SmartRevision=%d, CheckSum=%d, SmartCapability=%d {%s %s}\n"),
+ p->revision,
+ p->checksum,
+ p->smart_capability,
+ p->smart_capability & 1 ? "SaveOnStandBy" : "",
+ p->smart_capability & 2 ? "AutoSave" : "");
}
+
void
print_thresholds (thresholds_t * p)
{
@@ -281,39 +301,49 @@ print_thresholds (thresholds_t * p)
for (i = 0; i < NR_ATTRIBUTES; i++) {
if (threshold->id) {
printf ("Id=%3d, Threshold=%3d\n", threshold->id,
- threshold->threshold); }
+ threshold->threshold); }
++threshold;
}
printf ("CheckSum=%d\n", p->checksum);
}
+
int
smart_cmd_simple (int fd, enum SmartCommand command, __u8 val0,
char show_error)
{
- __u8 args[4] = {
- WIN_SMART, val0, smart_command[command].value, 0};
int e = 0;
+ __u8 args[4];
+ args[0] = WIN_SMART;
+ args[1] = val0;
+ args[2] = smart_command[command].value;
+ args[3] = 0;
if (ioctl (fd, HDIO_DRIVE_CMD, &args)) {
e = errno;
if (show_error) {
- printf ("Critical: %s: %s\n", smart_command[command].text,
- strerror (errno)); }
+ printf (_("Critical: %s: %s\n"), smart_command[command].text, strerror (errno));
+ }
}
return e;
}
+
int
smart_read_thresholds (int fd, thresholds_t * thresholds)
{
- __u8 args[4 + 512] = {
- WIN_SMART, 0, SMART_READ_THRESHOLDS, 1,};
+ int e;
+ __u8 args[4 + 512];
+ args[0] = WIN_SMART;
+ args[1] = 0;
+ args[2] = SMART_READ_THRESHOLDS;
+ args[3] = 1;
if (ioctl (fd, HDIO_DRIVE_CMD, &args)) {
- int e = errno;
- printf ("Critical: SMART_READ_THRESHOLDS: %s\n", strerror (errno));
+ e = errno;
+ printf (_("Critical: SMART_READ_THRESHOLDS: %s\n"), strerror (errno));
return e;
}
memcpy (thresholds, args + 4, 512);
return 0;
}
+
void
show_version ()
{
@@ -321,18 +351,28 @@ show_version ()
printf ("Nagios feature - Robert Dale <rdale@digital-mission.com>\n");
printf ("(C) 1999 Ragnar Hojland Espinosa <ragnar@lightside.dhis.org>\n");
}
+
void
show_help ()
{
- printf ("Usage: check_ide-smart [DEVICE] [OPTION]\n"
- " -d, --device=DEVICE Select device DEVICE\n"
- " -i, --immediate Perform immediately offline tests\n"
- " -q, --quiet-check Returns the number of failed tests\n"
- " -1, --auto-on Turn on automatic offline tests\n"
- " -0, --auto-off Turn off automatic offline tests\n"
- " -n, --net-saint Output suitable for Net Saint\n"
- " -h, --help\n" " -V, --version\n");
+ printf (_("\
+Usage: check_ide-smart [DEVICE] [OPTION]\n\
+ -d, --device=DEVICE\n\
+ Select device DEVICE\n\
+ -i, --immediate\n\
+ Perform immediately offline tests\n\
+ -q, --quiet-check\n\
+ Returns the number of failed tests\n\
+ -1, --auto-on\n\
+ Turn on automatic offline tests\n\
+ -0, --auto-off\n\
+ Turn off automatic offline tests\n\
+ -n, --net-saint\n\
+ Output suitable for Net Saint\n\
+ -h, --help\n\
+ -V, --version\n"));
}
+
int
main (int argc, char *argv[])
{
@@ -340,9 +380,13 @@ main (int argc, char *argv[])
int command = -1;
int o, longindex;
int retval = 0;
-
- const struct option longopts[] = {
- {"device", required_argument, 0, 'd'},
+
+ thresholds_t thresholds;
+ values_t values;
+ int fd;
+
+ static struct option longopts[] = {
+ {"device", required_argument, 0, 'd'},
{"immediate", no_argument, 0, 'i'},
{"quiet-check", no_argument, 0, 'q'},
{"auto-on", no_argument, 0, '1'},
@@ -351,13 +395,14 @@ main (int argc, char *argv[])
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'V'}, {0, 0, 0, 0}
};
-
- while (1) {
+
+ while (1) {
- o = getopt_long (argc, argv, "+d:iq10nhV", longopts, &longindex);
+ o = getopt_long (argc, argv, "+d:iq10nhV", longopts, &longindex);
- if (o == -1 || o == EOF)
+ if (o == -1 || o == EOF)
break;
+
switch (o) {
case 'd':
device = optarg;
@@ -384,57 +429,60 @@ main (int argc, char *argv[])
show_version ();
return 0;
default:
- printf ("Try `%s --help' for more information.\n", argv[0]);
+ printf (_("Try `%s --help' for more information.\n"), argv[0]);
return 1;
}
+
if (optind < argc) {
device = argv[optind];
}
+
if (!device) {
show_help ();
show_version ();
return -1;
}
- if (1) {
- thresholds_t thresholds;
- values_t values;
- int fd = open (device, O_RDONLY);
- if (fd < 0) {
- printf ("Critical: Couldn't open device: %s\n", strerror (errno));
- return 2;
- }
- if (smart_cmd_simple (fd, SMART_CMD_ENABLE, 0, TRUE)) {
- printf ("Critical: SMART_CMD_ENABLE\n");
- return 2;
- }
- switch (command) {
- case 0:
- retval = smart_cmd_simple (fd, SMART_CMD_AUTO_OFFLINE, 0, TRUE);
- break;
- case 1:
- retval = smart_cmd_simple (fd, SMART_CMD_AUTO_OFFLINE, 0xF8, TRUE);
- break;
- case 2:
- retval = smart_cmd_simple (fd, SMART_CMD_IMMEDIATE_OFFLINE, 0, TRUE);
- break;
- case 3:
- smart_read_values (fd, &values);
- smart_read_thresholds (fd, &thresholds);
- retval = values_not_passed (&values, &thresholds);
- break;
- case 4:
- smart_read_values (fd, &values);
- smart_read_thresholds (fd, &thresholds);
- retval = net_saint (&values, &thresholds);
- break;
- default:
- smart_read_values (fd, &values);
- smart_read_thresholds (fd, &thresholds);
- print_values (&values, &thresholds);
- break;
- }
- close (fd);
+
+ fd = open (device, O_RDONLY);
+
+ if (fd < 0) {
+ printf (_("Critical: Couldn't open device: %s\n"), strerror (errno));
+ return 2;
+ }
+
+ if (smart_cmd_simple (fd, SMART_CMD_ENABLE, 0, TRUE)) {
+ printf (_("Critical: SMART_CMD_ENABLE\n"));
+ return 2;
+ }
+
+ switch (command) {
+ case 0:
+ retval = smart_cmd_simple (fd, SMART_CMD_AUTO_OFFLINE, 0, TRUE);
+ break;
+ case 1:
+ retval = smart_cmd_simple (fd, SMART_CMD_AUTO_OFFLINE, 0xF8, TRUE);
+ break;
+ case 2:
+ retval = smart_cmd_simple (fd, SMART_CMD_IMMEDIATE_OFFLINE, 0, TRUE);
+ break;
+ case 3:
+ smart_read_values (fd, &values);
+ smart_read_thresholds (fd, &thresholds);
+ retval = values_not_passed (&values, &thresholds);
+ break;
+ case 4:
+ smart_read_values (fd, &values);
+ smart_read_thresholds (fd, &thresholds);
+ retval = net_saint (&values, &thresholds);
+ break;
+ default:
+ smart_read_values (fd, &values);
+ smart_read_thresholds (fd, &thresholds);
+ print_values (&values, &thresholds);
+ break;
}
- return retval;
+ close (fd);
}
+ return retval;
+}