/*
Check_cisco checks various snmp statistics related to Cisco devices.
Copyright (C) 2012 Jason Harris
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include
#include
#include
#include
/* Define useful variables */
#define MISSING_OPTIONS "Unknown or missing options.\n"
#define RESULT_OK 0
#define RESULT_WARNING 1
#define RESULT_CRITICAL 2
#define RESULT_UNKNOWN 3
/* Global Variables */
char retstr[120];
int exitVal = RESULT_UNKNOWN, warn = 80, crit = 90;
char mode[20];
/* Function Definitions */
char *checkMem(struct snmp_session* session);
char *checkCPU(struct snmp_session* session);
char *checkFailover(struct snmp_session* session);
char *checkSessions(struct snmp_session* session);
char *checkInterfaceTraffic(struct snmp_session* session);
char *checkTemp(struct snmp_session* session);
char *check3750Temp(struct snmp_session* session);
/*
Print usage info.
*/
void usage(void) {
fprintf(stderr, "USAGE: check_cisco ");
snmp_parse_args_usage(stderr);
fprintf(stderr, " [OID]\n\n");
snmp_parse_args_descriptions(stderr);
fprintf(stderr, "Application specific options.\n");
fprintf(stderr, " -C APPOPTS\n");
fprintf(stderr, "\t\t\t c: Set the critical threshold.\n");
fprintf(stderr, "\t\t\t m: Set the operation mode [cpu|failover|memory|sessions|temp|3750temp]\n");
fprintf(stderr, "\t\t\t w: Set the warning threshold.\n");
}
/*
Process input options.
*/
void optProc(int argc, char *const *argv, int opt) {
switch (opt) {
case 'C':
while (*optarg) {
switch (*optarg++) {
case 'c':
crit = atoi(argv[optind++]);
break;
case 'm':
strcpy(mode, argv[optind++]);
break;
case 'w':
warn = atoi(argv[optind++]);
break;
}
}
break;
}
}
/* Main program
Queries various SNMP values on cisco devices.
*/
int main(int argc, char *argv[]) {
char* output;
struct snmp_session session;
char arg;
int i;
long snmpVer;
/* Initialize and build snmp session, add version, community, host, etc */
init_snmp("Cisco_checks");
snmp_sess_init( &session );
switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) {
case -3:
exit(1);
case -2:
exit(0);
case -1:
usage();
exit(1);
default:
break;
}
/* Check warning/critical test values to verify they are within the appropriate ranges */
if ((crit > 100) && (strcmp(mode, "sessions"))) {
printf("Critical threshold should be less than 100!\n");
usage();
exit(RESULT_UNKNOWN);
}
else if (crit < 0) {
printf("Critical threshould must be greater than 0!\n");
usage();
exit(RESULT_UNKNOWN);
}
else if ((warn < 0) && (strcmp(mode, "sessions"))) {
printf("Warning threshold must be greater than or equal to 0!\n");
usage();
exit(RESULT_UNKNOWN);
}
else if (warn > crit) {
printf("Warning threshold must not be greater than critical threshold!\n");
usage();
exit(RESULT_UNKNOWN);
}
/* Check mode selection and run appropriate function */
if ((strcmp(mode, "memory")) == 0) {
output = checkMem(&session);
}
else if ((strcmp(mode, "cpu")) == 0) {
output = checkCPU(&session);
}
else if ((strcmp(mode, "failover")) == 0) {
output = checkFailover(&session);
}
else if ((strcmp(mode, "sessions")) == 0) {
output = checkSessions(&session);
}
else if ((strcmp(mode, "temp")) == 0) {
output = checkTemp(&session);
}
else if ((strcmp(mode, "3750temp")) == 0) {
output = check3750Temp(&session);
}
else {
printf(MISSING_OPTIONS);
usage();
exit(RESULT_UNKNOWN);
}
printf("%s", output);
return exitVal;
}
/*
Check the failover status of a Cisco Firewall.
*/
char *checkFailover(struct snmp_session* session) {
struct snmp_session *s_handle = NULL;
struct snmp_pdu *pdu = NULL;
struct snmp_pdu *reply = NULL;
struct variable_list *vars;
int status, primStatus = 0, secStatus = 0;
char primaryStatus[10], secondaryStatus[10];
oid mib_primary[] = {1, 3, 6, 1, 4, 1, 9, 9, 147, 1, 2, 1, 1, 1, 3, 6};
oid mib_secondary[] = {1, 3, 6, 1, 4, 1, 9, 9, 147, 1, 2, 1, 1, 1, 3, 7};
/* Open snmp session, print error if one occurs */
s_handle = snmp_open( session );
if (!s_handle) {
printf("ERROR - Problem opening session!\n");
exit(RESULT_CRITICAL);
}
/* Create PDU and add desired OIDs */
pdu = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(pdu, mib_primary, OID_LENGTH(mib_primary));
snmp_add_null_var(pdu, mib_secondary, OID_LENGTH(mib_secondary));
/* Check if snmp synchs correctly, if not exit the program */
status = snmp_synch_response(s_handle, pdu, &reply);
if (status == STAT_ERROR) {
printf("ERROR - Problem while querying device!\n");
exit(RESULT_CRITICAL);
}
else if (status == STAT_TIMEOUT) {
printf("ERROR - Connection timed out!\n");
exit(RESULT_CRITICAL);
}
else if (reply->errstat != SNMP_ERR_NOERROR) {
switch (reply->errstat) {
case SNMP_ERR_NOSUCHNAME:
printf("ERROR - Device does not support that feature!\n");
break;
case SNMP_ERR_TOOBIG:
printf("ERROR - Result generated too much data!\n");
break;
case SNMP_ERR_READONLY:
printf("ERROR - Value is read only!\n");
break;
case SNMP_ERR_BADVALUE:
case SNMP_ERR_GENERR:
case SNMP_ERR_NOACCESS:
case SNMP_ERR_WRONGTYPE:
case SNMP_ERR_WRONGLENGTH:
case SNMP_ERR_WRONGENCODING:
case SNMP_ERR_WRONGVALUE:
case SNMP_ERR_NOCREATION:
case SNMP_ERR_INCONSISTENTVALUE:
case SNMP_ERR_RESOURCEUNAVAILABLE:
case SNMP_ERR_COMMITFAILED:
case SNMP_ERR_UNDOFAILED:
case SNMP_ERR_AUTHORIZATIONERROR:
case SNMP_ERR_NOTWRITABLE:
case SNMP_ERR_INCONSISTENTNAME:
default:
printf("ERROR - Unknown error!\n");
}
exit(RESULT_CRITICAL);
}
/* Read out the data returned from the device, exit if data returned is NULL */
vars = reply->variables;
if (vars->type == ASN_NULL) {
printf("ERROR - No data recieved from device\n");
exit(RESULT_UNKNOWN);
}
primStatus = (int)(*vars->val.integer); /* store the failover status for the primary firewall */
vars = vars->next_variable;
if (vars->type == ASN_NULL) {
printf("ERROR - No data recieved from device\n");
exit(RESULT_UNKNOWN);
}
secStatus = (int)(*vars->val.integer); /* store the failover status for the secondary firewall */
/* Check the primary status and secondary status, and set return values */
switch (primStatus) {
case 3:
strcpy(primaryStatus, "Down");
switch (secStatus) {
case 3:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Down");
break;
case 4:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Error");
break;
case 9:
exitVal = RESULT_WARNING;
strcpy(secondaryStatus, "Active");
break;
case 10:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Standby");
break;
default:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Unknown");
}
break;
case 4:
strcpy(primaryStatus, "Error");
switch (secStatus) {
case 3:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Down");
break;
case 4:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Error");
break;
case 9:
exitVal = RESULT_WARNING;
strcpy(secondaryStatus, "Active");
break;
case 10:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Standby");
break;
default:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Unknown");
}
break;
case 9:
strcpy(primaryStatus, "Active");
switch (secStatus) {
case 3:
exitVal = RESULT_WARNING;
strcpy(secondaryStatus, "Down");
break;
case 4:
exitVal = RESULT_WARNING;
strcpy(secondaryStatus, "Error");
break;
case 9:
exitVal = RESULT_OK;
strcpy(secondaryStatus, "Active");
break;
case 10:
exitVal = RESULT_OK;
strcpy(secondaryStatus, "Standby");
break;
default:
exitVal = RESULT_WARNING;
strcpy(secondaryStatus, "Unknown");
}
break;
case 10:
strcpy(primaryStatus, "Standby");
switch (secStatus) {
case 3:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Down");
break;
case 4:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Error");
break;
case 9:
exitVal = RESULT_WARNING;
strcpy(secondaryStatus, "Active");
break;
case 10:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Standby");
break;
default:
exitVal = RESULT_CRITICAL;
strcpy(secondaryStatus, "Unknown");
}
break;
default:
strcpy(secondaryStatus, "Unknown");
strcpy(primaryStatus, "Unknown");
exitVal = RESULT_UNKNOWN;
}
/* Check status (OK/WARN/CRIT) and print appropriate message */
switch (exitVal) {
case RESULT_OK:
sprintf(retstr, "OK - Primary: %s, Secondary: %s\n", primaryStatus, secondaryStatus);
break;
case RESULT_WARNING:
sprintf(retstr, "WARNING - Primary: %s, Secondary: %s\n", primaryStatus, secondaryStatus);
break;
case RESULT_CRITICAL:
sprintf(retstr, "CRITICAL - Primary: %s, Secondary: %s\n", primaryStatus, secondaryStatus);
break;
default:
sprintf(retstr, "Either no value was returned from the device or no status could be determined.\n");
}
/* Release the reserved resources as they are no longer needed */
snmp_free_pdu(reply);
snmp_close(s_handle);
return retstr;
}
/*
Check the number of current active open sessions.
*/
char *checkSessions(struct snmp_session* session) {
struct snmp_session *s_handle = NULL;
struct snmp_pdu *pdu = NULL;
struct snmp_pdu *reply = NULL;
struct variable_list *vars;
int status, cur_sessions, max_sessions;
oid mib_cur_sessions[] = { 1, 3, 6, 1, 4, 1, 9, 9, 147, 1, 2, 2, 2, 1, 5, 40, 6 };
oid mib_max_sessions[] = { 1, 3, 6, 1, 4, 1, 9, 9, 147, 1, 2, 2, 2, 1, 5, 40, 7 };
/* Open snmp session, print error if one occurs */
s_handle = snmp_open( session );
if (!s_handle) {
printf("ERROR - Problem opening session!\n");
exit(RESULT_CRITICAL);
}
pdu = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(pdu, mib_cur_sessions, OID_LENGTH(mib_cur_sessions));
snmp_add_null_var(pdu, mib_max_sessions, OID_LENGTH(mib_max_sessions));
/* Check if snmp synchs correctly, if not exit the program */
status = snmp_synch_response(s_handle, pdu, &reply);
if (status == STAT_ERROR) {
printf("ERROR - Problem while querying device!\n");
exit(RESULT_CRITICAL);
}
else if (status == STAT_TIMEOUT) {
printf("ERROR - Connection timed out!\n");
exit(RESULT_CRITICAL);
}
else if (reply->errstat != SNMP_ERR_NOERROR) {
switch (reply->errstat) {
case SNMP_ERR_NOSUCHNAME:
printf("ERROR - Device does not support that feature!\n");
break;
case SNMP_ERR_TOOBIG:
printf("ERROR - Result generated too much data!\n");
break;
case SNMP_ERR_READONLY:
printf("ERROR - Value is read only!\n");
break;
case SNMP_ERR_BADVALUE:
case SNMP_ERR_GENERR:
case SNMP_ERR_NOACCESS:
case SNMP_ERR_WRONGTYPE:
case SNMP_ERR_WRONGLENGTH:
case SNMP_ERR_WRONGENCODING:
case SNMP_ERR_WRONGVALUE:
case SNMP_ERR_NOCREATION:
case SNMP_ERR_INCONSISTENTVALUE:
case SNMP_ERR_RESOURCEUNAVAILABLE:
case SNMP_ERR_COMMITFAILED:
case SNMP_ERR_UNDOFAILED:
case SNMP_ERR_AUTHORIZATIONERROR:
case SNMP_ERR_NOTWRITABLE:
case SNMP_ERR_INCONSISTENTNAME:
default:
printf("ERROR - Unknown error!\n");
}
exit(RESULT_CRITICAL);
}
vars = reply->variables;
if (vars->type == ASN_NULL) {
printf("ERROR - No data recieved from device\n");
exit(RESULT_UNKNOWN);
}
cur_sessions = (int)*vars->val.integer;
vars = vars->next_variable;
max_sessions = (int)*vars->val.integer;
if (cur_sessions > crit) {
exitVal=RESULT_CRITICAL;
sprintf(retstr, "CRITICAL - Current Sessions: %i, Max Sessions: %i\n", cur_sessions, max_sessions);
}
else if (cur_sessions > warn) {
exitVal=RESULT_WARNING;
sprintf(retstr, "WARNING - Current Sessions: %i, Max Sessions: %i\n", cur_sessions, max_sessions);
}
else {
exitVal = RESULT_OK;
sprintf(retstr, "OK - Current Sessions: %i, Max Sessions: %i\n", cur_sessions, max_sessions);
}
snmp_free_pdu(reply);
snmp_close(s_handle);
return retstr;
}
/*
Check the CPU load percentage on Cisco Devices.
*/
char *checkCPU(struct snmp_session* session) {
struct snmp_session *s_handle = NULL;
struct snmp_pdu *pdu = NULL;
struct snmp_pdu *reply = NULL;
struct variable_list *vars;
int status, CPU5sec, CPU1min, CPU5min;
oid mib_CPU5sec[] = {1, 3, 6, 1, 4, 1, 9, 9, 109, 1, 1, 1, 1, 3, 1};
oid mib_CPU1min[] = {1, 3, 6, 1, 4, 1, 9, 9, 109, 1, 1, 1, 1, 4, 1};
oid mib_CPU5min[] = {1, 3, 6, 1, 4, 1, 9, 9, 109, 1, 1, 1, 1, 5, 1};
/* Open snmp session, print error if one occurs */
s_handle = snmp_open( session );
if (!s_handle) {
printf("ERROR - Problem opening session!\n");
exit(RESULT_CRITICAL);
}
/* Build PDU and add desired OID's */
pdu = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(pdu, mib_CPU5sec, OID_LENGTH(mib_CPU5sec));
snmp_add_null_var(pdu, mib_CPU1min, OID_LENGTH(mib_CPU1min));
snmp_add_null_var(pdu, mib_CPU5min, OID_LENGTH(mib_CPU5min));
/* Check if snmp synchs correctly, if not exit the program */
status = snmp_synch_response(s_handle, pdu, &reply);
if (status == STAT_ERROR) {
printf("ERROR - Problem while querying device!\n");
exit(RESULT_CRITICAL);
}
else if (status == STAT_TIMEOUT) {
printf("ERROR - Connection timed out!\n");
exit(RESULT_CRITICAL);
}
else if (reply->errstat != SNMP_ERR_NOERROR) {
switch (reply->errstat) {
case SNMP_ERR_NOSUCHNAME:
printf("ERROR - Device does not support that feature!\n");
break;
case SNMP_ERR_TOOBIG:
printf("ERROR - Result generated too much data!\n");
break;
case SNMP_ERR_READONLY:
printf("ERROR - Value is read only!\n");
break;
case SNMP_ERR_BADVALUE:
case SNMP_ERR_GENERR:
case SNMP_ERR_NOACCESS:
case SNMP_ERR_WRONGTYPE:
case SNMP_ERR_WRONGLENGTH:
case SNMP_ERR_WRONGENCODING:
case SNMP_ERR_WRONGVALUE:
case SNMP_ERR_NOCREATION:
case SNMP_ERR_INCONSISTENTVALUE:
case SNMP_ERR_RESOURCEUNAVAILABLE:
case SNMP_ERR_COMMITFAILED:
case SNMP_ERR_UNDOFAILED:
case SNMP_ERR_AUTHORIZATIONERROR:
case SNMP_ERR_NOTWRITABLE:
case SNMP_ERR_INCONSISTENTNAME:
default:
printf("ERROR - Unknown error!\n");
}
exit(RESULT_CRITICAL);
}
/* Read out data returned from device, print error if data is NULL */
vars = reply->variables;
if ((vars == NULL) || (vars->type == ASN_NULL)) {
printf("ERROR - No data recieved from device\n");
exit(RESULT_UNKNOWN);
}
CPU5sec = (int)(*vars->val.integer);
vars = vars->next_variable;
if ((vars == NULL) || (vars->type == ASN_NULL)) {
printf("ERROR - No data recieved from device\n");
exit(RESULT_UNKNOWN);
}
CPU1min = (int)(*vars->val.integer);
vars = vars->next_variable;
if ((vars == NULL) || (vars->type == ASN_NULL)) {
printf("ERROR - No data recieved from device\n");
exit(RESULT_UNKNOWN);
}
CPU5min = (int)(*vars->val.integer);
/* Check data from device against crit/warn limits, set return string accordingly */
if (CPU5min > crit) {
exitVal = RESULT_CRITICAL;
sprintf(retstr, "CRITICAL - CPU Load: 5sec (%i%%) - 1min (%i%%) - 5min (%i%%)\n", CPU5sec, CPU1min, CPU5min);
}
else if (CPU5min > warn) {
exitVal = RESULT_WARNING;
sprintf(retstr, "CRITICAL - CPU Load: 5sec (%i%%) - 1min (%i%%) - 5min (%i%%)\n", CPU5sec, CPU1min, CPU5min);
}
else {
exitVal = RESULT_OK;
sprintf(retstr, "OK - CPU Load: 5sec (%i%%) - 1min (%i%%) - 5min (%i%%)\n", CPU5sec, CPU1min, CPU5min);
}
snmp_free_pdu(reply);
snmp_close(s_handle);
return retstr;
}
/*
Check the memory usage on Cisco Devices.
*/
char *checkMem(struct snmp_session* session) {
struct snmp_session *s_handle = NULL;
struct snmp_pdu *pdu = NULL;
struct snmp_pdu *reply = NULL;
struct variable_list *vars;
int status;
float used_mem = 0;
float free_mem = 0;
float total_mem = 0;
float used_percent = 0;
float free_percent = 0;
oid mib_used_mem[] = { 1, 3, 6, 1, 4, 1, 9, 9, 48, 1, 1, 1, 5, 1 };
oid mib_free_mem[] = { 1, 3, 6, 1, 4, 1, 9, 9, 48, 1, 1, 1, 6, 1 };
oid mib_int_name[] = { 1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 10101 };
/* Open snmp session, print error if one occurs */
s_handle = snmp_open( session );
if (!s_handle) {
printf("ERROR - Problem opening session!\n");
exit(RESULT_CRITICAL);
}
/* Build PDU and add desired OIDs */
pdu = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(pdu, mib_used_mem, OID_LENGTH(mib_used_mem));
snmp_add_null_var(pdu, mib_free_mem, OID_LENGTH(mib_free_mem));
/* Check if snmp synchs correctly, if not exit the program */
status = snmp_synch_response(s_handle, pdu, &reply);
if (status == STAT_ERROR) {
printf("ERROR - Problem while querying device!\n");
exit(RESULT_CRITICAL);
}
else if (status == STAT_TIMEOUT) {
printf("ERROR - Connection timed out!\n");
exit(RESULT_CRITICAL);
}
else if (reply->errstat != SNMP_ERR_NOERROR) {
switch (reply->errstat) {
case SNMP_ERR_NOSUCHNAME:
printf("ERROR - Device does not support that feature!\n");
break;
case SNMP_ERR_TOOBIG:
printf("ERROR - Result generated too much data!\n");
break;
case SNMP_ERR_READONLY:
printf("ERROR - Value is read only!\n");
break;
case SNMP_ERR_BADVALUE:
case SNMP_ERR_GENERR:
case SNMP_ERR_NOACCESS:
case SNMP_ERR_WRONGTYPE:
case SNMP_ERR_WRONGLENGTH:
case SNMP_ERR_WRONGENCODING:
case SNMP_ERR_WRONGVALUE:
case SNMP_ERR_NOCREATION:
case SNMP_ERR_INCONSISTENTVALUE:
case SNMP_ERR_RESOURCEUNAVAILABLE:
case SNMP_ERR_COMMITFAILED:
case SNMP_ERR_UNDOFAILED:
case SNMP_ERR_AUTHORIZATIONERROR:
case SNMP_ERR_NOTWRITABLE:
case SNMP_ERR_INCONSISTENTNAME:
default:
printf("ERROR - Unknown error!\n");
}
exit(RESULT_CRITICAL);
}
/* Read out data returned from device, print error if data is NULL */
vars = reply->variables;
if (vars->type == ASN_NULL) {
printf("ERROR - No data recieved from device\n");
exit(RESULT_UNKNOWN);
}
used_mem = ((float)*(vars->val.integer)) / (1024*1024);
vars = vars->next_variable;
if (vars->type == ASN_NULL) {
printf("ERROR - No data recieved from device\n");
exit(RESULT_UNKNOWN);
}
free_mem = ((float)*(vars->val.integer)) / (1024*1024);
/* Calculate info based on data returned from device */
total_mem = used_mem + free_mem;
used_percent = (used_mem / total_mem) * 100;
free_percent = (free_mem / total_mem) * 100;
/* Check info against crit/warn levels and print message accordingly */
if (used_percent > crit) {
exitVal=RESULT_CRITICAL;
sprintf(retstr, "CRITICAL - Total mem: %.0fMB used mem: %.2f MB (%.2f%%), free mem: %.2f MB (%.2f%%)\n", total_mem, used_mem, used_percent, free_mem, free_percent);
}
else if (used_percent > warn) {
exitVal=RESULT_WARNING;
sprintf(retstr, "WARNING - Total mem: %.0fMB used mem: %.2fMB (%.2f%%), free mem: %.2f MB (%.2f%%)\n", total_mem, used_mem, used_percent, free_mem, free_percent);
}
else if (used_percent > 0) {
exitVal=RESULT_OK;
sprintf(retstr, "OK - Total mem: %.0fMB used mem: %.2f MB (%.2f%%), free mem: %.2f MB (%.2f%%)\n", total_mem, used_mem, used_percent, free_mem, free_percent);
}
else {
exitVal=RESULT_UNKNOWN;
sprintf(retstr, "UNKNOWN - No data received from device.");
}
snmp_free_pdu(reply);
snmp_close(s_handle);
return retstr;
}
/*
Check temperature on cisco devices.
*/
char *checkTemp(struct snmp_session* session) {
struct snmp_session *s_handle = NULL;
struct snmp_pdu *pdu = NULL;
struct snmp_pdu *reply = NULL;
struct variable_list *vars;
int temp, status;
oid mib_temp[] = {1, 3, 6, 1, 4, 1, 9, 9, 13, 1, 3, 1, 3, 1006};
/* Open snmp session, print error if one occurs */
s_handle = snmp_open( session );
if (!s_handle) {
printf("ERROR - Problem opening session!\n");
exit(RESULT_CRITICAL);
}
/* Create PDU and add desired OIDs */
pdu = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(pdu, mib_temp, OID_LENGTH(mib_temp));
/* Check if snmp synchs correctly, if not exit the program */
status = snmp_synch_response(s_handle, pdu, &reply);
if (status == STAT_ERROR) {
printf("ERROR - Problem while querying device!\n");
exit(RESULT_CRITICAL);
}
else if (status == STAT_TIMEOUT) {
printf("ERROR - Connection timed out!\n");
exit(RESULT_CRITICAL);
}
else if (reply->errstat != SNMP_ERR_NOERROR) {
switch (reply->errstat) {
case SNMP_ERR_NOSUCHNAME:
printf("ERROR - Device does not support that feature!\n");
break;
case SNMP_ERR_TOOBIG:
printf("ERROR - Result generated too much data!\n");
break;
case SNMP_ERR_READONLY:
printf("ERROR - Value is read only!\n");
break;
case SNMP_ERR_BADVALUE:
case SNMP_ERR_GENERR:
case SNMP_ERR_NOACCESS:
case SNMP_ERR_WRONGTYPE:
case SNMP_ERR_WRONGLENGTH:
case SNMP_ERR_WRONGENCODING:
case SNMP_ERR_WRONGVALUE:
case SNMP_ERR_NOCREATION:
case SNMP_ERR_INCONSISTENTVALUE:
case SNMP_ERR_RESOURCEUNAVAILABLE:
case SNMP_ERR_COMMITFAILED:
case SNMP_ERR_UNDOFAILED:
case SNMP_ERR_AUTHORIZATIONERROR:
case SNMP_ERR_NOTWRITABLE:
case SNMP_ERR_INCONSISTENTNAME:
default:
printf("ERROR - Unknown error!\n");
}
exit(RESULT_CRITICAL);
}
/* Read out the data returned from the device, exit if data returned is NULL */
vars = reply->variables;
if (vars->type == ASN_NULL) {
printf("ERROR - No data recieved from device\n");
exit(RESULT_UNKNOWN);
}
temp = (int)(*vars->val.integer); /* store the temperature */
/* Check the temperature */
if (temp >= crit) {
exitVal = RESULT_CRITICAL;
}
else if (temp >= warn) {
exitVal = RESULT_WARNING;
}
else {
exitVal = RESULT_OK;
}
/* Check status (OK/WARN/CRIT) and print appropriate message */
switch (exitVal) {
case RESULT_OK:
sprintf(retstr, "OK - Temp = %i\n", temp);
break;
case RESULT_WARNING:
sprintf(retstr, "WARNING - Temp = %i\n", temp);
break;
case RESULT_CRITICAL:
sprintf(retstr, "CRITICAL - Temp = %i\n", temp);
break;
default:
sprintf(retstr, "Either no value was returned from the device or no status could be determined.\n");
}
/* Release the reserved resources as they are no longer needed */
snmp_free_pdu(reply);
snmp_close(s_handle);
return retstr;
}
/*
Check temperature on Cisco 3750E.
*/
char *check3750Temp(struct snmp_session* session) {
struct snmp_session *s_handle = NULL;
struct snmp_pdu *pdu = NULL;
struct snmp_pdu *reply = NULL;
struct variable_list *vars;
int temp, status;
oid mib_temp[] = {1, 3, 6, 1, 4, 1, 9, 9, 13, 1, 3, 1, 3, 1005};
/* Open snmp session, print error if one occurs */
s_handle = snmp_open( session );
if (!s_handle) {
printf("ERROR - Problem opening session!\n");
exit(RESULT_CRITICAL);
}
/* Create PDU and add desired OIDs */
pdu = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(pdu, mib_temp, OID_LENGTH(mib_temp));
/* Check if snmp synchs correctly, if not exit the program */
status = snmp_synch_response(s_handle, pdu, &reply);
if (status == STAT_ERROR) {
printf("ERROR - Problem while querying device!\n");
exit(RESULT_CRITICAL);
}
else if (status == STAT_TIMEOUT) {
printf("ERROR - Connection timed out!\n");
exit(RESULT_CRITICAL);
}
else if (reply->errstat != SNMP_ERR_NOERROR) {
switch (reply->errstat) {
case SNMP_ERR_NOSUCHNAME:
printf("ERROR - Device does not support that feature!\n");
break;
case SNMP_ERR_TOOBIG:
printf("ERROR - Result generated too much data!\n");
break;
case SNMP_ERR_READONLY:
printf("ERROR - Value is read only!\n");
break;
case SNMP_ERR_BADVALUE:
case SNMP_ERR_GENERR:
case SNMP_ERR_NOACCESS:
case SNMP_ERR_WRONGTYPE:
case SNMP_ERR_WRONGLENGTH:
case SNMP_ERR_WRONGENCODING:
case SNMP_ERR_WRONGVALUE:
case SNMP_ERR_NOCREATION:
case SNMP_ERR_INCONSISTENTVALUE:
case SNMP_ERR_RESOURCEUNAVAILABLE:
case SNMP_ERR_COMMITFAILED:
case SNMP_ERR_UNDOFAILED:
case SNMP_ERR_AUTHORIZATIONERROR:
case SNMP_ERR_NOTWRITABLE:
case SNMP_ERR_INCONSISTENTNAME:
default:
printf("ERROR - Unknown error!\n");
}
exit(RESULT_CRITICAL);
}
/* Read out the data returned from the device, exit if data returned is NULL */
vars = reply->variables;
if (vars->type == ASN_NULL) {
printf("ERROR - No data recieved from device\n");
exit(RESULT_UNKNOWN);
}
temp = (int)(*vars->val.integer); /* store the temperature */
/* Check the temperature */
if (temp >= crit) {
exitVal = RESULT_CRITICAL;
}
else if (temp >= warn) {
exitVal = RESULT_WARNING;
}
else {
exitVal = RESULT_OK;
}
/* Check status (OK/WARN/CRIT) and print appropriate message */
switch (exitVal) {
case RESULT_OK:
sprintf(retstr, "OK - Temp = %i\n", temp);
break;
case RESULT_WARNING:
sprintf(retstr, "WARNING - Temp = %i\n", temp);
break;
case RESULT_CRITICAL:
sprintf(retstr, "CRITICAL - Temp = %i\n", temp);
break;
default:
sprintf(retstr, "Either no value was returned from the device or no status could be determined.\n");
}
/* Release the reserved resources as they are no longer needed */
snmp_free_pdu(reply);
snmp_close(s_handle);
return retstr;
}