Below is a powershell script whereas it is been coded based on the general SQL backup strategy like weekly full daily differential and hourly log backup.
Code below:
# Continue even if there are errors
$ErrorActionPreference = "Continue";
# EMAIL PROPERTIES
$SMTPServer = "smtp-relay.xyz.im"
$Username = "xyz@gmail.com"
$to = "mvkally@gmail.com"
$subject = "Backup & Database Daily Health Check Report"
# REPORT PROPERTIES
# Path to the report
$reportPath = "C:\Backupcheck\report\";
# Report name
$reportName = "BackupReport_$(get-date -format ddMMyyyy).html";
# Path and Report name together
$BackupReport = $reportPath + $reportName
#Set colors for table cell backgrounds
$redColor = "#e50000"
$greenColor ="#00b200"
$greyColor = "#D3D3D3"
$whiteColor = "#FFFFFF"
# Get computer list to check backup
$computers = Get-Content "C:\Backupcheck\serverlist.txt";
$datetime = Get-Date -Format "MM-dd-yyyy_HHmmss";
# Remove the report if it has already been run today so it does not append to the existing report
If (Test-Path $Backupreport)
{
Remove-Item $Backupreport
}
# Cleanup old files older than 7 days..
$Daysback = "-7"
$CurrentDate = Get-Date;
$DateToDelete = $CurrentDate.AddDays($Daysback);
Get-ChildItem $reportPath | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item;
# Create and write HTML Header of report
$titleDate = get-date -uformat "%d-%m-%Y - %A"
$header = "
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>
<title>DiskSpace Report</title>
<STYLE TYPE='text/css'>
</style>
</head>
<body>
<table width='100%'>
<tr bgcolor='#548DD4'>
<td colspan='7' height='30' align='center'>
<font face='calibri' color='#003399' size='4'><strong>Backup & Database Daily Health Check Report for $titledate</strong></font>
</td>
</tr>
</table>
"
Add-Content $Backupreport $header
# Create and write Table header for report
$tableHeader = "
<table width='100%'><tbody>
<tr bgcolor=#548DD4>
<td width='45%' align='center' >Database Name</td>
<td width='15%' align='center' >Last Full Backup Date</td>
<td width='15%' align='center' >Last Diff. Backup Date</td>
<td width='15%' align='center'>Last Log Backup Date</td>
<td width='10%' align='center' >Database Status</td>
<!-- <td width='10%' align='center'>Database Size(MB)</td>
<td width='10%' align='center'>Datafile Size(KB)</td>
<td width='10%' align='center'>Logfile Size(KB)</td> -->
</tr>
"
Add-Content $Backupreport $tableHeader
# Start processing backup check
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null
foreach($computer in $computers)
{
$s = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $computer
$dbs=$s.Databases
$dataHeader = "
<tr>
<td width='10%' colspan='5' bgcolor=`'$greyColor`' align='center' width=100%>Instance name: $computer</td>
</tr>"
Add-Content $Backupreport $dataHeader
# Check for each database
foreach($db in $dbs)
{
if ($db.IsSystemObject -eq $False)
{
$colorfullbk = $greenColor;
$colordiffbk = $greenColor;
$colorlogbk = $greenColor;
$colorstatus = $greenColor;
$today = (Get-Date).DayOfWeek;
$databasename =$db.Name;
[Date]$Fullbackupdt =$db.LastBackupDate;
[Date]$Diffbackupdt =$db.LastDifferentialBackupDate;
[Date]$Logbackupdt = "DB in simple recovery";
$databasestatus=$db.Status;
if ($db.Status -ne 'Normal')
{
$colorstatus=$redColor
}
[float]$databasesize=$db.Size;
#$databasesizeGB = [Math]::Round($databasesize / 1073741824, 2);
if ($db.RecoveryModel -ne 'SIMPLE')
{
[Date]$Logbackupdt =$db.LastLogBackupDate;
if( $today = 'Monday')
{
if($Logbackupdt -lt $CurrentDate.AddDays(-3) )
{
$colorlogbk = $redColor
}
}
elseif($Logbackupdt -lt $CurrentDate.AddDays(-1) )
{
$colorlogbk = $redColor
}
else
{
$colorlogbk = $greenColor
}
}
if( $today = 'Monday')
{
if($Fullbackupdt -lt $CurrentDate.AddDays(-3) )
{
$colorfullbk = $redColor
}
}
elseif($Fullbackupdt -lt $CurrentDate.AddDays(-8) )
{
$colorfullbk = $redColor
}
else
{
$colorfullbk = $greenColor
}
if( $today = 'Monday')
{
if($Diffbackupdt -lt $CurrentDate.AddDays(-4) )
{
$colordiffbk = $redColor
}
}
elseif($Diffbackupdt -lt $CurrentDate.AddDays(-1) )
{
$colordiffbk = $redColor
}
else
{
$colordiffbk = $greenColor
}
# Create table data rows
$dataRow = "
<tr>
<td width='15%' >$databasename</td>
<td width='10%' bgcolor=`'$colorfullbk`' >$Fullbackupdt</td>
<td width='10%' bgcolor=`'$colordiffbk`' >$Diffbackupdt</td>
<td width='10%' bgcolor=`'$colorlogbk`' >$Logbackupdt</td>
<td width='10%' bgcolor=`'$colorstatus`' >$databasestatus</td>
<!-- <td width='10%' >$databasesize</td>
#<td width='10%' >$databasemdffilename</td>
#<td width='10%' >$databasemdfsize</td>
#<td width='10%' >$databaseldffilename</td>
#<td width='10%' >$databaseldfsize</td> -->
</tr>
"
Add-Content $Backupreport $dataRow;
}
$i++
#}
}
}
# Create table at end of report showing legend of colors for the critical and warning
$tableDescription = "
</table><br>
<table width='20%'>
<tr bgcolor='White'>
<td width='5%' align='center' bgcolor='#FF0000'> Hurray!!! Success :-) </td>
<td width='5%' align='center' bgcolor='#e50000'> Error??? Something to look into :-( </td>
</tr>
"
Add-Content $Backupreport $tableDescription
Add-Content $Backupreport "</body></html>"
$message = New-Object System.Net.Mail.MailMessage
$message.subject = $subject
$message.IsBodyHtml = $true
$message.body = get-content $Backupreport
$message.to.add($to)
$message.from = $username
$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer);
#$smtp.send($message)
write-output “Email Sent!!”
--------------------------------------------------------------------------------------------------------------------------
Drive Space Check (HDD / SSD drives)
# Continue even if there are errors
$ErrorActionPreference = "Continue";
# Set your warning and critical thresholds
$percentWarning = 25;
$percentCritcal = 15;
# EMAIL PROPERTIES
$SMTPServer = "smtp-relay.abc.in"
$Username = "xyz@gmail.com"
$to = "mvkally@gmail.com"
$subject = "Disk Space Monitoring Report"
# REPORT PROPERTIES
# Path to the report
$reportPath = "C:\ps1\report\";
# Report name
$reportName = "DiskSpaceRpt_$(get-date -format ddMMyyyy).html";
# Path and Report name together
$diskReport = $reportPath + $reportName
#Set colors for table cell backgrounds
$redColor = "#FF0000"
$orangeColor = "#FBB917"
$whiteColor = "#FFFFFF"
# Count if any computers have low disk space. Do not send report if less than 1.
$i = 0;
# Get computer list to check disk space
$computers = Get-Content "C:\ps1\serverlist.txt";
$datetime = Get-Date -Format "MM-dd-yyyy_HHmmss";
# Remove the report if it has already been run today so it does not append to the existing report
If (Test-Path $diskReport)
{
Remove-Item $diskReport
}
# Cleanup old files..
$Daysback = "-1"
$CurrentDate = Get-Date;
$DateToDelete = $CurrentDate.AddDays($Daysback);
Get-ChildItem $reportPath | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item;
# Create and write HTML Header of report
$titleDate = get-date -uformat "%m-%d-%Y - %A"
$header = "
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>
<title>DiskSpace Report</title>
<STYLE TYPE='text/css'>
</style>
</head>
<body>
<table width='100%'>
<tr bgcolor='#548DD4'>
<td colspan='7' height='30' align='center'>
<font face='calibri' color='#003399' size='4'><strong>Daily Morning Report for $titledate</strong></font>
</td>
</tr>
</table>
"
Add-Content $diskReport $header
# Create and write Table header for report
$tableHeader = "
<table width='100%'><tbody>
<tr bgcolor=#548DD4>
<td width='10%' align='center'>Server</td>
<td width='5%' align='center'>Drive</td>
<td width='15%' align='center'>Drive Label</td>
<td width='10%' align='center'>Total Capacity(GB)</td>
<td width='10%' align='center'>Used Capacity(GB)</td>
<td width='10%' align='center'>Free Space(GB)</td>
<td width='15%' align='center'>Freespace %</td>
<!-- <td width='5%' align='center'>RAM %</td>
<td width='5%' align='center'>CPU %</td> -->
</tr>
"
Add-Content $diskReport $tableHeader
# Start processing disk space
foreach($computer in $computers)
{
$disks = Get-WmiObject -ComputerName $computer -Class Win32_LogicalDisk -Filter "DriveType = 3"
$computer = $computer.toupper()
foreach($disk in $disks)
{
$deviceID = $disk.DeviceID;
$volName = $disk.VolumeName;
[float]$size = $disk.Size;
[float]$freespace = $disk.FreeSpace;
$percentFree = [Math]::Round(($freespace / $size) * 100);
$sizeGB = [Math]::Round($size / 1073741824, 2);
$freeSpaceGB = [Math]::Round($freespace / 1073741824, 2);
# Set background color to Orange if just a warning
if($percentFree -lt $percentWarning)
{
$color = $orangeColor
#}
# Set background color to Orange if space is Critical
if($percentFree -lt $percentCritcal)
{
$color = $redColor
}
# Create table data rows
$dataRow = "
<tr>
<td width='10%'>$computer</td>
<td width='5%' align='center'>$deviceID</td>
<td width='10%' >$volName</td>
<td width='10%' align='center'>$sizeGB</td>
<td width='10%' align='center'>$usedSpaceGB</td>
<td width='10%' align='center'>$freeSpaceGB</td>
<td width='15%' bgcolor=`'$color`' align='center'>$percentFree</td>
<!-- <td width='5%' align='center'>$RAMpercent</td>
<td width='5%' align='center'>$CPUpercent</td> -->
</tr>
"
Add-Content $diskReport $dataRow;
Write-Host -ForegroundColor DarkYellow "$computer $deviceID percentage free space = $percentFree";
$i++
}
}
}
# Create table at end of report showing legend of colors for the critical and warning
$tableDescription = "
</table><br><table width='20%'>
<tr bgcolor='White'>
<td width='10%' align='center' bgcolor='#FBB917'>Warning less than $percentWarning free space</td>
<td width='10%' align='center' bgcolor='#FF0000'>Critical less than $percentCritcal free space</td>
</tr>
"
Add-Content $diskReport $tableDescription
Add-Content $diskReport "</body></html>"
$message = New-Object System.Net.Mail.MailMessage
$message.subject = $subject
$message.IsBodyHtml = $true
$message.body = get-content $diskReport
$message.to.add($to)
$message.from = $username
$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer);
$smtp.send($message)
write-output “Email Sent!!”
----------------------------------------------------------------------------------------------------------------------------
Drive Space Check ( for mount drives)
# Continue even if there are errors
$ErrorActionPreference = "Continue";
# Set your warning and critical thresholds
$percentWarning = 25;
$percentCritcal = 10;
# EMAIL PROPERTIES
$SMTPServer = "smtp-relay.abc.in"
$Username = "xyz@gmail.com"
$to = "mvkally@gmail.com"
$subject = "Disk Space Monitoring Report"
# REPORT PROPERTIES
# Path to the report
$reportPath = "C:\Diskspace\report\";
# Report name
$reportName = "DiskSpaceRpt_$(get-date -format ddMMyyyy).html";
# Path and Report name together
$diskReport = $reportPath + $reportName
#Set colors for table cell backgrounds
$redColor = "#FF0000"
$orangeColor = "#FBB917"
$whiteColor = "#FFFFFF"
# Count if any computers have low disk space. Do not send report if less than 1.
$i = 0;
# Get computer list to check disk space
$computers = Get-Content "C:\Diskspace\serverlist.txt";
$datetime = Get-Date -Format "MM-dd-yyyy_HHmmss";
# Remove the report if it has already been run today so it does not append to the existing report
If (Test-Path $diskReport)
{
Remove-Item $diskReport
}
# Cleanup old files..
$Daysback = "-1"
$CurrentDate = Get-Date;
$DateToDelete = $CurrentDate.AddDays($Daysback);
Get-ChildItem $reportPath | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item;
# Create and write HTML Header of report
$titleDate = get-date -uformat "%m-%d-%Y - %A"
$header = "
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>
<title>DiskSpace Report</title>
<STYLE TYPE='text/css'>
</style>
</head>
<body>
<table width='100%'>
<tr bgcolor='#548DD4'>
<td colspan='7' height='30' align='center'>
<font face='calibri' color='#003399' size='4'><strong>Disk space report(WK-GS prod) for $titledate</strong></font>
</td>
</tr>
</table>
"
Add-Content $diskReport $header
# Create and write Table header for report
$tableHeader = "
<table width='100%'><tbody>
<tr bgcolor=#548DD4>
<td width='10%' align='center'>Server</td>
<td width='5%' align='center'>Drive</td>
<td width='15%' align='center'>Drive Label</td>
<td width='10%' align='center'>Total Capacity(GB)</td>
<td width='10%' align='center'>Used Capacity(GB)</td>
<td width='10%' align='center'>Free Space(GB)</td>
<td width='15%' align='center'>Freespace %</td>
</tr>
"
Add-Content $diskReport $tableHeader
# Start processing disk space
foreach($computer in $computers)
{
$disks = Get-WmiObject -ComputerName $computer -Class Win32_Volume -Filter "DriveType = 3"
$computer = $computer.toupper()
foreach($disk in $disks)
{
$deviceID = $disk.Name;
$volName = $disk.Label;
[float]$size = $disk.Capacity;
[float]$freespace = $disk.FreeSpace;
$percentFree = [Math]::Round(($freespace / $size) * 100);
$sizeGB = [Math]::Round($size / 1073741824, 2);
$freeSpaceGB = [Math]::Round($freespace / 1073741824, 2);
$usedSpaceGB = $sizeGB - $freeSpaceGB;
$color = $whiteColor;
# Set background color to Orange if just a warning
if($percentFree -lt $percentWarning)
{
$color = $orangeColor
#}
# Set background color to Orange if space is Critical
if($percentFree -lt $percentCritcal)
{
$color = $redColor
}
# Create table data rows
$dataRow = "
<tr>
<td width='10%'>$computer</td>
<td width='5%' align='center'>$deviceID</td>
<td width='10%' >$volName</td>
<td width='10%' align='center'>$sizeGB</td>
<td width='10%' align='center'>$usedSpaceGB</td>
<td width='10%' align='center'>$freeSpaceGB</td>
<td width='15%' bgcolor=`'$color`' align='center'>$percentFree</td>
<!-- <td width='5%' align='center'>$RAMpercent</td>
<td width='5%' align='center'>$CPUpercent</td> -->
</tr>
"
Add-Content $diskReport $dataRow;
Write-Host -ForegroundColor DarkYellow "$computer $deviceID percentage free space = $percentFree";
$i++
}
}
}
# Create table at end of report showing legend of colors for the critical and warning
$tableDescription = "
</table><br><table width='20%'>
<tr bgcolor='White'>
<td width='10%' align='center' bgcolor='#FBB917'>Warning less than $percentWarning free space</td>
<td width='10%' align='center' bgcolor='#FF0000'>Critical less than $percentCritcal free space</td>
</tr>
"
Add-Content $diskReport $tableDescription
Add-Content $diskReport "</body></html>"
$message = New-Object System.Net.Mail.MailMessage
$message.subject = $subject
$message.IsBodyHtml = $true
$message.body = get-content $diskReport
$message.to.add($to)
$message.from = $username
$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer);
$smtp.send($message)
write-output “Email Sent!!”
No comments:
Post a Comment