Création script
This commit is contained in:
parent
e7b06258bf
commit
56afc579c0
|
@ -0,0 +1,279 @@
|
|||
#Script créé par Nicolas Lang - Sous licence CC-BY-SA
|
||||
#https://nicolaslang.fr
|
||||
|
||||
param(
|
||||
[int]$joursprochains = 0
|
||||
)
|
||||
#Ce paramètre vous permettra de choisir sur combien de jours vous souhaitez analyser les sauvegardes
|
||||
|
||||
#Le serveur SMTP pour l'envoi du mail
|
||||
$mailserver = "smtpserver.domain.local"
|
||||
#L'expéditeur
|
||||
$from = "moi@domain.local"
|
||||
#Le / Les destinateurs
|
||||
$to = @("moi@domain.local","lui@domain.local","eux@autredomaine.fr")
|
||||
|
||||
#On démarre un fichier de log, utile en cas de problème
|
||||
Start-Transcript C:\Temp\BECheck.txt -Force
|
||||
|
||||
|
||||
#On essaie d'importer le module BEMCLI. S'il n'existe pas, alors on arrête le script
|
||||
try
|
||||
{
|
||||
Import-Module BEMCLI
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-Output "Impossible d'importer le module BEMCLI"
|
||||
throw("No BEMCLI")
|
||||
exit
|
||||
}
|
||||
|
||||
#Un peu de texte pour alimenter le fichier de log
|
||||
if ($joursprochains -ne 0)
|
||||
{
|
||||
Write-Output "$((get-date).tolongtimestring()) : Vérification pour les $joursprochains prochains jours."
|
||||
}
|
||||
|
||||
|
||||
Write-Output "$((get-date).tolongtimestring()) : Récupération de l'objet de librairie"
|
||||
|
||||
#On essaie d'obtenir l'objet de libraire. Si c'est impossible, on coupe.
|
||||
try
|
||||
{
|
||||
$librairie = Get-BERoboticLibraryDevice
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-Output "$((get-date).tolongtimestring()) : Impossible de récupérer la libraire : $($Error[0])"
|
||||
throw("Library error")
|
||||
exit
|
||||
}
|
||||
|
||||
# On essaie ensuite de récuperer la liste des backups. Si une erreur se présente, on coupe.
|
||||
try
|
||||
{
|
||||
$listofjobs = Get-BEJob -JobType "Backup"
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-Output "$((get-date).tolongtimestring()) : Impossible de récuperer les jobs : $($error[0])"
|
||||
throw("Backup error")
|
||||
exit
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region inventaire
|
||||
|
||||
#Lancement d'un inventaire. Si pas d'inventaire... et bien... la aussi, on coupe.
|
||||
try
|
||||
{
|
||||
$inventory = Submit-BEInventoryJob -RoboticLibraryDevice $librairie
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-Output "$((get-date).tolongtimestring()) : Une erreur s'est produite durant le lancement de l'inventaire : $($Error[0])"
|
||||
throw("Inventory error")
|
||||
exit
|
||||
|
||||
}
|
||||
#Attente du lancement du job d'inventaire
|
||||
|
||||
#L'outil BEMCLI est assez mal concu sur certains points. Il y a un décallage entre le lancement de l'inventaire et sa détection dans les jobs actifs.
|
||||
#Nous devons donc attendre que l'inventaire déclenché précedemment soit détecté et actif.
|
||||
|
||||
Write-Output "Attente du lancement du job`n"
|
||||
do
|
||||
{
|
||||
try
|
||||
{
|
||||
$jobcheck = Get-BEActiveJobDetail
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-host -NoNewline "-"
|
||||
}
|
||||
$jobfinished = Get-BEJobHistory -FromStartTime (get-date).Date | Where-Object {$_.name -eq $($inventory.name)}
|
||||
|
||||
|
||||
Start-Sleep -Seconds 10
|
||||
Write-Host -NoNewline "-"
|
||||
}
|
||||
until($jobcheck.Name -eq $inventory.Name -or $jobfinished -ne $null)
|
||||
Write-host " "
|
||||
|
||||
#Couleurs jolies pour patienter. Oui. Comme ça.
|
||||
|
||||
$i = 1
|
||||
$z = 15
|
||||
Write-Host $(" " * $((get-host).ui.rawui.buffersize.width)) -BackgroundColor 15
|
||||
Write-Host "Attente de la fin du job d'inventaire"
|
||||
Write-Host $(" " * $((get-host).ui.rawui.buffersize.width)) -BackgroundColor 15
|
||||
|
||||
do {
|
||||
|
||||
if ($i % $((get-host).UI.RawUI.BufferSize.Width) -eq 0)
|
||||
{
|
||||
if ($z -eq 0){$z = 16}
|
||||
$z--
|
||||
Write-host " " -BackgroundColor $z
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Write-Host -NoNewline " " -BackgroundColor $z
|
||||
}
|
||||
$i++
|
||||
Start-Sleep -Seconds 1
|
||||
$endofjob = Get-BEJobHistory -FromStartTime (get-date).Date | Where-Object {$_.name -eq $($inventory.name)}
|
||||
}while ($endofjob -eq $null)
|
||||
|
||||
#Si le job n'est pas en succès, on coupe la et on avertit. Sinon, on continue.
|
||||
|
||||
if ($endofjob.JobStatus -ne "Succeeded")
|
||||
{
|
||||
Write-Output "$((get-date).tolongtimestring()) : Fin de l'inventaire."
|
||||
Send-MailMessage -From $from -To $to -SmtpServer $mailserver -Subject "Erreur durant l'inventaire" -Body [string]($endofjob | ConvertTo-Html) -BodyAsHtml
|
||||
Stop-Transcript
|
||||
throw("ERREUR DURANT L'INVENTAIRE")
|
||||
Exit
|
||||
}
|
||||
Write-Output "$((get-date).tolongtimestring()) : Fin de l'inventaire."
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#Récupération du pool de media géré par BE. Nous recalculons à l'aide d'une propriété dynamique la date car elle est au format texte.
|
||||
#Nous en aurons besoin au format DateTime pour pouvoir faire le tri.
|
||||
|
||||
Write-output "$((get-date).tolongtimestring()) : Récupération des médias gérés par BE."
|
||||
try
|
||||
{
|
||||
$mediapool = (get-bemedia) | Select-Object Name,AllocatedDate,@{Name = "Date ajoutable";Expression = {Get-date $_.AppendableUntilDate}} | Sort-Object "date ajoutable" -Descending
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-output "$((get-date).tolongtimestring()) : Erreur lors de la récupération du pool de médias : $($error[0])"
|
||||
}
|
||||
|
||||
|
||||
#Récupération du contenu de l'autoloader.
|
||||
Write-output "$((get-date).tolongtimestring()) : Récupération du contenu de l'autoloader."
|
||||
try
|
||||
{
|
||||
$slots = Get-BERoboticLibrarySlot -RoboticLibraryDevice $librairie -IsCleaningSlot $false
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-output "$((get-date).tolongtimestring()) : Erreur lors de la récupération des slots de la librairie : $($Error[0])"
|
||||
}
|
||||
|
||||
|
||||
#Récupération des jobs dont le prochain démarrage est entre aujourd'hui et le nombre de jours précisé.
|
||||
$jobrunningtoday = $listofjobs | Where-Object {($_.nextstartdate.date -ge (get-date).Date -and $_.nextstartdate.date -le (get-date).AddDays($joursprochains).Date)} | Select-Object Name,Storage,nextStartDate
|
||||
|
||||
if ($jobrunningtoday -eq $null)
|
||||
{
|
||||
Write-output "$((get-date).tolongtimestring()) : Aucune sauvegarde detectée. Fin du script"
|
||||
throw("No backup")
|
||||
exit
|
||||
}
|
||||
|
||||
|
||||
$tapedefinitions = New-Object System.Collections.ArrayList
|
||||
$validtapes = New-Object System.Collections.ArrayList
|
||||
$analysed = @()
|
||||
|
||||
# Dans la liste des jobs qui seront lancés, nous récupérons l'emplacement utilisé dans la librairie et vérifions le nombre de cassettes sur lequel nous pouvons écrire.
|
||||
foreach ($job in $jobrunningtoday)
|
||||
{
|
||||
if ($job.storage -notin $analysed)
|
||||
{
|
||||
$analysed += $job.storage
|
||||
$slots = Get-BERoboticLibrarySlot -RoboticLibraryPartition $job.storage
|
||||
foreach ($tape in $slots)
|
||||
{
|
||||
try {
|
||||
$writedate = $($($mediapool | Where-Object {$_.name -eq $tape.media})."date ajoutable" | Sort-Object -Property "date ajoutable" -Descending) | Select-Object -First 1 -ErrorAction Stop
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-Host "Pas de date d'écriture sur une cassette"
|
||||
$writedate = get-date "01/01/2001"
|
||||
}
|
||||
$tapedefinitions.Add([PSCUSTOMOBJECT]@{
|
||||
"Media" = $tape.Media
|
||||
"Slot" = $tape.SlotNumber
|
||||
"Storage" = $job.storage
|
||||
"Ecrasable" = $writedate
|
||||
}) | Out-Null
|
||||
}
|
||||
try
|
||||
{
|
||||
$toadd = $($tapedefinitions | Where-Object {$_.storage -eq $job.storage -and $_.ecrasable -lt $job.nextstartdate -and $_.media -and $_.media -ne $null})
|
||||
foreach ($addit in $toadd)
|
||||
{
|
||||
$validtapes.add($addit) | Out-Null
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-output "$((get-date).tolongtimestring()) : Détection d'une erreur sur l'ajout de $($toadd.media) dans la liste des cassettes valides"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
$groupedjobs = $jobrunningtoday | Group-Object Storage
|
||||
$groupedtapes = $validtapes | Group-Object Storage
|
||||
$errorarray = New-Object System.Collections.ArrayList
|
||||
|
||||
# En fonction de si l'on a le nombre précis de cassettes necessaires pour les sauvegardes (Ex : 2 backups a faire et 2 cassettes à disposition),
|
||||
# nous affichons un message d'alerte.
|
||||
# Si c'est un nombre inférieur, nous affichons une erreur
|
||||
foreach ($line in $groupedjobs)
|
||||
{
|
||||
$oktapes = $($groupedtapes | Where-Object {$_.name -eq $line.name})
|
||||
if ($line.count -gt $oktapes.count)
|
||||
{
|
||||
$errorarray.Add([PSCUSTOMOBJECT]@{
|
||||
"Niveau" = "DANGER"
|
||||
"Erreur" = "$($line.count) sauvegardes ($($line.Group.name)) dans les logements $($line.name), mais seulement $($oktapes.Count) disponible(s) $($oktapes.group.media)"
|
||||
})
|
||||
}
|
||||
elseif ($line.count -eq $oktapes.count)
|
||||
{
|
||||
$errorarray.Add([PSCUSTOMOBJECT]@{
|
||||
"Niveau" = "Avertissement"
|
||||
"Erreur" = "Juste assez de cassettes disponibles en écriture dans les logements $($line.name) pour faire la/les sauvegarde(s) $($line.Group.name). Si une sauvegarde demande plus d'une cassette, une sera bloquée en attente de média!"
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#Et nous envoyons le mail avec toutes les informations nécessaires
|
||||
$body = ""
|
||||
$subject = "Liste des cassettes"
|
||||
$priority = "Normal"
|
||||
if ($errorarray.Count -gt 0)
|
||||
{
|
||||
$subject = "!!DANGER SUR LES PROCHAINES SAUVEGARDES!!"
|
||||
$priority = "High"
|
||||
$body += $errorarray | ConvertTo-Html
|
||||
$body += "
|
||||
"*5
|
||||
}
|
||||
$choosein = $mediapool | Where-object {$_.name -notin $tapedefinitions.media} | Sort-Object "Date ajoutable"
|
||||
|
||||
$body += "Liste des cartouches triées par date d'écrasement
|
||||
"
|
||||
$body += $choosein | Select-Object Name,"Date ajoutable" | ConvertTo-Html
|
||||
Send-MailMessage -SmtpServer $mailserver -From $from -To $to -Body $body -BodyAsHtml -Subject $subject -Encoding UTF8 -Priority $priority
|
||||
|
||||
|
||||
Stop-Transcript
|
Loading…
Reference in New Issue
Block a user