選択定年生活記

32年間勤めた会社を選択定年で退職
2年間の沈黙を破り場違いの仕事を開始
これって選択定年生活?

FreeNasのスクラブをコントロールする

2016-12-19 | 選択定年生活
FreeNasは、定期的にスクラブを実行する機能を備えている。
24時間稼働させる場合は、それでよいけれど、必要な時に電源をオン・オフする環境の場合は、都合が悪い。
メインマシンから定期的にスクラブを実行させる方が、都合がよい。
メインマシンのタスクに、スクリプトを登録し、それを定期的に実行させる。

スクラブの実行は、FreeNas側で「onoffcheck3」のスクリプトでタイミングを監視させている。
メインマシン側は、FreeNasを立ち上げ、cifsの共有フォルダに「scrubstart.ini」と「scrubing.ini」のファイルを保存するだけで良い。

月1回、朝7時から開始したら、おおよそ12時ごろには終了する。(環境によって違う)

タスクスケジューラに「scrubstart.vbs」を登録する。
スクリプトの中で「scrubstartmsg.vbs」を実行して、「スクラブ中」のメッセージを表示する。
スクリプトの中で「scrubend.vbs」を実行して、スクラブが終了しFreeNasの電源が切れるか、5時間ほど経過したときに、「スクラブ中」のメッセージを消す。




===== scrubstart.vbs =================================================================================

Option Explicit


Dim WshShell
Dim strProcessName
Dim objWMIService
Dim colProcesses
Dim objProcess
Dim strComputer
Dim iBTN
Dim strWolFrn
Dim objFS
Dim objNewFile
'
Const strMyServer1 = "FreeNAS"
Const MyServerIP1 = "http://192.168.10.35"
Const strShutdownini1 = "\\frnsmb1\shutdown\shutdown.ini"
Const strScrubingini1 = "\\frnsmb1\shutdown\scrubing.ini"
Const strScrubstartini1 = "\\frnsmb1\shutdown\scrubstart.ini"
'
Const strMyServer2 = "FreeNAS2"
Const MyServerIP2 = "http://192.168.0.73"
Const strShutdownini2 = "\\Freenas2\shutdown\shutdown.ini"
Const strScrubingini2 = "\\Freenas2\shutdown\scrubing.ini"
Const strScrubstartini2 = "\\Freenas2\shutdown\scrubstart.ini"

