<?xml version="1.0" encoding="windows-1251"?>
<document type="SelFTrendxTest" version="0.0" xmlns:m="xTest">
     <xTest type="USER_SCRIPT" alias="AdvAvailabilityTest" 
            TitleRus="Расширенный тест доступности устройств в сетях LAN/WAN с дополнительным оповещением" 
            TitleRootRus="Тесты доступности ресурсов (только для WinXP и выше)" 
            TitleEng="Advanced Availability Test for LAN/WAN with additional alarms" 
            TitleRootEng="Availability Grading Tests (for WinXP and above)" 
            TrafficLightsName="Advanced Availability Test for LAN/WAN with additional alarms"
            Version="2.5">
	<Files>
		<File type="conf" name="VB.NodeAdvancedAvailabilitywithAlarms.xTest.xml"/>
		<File type="help" name="VB.NodeAvailabilityLAN.xTest.chm::/VB.NodeAvailabilityLAN.xTest.html"/>
		<File type="dll" name="ST_SCTest.dll"/>
	</Files>

  <Keywords>
    <Keyword>Ping</Keyword>
    <Keyword>Доступность</Keyword>
  </Keywords>
       
	<xTestProps>
        <log_level_def>1</log_level_def>
        <truncate_log>1</truncate_log>
        <aver_interval_duration_sec>60</aver_interval_duration_sec>
	    <discovery_func>OnDiscovery</discovery_func>
	    <work_func>OnDataReceived</work_func>
	</xTestProps>

    <parameters TitleRus="Список сетевых устройств:" TitleEng="Network Devices:">
        <resources>
           <resource_id TitleRus="Имя или IP-адрес устройства" TitleEng="Name or IP-address"></resource_id>
        </resources>

        <resource_attribs TitleRus="Список параметров:" TitleEng="Parameters List:" SubTitleRus="Параметр" SubTitleEng="Parameter" >
            <!-- Type: "String", "Bool", "Integer", "Double" -->
            <Attrib Type="String" TitleRus="Описание контролируемого устройства" TitleEng="Device Description" Alias="DeviceDescription">""</Attrib>
        </resource_attribs>
        
            <common_attribs TitleRus="Список параметров (общие):" TitleEng="Parameters List (common):" SubTitleRus="Параметр" SubTitleEng="Parameter">            
                <Attrib Type="Bool" TitleRus="Добавлять IP-адрес в название характеристики" TitleEng="Add IP-address in description" Alias="AddIPaddress">"No"</Attrib>
                <Attrib Type="String" TitleRus="ICMP Timeout (ms)" TitleEng="ICMP Timeout (ms)" Alias="Timeout">"1000"</Attrib>
                <Attrib Type="String" TitleRus="ICMP Buffer Size (byte)" TitleEng="ICMP Buffer Size (byte)" Alias="BufferSize">"32"</Attrib>                
                <Attrib Type="Enum" TitleRus="Number ICMP Request" TitleEng="Number ICMP Request" Alias="NumberICMP">
                    <Attrib_enum TitleRus="Безлимитное число пингов" TitleEng="Unlimited Ping Count" Selected="No">"0"</Attrib_enum>
                    <Attrib_enum TitleRus="1" TitleEng="1" Selected="Yes">"1"</Attrib_enum>
                    <Attrib_enum TitleRus="2" TitleEng="2" Selected="No">"2"</Attrib_enum>
                    <Attrib_enum TitleRus="3" TitleEng="3" Selected="No">"3"</Attrib_enum>
					<Attrib_enum TitleRus="4" TitleEng="4" Selected="No">"4"</Attrib_enum>
					<Attrib_enum TitleRus="5" TitleEng="5" Selected="No">"5"</Attrib_enum>
					<Attrib_enum TitleRus="6" TitleEng="6" Selected="No">"6"</Attrib_enum>
					<Attrib_enum TitleRus="7" TitleEng="7" Selected="No">"7"</Attrib_enum>
					<Attrib_enum TitleRus="8" TitleEng="8" Selected="No">"8"</Attrib_enum>
					<Attrib_enum TitleRus="9" TitleEng="9" Selected="No">"9"</Attrib_enum>
					<Attrib_enum TitleRus="10" TitleEng="10" Selected="No">"10"</Attrib_enum>
					<Attrib_enum TitleRus="11" TitleEng="11" Selected="No">"11"</Attrib_enum>
					<Attrib_enum TitleRus="12" TitleEng="12" Selected="No">"12"</Attrib_enum>
					<Attrib_enum TitleRus="13" TitleEng="13" Selected="No">"13"</Attrib_enum>
					<Attrib_enum TitleRus="14" TitleEng="14" Selected="No">"14"</Attrib_enum>
					<Attrib_enum TitleRus="15" TitleEng="15" Selected="No">"15"</Attrib_enum>
                </Attrib>
                <Attrib Type="Enum" TitleRus="Type of Service: Minimize Monetary Cost" TitleEng="Type of Service: Minimize Monetary Cost" Alias="Minimize_Monetary_Cost">
                    <Attrib_enum TitleRus="Нет" TitleEng="No" Selected="Yes">"0"</Attrib_enum>
                    <Attrib_enum TitleRus="Да" TitleEng="Yes" Selected="No">"2"</Attrib_enum>
                </Attrib>
                <Attrib Type="Enum" TitleRus="Type of Service: Maximize Reliability" TitleEng="Type of Service: Maximize Reliability" Alias="Maximize_Reliability">
                    <Attrib_enum TitleRus="Нет" TitleEng="No" Selected="Yes">"0"</Attrib_enum>
                    <Attrib_enum TitleRus="Да" TitleEng="Yes" Selected="No">"4"</Attrib_enum>
                </Attrib>
                <Attrib Type="Enum" TitleRus="Type of Service: Maximize Throughput" TitleEng="Type of Service: Maximize Throughput" Alias="Maximize_Throughput">
                    <Attrib_enum TitleRus="Нет" TitleEng="No" Selected="Yes">"0"</Attrib_enum>
                    <Attrib_enum TitleRus="Да" TitleEng="Yes" Selected="No">"8"</Attrib_enum>
                </Attrib>
                <Attrib Type="Enum" TitleRus="Type of Service: Minimize Delay" TitleEng="Type of Service: Minimize Delay" Alias="Minimize_Delay">
                    <Attrib_enum TitleRus="Нет" TitleEng="No" Selected="Yes">"0"</Attrib_enum>
                    <Attrib_enum TitleRus="Да" TitleEng="Yes" Selected="No">"16"</Attrib_enum>
                </Attrib>
                <Attrib Type="Bool" TitleRus="Do Not Fragment" TitleEng="Do Not Fragment" Alias="NoFragmentation">"No"</Attrib>
       			<Attrib Type="String" TitleRus="Пороговые значения метрики 'Время отклика (ms)' (через ;)" TitleEng="Thresholds 'Response Time (ms)' (; separated)" Alias="ResponseThresholdTL">"35;20;15;10"</Attrib>
        				<Attrib Type="String" TitleRus="Пороговые значения метрики 'Доступность (%)' (через ;)" TitleEng="Thresholds 'Availability (%)' (; separated)" Alias="AvailabilityThresholdTL">"90;94;96;99"</Attrib>
                <Attrib Type="Bool"   TitleRus="Оповещать при недоступности контролируемого хоста" TitleEng="Send E-Mail on host down" Alias="IsNotifyDown">"No"</Attrib>
                <Attrib Type="String" TitleRus="Кол-во недоступных пингов" TitleEng="Ping Down Count" Alias="PingDownCount">"3"</Attrib>
                <Attrib Type="Bool"   TitleRus="Оповещать при доступности контролируемого хоста" TitleEng="Send E-Mail on host up" Alias="IsNotifyUp">"No"</Attrib>
                <Attrib Type="String" TitleRus="Кол-во доступных пингов" TitleEng="Ping Up Count" Alias="PingUpCount">"2"</Attrib>
                <Attrib Type="String" TitleRus="Email To (хост недоступен)" TitleEng="Email To (host down)" Alias="EmailToHostDown">"Admin &lt;hostdown@you_company.ru&gt;"</Attrib>
                <Attrib Type="String" TitleRus="Тема письма (хост недоступен)" TitleEng="Email Subject (host down)" Alias="EmailSubjectHostDown">"Hosts DOWN"</Attrib>
                <Attrib Type="String" TitleRus="Email To (хост доступен)" TitleEng="Email To (host up)" Alias="EmailToHostUp">"Admin &lt;hostup@you_company.ru&gt;"</Attrib>
                <Attrib Type="String" TitleRus="Тема письма (хост доступен)" TitleEng="Email Subject (host up)" Alias="EmailSubjectHostUp">"Hosts UP"</Attrib>
                <Attrib Type="String" TitleRus="Email From" TitleEng="Email From" Alias="EmailFrom">"ProLAN Probe &lt;probe@you_company.ru&gt;"</Attrib>
                <Attrib Type="String" TitleRus="Сервер SMTP" TitleEng="SMTP Server" Alias="SMTPServer">"localhost"</Attrib>
                <Attrib Type="Bool"   TitleRus="Добавлять в тему письма список хостов" TitleEng="Add host list to Email Subject" Alias="AddHostListToSubject">"Yes"</Attrib>
            </common_attribs>
        
        <resource_attribs TitleRus="Список параметров:" TitleEng="Parameters List:" SubTitleRus="Параметр" SubTitleEng="Parameter" >
        </resource_attribs>
    </parameters>

    <popupdisplay>
	    <description ru="Расширенный тест доступности устройств в сетях LAN/WAN с дополнительным оповещением" en="Advanced Availability Test for LAN/WAN with additional alarms"></description>
    </popupdisplay>

