<?xml version="1.0" encoding="windows-1251"?>
<document type="SelFTrendxTest" version="0.0" xmlns:m="xTest">
     <xTest type="USER_SCRIPT" 
            alias="FDS" 
            TitleRus="Тест контроля утилизации дискового пространства" 
            TitleRootRus="Тесты соблюдения политик управления ресурсами MS Windows" 
            TitleEng="Disk Size Policy Violation" 
            TitleRootEng="MS Windows Resource Management Policy Tests" 
            TrafficLightsName="Disk Size Policy Violation"
            Version="3.1">
	<Files>
		<File type="conf" name="VB.WP.FreeDiskSpace.XFiles.xml"/>
		<File type="help" name="VB.WP.FreeDiskSpace.XFiles.chm::/VB.WP.FreeDiskSpace.XFiles.html"/>
		<File type="dll" name="ST_SCTest.dll"/>
	</Files>
  <Keywords>
   <Keyword>Windows</Keyword>   
   <Keyword>WMI</Keyword>
   <Keyword>HDD</Keyword>    
  </Keywords>

       <!--     $Id: VB.WP.FreeDiskSpace.XFiles.xml,v 1.4 2010/05/04 14:47:57 bag Exp $
                $Id: VB.WP.FreeDiskSpace.XFiles.xml,v 1.4 2010/05/04 14:47:57 bag Exp $
-->
	<xTestProps>
        <log_level_def>1</log_level_def>
        <truncate_log>1</truncate_log>
        <AverInervDuration>60</AverInervDuration>
	    <discovery_func>OnDiscovery</discovery_func>
	    <work_func>OnDataReceived</work_func>
	</xTestProps>

    <parameters TitleRus="Список контролируемых ресурсов:" TitleEng="Servers List:">
        <resources>
           <resource_id TitleRus="Имя Windows компьютера" TitleEng="Windows Computer Name"></resource_id>
        </resources>
		<common_attribs TitleRus="Список параметров (общие):" TitleEng="Parameters List (common):" SubTitleRus="Параметр" SubTitleEng="Parameter">            
			<Attrib Type="String" TitleRus="Пороговые значения метрики 'Свободно на диске (%)' (через ;)" TitleEng="Thresholds 'Free Disk Space On Drive (%)' (; separated)" Alias="FreeDiskSpacePercentThresholdTL">"0,01;3;5;7"</Attrib>
		</common_attribs>
        <resource_attribs TitleRus="Список параметров:" TitleEng="Parameters List:" SubTitleRus="Параметр" SubTitleEng="Parameter" >
          <Attrib Type="Enum" TitleRus="Тип аутентификации" TitleEng="Type of authentication" Alias="Auth">
            <Attrib_enum TitleRus="Использовать встроенную систему безопасности Windows NT" TitleEng="Use Windows NT Integrated security" Selected="Yes">"1"</Attrib_enum>
            <Attrib_enum TitleRus="Использовать заданные имя пользователя и пароль" TitleEng="Use a specific user name and password" Selected="No">"2"</Attrib_enum>
          </Attrib>
          <Attrib Type="String" TitleRus="Имя пользователя" TitleEng="Username" Alias="User">user</Attrib>
          <Attrib Type="SecureString" TitleRus="Пароль" TitleEng="Password" Alias="Pass">pass</Attrib>
          <!-- Type: "String", "Bool", "Integer", "Double" -->
        </resource_attribs>
    </parameters>
    <popupdisplay>
    	<!-- Function: "EventCount", "Average", "Maximum", "Minimum" -->
	    <description ru="Тест контроля утилизации дискового пространства" en="Disk Size Policy Violation"></description>
    </popupdisplay>


<Script language="VBScript">
<!--
Option Explicit

