vbsに慣れるため作成したスクリプト。
HDL4-Gにはsmart.cgiというS.M.A.R.Tをチェックできる機能があるのだが
いちいち手動でチェックするのも面倒なので作成。
最低限のエラーチェックは行っているつもり。
ホスト名(またはIPアドレス)を引数に実行。
スクリプト名(拡張子除く).ホスト名(またはIPアドレス).iniファイルを
スクリプトと同じディレクトリに作成する。
スクリプト名は変更可能。
チェック項目は01、05、07、C4、C5、C6、C7、C8。
LandiskCheck.vbs
'******************************************************************************
'*** smart.cgiを取得し前回取得時のデータと比較。悪化時メッセージ出力 ***
'*** 引数:ホスト名またはIPアドレス ***
'*** 使用ファイル:スクリプト名.ホスト名.ini 初回起動時自動作成 ***
'******************************************************************************
Option Explicit
Dim StsTbl(4,8,2) 'i:DiskNo. j:S.M.A.R.T値 k:before/after
Dim iniPath
Dim HostName
Dim DiskNo
DiskNo = Array("SATA1","SATA2","SATA3","SATA4")
Dim StsNo
StsNo = Array("01 Raw Read Error ", _
"05 Reallocated Sector ", _
"07 Seek Error ", _
"C4 Reallocated Event ", _
"C5 Pending Sector ", _
"C6 Uncorrectable Sector", _
"C7 UDMA CRC Error ", _
"C8 Multi Zone Error ")
Dim Args
Set Args = WScript.Arguments
If Args.Count <= 0 Then
WScript.Echo "ホストが指定されていません"
WScript.Quit
End If
HostName = Args(0)
iniPath = GetiniPath(HostName)
Call iniToTbl(iniPath,StsTbl)
Call CGIToTbl(HostName,StsTbl)
Call TblToini(iniPath,StsTbl,DiskNo,StsNo)
Call TblCheck(StsTbl,DiskNo,StsNo)
'WScript.Echo "END"
'******************************************************************************
'*** ホスト名からiniファイルフルパスを生成する ***
'******************************************************************************
Function GetiniPath(HostName)
Dim FsoObj
Set FsoObj = CreateObject("Scripting.FileSystemObject")
Set GetiniPath = FsoObj.GetFile(WScript.ScriptFullName)
Dim RegObj
set RegObj = New RegExp
RegObj.Pattern = "\.vbs$"
RegObj.IgnoreCase = True '大文字/小文字を同一視
GetiniPath = RegObj.Replace(GetiniPath,"." & HostName & ".ini")
Set FsoObj = Nothing
set RegObj = Nothing
End Function
'******************************************************************************
'*** iniファイルからテーブルを作成する ***
'******************************************************************************
Function iniToTbl(iniPath,StsTbl)
Dim FsoObj
Set FsoObj = CreateObject("Scripting.FileSystemObject")
If FsoObj.FileExists(iniPath) = False Then
Call TblInit(StsTbl)
Set FsoObj = Nothing
Exit Function
End If
Set FsoObj = Nothing
Dim iLine
Dim i
Dim j
Dim StmObj
Set StmObj = CreateObject("ADODB.Stream")
StmObj.Type = 2 'テキストモード
StmObj.Charset = "shift_jis"
StmObj.Open
StmObj.loadFromFile iniPath
Dim RegOut
Dim RegObj
set RegObj = New RegExp
RegObj.Pattern = "\d{5}$"
For i = 0 To 3
For j = 0 To 7
iLine = StmObj.ReadText(-2)
set RegOut = RegObj.Execute(iLine)
StsTbl(i,j,0) = RegOut(0)
StsTbl(i,j,1) = "00000"
Next
Next
StmObj.Close()
Set StmObj = Nothing
set RegObj = Nothing
End Function
'******************************************************************************
'*** iniファイルがない場合に初期値でテーブルを作成する ***
'******************************************************************************
Function TblInit(StsTbl)
Dim i
Dim j
Dim k
For i = 0 To 3
For j = 0 To 7
For k = 0 To 1
StsTbl(i,j,k) = "00000"
Next
Next
Next
End Function
'******************************************************************************
'*** cgiデータを取得しテーブルに展開 ***
'******************************************************************************
Function CGIToTbl(HostName,StsTbl)
Dim HttpObj
Dim StmObj
Dim URL
URL = "http://" & HostName & "/gate/smart.cgi"
Set HttpObj = CreateObject("MSXML2.XMLHTTP")
HttpObj.Open "GET",URL,False
On Error Resume Next
HttpObj.Send
On Error GoTo 0
If (HttpObj.Status < 200 Or HttpObj.Status >= 300) Then
WScript.Echo "URL取得失敗。LANDISK起動を確認してください。" & vbLf & "処理を中断します。"
set HttpObj = Nothing
WScript.Quit
End If
'ストリームに取込
Set StmObj = CreateObject("ADODB.Stream")
StmObj.Type = 1 'バイナリモード
StmObj.Open
StmObj.Write HttpObj.responseBody 'バイナリデータ書込
Set HttpObj = Nothing
StmObj.Position = 0 '先頭に位置付け
StmObj.Type = 2 'テキストモード
StmObj.Charset = "ascii"
StmObj.LineSeparator = 10 'LF
'テーブルに取込
Dim i
Dim j
Dim iLine
Dim StsNoW
StsNoW = Array(" 1", _
" 5", _
" 7", _
"196", _
"197", _
"198", _
"199", _
"200") 'landisk S.M.A.R.T値テーブル
Dim RegObj
set RegObj = New RegExp
Dim RegOut 'RegExpマッチングコレクション
i = 0
Do Until StmObj.EOS
'最初にDiskNoを決定する
Do Until StmObj.EOS 'オーバーラン防止にEOSチェック
iLine = StmObj.readText(-2)
RegObj.Pattern = "^=== sata" 'DiskNoチェック
if RegObj.Test(iLine) Then
For i = i to 3
RegObj.Pattern = "^=== sata" & i+1
if RegObj.Test(iLine) Then Exit For
Next
Exit Do
End If
Loop
'Statusに一致する行を探す
j = 0
Do Until j = 7 OR StmObj.EOS 'オーバーラン防止にEOSチェック
iLine = StmObj.readText(-2)
For j = j to 7 'StatusNoチェック
RegObj.Pattern = "^" & StsNoW(j)
if RegObj.Test(iLine) Then Exit For '該当したら抜ける
Next
if j > 7 Then
j = 0 '該当せずは再検索に備え添字リセット
Else
RegObj.Pattern = "\d+$"
set RegOut = RegObj.Execute(iLine)
If RegOut(0) > 99999 then '5桁overは99999決め打ち
StsTbl(i,j,1) = "99999"
else
StsTbl(i,j,1) = "00000" & RegOut(0) '前zero付与フォーマット
RegObj.Pattern = "\d{5}$"
set RegOut = RegObj.Execute(StsTbl(i,j,1))
StsTbl(i,j,1) = RegOut(0)
End If
End If
Loop
if i = 3 And j = 7 Then
Exit Do '全項目セットできたら以降はスルー
End If
Loop
'後処理
set RegObj = Nothing
StmObj.Close()
Set StmObj = Nothing
End Function
'******************************************************************************
'*** テーブルをiniファイルに書出 ***
'******************************************************************************
Function TblToini(iniPath,StsTbl,DiskNo,StsNo)
Dim i
Dim j
Dim k
Dim oLine
Dim StmObj
Set StmObj = CreateObject("ADODB.Stream")
StmObj.Type = 2 'テキストモード
StmObj.Charset = "shift_jis"
StmObj.Open
For i = 0 To 3
For j = 0 To 7
oLine = DiskNo(i) & "," _
& StsNo(j) & "," _
& StsTbl(i,j,0) & "," _
& StsTbl(i,j,1)
StmObj.WriteText oLine,1
Next
Next
StmObj.SaveToFile iniPath,2
StmObj.Close()
Set StmObj = Nothing
End Function
'******************************************************************************
'*** テーブルのS.M.A.R.T値をチェックし悪化時メッセージ出力 ***
'******************************************************************************
Function TblCheck(StsTbl,DiskNo,StsNo)
Dim i
Dim j
Dim ErrMsg
Dim WSHObj
For i = 0 To 3
For j = 0 To 7
If StsTbl(i,j,1) > StsTbl(i,j,0) Then
ErrMsg = ErrMsg _
& DiskNo(i) _
& " " & StsNo(j) _
& " " & StsTbl(i,j,0) _
& " -> " & StsTbl(i,j,1) _
& vbLf
End If
Next
Next
If ErrMsg <> "" Then
Set WSHobj = WScript.CreateObject("WScript.Shell")
ErrMsg = "cscript ""C:\Program Files\PPX\script\WSHPopUP.vbs""" _
& " """ & ErrMsg & """" _
& " 0" _
& " " & WScript.ScriptName _
& " " & vbOKOnly
WSHObj.Run ErrMsg,0,False '終了待機しない
Set WSHobj = Nothing
End If
End Function
C:\Program Files\PPX\script\WSHPopUP.vbs
Option Explicit
Dim Arg
Dim WSHObj
Set WSHobj = WScript.CreateObject("WScript.Shell")
Set Arg = WScript.Arguments
WSHObj.Popup Arg(0),Arg(1),Arg(2),Arg(3)
Set WSHobj = Nothing