<Script language="VBScript">
<!--
Option Explicit 

Const c_iMaxSubjectLen = 100

Dim PingUpCount, PingDownCount, IsNotifyUp, IsNotifyDown, g_AddHostListToSubject

Sub OnDiscovery(ByRef ResSet)

    Dim ResCount, Unid, objWMI, Timeout, BufferSize, cPingResults, oPingResult, strWhere, i, ICMPDeviceName, strSelect, SLAEventName, SLAAliasName, Error, l_strTLName_ru, l_strTLName_en, TLError, AddIPaddress
    Dim ResponseThresholdTL, AvailabilityThresholdTL, NumberICMP, NoFragmentation, ToS
	
    'On Error Resume Next./
    'stop
    Err.Clear
	   
    ResSet.LogMsg("*** Start Sub OnDiscovery ***")
    ResSet.SendProgressMessage("Start Discovery...")
    ResCount=ResSet.Count
    Unid = ResSet.UnidBase
    ResSet.LogMsg("ResSet.Count: " & ResSet.Count & " ResSet.UnidBase: " & ResSet.UnidBase)

    Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}//./root/cimv2")
    Set cPingResults = objWMI.ExecQuery("Select * FROM Win32_PingStatus WHERE Address = 'localhost'")
    For Each oPingResult In cPingResults
        If Err.Number <> 0 Then
            ResSet.ScriptError = -1
            ResSet.ScriptErrorInfo = "Ошибка при запуске теста. Нет возможности использовать WMI объект: Win32_PingStatus. Подробности в файле: xfiles_log.txt"
            ResSet.LogMsg ("*** Start Description Error ***")
            ResSet.LogMsg ("Error number: " & Err.Number)
            ResSet.LogMsg ("Error Description: " & Err.Description)
            ResSet.LogMsg ("*** End Description Error ***")
            Exit Sub
        Else
            ResSet.LogMsg("oPingResult.Path_.Path: " & oPingResult.Path_.Path)
        End If
    Next

    Timeout = ResSet.CommonProp.Attrib("Timeout").Value
    BufferSize = ResSet.CommonProp.Attrib("BufferSize").Value
    AddIPaddress = CBool(ResSet.CommonProp.Attrib("AddIPaddress").Value)
    NumberICMP = ResSet.CommonProp.Attrib("NumberICMP").Value
    If CBool(ResSet.CommonProp.Attrib("NoFragmentation").Value) Then
        NoFragmentation = "True"
    Else
        NoFragmentation = "False"
    End If
	
    If (NumberICMP * Timeout / 1000) > ResSet.SLaPeriod Then
        ResSet.ScriptError = -1
        ResSet.ScriptErrorInfo = "Суммарное время таймаутов (" & (NumberICMP * Timeout) & " сек) больше периода усреднения (" & ResSet.SLaPeriod & " сек). Измените параметры и повторите запуск теста."
        Exit Sub
    End If
    
    ResSet.LogMsg ("Common Attributes:AddIPaddress - " & AddIPaddress)
    ResSet.LogMsg ("Common Attributes:Timeout - " & Timeout)
    ResSet.LogMsg ("Common Attributes:BufferSize - " & BufferSize)
    ResSet.LogMsg ("Common Attributes:NumberICMP - " & NumberICMP)
    ResSet.LogMsg ("Common Attributes:NoFragmentation - " & NoFragmentation)
    ResSet.LogMsg ("Common Attributes:IsNotifyDown - " & ResSet.CommonProp.Attrib("IsNotifyDown").Value)
    ResSet.LogMsg ("Common Attributes:PingDownCount - " & ResSet.CommonProp.Attrib("PingDownCount").Value)
    ResSet.LogMsg ("Common Attributes:IsNotifyUp - " & ResSet.CommonProp.Attrib("IsNotifyUp").Value)
    ResSet.LogMsg ("Common Attributes:PingUpCount - " & ResSet.CommonProp.Attrib("PingUpCount").Value)

    ResSet.LogMsg ("Common Attributes:EmailToHostDown - " & ResSet.CommonProp.Attrib("EmailToHostDown").Value)
    ResSet.LogMsg ("Common Attributes:EmailSubjectHostDown - " & ResSet.CommonProp.Attrib("EmailSubjectHostDown").Value)
    ResSet.LogMsg ("Common Attributes:EmailToHostUp - " & ResSet.CommonProp.Attrib("EmailToHostUp").Value)
    ResSet.LogMsg ("Common Attributes:EmailSubjectHostUp - " & ResSet.CommonProp.Attrib("EmailSubjectHostUp").Value)
    ResSet.LogMsg ("Common Attributes:EmailFrom - " & ResSet.CommonProp.Attrib("EmailFrom").Value)
    ResSet.LogMsg ("Common Attributes:SMTPServer - " & ResSet.CommonProp.Attrib("SMTPServer").Value)
    ResSet.LogMsg ("Common Attributes:AddHostListToSubject - " & ResSet.CommonProp.Attrib("AddHostListToSubject").Value)

    strWhere = ""

    For i=0 To ResCount - 1
        ICMPDeviceName = ResSet.Resource(i).Name
        If strWhere = "" Then
            strWhere = "Address='" & ICMPDeviceName & "'"
        Else
            strWhere=strWhere + " Or Address='" & ICMPDeviceName & "'"
        End If
    Next
	
    ToS = GetToS(ResSet)
    If ToS = 0 Then
        strSelect="Select * from Win32_PingStatus Where ((" & strWhere & ") and Timeout=" & Timeout*2 & " and BufferSize=" & BufferSize & " and NoFragmentation=" & NoFragmentation & ")"
    Else
        strSelect="Select * from Win32_PingStatus Where ((" & strWhere & ") and Timeout=" & Timeout*2 & " and BufferSize=" & BufferSize & " and NoFragmentation=" & NoFragmentation & " And TypeofService=" & ToS & ")"	
    End If 
	
    AvailabilityThresholdTL = GetThresholdForTL (ResSet.CommonProp.Attrib("AvailabilityThresholdTL").Value)
    ResponseThresholdTL = GetThresholdForTL (ResSet.CommonProp.Attrib("ResponseThresholdTL").Value)
	
    If Not(IsArray(AvailabilityThresholdTL)) Or Not(IsArray(AvailabilityThresholdTL)) Then
        ResSet.ScriptError = -1
        ResSet.ScriptErrorInfo = "Пороговые значения в свойствах теста указаны не верно! Проверьте настройки и повторите запуск тестов."
        ResSet.LogMsg ("*** Start Description Error ***")
        ResSet.LogMsg ("Error number: " & Err.Number)
        ResSet.LogMsg ("Error Description: " & Err.Description)
        ResSet.LogMsg ("*** End Description Error ***")
        Exit Sub
    End If

    ResSet.LogMsg ("ExecQuery: " & strSelect)
    Err.Clear
    Set cPingResults = Nothing
    Set cPingResults = objWMI.ExecQuery(strSelect)
    ResSet.Sleep 1000
    ResSet.LogMsg ("ExecQuery::Error number: " & Err.Number)
    ResSet.LogMsg ("ExecQuery::Error Description: " & Err.Description)

    If cPingResults.Count <> ResCount Then
        ResSet.ScriptError = -1
        ResSet.ScriptErrorInfo = "Ошибка при запуске теста. Возможно Ваша настройка WMI не позволяет работать с приоретизированным трафиком ICMP"
        ResSet.LogMsg ("*** Start Description Error ***")
        ResSet.LogMsg ("cPingResults.Count = " & cPingResults.Count)
        ResSet.LogMsg ("ResCount = " & ResCount)
        ResSet.LogMsg ("*** End Description Error ***")
    End If

    For Each oPingResult In cPingResults
        If Err.Number <> 0 Then
            ResSet.ScriptError = -1
            ResSet.ScriptErrorInfo = "Ошибка при запуске теста. Подробности в файле: xfiles_log.txt"
            ResSet.LogMsg ("*** Start Description Error ***")
            ResSet.LogMsg ("Error number: " & Err.Number)
            ResSet.LogMsg ("Error Description: " & Err.Description)
            ResSet.LogMsg ("*** End Description Error ***")
            Exit Sub
        Else
            ' Availability
            If AddIPaddress Then
                SLAEventName = "Node Availability: " & LCase(oPingResult.Address) & " (" & oPingResult.ProtocolAddress & ") (%)"
                l_strTLName_ru = "Node Availability: " & LCase(oPingResult.Address) & " (" & oPingResult.ProtocolAddress & ") (%)"
                l_strTLName_en = "Node Availability: " & LCase(oPingResult.Address) & " (" & oPingResult.ProtocolAddress & ") (%)"
            Else
                SLAEventName = "Node Availability: " & LCase(oPingResult.Address) & " (%)"
                l_strTLName_ru = "Node Availability: " & LCase(oPingResult.Address) & " (%)"
                l_strTLName_en = "Node Availability: " & LCase(oPingResult.Address) & " (%)"
            End If
            SLAAliasName = "Availability_" & CStr(oPingResult.Address)
            Error = ResSet.EventAdd(SLAEventName, SLAAliasName, Unid)
   			
            ' Значение для определения когда необходимо отправлять сообщение для каждого хоста по его недоступности и доступности
            ' 0 - Ok, положительное число - число раз неответа хоста, отрицательное число - число раз ответа хоста
            ResSet.Events(SLAAliasName).Tag = "0"
            TLError = ResSet.AddTrafficLight(SLAAliasName, l_strTLName_ru, l_strTLName_en, "Average", "<", AvailabilityThresholdTL(0), AvailabilityThresholdTL(1), AvailabilityThresholdTL(2), AvailabilityThresholdTL(3))
            Unid = Unid + 1
   			
            ' Response Time
            If AddIPaddress Then
                SLAEventName = "Node Response Time: " & LCase(oPingResult.Address) & " (" & oPingResult.ProtocolAddress & ") (ms)"
                l_strTLName_ru = "Node Response Time: " & LCase(oPingResult.Address) & " (" & oPingResult.ProtocolAddress & ") (ms)"
                l_strTLName_en = "Node Response Time: " & LCase(oPingResult.Address) & " (" & oPingResult.ProtocolAddress & ") (ms)"
            Else
                SLAEventName = "Node Response Time: " & LCase(oPingResult.Address) & " (ms)"
                l_strTLName_ru = "Node Response Time: " & LCase(oPingResult.Address) & " (ms)"
                l_strTLName_en = "Node Response Time: " & LCase(oPingResult.Address) & " (ms)"
            End If
            SLAAliasName = "ResponseTime_" & CStr(oPingResult.Address)
            Error = ResSet.EventAdd(SLAEventName, SLAAliasName, Unid)
            TLError = ResSet.AddTrafficLight(SLAAliasName, l_strTLName_ru, l_strTLName_en, "Average", ">", ResponseThresholdTL(0), ResponseThresholdTL(1), ResponseThresholdTL(2), ResponseThresholdTL(3))
            Unid = Unid + 1
        End If
    Next
    ResSet.LogMsg("*** End Sub OnDiscovery ***")
