mercredi 29 février 2012

Extension du plugin NAGIOS MailBoxHealth pour EXCHANGE 2010

Dernièrement, j'ai été amené à mettre en place pour un client la supervision d'EXCHANGE 2010.
Pour cela, j'ai trouvé l'excellent plugin de Jeffrey ROBERTSON (Accéder au plugin). Malheureusement, les clients ayant des problèmes avec leurs propres spécificités, ce plugin ne pouvait les contenter en l'état.
En effet, lors de la supervision des points de montage des dossiers, certains montages n'étant pas utilisés (donc non montés), le plugin renvoyait une erreur, alors que touy fonctionné normalement.
Il a donc fallu se retrousser les manches et se mettre à faire du Powershell. Je sais, je ne suis pas vraiment un spécialiste de l'environnement Microsoft, mais à certains moments, il faut mettre ses grands principes de côté et passer à l'action afin de mener à bien sa mission :-)

Finalement, le PowerShell c'est pas si mal. Le problème, comme pour tous nouveaux langages, c'est la syntaxe. J'ai quand même eu beaucoup de mal à trouver de l'information. A croire, que les gens sont avares d'informations pertinentes lorsqu'il s'agit de toucher à l'environnement Microsoft ???

L'idée était de pouvoir passer en argument des paramètres permettant d'exclure du check des points de montage.
J'ai donc introduit dans le code, la passage des arguments suivants :
  • -A : Pour contrôler l'ensemble des points de montages
  • -X : Pour exclure du contrôle les points de montages passés en argument (une liste de noms séparés par des virgules)
  • -I : Pour exclure du contrôle la liste de mots clés passés en argument (plusieurs mots clés séparés par des virgules)
Voici le code source du script :

function Help
{
write-host "This script check the MailBox Health of Exchange 2010"
write-host ""
write-host "Options:"
write-host "-A (The default)"
write-host " Check all Exchange Databases"
write-host "-X"
write-host " Ignore the Exchange Databases indicated in arguments (list separeted by a comma)"
write-host "-I"
write-host " Keyword expression to ignore the Exchange Databases"
exit
}
function validateChecking
{
[string]$DataBaseName = $DataBase.Name ;
if ($ExcludedDatabases.length -gt 0){
ForEach ($Exclude in $ExcludedDatabases)
{
if ($DataBaseName.CompareTo($Exclude) -eq 0)
{
return $FALSE
}
}
}
if ($ExcludedKeywordsDatabases.length -gt 0){
ForEach ($KeywordExclude in $ExcludedKeywordsDatabases)
{
if ($DataBaseName.Contains($KeywordExclude))
{
return $FALSE
}
}
}
return $TRUE
}


function checkDatabases
{
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010

$NagiosStatus = "0"
$NagiosDescription = ""


ForEach ($DataBase in Get-MailboxDatabase) {
if (validateChecking)
{
ForEach ($Status in Get-MailboxDatabaseCopyStatus -Identity $DataBase.Name) {
switch ($Status.Status) {
"Failed" { 
$NagiosStatus = "2"
if ($NagiosDescription -ne "") {
$NagiosDescription = $NagiosDescription + ", "
}
$NagiosDescription = $NagiosDescription + $Status.Name + " is " + $Status.Status
}

"Dismounted" {
$NagiosStatus = "2"
if ($NagiosDescription -ne "") {
$NagiosDescription = $NagiosDescription + ", "
}
$NagiosDescription = $NagiosDescription + $Status.Name + " is " + $Status.Status
}

"Resynchronizing" {
if ($NagiosStatus -ne "2") {
$NagiosStatus = "1"
}
if ($NagiosDescription -ne "") {
$NagiosDescription = $NagiosDescription + ", "
}
$NagiosDescription = $NagiosDescription + $Status.Name + " is " + $Status.Status
}


"Suspended" {
if ($NagiosStatus -ne "2") {
$NagiosStatus = "1"
}
if ($NagiosDescription -ne "") {
$NagiosDescription = $NagiosDescription + ", "
}
$NagiosDescription = $NagiosDescription + $Status.Name + " is " + $Status.Status
}


"Mounting" {
if ($NagiosStatus -ne "2") {
$NagiosStatus = "1"
}
if ($NagiosDescription -ne "") {
$NagiosDescription = $NagiosDescription + ", "
}
$NagiosDescription = $NagiosDescription + $Status.Name + " is " + $Status.Status
}


"Healthy" {}
"Mounted" {}
}
}
}
}
# Output, what level should we tell our caller?
if ($NagiosStatus -eq "2") {
Write-Host "CRITICAL: " $NagiosDescription
} elseif ($NagiosStatus -eq "1") {
Write-Host "WARNING: " $NagiosDescription
} else {
Write-Host "OK: All Mailbox Databases are mounted and healthy."
}


exit $NagiosStatus
}


$ArgCount = 0
if (!$arg)
{
if ($args.length -gt 0){
While ($ArgCount -lt $args.length){
switch ($args[$ArgCount]){
"-A"{
$ArgCount = ($ArgCount + 1)
}

"-X"{
$ExcludedDatabases = $args[($ArgCount+1)]
$ArgCount = ($ArgCount + 2)
}

"-I"{
$ExcludedKeywordsDatabases = $args[($ArgCount+1)]
$ArgCount = ($ArgCount + 2)
}

"-h"{
Help
}

"$" {
#Correcting the problem when haven't some argument
$ArgCount = ($ArgCount + 1)
}

default{
write-host "Invalid command."
write-host "$args"
Help
}
}
}
}
}
checkDatabases

Bon, le script n'a peut-être pas été conçu dans les règles de l'art, mais j'ai du faire ce que j'ai pu avec les maigres connaissances que j'avais et le peu de temps qui m'était imparti. Ce script a été mis en place pour être utilisé avec NSClient++ côté serveur à superviser et avec un check_nrpe côté serveur de supervision.
Pour cela, il y a quelques modifications à apporter dans la configuration du serveur à superviser; dans le fichier NSCP.ini. Il faut savoir que ce fichier fonctionne par bloc et donc que même si vous avez l'impression d'avoir initialiser une variable dans un bloc et pas dans un autre, elle ne sera pas prise en compte.
Première modification dans le bloc [External Commands] :

  • allow_nasty_meta_chars=1 
  • allow_arguments=1

 Autre modification dans le bloc [Wrapped Scripts]

  • check_mailbox_health_ps1=MailboxHealth.ps1 $ARG1$
Il faut penser à relancer le process NSClient++ puis à tester côté serveur de supervision avec par exemple la commande :

  • ./check_nrpe -H hostname -t 30 -c check_mailbox_health_ps1 -a "-A"
Voilà, pour mon client cela à bien fonctionné et ça était mis en production.
J'ai publié ces modification auprès de Jeffrey ROBERTSON, qui les a inclus dans la version du plugin que vous trouverez ici.

Si vous avez un souci de mise en oeuvre, n'hésitez pas à me poster votre question.

Aucun commentaire:

Publier un commentaire