Sub OnDiscovery(ByRef ResSet)

    'stop
    On Error Resume Next
    Err.Clear

    Dim ResCount, Unid, i, DiskMon, CompName, constr, objWMIService, colLogicalDisk, objProces
    Dim SLAEventName, SLAAliasName, Error, FreeDiskSpacePercentThresholdTL, TLError
    Dim SLAEventName_ru, SLAEventName_en
    Dim Auth, User, Pass, objSWbemLocator
  
    ResSet.LogMsg ("*** Start Sub OnDiscovery ***")
    ResSet.SendProgressMessage("Start Script")
    ResCount=ResSet.Count
    Unid = ResSet.UnidBase

    For i=0 To ResCount - 1
        DiskMon = 0
        CompName=ResSet.Resource(i).Name
        ResSet.SendProgressMessage("Check: " & CompName & ". Just a second, please")
        Auth = ResSet.Resource(i).Attrib("Auth").Value
        User = ResSet.Resource(i).Attrib("User").Value
        Pass = ResSet.Resource(i).Attrib("Pass").Value

        If auth = "1" Then
            constr="WinMgmts:\\" & CompName & "\root\CIMV2"
            ResSet.LogMsg ("Full WMI connect string:" & constr)
            Set objWMIService = GetObject(constr)
        Else
            Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
            Set objWMIService = objSWbemLocator.ConnectServer(CompName, "\root\CIMV2", User, Pass)
            objWMIService.Security_.ImpersonationLevel = 3
        End If

        If Err.Number <> 0 Then
            ResSet.ScriptError = -1
            ResSet.ScriptErrorInfo = "Ошибка при запуске теста. Нет возможности работать с устройством: '" & CompName & "'. " & Err.Description
            ResSet.LogMsg ("*** Start Description Error ***")
            ResSet.LogMsg ("Computer name: " & CompName)
            ResSet.LogMsg ("Error number: " & Err.Number)
            ResSet.LogMsg ("Error Description: " & Err.Description)
            ResSet.LogMsg ("*** End Description Error ***")
            Exit Sub
        End If

        Set colLogicalDisk = objWMIService.ExecQuery ("Select DeviceID, Size, FreeSpace, VolumeName from Win32_LogicalDisk where DriveType=3")
	
        If Err.Number <> 0 Then
            ResSet.ScriptError = -1
            ResSet.ScriptErrorInfo = "Ошибка при запуске теста. Нет возможности работать с устройством: '" & CompName & "'. " & Err.Description
            ResSet.LogMsg ("*** Start Description Error ***")
            ResSet.LogMsg ("Computer name: " & CompName)
            ResSet.LogMsg ("Error number: " & Err.Number)
            ResSet.LogMsg ("Error Description: " & Err.Description)
            ResSet.LogMsg ("*** End Description Error ***")
            Exit Sub
        End If
        
        For Each objProces In colLogicalDisk
            If Err.Number <> 0 Then
                ResSet.ScriptError = -1
                ResSet.ScriptErrorInfo = "Ошибка при запуске теста. Нет возможности работать с устройством: '" & CompName & "'. " & Err.Description
                ResSet.LogMsg ("*** Start Description Error ***")
                ResSet.LogMsg ("Computer name: " & CompName)
                ResSet.LogMsg ("Error number: " & Err.Number)
                ResSet.LogMsg ("Error Description: " & Err.Description)
                ResSet.LogMsg ("*** End Description Error ***")
                Exit Sub
            Else
                DiskMon = DiskMon + 1
                ResSet.LogMsg ("Start Add SLA metrics. Computer name: " & CompName & ". DeviceID: " & objProces.DeviceID & ". VolumeName: " & objProces.VolumeName)
					
                'LOCALHOST Free Disk Space On drive 'H:[system disk] (%) '
                SLAEventName = UCase(CompName) & " Free Disk Space On Drive " & objProces.DeviceID & " [" & objProces.VolumeName & "] (%)"
                SLAAliasName = CompName & objProces.DeviceID & "_freespacepercent"
                Error = ResSet.EventAdd(SLAEventName, SLAAliasName, Unid)
                Unid = Unid + 1
	
                SLAEventName_ru = UCase(CompName) & " Свободно на диске '" & objProces.DeviceID & " [" & objProces.VolumeName & "]' (%)"
                SLAEventName_en = UCase(CompName) & " Free Disk Space On Drive '" & objProces.DeviceID & " [" & objProces.VolumeName & "]' (%)"   					
                FreeDiskSpacePercentThresholdTL = GetThresholdForTL (ResSet.CommonProp.Attrib("FreeDiskSpacePercentThresholdTL").Value)
                TLError = ResSet.AddTrafficLight(SLAAliasName, SLAEventName_ru, SLAEventName_en, "Maximum", "<", FreeDiskSpacePercentThresholdTL(0), FreeDiskSpacePercentThresholdTL(1), FreeDiskSpacePercentThresholdTL(2), FreeDiskSpacePercentThresholdTL(3))
   					
                SLAEventName = UCase(CompName) & " Free Disk Space On Drive " & objProces.DeviceID & " [" & objProces.VolumeName & "] (byte)"
                SLAAliasName = CompName & objProces.DeviceID & "_freespacebyte"
                Error = ResSet.EventAdd(SLAEventName, SLAAliasName, Unid)
                Unid = Unid + 1
            End If
        Next
			
        If DiskMon > 0 Then
            SLAEventName = UCase(CompName) & " Data Access Error"
            SLAAliasName = CompName & "_error"
            Error = ResSet.EventAdd(SLAEventName, SLAAliasName, Unid)
            SLAEventName_ru = UCase(CompName) & " Ошибка при получении данных"
            SLAEventName_en = UCase(CompName) & " Data Access Error"
            TLError = ResSet.AddTrafficLight(SLAAliasName, SLAEventName_ru, SLAEventName_en, "Maximum", ">", 0, 0, 0, 0)
            Unid = Unid + 1
        Else
            ResSet.ScriptError = -1
            ResSet.ScriptErrorInfo = "Ошибка при запуске теста. На устройстве: '" & CompName & "' отсутствуют объекты мониторинга."
            Exit Sub
        End If
    Next
    ResSet.LogMsg ("*** End Sub OnDiscovery ***")
