Veeam Backup Repository Discovery

Veeam.Backup.BackupRepository.Discovery (Discovery)

This discovery rule creates Veeam Backup Repository object

Knowledge Base article:

Summary

This rule is used to discover (create) instances of MP for Veeam Backup & Replication objects in Operations Manager.

These discovery rules will insert objects such as Veeam Backup Enterprise Manager, Veeam backup servers, backup proxies, backup repositories, WAN accelerators and backup jobs.

This discovery will create objects in Operations Manager which may be essential for MP for Veeam Backup functionality and should not be disabled or modified unless advised by Veeam support.

External

Refer to the Microsoft System Center Online Documentation for more information on Operations Manager features such as discoveries. Refer to the MP for Veeam Backup & Replication Documentation for more details on advanced MP functionality.

Element properties:

TargetVeeam.Backup.BackupServer
EnabledTrue
Frequency3600
RemotableFalse

Object Discovery Details:

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

Member Modules:

ID Module Type TypeId RunAs 
DS1 DataSource Veeam.Backup.ScriptDatasource.Discovery Default

Source Code:

<Discovery ID="Veeam.Backup.BackupRepository.Discovery" Enabled="true" Target="VBBD!Veeam.Backup.BackupServer" ConfirmDelivery="false" Remotable="true" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="VBL!Veeam.Backup.BackupRepository">
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
<Property TypeID="Windows!Microsoft.Windows.Computer" PropertyID="PrincipalName"/>
<Property TypeID="VBL!Veeam.Backup.BackupRepository" PropertyID="InstanceUid"/>
<Property TypeID="VBL!Veeam.Backup.BackupRepository" PropertyID="MaxConcurrentJobs"/>
<Property TypeID="VBL!Veeam.Backup.BackupRepository" PropertyID="Capacity"/>
<Property TypeID="VBL!Veeam.Backup.BackupRepository" PropertyID="RepositoryPath"/>
<Property TypeID="VBL!Veeam.Backup.BackupRepository" PropertyID="vPowerNFS"/>
<Property TypeID="VBL!Veeam.Backup.BackupRepository" PropertyID="Type"/>
<Property TypeID="VBL!Veeam.Backup.BackupRepository" PropertyID="Version"/>
<Property TypeID="VBL!Veeam.Backup.BackupRepository" PropertyID="Host"/>
</DiscoveryClass>
<DiscoveryClass TypeID="VBL!Veeam.Backup.BackupRepository.Container">
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
<Property TypeID="Windows!Microsoft.Windows.Computer" PropertyID="PrincipalName"/>
<Property TypeID="VBL!Veeam.Backup.BackupRepository.Container" PropertyID="BackupServer"/>
</DiscoveryClass>
<DiscoveryRelationship TypeID="VBL!Veeam.Backup.BackupRepositoryContainerHostsBackupRepository"/>
<DiscoveryRelationship TypeID="VBL!Veeam.Backup.BackupServerHostsBackupRepositoryContainer"/>
</DiscoveryTypes>
<DataSource ID="DS1" TypeID="VBBD!Veeam.Backup.ScriptDatasource.Discovery">
<IntervalSeconds>3600</IntervalSeconds>
<SyncTime/>
<ScriptName>BackupRepositoryDiscovery.js</ScriptName>
<Arguments>$MPElement$ $Target/Id$ $Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Arguments>
<ScriptBody><Script>var SCRIPT_NAME = "BackupRepositoryDiscovery.js";
var _argumentsCount = 3;
var _sourceId = null;
var _managedEntityId = null;
var _computer = null;

var _eventId = 3502;
var _momApi = new ActiveXObject("MOM.ScriptAPI");

Main();