End Sub

Sub OnDataReceived(ByRef ResSet)

    Dim ResCount, strWhere, strSelect, Timeout, BufferSize, NumberICMP, NoFragmentation, i, ICMPDeviceName, ToS
    Dim objWMI, MessageTxtHostUp, MessageTxtHostDown, cPingResults, oPingResult, ResponseTimeAliasName, AvailabilityAliasName
    Dim HostsDictionary, HostIndex, IsUnlimitedNumberICMP
    Dim SubjectTxtHostUp, SubjectTxtHostDown
	
    'On Error Resume Next
    'stop
    Err.Clear
	
    ResSet.LogMsg("*** Start Sub OnDataReceived ***")
	
    Set HostsDictionary = CreateObject("Scripting.Dictionary")
	
    ResCount=ResSet.Count

    strWhere = ""
    Timeout = ResSet.CommonProp.Attrib("Timeout").Value
    BufferSize = ResSet.CommonProp.Attrib("BufferSize").Value
    NumberICMP = ResSet.CommonProp.Attrib("NumberICMP").Value
    If NumberICMP = 0 Then
        NumberICMP = 1
        IsUnlimitedNumberICMP = True
    Else
        IsUnlimitedNumberICMP = False
    End If
    
    If CBool(ResSet.CommonProp.Attrib("NoFragmentation").Value) Then
        NoFragmentation = "True"
    Else
        NoFragmentation = "False"
    End If

    IsNotifyDown = CBool(ResSet.CommonProp.Attrib("IsNotifyDown").Value)
    IsNotifyUp = CBool(ResSet.CommonProp.Attrib("IsNotifyUp").Value)
    PingDownCount = CInt(ResSet.CommonProp.Attrib("PingDownCount").Value)
    PingUpCount = CInt(ResSet.CommonProp.Attrib("PingUpCount").Value) * (-1)
    g_AddHostListToSubject = CBool(ResSet.CommonProp.Attrib("AddHostListToSubject").Value)
    
    For i = 0 To ResCount - 1
        ICMPDeviceName = ResSet.Resource(i).Name
        HostsDictionary.Add ICMPDeviceName, i
        If strWhere = "" Then
            strWhere = "Address='" & ICMPDeviceName & "'"
        Else
            strWhere=strWhere + " Or Address='" & ICMPDeviceName & "'"
        End If
    Next

    ToS = GetToS(ResSet)
    If ToS = 0 Then
        strSelect="Select * from Win32_PingStatus Where ((" & strWhere & ") and Timeout=" & Timeout & " and BufferSize=" & BufferSize & " and NoFragmentation=" & NoFragmentation & ")"
    Else
        strSelect="Select * from Win32_PingStatus Where ((" & strWhere & ") and Timeout=" & Timeout & " and BufferSize=" & BufferSize & " and NoFragmentation=" & NoFragmentation & " And TypeofService=" & ToS & ")"	
    End If 
	
    Do While Not ResSet.StopTest
        If ResSet.IsNewSLaPeriod or IsUnlimitedNumberICMP Then
            Call SetBadValue (ResSet)
            Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}//./root/cimv2")
            MessageTxtHostUp = ""
            MessageTxtHostDown = ""
            SubjectTxtHostUp = ""
            SubjectTxtHostDown = ""
            
			
            For i = 1 To NumberICMP
                Set cPingResults = objWMI.ExecQuery(strSelect, "WQL", 32)
				
                'ResSet.LogMsg("End ExecQuery. Error Number: " & Err.Number & " Error Description: " & Err.Description)
                Err.Clear
				
                'ResSet.LogMsg("Run Get instance Ping Object")
                For Each oPingResult In cPingResults
                    If Err.Number <> 0 Then
                        ResSet.LogMsg("Get instance Ping Object Error number: " & Err.Number)
                        ResSet.LogMsg("Get instance Ping Object Error Description: " & Err.Description)
                        Err.Clear
                        Exit For
                    End If
					
                    ResponseTimeAliasName = "ResponseTime_" & CStr(oPingResult.Address)
                    AvailabilityAliasName = "Availability_" & CStr(oPingResult.Address)
                    HostIndex = HostsDictionary.Item(oPingResult.Address)
					
                    If oPingResult.StatusCode = 0 Then
                        ResSet.Events(AvailabilityAliasName).Value = 100
                        ResSet.Events(ResponseTimeAliasName).Value = oPingResult.ResponseTime
                        'ResSet.LogMsg("For Address: " & oPingResult.Address & "; StatusCode = 0" & "; ResponseTime = " & oPingResult.ResponseTime)
                        'ResSet.LogMsg("oPingResult.Path_.Path: " & oPingResult.Path_.Path)
                        Call SetAlarmStatusUP (ResSet, HostIndex, AvailabilityAliasName, MessageTxtHostUp, SubjectTxtHostUp)
                    Else
                        ResSet.Events(AvailabilityAliasName).Value = 0
                        ResSet.Events(ResponseTimeAliasName).Value = ResSet.BadValue
                        ResSet.LogMsg("For Address: " & oPingResult.Address & " StatusCode: " & oPingResult.StatusCode)
                        Call SetAlarmStatusDown (ResSet, HostIndex, AvailabilityAliasName, MessageTxtHostDown, SubjectTxtHostDown)
                    End If
                Next
                'ResSet.LogMsg("End Get instance Ping Object")
                'ResSet.LogMsg("Start Set 'ResSet.Events' And 'ResSet.SendSLaEvents'")
                ResSet.SendSLaEvents()
                If ResSet.StopTest Then Exit Do
            Next
			
            If Not (MessageTxtHostUp="") Then
                ResSet.LogMsg("OnDataReceived:: Call SendEmail. MessageTxt = '" & MessageTxtHostUp & "'")
                Call SendEmailHostUp (ResSet, MessageTxtHostUp, SubjectTxtHostUp)
            End If
            If Not (MessageTxtHostDown="") Then
                ResSet.LogMsg("OnDataReceived:: Call SendEmail. MessageTxt = '" & MessageTxtHostDown & "'")
                Call SendEmailHostDown (ResSet, MessageTxtHostDown, SubjectTxtHostDown)
            End If
        End If
        ResSet.Sleep 1000
    Loop
    ResSet.LogMsg("*** End Sub OnDataReceived ***")
