jbbarth's

Là où je bosse, on a la chance (?) de disposer d’un SAN, c’est-à-dire d’un réseau dédié au stockage. En l’occurence c’est un réseau fibre, et tous les flux passent par deux switches fibre McData Sphereon 4500… qu’il faut surveiller d’une manière ou d’une autre.

En l’occurrence on surveille tout ça par Nagios. L’ancien script (qui doit faire partie des nagios plugins du site officiel ?) vérifiait les interfaces une par une, ce qui est gênant dans un environnement évolutif (oubli d’interfaces non surveillées!). Il faisait d’autres choses (check trafic rx/tx, errors) que mon script ne fait pas, mais il ne demande qu’à être amélioré ;-)

Voici donc un script de remplacement qui check toutes les interfaces d’un coup. Gros avantage : on passe les ports non branchés en exception, mais si un port est vu “up” et qu’il est en exception le script sort en Critical. Cela force à maintenir la liste des exceptions à jour ;-)

PS: Il faut bien sûr que ruby soit installé sur votre serveur de supervision.

#!/usr/bin/ruby

# Dernière modif: 19/11/2008
# Script de test des ports pour les switches fibre
# Jean-Baptiste BARTH <jeanbaptiste.barth@gmail.com>

# Remonter les infos à la main (sous l'user "nagios")
# $ snmpwalk -c public -v 2c switch_san_a .1.3.6.1.4.1.289.2.1.1.2.3.1.1.2
#       SNMPv2-SMI::enterprises.289.2.1.1.2.3.1.1.2.1 = INTEGER: 2
#       SNMPv2-SMI::enterprises.289.2.1.1.2.3.1.1.2.2 = INTEGER: 2
# ...
# => 2 = OK, 6 = down, 13 = info not available

unless ARGV.length >= 2 && ARGV.length <= 3
  puts "Mauvais format :"
  puts "\t./check_fc_setra.rb HOST COMMUNITY [EXCLUSIONS]"
  puts "Les ports exclus évitent des remontées d'alertes pour les ports non branchés."
  puts "Exemple: ./check_fc_setra.rb switch_san_a public 1,4,9"
  exit 2
end

# Valeurs prises dans utils.sh
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

# Parsing arguments
host = ARGV.shift
community = ARGV.shift
exclusions = (ARGV.shift || "none").split(",")

# Passage de la commande
command = `snmpwalk -c #{community} -v 2c #{host} .1.3.6.1.4.1.289.2.1.1.2.3.1.1.2`
result = []
command.each do |line|
  #puts "DEBUG snmpwalk: "+line
  matches = line.match /\.(\d+) = INTEGER: (\d+)/
  result.push [matches[1], matches[2]]
end

# Traitement de la sortie
not_ignored = result.select{|x| !exclusions.include? x[0]}
interfaces_down = not_ignored.select{|v| v[1] == "6"}.map{|x| x[0]}
interfaces_ok = not_ignored.select{|v| v[1] == "2"}.map{|x| x[0]}
interfaces_unknown = not_ignored.map{|x| x[0]} - interfaces_ok - interfaces_down
interfaces_ok_not_normal = (result - not_ignored).select{|v| v[1] == "2"}.map{|x| x[0]}
# Output
puts "Link DOWN on interfaces : "+interfaces_down.join(",") unless interfaces_down.empty?
puts "Link UP on IGNORED interfaces : "+interfaces_ok_not_normal.join(",")+"\n!!!CHANGE THE SERVICE CONFIG!!!" unless interfaces_ok_not_normal.empty?
puts "State UNKNOWN : "+interfaces_unknown.join(",") unless interfaces_unknown.empty?
puts "Link UP on interfaces : "+interfaces_ok.join(",") unless interfaces_ok.empty?
puts "Ignored: "+exclusions.join(",")
if !interfaces_down.empty? || !interfaces_ok_not_normal.empty?
  exit STATE_CRITICAL
elsif !interfaces_unknown.empty?
  exit STATE_UNKNOWN
else
  exit STATE_OK
end
Hierarchy: previous, next

Comments

There is 1 comment on this post. Post yours →

koukou

promis!je vérifierai…dés que je saurais ce que c’est??!! je sens que j’aurais besoin de cours intensifs là!
Bonne journée choux. Bisouxxx

Post a comment

Required fields in bold.