aboutsummaryrefslogtreecommitdiff
path: root/plugins/t/check_snmp.t
blob: 004ba1ae730ef09ef82fd040b6935713d7cdd4fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#! /usr/bin/perl -w -I ..
#
# Simple Network Management Protocol (SNMP) Test via check_snmp
#
#

use strict;
use Test::More;
use NPTest;

my $tests = 8+38+2+2;
plan tests => $tests;
my $res;

SKIP: {
	skip "check_snmp is not compiled", $tests if ( ! -x "./check_snmp" );

	my $host_snmp = getTestParameter( "host_snmp",          "NP_HOST_SNMP",      "localhost",
	                                   "A host providing an SNMP Service");

	my $snmp_community = getTestParameter( "snmp_community",     "NP_SNMP_COMMUNITY", "public",
                                           "The SNMP Community string for SNMP Testing (assumes snmp v1)" );

	my $host_nonresponsive = getTestParameter( "host_nonresponsive", "NP_HOST_NONRESPONSIVE", "10.0.0.1",
	                                           "The hostname of system not responsive to network requests" );

	my $hostname_invalid   = getTestParameter( "hostname_invalid",   "NP_HOSTNAME_INVALID",   "nosuchhost",
	                                           "An invalid (not known to DNS) hostname" );

	$res = NPTest->testCmd( "./check_snmp -t 1" );
	is( $res->return_code, 3, "No host name" );
	is( $res->output, "No host specified" );
	
	$res = NPTest->testCmd( "./check_snmp -H fakehostname" );
	is( $res->return_code, 3, "No OIDs specified" );
	is( $res->output, "No OIDs specified" );

	$res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3 --seclevel=rubbish" );
	is( $res->return_code, 3, "Invalid seclevel" );
	like( $res->output, "/check_snmp: Invalid seclevel - rubbish/" );

	$res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3c" );
	is( $res->return_code, 3, "Invalid protocol" );
	like( $res->output, "/check_snmp: Invalid SNMP version - 3c/" );

	SKIP: {
		skip "no snmp host defined", 38 if ( ! $host_snmp );

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:");
		cmp_ok( $res->return_code, '==', 0, "Exit OK when querying uptime" );
		like($res->output, '/^SNMP OK - (\d+)/', "String contains SNMP OK");
		$res->output =~ /^SNMP OK - (\d+)/;
		my $value = $1;
		cmp_ok( $value, ">", 0, "Got a time value" );
		like($res->perf_output, "/sysUpTime.*$1/", "Got perfdata with value '$1' in it");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o .1.3.6.1.2.1.1.3.0 -w 1: -c 1:");
		cmp_ok( $res->return_code, '==', 0, "Test with numeric OID (no mibs loaded)" );
		like($res->output, '/^SNMP OK - \d+/', "String contains SNMP OK");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0");
		cmp_ok( $res->return_code, '==', 0, "Exit OK when querying sysDescr" );
		unlike($res->perf_output, '/sysDescr/', "Perfdata doesn't contain string values");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0,system.sysDescr.0");
		cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, comma-separated" );
		like($res->output, '/^SNMP OK - /', "String contains SNMP OK");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0 -o system.sysDescr.0");
		cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, repeated option" );
		like($res->output, '/^SNMP OK - /', "String contains SNMP OK");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 1:1 -c 1:1");
		cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrSWRunIndex.1" );
		like($res->output, '/^SNMP OK - 1\s.*$/', "String fits SNMP OK and output format");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 0   -c 1:");
		cmp_ok( $res->return_code, '==', 1, "Exit WARNING when querying hrSWRunIndex.1 and warn-th doesn't apply " );
		like($res->output, '/^SNMP WARNING - \*1\*\s.*$/', "String matches SNMP WARNING and output format");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w  :0 -c 0");
		cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL when querying hrSWRunIndex.1 and crit-th doesn't apply" );
		like($res->output, '/^SNMP CRITICAL - \*1\*\s.*$/', "String matches SNMP CRITICAL and output format");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2 -c 1:2");
		cmp_ok( $res->return_code, '==', 0, "Checking two OIDs at once" );
		like($res->output, "/^SNMP OK - 2 1/", "Got two values back" );
		like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" );
		like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" );

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2,1:2 -c 2:2,2:2");
		cmp_ok( $res->return_code, '==', 2, "Checking critical threshold is passed if any one value crosses" );
		like($res->output, "/^SNMP CRITICAL - 2 *1*/", "Got two values back" );
		like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" );
		like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" );

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w 1:,1: -c 1:,1:");
		cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrMemorySize and hrSystemProcesses");
		like($res->output, '/^SNMP OK - \d+ \d+/', "String contains hrMemorySize and hrSystemProcesses");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w \@:0 -c \@0");
		cmp_ok( $res->return_code, '==', 0, "Exit OK with inside-range thresholds");
		like($res->output, '/^SNMP OK - 1\s.*$/', "String matches SNMP OK and output format");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3");
		$res->output =~ m/^SNMP OK - (\d+\.\d{2})\s.*$/;
		my $lower = $1 - 0.05;
		my $higher = $1 + 0.05;
		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3 -w $lower -c $higher");
		cmp_ok( $res->return_code, '==', 1, "Exit WARNING with fractionnal arguments");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0,host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w ,:0 -c ,:2");
		cmp_ok( $res->return_code, '==', 1, "Exit WARNING on 2nd threshold");
		like($res->output, '/^SNMP WARNING - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s+\*1\*\s.*$/', "First OID returned as string, 2nd checked for thresholds");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w '' -c ''");
		cmp_ok( $res->return_code, '==', 0, "Empty thresholds doesn't crash");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,,1 -c ,,2");
		cmp_ok( $res->return_code, '==', 0, "Skipping first two thresholds on 2 OID check");
		like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping first two thresholds, result printed rather than parsed");

		$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,, -c ,,");
		cmp_ok( $res->return_code, '==', 0, "Skipping all thresholds");
		like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping all thresholds, result printed rather than parsed");

	}

	# These checks need a complete command line. An invalid community is used so
	# the tests can run on hosts w/o snmp host/community in NPTest.cache. Execution will fail anyway
	SKIP: {
		skip "no non responsive host defined", 2 if ( ! $host_nonresponsive );
		$res = NPTest->testCmd( "./check_snmp -H $host_nonresponsive -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:");
		cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" );
		like($res->output, '/External command error: Timeout: No Response from /', "String matches timeout problem");
	}

	SKIP: {
		skip "no non invalid host defined", 2 if ( ! $hostname_invalid );
		$res = NPTest->testCmd( "./check_snmp -H $hostname_invalid   -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:");
		cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" );
		like($res->output, '/External command error: .*(nosuchhost|Name or service not known|Unknown host)/', "String matches invalid host");
	}

}