End Sub

Sub SetBadValue (ByRef l_ResSet)
    'On Error Resume Next
    Dim i, l_BadValue

    l_BadValue = l_ResSet.BadValue
    For i=0 To l_ResSet.EventsCount - 1
        l_ResSet.Events(i).Value = l_BadValue
    Next
End Sub

Sub SendEmailHostUp (ByRef l_ResSet, ByVal l_MessageText, ByVal l_SubjectTxt)
    'Stop

    On Error Resume Next
    Err.Clear
	
    Dim iMsg, l_sSubject
    Set iMsg = CreateObject("CDO.Message")

    iMsg.From = l_ResSet.CommonProp.Attrib("EmailFrom").Value
    iMsg.To = l_ResSet.CommonProp.Attrib("EmailToHostUp").Value
    l_sSubject = l_ResSet.CommonProp.Attrib("EmailSubjectHostUp").Value
    If l_SubjectTxt <> "" Then
        l_sSubject = l_sSubject & ": " & l_SubjectTxt
    End If
    If Len(l_sSubject) > c_iMaxSubjectLen Then
        l_sSubject = Left(l_sSubject, c_iMaxSubjectLen - 3) & "..."
    End If

    iMsg.Subject = l_sSubject
    iMsg.TextBody = l_MessageText
    iMsg.BodyPart.Charset = "utf-8"

    iMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    iMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = l_ResSet.CommonProp.Attrib("SMTPServer").Value
    iMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    iMsg.Configuration.Fields.Update
    iMsg.Send
	
    If Err.Number <> 0 Then
        l_ResSet.LogMsg ("Error In SendEmailHostUp. Failed send e-mail HostUp.")
        l_ResSet.LogMsg ("Error Number = " & Err.Number)
        l_ResSet.LogMsg ("Error Description = " & Err.Description)
        l_ResSet.LogMsg ("Error Source = " & Err.Source)
    End If
End Sub

Sub SendEmailHostDown (ByRef l_ResSet, ByVal l_MessageText, ByVal l_SubjectTxt)
    'Stop

    On Error Resume Next
    Err.Clear

    Dim iMsg, l_sSubject
    Set iMsg = CreateObject("CDO.Message")

    iMsg.From = l_ResSet.CommonProp.Attrib("EmailFrom").Value
    iMsg.To = l_ResSet.CommonProp.Attrib("EmailToHostDown").Value
    l_sSubject = l_ResSet.CommonProp.Attrib("EmailSubjectHostDown").Value
    If l_SubjectTxt <> "" Then
        l_sSubject = l_sSubject & ": " & l_SubjectTxt
    End If
    If Len(l_sSubject) > c_iMaxSubjectLen Then
        l_sSubject = Left(l_sSubject, c_iMaxSubjectLen - 3) & "..."
    End If
    
    iMsg.Subject = l_sSubject
    iMsg.TextBody = l_MessageText  
    iMsg.BodyPart.Charset = "utf-8"

    iMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    iMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = l_ResSet.CommonProp.Attrib("SMTPServer").Value
    iMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    iMsg.Configuration.Fields.Update
    iMsg.Send

    If Err.Number <> 0 Then
        l_ResSet.LogMsg ("Error In SendEmailHostDown. Failed send e-mail HostDown.")
        l_ResSet.LogMsg ("Error Number = " & Err.Number)
        l_ResSet.LogMsg ("Error Description = " & Err.Description)
        l_ResSet.LogMsg ("Error Source = " & Err.Source)
    End If
End Sub

Function GetThresholdForTL(l_ThresholdString)
    Dim arrTL, i
    arrTL = Split(l_ThresholdString, ";")
    If UBound(arrTL) <> 3 Then 
        GetThresholdForTL = "Данные не верны, проверьте правильность введенных пороговых значений в настройках теста - 1"
        Exit Function
    End If
	
    For i = LBound(arrTL) To UBound(arrTL)
        If Not IsNumeric (Trim(arrTL(i))) Then
            GetThresholdForTL = "Данные не верны, проверьте правильность введенных пороговых значений в настройках теста - 2"
            Exit Function
        End If
    Next
	
    GetThresholdForTL = arrTL
End Function

Function GetToS (ByRef l_ResSet)
    Dim Minimize_Monetary_Cost, Maximize_Reliability, Maximize_Throughput, Minimize_Delay
    'On Error Resume Next
	
    GetToS = 0
    Minimize_Monetary_Cost = CInt(l_ResSet.CommonProp.Attrib("Minimize_Monetary_Cost").Value)
    l_ResSet.LogMsg ("GetToS:: Minimize_Monetary_Cost = " & Minimize_Monetary_Cost)
    Maximize_Reliability = CInt(l_ResSet.CommonProp.Attrib("Maximize_Reliability").Value)
    l_ResSet.LogMsg ("GetToS:: Maximize_Reliability = " & Maximize_Reliability)
    Maximize_Throughput = CInt(l_ResSet.CommonProp.Attrib("Maximize_Throughput").Value)
    l_ResSet.LogMsg ("GetToS:: Maximize_Throughput = " & Maximize_Throughput)
    Minimize_Delay = CInt(l_ResSet.CommonProp.Attrib("Minimize_Delay").Value)
    l_ResSet.LogMsg ("GetToS:: Minimize_Delay = " & Minimize_Delay)
    GetToS = Minimize_Monetary_Cost + Maximize_Reliability + Maximize_Throughput + Minimize_Delay