function Main() {
try {
SetGlobalVarsFromArguments();

var discoveryData = _momApi.CreateDiscoveryData(0, _sourceId, _managedEntityId);
var dict = new ActiveXObject("Scripting.Dictionary");
var objSWbemLocator = new ActiveXObject("WbemScripting.SWbemLocator");
var wmiSvc = objSWbemLocator.ConnectServer(".", "root\\veeamBS");

var bsQuery = "SELECT * FROM BackupServer";
var bsRes = wmiSvc.ExecQuery(bsQuery);
var bsVer = "";
if (bsRes.Count == 1) {
var bsItem = bsRes.ItemIndex(0);
var verProp = bsItem.Properties_.Item("Version");
if (verProp != null) {
bsVer = verProp.Value;
}
}

if (bsVer == null || bsVer == "" || !bsVer.match(/^([7-9]|[1-9]\d{1,})\..*$/)) {
if (bsVer != null &amp;&amp; bsVer != "") {
_momApi.LogScriptEvent(SCRIPT_NAME, _eventId, 4, "Veeam Backup Version " + bsVer + " is not supported, skipping discovery.");
} else {
_momApi.LogScriptEvent(SCRIPT_NAME, _eventId, 4, "Veeam Backup Version is not defined, skipping discovery.");
}

discoveryData.isSnapshot = false;
_momApi.Return(discoveryData);
WScript.Quit(0);
}


var source = discoveryData.CreateClassInstance("$MPElement[Name='VBBD!Veeam.Backup.BackupServer']$");
source.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", _computer);

var repositoryContainer = discoveryData.CreateClassInstance("$MPElement[Name='VBL!Veeam.Backup.BackupRepository.Container']$");
repositoryContainer.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", _computer);
repositoryContainer.AddProperty("$MPElement[Name='VBL!Veeam.Backup.BackupRepository.Container']/BackupServer$", _computer);
repositoryContainer.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "Veeam Backup Repositories");
discoveryData.AddInstance(repositoryContainer);

var oRelCon = discoveryData.CreateRelationshipInstance("$MPElement[Name='VBL!Veeam.Backup.BackupServerHostsBackupRepositoryContainer']$");
oRelCon.Source = source;
oRelCon.Target = repositoryContainer;

discoveryData.AddInstance(oRelCon);

var reposVPowerQuery1 = "SELECT * FROM RepositoryToVPowerServer";
var reposVPowerwmi1 = wmiSvc.ExecQuery(reposVPowerQuery1);

var vPowerQuery1 = "SELECT * FROM VPowerServer";
var vPowerwmi1 = wmiSvc.ExecQuery(vPowerQuery1);

for (var Relation = new Enumerator(reposVPowerwmi1); !Relation.atEnd(); Relation.moveNext()) {
var vpowerNFS = null;
var antecedent = GetCollectionItem(Relation, "Antecedent");
var dependent = GetCollectionItem(Relation, "Dependent");
if (antecedent != "" &amp;&amp; dependent != "") {
var repUid = antecedent.replace("Repository.InstanceUid=\"", "").replace("\"", "");
var vpowerUid = dependent.replace("VPowerServer.InstanceUid=\"", "").replace("\"", "");
for (var vPower = new Enumerator(vPowerwmi1); !vPower.atEnd(); vPower.moveNext()) {
p = GetCollectionItem(vPower, "InstanceUid");
if (p == vpowerUid) {
vpowerNFS = GetCollectionItem(vPower, "Name");
//[KI] Catch dublicate VpowerServer instances which are supposedly appear after path installation
if (!dict.Exists(repUid)) {
dict.Add(repUid, vpowerNFS);
}
}
}
}
}

var repoToHost = BuildRelationshipDictionary("BackupRepositoryToHostSystem", wmiSvc);

var repositoryQuery1 = "SELECT * FROM Repository";
var repositorywmi1 = wmiSvc.ExecQuery(repositoryQuery1);
for (var Repository = new Enumerator(repositorywmi1); !Repository.atEnd(); Repository.moveNext()) {
var instanceUid = GetCollectionItem(Repository, "InstanceUid");
if (instanceUid != "") {
var repository = discoveryData.CreateClassInstance("$MPElement[Name='VBL!Veeam.Backup.BackupRepository']$");
repository.AddProperty("$MPElement[Name='VBL!Veeam.Backup.BackupRepository']/InstanceUid$", instanceUid);
repository.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", _computer);
p = GetCollectionItem(Repository, "ConcurrentJobsMax");
repository.AddProperty("$MPElement[Name='VBL!Veeam.Backup.BackupRepository']/MaxConcurrentJobs$", p);
p = GetCollectionItem(Repository, "Capacity");
var capacityGb = p / 1073741824;
repository.AddProperty("$MPElement[Name='VBL!Veeam.Backup.BackupRepository']/Capacity$", capacityGb.toFixed(2));
p = GetCollectionItem(Repository, "Name");
repository.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", p);
repository.AddProperty("$MPElement[Name='VBL!Veeam.Backup.BackupRepository']/RepositoryPath$", GetCollectionItem(Repository, "Path"));
repository.AddProperty("$MPElement[Name='VBL!Veeam.Backup.BackupRepository']/vPowerNFS$", dict.Exists(instanceUid) ? true : false);
if (dict.Exists(instanceUid)) {
var vpowerpath = dict.Item(instanceUid);
repository.AddProperty("$MPElement[Name='VBL!Veeam.Backup.BackupRepository']/vPowerPath$", vpowerpath);
}
repository.AddProperty("$MPElement[Name='VBL!Veeam.Backup.BackupRepository']/Type$", GetRepositoryType(GetCollectionItem(Repository, "Type")));
repository.AddProperty("$MPElement[Name='VBL!Veeam.Backup.BackupRepository']/Version$", bsVer);
var hostName = "";
if (repoToHost.Exists(instanceUid)) {
var hostArr = repoToHost.Item(instanceUid);
if (hostArr.length != 0) {
var hostId = hostArr[0];
var hostQuery = "SELECT * FROM HostSystem";
var hostItems = wmiSvc.ExecQuery(hostQuery);
for (var hostEnum = new Enumerator(hostItems); !hostEnum.atEnd(); hostEnum.moveNext()) {
var instId = "";
var instName = "";

var hi = hostEnum.item();
var hps = new Enumerator(hi.Properties_);
for (; !hps.atEnd(); hps.moveNext()) {
var hp = hps.item();
if (hp.Name == "Name")
instName = hp.Value;
if (hp.Name == "InstanceUid")
instId = hp.Value;
}

if (instId == hostId) {
hostName = instName;
}
}
}
}

if (hostName != "") {
if (hostName == "This server")
hostName = _computer;
repository.AddProperty("$MPElement[Name='VBL!Veeam.Backup.BackupRepository']/Host$", hostName);
}

discoveryData.AddInstance(repository);

var relContainerRepository = discoveryData.CreateRelationshipInstance("$MPElement[Name='VBL!Veeam.Backup.BackupRepositoryContainerHostsBackupRepository']$");
relContainerRepository.Source = repositoryContainer;
relContainerRepository.Target = repository;
discoveryData.AddInstance(relContainerRepository);
}
}

_momApi.Return(discoveryData);

} catch (e) {
_momApi.LogScriptEvent(SCRIPT_NAME, _eventId, 2, e.message);
}
}

