SCOM SP1 Groups, Classes and SNMP
I've been working on a management pack using some of the examples on the net (Kristopher Bash from the operating-quadrantin has been a huge inspiration) to monitor an Isilon cluster. This had lead me to a number of interesting challenges to over come since I have to design this within the confines of SP1 and I have a unique networking to device configuration.

Device Overview:
The Isilon cluster itself is a number of FreeBSD systems (nodes) joined together via and infiniband backend to create a single NAS. While normally this would not be an issue, network connectivity to the device and SNMP response from the cluster have been. In my configuration I have a total of 8 nodes each node has 2 network interfaces. Of these 16 network interfaces only 2 are accessible/on the same network as my RMS (em1 node2, em1 node4).

Device SNMP Design:
While the cluster is highly dynamic the SNMP sub-systems are not. The MIB created by Isilon does not join the whole of the cluster into an index for SNMP polling. I can only poll a single nodes OID's. To over come this limitation Isilon implemented SNMP-Proxy or comtosec within the system. This allowed me to poll node 3 by changing the community name for the OID I was polling from the discovered name to <discoveredname>_node_3.

MP Design:
Now I'm not the best at MP design since I rarely work within SCOM so don't laugh too hard... I reused items from Kristopher's Cisco MP and created a number of classes for discovery and item hosting. To address the limitation I found within SCOM for dynamic discovery and 1 IP address 1 Community Name, I created a class property within the root called ConfiguredNodes. I can poll the Isilon an populate this value (8). Then I created a sub-class property value called NodeCommStr to fill in all the custom community names I generate using a VB script with Base64 encode/decode, the discovery community name and the ConfiguredNodes value, in the data source for sub-class discovery. public_node_1 public_node_2 etc...

All in all this is working well however I have run into a few design roadblocks and I have some questions.

1. When I discover a set of items within the Isilon cluster the health explorer is not sorting this information alphabetically. Is there a value I can include in the dependency roll-up to correct this?

2. I have run into an issue with the Isilon MIB and I'm looking for the best way to overcome the MIB's design. They included a fan table with fan information and speed of the fans however there is no status (success{0}, warning{1}, error{2}). I created a monitor type to compensate for this and included overrides for the warning and critical event points. This is where I found the curve ball, seems that the fans are not the same.... There are 2 sets of fans - Chassis and Power Supply - and they have different thresholds *rolls eyes*. Some I'm asking for the best design advice, should I create 2 classes, discoveries, monitor types, etc.? Or can I address this issue by creating 2 monitor types with a string filter?

3. I've been successful in creating this MP and displaying the information as a single device however I was wondering if there was a way to create dynamic groups with sub groups. This would have to be 100% dynamic since I can add a 9th 10th 192nd (yes 192) node to the cluster.

Cluster
-ClusterNode1
-ClusterNode1Power
-ClusterNode1Fans
-etc

The information is there in the NodeCommStr, I'm just in brain lock on how to design it right now.



Again, code is raw and a work in progress so please no giggling. Oh this is a multi post... Code is too long.

	<Manifest>
		<Identity>
			<ID>IsilonSNMP</ID>
			<Version>1.0.1.2</Version>
		</Identity>
		<Name>IsilonSNMP</Name>
		<References>
			<Reference Alias="MicrosoftSystemCenterNetworkDeviceLibrary">
				<ID>Microsoft.SystemCenter.NetworkDevice.Library</ID>
				<Version>6.0.6278.0</Version>
				<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
			</Reference>
			<Reference Alias="Snmp">
				<ID>System.Snmp.Library</ID>
				<Version>6.0.6278.0</Version>
				<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
			</Reference>
			<Reference Alias="SystemHardwareLibrary">
				<ID>System.Hardware.Library</ID>
				<Version>6.0.6278.0</Version>
				<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
			</Reference>
			<Reference Alias="Windows">
				<ID>Microsoft.Windows.Library</ID>
				<Version>6.0.6278.0</Version>
				<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
			</Reference>
			<Reference Alias="SystemPerformanceLibrary">
				<ID>System.Performance.Library</ID>
				<Version>6.0.6278.0</Version>
				<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
			</Reference>
			<Reference Alias="System">
				<ID>System.Library</ID>
				<Version>6.0.6278.0</Version>
				<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
			</Reference>
			<Reference Alias="SC">
				<ID>Microsoft.SystemCenter.Library</ID>
				<Version>6.0.6278.0</Version>
				<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
			</Reference>
			<Reference Alias="Health">
				<ID>System.Health.Library</ID>
				<Version>6.0.6278.0</Version>
				<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
			</Reference>
		</References>
	</Manifest>
	<TypeDefinitions>
		<EntityTypes>
			<ClassTypes>
				<ClassType ID="IsilonSNMP.Class.IsilonCluster" Accessibility="Public" Abstract="false" Base="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice" Hosted="false" Singleton="false">
					<Property ID="Hostname" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
					<Property ID="ConfiguredNodes" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
					<!--      <Property ID="NodeCommStr" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" /> -->
				</ClassType>
				<ClassType ID="IsilonSNMP.Class.IsilonCluster.Nodes" Accessibility="Public" Abstract="false" Base="SystemHardwareLibrary!System.Chassis" Hosted="true" Singleton="false">
					<Property ID="Name" Type="string" Key="true" CaseSensitive="false" Length="256" MinLength="0" />
				</ClassType>
				<ClassType ID="IsilonSNMP.Class.IsilonCluster.PhysicalDisk" Accessibility="Public" Abstract="false" Base="SystemHardwareLibrary!System.PhysicalDisk" Hosted="true" Singleton="false">
					<Property ID="Index" Type="string" Key="true" CaseSensitive="false" Length="256" MinLength="0" />
					<!--      <Property ID="ConfiguredNodes" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" /> -->
					<Property ID="NodeCommStr" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
					<Property ID="BayIndex" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
				</ClassType>
				<ClassType ID="IsilonSNMP.Class.IsilonCluster.PhysicalFan" Accessibility="Public" Abstract="false" Base="SystemHardwareLibrary!System.Fan" Hosted="true" Singleton="false">
					<Property ID="Index" Type="string" Key="true" CaseSensitive="false" Length="256" MinLength="0" />
					<Property ID="NodeCommStr" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
					<Property ID="FanNumber" Type="string" Key="false" CaseSensitive="false" Length="256" MinLength="0" />
				</ClassType>
				<ClassType ID="IsilonSNMP.Group.IsilonClusters" Accessibility="Public" Abstract="false" Base="System!System.Group" Hosted="false" Singleton="true" />
			</ClassTypes>
			<RelationshipTypes>
				<RelationshipType ID="IsilonSNMP.Relationship.ClusterHostsNodes" Accessibility="Internal" Abstract="false" Base="System!System.Hosting">
					<Source>IsilonSNMP.Class.IsilonCluster</Source>
					<Target>IsilonSNMP.Class.IsilonCluster.Nodes</Target>
				</RelationshipType>
				<RelationshipType ID="IsilonSNMP.Relationship.IsilonClustersGroupContainsIsilonClusters" Accessibility="Public" Abstract="false" Base="System!System.Containment">
					<Source>IsilonSNMP.Group.IsilonClusters</Source>
					<Target>IsilonSNMP.Class.IsilonCluster</Target>
				</RelationshipType>
				<RelationshipType ID="IsilonSNMP.Relationship.NodesHostsPhysicalDisk" Accessibility="Public" Abstract="false" Base="System!System.Hosting">
					<Source>IsilonSNMP.Class.IsilonCluster.Nodes</Source>
					<Target>IsilonSNMP.Class.IsilonCluster.PhysicalDisk</Target>
				</RelationshipType>
				<RelationshipType ID="IsilonSNMP.Relationship.NodesHostsPhysicalFan" Accessibility="Public" Abstract="false" Base="System!System.Hosting">
					<Source>IsilonSNMP.Class.IsilonCluster.Nodes</Source>
					<Target>IsilonSNMP.Class.IsilonCluster.PhysicalFan</Target>
				</RelationshipType>
			</RelationshipTypes>
		</EntityTypes>
		<ModuleTypes>
			<DataSourceModuleType ID="IsilonSNMP.DataSource.BasicSNMPProbe" Accessibility="Internal" Batching="false">
				<Configuration>
					<xsd:element minOccurs="1" name="Interval" type="xsd:integer" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="IPAddress" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="CommStr" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="OID" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
				</Configuration>
				<OverrideableParameters>
					<OverrideableParameter ID="Interval" Selector="$Config/Interval$" ParameterType="int" />
				</OverrideableParameters>
				<ModuleImplementation Isolation="Any">
					<Composite>
						<MemberModules>
							<DataSource ID="Scheduler" TypeID="System!System.Scheduler">
								<Scheduler>
									<SimpleReccuringSchedule>
										<Interval>$Config/Interval$</Interval>
										<SyncTime />
									</SimpleReccuringSchedule>
									<ExcludeDates />
								</Scheduler>
							</DataSource>
							<ProbeAction ID="SNMPProbe" TypeID="Snmp!System.SnmpProbe">
								<IsWriteAction>false</IsWriteAction>
								<IP>$Config/IPAddress$</IP>
								<CommunityString>$Config/CommStr$</CommunityString>
								<SnmpVarBinds>
									<SnmpVarBind>
										<OID>$Config/OID$</OID>
										<Syntax>0</Syntax>
										<Value VariantType="8" />
									</SnmpVarBind>
								</SnmpVarBinds>
							</ProbeAction>
							<ConditionDetection ID="ValueFilter" TypeID="System!System.ExpressionFilter">
								<Expression>
									<SimpleExpression>
										<ValueExpression>
											<XPathQuery Type="String">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
										</ValueExpression>
										<Operator>NotEqual</Operator>
										<ValueExpression>
											<Value Type="String" />
										</ValueExpression>
									</SimpleExpression>
								</Expression>
							</ConditionDetection>
						</MemberModules>
						<Composition>
							<Node ID="ValueFilter">
								<Node ID="SNMPProbe">
									<Node ID="Scheduler" />
								</Node>
							</Node>
						</Composition>
					</Composite>
				</ModuleImplementation>
				<OutputType>Snmp!System.SnmpData</OutputType>
			</DataSourceModuleType>
			<DataSourceModuleType ID="IsilonSNMP.DataSource.DiscoverContainmentClasses" Accessibility="Internal" Batching="false">
				<Configuration>
					<IncludeSchemaTypes>
						<SchemaType>System!System.ParamListSchema</SchemaType>
						<SchemaType>System!System.Discovery.MapperSchema</SchemaType>
					</IncludeSchemaTypes>
					<xsd:element minOccurs="1" name="IPAddress" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="ClassID" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="InstanceSettings" type="SettingsType" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
				</Configuration>
				<ModuleImplementation Isolation="Any">
					<Composite>
						<MemberModules>
							<DataSource ID="Scheduler" TypeID="System!System.Scheduler">
								<Scheduler>
									<SimpleReccuringSchedule>
										<Interval>60</Interval>
										<SyncTime />
									</SimpleReccuringSchedule>
									<ExcludeDates />
								</Scheduler>
							</DataSource>
							<ConditionDetection ID="Mapper" TypeID="System!System.Discovery.ClassSnapshotDataMapper">
								<ClassId>$Config/ClassID$</ClassId>
								<InstanceSettings>$Config/InstanceSettings$</InstanceSettings>
							</ConditionDetection>
						</MemberModules>
						<Composition>
							<Node ID="Mapper">
								<Node ID="Scheduler" />
							</Node>
						</Composition>
					</Composite>
				</ModuleImplementation>
				<OutputType>System!System.Discovery.Data</OutputType>
			</DataSourceModuleType>
			<DataSourceModuleType ID="IsilonSNMP.DataSource.DiscoverCluster" Accessibility="Internal" Batching="false">
				<Configuration>
					<xsd:element minOccurs="1" name="Interval" type="xsd:integer" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="IP" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="CommunityString" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="SystemOID" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
				</Configuration>
				<OverrideableParameters>
					<OverrideableParameter ID="Interval" Selector="$Config/Interval$" ParameterType="int" />
				</OverrideableParameters>
				<ModuleImplementation Isolation="Any">
					<Composite>
						<MemberModules>
							<DataSource ID="Scheduler" TypeID="System!System.Scheduler">
								<Scheduler>
									<SimpleReccuringSchedule>
										<Interval Unit="Seconds">$Config/Interval$</Interval>
									</SimpleReccuringSchedule>
									<ExcludeDates />
								</Scheduler>
							</DataSource>
							<ProbeAction ID="Probe" TypeID="Snmp!System.SnmpProbe">
								<IsWriteAction>false</IsWriteAction>
								<IP>$Config/IP$</IP>
								<CommunityString>$Config/CommunityString$</CommunityString>
								<SnmpVarBinds>
									<SnmpVarBind>
										<OID>.1.3.6.1.4.1.12124.1.1.4.0</OID>
										<Syntax>0</Syntax>
										<Value VariantType="8" />
									</SnmpVarBind>
									<SnmpVarBind>
										<OID>.1.3.6.1.4.1.12124.1.1.1.0</OID>
										<Syntax>0</Syntax>
										<Value VariantType="8" />
									</SnmpVarBind>
									<SnmpVarBind>
										<OID>.1.3.6.1.2.1.1.5.0</OID>
										<Syntax>0</Syntax>
										<Value VariantType="8" />
									</SnmpVarBind>
									<SnmpVarBind>
										<OID>.1.3.6.1.2.1.1.1.0</OID>
										<Syntax>0</Syntax>
										<Value VariantType="8" />
									</SnmpVarBind>
									<SnmpVarBind>
										<OID>.1.3.6.1.2.1.1.4.0</OID>
										<Syntax>0</Syntax>
										<Value VariantType="8" />
									</SnmpVarBind>
									<SnmpVarBind>
										<OID>.1.3.6.1.2.1.1.6.0</OID>
										<Syntax>0</Syntax>
										<Value VariantType="8" />
									</SnmpVarBind>
									<SnmpVarBind>
										<OID>.1.3.6.1.2.1.1.2.0</OID>
										<Syntax>0</Syntax>
										<Value VariantType="8" />
									</SnmpVarBind>
								</SnmpVarBinds>
							</ProbeAction>
							<ConditionDetection ID="Mapper" TypeID="System!System.Discovery.FilteredClassSnapshotDataMapper">
								<Expression>
									<RegExExpression>
										<ValueExpression>
											<XPathQuery>/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
										</ValueExpression>
										<Operator>ContainsSubstring</Operator>
										<Pattern>1.3.6.1.4.1.12124.</Pattern>
									</RegExExpression>
								</Expression>
								<ClassId>$MPElement[Name="IsilonSNMP.Class.IsilonCluster"]$</ClassId>
								<InstanceSettings>
									<Settings>
										<Setting>
											<Name>$MPElement[Name="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</Name>
											<Value>$Data/Source$</Value>
										</Setting>
										<Setting>
											<Name>$MPElement[Name="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/Name$</Name>
											<Value>$Data/SnmpVarBinds/SnmpVarBind[5]/Value$</Value>
										</Setting>
										<Setting>
											<Name>$MPElement[Name="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/SystemDescription$</Name>
											<Value>$Data/SnmpVarBinds/SnmpVarBind[4]/Value$</Value>
										</Setting>
										<Setting>
											<Name>$MPElement[Name="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/SystemContact$</Name>
											<Value>$Data/SnmpVarBinds/SnmpVarBind[3]/Value$</Value>
										</Setting>
										<Setting>
											<Name>$MPElement[Name="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/SystemLocation$</Name>
											<Value>$Data/SnmpVarBinds/SnmpVarBind[2]/Value$</Value>
										</Setting>
										<Setting>
											<Name>$MPElement[Name="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/SystemOID$</Name>
											<Value>$Data/SnmpVarBinds/SnmpVarBind[1]/Value$</Value>
										</Setting>
										<Setting>
											<Name>$MPElement[Name="System!System.Entity"]/DisplayName$</Name>
											<Value>$Data/SnmpVarBinds/SnmpVarBind[5]/Value$</Value>
										</Setting>
										<Setting>
											<Name>$MPElement[Name="IsilonSNMP.Class.IsilonCluster"]/Hostname$</Name>
											<Value>$Data/SnmpVarBinds/SnmpVarBind[6]/Value$</Value>
										</Setting>
										<Setting>
											<Name>$MPElement[Name="IsilonSNMP.Class.IsilonCluster"]/ConfiguredNodes$</Name>
											<Value>$Data/SnmpVarBinds/SnmpVarBind[7]/Value$</Value>
										</Setting>
									</Settings>
								</InstanceSettings>
							</ConditionDetection>
							<ConditionDetection ID="SystemOIDFilter" TypeID="System!System.ExpressionFilter">
								<Expression>
									<RegExExpression>
										<ValueExpression>
											<Value>$Config/SystemOID$</Value>
										</ValueExpression>
										<Operator>ContainsSubstring</Operator>
										<Pattern>1.3.6.1.4.1.12124.</Pattern>
									</RegExExpression>
								</Expression>
							</ConditionDetection>
						</MemberModules>
						<Composition>
							<Node ID="Mapper">
								<Node ID="Probe">
									<Node ID="SystemOIDFilter">
										<Node ID="Scheduler" />
									</Node>
								</Node>
							</Node>
						</Composition>
					</Composite>
				</ModuleImplementation>
				<OutputType>System!System.Discovery.Data</OutputType>
			</DataSourceModuleType>
			<DataSourceModuleType ID="IsilonSNMP.DataSource.DiscoverPhysicalDisk" Accessibility="Internal" Batching="false">
				<Configuration>
					<xsd:element minOccurs="1" name="IPAddress" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="CommStr" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="Interval" type="xsd:integer" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="ConfiguredNodes" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="BayIndex" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="NodeCommStr" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
				</Configuration>
				<OverrideableParameters>
					<OverrideableParameter ID="Interval" Selector="$Config/Interval$" ParameterType="int" />
				</OverrideableParameters>
				<ModuleImplementation Isolation="Any">
					<Composite>
						<MemberModules>
							<DataSource ID="Scheduler" TypeID="System!System.Scheduler">
								<Scheduler>
									<SimpleReccuringSchedule>
										<Interval>$Config/Interval$</Interval>
										<SyncTime />
									</SimpleReccuringSchedule>
									<ExcludeDates />
								</Scheduler>
							</DataSource>
							<ProbeAction ID="ScriptDiscovery" TypeID="Windows!Microsoft.Windows.ScriptDiscoveryProbe">
								<ScriptName>DiscoverIsilonDisk.vbs</ScriptName>
								<Arguments>$Config/IPAddress$ $Config/CommStr$ $MPElement$ $Target/Id$ $Config/ConfiguredNodes$</Arguments>
								<ScriptBody>
									<![CDATA['Discover PhysicalDisk
Dim oAPI, oDiscoveryData, oInst, objWMIServices, objWMILocator, oArgs

set oArgs = Wscript.Arguments

if oArgs.Count <5 Then
   Wscript.Quit -1
End If

DeviceIP =  oArgs(0)
CommStr = oArgs(1)
SourceID = oArgs(2)
ManagedEntityId = oArgs(3)
StrConfiguredNodes = oArgs(4)
CommStr = Decode(CommStr)
ConfiguredNodesCommStr = cstr(CommStr)


wscript.echo CommStr
Set oAPI = CreateObject("MOM.ScriptAPI")
set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)
Set objWMILocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIServices = objWMiLocator.ConnectServer("","root\snmp\localhost")


'Name community name
GetPhysicalDisks

'Created community names
For i = 1 to StrConfiguredNodes

	CommStr = ConfiguredNodesCommStr & "_node_" & i

	GetPhysicalDisks
Next

'Return all data to SCOM
Call oAPI.Return(oDiscoveryData) 

Sub GetPhysicalDisks
on error resume next
	Set objWmiNamedValueSet = CreateObject("WbemScripting.SWbemNamedValueSet")
	objWmiNamedValueSet.Add "AgentAddress", cstr(DeviceIP)
	objWmiNamedValueSet.Add "AgentReadCommunityName", cstr(CommStr)
	   
	Set colPhysicalDisk = objWmiServices.InstancesOf("SNMP_ISILON_MIB_diskTable", , objWMINamedValueset)
	For each objItem in colPhysicalDisk
		nIndex = objItem.diskBay
		sDesc = objItem.diskSerialNumber
	
        if nIndex > 0 then 
	
			set oInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='IsilonSNMP.Class.IsilonCluster.PhysicalDisk']$")
			call oInst.AddProperty("$MPElement[Name='MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice']/IPAddress$", DeviceIP)
			call oInst.AddProperty("$MPElement[Name='IsilonSNMP.Class.IsilonCluster.PhysicalDisk']/Index$", cstr(CommStr) & "-" & cdbl(nIndex))
			call oInst.AddProperty("$MPElement[Name='IsilonSNMP.Class.IsilonCluster.PhysicalDisk']/NodeCommStr$", Encode(CommStr))
			call oInst.AddProperty("$MPElement[Name='IsilonSNMP.Class.IsilonCluster.PhysicalDisk']/BayIndex$", cdbl(nIndex))
			call oInst.AddProperty("$MPElement[Name='IsilonSNMP.Class.IsilonCluster.Nodes']/Name$", "Cluster")
			call oInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "SNMP Host " & cstr(CommStr) & " - Bay " & nIndex & " - Serial Number " & HexToString(sDesc))
			'call oInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", HexToString(sDesc))
			call oDiscoveryData.AddInstance(oInst)	

'Test Section

'wscript.echo Base64Encode(CommStr)
'wscript.echo Base64Encoder(CommStr)
'wscript.Echo CommStr
'wscript.Echo nIndex
'Wscript.Echo HexToString(sDesc)
'wscript.echo cdbl(nIndex) & cstr(CommStr)



        end if
Next
	

	
	on error goto 0
End Sub

Function Decode(strB64)
	strXML = "<B64DECODE xmlns:dt=" & Chr(34) & _
        "urn:schemas-microsoft-com:datatypes" & Chr(34) & " " & _
        "dt:dt=" & Chr(34) & "bin.base64" & Chr(34) & ">" & _
        strB64 & "</B64DECODE>"
	
	Set oXMLDoc = CreateObject("MSXML2.DOMDocument.3.0")
	oXMLDoc.LoadXML(strXML)
	decode = oXMLDoc.selectsinglenode("B64DECODE").nodeTypedValue
	set oXMLDoc = nothing
End Function


Function Encode(Str)
'Use ADODB.Stream to write Ansi string to Unicode stream
	Set objStream = CreateObject("ADODB.Stream")
	objStream.Type = 2
	objStream.Open
	objStream.Charset = "unicode"
	objStream.WriteText Str
	objstream.Flush

	'Read the stream back as a byte array
	objStream.Position = 0
	objStream.Type = 1
	temp = objstream.read(2) 'read two bytes of the stream to discard the byte order mark
	bArray = objStream.Read
	objStream.Close

	'Convert byte array to Base64
	set objXML = createobject("MSXML2.DOMDocument.3.0")
	Set objNode = objXML.createElement("b64")
	objNode.dataType = "bin.base64"
	objNode.nodeTypedValue = bArray
	Encode = objNode.Text

	Set Stream = Nothing
	set objNode = nothing
	set objXML = nothing
End Function

Function HexToString(str)
                on error resume next
                sOutput = ""
                For x = 1 To len(str) Step 2
                                sChar = Chr(Clng("&h" & Mid(str,x,2)))
                                sOutput = sOutput & sChar
                Next
                if err.number = 0 then
                                HexToString = sOutput
                Else
                                HexToString = str
                end if
End Function
set oInst = nothing
set oDiscoveryData = nothing
set oArgs = nothing
set oAPI = nothing
set objWMILocator = nothing
set objWMIServices = nothing
set objWMINamedValueSet = nothing
]]>
								</ScriptBody>
								<TimeoutSeconds>120</TimeoutSeconds>
							</ProbeAction>
						</MemberModules>
						<Composition>
							<Node ID="ScriptDiscovery">
								<Node ID="Scheduler" />
							</Node>
						</Composition>
					</Composite>
				</ModuleImplementation>
				<OutputType>System!System.Discovery.Data</OutputType>
			</DataSourceModuleType>

November 12th, 2009 4:00am

			<DataSourceModuleType ID="IsilonSNMP.DataSource.DiscoverPhysicalFan" Accessibility="Internal" Batching="false">
				<Configuration>
					<xsd:element minOccurs="1" name="IPAddress" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="CommStr" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="Interval" type="xsd:integer" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="ConfiguredNodes" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="FanNumber" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="NodeCommStr" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="FanSpeedHighCritical" type="xsd:integer" />
					<xsd:element minOccurs="1" name="FanSpeedLowWarn" type="xsd:integer" />
					<xsd:element minOccurs="1" name="FanSpeedLowCritical" type="xsd:integer" />
				</Configuration>
				<OverrideableParameters>
					<OverrideableParameter ID="Interval" Selector="$Config/Interval$" ParameterType="int" />
					<OverrideableParameter ID="FanSpeedHighCritical" Selector="$Config/FanSpeedHighCritical$" ParameterType="int" />
					<OverrideableParameter ID="FanSpeedLowWarn" Selector="$Config/FanSpeedLowWarn$" ParameterType="int" />
					<OverrideableParameter ID="FanSpeedLowCritical" Selector="$Config/FanSpeedLowCritical$" ParameterType="int" />
				</OverrideableParameters>
				<ModuleImplementation Isolation="Any">
					<Composite>
						<MemberModules>
							<DataSource ID="Scheduler" TypeID="System!System.Scheduler">
								<Scheduler>
									<SimpleReccuringSchedule>
										<Interval>$Config/Interval$</Interval>
										<SyncTime />
									</SimpleReccuringSchedule>
									<ExcludeDates />
								</Scheduler>
							</DataSource>
							<ProbeAction ID="ScriptDiscovery" TypeID="Windows!Microsoft.Windows.ScriptDiscoveryProbe">
								<ScriptName>DiscoverIsilonPhysicalFan.vbs</ScriptName>
								<Arguments>$Config/IPAddress$ $Config/CommStr$ $MPElement$ $Target/Id$ $Config/ConfiguredNodes$</Arguments>
								<ScriptBody>
									<![CDATA['Discover PhysicalFan
Dim oAPI, oDiscoveryData, oInst, objWMIServices, objWMILocator, oArgs

set oArgs = Wscript.Arguments

if oArgs.Count <5 Then
   Wscript.Quit -1
End If

DeviceIP =  oArgs(0)
CommStr = oArgs(1)
SourceID = oArgs(2)
ManagedEntityId = oArgs(3)
StrConfiguredNodes = oArgs(4)
CommStr = Decode(CommStr)
ConfiguredNodesCommStr = cstr(CommStr)


wscript.echo CommStr
Set oAPI = CreateObject("MOM.ScriptAPI")
set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)
Set objWMILocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIServices = objWMiLocator.ConnectServer("","root\snmp\localhost")


'Name community name
GetPhysicalFan

'Created community names
For i = 1 to StrConfiguredNodes

	CommStr = ConfiguredNodesCommStr & "_node_" & i

	GetPhysicalFan
Next

'Return all data to SCOM
Call oAPI.Return(oDiscoveryData) 

Sub GetPhysicalFan
on error resume next
	Set objWmiNamedValueSet = CreateObject("WbemScripting.SWbemNamedValueSet")
	objWmiNamedValueSet.Add "AgentAddress", cstr(DeviceIP)
	objWmiNamedValueSet.Add "AgentReadCommunityName", cstr(CommStr)
	   
	Set colPhysicalFan = objWmiServices.InstancesOf("SNMP_ISILON_MIB_FanTable", , objWMINamedValueset)
	For each objItem in colPhysicalFan
		nIndex = objItem.fanNumber
		sDesc = objItem.fanDescription
	
        if nIndex > 0 then 
	
			set oInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='IsilonSNMP.Class.IsilonCluster.PhysicalFan']$")
			call oInst.AddProperty("$MPElement[Name='MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice']/IPAddress$", DeviceIP)
			call oInst.AddProperty("$MPElement[Name='IsilonSNMP.Class.IsilonCluster.PhysicalFan']/Index$", cstr(CommStr) & "-" & cdbl(nIndex))
			call oInst.AddProperty("$MPElement[Name='IsilonSNMP.Class.IsilonCluster.PhysicalFan']/NodeCommStr$", Encode(CommStr))
			call oInst.AddProperty("$MPElement[Name='IsilonSNMP.Class.IsilonCluster.PhysicalFan']/FanNumber$", cdbl(nIndex))
			call oInst.AddProperty("$MPElement[Name='IsilonSNMP.Class.IsilonCluster.Nodes']/Name$", "Cluster")
			'call oInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "SNMP Host " & cstr(CommStr) & " - Bay " & nIndex & " - Serial Number " & HexToString(sDesc))
			call oInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", "SNMP Host " & cstr(CommStr) & " - " & HexToString(sDesc))
			call oDiscoveryData.AddInstance(oInst)	

'Test Section

'wscript.echo Base64Encode(CommStr)
'wscript.echo Base64Encoder(CommStr)
'wscript.Echo CommStr
'wscript.Echo nIndex
'Wscript.Echo HexToString(sDesc)
'wscript.echo cdbl(nIndex) & cstr(CommStr)



        end if
Next
	

	
	on error goto 0
End Sub

Function Decode(strB64)
	strXML = "<B64DECODE xmlns:dt=" & Chr(34) & _
        "urn:schemas-microsoft-com:datatypes" & Chr(34) & " " & _
        "dt:dt=" & Chr(34) & "bin.base64" & Chr(34) & ">" & _
        strB64 & "</B64DECODE>"
	
	Set oXMLDoc = CreateObject("MSXML2.DOMDocument.3.0")
	oXMLDoc.LoadXML(strXML)
	decode = oXMLDoc.selectsinglenode("B64DECODE").nodeTypedValue
	set oXMLDoc = nothing
End Function


Function Encode(Str)
'Use ADODB.Stream to write Ansi string to Unicode stream
	Set objStream = CreateObject("ADODB.Stream")
	objStream.Type = 2
	objStream.Open
	objStream.Charset = "unicode"
	objStream.WriteText Str
	objstream.Flush

	'Read the stream back as a byte array
	objStream.Position = 0
	objStream.Type = 1
	temp = objstream.read(2) 'read two bytes of the stream to discard the byte order mark
	bArray = objStream.Read
	objStream.Close

	'Convert byte array to Base64
	set objXML = createobject("MSXML2.DOMDocument.3.0")
	Set objNode = objXML.createElement("b64")
	objNode.dataType = "bin.base64"
	objNode.nodeTypedValue = bArray
	Encode = objNode.Text

	Set Stream = Nothing
	set objNode = nothing
	set objXML = nothing
End Function

Function HexToString(str)
                on error resume next
                sOutput = ""
                For x = 1 To len(str) Step 2
                                sChar = Chr(Clng("&h" & Mid(str,x,2)))
                                sOutput = sOutput & sChar
                Next
                if err.number = 0 then
                                HexToString = sOutput
                Else
                                HexToString = str
                end if
End Function
set oInst = nothing
set oDiscoveryData = nothing
set oArgs = nothing
set oAPI = nothing
set objWMILocator = nothing
set objWMIServices = nothing
set objWMINamedValueSet = nothing
]]>
								</ScriptBody>
								<TimeoutSeconds>120</TimeoutSeconds>
							</ProbeAction>
						</MemberModules>
						<Composition>
							<Node ID="ScriptDiscovery">
								<Node ID="Scheduler" />
							</Node>
						</Composition>
					</Composite>
				</ModuleImplementation>
				<OutputType>System!System.Discovery.Data</OutputType>
			</DataSourceModuleType>
		</ModuleTypes>
		<MonitorTypes>
			<UnitMonitorType ID="IsilonSNMP.MonitorType.PhysicalDiskStatus" Accessibility="Internal">
				<MonitorTypeStates>
					<MonitorTypeState ID="PhysicalDiskOK" NoDetection="false" />
					<MonitorTypeState ID="PhysicalDiskNotOK" NoDetection="false" />
				</MonitorTypeStates>
				<Configuration>
					<xsd:element minOccurs="1" name="Interval" type="xsd:integer" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="IPAddress" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="OID" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="NodeCommStr" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
				</Configuration>
				<MonitorImplementation>
					<MemberModules>
						<DataSource ID="DS1" TypeID="IsilonSNMP.DataSource.BasicSNMPProbe">
							<Interval>$Config/Interval$</Interval>
							<IPAddress>$Config/IPAddress$</IPAddress>
							<CommStr>$Config/NodeCommStr$</CommStr>
							<OID>$Config/OID$</OID>
						</DataSource>
						<ConditionDetection ID="CDPhysicalDiskOK" TypeID="System!System.ExpressionFilter">
							<Expression>
								<RegExExpression>
									<ValueExpression>
										<XPathQuery Type="String">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
									</ValueExpression>
									<Operator>ContainsSubstring</Operator>
									<Pattern>HEALTHY</Pattern>
								</RegExExpression>
							</Expression>
						</ConditionDetection>
						<ConditionDetection ID="CDPhysicalDiskNotOK" TypeID="System!System.ExpressionFilter">
							<Expression>
								<RegExExpression>
									<ValueExpression>
										<XPathQuery Type="String">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
									</ValueExpression>
									<Operator>DoesNotContainSubstring</Operator>
									<Pattern>HEALTHY</Pattern>
								</RegExExpression>
							</Expression>
						</ConditionDetection>
					</MemberModules>
					<RegularDetections>
						<RegularDetection MonitorTypeStateID="PhysicalDiskOK">
							<Node ID="CDPhysicalDiskOK">
								<Node ID="DS1" />
							</Node>
						</RegularDetection>
						<RegularDetection MonitorTypeStateID="PhysicalDiskNotOK">
							<Node ID="CDPhysicalDiskNotOK">
								<Node ID="DS1" />
							</Node>
						</RegularDetection>
					</RegularDetections>
				</MonitorImplementation>
			</UnitMonitorType>
			<UnitMonitorType ID="IsilonSNMP.MonitorType.PhysicalFanStatus" Accessibility="Internal">
				<MonitorTypeStates>
					<MonitorTypeState ID="PhysicalFanOK" NoDetection="false" />
					<MonitorTypeState ID="PhysicalFanWarn" NoDetection="false" />
					<MonitorTypeState ID="PhysicalFanCritical" NoDetection="false" />
				</MonitorTypeStates>
				<Configuration>
					<xsd:element minOccurs="1" name="Interval" type="xsd:integer" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="IPAddress" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="OID" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="NodeCommStr" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
					<xsd:element minOccurs="1" name="FanSpeedHighCritical" type="xsd:integer" />
					<xsd:element minOccurs="1" name="FanSpeedLowWarn" type="xsd:integer" />
					<xsd:element minOccurs="1" name="FanSpeedLowCritical" type="xsd:integer" />
				</Configuration>
				<OverrideableParameters>
					<OverrideableParameter ID="Interval" Selector="$Config/Interval$" ParameterType="int" />
					<OverrideableParameter ID="FanSpeedHighCritical" Selector="$Config/FanSpeedHighCritical$" ParameterType="int" />
					<OverrideableParameter ID="FanSpeedLowWarn" Selector="$Config/FanSpeedLowWarn$" ParameterType="int" />
					<OverrideableParameter ID="FanSpeedLowCritical" Selector="$Config/FanSpeedLowCritical$" ParameterType="int" />
				</OverrideableParameters>
				<MonitorImplementation>
					<MemberModules>
						<DataSource ID="DS1" TypeID="IsilonSNMP.DataSource.BasicSNMPProbe">
							<Interval>$Config/Interval$</Interval>
							<IPAddress>$Config/IPAddress$</IPAddress>
							<CommStr>$Config/NodeCommStr$</CommStr>
							<OID>$Config/OID$</OID>
						</DataSource>
						<ConditionDetection ID="CDPhysicalFanOK" TypeID="System!System.ExpressionFilter">
							<Expression>
								<And>
									<Expression>
										<SimpleExpression>
											<ValueExpression>
												<XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
											</ValueExpression>
											<Operator>Less</Operator>
											<ValueExpression>
												<Value Type="Integer">$Config/FanSpeedHighCritical$</Value>
											</ValueExpression>
										</SimpleExpression>
									</Expression>
									<Expression>
										<SimpleExpression>
											<ValueExpression>
												<XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
											</ValueExpression>
											<Operator>Greater</Operator>
											<ValueExpression>
												<Value Type="Integer">$Config/FanSpeedLowWarn$</Value>
											</ValueExpression>
										</SimpleExpression>
									</Expression>
								</And>
							</Expression>
						</ConditionDetection>
						<ConditionDetection ID="CDPhysicalFanWarn" TypeID="System!System.ExpressionFilter">
							<Expression>
								<And>
									<Expression>
										<SimpleExpression>
											<ValueExpression>
												<XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
											</ValueExpression>
											<Operator>LessEqual</Operator>
											<ValueExpression>
												<Value Type="Integer">$Config/FanSpeedLowWarn$</Value>
											</ValueExpression>
										</SimpleExpression>
									</Expression>
									<Expression>
										<SimpleExpression>
											<ValueExpression>
												<XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
											</ValueExpression>
											<Operator>Greater</Operator>
											<ValueExpression>
												<Value Type="Integer">$Config/FanSpeedLowWarn$</Value>
											</ValueExpression>
										</SimpleExpression>
									</Expression>
								</And>
							</Expression>
						</ConditionDetection>
						<ConditionDetection ID="CDPhysicalFanCritical" TypeID="System!System.ExpressionFilter">
							<Expression>
								<Or>
									<Expression>
										<SimpleExpression>
											<ValueExpression>
												<XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
											</ValueExpression>
											<Operator>GreaterEqual</Operator>
											<ValueExpression>
												<Value Type="Integer">$Config/FanSpeedHighCritical$</Value>
											</ValueExpression>
										</SimpleExpression>
									</Expression>
									<Expression>
										<SimpleExpression>
											<ValueExpression>
												<XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
											</ValueExpression>
											<Operator>LessEqual</Operator>
											<ValueExpression>
												<Value Type="Integer">$Config/FanSpeedLowCritical$</Value>
											</ValueExpression>
										</SimpleExpression>
									</Expression>
								</Or>
							</Expression>
						</ConditionDetection>
					</MemberModules>
					<RegularDetections>
						<RegularDetection MonitorTypeStateID="PhysicalFanOK">
							<Node ID="CDPhysicalFanOK">
								<Node ID="DS1" />
							</Node>
						</RegularDetection>
						<RegularDetection MonitorTypeStateID="PhysicalFanWarn">
							<Node ID="CDPhysicalFanWarn">
								<Node ID="DS1" />
							</Node>
						</RegularDetection>
						<RegularDetection MonitorTypeStateID="PhysicalFanCritical">
							<Node ID="CDPhysicalFanCritical">
								<Node ID="DS1" />
							</Node>
						</RegularDetection>
					</RegularDetections>
				</MonitorImplementation>
			</UnitMonitorType>
		</MonitorTypes>
	</TypeDefinitions>
	<Monitoring>
		<Discoveries>
			<Discovery ID="IsilonSNMP.Discovery.Cluster" Enabled="true" Target="IsilonSNMP.Class.IsilonCluster" ConfirmDelivery="true" Remotable="true" Priority="Normal">
				<Category>Discovery</Category>
				<DiscoveryTypes>
					<DiscoveryClass TypeID="IsilonSNMP.Class.IsilonCluster.Nodes" />
					<DiscoveryRelationship TypeID="IsilonSNMP.Relationship.ClusterHostsNodes" />
				</DiscoveryTypes>
				<DataSource ID="DS1" TypeID="IsilonSNMP.DataSource.DiscoverContainmentClasses">
					<IPAddress>$Target/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</IPAddress>
					<ClassID>$MPElement[Name="IsilonSNMP.Class.IsilonCluster.Nodes"]$</ClassID>
					<InstanceSettings>
						<Settings>
							<Setting>
								<Name>$MPElement[Name="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</Name>
								<Value>$Target/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</Value>
							</Setting>
							<Setting>
								<Name>$MPElement[Name="System!System.Entity"]/DisplayName$</Name>
								<Value>Cluster</Value>
							</Setting>
							<Setting>
								<Name>$MPElement[Name="IsilonSNMP.Class.IsilonCluster.Nodes"]/Name$</Name>
								<Value>Cluster</Value>
							</Setting>
						</Settings>
					</InstanceSettings>
				</DataSource>
			</Discovery>
			<Discovery ID="IsilonSNMP.Discovery.IsilonCluster" Enabled="true" Target="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice" ConfirmDelivery="true" Remotable="true" Priority="Normal">
				<Category>Discovery</Category>
				<DiscoveryTypes>
					<DiscoveryClass TypeID="IsilonSNMP.Class.IsilonCluster" />
				</DiscoveryTypes>
				<DataSource ID="DS1" TypeID="IsilonSNMP.DataSource.DiscoverCluster">
					<Interval>600</Interval>
					<IP>$Target/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</IP>
					<CommunityString>$Target/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/CommunityString$</CommunityString>
					<SystemOID>$Target/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/SystemOID$</SystemOID>
				</DataSource>
			</Discovery>
			<Discovery ID="IsilonSNMP.Discovery.IsilonClustersGroup" Enabled="true" Target="IsilonSNMP.Group.IsilonClusters" ConfirmDelivery="true" Remotable="true" Priority="Normal">
				<Category>Discovery</Category>
				<DiscoveryTypes>
					<DiscoveryRelationship TypeID="IsilonSNMP.Relationship.IsilonClustersGroupContainsIsilonClusters" />
				</DiscoveryTypes>
				<DataSource ID="GP1" TypeID="SC!Microsoft.SystemCenter.GroupPopulator">
					<RuleId>$MPElement$</RuleId>
					<GroupInstanceId>$MPElement[Name="IsilonSNMP.Group.IsilonClusters"]$</GroupInstanceId>
					<MembershipRules>
						<MembershipRule>
							<MonitoringClass>$MPElement[Name="IsilonSNMP.Class.IsilonCluster"]$</MonitoringClass>
							<RelationshipClass>$MPElement[Name="IsilonSNMP.Relationship.IsilonClustersGroupContainsIsilonClusters"]$</RelationshipClass>
							<Expression>
								<RegExExpression>
									<ValueExpression>
										<Property>$MPElement[Name="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</Property>
									</ValueExpression>
									<Operator>ContainsSubstring</Operator>
									<Pattern>.</Pattern>
								</RegExExpression>
							</Expression>
						</MembershipRule>
					</MembershipRules>
				</DataSource>
			</Discovery>
			<Discovery ID="IsilonSNMP.Discovery.PhysicalDisk" Enabled="true" Target="IsilonSNMP.Class.IsilonCluster.Nodes" ConfirmDelivery="true" Remotable="true" Priority="Normal">
				<Category>Discovery</Category>
				<DiscoveryTypes>
					<DiscoveryClass TypeID="IsilonSNMP.Class.IsilonCluster.PhysicalDisk" />
					<DiscoveryRelationship TypeID="IsilonSNMP.Relationship.NodesHostsPhysicalDisk" />
				</DiscoveryTypes>
				<DataSource ID="DS1" TypeID="IsilonSNMP.DataSource.DiscoverPhysicalDisk">
					<IPAddress>$Target/Host/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</IPAddress>
					<CommStr>$Target/Host/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/CommunityString$</CommStr>
					<Interval>7800</Interval>
					<ConfiguredNodes>$Target/Host/Property[Type="IsilonSNMP.Class.IsilonCluster"]/ConfiguredNodes$</ConfiguredNodes>
					<BayIndex>$MPElement[Name="IsilonSNMP.Class.IsilonCluster.PhysicalDisk"]/BayIndex$</BayIndex>
					<NodeCommStr>$MPElement[Name="IsilonSNMP.Class.IsilonCluster.PhysicalDisk"]/NodeCommStr$</NodeCommStr>
				</DataSource>
			</Discovery>
			<Discovery ID="IsilonSNMP.Discovery.PhysicalFan" Enabled="true" Target="IsilonSNMP.Class.IsilonCluster.Nodes" ConfirmDelivery="true" Remotable="true" Priority="Normal">
				<Category>Discovery</Category>
				<DiscoveryTypes>
					<DiscoveryClass TypeID="IsilonSNMP.Class.IsilonCluster.PhysicalFan" />
					<DiscoveryRelationship TypeID="IsilonSNMP.Relationship.NodesHostsPhysicalFan" />
				</DiscoveryTypes>
				<DataSource ID="DS1" TypeID="IsilonSNMP.DataSource.DiscoverPhysicalFan">
					<IPAddress>$Target/Host/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</IPAddress>
					<CommStr>$Target/Host/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/CommunityString$</CommStr>
					<Interval>8000</Interval>
					<ConfiguredNodes>$Target/Host/Property[Type="IsilonSNMP.Class.IsilonCluster"]/ConfiguredNodes$</ConfiguredNodes>
					<FanNumber>$MPElement[Name="IsilonSNMP.Class.IsilonCluster.PhysicalFan"]/FanNumber$</FanNumber>
					<NodeCommStr>$MPElement[Name="IsilonSNMP.Class.IsilonCluster.PhysicalFan"]/NodeCommStr$</NodeCommStr>
					<FanSpeedHighCritical>14500</FanSpeedHighCritical>
					<FanSpeedLowWarn>3400</FanSpeedLowWarn>
					<FanSpeedLowCritical>3000</FanSpeedLowCritical>
				</DataSource>
			</Discovery>
		</Discoveries>
		<Monitors>
			<UnitMonitor ID="UIGeneratedMonitore2c4dd195da8497bb99c9711e4134d70" Accessibility="Public" Enabled="true" Target="IsilonSNMP.Class.IsilonCluster" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="Snmp!System.SnmpTrapProvider.2SingleEvent2StateMonitorType" ConfirmDelivery="false">
				<Category>Custom</Category>
				<AlertSettings AlertMessage="UIGeneratedMonitore2c4dd195da8497bb99c9711e4134d70_AlertMessageResourceID">
					<AlertOnState>Warning</AlertOnState>
					<AutoResolve>true</AutoResolve>
					<AlertPriority>Normal</AlertPriority>
					<AlertSeverity>MatchMonitorHealth</AlertSeverity>
				</AlertSettings>
				<OperationalStates>
					<OperationalState ID="UIGeneratedOpStateId843498792d7d4fbf80d83f3939255dd9" MonitorTypeStateID="SecondEventRaised" HealthState="Success" />
					<OperationalState ID="UIGeneratedOpStateId9fd776cd21a747c5994738e863b31fb9" MonitorTypeStateID="FirstEventRaised" HealthState="Warning" />
				</OperationalStates>
				<Configuration>
					<FirstIP>$Target/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</FirstIP>
					<FirstCommunityString>$Target/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/CommunityString$</FirstCommunityString>
					<FirstAllTraps>false</FirstAllTraps>
					<FirstVersion>$Target/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/Version$</FirstVersion>
					<FirstOIDProps>
						<OIDProp>.1.3.6.1.4.1.12124.1.1.2.0</OIDProp>
					</FirstOIDProps>
					<FirstExpression>
						<SimpleExpression>
							<ValueExpression>
								<XPathQuery Type="String">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
							</ValueExpression>
							<Operator>Equal</Operator>
							<ValueExpression>
								<Value Type="String">1</Value>
							</ValueExpression>
						</SimpleExpression>
					</FirstExpression>
					<SecondIP>$Target/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</SecondIP>
					<SecondCommunityString>$Target/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/CommunityString$</SecondCommunityString>
					<SecondAllTraps>false</SecondAllTraps>
					<SecondVersion>$Target/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/Version$</SecondVersion>
					<SecondOIDProps>
						<OIDProp>.1.3.6.1.4.1.12124.1.1.2.0</OIDProp>
					</SecondOIDProps>
					<SecondExpression>
						<SimpleExpression>
							<ValueExpression>
								<XPathQuery Type="String">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
							</ValueExpression>
							<Operator>NotEqual</Operator>
							<ValueExpression>
								<Value Type="String">1</Value>
							</ValueExpression>
						</SimpleExpression>
					</SecondExpression>
				</Configuration>
			</UnitMonitor>
			<UnitMonitor ID="IsilonSNMP.Monitor.PhysicalDiskStatus" Accessibility="Internal" Enabled="true" Target="IsilonSNMP.Class.IsilonCluster.PhysicalDisk" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="IsilonSNMP.MonitorType.PhysicalDiskStatus" ConfirmDelivery="true">
				<Category>AvailabilityHealth</Category>
				<AlertSettings AlertMessage="IsilonSNMP.Monitor.PhysicalDiskStatus_AlertMessageResourceID">
					<AlertOnState>Warning</AlertOnState>
					<AutoResolve>true</AutoResolve>
					<AlertPriority>Normal</AlertPriority>
					<AlertSeverity>MatchMonitorHealth</AlertSeverity>
					<AlertParameters>
						<AlertParameter1>$Target/Property[Type="System!System.Entity"]/DisplayName$</AlertParameter1>
						<AlertParameter2>$Data/Context/SnmpVarBinds/SnmpVarBind[1]/Value$</AlertParameter2>
					</AlertParameters>
				</AlertSettings>
				<OperationalStates>
					<OperationalState ID="IsilonSNMP.Monitor.PhysicalDiskStatus_PhysicalDiskOK" MonitorTypeStateID="PhysicalDiskOK" HealthState="Success" />
					<OperationalState ID="IsilonSNMP.Monitor.PhysicalDiskStatus_PhysicalDiskNotOK" MonitorTypeStateID="PhysicalDiskNotOK" HealthState="Warning" />
				</OperationalStates>
				<Configuration>
					<Interval>120</Interval>
					<IPAddress>$Target/Host/Host/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</IPAddress>
					<OID>.1.3.6.1.4.1.12124.2.52.1.5.$Target/Property[Type="IsilonSNMP.Class.IsilonCluster.PhysicalDisk"]/BayIndex$</OID>
					<NodeCommStr>$Target/Property[Type="IsilonSNMP.Class.IsilonCluster.PhysicalDisk"]/NodeCommStr$</NodeCommStr>
				</Configuration>
			</UnitMonitor>
			<UnitMonitor ID="IsilonSNMP.Monitor.PhysicalFanStatus" Accessibility="Internal" Enabled="true" Target="IsilonSNMP.Class.IsilonCluster.PhysicalFan" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="IsilonSNMP.MonitorType.PhysicalFanStatus" ConfirmDelivery="true">
				<Category>AvailabilityHealth</Category>
				<AlertSettings AlertMessage="IsilonSNMP.Monitor.PhysicalFanStatus_AlertMessageResourceID">
					<AlertOnState>Warning</AlertOnState>
					<AutoResolve>true</AutoResolve>
					<AlertPriority>Normal</AlertPriority>
					<AlertSeverity>MatchMonitorHealth</AlertSeverity>
					<AlertParameters>
						<AlertParameter1>$Target/Property[Type="System!System.Entity"]/DisplayName$</AlertParameter1>
						<AlertParameter2>$Data/Context/SnmpVarBinds/SnmpVarBind[1]/Value$</AlertParameter2>
					</AlertParameters>
				</AlertSettings>
				<OperationalStates>
					<OperationalState ID="IsilonSNMP.Monitor.PhysicalFanStatus_PhysicalFanOK" MonitorTypeStateID="PhysicalFanOK" HealthState="Success" />
					<OperationalState ID="IsilonSNMP.Monitor.PhysicalFanStatus_PhysicalFanWarn" MonitorTypeStateID="PhysicalFanWarn" HealthState="Warning" />
					<OperationalState ID="IsilonSNMP.Monitor.PhysicalFanStatus_PhysicalFanCritical" MonitorTypeStateID="PhysicalFanCritical" HealthState="Error" />
				</OperationalStates>
				<Configuration>
					<Interval>120</Interval>
					<IPAddress>$Target/Host/Host/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</IPAddress>
					<OID>.1.3.6.1.4.1.12124.2.53.1.4.$Target/Property[Type="IsilonSNMP.Class.IsilonCluster.PhysicalFan"]/FanNumber$</OID>
					<NodeCommStr>$Target/Property[Type="IsilonSNMP.Class.IsilonCluster.PhysicalFan"]/NodeCommStr$</NodeCommStr>
					<FanSpeedHighCritical>14500</FanSpeedHighCritical>
					<FanSpeedLowWarn>3400</FanSpeedLowWarn>
					<FanSpeedLowCritical>3000</FanSpeedLowCritical>
				</Configuration>
			</UnitMonitor>
			<DependencyMonitor ID="IsilonSNMP.Monitor.ClusterPhysicalDiskAvailabilityDependency" Accessibility="Internal" Enabled="true" Target="IsilonSNMP.Class.IsilonCluster.Nodes" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="IsilonSNMP.Relationship.NodesHostsPhysicalDisk" MemberMonitor="IsilonSNMP.Monitor.PhysicalDiskStatus">
				<Category>AvailabilityHealth</Category>
				<Algorithm>WorstOf</Algorithm>
				<MemberUnAvailable>Error</MemberUnAvailable>
			</DependencyMonitor>
			<DependencyMonitor ID="IsilonSNMP.Monitor.ClusterPhysicalFanAvailabilityDependency" Accessibility="Internal" Enabled="true" Target="IsilonSNMP.Class.IsilonCluster.Nodes" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="IsilonSNMP.Relationship.NodesHostsPhysicalFan" MemberMonitor="IsilonSNMP.Monitor.PhysicalFanStatus">
				<Category>AvailabilityHealth</Category>
				<Algorithm>WorstOf</Algorithm>
				<MemberUnAvailable>Error</MemberUnAvailable>
			</DependencyMonitor>
			<DependencyMonitor ID="IsilonSNMP.Monitor.ClusterClusterAvailabilityDependency" Accessibility="Internal" Enabled="true" Target="IsilonSNMP.Class.IsilonCluster" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" RelationshipType="IsilonSNMP.Relationship.ClusterHostsNodes" MemberMonitor="Health!System.Health.AvailabilityState">
				<Category>AvailabilityHealth</Category>
				<Algorithm>WorstOf</Algorithm>
				<MemberUnAvailable>Error</MemberUnAvailable>
			</DependencyMonitor>
		</Monitors>
	</Monitoring>
	<Presentation>
		<StringResources>
			<StringResource ID="UIGeneratedMonitore2c4dd195da8497bb99c9711e4134d70_AlertMessageResourceID" />
			<StringResource ID="AlertMessageIDb1a3848769824949889fcc4c159cf462" />
			<StringResource ID="IsilonSNMP.Monitor.PhysicalDiskStatus_AlertMessageResourceID" />
			<StringResource ID="IsilonSNMP.Monitor.PhysicalFanStatus_AlertMessageResourceID" />
		</StringResources>
	</Presentation>
	<LanguagePacks>
		<LanguagePack ID="ENU" IsDefault="true">
			<DisplayStrings>
				<DisplayString ElementID="IsilonSNMP">
					<Name>Isilon SNMP MP</Name>
					<Description>Management pack to discover a Isilon cluster running OneFS 5.5</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Class.IsilonCluster">
					<Name>Isilon Cluster</Name>
					<Description>Isilon SNMP Device</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Class.IsilonCluster" SubElementID="Hostname">
					<Name>Hostname</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Class.IsilonCluster" SubElementID="ConfiguredNodes">
					<Name>ConfiguredNodes</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Class.IsilonCluster.Nodes" SubElementID="Name">
					<Name>Name</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Class.IsilonCluster.Nodes">
					<Name>Isilon Cluster Hosts Nodes</Name>
					<Description>Containment class for the Isilon cluster with components such as hard disks, fans, power supplies, etc.</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Relationship.ClusterHostsNodes">
					<Name>Isilon Cluster Hosts Nodes</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Discovery.IsilonCluster">
					<Name>Discover Isilon Cluster</Name>
					<Description>Discovery of the Isilon Cluster using OID strings from RFC1213.</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.DataSource.BasicSNMPProbe">
					<Name>Isilon Basic Probe Data Source</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.DataSource.DiscoverCluster">
					<Name>Discover Isilon Cluster</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Relationship.IsilonClustersGroupContainsIsilonClusters">
					<Name>Isilon Devices Group Contains Isilon Cluster</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Discovery.Cluster">
					<Name>Discover Isilon Cluster Containment Class</Name>
					<Description>Discovers the Cluster containment class, which hosts managed objects such as fans</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Discovery.IsilonClustersGroup">
					<Name>Isilon Deivce Group Populator</Name>
				</DisplayString>
				<DisplayString ElementID="UIGeneratedMonitore2c4dd195da8497bb99c9711e4134d70">
					<Name>PlaceHolder</Name>
					<Description>Place Holder to detect isilon cluster</Description>
				</DisplayString>
				<DisplayString ElementID="UIGeneratedMonitore2c4dd195da8497bb99c9711e4134d70" SubElementID="UIGeneratedOpStateId843498792d7d4fbf80d83f3939255dd9">
					<Name>Second Event Raised</Name>
				</DisplayString>
				<DisplayString ElementID="UIGeneratedMonitore2c4dd195da8497bb99c9711e4134d70" SubElementID="UIGeneratedOpStateId9fd776cd21a747c5994738e863b31fb9">
					<Name>First Event Raised</Name>
				</DisplayString>
				<DisplayString ElementID="UIGeneratedMonitore2c4dd195da8497bb99c9711e4134d70_AlertMessageResourceID">
					<Name>PlaceHolder</Name>
					<Description>placeholder alert to detect isilon</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.PhysicalDiskStatus">
					<Name>Isilon PhysicalDisk Status Monitor</Name>
					<Description>Monitor that generates an alert when the PhysicalDisk status is not ok.</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.PhysicalDiskStatus" SubElementID="IsilonSNMP.Monitor.PhysicalDiskStatus_PhysicalDiskOK">
					<Name>PhysicalDiskOK</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.PhysicalDiskStatus" SubElementID="IsilonSNMP.Monitor.PhysicalDiskStatus_PhysicalDiskNotOK">
					<Name>PhysicalDiskOK</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.PhysicalDiskStatus_AlertMessageResourceID">
					<Name>Isilon PhysicalDisk Status</Name>
					<Description>The Disk ({0})  is in a warning or error state.  The Disk state is: {1}.</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Class.IsilonCluster.PhysicalDisk">
					<Name>Isilon Disk</Name>
					<Description>Disk</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Class.IsilonCluster.PhysicalDisk" SubElementID="Index">
					<Name>Index</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Relationship.NodesHostsPhysicalDisk">
					<Name>Isilon Cluster Hosts PhysicalDisk</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Discovery.PhysicalDisk">
					<Name>Discover Isilon Cluster Physical Disks</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.DataSource.DiscoverPhysicalDisk">
					<Name>Discover Isilon Cluster PhysicalDisk</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.ClusterPhysicalDiskAvailabilityDependency">
					<Name>Isilon Disk</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.PhysicalFanStatus">
					<Name>Isilon PhysicalFan Status Monitor</Name>
					<Description>Monitor that generates an alert when the PhysicalFan speed is not within a premited range.</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.PhysicalFanStatus" SubElementID="IsilonSNMP.Monitor.PhysicalFanStatus_PhysicalFanOK">
					<Name>PhysicalFanOK</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.PhysicalFanStatus" SubElementID="IsilonSNMP.Monitor.PhysicalFanStatus_PhysicalFanWarn">
					<Name>PhysicalFanWarn</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.PhysicalFanStatus" SubElementID="IsilonSNMP.Monitor.PhysicalFanStatus_PhysicalFanCritical">
					<Name>PhysicalFanCritical</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.PhysicalFanStatus_AlertMessageResourceID">
					<Name>Isilon PhysicalFan Status</Name>
					<Description>The Fan ({0})  is in a warning or error state.  Current Fan speed is: {1}.</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Class.IsilonCluster.PhysicalFan">
					<Name>Isilon Fan</Name>
					<Description>Fan</Description>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Class.IsilonCluster.PhysicalFan" SubElementID="Index">
					<Name>Index</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Relationship.NodesHostsPhysicalFan">
					<Name>Isilon Cluster Hosts PhysicalFan</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Discovery.PhysicalFan">
					<Name>Discover Isilon Cluster Physical Fans</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.DataSource.DiscoverPhysicalFan">
					<Name>Discover Isilon Cluster PhysicalFan</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.ClusterPhysicalFanAvailabilityDependency">
					<Name>Isilon Fan</Name>
				</DisplayString>
				<DisplayString ElementID="IsilonSNMP.Monitor.ClusterClusterAvailabilityDependency">
					<Name>Cluster</Name>
				</DisplayString>
			</DisplayStrings>
		</LanguagePack>
	</LanguagePacks>
Free Windows Admin Tool Kit Click here and download it now
November 12th, 2009 4:01am

*crickets*
November 17th, 2009 10:35pm

Well I haven't received any input from this newsgroup however I did poll a few programmer friends of mine to address question number 2 - monitors and the different thresholds for the fan. They thought that it would be more economical to address the different thresholds in the monitor itself using expression over creation different discoveries and monitors for the different fan types. Code update posted below, any thoughts from the newsgroup?

I still have 2 outstanding questions, dynamic groups and sorting the health explorer. It's ok to say "nope, not possible today". To recap;

Health Explorer:
When I create a roll-up to add the monitor for viewing in the health explorer everything is a jumble, can this be sorted numerically or alphabetical?

Dynamic Groups:
At this time I have to add community strings into a class in order to query other nodes within the cluster. Can I use these strings as searchables to create dynamic groups based on the community strings? Maybe a code example?

Cluster
-Public
--Public-Fan
--Public-Disk
-Public_node_2
--Public_node_2-Fan
--Public_node_2-Disk
etc...

Expressions Code Update - Data Source:

<DataSourceModuleType ID="IsilonSNMP.DataSource.DiscoverPhysicalFan" Accessibility="Internal" Batching="false">
        <Configuration>
          <xsd:element minOccurs="1" name="IPAddress" type="xsd:string" />
          <xsd:element minOccurs="1" name="CommStr" type="xsd:string" />
          <xsd:element minOccurs="1" name="Interval" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ConfiguredNodes" type="xsd:string" />
          <xsd:element minOccurs="1" name="FanNumber" type="xsd:string" />
          <xsd:element minOccurs="1" name="NodeCommStr" type="xsd:string" />
          <xsd:element minOccurs="1" name="PowerSupplyFanSpeedHighCritical" type="xsd:integer" />
          <xsd:element minOccurs="1" name="PowerSupplyFanSpeedLowCritical" type="xsd:integer" />
          <xsd:element minOccurs="1" name="PowerSupplyFanSpeedLowWarn" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ChassisFanSpeedHighCritical" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ChassisFanSpeedLowCritical" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ChassisFanSpeedHighWarn" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ChassisFanSpeedLowWarn" type="xsd:integer" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="Interval" Selector="$Config/Interval$" ParameterType="int" />
          <OverrideableParameter ID="PowerSupplyFanSpeedHighCritical" Selector="$Config/PowerSupplyFanSpeedHighCritical$" ParameterType="int" />
          <OverrideableParameter ID="PowerSupplyFanSpeedLowCritical" Selector="$Config/PowerSupplyFanSpeedLowCritical$" ParameterType="int" />
          <OverrideableParameter ID="PowerSupplyFanSpeedLowWarn" Selector="$Config/PowerSupplyFanSpeedLowWarn$" ParameterType="int" />
          <OverrideableParameter ID="ChassisFanSpeedHighCritical" Selector="$Config/ChassisFanSpeedHighCritical$" ParameterType="int" />
          <OverrideableParameter ID="ChassisFanSpeedLowCritical" Selector="$Config/ChassisFanSpeedLowCritical$" ParameterType="int" />
          <OverrideableParameter ID="ChassisFanSpeedHighWarn" Selector="$Config/ChassisFanSpeedHighWarn$" ParameterType="int" />
          <OverrideableParameter ID="ChassisFanSpeedLowWarn" Selector="$Config/ChassisFanSpeedLowWarn$" ParameterType="int" />
        </OverrideableParameters>
      </DataSourceModuleType>

Expressions Code Update - Unit Monitor Type:

<UnitMonitorType ID="IsilonSNMP.MonitorType.PhysicalFanStatus" Accessibility="Internal">
        <MonitorTypeStates>
          <MonitorTypeState ID="PhysicalFanOK" NoDetection="false" />
          <MonitorTypeState ID="PhysicalFanWarn" NoDetection="false" />
          <MonitorTypeState ID="PhysicalFanCritical" NoDetection="false" />
        </MonitorTypeStates>
        <Configuration>
          <xsd:element minOccurs="1" name="Interval" type="xsd:integer" />
          <xsd:element minOccurs="1" name="IPAddress" type="xsd:string" />
          <xsd:element minOccurs="1" name="OID" type="xsd:string" />
          <xsd:element minOccurs="1" name="NodeCommStr" type="xsd:string" />
          <xsd:element minOccurs="1" name="PowerSupplyFanSpeedHighCritical" type="xsd:integer" />
          <xsd:element minOccurs="1" name="PowerSupplyFanSpeedLowCritical" type="xsd:integer" />
          <xsd:element minOccurs="1" name="PowerSupplyFanSpeedLowWarn" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ChassisFanSpeedHighCritical" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ChassisFanSpeedLowCritical" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ChassisFanSpeedHighWarn" type="xsd:integer" />
          <xsd:element minOccurs="1" name="ChassisFanSpeedLowWarn" type="xsd:integer" />
          <xsd:element minOccurs="1" name="DisplayName" type="xsd:string" />
        </Configuration>
        <OverrideableParameters>
          <OverrideableParameter ID="Interval" Selector="$Config/Interval$" ParameterType="int" />
          <OverrideableParameter ID="PowerSupplyFanSpeedHighCritical" Selector="$Config/PowerSupplyFanSpeedHighCritical$" ParameterType="int" />
          <OverrideableParameter ID="PowerSupplyFanSpeedLowCritical" Selector="$Config/PowerSupplyFanSpeedLowCritical$" ParameterType="int" />
          <OverrideableParameter ID="PowerSupplyFanSpeedLowWarn" Selector="$Config/PowerSupplyFanSpeedLowWarn$" ParameterType="int" />
          <OverrideableParameter ID="ChassisFanSpeedHighCritical" Selector="$Config/ChassisFanSpeedHighCritical$" ParameterType="int" />
          <OverrideableParameter ID="ChassisFanSpeedLowCritical" Selector="$Config/ChassisFanSpeedLowCritical$" ParameterType="int" />
          <OverrideableParameter ID="ChassisFanSpeedHighWarn" Selector="$Config/ChassisFanSpeedHighWarn$" ParameterType="int" />
          <OverrideableParameter ID="ChassisFanSpeedLowWarn" Selector="$Config/ChassisFanSpeedLowWarn$" ParameterType="int" />
        </OverrideableParameters>
        <MonitorImplementation>
          <MemberModules>
            <DataSource ID="DS1" TypeID="IsilonSNMP.DataSource.BasicSNMPProbe">
              <Interval>$Config/Interval$</Interval>
              <IPAddress>$Config/IPAddress$</IPAddress>
              <CommStr>$Config/NodeCommStr$</CommStr>
              <OID>$Config/OID$</OID>
            </DataSource>
            <ConditionDetection ID="CDPhysicalFanOK" TypeID="System!System.ExpressionFilter">
              <Expression>
                <Or>
                  <Expression>
                    <And>
                      <Expression>
                        <RegExExpression>
                          <ValueExpression>
                            <Value Type="String">$Config/DisplayName$</Value>
                          </ValueExpression>
                          <Operator>ContainsSubstring</Operator>
                          <Pattern>Power</Pattern>
                        </RegExExpression>
                      </Expression>
                      <Expression>
                        <And>
                          <Expression>
                            <SimpleExpression>
                              <ValueExpression>
                                <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                              </ValueExpression>
                              <Operator>Less</Operator>
                              <ValueExpression>
                                <Value Type="Integer">$Config/PowerSupplyFanSpeedHighCritical$</Value>
                              </ValueExpression>
                            </SimpleExpression>
                          </Expression>
                          <Expression>
                            <SimpleExpression>
                              <ValueExpression>
                                <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                              </ValueExpression>
                              <Operator>Greater</Operator>
                              <ValueExpression>
                                <Value Type="Integer">$Config/PowerSupplyFanSpeedLowWarn$</Value>
                              </ValueExpression>
                            </SimpleExpression>
                          </Expression>
                        </And>
                      </Expression>
                    </And>
                  </Expression>
                  <Expression>
                    <And>
                      <Expression>
                        <RegExExpression>
                          <ValueExpression>
                            <Value Type="String">$Config/DisplayName$</Value>
                          </ValueExpression>
                          <Operator>ContainsSubstring</Operator>
                          <Pattern>Chassis</Pattern>
                        </RegExExpression>
                      </Expression>
                      <Expression>
                        <And>
                          <Expression>
                            <SimpleExpression>
                              <ValueExpression>
                                <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                              </ValueExpression>
                              <Operator>Less</Operator>
                              <ValueExpression>
                                <Value Type="Integer">$Config/ChassisFanSpeedHighWarn$</Value>
                              </ValueExpression>
                            </SimpleExpression>
                          </Expression>
                          <Expression>
                            <SimpleExpression>
                              <ValueExpression>
                                <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                              </ValueExpression>
                              <Operator>Greater</Operator>
                              <ValueExpression>
                                <Value Type="Integer">$Config/ChassisFanSpeedLowWarn$</Value>
                              </ValueExpression>
                            </SimpleExpression>
                          </Expression>
                        </And>
                      </Expression>
                    </And>
                  </Expression>
                </Or>
              </Expression>
            </ConditionDetection>
            <ConditionDetection ID="CDPhysicalFanWarn" TypeID="System!System.ExpressionFilter">
              <Expression>
                <Or>
                  <Expression>
                    <And>
                      <Expression>
                        <RegExExpression>
                          <ValueExpression>
                            <Value Type="String">$Config/DisplayName$</Value>
                          </ValueExpression>
                          <Operator>ContainsSubstring</Operator>
                          <Pattern>``</Pattern>
                        </RegExExpression>
                      </Expression>
                      <Expression>
                        <And>
                          <Expression>
                            <SimpleExpression>
                              <ValueExpression>
                                <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                              </ValueExpression>
                              <Operator>LessEqual</Operator>
                              <ValueExpression>
                                <Value Type="Integer">$Config/PowerSupplyFanSpeedLowWarn$</Value>
                              </ValueExpression>
                            </SimpleExpression>
                          </Expression>
                          <Expression>
                            <SimpleExpression>
                              <ValueExpression>
                                <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                              </ValueExpression>
                              <Operator>Greater</Operator>
                              <ValueExpression>
                                <Value Type="Integer">$Config/PowerSupplyFanSpeedLowCritical$</Value>
                              </ValueExpression>
                            </SimpleExpression>
                          </Expression>
                        </And>
                      </Expression>
                    </And>
                  </Expression>
                  <Expression>
                    <And>
                      <Expression>
                        <RegExExpression>
                          <ValueExpression>
                            <Value Type="String">$Config/DisplayName$</Value>
                          </ValueExpression>
                          <Operator>ContainsSubstring</Operator>
                          <Pattern>Chassis</Pattern>
                        </RegExExpression>
                      </Expression>
                      <Expression>
                        <Or>
                          <Expression>
                            <And>
                              <Expression>
                                <SimpleExpression>
                                  <ValueExpression>
                                    <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                                  </ValueExpression>
                                  <Operator>Less</Operator>
                                  <ValueExpression>
                                    <Value Type="Integer">$Config/ChassisFanSpeedHighCritical$</Value>
                                  </ValueExpression>
                                </SimpleExpression>
                              </Expression>
                              <Expression>
                                <SimpleExpression>
                                  <ValueExpression>
                                    <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                                  </ValueExpression>
                                  <Operator>GreaterEqual</Operator>
                                  <ValueExpression>
                                    <Value Type="Integer">$Config/ChassisFanSpeedHighWarn$</Value>
                                  </ValueExpression>
                                </SimpleExpression>
                              </Expression>
                            </And>
                          </Expression>
                          <Expression>
                            <And>
                              <Expression>
                                <SimpleExpression>
                                  <ValueExpression>
                                    <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                                  </ValueExpression>
                                  <Operator>LessEqual</Operator>
                                  <ValueExpression>
                                    <Value Type="Integer">$Config/ChassisFanSpeedLowWarn$</Value>
                                  </ValueExpression>
                                </SimpleExpression>
                              </Expression>
                              <Expression>
                                <SimpleExpression>
                                  <ValueExpression>
                                    <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                                  </ValueExpression>
                                  <Operator>Greater</Operator>
                                  <ValueExpression>
                                    <Value Type="Integer">$Config/ChassisFanSpeedLowCritical$</Value>
                                  </ValueExpression>
                                </SimpleExpression>
                              </Expression>
                            </And>
                          </Expression>
                        </Or>
                      </Expression>
                    </And>
                  </Expression>
                </Or>
              </Expression>
            </ConditionDetection>
            <ConditionDetection ID="CDPhysicalFanCritical" TypeID="System!System.ExpressionFilter">
              <Expression>
                <Or>
                  <Expression>
                    <And>
                      <Expression>
                        <RegExExpression>
                          <ValueExpression>
                            <Value Type="String">$Config/DisplayName$</Value>
                          </ValueExpression>
                          <Operator>ContainsSubstring</Operator>
                          <Pattern>Power</Pattern>
                        </RegExExpression>
                      </Expression>
                      <Expression>
                        <Or>
                          <Expression>
                            <SimpleExpression>
                              <ValueExpression>
                                <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                              </ValueExpression>
                              <Operator>GreaterEqual</Operator>
                              <ValueExpression>
                                <Value Type="Integer">$Config/PowerSupplyFanSpeedHighCritical$</Value>
                              </ValueExpression>
                            </SimpleExpression>
                          </Expression>
                          <Expression>
                            <SimpleExpression>
                              <ValueExpression>
                                <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                              </ValueExpression>
                              <Operator>LessEqual</Operator>
                              <ValueExpression>
                                <Value Type="Integer">$Config/PowerSupplyFanSpeedLowCritical$</Value>
                              </ValueExpression>
                            </SimpleExpression>
                          </Expression>
                        </Or>
                      </Expression>
                    </And>
                  </Expression>
                  <Expression>
                    <And>
                      <Expression>
                        <RegExExpression>
                          <ValueExpression>
                            <Value Type="String">$Config/DisplayName$</Value>
                          </ValueExpression>
                          <Operator>ContainsSubstring</Operator>
                          <Pattern>Chassis</Pattern>
                        </RegExExpression>
                      </Expression>
                      <Expression>
                        <Or>
                          <Expression>
                            <SimpleExpression>
                              <ValueExpression>
                                <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                              </ValueExpression>
                              <Operator>GreaterEqual</Operator>
                              <ValueExpression>
                                <Value Type="Integer">$Config/ChassisFanSpeedHighCritical$</Value>
                              </ValueExpression>
                            </SimpleExpression>
                          </Expression>
                          <Expression>
                            <SimpleExpression>
                              <ValueExpression>
                                <XPathQuery Type="Integer">/DataItem/SnmpVarBinds/SnmpVarBind[1]/Value</XPathQuery>
                              </ValueExpression>
                              <Operator>LessEqual</Operator>
                              <ValueExpression>
                                <Value Type="Integer">$Config/ChassisFanSpeedLowCritical$</Value>
                              </ValueExpression>
                            </SimpleExpression>
                          </Expression>
                        </Or>
                      </Expression>
                    </And>
                  </Expression>
                </Or>
              </Expression>
            </ConditionDetection>
          </MemberModules>
          <RegularDetections>
            <RegularDetection MonitorTypeStateID="PhysicalFanOK">
              <Node ID="CDPhysicalFanOK">
                <Node ID="DS1" />
              </Node>
            </RegularDetection>
            <RegularDetection MonitorTypeStateID="PhysicalFanWarn">
              <Node ID="CDPhysicalFanWarn">
                <Node ID="DS1" />
              </Node>
            </RegularDetection>
            <RegularDetection MonitorTypeStateID="PhysicalFanCritical">
              <Node ID="CDPhysicalFanCritical">
                <Node ID="DS1" />
              </Node>
            </RegularDetection>
          </RegularDetections>
        </MonitorImplementation>
      </UnitMonitorType>

Expressions Code Update - Discovery:

<Discovery ID="IsilonSNMP.Discovery.PhysicalFan" Enabled="true" Target="IsilonSNMP.Class.IsilonCluster.Nodes" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="IsilonSNMP.Class.IsilonCluster.PhysicalFan" />
          <DiscoveryRelationship TypeID="IsilonSNMP.Relationship.NodesHostsPhysicalFan" />
        </DiscoveryTypes>
        <DataSource ID="DS1" TypeID="IsilonSNMP.DataSource.DiscoverPhysicalFan">
          <IPAddress>$Target/Host/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</IPAddress>
          <CommStr>$Target/Host/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/CommunityString$</CommStr>
          <Interval>8000</Interval>
          <ConfiguredNodes>$Target/Host/Property[Type="IsilonSNMP.Class.IsilonCluster"]/ConfiguredNodes$</ConfiguredNodes>
          <FanNumber>$MPElement[Name="IsilonSNMP.Class.IsilonCluster.PhysicalFan"]/FanNumber$</FanNumber>
          <NodeCommStr>$MPElement[Name="IsilonSNMP.Class.IsilonCluster.PhysicalFan"]/NodeCommStr$</NodeCommStr>
          <PowerSupplyFanSpeedHighCritical>14500</PowerSupplyFanSpeedHighCritical>
          <PowerSupplyFanSpeedLowCritical>3000</PowerSupplyFanSpeedLowCritical>
          <PowerSupplyFanSpeedLowWarn>3400</PowerSupplyFanSpeedLowWarn>
          <ChassisFanSpeedHighCritical>11600</ChassisFanSpeedHighCritical>
          <ChassisFanSpeedLowCritical>7800</ChassisFanSpeedLowCritical>
          <ChassisFanSpeedHighWarn>10800</ChassisFanSpeedHighWarn>
          <ChassisFanSpeedLowWarn>8500</ChassisFanSpeedLowWarn>
        </DataSource>
      </Discovery>

Expressions Code Update - Unit Monitor:

<UnitMonitor ID="IsilonSNMP.Monitor.PhysicalFanStatus" Accessibility="Internal" Enabled="true" Target="IsilonSNMP.Class.IsilonCluster.PhysicalFan" ParentMonitorID="Health!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="IsilonSNMP.MonitorType.PhysicalFanStatus" ConfirmDelivery="true">
        <Category>AvailabilityHealth</Category>
        <AlertSettings AlertMessage="IsilonSNMP.Monitor.PhysicalFanStatus_AlertMessageResourceID">
          <AlertOnState>Warning</AlertOnState>
          <AutoResolve>true</AutoResolve>
          <AlertPriority>Normal</AlertPriority>
          <AlertSeverity>MatchMonitorHealth</AlertSeverity>
          <AlertParameters>
            <AlertParameter1>$Target/Property[Type="System!System.Entity"]/DisplayName$</AlertParameter1>
            <AlertParameter2>$Data/Context/SnmpVarBinds/SnmpVarBind[1]/Value$</AlertParameter2>
          </AlertParameters>
        </AlertSettings>
        <OperationalStates>
          <OperationalState ID="IsilonSNMP.Monitor.PhysicalFanStatus_PhysicalFanOK" MonitorTypeStateID="PhysicalFanOK" HealthState="Success" />
          <OperationalState ID="IsilonSNMP.Monitor.PhysicalFanStatus_PhysicalFanWarn" MonitorTypeStateID="PhysicalFanWarn" HealthState="Warning" />
          <OperationalState ID="IsilonSNMP.Monitor.PhysicalFanStatus_PhysicalFanCritical" MonitorTypeStateID="PhysicalFanCritical" HealthState="Error" />
        </OperationalStates>
        <Configuration>
          <Interval>120</Interval>
          <IPAddress>$Target/Host/Host/Property[Type="MicrosoftSystemCenterNetworkDeviceLibrary!Microsoft.SystemCenter.NetworkDevice"]/IPAddress$</IPAddress>
          <OID>.1.3.6.1.4.1.12124.2.53.1.4.$Target/Property[Type="IsilonSNMP.Class.IsilonCluster.PhysicalFan"]/FanNumber$</OID>
          <NodeCommStr>$Target/Property[Type="IsilonSNMP.Class.IsilonCluster.PhysicalFan"]/NodeCommStr$</NodeCommStr>
          <PowerSupplyFanSpeedHighCritical>14500</PowerSupplyFanSpeedHighCritical>
          <PowerSupplyFanSpeedLowCritical>3000</PowerSupplyFanSpeedLowCritical>
          <PowerSupplyFanSpeedLowWarn>3400</PowerSupplyFanSpeedLowWarn>
          <ChassisFanSpeedHighCritical>11600</ChassisFanSpeedHighCritical>
          <ChassisFanSpeedLowCritical>7800</ChassisFanSpeedLowCritical>
          <ChassisFanSpeedHighWarn>10800</ChassisFanSpeedHighWarn>
          <ChassisFanSpeedLowWarn>8500</ChassisFanSpeedLowWarn>
          <DisplayName>$Target/Property[Type="System!System.Entity"]/DisplayName$</DisplayName>
        </Configuration>
      </UnitMonitor>
  • Edited by FreRange Wednesday, November 18, 2009 6:42 PM Formatting.
Free Windows Admin Tool Kit Click here and download it now
November 18th, 2009 9:39pm

As far as I know health explorer should sort alphabetically, are you not seeing that? Also you can create aggregate monitors to further logically group your monitors if you have many of them.
November 24th, 2009 3:49am

No activity for 30 days. I will close the thread now. Feel free to re-open it.
Free Windows Admin Tool Kit Click here and download it now
February 8th, 2010 9:30pm

Based on the ablove mentioned MP, What would be the inclusion into manifest section for me to Dicover SQL 2008 DB?
December 9th, 2010 2:16pm

Hi Ake,

I need to monitor a ISILON Bay with the last version Opsmgr, 2012. But i have the same limitation with the ISILON bay. The famous SNMP-proxy.

I try to create a script to browse the MIB and create the objets... But i have always a little error , bug  or any other thing on my way... Big challenge, no information ... I need help.
And i find your old question about my issue.

To be direct :

Have you finalize a MP for your needs ?
It's possible to test your MP ?

Thanks.

Best regards,  Cordialement,

Julien

Free Windows Admin Tool Kit Click here and download it now
September 23rd, 2013 8:48pm

I know that this thread is super old, but I would love to get a copy of your Isilon MP or discuss it.  I have also created a similar pack and would like to compare/share.

February 19th, 2015 5:09pm

This topic is archived. No further replies will be accepted.

Other recent topics Other recent topics