End Function

Sub SetAlarmStatusUP (ByRef l_ResSet, l_HostIndex, l_AvailabilityAliasName, ByRef l_MessageTxt, ByRef l_SubjectTxt)

    Dim CurrentTag, l_txt, l_DeviceDescription
	
    l_txt = "SetAlarmStatusUP:: START SUB"
    l_ResSet.LogMsg(l_txt)
    l_txt = "SetAlarmStatusUP:: l_AvailabilityAliasName = '" & l_AvailabilityAliasName & "' l_MessageTxt = '" & l_MessageTxt & "' PingDownCount = '" & PingDownCount & "' PingUpCount = '" & PingUpCount & "' l_HostIndex = '" & l_HostIndex & "'"
    l_ResSet.LogMsg(l_txt)
	
    CurrentTag = CInt(l_ResSet.Events(l_AvailabilityAliasName).Tag)
    l_txt = "SetAlarmStatusUP:: CurrentTag = '" & CurrentTag & "'"
    l_ResSet.LogMsg(l_txt)
	
    ' Все хорошо
    If CurrentTag = 0 Then
        l_txt = "SetAlarmStatusUP:: Exit Sub 1"
        l_ResSet.LogMsg(l_txt)
        Exit Sub
    End If
	
    ' Ранее была недоступность хоста, но менее чем PingDownCount раз. Зануляем счетчик, убираем дребезг
    If CurrentTag > 0 And CurrentTag < PingDownCount Then
        l_ResSet.Events(l_AvailabilityAliasName).Tag = 0
        l_txt = "SetAlarmStatusUP:: Exit Sub 2"
        l_ResSet.LogMsg(l_txt)
        Exit Sub
    End If
	
    ' Ранее была недоступность хоста, и было отправлено оповещение о его недоступности. Начинаем отсчет доступности хоста
    If CurrentTag => PingDownCount Then
        l_ResSet.Events(l_AvailabilityAliasName).Tag = -1
    End If
	
    ' Накапливаем доступность хоста для оповещения о его доступности
    If CurrentTag < 0 And CurrentTag > PingUpCount Then
        l_ResSet.Events(l_AvailabilityAliasName).Tag = CurrentTag - 1
    End If

    ' Проверяем, не пора ли отправлять оповещение
    If CInt(l_ResSet.Events(l_AvailabilityAliasName).Tag) = PingUpCount Then
        l_ResSet.Events(l_AvailabilityAliasName).Tag = 0
        If IsNotifyUp Then
            l_DeviceDescription = l_ResSet.Resource(l_HostIndex).Attrib("DeviceDescription").Value
            l_MessageTxt = l_MessageTxt & Now & " " & l_ResSet.Resource(l_HostIndex).Name
            If l_DeviceDescription <> "" Then
                l_MessageTxt = l_MessageTxt & " (" & l_DeviceDescription & ")"
            END If
            l_MessageTxt = l_MessageTxt & " - UP <br>" & vbNewLine
            If g_AddHostListToSubject = true Then    
                If l_SubjectTxt <> "" Then
                    l_SubjectTxt = l_SubjectTxt & ", "
                End If
                l_SubjectTxt = l_SubjectTxt & l_ResSet.Resource(l_HostIndex).Name
            End If
        End If
    End If
    l_txt = "SetAlarmStatusUP:: End Sub"
    l_ResSet.LogMsg(l_txt)
