Dans un précédent article, j’expliquais comment utiliser les CmdLet Veeam pour lister les jobs, mais ça ne fonctionne pas forcémment toujours comme on vboudrait en fonction des différentes versions utilisées.
Par contre avec cette nouvelle solution, vous êtes sûr d’y arriver … nous allons chercher les infos directement dans la base SQL.
Le script créé un fichier html à cet endroit : C:\TMP\VEEAM_JOBS.html
Voici le script :
[powershell]
param(
$Server = "MyServeurSql\VEEAM",
$Database = "VeeamBackup",
$Query= "SELECT [id],[name],[target_dir],[progress],[result],[next_run],[latest_result],[schedule_enabled] FROM [VeeamBackup].[dbo].[ReportJobsView] ORDER BY [name] DESC"
)
# change the SqlConnection
function global:Set-SqlConnection( $Server = $(Read-Host "SQL Server Name"), $Database = $(Read-Host "Database") ) {
$SqlConnection.ConnectionString = "Server = $Server; Database = $Database; Integrated Security = True"
}
#Fonction qui transforme l’heure intl à l’heure française
$strCurrentTimeZone = (Get-WmiObject win32_timezone).StandardName
Function Get-LocalTime($UTCTime)
{
#$strCurrentTimeZone = (Get-WmiObject win32_timezone).StandardName
$strCurrentTimeZone = "Romance Standard Time"
$TZ = [System.TimeZoneInfo]::FindSystemTimeZoneById($strCurrentTimeZone)
$LocalTime = [System.TimeZoneInfo]::ConvertTimeFromUtc($UTCTime, $TZ)
Return $LocalTime
}
function global:Get-SqlDataTable($Query) {
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $Query
$SqlCmd.CommandTimeout = 500
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
#Ajout d’une colonne (STATUS)
$Col1 = New-Object system.Data.DataColumn Status,([string])
$DataSet.Tables[0].Columns.Add($Col1)
#modification colonne next_run en string
Foreach ($MaDatarow in $DataSet.Tables[0].Rows)
{
switch ($MaDatarow["result"])
{
0 { $MaDatarow["Status"] = "OK";}#break}
2 { $MaDatarow["Status"] = "FAILED";}#break}
3 { $MaDatarow["Status"] = "WARNING";}#break}
}
switch ($MaDatarow["progress"])
{
100 {}#break}
default {$MaDatarow["Name"] = $MaDatarow["Name"] + " [" + $MaDatarow["progress"] + "%]"}
}
switch ($MaDatarow["schedule_enabled"])
{
$null{} #break}
$True {} #break}
default { if($MaDatarow["next_run"] -ne ""){ $MaDatarow["next_run"] = ‘/!\ {0}’ -f $MaDatarow["next_run"]}}
}
}
Start-Sleep -Seconds 5
$color = $false
$htmlFinal = ""
$htmlTMP = ""
return $DataSet.Tables[0] | ConvertTo-HTML -Property Name,target_dir,next_run,Status -Fragment |
ForEach-Object{
$htmlTMP = $_
$htmlTMP = $htmlTMP -replace ‘<td>OK</td>’, ‘<td bgcolor=#33CC66>OK</td>’
if($htmlTMP -match ‘<td>WARNING</td>’)
{
$htmlTMP = $htmlTMP -replace ‘<tr>’, ‘<tr bgcolor=#FF9900">’
}
elseif($_ -match ‘<td>FAILED</td>’)
{
$htmlTMP = $htmlTMP -replace ‘<tr>’, ‘<tr bgcolor="#FF0000">’
}
if(($htmlTMP -match ‘<tr>’) -and ($color -eq $true))
{
$htmlTMP = $htmlTMP -replace ‘<tr>’, ‘<tr bgcolor="#CCCCCC">’
}
if ($color -eq $true){$color = $false}
else{$color = $true}
$htmlTMP | Out-File ("C:\TMP\VEEAM_JOBS.html")-Append
#$htmlFinal = $htmlFinal + $htmlTMP
}
#$htmlFinal | Out-File ("C:\TMP\VEEAM_JOBS.html")
}
# Initialize the SqlConnection variable
Set-Variable SqlConnection (New-Object System.Data.SqlClient.SqlConnection) -Scope Global -Option AllScope -Desc "Personal variable for Sql Query functions"
# Initially create the SqlConnection
Set-SqlConnection $Server $Database
if( $query -gt $null ) {
Get-SqlDataTable $Query
}
#fermeture de la connexion
$SqlConnection.Close()
[/powershell]
Bon scripting …
Alan
22 février 2016 at 16h45
Bonjour,
J’ai essayé ce script, je n’ai pas la table :
[ReportJobsView]
Est-ce un problème de version selon vous ?
J’utilise Veeam Backup & Replication 8.0
(Dommage que vos sujets ne soient pas daté)
Merci d’avance pour votre réponse,
Thomas Delahaye
8 avril 2016 at 9h07
Bonjour Alan,
Ce script avait été créé pour une ancienne version de Veeam (article du 27 octobre 2013).
Je te conseille de te connecter à la base, de récupérer une des tables qui débute par Report afin d’avoir les infos qui t’intéressent le plus.
Ensuite, tu utilises ta requête SQL dans un script similaire à cette page.
Je te remercie pour ta remarque sur l’horodatage des messages, il existe bien en page d’accueil mais n’est pas affiché sur la page de l’article … je vais voir pour la rajouter.
Bonne continuation
Thomas