Advertisement
Tlams

[PS] Surveillance

Apr 11th, 2013
965
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # Auteur: Tlams
  2. # Date: 11/03/13
  3. # Language: Powershell
  4. # Version: 1.0
  5. # Fonction: Script de surveillance ressources serveurs.
  6.  
  7. #####################
  8. ##Def des fonctions##
  9. #####################
  10.  
  11. function mail($sujet_env, $contenu_env, $wcr, $from, $smtp_serveur, $dest)
  12. {  
  13.       $enc=New-Object System.Text.utf8encoding
  14.       Send-MailMessage -From $from `
  15.                  –To   $dest `
  16.                  -Subject $sujet_env `
  17.                  –Body $contenu_env `
  18.                  –SmtpServer $smtp_serveur `
  19.                  -credential $wcr `
  20.                  -UseSsl `
  21.                  -ErrorAction "silentlycontinue" `
  22.                  -Encoding $enc  
  23.        write_log "INFO: Envoie du mail d'alerte: " + $sujet_env
  24. }
  25.  
  26. function write_log($texte)
  27. {
  28.     $date = Get-Date
  29.     $date =  "[" + [string]$date + "] " + "[" + $server + "] "
  30.     $date + $texte >> $log_name
  31. }
  32.  
  33. function erreur_exe($erreurinfo)
  34. {
  35.     $ecriture_log = "ERROR:" + $erreurinfo
  36.     write_log $ecriture_log
  37.     mail "SCRIPT ERREUR" $ecriture_log $wcr $from $smtp_serveur $dest
  38. }
  39.  
  40. function CPU_check($repeat_count,$cpu_threshold,$sleep_interval,$server)
  41. {  
  42.     write_log "INFO: Test du CPU"
  43.     $hit = 0
  44.     foreach($turn in 1..$repeat_count)
  45.     {
  46.  
  47.        $cpu = get-wmiObject -class Win32_Processor -ComputerName $server –credential $cred -ErrorAction "silentlycontinue"
  48.        if (!$?)
  49.        {
  50.             $erreurinfo = "[" + $server + "] " +  $error[0].exception.message
  51.             erreur_exe $erreurinfo
  52.             Return 1
  53.        }
  54.        write_log "INFO: L'utilisation de la CPU est de $($cpu.LoadPercentage)%"
  55.        If($cpu.LoadPercentage -ge $cpu_threshold)
  56.        {
  57.            $hit = $hit+1
  58.        }
  59.         start-sleep $sleep_interval
  60.     }
  61.    
  62.     if($hit -eq 3)
  63.     {
  64.         write_log "ALERTE: L'utilisation de la CPU est supérieure à $($cpu_threshold)%"
  65.         $sujet_env = $sujet_CPU
  66.         $contenu_env = $contenu_CPU
  67.         mail $sujet_env $contenu_env $wcr $from $smtp_serveur $dest    
  68.     }
  69.     else
  70.     {
  71.         write_log "INFO: L'utilisation de la CPU est inférieure à $($cpu_threshold)%"
  72.     }
  73. }
  74.  
  75.  
  76. function disk_check($server)
  77. {
  78.     write_log "INFO: Test de l'espace disque"
  79.     $Disques = get-WmiObject Win32_LogicalDisk -ComputerName $server –credential $cred -ErrorAction "silentlycontinue" | Where {$_.Name -ne "A:" -and $_.DriveType -eq "3"}
  80.     if (!$?)
  81.     {
  82.         $erreurinfo =  "[" + $server + "] " + $error[0].exception.message
  83.         erreur_exe $erreurinfo
  84.         Return 1
  85.     }
  86.     foreach ( $disque in $Disques )
  87.     {  
  88.         # espaces disques  - Dans la WMI, les tailles sont données en octets.
  89.         $espacelibre = [math]::round($disque.freespace / (1024*1024*1024),1)  
  90.         $tailletotaledisque = [math]::round($disque.size / (1024*1024*1024),1)  
  91.    
  92.         $disk_used_pourcent = ($espacelibre / $tailletotaledisque)*100
  93.         $disk_used_pourcent = [int](100 - $disk_used_pourcent)
  94.         $ajoulogs =  "INFO: Disque" + $disque.Name + "Taille totale = "+ $tailletotaledisque + "Go Espace libre = "+ $espacelibre + "Go"  
  95.          
  96.         write_log $ajoulogs  
  97.        
  98.         if ($disk_used_pourcent -ge $limit_disk)
  99.         {
  100.             $sujet_env = $sujet_mem_vir
  101.             $contenu_env = $contenu_mem_vir
  102.             mail $sujet_env $contenu_env $wcr $from $smtp_serveur $dest  
  103.             write_log "ALERT:  Espace disque utilisé à $($disk_used_pourcent) %"
  104.         }
  105.     }
  106. }
  107.  
  108. function services_check($server)
  109. {
  110.     write_log "INFO: Test des services"
  111.     $servs_services = get-wmiObject -class win32_Service -ComputerName $server –credential $cred -ErrorAction "silentlycontinue" | where-object {$_.Started}
  112.     if (!$?)
  113.     {
  114.         $erreurinfo = "[" + $server + "] " + $error[0].exception.message
  115.         erreur_exe $erreurinfo
  116.         Return 1
  117.     }
  118.    
  119.     write_log "INFO: Nombre de services en cours de fonctionnement : $($servs_services.length)"
  120.    
  121.    if (($servs_services.length -ge $limit_service_nb_fixe + $limit_service_nb_var) -or ($servs_services.length -lt $limit_service_nb_fixe - $limit_service_nb_var))
  122.         {
  123.             write_log "ALERT: Nombre de services en cours de fonctionnement est anormal : $($servs_services.length)"
  124.             $sujet_env = $sujet_services_nb
  125.             $contenu_env = $contenu_services_nb
  126.             mail $sujet_env $contenu_env $wcr $from $smtp_serveur $dest  
  127.         }
  128.    
  129.     $list_servi_abs  = @()
  130.     foreach ($services in $list_services)
  131.     {
  132.         $query_services = get-wmiObject -class win32_Service -ComputerName $server –credential $cred -ErrorAction "silentlycontinue" | where-object  {$_.Name -eq $services}
  133.         if (!$?)
  134.         {
  135.             $erreurinfo =  "[" + $server + "] " + $error[0].exception.message
  136.             erreur_exe $erreurinfo
  137.             Return 1
  138.         }
  139.        
  140.         if ((!$query_services.Name) -or ($query_services.State -eq "Stopped" ))
  141.         {
  142.             write_log "ALERT: Service $($services) absent"  
  143.             $list_servi_abs +=  $services
  144.         }
  145.         else
  146.         {
  147.             write_log "INFO: Service $($services) présent"
  148.         }
  149.     }
  150.    
  151.     if ($list_servi_abs)
  152.     {
  153.         $sujet_env = $sujet_servi_abs
  154.         $contenu_env = $contenu_servi_abs + [string] $list_servi_abs
  155.         mail $sujet_env $contenu_env $wcr $from $smtp_serveur $dest  
  156.     }
  157. }
  158.  
  159.  
  160. function processus_check($server)
  161. {
  162.     write_log "INFO: Test des processus"
  163.     $servs_processus = get-wmiObject -class win32_Process -ComputerName $server –credential $cred -ErrorAction "silentlycontinue"
  164.    
  165.     if (!$?)
  166.     {
  167.         $erreurinfo =  "[" + $server + "] " + $error[0].exception.message
  168.         erreur_exe $erreurinfo
  169.         Return 1
  170.     }
  171.    
  172.     write_log "INFO: Nombre de processus en cours de fonctionnement :  $($infoComp.length)"
  173.    
  174.    if (($servs_processus.length -ge $limit_processus_nb_fixe + $limit_processus_nb_var) -or ($servs_processus.length -lt $limit_processus_nb_fixe - $limit_processus_nb_var))
  175.         {
  176.             write_log "ALERT: Nombre de processus en cours de fonctionnement est anormal :  $($infoComp.length)"
  177.             $sujet_env = $sujet_processus_nb
  178.             $contenu_env = $contenu_processus_nb
  179.             mail $sujet_env $contenu_env $wcr $from $smtp_serveur $dest  
  180.         }
  181. }
  182.  
  183. function ram_check($server)
  184. {    
  185.     write_log "INFO: Test de la mémoire"
  186.     # Total RAM installée (taille dans la WMI en Octets)
  187.  
  188.     $infoComp = get-wmiObject -class win32_computerSystem -ComputerName $server –credential $cred -ErrorAction "silentlycontinue"
  189.     if (!$?)
  190.     {
  191.         $erreurinfo =  "[" + $server + "] " + $error[0].exception.message
  192.         erreur_exe "[" + $server + "] " +  $erreurinfo
  193.         Return 1
  194.     }
  195.        
  196.     $totalRam = [math]::round([long]$infoComp.TotalPhysicalMemory /(1024*1024*1024) ,1)
  197.     write_log "INFO: Total ram : $($totalRam) GO"
  198.     # controle de place disponible en RAM (tailles dans la WMI en KO)
  199.     $osObject  = Get-WmiObject -class Win32_OperatingSystem  -ComputerName $server –credential $cred -ErrorAction "silentlycontinue"
  200.     if (!$?)
  201.     {
  202.         $erreurinfo = $error[0].exception.message
  203.         erreur_exe "[" + $server + "] " + $erreurinfo
  204.         $erreur = 1
  205.         Return $erreur
  206.     }
  207.    
  208.     $totalfree = [math]::round([long]$osObject.FreeVirtualMemory /(1024*1024) ,1)
  209.     $physfree  = [math]::round([long]$osObject.FreePhysicalMemory /(1024*1024) ,1)
  210.     $freeswap =  [math]::round([long]$osObject.FreeSpaceInPagingFiles /(1024*1024) ,1)
  211.     write_log "INFO: Place total disponible : $($totalfree) GO"
  212.     write_log "INFO: Place physique disponible : $($physfree) GO"
  213.     write_log "INFO: Place swap disponible : $($freeswap) GO"
  214.  
  215.     $phy_used_pourcent = ($physfree / $totalRam)*100
  216.     $phy_used_pourcent = [int](100 - $phy_used_pourcent)
  217.     write_log "INFO: Mémoire physique utilisé: $($phy_used_pourcent) %"
  218.    
  219.     if ($phy_used_pourcent -ge $limit_physique)
  220.     {
  221.         write_log  "ALERT: Mémoire physique utilisé à $($phy_used_pourcent) %"
  222.         $sujet_env = $sujet_mem_phy
  223.         $contenu_env = $contenu_mem_phy
  224.         mail $sujet_env $contenu_env $wcr $from $smtp_serveur $dest    
  225.     }
  226.    
  227.     $swap_used_pourcent = ($freeswap / $totalRam)*100
  228.     $swap_used_pourcent = [int](100 - $swap_used_pourcent)
  229.     write_log "INFO: Mémoire virtuelle utilisé: $($swap_used_pourcent) %"
  230.    
  231.     if ($swap_used_pourcent -ge $limit_virtuel)
  232.     {
  233.         $sujet_env = $sujet_mem_vir
  234.         $contenu_env = $contenu_mem_vir
  235.         mail $sujet_env $contenu_env $wcr $from $smtp_serveur $dest  
  236.         write_log "ALERT:  Mémoire virtuelle utilisé à $($swap_used_pourcent) %"
  237.     }
  238.  
  239. }
  240.  
  241.  
  242.  
  243. #####################
  244. ##Def des variables##
  245. #####################
  246.  
  247. ######## Mail ##########
  248. $from = "[email protected]"     #Email d'envoie des messgaes d'alertes
  249. $smtp_serveur = "smtp.xxxx.com" #Serveur SMTP du destinataire
  250. $dest = "[email protected] " #Email du destinataire
  251.  
  252. $login     = "xxxxxx"       #Login du destinataire
  253. $stringpwd = "xxxxxx"  #Mot de passe du destinataire
  254. $pwd       = convertto-securestring $stringpwd -asplaintext -force
  255. $wcr       = new-object -typename System.Management.Automation.PSCredential `
  256.                         -argumentlist $login,$pwd `
  257.                         -ErrorAction "silentlycontinue"
  258.                        
  259. ########## CPU ###########
  260. $repeat_count = 3                # Nombre de tests utilisation du CPU
  261. $cpu_threshold = 80              # Pourcentage limite utilisation du CPU
  262. $sleep_interval = 1              # Temps intervale entre chaques tests
  263. $sujet_CPU = "ALERT - CPU"       # Sujet de l'email d'alerte CPU"
  264. $contenu_CPU = "Charge du CPU est supérieure à $($cpu_threshold)!" #Message de l'email d'alerte CPU
  265.  
  266. ########## Memoire ###########
  267. $limit_physique = 80             # Pourcentage limite utilisation Mémoire Ram
  268. $limit_virtuel = 80              # Pourcentage limite utilisation de la SWAP
  269. $sujet_mem_vir = "ALERT - MEM-VIR"  # Sujet de l'email d'alerte SWAP
  270. $contenu_mem_vir = "Charge de la mémoire virtuelle est supérieure à $($limit_virtuel)!" #Message de l'email d'alerte SWAP
  271. $sujet_mem_phy = "ALERT - MEM-PHY"  # Sujet de l'email d'alerte RAM
  272. $contenu_mem_phy = "Charge de la mémoire physique est supérieure à $($limit_physique)!" #Message de l'email d'alerte RAM
  273.  
  274. ########## Disques ###########
  275. $limit_disk = 80                 # Pourcentage limite utilisation Disque
  276. $sujet_disk = "ALERT - DISQUE"   # Sujet de l'email d'alerte Disque
  277. $contenu_disk = "Charge du disque est supérieure à $($limit_disk)!" #Message de l'email d'alerte Disque
  278.  
  279. ########## Services ###########
  280. $limit_service_nb_fixe = 80      # Nombre de services de base
  281. $limit_service_nb_var = 10       # Taux d'erreur acceptable (+/- le nombre de base)
  282. $sujet_services_nb = "ALERT - SERVICES NOMBRE"     # Sujet de l'email d'alerte nombre de services
  283. $contenu_services_nb = "Nombre de services en cours de fonctionnement est anormal "  #Message de l'email d'alerte nombre de services
  284. $sujet_servi_abs = "ALERT - SERVICES"              # Sujet de l'email d'alerte service absents
  285. $contenu_servi_abs = "Liste des services absent:"  # Message de l'email d'alerte service absents (Contient aussi la liste)
  286. $list_services = @("WwanSvc","WSearch") # Liste des services vérifiés
  287.  
  288.  
  289. ########## Processus ###########
  290. $limit_processus_nb_fixe = 80     # Nombre de processus de base
  291. $limit_processus_nb_var = 10      # Taux d'erreur acceptable (+/- le nombre de base)
  292. $sujet_processus_nb = "ALERT - PROCESSUS NOMBRE" # Sujet de l'email d'alerte nombre de processus
  293. $contenu_processus_nb = "Nombre de processus en cours de fonctionnement est anormal "  #Message de l'email d'alerte nombre de processus
  294.  
  295. ####Liste des serveurs####
  296. $serveur =
  297. ("","",""),
  298. ("172.20.0.1","Administrateur","pw1"),
  299. ("172.20.0.2","Administrateur","pw2")
  300.  
  301. ######### LOGS #########
  302. $base = split-path $myinvocation.mycommand.path # Répertoire d'enregistrement des logs
  303. $log_name = $base + "\logs.txt" # Nom du fichier log
  304.  
  305. ######### Fichier config #########
  306. $base_cmd = split-path $myinvocation.mycommand.path # Répertoire d'enregistrement des logs
  307. $config_file = $base_cmd + "\config.txt" # Nom du fichier log
  308.  
  309. ################
  310. ##SCRIPT START##
  311. ################
  312.  
  313. write_log "INFO: Lancement du script"
  314.  
  315. $compteur = 0
  316.  
  317. while ($compteur -lt $serveur.length)
  318. {
  319.  
  320.     if ($serveur[$compteur][0] -ne "")
  321.     {
  322.         $cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($serveur[$compteur][1],(ConvertTo-SecureString -String $serveur[$compteur][2] -AsPlainText -Force))
  323.      
  324.         $ram_check = ram_check $serveur[$compteur][0] $username $password
  325.        
  326.         if ($ram_check -eq 1)
  327.         {
  328.            $compteur = $compteur+1
  329.            continue
  330.         }
  331.         $CPU_check = CPU_check $repeat_count $cpu_threshold $sleep_interval $serveur[$compteur][0]
  332.         if ($CPU_check -eq 1)
  333.         {
  334.             $compteur = $compteur+1
  335.             continue
  336.         }
  337.        
  338.         $disk_check = disk_check $serveur[$compteur][0]
  339.         if ($disk_check -eq 1)
  340.         {
  341.           $compteur = $compteur+1
  342.           continue
  343.         }
  344.        
  345.         $services_check = services_check $serveur[$compteur][0]    
  346.         if ($services_check -eq 1)
  347.         {
  348.             $compteur = $compteur+1
  349.             continue
  350.         }
  351.          $processus_check = processus_check $serveur[$compteur][0]
  352.     }
  353.     $compteur = $compteur+1
  354. }
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361. $date = Get-Date
  362. $date = $date.ToShortDateString()
  363.  
  364.  
  365.  
  366. if (-not (Test-Path $config_file -ErrorAction "silentlycontinue"))
  367. {
  368.     $date >> $config_file
  369. }
  370.  
  371. $get_date_file = Get-Content ($config_file)
  372.  
  373. if ($date -ne $get_date_file)
  374. {
  375.     rm $config_file
  376.     $date >> $config_file
  377.     mail "Surveillance" "Le script de surveillance s'est bien exécuté." $wcr $from $smtp_serveur $dest
  378. }
  379.  
  380. write_log "INFO: Fin du script"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement