<?xml version="1.0" encoding="windows-1251" ?>
<document type="SelFTrendxTest" version="2.0" xmlns:m="xTest">
    <xTest type="SNMP" 
		alias        = "PPCS_Interface" 
		TitleEng     = "Interface monitoring for Cisco Systems"  
		TitleRus     = "Мониторинг состояния интерфейсов оборудования Cisco Systems" 
		TitleRootRus = "Набор тестов для операторов связи (Cisco Systems)" 
		TitleRootEng = "Provider Pack (Cisco Systems)" 
    TrafficLightsName="Interface monitoring for Cisco Systems"
		Version="1.0">
        <Files>
            <File type="conf" name="new_features.2.interface.conf.xml" />
            <File type="help" name="XT.SNMP.index.html" />
            <File type="dll" name="x_snmp.dll" />
        </Files>
      <Keywords>
        <Keyword>SNMP</Keyword>
        <Keyword>Cisco</Keyword>
        <Keyword>Маршрутизатор</Keyword>
        <Keyword>Provider Pack</Keyword>
      </Keywords>
      <xTestProps>
            <AverInervDuration>180</AverInervDuration>
            <pollinterval>57</pollinterval>
            <snmp_timeout_ms>5000</snmp_timeout_ms>
            <snmp_retry_count>3</snmp_retry_count>
            <log_level_def>3</log_level_def>
            <truncate_log>0</truncate_log>
            <use_active_device_only>no</use_active_device_only>
        </xTestProps>
        <VarSet>
            <!--
    $Id: PPCS_Interface.xml,v 1.1 2010/02/03 12:06:27 alex_l Exp $            
            
	Value attributes:
		usetype: "hidden" | "pure" | "discovery" | "calculated"
		proctype: "absolute" | "delta"


		OID: for scalar values ("1.3.6.1.2.1.1.1")
		ROOT_OID: for tables  ("1.3.6.1.2.1.2.2.1" - A list of interface entries.)
		COLNUM_OID:  for table values
		alias: short ascii name w/o white spaaces

		discovery_func
		work_func
		tlights_func

-->
            <tlights_func>TLights_Proc</tlights_func>
            <discovery_func>OnDiscovery</discovery_func>
            <work_func>OnDataReceived</work_func>
            <common_attribs TitleRus="Список параметров (общие):" TitleEng="Parameters List (common):" SubTitleRus="Параметр" SubTitleEng="Parameter">
                <!-- Type: "String", "Bool", "Integer", "Double", "Enum" -->
                <Attrib Type="String" TitleRus="Исключаемые типы интерфейсов (через запятую)" TitleEng="Excluded intefaces types (comma separated)" Alias="excluded_if_types">
		    "1,6,18,24,30,39,50,51,53,135,150,166"
                </Attrib>
                <Attrib Type="Bool" TitleRus="Только активные порты" TitleEng="Up ports only" Alias="ProcessOnlyUpPorts">
                    "No"
                </Attrib>
                <Attrib Type="Integer" TitleRus="Максимальный WAN Port Ratio IN/OUT" TitleEng="WAN Port Ratio IN/OUT Maximum" Alias="port_ratio_in_out_maximum">
                    "1000000"
                </Attrib>
                <Attrib Type="String" TitleRus="Фильтр интерфейсов по ifAlias (через запятую)" TitleEng="Interfaces filter by ifAlias (comma separated)" Alias="ifAlias_filter">
                    "*"
                </Attrib>
                <Attrib Type="String" TitleRus="Имя файла журнала для snmp трапов" TitleEng="Snmp Trap log file name" Alias="snmp_trap_log">
                    "S:\traps\traps.new_features.2.interface.txt"
                </Attrib>
            </common_attribs>
            <ScalarValues>
                <Value usetype="calculated" proctype="absolute" alias="Availability">"WAN Device SNMP Availability (%)"</Value>
				<Value usetype="hidden" proctype="absolute" alias="sysUpTime" OID="1.3.6.1.2.1.1.3.0">"sysUpTime"</Value>
            </ScalarValues>
            
            <TableValues>
                
                <Table name="ifXTable" ROOT_OID="1.3.6.1.2.1.31.1.1.1" Type_data="Static" Mandatory="no">
                    <Value usetype="discovery" proctype="absolute" COLNUM_OID="18" alias="ifAlias">
					    "alias name for the interface"
				    </Value>
                </Table>
            
                <Table name="A list of interface entries" ROOT_OID="1.3.6.1.2.1.2.2.1" Type_data="Static">
                    <Value usetype="hidden" proctype="absolute" COLNUM_OID="1" alias="ifIndex">
					    "Interface Index"
				    </Value>
                    <Value usetype="hidden" proctype="absolute" COLNUM_OID="2" alias="ifDescr">
					    "Interface Description"
				    </Value>
                    <Value usetype="hidden" proctype="absolute" COLNUM_OID="3" alias="ifType">
					    "The type of interface"
				    </Value>
                    <Value usetype="hidden" proctype="absolute" COLNUM_OID="8" alias="ifOperStatus">
					    "The current operational state of the interface"
				    </Value>
                    <Value usetype="hidden" proctype="delta" COLNUM_OID="10" alias="ifInOctets">
					    "In Bytes received"
				    </Value>
                    <Value usetype="hidden" proctype="delta" COLNUM_OID="16" alias="ifOutOctets">
					    "Out Bytes transmitted"
				    </Value>
                    <Value usetype="hidden" proctype="absolute" COLNUM_OID="5" alias="ifSpeed">
					    "Link Speed"
				    </Value>
                    <Value usetype="hidden" proctype="absolute" COLNUM_OID="14" alias="ifInErrors">
					    "Error In"
				    </Value>
                    <Value usetype="hidden" proctype="absolute" COLNUM_OID="20" alias="ifOutErrors">
					    "Error Out"
				    </Value>
                    <Value usetype="hidden" proctype="delta" COLNUM_OID="11" alias="ifInUcastPkts">
					    "Pakets In Unicast"
				    </Value>
                    <Value usetype="hidden" proctype="delta" COLNUM_OID="12" alias="ifInNUcastPkts">
					    "Pakets In Brodcast"
				    </Value>
                    <Value usetype="hidden" proctype="delta" COLNUM_OID="17" alias="ifOutUcastPkts">
					    "Pakets Out Unicast"
				    </Value>
                    <Value usetype="hidden" proctype="delta" COLNUM_OID="18" alias="ifOutNUcastPkts">
					    "Pakets Out Brodcast"
				    </Value>
                    <Value usetype="hidden" proctype="delta" COLNUM_OID="13" alias="ifInDiscards">
					    "Discarded In Pakets"
				    </Value>
                    <Value usetype="hidden" proctype="delta" COLNUM_OID="19" alias="ifOutDiscards">
					    "Discarded Out Pakets"
				    </Value>
                    <Value usetype="storage" proctype="absolute"  alias="error_count">
				            "Error Count"
			        </Value>
                </Table>
                
                <Table name="ifEntry_dynamic" ROOT_OID="1.3.6.1.2.1.2.2.1" Type_data="dynamic">
                    <Value usetype="hidden" proctype="absolute" COLNUM_OID="1" alias="ifIndex">
					    "Interface Index"
				    </Value>
                </Table>
                
            </TableValues>
        </VarSet>
        <popupdisplay>
            <!--  Function: "EventCount", "Average", "Maximum", "Minimum"  -->
            <description ru="Тест оценки 'здоровья' WAN каналов" en="WAN Health Check Test"></description>
            <display_item ru="WAN Device SNMP Availability (%)" en="WAN Device SNMP Availability (%)" alias="Availability" sign="&lt;">
			90 94 96 99
		</display_item>
        </popupdisplay>
        <Script language="VBScript">
            <!--

	' Собирать статистику только по включенным портам в момент запуска программы (1-да, только включенные; 0-нет, собирать статистику по всем портам)
	ProcessOnlyUpPorts = 0

	Const g_dBadValue = 1.0e+308
	
	' Message.GenericTrap Constants
	' Enumerates values of the GenericTrap property.
	Const snmpColdStart = 0					'The agent is initializing (cold start).
	Const snmpWarmStart = 1					'The agent is reinitializing (warm start).
	Const snmpLinkDown = 2					'An interface has changed from the up to down state. Variables(1) of the SnmpMessage object contains the interface.
	Const snmpLinkUp = 3					'An interface has changed from the down to up state. Variables(1) of the SnmpMessage object contains the interface.
	Const snmpAuthenticationFailure = 4		'A message was received from a manager with an invalid community.
	Const snmpEgpNeighborLoss = 5			'An EGP peer has changed to the down state. Variables(1) of the SnmpMessage object contains the IP address of the peer.
	Const snmpEnterpriseSpecific = 6		'The SpecificTrap property contains information on the trap.

	'Snmp Variable Type Constants
	'Enumerates values of the Type property
	Const snmpNull = 0			'NULL.
	Const snmpInteger = 1		'Signed 32 bit integer.
	Const snmpOctetString = 2	'String.
	Const snmpObjectID = 3		'String that represents an Object Identifier (OID).
	Const snmpIpAddress = 4		'String that represents an IP Address in dot notation.
	Const snmpCounter32 = 5		'Unsigned 32 bit integer that represents a counter.
	Const snmpGuage32 = 6		'Unsigned 32 bit integer that represents a guage.
	Const snmpTimeTicks = 7		'Unsigned 32 bit integer that represents time ticks.
	Const snmpOpaque = 8		'String.
	Const snmpNSAPAddress = 9	'String that represents an Network Service Access Point Address.
	Const snmpUInteger32 = 10	'Unsigned 32 bit integer.
	Const snmpCounter64 = 11	'Unsigned 64 bit integer.
    
    Const NOTMONITORED = -1
    Const MONITORED = 1
    Const IF_FAILED_COUNT = 3


Sub OnDiscovery(ByRef snmpDev)
    Dim portTab, lportTab
    Dim sValue, TabSet, ScalarTab, sifType
    Dim TablesCount, pIndx, tIndx, EnabledPortsCount
    Dim logMessage
    Dim community, snmpTimeout, SnmpData, snmpRetCode, snmpErrText

    'stop

    logMessage = "VBscrip discovery start, ip: " & snmpDev.IpAddress & ":" & snmpDev.SnmpPort & " device: " & snmpDev.DeviceName
    snmpDev.LogMsg(logMessage)

    '//Set xml config short form
    'snmpDev.XmlCfgForm = 0

    '// common properties output //////////////////////////////////////////////
    Val = snmpDev.ResSet.CommonProp.Attrib("excluded_if_types").Value
    logMessage = "VB script: Common property 'excluded_if_types' = " & Val
    snmpDev.LogMsg(logMessage)
    
    l_strArr_IfTypes = GetIfTypesArr(snmpDev, Val)
    
    Val = snmpDev.ResSet.CommonProp.Attrib("ProcessOnlyUpPorts").Value
    logMessage = "VB script: Common property 'ProcessOnlyUpPorts' = " & Val
    snmpDev.LogMsg(logMessage)
    
    If Val = True Then
        ProcessOnlyUpPorts = 1
    Else
        ProcessOnlyUpPorts = 0
    End If        
    
    Val = snmpDev.ResSet.CommonProp.Attrib("ifAlias_filter").Value
    logMessage = "VB script: Common property 'ifAlias_filter' = " & Val
    snmpDev.LogMsg(logMessage)
    
    l_strArr_ifAlias = GetIfTypesArr(snmpDev, Val)
    '//////////////////////////////////////////////////////////////////////////

    snmpDev.ResSet.ClearEvents()
    snmpDev.ResSet.ClearTrafficLights()

    Set ScalarTab = snmpDev.ScalarTable
    Set TabSet = snmpDev.TablesSet
    
    Set portTab = TabSet.PPortsTableByName("ifXTable")
    If Not (portTab Is Nothing) Then
        portTab.Disable = true
    End If
    
    l_bRetCode = CreateSnmpManager(snmpDev, l_SnmpRQ, TabSet)
    If( Err.Number <> 0 ) Then
        TablesCount = 0
        l_iSmnpError = -1
        snmpDev.ScriptErrorInfo = Err.Description
        snmpDev.ScriptError = SCRIPTFAILED
        Exit Sub
    End If
    
    Set portTab = TabSet.PPortsTableByName("A list of interface entries")
    TablesCount = portTab.Count
    EnabledPortsCount = 0

    'Stop
    For tIndx = 0 To TablesCount - 1
        Set lportTab = portTab.Table(tIndx)

        Set sValue = lportTab.Value("ifDescr")
        Set sifType = lportTab.Value("ifType")
        Set PortifOperStatus = lportTab.Value("ifOperStatus")
        Set ifSpeed = lportTab.Value("ifSpeed")
        Set ifInOctets = lportTab.Value("ifInOctets")
        Set ifOutOctets = lportTab.Value("ifOutOctets")
        Set ifInErrors = lportTab.Value("ifInErrors")
        Set ifOutErrors = lportTab.Value("ifOutErrors")
        Set ifInUcastPkts = lportTab.Value("ifInUcastPkts")
        Set ifInNUcastPkts = lportTab.Value("ifInNUcastPkts")
        Set ifOutUcastPkts = lportTab.Value("ifOutUcastPkts")
        Set ifOutNUcastPkts = lportTab.Value("ifOutNUcastPkts")
        Set ifInDiscards = lportTab.Value("ifInDiscards")
        Set ifOutDiscards = lportTab.Value("ifOutDiscards")
        Set ifIndex = lportTab.Value("ifIndex")
       
        l_strifAlias = GetifAlias(l_SnmpRQ, ifIndex.NumericValue)
		sValue.Tag = l_strifAlias
		logMessage = "Device: " & snmpDev.IpAddress & ":" & snmpDev.SnmpPort & " Port[" &  (tIndx+1) & "] ifAlias: " &  Chr(34) & l_strifAlias & Chr(34)
		snmpDev.LogMsg(logMessage)
        
        
        If  IsPortExcluded(snmpDev, sifType.NumericValue, l_strArr_IfTypes) Then
            ifIndex.Tag = NOTMONITORED
            'lportTab.Disable = True
			logMessage = "Device: " & snmpDev.IpAddress & ":" & snmpDev.SnmpPort & " Port[" &  (tIndx+1) & "] ifType: " & sifType.NumericValue & " ifDescr: " &  sValue.SValue & " Disabled (in excluded list)"
			snmpDev.LogMsg(logMessage)
		ElseIf Not IsPortIncludedByAlias(snmpDev, l_strifAlias, l_strArr_ifAlias) Then
            'lportTab.Disable = True
            ifIndex.Tag = NOTMONITORED
			logMessage = "Device: " & snmpDev.IpAddress & ":" & snmpDev.SnmpPort & " Port[" &  (tIndx+1) & "] ifType: " & sifType.NumericValue & " ifDescr: " &  sValue.SValue & " Disabled (there is not in alias filter)"
			snmpDev.LogMsg(logMessage)
        Else
            If ProcessOnlyUpPorts = 1 and PortifOperStatus.NumericValue <> 1 Then
	            'lportTab.Disable = True
	            ifIndex.Tag = NOTMONITORED
                logMessage = "Device: " & snmpDev.IpAddress & ":" & snmpDev.SnmpPort & " Port[" &  (tIndx+1) & "] ifType: " & sifType.NumericValue & " ifDescr: " &  sValue.SValue & " PortifOperStatus: " & PortifOperStatus.NumericValue & " Disabled (ifOperStatus <> 1)"
                snmpDev.LogMsg(logMessage)
            Else
                'lportTab.Disable = False
                ifIndex.Tag = MONITORED
                
                logMessage = "Device: " & snmpDev.IpAddress & ":" & snmpDev.SnmpPort & " Port[" &  (tIndx+1) & "] ifType: " & sifType.NumericValue & " ifDescr: " &  sValue.SValue & " PortifOperStatus: " & PortifOperStatus.NumericValue & " Enabled"
                snmpDev.LogMsg(logMessage)
                
                '// Add Calculated Events
                
                '// Create tag
                l_strTag = snmpDev.IpAddress & " " & sValue.SValue
                '// Save tag in "Link Speed" tab value for future use
                ifSpeed.Tag = l_strTag
                
                '// Init counters validations
                l_bUtilValid = False
                l_bPackets = False
                l_bBrodcastPackets = False
                
                l_bInUtilValid = False
                l_bOutUtilValid = False
                
                '// Utilization (%)
                If ifSpeed.NumericValue <> g_dBadValue And ifInOctets.NumericValue <> g_dBadValue Then
                    l_bInUtilValid = True
                End If
                If ifSpeed.NumericValue <> g_dBadValue And ifOutOctets.NumericValue <> g_dBadValue Then
                    l_bOutUtilValid = True
                End If
                If l_bInUtilValid = True And  l_bOutUtilValid = True Then
                    l_bUtilValid = True
                End If
                
                If l_bInUtilValid Then
                    l_strEventName = sValue.SValue & ": WAN Port Utilization IN (%)" 
                    l_strAlias = l_strTag & "_utilization_in" & tIndx 
                    
                    SLAError = snmpDev.ResSet.EventAddEx(l_strEventName, l_strAlias, "", l_strTag, -1)
                    
                    l_strTLName_ru = sValue.SValue & ": WAN Port Utilization IN (%)"
                    l_strTLName_en = sValue.SValue & ": WAN Port Utilization IN (%)"

                    TLError = snmpDev.ResSet.AddTrafficLight(l_strAlias, l_strTLName_ru, l_strTLName_en, "Average", ">", 95.0, 90.0, 85.0, 80.0)
                    logMessage = "VB script: snmpDev.ResSets.AddTrafficLight return: " & TLError  & " ('" & snmpDev.ResSet.InternalErrorInfo & "')"
                    snmpDev.LogMsg(logMessage)
                    l_bUtilValid = True
                End If    

                If l_bOutUtilValid Then
                    l_strEventName = sValue.SValue & ": WAN Port Utilization OUT (%)" 
                    l_strAlias = l_strTag & "_utilization_out" & tIndx 
                    
                    SLAError = snmpDev.ResSet.EventAddEx(l_strEventName, l_strAlias, "", l_strTag, -1)
                    
                    l_strTLName_ru = sValue.SValue & ": WAN Port Utilization OUT (%)"
                    l_strTLName_en = sValue.SValue & ": WAN Port Utilization OUT (%)"

                    TLError = snmpDev.ResSet.AddTrafficLight(l_strAlias, l_strTLName_ru, l_strTLName_en, "Average", ">", 95.0, 90.0, 85.0, 80.0)
                    logMessage = "VB script: snmpDev.ResSets.AddTrafficLight return: " & TLError  & " ('" & snmpDev.ResSet.InternalErrorInfo & "')"
                    snmpDev.LogMsg(logMessage)
                    l_bUtilValid = True
                End If
                
                '// WAN Port Ratio IN/OUT Bytes 
                If l_bInUtilValid And l_bOutUtilValid And ifInOctets.NumericValue <> g_dBadValue And ifOutOctets.NumericValue <> g_dBadValue Then
                    l_strEventName = sValue.SValue & ": WAN Port Ratio IN/OUT Bytes" 
                    l_strAlias = l_strTag & "_port_ratio_in_out" & tIndx 
                    
                    SLAError = snmpDev.ResSet.EventAddEx(l_strEventName, l_strAlias, "", l_strTag, -1)
                End If
                
                '// Unicast Packets counters validation
                If ifInUcastPkts.NumericValue <> g_dBadValue And ifOutUcastPkts.NumericValue <> g_dBadValue Then
                    l_bPackets = True
                End If                    
                
                If ifInNUcastPkts.NumericValue <> g_dBadValue And ifOutNUcastPkts.NumericValue <> g_dBadValue Then
                    l_bBrodcastPackets = True
                End If                    
                
                '// Broadcast Packets (%)
                If l_bUtilValid = True  And l_bBrodcastPackets = True Then
                    l_strEventName = sValue.SValue & ": WAN NonUnicast Packets (%)" 
                    l_strAlias = l_strTag & "_broadcast_pkts_" & tIndx
                    
                    SLAError = snmpDev.ResSet.EventAddEx(l_strEventName, l_strAlias, "", l_strTag, -1)
                    
                    l_strTLName_ru = sValue.SValue & ": WAN NonUnicast Packets (%)"
                    l_strTLName_en = sValue.SValue & ": WAN NonUnicast Packets (%)"

                    TLError = snmpDev.ResSet.AddTrafficLight(l_strAlias, l_strTLName_ru, l_strTLName_en, "Average", ">", 3.0, 1.0, 0.5, 0.0)
                    logMessage = "VB script: snmpDev.ResSets.AddTrafficLight return: " & TLError  & " ('" & snmpDev.ResSet.InternalErrorInfo & "')"
                    snmpDev.LogMsg(logMessage)
                End If    
                    
                '// Errors
                If l_bPackets = True And ifInErrors.NumericValue <> g_dBadValue And ifOutErrors.NumericValue <> g_dBadValue Then
                    l_strEventName = sValue.SValue & ": WAN Port Errors" 
                    l_strAlias = l_strTag & "_errors_" & tIndx 
                    SLAError = snmpDev.ResSet.EventAddEx(l_strEventName, l_strAlias, "", l_strTag, -1)
                     
                    l_strTLName_ru = sValue.SValue & ": WAN Port Errors"
                    l_strTLName_en = sValue.SValue & ": WAN Port Errors"
 
                    TLError = snmpDev.ResSet.AddTrafficLight(l_strAlias, l_strTLName_ru, l_strTLName_en, "Maximum", ">", 1, 2, 3, 4)
                    logMessage = "VB script: snmpDev.ResSets.AddTrafficLight return: " & TLError  & " ('" & snmpDev.ResSet.InternalErrorInfo & "')"
                    snmpDev.LogMsg(logMessage)
                End If
                
                '// Discarded (Dropped) packets (%)
                If l_bPackets = True And ifInDiscards.NumericValue <> g_dBadValue And ifOutDiscards.NumericValue <> g_dBadValue Then
                    l_strEventName = sValue.SValue & ": WAN Discarded Packets (%)"
                    l_strAlias = l_strTag & "_discards_" & tIndx
                    SLAError = snmpDev.ResSet.EventAddEx(l_strEventName, l_strAlias, "", l_strTag, -1)
                    
                    l_strTLName_ru = sValue.sValue & ": WAN Discarded Packets (%)"
                    l_strTLName_en = sValue.sValue & ": WAN Discarded Packets (%)"

                    TLError = snmpDev.ResSet.AddTrafficLight(l_strAlias, l_strTLName_ru, l_strTLName_en, "Maximum", ">", 0.1, 0.05, 0.01, 0.0)
                    logMessage = "VB script: snmpDev.ResSets.AddTrafficLight return: " & TLError  & " ('" & snmpDev.ResSet.InternalErrorInfo & "')"
                    snmpDev.LogMsg(logMessage)
                End If
                
                If l_bPackets = False And l_bInUtilValid = False And l_bOutUtilValid = False Then
	                'lportTab.Disable = True
	                ifIndex.Tag = NOTMONITORED
                    logMessage = "Device: " & snmpDev.IpAddress & ":" & snmpDev.SnmpPort & " Port[" &  (tIndx+1) & "] ifDescr: " &  sValue.SValue & " PortifOperStatus: " & PortifOperStatus.NumericValue & " Disabled (No valid counters)"
                    snmpDev.LogMsg(logMessage)
                Else
                    If PortifOperStatus.NumericValue <> g_dBadValue Then
                        l_strEventName = "The current operational state of the interface " & sValue.SValue
                        l_strAlias = l_strTag & "_ifOperStatus_" & tIndx
                        SLAError = snmpDev.ResSet.EventAddEx(l_strEventName, l_strAlias, "", l_strTag, -1)
                    End If
                
                    EnabledPortsCount = EnabledPortsCount +1
                End If    
                
            End If
        End If

        If lportTab.Disable = False Then
            lportTab.PortDescription = sValue.SValue
        End If
    Next

    logMessage = "Enabled Ports count: " & EnabledPortsCount
    snmpDev.LogMsg(logMessage)
    
    
    'If EnabledPortsCount = 0 And snmpDev.WasDiscovered = True Then
    '    snmpDev.Disable = True
    'End If

    logMessage = "VBscrip dump Device Data:"
    snmpDev.LogMsg(logMessage)

    'snmpDev.Dump()

    logMessage = "+=========================================================="
    snmpDev.LogMsg(logMessage)

    logMessage = "VBscrip discovery end, ip: " & snmpDev.IpAddress & ":" & snmpDev.SnmpPort 
    snmpDev.LogMsg(logMessage)

End Sub


Sub OnDataReceived(ByRef snmpDev)
    
	Set mySendTrap = New cSendTrap
	mySendTrap.Community = "prolan_ro"
	mySendTrap.AgentAddress = CStr(snmpDev.IpAddress)
	mySendTrap.TrapManagersAdd "127.0.0.1"

	mySendTrap.LogFileName= snmpDev.ResSet.CommonProp.Attrib("snmp_trap_log").Value	
	mySendTrap.VariableClear


    logMessage = "+=========================================================="
    snmpDev.LogMsg(logMessage)

    logMessage = "VBscrip OnDataReceived start, ip: " & snmpDev.IpAddress & ":" & snmpDev.SnmpPort & " device: " & snmpDev.DeviceName
    snmpDev.LogMsg(logMessage)



    'stop
    sysUpTime = snmpDev.ScalarTable.Value("sysUpTime").NumericValue

	Set ScalarTab = snmpDev.ScalarTable
    Set TabSet = snmpDev.TablesSet
    Set portTab = TabSet.PPortsTableByName("A list of interface entries")
    Set portTab_Din = TabSet.PPortsTableByName("ifEntry_dynamic")
    TablesCount = portTab.Count
    
    If sysUpTime = snmpDev.ResSet.BadValue Then
    	If Len(snmpDev.ScalarTable.Value("sysUpTime").Tag) = 0 Then
    	    snmpDev.ScalarTable.Value("sysUpTime").Tag = CStr(0)
    	End If
    	
    	'Нет возможности получить sysUpTime, считаем, что устройство недоступно и увеличиваем счетчик попыток
    	snmpDev.ScalarTable.Value("sysUpTime").Tag = CStr(CInt(snmpDev.ScalarTable.Value("sysUpTime").Tag) + 1)
    	
    	'Проверяем не пора ли слать трап
    	If CInt(snmpDev.ScalarTable.Value("sysUpTime").Tag) > 0 Then
    	    ' Очищаем для каждого интерфейса значение его тредыдущего состояния
    	    For tIndx = 0 To TablesCount - 1
        		Set TabOnPort = portTab.Table(tIndx)
        		TabOnPort.Value("ifOperStatus").Tag = ""
    		Next
    		'Шлем трап что устройство вообще по SNMP не доступно
    	End If
    	
    	'// Set bad Value To all calculated Events
        ResetCalculatedEvenst(ScalarTab)
		Exit Sub
    Else
    	'Все нормально, получили sysUpTime, обнуляем счетчик
    	snmpDev.ScalarTable.Value("sysUpTime").Tag = CStr(0)
    	
        '// If Use Active Device Only is turn off and
        '// notactive device has wake up - Do rediscovery
        If snmpDev.UseActiveDeviceOnly = false and snmpDev.WasDiscovered = false Then
                logMessage = "VBscrip Script: snmpDev has been responded - Set Rediscovery flag"
                snmpDev.LogMsg(logMessage)
                snmpDev.LaunchRediscovery = true
                snmpDev.RediscoveryInitiator = true
        End If
    End If
    
    PORT_RATIO_IN_OUT_MAXIMUM = snmpDev.ResSet.CommonProp.Attrib("port_ratio_in_out_maximum").Value

    'logMessage = "VBscrip OnDataReceived: PortTab count: "& TabSet.Count
    'snmpDev.LogMsg(logMessage)

    'logMessage = "VBscrip OnDataReceived: Ports count: "& TablesCount
    'snmpDev.LogMsg(logMessage)

    'logMessage = "VBscrip OnDataReceived: BAD Data Value: " & g_dBadValue
    'snmpDev.LogMsg(logMessage)
    '// Set bad Value To all calculated Events
    ResetCalculatedEvenst(ScalarTab)

    For tIndx = 0 To TablesCount - 1
        Set TabOnPort = portTab.Table(tIndx)
        
        Set InOctets	= TabOnPort.Value("ifInOctets")
        Set OutOctets	= TabOnPort.Value("ifOutOctets")
        Set BandWith	= TabOnPort.Value("ifSpeed")
        Set PacketsInPort_u	= TabOnPort.Value("ifInUcastPkts")
        Set PacketsOutPort_u = TabOnPort.Value("ifOutUcastPkts")
        Set ErrorCount = TabOnPort.Value("error_count")

        if snmpDev.ScriptExecCount = 0 Then
            ErrorCount.NumericValue = 0
        End If

		' Модифицировано для корректной работы с техническим IOS'ом в котором значения метрик ifInNUcastPkts и ifOutNUcastPkts - Not available
		' В данном тесте проверяем, если значения характеристик равны g_dBadValue присваиваем им 0, в противном случае оставляем значение без изменения
        Set PacketsInPort_b = TabOnPort.Value("ifInNUcastPkts")
        If PacketsInPort_b.NumericValue = g_dBadValue And PacketsInPort_u.NumericValue <> g_dBadValue Then 
            PacketsInPort_b.NumericValue = 0
        End If
            
        Set PacketsOutPort_b = TabOnPort.Value("ifOutNUcastPkts")
        If PacketsOutPort_b.NumericValue = g_dBadValue And PacketsOutPort_u.NumericValue <> g_dBadValue Then 
            PacketsOutPort_b.NumericValue = 0
        End If    
        
        Set ErrPortIn = TabOnPort.Value("ifInErrors")
        Set ErrPortOut = TabOnPort.Value("ifOutErrors")
        
        Set ifInDiscards = TabOnPort.Value("ifInDiscards")
        Set ifOutDiscards = TabOnPort.Value("ifOutDiscards")
        
        AbsoluteErrPortIn = TabOnPort.Value("ifInErrors").NumericValue
        AbsoluteErrPortOut = TabOnPort.Value("ifOutErrors").NumericValue
        AbsoluteErrPortInPrevValue = TabOnPort.Value("ifInErrors").PrevValue
        AbsoluteErrPortOutPrevValue = TabOnPort.Value("ifOutErrors").PrevValue
        
        ' Проверяем живость интерфейса
        Set ifDescr = TabOnPort.Value("ifDescr")
   		Set ifIndex = TabOnPort.Value("ifIndex")
        Set ifType = TabOnPort.Value("ifType")
        Set ifOperStatus = TabOnPort.Value("ifOperStatus")

        l_lMonStatus = NOTMONITORED
        If Len(ifIndex.Tag) > 0 Then
            l_lMonStatus = CLng(ifIndex.Tag)
        End If

        If l_lMonStatus =  MONITORED Then
            
		    ' если в счётчиках нет туфты (после ошибки snmp, например)
		    If ifOperStatus.NumericValue <> g_dBadValue And ifIndex.NumericValue <> g_dBadValue And ifType.NumericValue <> g_dBadValue And ifDescr.NumericValue <> g_dBadValue Then
		        If ifOperStatus.Tag = "" Then
			        ' Выполняется при первом проходе теста или перезапуске NPM Probe+
			        ' Сохраняем в Tag'е текущее состояние интерефейса в виде текста
                        			    
			        ifOperStatus.Tag = CStr(ifOperStatus.NumericValue)
			        'Отправляем первый трап с состоянием интерфейса
			        mySendTrap.VariableClear
			        mySendTrap.Enterprise = "1.3.6.1.6.3.1.1.5"
			        mySendTrap.GenericTrap = 5 - ifOperStatus.NumericValue
			        mySendTrap.SpecificTrap = 0
			        mySendTrap.VariableAdd "1.3.6.1.2.1.2.2.1.1." & CStr(ifIndex.NumericValue), snmpInteger, ifIndex.NumericValue
			        mySendTrap.VariableAdd "1.3.6.1.2.1.2.2.1.2." & CStr(ifIndex.NumericValue), snmpOctetString, Replace(ifDescr.SValue, " ", "_")
			        mySendTrap.VariableAdd "1.3.6.1.2.1.2.2.1.3." & CStr(ifIndex.NumericValue), snmpInteger, ifType.NumericValue
			        '//mySendTrap.VariableAdd "1.3.6.1.4.1.9.2.2.1.1.20." & CStr(ifIndex.NumericValue), snmpOctetString, GetifAlias(snmpDev, ifIndex.NumericValue)
				    mySendTrap.VariableAdd "1.3.6.1.4.1.9.2.2.1.1.20." & CStr(ifIndex.NumericValue), snmpOctetString, ifDescr.Tag
			        mySendTrap.Send
		        Else
			        ' Выполняется при последующих проходах теста
			        ' Сравниваем какое состояние интерфейса было и какое сейчас
        			
			        If ifOperStatus.Tag = CStr(ifOperStatus.NumericValue) Then
				        ' Ничего не изменилось
        				
			        Else
				        ' Сохраняем в Tag'е текущее состояние интерефейса в виде текста
				        ifOperStatus.Tag = CStr(ifOperStatus.NumericValue)
            			
				        ' Состояние изменилось шлем трап
				        mySendTrap.VariableClear
				        mySendTrap.Enterprise = "1.3.6.1.6.3.1.1.5"
				        mySendTrap.GenericTrap = 5 - ifOperStatus.NumericValue
				        mySendTrap.SpecificTrap = 0
				        mySendTrap.VariableAdd "1.3.6.1.2.1.2.2.1.1." & CStr(ifIndex.NumericValue), snmpInteger, ifIndex.NumericValue
				        mySendTrap.VariableAdd "1.3.6.1.2.1.2.2.1.2." & CStr(ifIndex.NumericValue), snmpOctetString, Replace(ifDescr.SValue, " ", "_")
				        mySendTrap.VariableAdd "1.3.6.1.2.1.2.2.1.3." & CStr(ifIndex.NumericValue), snmpInteger, ifType.NumericValue
				        '//mySendTrap.VariableAdd "1.3.6.1.4.1.9.2.2.1.1.20." & CStr(ifIndex.NumericValue), snmpOctetString, GetifAlias(snmpDev, ifIndex.NumericValue)
				        mySendTrap.VariableAdd "1.3.6.1.4.1.9.2.2.1.1.20." & CStr(ifIndex.NumericValue), snmpOctetString, ifDescr.Tag
				        mySendTrap.Send
			        End If
		        End If
    		End If
    		
    		l_strAlias = BandWith.Tag & "_ifOperStatus_"  &  tIndx
    		Set l_OperStatus = ScalarTab.Value(l_strAlias)
    		SetCounter l_OperStatus, ifOperStatus.NumericValue
    		
		    l_strAlias = BandWith.Tag & "_errors_" &  tIndx
            Set ErrPortSum = ScalarTab.Value(l_strAlias)

		    ' Отсылаем трап на появление ошибок. Шлем, если есть хоть одна новая ошибка на вход или выход (AbsoluteifInErrors/AbsoluteifOutErrors)
		    If AbsoluteErrPortIn <> g_dBadValue And AbsoluteErrPortOut <> g_dBadValue And AbsoluteErrPortInPrevValue <> g_dBadValue And AbsoluteErrPortOutPrevValue <> g_dBadValue Then
			    TotalErrorPackets = (AbsoluteErrPortIn-AbsoluteErrPortInPrevValue) + (AbsoluteErrPortOut-AbsoluteErrPortOutPrevValue)
			    'ErrPortSum.NumericValue = TotalErrorPackets
			    SetCounter ErrPortSum, TotalErrorPackets
			    
			    If TotalErrorPackets > 0 Then
				    mySendTrap.VariableClear
				    mySendTrap.GenericTrap = snmpEnterpriseSpecific
				    mySendTrap.SpecificTrap = 0
				    mySendTrap.Enterprise = "1.3.6.1.2.1.2.2.1.14"
				    mySendTrap.VariableAdd "1.3.6.1.2.1.2.2.1.1." & CStr(ifIndex.NumericValue), snmpOctetString, CStr(ifIndex.NumericValue)
				    mySendTrap.VariableAdd "1.3.6.1.2.1.2.2.1.2." & CStr(ifIndex.NumericValue), snmpOctetString, Replace(ifDescr.SValue, " ", "_")
				    mySendTrap.VariableAdd "1.3.6.1.2.1.2.2.1.3." & CStr(ifIndex.NumericValue), snmpInteger, TotalErrorPackets
				    '//mySendTrap.VariableAdd "1.3.6.1.4.1.9.2.2.1.1.20." & CStr(ifIndex.NumericValue), snmpOctetString, GetifAlias(snmpDev, ifIndex.NumericValue)
				    mySendTrap.VariableAdd "1.3.6.1.4.1.9.2.2.1.1.20." & CStr(ifIndex.NumericValue), snmpOctetString, ifDescr.Tag
				    mySendTrap.Send
			    End If
		    End If
    		
    		'// Link speed (BandWith)
    		l_difSpeed = GetCounter(BandWith)
    		
    		'// Utilization ini
            l_strAlias = BandWith.Tag & "_utilization_in" &  tIndx
            Set UtilPortIn	= ScalarTab.Value(l_strAlias)
            l_strAlias = BandWith.Tag & "_utilization_out" &  tIndx
            Set UtilPortOut	= ScalarTab.Value(l_strAlias)
            l_dInOctets = GetCounter(InOctets)
            l_dOutOctets = GetCounter(OutOctets)
            l_dUtilPortOut = g_dBadValue
            l_dUtilPortTotal = g_dBadValue
            l_dUtilPortIn = g_dBadValue
            l_bUtilValid = False
            l_bInUtilValid = False
            l_bOutUtilValid = False
            
            '// Packets  ini
            l_strAlias = BandWith.Tag & "_broadcast_pkts_" &  tIndx
            Set BroadcastPackets = ScalarTab.Value(l_strAlias)
            l_dBroadcastPackets = g_dBadValue
            l_dPacketsInPort_u = GetCounter(PacketsInPort_u)
            l_dPacketsOutPort_u = GetCounter(PacketsOutPort_u)
            l_dPacketsInPort_b = GetCounter(PacketsInPort_b)
            l_dPacketsOutPort_b = GetCounter(PacketsOutPort_b)
            l_dPacketsTotal = g_dBadValue
            l_dBPacketsTotal = g_dBadValue
            l_bPackets = False
            
            '// Errors  ini
            l_strAlias = BandWith.Tag & "_errors_" &  tIndx
            Set ErrPortSum = ScalarTab.Value(l_strAlias)
            l_dErrPortIn = GetCounter(ErrPortIn)
            l_dErrPortOut = GetCounter(ErrPortOut)
            l_dErrPortSum = g_dBadValue
            
            '// Discards ini
            l_strAlias = BandWith.Tag & "_discards_" &  tIndx
            Set DiscardsPkts = ScalarTab.Value(l_strAlias)
            l_dDiscardsPkts = g_dBadValue
            l_difInDiscards = GetCounter(ifInDiscards)
            l_difOutDiscards = GetCounter(ifOutDiscards)

            '// Port In/Out Ratio ini
            l_strAlias = BandWith.Tag & "_port_ratio_in_out" &  tIndx
            Set PortRatioInOut = ScalarTab.Value(l_strAlias)
            l_dPortRatioInOut = g_dBadValue


            '// Utilization
            If l_difSpeed <> g_dBadValue And l_difSpeed > 0 And l_dInOctets <> g_dBadValue Then
                l_dUtilPortIn =  (l_dInOctets/l_difSpeed)* 800.0
                l_bInUtilValid = True
            End If
            
            If l_difSpeed <> g_dBadValue And l_difSpeed > 0 And l_dOutOctets <> g_dBadValue Then
                l_dUtilPortOut =  (l_dOutOctets/l_difSpeed)* 800.0
                l_bOutUtilValid = True
            End If
            
            If l_bInUtilValid = True And l_bOutUtilValid = True Then
                l_dUtilPortTotal = l_dUtilPortIn + l_dUtilPortOut
                l_bUtilValid = True
            End If    

            '// Port Ratio
            If l_dInOctets <> g_dBadValue And l_dOutOctets <> g_dBadValue Then
                If l_dInOctets > 0 And l_dOutOctets = 0 Then
                    l_dPortRatioInOut = PORT_RATIO_IN_OUT_MAXIMUM
                ElseIf l_dInOctets > 0 And l_dOutOctets > 0 Then
                    l_dPortRatioInOut = l_dInOctets/l_dOutOctets
                End If                
            End If 
         
            '// Packets
            If l_bUtilValid = True And  l_dPacketsInPort_u <> g_dBadValue And l_dPacketsOutPort_u <> g_dBadValue And l_dPacketsInPort_b <> g_dBadValue And l_dPacketsOutPort_b <> g_dBadValue Then
                l_dPacketsTotal = l_dPacketsInPort_u + l_dPacketsOutPort_u + l_dPacketsInPort_b + l_dPacketsOutPort_b
                l_bPackets = True
            End If 
         
            '// Errors
            If l_bPackets = True And l_dErrPortIn <> g_dBadValue And l_dErrPortOut <> g_dBadValue Then
                If l_dPacketsTotal > 0 Then
                    l_dErrPortSum = l_dErrPortIn + l_dErrPortOut
                    l_dPacketsTotal = l_dPacketsTotal + l_dErrPortSum
                    l_dErrPortSum =  (l_dErrPortSum/l_dPacketsTotal) * 100.0         
                    If l_dUtilPortTotal < 1.0 Then
                        l_dErrPortSum = 0.0
                    End If
                End If
            End If
         
            '// Discards
            If l_bPackets = True And l_difInDiscards <> g_dBadValue And l_difOutDiscards <> g_dBadValue Then
                If l_dPacketsTotal > 0 Then
                    l_dDiscardsPkts = l_difInDiscards + l_difOutDiscards              
                    l_dPacketsTotal = l_dPacketsTotal  + l_dDiscardsPkts    
                    l_dDiscardsPkts = (l_dDiscardsPkts/l_dPacketsTotal) * 100.0
                    If l_dUtilPortTotal < 1.0 Then
                        l_dDiscardsPkts = 0.0
                    End If
                Else
                    l_dDiscardsPkts = 0.0
                End If
                
            End If  

            '// Broadcasts
            If l_dPacketsTotal <> g_dBadValue And l_dPacketsInPort_b <> g_dBadValue And l_dPacketsOutPort_b <> g_dBadValue  Then
                If l_dPacketsTotal > 0 Then
                    l_dBPacketsTotal = l_dPacketsInPort_b + l_dPacketsOutPort_b
                    l_dBPacketsTotal = (l_dBPacketsTotal*100.0)/l_dPacketsTotal
                Else
                    l_dBPacketsTotal = 0                    
                End If
                If l_dUtilPortTotal < 1.0 Then
                    l_dBPacketsTotal = 0.0
                End If
            End If  

            '// Set calculated Events
            SetCounter UtilPortIn, l_dUtilPortIn
            SetCounter UtilPortOut, l_dUtilPortOut
            SetCounter DiscardsPkts, l_dDiscardsPkts
            SetCounter PortRatioInOut, l_dPortRatioInOut
            SetCounter BroadcastPackets, l_dBPacketsTotal
            
            '// check Interface Availability 
            If sysUpTime <> g_dBadValue  Then
                 
                If ifIndex.NumericValue = g_dBadValue Or ifOperStatus.NumericValue = g_dBadValue Then
                    
                    If snmpDev.ScriptExecCount > 0  And portTab.SnmpError <> -1 Then
                        ErrorCount.NumericValue = ErrorCount.NumericValue + 1

                        logMessage = "VBscrip Script: Interface [" & ifDescr.Name & "] is failed, but system time is done; Error Count:" & ErrorCount.NumericValue
                        snmpDev.LogMsg(logMessage)

                        If ErrorCount.NumericValue >= IF_FAILED_COUNT Then
                            logMessage = "VBscrip Script: Set Rediscovery flag; Error Count:" & ErrorCount.NumericValue
                            snmpDev.LogMsg(logMessage)
                            snmpDev.LaunchRediscovery = true
                            snmpDev.RediscoveryInitiator = true
                        End if
                        
                    End if
                else
                    If ErrorCount.NumericValue > 0 Then
                        logMessage = "VBscrip Script: Reset Error Count"
                        snmpDev.LogMsg(logMessage)
                        ErrorCount.NumericValue = 0
                    End if   
                End if    
            End if
            '// check Inteface Availability end 
            
            
        End If        
    Next

    'stop
    '// Is new Interface available
    If portTab.SnmpError <> -1 And portTab_Din.SnmpError <> -1 Then   
        If IsNewQueues(snmpDev, portTab_Din, portTab)  Then
            logMessage = "VBscrip Script: New Interface are available - Set Rediscovery flag"
            snmpDev.LogMsg(logMessage)
        
            snmpDev.LaunchRediscovery = true
            snmpDev.RediscoveryInitiator = true
        End If
    End If

    snmpDev.ScriptExecCount = snmpDev.ScriptExecCount + 1   
    logMessage = "+=========================================================="
    snmpDev.LogMsg(logMessage)

End Sub

Function IsNewQueues(ByRef snmpDev, portTab_Din, portTab_static) 

    l_bIsNewQueues = False

    portTab_Din.InitInstancesIterations()
    
    Set TabOnPort = portTab_Din.CurrTable
    
    Do While Not (TabOnPort Is Nothing)
        l_strInstance = TabOnPort.Instance
        If Not IsInstncInStaticTable(snmpDev, l_strInstance, portTab_static) Then
           l_bIsNewQueues = True
           Exit Do
        End If
        
        portTab_Din.NextTable()
        Set TabOnPort = portTab_Din.CurrTable
   Loop

    IsNewQueues = l_bIsNewQueues
End Function

Function IsInstncInStaticTable(ByRef snmpDev, instanse_din, portTab_static) 

    l_bIsInstncInStaticTable = False

    portTab_static.InitInstancesIterations()
    
    Set TabOnPort = portTab_static.CurrTable
    
    Do While Not (TabOnPort Is Nothing)
        
        l_strInstance = TabOnPort.Instance
        If Left(TabOnPort.Instance, 1) <> "." Then
            l_strInstance = "." & TabOnPort.Instance
        End If
        
        l_iCompare = InStr(1, l_strInstance,  instanse_din, 1)
        If l_iCompare > 0 Then
           l_bIsInstncInStaticTable = True
           Exit Do
        End If
        
        portTab_static.NextTable()
        Set TabOnPort = portTab_static.CurrTable
   Loop

    IsInstncInStaticTable = l_bIsInstncInStaticTable
End Function

Function GetIfTypesArr(ByRef snmpDev, strExclIfTypes)
    l_strArr_IfTypes = Split(strExclIfTypes, ",", -1, 1)
    l_iLenArr = UBound(l_strArr_IfTypes)
    
    For l_iIndx = 0 To l_iLenArr
        l_strArr_IfTypes(l_iIndx) = Trim(l_strArr_IfTypes(l_iIndx))
    Next

    GetIfTypesArr = l_strArr_IfTypes

End Function

Function IsPortExcluded(ByRef snmpDev, PortType, Arr_Exclude_IfTypes)
    l_iLenArr = UBound(Arr_Exclude_IfTypes)
    
    IsPortExcluded = False
    
    For l_iIndx = 0 To l_iLenArr
        If IsNumeric(Arr_Exclude_IfTypes(l_iIndx) ) Then
            If CInt(Arr_Exclude_IfTypes(l_iIndx)) = PortType Then
                IsPortExcluded = True
                Exit Function           
            End If
        End If
    Next

End Function

Function IsPortIncludedByAlias(ByRef snmpDev, lstrAlias, Arr_AliasFilter)
    l_iLenArr = UBound(Arr_AliasFilter)
    
    IsPortIncludedByAlias = False
    
    For l_iIndx = 0 To l_iLenArr
        If Arr_AliasFilter(l_iIndx) = "*" Then
            IsPortIncludedByAlias = True
            Exit For
        End if    
        
        If InStr(1,lstrAlias, Arr_AliasFilter(l_iIndx),1) > 0  Then
            IsPortIncludedByAlias = True
            Exit For
        End if    
    Next

End Function




Sub ResetCalculatedEvenst(ByRef ScalarTab)

    l_iValCount =  ScalarTab.Count

    For l_iIndx = 0 To l_iValCount - 1
        Set SValue = ScalarTab.ValueByIndx(l_iIndx)
        SValue.NumericValue = g_dBadValue
    Next
End Sub

Sub SetCounter(ByRef ScalarVal, Value)
    If Not (ScalarVal Is Nothing) Then
        ScalarVal.NumericValue = Value   
    End If
End Sub

Function GetCounter(ByRef ScalarVal)
    l_dVal = g_dBadValue
    
    If Not (ScalarVal Is Nothing) Then
        l_dVal = ScalarVal.NumericValue
    End If    
    
    GetCounter = l_dVal
End Function

Function InitSnmpEngine(ByRef snmpDev, ByRef SnmpRQ)

    SnmpRQ.ReadCommunity    = snmpDev.Community
    SnmpRQ.IpAddress        = snmpDev.IpAddress
    SnmpRQ.SnmpPort         = snmpDev.SnmpPort
    SnmpRQ.SnmpLevel        = snmpDev.SNMPVer
    SnmpRQ.SnmpTimeout      = snmpDev.SnmpTimeout
    SnmpRQ.SnmpRetryCount   = snmpDev.SnmpRetryCount
    InitSnmpEngine = 0

    l_LogInstance = snmpDev.GetLogInstance

    l_lRetCode = SnmpRQ.Init(l_LogInstance)

    If l_lRetCode = 0 Then
        l_lRetCode = SnmpRQ.CreateSession()
    End If
    InitSnmpEngine = l_lRetCode