End Sub


Sub SetAlarmStatusDown (ByRef l_ResSet, l_HostIndex, l_AvailabilityAliasName, ByRef l_MessageTxt, ByRef l_SubjectTxt)
    Dim CurrentTag, l_txt, l_DeviceDescription
    'On Error Resume Next
	
    l_txt = "SetAlarmStatusDown:: START SUB"
    l_ResSet.LogMsg(l_txt)
    l_txt = "SetAlarmStatusDown:: l_AvailabilityAliasName = '" & l_AvailabilityAliasName & "' l_MessageTxt = '" & l_MessageTxt & "' PingDownCount = '" & PingDownCount & "' PingUpCount = '" & PingUpCount & "' l_HostIndex = '" & l_HostIndex & "'"
    l_ResSet.LogMsg(l_txt)

    CurrentTag = CInt(l_ResSet.Events(l_AvailabilityAliasName).Tag)
    l_txt = "SetAlarmStatusDown:: CurrentTag = '" & CurrentTag & "'"
    l_ResSet.LogMsg(l_txt)

    ' Ранее была недоступность хоста, и было отправлено оповещение о его недоступности. Ничего не делаем
    If CurrentTag => PingDownCount Then
        l_txt = "SetAlarmStatusDown:: Exit Sub 1"
        l_ResSet.LogMsg(l_txt)
        Exit Sub
    End If
	
    ' Хост начал отвечать, но не набрал нобходимо кол-ва доступности. Сбрасываем в PingDownCount
    If CurrentTag < 0 Then
        l_ResSet.Events(l_AvailabilityAliasName).Tag = PingDownCount
        l_txt = "SetAlarmStatusDown:: Exit Sub 2"
        l_ResSet.LogMsg(l_txt)
        Exit Sub
    End If

    ' Ранее была недоступность хоста, но менее чем PingDownCount раз. Увеличиваем счетчик недоступности
    If CurrentTag > 0 And CurrentTag < PingDownCount Then
        l_ResSet.Events(l_AvailabilityAliasName).Tag = CurrentTag + 1
    End If
	
    ' Было все хорошо, первая недоступность
    If CurrentTag = 0 Then
        l_ResSet.Events(l_AvailabilityAliasName).Tag = 1
    End If

    ' Проверяем, не пора ли отправлять оповещение
    If CInt(l_ResSet.Events(l_AvailabilityAliasName).Tag) => PingDownCount And IsNotifyDown Then
        l_DeviceDescription = l_ResSet.Resource(l_HostIndex).Attrib("DeviceDescription").Value
        l_MessageTxt = l_MessageTxt & Now & " " & l_ResSet.Resource(l_HostIndex).Name
        If l_DeviceDescription <> "" Then
            l_MessageTxt = l_MessageTxt & " (" & l_DeviceDescription & ")"
        End If
        l_MessageTxt = l_MessageTxt & " - DOWN <br>" & vbNewLine
        
        If g_AddHostListToSubject = true Then    
            If l_SubjectTxt <> "" Then
                l_SubjectTxt = l_SubjectTxt & ", "
            End If
            l_SubjectTxt = l_SubjectTxt & l_ResSet.Resource(l_HostIndex).Name
        End If
    End If
    l_txt = "SetAlarmStatusDown:: End Sub"
    l_ResSet.LogMsg(l_txt)

End Sub
-->
</Script>
    </xTest>
</document>