'
Const MyMagicSendPgm ="""D:\MyProgram Files\wol193\wol.exe"" /open=""D:\MyProgram Files\wol193\wol.ini"" /wake=1 "
Const strMsgCmd = "D:\MyWscript\SCRUB_STARTMSG.vbs"
Const strMsgClose = "D:\MyWscript\SCRUB_END.vbs"

'
Set WshShell = WScript.CreateObject("WScript.Shell")
'作業開始のメッセージを表示
WshShell.RUN strMsgCmd

'スクラブ開始の指令
Call FreenasPowerOn( strMyServer1 , MyServerIP1 , strShutdownini1 , strScrubingini1 , strScrubstartini1)
Call FreenasPowerOn( strMyServer2 , MyServerIP2 , strShutdownini2 , strScrubingini2 , strScrubstartini2)

'作業開始のメッセージを閉じるスクリプトを開始
WshShell.RUN strMsgClose

'終了処理

Set WshShell = Nothing


'----------------------------------------------------------------------------------------
Sub FreenasPowerOn( strMyServer , MyServerIP , strShutdownini , strScrubingini , strScrubstartini)
'FreeNasの起動
If checkPing(strMyServer) = True Then
'
iBtn = WshShell.Popup (strMyServer & "起動済",2,,vbOkOnly)
Else
iBtn = WshShell.Popup (strMyServer & "起動中",2,,vbOkOnly)
If WolFreeNas(strMyServer) = True Then
'
Else
iBtn = WshShell.Popup (strMyServer & "起動失敗",20,,vbOkOnly)
Call MsgOnOff(strMsgCmd,"OFF")
Set WshShell = Nothing
Exit Sub
End If
End If

'shutdown.ini ファイルを削除する
On Error Resume Next
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
If Err.Number = 0 Then
objFS.DeleteFile strShutdownini, True
End If
Set objFS = Nothing
On Error Goto 0

'制御ファイル生成開始処理
'On Error Resume Next
Set objFS = CreateObject("Scripting.FileSystemObject")
'scrubing.ini ファイルを保存する
Set objNewFile = objFS.CreateTextFile(strScrubingini)
objNewFile.WriteLine "Scrubing Information -- Date: " & Now()
objNewFile.Close
'scrubstart.ini ファイルを保存する
Set objNewFile = objFS.CreateTextFile(strScrubstartini)
objNewFile.WriteLine "Scrubing Information -- Date: " & Now()
objNewFile.Close
'制御ファイル生成終了処理
Set objNewFile = Nothing
Set objFS = Nothing
'On Error Goto 0


End Sub
'---------------------------------------------------------------------------------------------


'ピングを発信する関数
Function checkPing(MyServer)

Dim objWMIService ' Windows Managements
Dim PingSet ' Win32_PingStatusクラス
Dim Ping ' 対象Ping
Dim MyIPAdress


MyIPAdress = "Select * From Win32_PingStatus Where Address = '" & MyServer & "'"


Set objWMIService = GetObject("winmgmts:\\.")
Set PingSet = objWMIService.ExecQuery ( MyIPAdress )

For Each Ping In PingSet

Select Case Ping.StatusCode

Case 0
checkPing = True
Case 11010
checkPing = False
End Select
Next

Set PingSet = Nothing
Set objWMIService = Nothing

End Function
'-------------------------------------------------------------------------------------------------------


Function WolFreeNas(MyServer)
'WScript.Shellオブジェクトを格納する変数を宣言
Dim WshShell
'WshScriptExecオブジェクトを格納する変数を宣言
Dim objExec
Dim objIE
'変数を宣言
Dim intX
Dim iBtn
Dim intKaiji
'Magic Packetを送って起動する。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objExec = WshShell.Exec(MyMagicSendPgm & MyServer)
iBtn = WshShell.Popup ("FreenasにMagicPacketを送りました。",2,,vbOkOnly)
'Ping を送って起動したかを5分間チェックする
For intX = 1 To 40
If checkPing(MyServer) = True Then
intKaiji = intX - 1
Exit For
End If
'10秒間停止する
WScript.Sleep 10000
Next
'結果を表示
If checkPing(MyServer) = True Then

WolFreeNas = True
Else
WolFreeNas = False
End If

'終了

Set objExec = Nothing
Set WshShell = Nothing
End Function


==========================================================================================================================

===== scrub_startmsg.vbs =================================================================================================

Option Explicit

Dim intRTN

intRTN = MsgBox("FREENAS/FREENAS2のスクラブを開始します。7:00 ~ 12:00の間、サーバーが起動します。",vbSystemModal,"Scrub Start")

==========================================================================================================================

===== scrub_startmsg.vbs =================================================================================================

Option Explicit


Dim strProcessName
Dim objNewFile
Dim objWMIService
Dim colProcesses
Dim objProcess
Dim strComputer
Dim intX
Dim intY
'
Const strMyServer1 = "FreeNAS"
Const MyServerIP1 = "http://192.168.10.35"
Const strMyServer2 = "FreeNAS2"
Const MyServerIP2 = "http://192.168.0.73"
Const strMsgCmd = "D:\MyWscript\SCRUB_STARTMSG.vbs"


'終了処理
Wscript.Sleep 100
'FreeNasの起動をチェック

'1分ごとに300回で5時間チェック
For intY = 1 to 300
intX=99
If checkPing(strMyServer1) = True Then
intx=0
End If
If checkPing(strMyServer2) = True Then
intx=0
End If
If intX=99 Then
Call MsgOff
Exit For
End If
Wscript.Sleep 60000
Next

'-------------------------------------------------------
'開始メッセージを閉じる
Sub MsgOff
strProcessName = "wscript.exe"
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name=""" & strProcessName & """")
For Each objProcess in colProcesses
If objProcess.Name = strProcessName Then
If Instr( objProcess.CommandLine, strMsgCmd ) > 0 Then
'wscript.exe を終了する
objProcess.Terminate
Else
'なにもしない

End If
End If
Next

Set colProcesses = Nothing
Set objWMIService = Nothing
End Sub

'-------------------------------------------------------
'ピングを発信する関数
Function checkPing(MyServer)

Dim objWMIService ' Windows Managements
Dim PingSet ' Win32_PingStatusクラス
Dim Ping ' 対象Ping
Dim MyIPAdress


MyIPAdress = "Select * From Win32_PingStatus Where Address = '" & MyServer & "'"


Set objWMIService = GetObject("winmgmts:\\.")
Set PingSet = objWMIService.ExecQuery ( MyIPAdress )

For Each Ping In PingSet

Select Case Ping.StatusCode

Case 0
checkPing = True
Case 11010
checkPing = False
End Select
Next

Set PingSet = Nothing
Set objWMIService = Nothing

End Function

==========================================================================================================================