End Function

Function CreateSnmpManager(ByRef snmpDev, ByRef l_SnmpRQ, ByRef TabSet)
    On Error Resume Next

    Set l_SnmpRQ = CreateObject("SnmpManagerComponent.PLSnmpManager.1")
    If Err.Number <> 0 Then 
        l_strErr = Err.Description
        l_strErr = "VBscript error: " & l_strErr
        
		logMessage = "VBScript: Cannot create SnmpManagerComponent err: " & Err.Number & " " & Err.Description
		snmpDev.LogMsg(logMessage)
        
        Err.Raise vbObjectError + 1, "GetDescription", l_strErr
        Exit Function
    End If

    snmpErr = InitSnmpEngine(snmpDev, l_SnmpRQ)
      If snmpErr <> 0 Then 
        l_strErr = l_SnmpRQ.ErrorInfo
        l_strErr = "Snmp error: " & l_strErr

		logMessage = "VBScript: Cannot init SnmpManagerComponent " & l_strErr
		snmpDev.LogMsg(logMessage)

        Err.Raise vbObjectError + 1, "GetDescription", l_strErr
        Exit Function
    End If

    l_SnmpRQ.SetTablesSet TabSet
    CreateSnmpManager = true

End Function


Function GetifAlias(ByRef SnmpRQ, l_ifIndex)
' 1.3.6.1.2.1.31.1.1.1.18.ifIndex - This object is an 'alias' name for the interface as specified by a network manager, and provides a non-volatile 'handle' for the interface

	On Error Resume Next
	Dim l_snmpValue

    

	'l_snmpValue = l_snmpDev.SnmpGet("1.3.6.1.2.1.31.1.1.1.18." & CStr(Trim(l_ifIndex)), snmpErr)
    l_snmpValue = SnmpRQ.SnmpGetFromMem("1.3.6.1.2.1.31.1.1.1.18." & CStr(Trim(l_ifIndex)), snmpErr)


	If snmpErr <> 0 Then
		logMessage = vbNewLine & "!!!Try Get OID: " & "1.3.6.1.2.1.31.1.1.1.18." & CStr(Trim(l_ifIndex)) & vbNewLine & "!!!Error Description: " & l_snmpDev.GetSnmpErrorText()
		l_snmpDev.LogMsg(logMessage)
		GetifAlias = ""
	Else
		If CStr(l_snmpValue) = "0" Then
			GetifAlias = ""
		Else
			GetifAlias = l_snmpValue
		End If
	End If