End Sub


Sub OnDataReceived(ByRef ResSet)

    On Error Resume Next
    Err.Clear

    'stop

    Dim arrWMIConnectString(), ResCount, i, CompName, constr, strSelect
    Dim Data_Access_Error, objWMIService, colLogicalDisk, objLogicalDisk, FreeSpacePercent, SLAAliasName, FreeSpaceByte
    Dim Auth, User, Pass, objSWbemLocator

    ResCount=ResSet.Count
    ReDim arrWMIConnectString (ResCount-1)
	
    For i=0 To ResCount - 1
        CompName=ResSet.Resource(i).Name
        constr="WinMgmts:\\" & CompName & "\root\CIMV2"
        arrWMIConnectString(i) = constr
    Next

    strSelect="Select DeviceID, Size, FreeSpace from Win32_LogicalDisk where DriveType=3"

    Do While Not ResSet.StopTest
        If ResSet.IsNewSLaPeriod Then
            Data_Access_Error = 0
            Call SetBadValue (ResSet)
			
            For i=0 To ResCount - 1
                Err.Clear
                CompName=ResSet.Resource(i).Name
                
                Auth = ResSet.Resource(i).Attrib("Auth").Value
                User = ResSet.Resource(i).Attrib("User").Value
                Pass = ResSet.Resource(i).Attrib("Pass").Value
                
                If auth = "1" Then
                    Set objWMIService = GetObject(arrWMIConnectString(i))
                Else
                    Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
                    Set objWMIService = objSWbemLocator.ConnectServer(CompName, "\root\CIMV2", User, Pass)
                    objWMIService.Security_.ImpersonationLevel = 3
                End If
				
                Set colLogicalDisk = objWMIService.ExecQuery (strSelect)
	
                If Err.Number = 0 Then
                    ' Нет ошибок при доступе к данным
                    ResSet.Events(CompName & "_error").Value = 0
                    For Each objLogicalDisk In colLogicalDisk
                        If Err.Number = 0 Then
                            FreeSpacePercent = Round((objLogicalDisk.FreeSpace / objLogicalDisk.Size) * 100, 2)
                            SLAAliasName = CompName & objLogicalDisk.DeviceID & "_freespacepercent"
                            ResSet.Events(SLAAliasName).Value = FreeSpacePercent
							
                            FreeSpaceByte = objLogicalDisk.FreeSpace
                            SLAAliasName = CompName & objLogicalDisk.DeviceID & "_freespacebyte"
                            ResSet.Events(SLAAliasName).Value = FreeSpaceByte
                        Else
                            Data_Access_Error = Data_Access_Error + 1
                            ResSet.Events(CompName & "_error").Value = ResSet.Events(CompName & "_error").Value + 1
                            Err.Clear
                        End If
                    Next
                Else
                    Data_Access_Error = Data_Access_Error + 1
                    ResSet.Events(CompName & "_error").Value = 1
                    Err.Clear
                End If
            Next
            ResSet.SendSLaEvents()
        Else
            ResSet.Sleep 2000 ' 2 sec
            If ResSet.StopTest Then Exit Sub
        End If
    Loop
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

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

-->
</Script>
    </xTest>
</document>