function GetCollectionItem(collection_in, property_in) {
var item = collection_in.item();
var props = new Enumerator(item.Properties_);
for (; !props.atEnd(); props.moveNext()) {
var p = props.item();
if (p.Name == property_in) {
return p.Value;
}
}
return "";
}

function SetGlobalVarsFromArguments() {
if (WScript.Arguments.length != _argumentsCount) {
_momApi.LogScriptEvent(SCRIPT_NAME, _eventId, 2, "Invalid argument count: expected " + _argumentsCount + ", received " + WScript.Arguments.length);
WScript.Quit(0);
}
_sourceId = WScript.Arguments(0);
_managedEntityId = WScript.Arguments(1);
_computer = WScript.Arguments(2);
}

function BuildRelationshipDictionary(relationshipClass, wmiSvc) {
var relDict = new ActiveXObject("Scripting.Dictionary");
var relQuery = "SELECT * FROM " + relationshipClass;
var items = wmiSvc.ExecQuery(relQuery);
for (var enumItems = new Enumerator(items); !enumItems.atEnd(); enumItems.moveNext()) {
var antecedent = "";
var dependent = "";

var item = enumItems.item();
var colProps = new Enumerator(item.Properties_);
for (; !colProps.atEnd(); colProps.moveNext()) {
var p = colProps.item();
if (p.Name == "Antecedent")
antecedent = p.Value;
if (p.Name == "Dependent")
dependent = p.Value;
}

var depId = "";
var antId = "";

var antParts = antecedent.split("=");
if (antParts.length == 2) {
var rightPart = antParts[1];
antId = rightPart.substring(1, rightPart.length - 1);
}

var depParts = dependent.split("=");
if (depParts.length == 2) {
var rightPart = depParts[1];
depId = rightPart.substring(1, rightPart.length - 1);
}

if (relDict.Exists(antId)) {
var depArr = relDict.Item(antId);
if (depArr != null) {
depArr.push(depId);
relDict.Item(antId) = depArr;
}
} else {
var dependents = new Array();
dependents.push(depId);
relDict.Add(antId, dependents);
}
}
return relDict;
}

function GetRepositoryType(typeId) {
switch (typeId) {
case 0:
return "Windows";
case 1:
return "Linux";
case 2:
return "CIFS Share";
default:
return "Unknown Repository Type (" + typeId + ")";
}
}</Script></ScriptBody>
<TimeoutSeconds>300</TimeoutSeconds>
</DataSource>
</Discovery>