Tape library and drive discovery

Microsoft.SystemCenter.DataProtectionManager.2011.Discovery.LibraryAndDriveDiscovery (Discovery)

Element properties:

TargetMicrosoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer
EnabledTrue
Frequency86400
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:
Discovered relationships and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
LibraryAndTapeDriveDiscovery DataSource Microsoft.Windows.TimedPowerShell.DiscoveryProvider Default

Source Code:

<Discovery ID="Microsoft.SystemCenter.DataProtectionManager.2011.Discovery.LibraryAndDriveDiscovery" Enabled="true" Target="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer" ConfirmDelivery="true" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"/>
<DiscoveryClass TypeID="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"/>
<DiscoveryRelationship TypeID="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServerHostsLibrary"/>
<DiscoveryRelationship TypeID="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibraryHostsTapeDrive"/>
</DiscoveryTypes>
<DataSource ID="LibraryAndTapeDriveDiscovery" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider">
<IntervalSeconds>86400</IntervalSeconds>
<SyncTime/>
<ScriptName>LibraryAndDriveDiscovery.ps1</ScriptName>
<ScriptBody><Script>
#Read input parameters
param($sourceType, $sourceId, $managedEntityId, [string] $dpmServerName)

function DisplayError()
{
param($description, $severity, $errorCode, $exceptionString, $resolutionString)

$evt = new-object System.Diagnostics.EventLog("DPM Alerts");
$evt.Source = "DPM-EM";
$eventSeverity = [System.Diagnostics.EventLogEntryType]::Information;

#severity = 0 is info and severity = 1 is warning
if($severity -eq 1)
{
$eventSeverity = [System.Diagnostics.EventLogEntryType]::Warning;
}

$errString = new-object system.text.stringBuilder
$errString.AppendLine($description)

if($exceptionString -ne $null)
{
$errString.AppendLine()
$errString.AppendLine("Problem: " + $exceptionString)
}

if($resolutionString -ne $null)
{
$errString.AppendLine()
$errString.AppendLine("Resolution: " + $resolutionString)
}

$evt.WriteEntry($errString.ToString(), $eventSeverity, $errorCode);


}


#######################################################################################################
## This script discovers all tape libraries and their drives and relation between Library and Drives ##
#######################################################################################################

# Load DPM snapin
$dpmBinPath = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft Data Protection Manager\Setup" "UIInstallPath").UIInstallPath
. "$dpmBinPath\GlobalFunctions.ps1"
LoadDPMSnapin

#Create and Instantinate SCOM discovery objects
$api = New-Object -comObject 'MOM.ScriptAPI'
$discoveryData = $api.CreateDiscoveryData(0, $sourceId, $managedEntityId)

try
{
#Connect to DPM server
$err = $($dpmServer = Connect-DPMServer -DPMServerName $dpmServerName) 2&gt;&amp;1

if (!$dpmServer)
{
$desc = "Tape Library and Drive discovery: Unable to connect to DPM:" + $dpmServerName

if($err)
{
DisplayError $desc 1 111 $err.Exception.ToString() $err.Exception.Error.Resolution.ToString()
}
else
{
DisplayError $desc 1 111 $null $null
}
exit 1
}

#Get all library
$err = $($libraryList = @(Get-DPMLibrary $dpmServerName)) 2&gt;&amp;1

$desc = "Tape Library and Drive discovery started event. Number of libraries = " + $libraryList.Count

if($err)
{
$desc = "Failed to retrieve library list in tape library and drive discovery"
DisplayError $desc 1 112 $err.Exception.ToString() $err.Exception.Error.Resolution.ToString()
}
else
{
DisplayError $desc 0 112 $null $null
}

if($libraryList)
{
$libraryList = $libraryList | Sort-Object $_.UserFriendlyName
}

if($libraryList)
{
foreach($library in $libraryList)
{
#if library is not offline OR is offline but has PG then report the library in discovery
if($library.IsOffline -eq $false -or ($library.IsOffline -eq $true -and $library.ProtectionGroups -ne $null -and $library.ProtectionGroups -ne ""))
{
[int]$driveCount = 0
#Get online dirves
$driveList = @(Get-TapeDrive -DPMLibrary $library)
$onlineDriveList = new-object System.Collections.ArrayList;
foreach($drive in $driveList)
{
if($drive.IsOffline -eq $false)
{
$driveCount = $onlineDriveList.Add($drive);
}
}

$driveCount = $onlineDriveList.Count;

$libraryInstance = $discoveryData.CreateClassInstance('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]$');
$libraryInstance.AddProperty('$MPElement[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName$', $dpmServerName);
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMSeed"]/DPMServerName$', $dpmServerName)
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer"]/DPMServerName$', $dpmServerName)
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]/DPMObjectID$', $library.Id.ToString());
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]/AttachedComputerName$', $library.MachineName);
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]/NumberOfDrives$', $driveCount);
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]/NumberOfSlots$', $library.GetSlotCollection().Count);
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]/NumberOfIEPorts$', $library.NumberOfIEPortSlots);
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]/LibrarySerialNumber$', $library.SerialNumber);
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]/ProductID$', $library.ProductId.ToString());
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]/VenderID$', $library.VendorId.ToString());
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]/DPMServerName$', $dpmServerName);
$libraryInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]/LibraryType$', $library.Type.ToString());
$libraryInstance.AddProperty('$MPElement[Name="System!System.Entity"]/DisplayName$', $library.UserFriendlyName);
$discoveryData.AddInstance($libraryInstance)