End Function

Class cSendTrap
	Private TrapAgent, fso, l_LogFileName, l_MaxRepeat

	Private Sub Class_Initialize   ' Setup Initialize event.
    	Set fso = CreateObject("Scripting.FileSystemObject")
    	l_LogFileName = "c:\SendSNMPTrap_" & Timer & ".Log"
    	l_MaxRepeat = 15
    	Set TrapAgent = CreateObject("Dart.Agent.1")
		TrapAgent.Open
		TrapAgent.Message.Reset
		TrapAgent.Message.Community = "prolan_ro"
		TrapAgent.Message.Type = 36 'Trap version 1 message
		'TrapAgent.Message.Type = 71 'Trap version 2 message
		TrapAgent.Message.GenericTrap = 6 'The SpecificTrap property contains information on the trap.
		TrapAgent.Message.SpecificTrap = 0
		TrapAgent.Message.Enterprise = "1.3.6.1.4.1.9"
		TrapAgent.Message.AgentAddress = "127.0.0.1"
		TrapAgent.TrapManagers.Clear
	End Sub

	Private Sub Class_Terminate   ' Setup Terminate event.
		TrapAgent.Close
		Set TrapAgent = Nothing
	End Sub
	
	Private Function Write2Log (l_txt)
		'Const ForReading = 1	' Open a file for reading only. You can't write to this file.
		'Const ForWriting =  2	' Open a file for writing.
		'Const ForAppending = 8	' Open a file and write to the end of the file.
		Dim LogFile, CountRepeat
		On Error Resume Next
		CountRepeat = 0
		Do
			Err.Clear
			Set LogFile = fso.OpenTextFile(l_LogFileName, 8, True)
			CountRepeat = CountRepeat + 1
		Loop Until (CountRepeat => l_MaxRepeat) or (Err.Number = 0)

		LogFile.WriteLine(Now & ": " & l_txt)
		LogFile.Close
		If Err.Number = 0 Then Write2Log = True Else Write2Log = False
	End Function
	
	Public Property Get LogFileName
   		LogFileName = l_LogFileName
	End Property 
    Public Property Let LogFileName(ByVal lValue)
        l_LogFileName = lValue
    End Property

	Public Property Get Community
   		Community = TrapAgent.Message.Community
	End Property 
    Public Property Let Community(ByVal lValue)
        TrapAgent.Message.Community = lValue
    End Property

	Public Property Get GenericTrap
   		GenericTrap = TrapAgent.Message.GenericTrap
	End Property 
    Public Property Let GenericTrap(ByVal lValue)
        TrapAgent.Message.GenericTrap = lValue
    End Property

	Public Property Get SpecificTrap
   		SpecificTrap = TrapAgent.Message.SpecificTrap
	End Property 
    Public Property Let SpecificTrap(ByVal lValue)
        TrapAgent.Message.SpecificTrap = lValue
    End Property

	Public Property Get Enterprise
   		Enterprise = TrapAgent.Message.Enterprise
	End Property 
    Public Property Let Enterprise(ByVal lValue)
        TrapAgent.Message.Enterprise = lValue
    End Property

	Public Property Get AgentAddress
   		AgentAddress = TrapAgent.Message.AgentAddress
	End Property 
    Public Property Let AgentAddress(ByVal lValue)
        TrapAgent.Message.AgentAddress = lValue
    End Property

	Public Property Get MaxRepeat
   		MaxRepeat = l_MaxRepeat
	End Property 
    Public Property Let MaxRepeat(ByVal lValue)
        l_MaxRepeat = lValue
    End Property


	Public Sub VariableAdd (ByVal l_oid, ByVal l_type, ByVal l_Value)
		Dim v
		
		Set v = CreateObject("Dart.SnmpVariable.1")
		v.Oid = l_oid
		v.Type = l_type
		v.Value = l_Value
		TrapAgent.Message.Variables.Add(v)
		Set v = Nothing
	End Sub
	
	Public Sub VariableClear
		TrapAgent.Message.Variables.Clear
	End Sub

	Public Sub TrapManagersAdd (ByVal l_ipaddress)
		TrapAgent.TrapManagers.Add l_ipaddress
	End Sub

	Public Sub TrapManagersClear
		TrapAgent.TrapManagers.Clear
	End Sub

	Public Sub Send
		Call TrapSpeciality
		TrapAgent.Send
	End Sub
	
	Sub TrapSpeciality
		Dim i
		On Error Resume Next
		Write2Log (" +++++++++++++ Start Send SNMP Trap +++++++++++++")
		Write2Log ("Community = '" & TrapAgent.Message.Community & "'")
		Write2Log ("Enterprise = '" & TrapAgent.Message.Enterprise & "'")
		Write2Log ("Type = '" & TrapAgent.Message.Type & "'")
		Write2Log ("GenericTrap = '" & TrapAgent.Message.GenericTrap & "'")
		Write2Log ("SpecificTrap = '" & TrapAgent.Message.SpecificTrap & "'")
		Write2Log ("AgentAddress = '" & TrapAgent.Message.AgentAddress & "'")
		Write2Log ("LocalAddress = '" & TrapAgent.LocalAddress & "'")
		
		For i = 1 To TrapAgent.TrapManagers.Count
			Write2Log ("Trap Manager - " & i & ": " & TrapAgent.TrapManagers.Item(i))
		Next
		
		For i = 1 To TrapAgent.Message.Variables.Count
			Write2Log (i & ")" & TrapAgent.Message.Variables(i).Oid & " = '" & TrapAgent.Message.Variables(i).Value & "'")
		Next
		Write2Log (" +++++++++++++ End Send SNMP Trap +++++++++++++")
	End Sub


End Class


--></Script>
    </xTest>
</document>
