#!/usr/bin/env ruby # frozen_string_literal: false # Check SNMP # === # # This is a simple SNMP check script for Sensu, We need to supply details like # Server, port, SNMP community, and Limits # # DEPENDENCIES: # gem: sensu-plugin # gem: snmp # # USAGE: # # check-snmp -h host -C community -O oid -w warning -c critical # check-snmp -h host -C community -O oid -m "(P|p)attern to match\.?" # # LICENSE: # # Author Deepak Mohan Das # # Released under the same terms as Sensu (the MIT license); see LICENSE # for details. require 'sensu-plugin/check/cli' require 'snmp' # Class that checks the return from querying SNMP. class CheckSNMP < Sensu::Plugin::Check::CLI option :host, short: '-h host', default: '127.0.0.1' option :port, short: '-P port', long: '--port PORT', default: '161' option :community, short: '-C snmp community', default: 'public' option :objectid, short: '-O OID', default: '1.3.6.1.4.1.2021.10.1.3.1' option :warning, short: '-w warning', default: '10' option :critical, short: '-c critical', default: '20' option :match, short: '-m match', description: 'Regex pattern to match against returned value' option :snmp_version, short: '-v version', description: 'SNMP version to use (SNMPv1, SNMPv2c (default))', default: 'SNMPv2c' option :comparison, short: '-o comparison operator', description: 'Operator used to compare data with warning/critial values. Can be set to "le" (<=), "ge" (>=).', default: 'ge' option :convert_timeticks, short: '-T', long: '--convert-timeticks', description: 'Convert SNMP::TimeTicks to Integer for comparisons', boolean: true, default: false option :timeout, short: '-t timeout (seconds)', default: '1' option :debug, short: '-D', long: '--debug', description: 'Enable debugging to assist with inspecting OID values / data.', boolean: true, default: false def run begin manager = SNMP::Manager.new(host: config[:host].to_s, port: config[:port].to_i, community: config[:community].to_s, version: config[:snmp_version].to_sym, timeout: config[:timeout].to_i) response = manager.get([config[:objectid].to_s]) if config[:debug] puts 'DEBUG OUTPUT:' response.each_varbind { |vb| puts vb.inspect } end rescue SNMP::RequestTimeout unknown "#{config[:host]} not responding" rescue StandardError => e unknown "An unknown error occured: #{e.inspect}" end operators = { 'le' => :<=, 'ge' => :>= } symbol = operators[config[:comparison]] response.each_varbind do |vb| if config[:match] if vb.value.to_s =~ /#{config[:match]}/ ok else critical "Value: #{vb.value} failed to match Pattern: #{config[:match]}" end else snmp_value = if config[:convert_timeticks] vb.value.is_a?(SNMP::TimeTicks) ? vb.value.to_i : vb.value else vb.value end critical 'Critical state detected' if snmp_value.to_s.to_i.send(symbol, config[:critical].to_s.to_i) # #YELLOW warning 'Warning state detected' if snmp_value.to_s.to_i.send(symbol, config[:warning].to_s.to_i) && !snmp_value.to_s.to_i.send(symbol, config[:critical].to_s.to_i) # rubocop:disable Layout/LineLength unless snmp_value.to_s.to_i.send(symbol, config[:warning].to_s.to_i) ok 'All is well!' end end end manager.close end end