if($onlineDriveList)
{
$onlineDriveList = $onlineDriveList | Sort-Object $_.ProductId
}

foreach($drive in $onlineDriveList)
{
$SCSIId = "Port:" + $drive.SCSIPort + " Bus:" + $drive.SCSIBus + " Target:" + $drive.SCSITargetId + " Lun:" + $drive.SCSILun;
$readErrors = "Critical:" + $drive.HardReadErrors + " | " + "Transient:" + $drive.SoftReadErrors;
$writeErrors = "Critical:" + $drive.HardWriteErrors + " | " + "Transient:" + $drive.SoftWriteErrors;

$driveInstance = $discoveryData.CreateClassInstance('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]$')
$driveInstance.AddProperty('$MPElement[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName$', $dpmServerName);
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMSeed"]/DPMServerName$', $dpmServerName);
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer"]/DPMServerName$', $dpmServerName);
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMLibrary"]/DPMObjectID$', $library.Id.ToString());
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]/DPMObjectID$', $drive.Id.ToString());
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]/WindowsName$', $drive.AccessPath)
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]/LibraryName$', $library.UserFriendlyName);
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]/DriveType$', $drive.MediaTypesSupported)
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]/DriveSerialNumber$', $drive.SerialNumber);
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]/LastCleaned$', $drive.LastCleaningDate)
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]/ReadErrorsSinceLastCleaned$', $readErrors)
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]/WriteErrorsSinceLastCleaned$', $writeErrors)
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]/DPMServerName$', $dpmServerName);
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]/SCSIID$', $SCSIId);
$driveInstance.AddProperty('$MPElement[Name="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.TapeDrive"]/LibraryID$', $library.Id.ToString());
$driveInstance.AddProperty('$MPElement[Name="System!System.Entity"]/DisplayName$', $drive.ProductId)
$discoveryData.AddInstance($driveInstance);

Remove-Variable driveInstance -Confirm:$false
}
Remove-Variable libraryInstance -Confirm:$false
}
}
}


}
catch
{
$desc = "Exception in Library and drive discovery"
DisplayError $desc 1 112 $_.ToString() $null
throw $_
}

$desc = "Tape Library and Drive discovery completed event"
DisplayError $desc 0 113 $null $null

#return discovery data
$discoveryData

#Cleanup Variables
Remove-Variable sourceType -Confirm:$false
Remove-Variable sourceId -Confirm:$false
Remove-Variable managedEntityId -Confirm:$false
Remove-Variable discoveryData -Confirm:$false
Remove-Variable api -Confirm:$false
</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>SourceType</Name>
<Value>0</Value>
</Parameter>
<Parameter>
<Name>SourceId</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>ManagedEntityId</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>DPMServerName</Name>
<Value>$Target/Property[Type="SCDPM!Microsoft.SystemCenter.DataProtectionManager.2011.Library.DPMServer"]/DPMServerName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>7200</TimeoutSeconds>
</DataSource>
</Discovery>