選択定年生活記

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

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






FreeNasで電源のオン・オフをコントロールする

2016-12-19 | 選択定年生活
NASは本来、24時間稼働させるものとは言うものの、電気代が惜しいので、電源のオン・オフはやっぱりコントロールしたいもの。

電源をオンにするのは、メインマシンからWOLさせてやれば良い。

電源をオフにするには、NAS側でクロンジョブを実行して終了条件をチェックすればよい。
メインマシンにPINGを送って、メインマシンが停止していたらNASも停止する。
CIFSの共有フォルダに「shutdown.ini 」というファイル名のファイルがあればNASを停止する。
(メインマシンが稼働していても、NASを終了させたい場合)
ただ、スクラブ中に終了しては困るので、スクラブの実行もクロンジョブで行い、スクラブが終了するまでNASを停止させない。
CIFSの共有フォルダに「scubstart.ini」というファイル名のファイルがあればスクラブを開始する。
CIFSの共有フォルダに「scrubing.ini」というファイル名のファイルがあればスクラブの状態を監視する。
スクラブが終わるまでは電源をオフにしない。

環境依存の設定データは変数に格納して指定している。
メインマシンのIPアドレス
CIFS共有フォルダの場所 /mnt/zsf2/shutdown/
スクラブするzpoolのデータセット名 zsf1、zsf2

-- ファイル名: onoffcheck3---------------------------------------------------------

#!/bin/bash

chkping() {
echo -e "\nPing Check" >> $flnout
ping -c 1 $1 > null
if [ $? = 0 ];
then
x=0
echo -e "\n $1 Active" >> $flnout
else
echo -e "\n $1 Negative" >> $flnout
fi;
}

chkini() {

if [ -e $fln ];
then
echo -e "\n $fln Exist" >> $flnout
x=$y
else
echo -e "\n $fln Not Exist" >> $flnout
fi;
}

chksub() {
chkping $pcip1
#
echo -e "\nStatus Check" >> $flnout
y=99
fln=${cifsdir}shutdown.ini
chkini
#
y=20
fln=${cifsdir}scrubing.ini
chkini
#
y=10
fln=${cifsdir}scrubstart.ini
chkini
}
chkscrubstart() {
zpool scrub $1
echo -e "\n scrub $1 start" >> $flnout
}

scrubstart() {
chkscrubstart $zpoolrs1
chkscrubstart $zpoolrs2
rm -f ${cifsdir}scrubstart.ini
}
chkchkscrub() {
zpool status -v $1 | grep -qsE "scan: scrub in progress"
if [ $? -eq 0 ];
then
z=20
echo -e "\n scrub $1 Ongoing Process" >> $flnout
else
echo -e "\n scrub $1 Terminate the Processing" >> $flnout
fi;
}
chkscrub() {
z=0
chkchkscrub $zpoolrs1
chkchkscrub $zpoolrs2
if [ $z = 0 ];
then
echo -e "\n scrub finished" >> $flnout
rm -f ${cifsdir}scrubing.ini
else
echo -e "\n scrub not finished" >> $flnout
fi;
}
#
####################
# main #
####################
# Environment dependent Constant
pcip1='192.168.0.***'
cifsdir='/mnt/zsf2/shutdown/'
flnout=${cifsdir}onoffcheck3.log
zpoolrs1='zsf1'
zpoolrs2='zsf2'
#
x=99
echo -e "OnOffCheck3" > $flnout
date >> $flnout
chksub
echo -e "\n1st Check" >> $flnout
if [ $x = 99 ];
then
echo -e "\n Continue to 2ndCheck" >> $flnout
else
echo -e "\n Continue to Run" >> $flnout

#
if [ $x = 10 ];
then
scrubstart
exit 0
fi;
#
if [ $x = 20 ];
then
chkscrub
exit 0
fi;
#
exit 0
fi;
############
# 2ndcheck #
############
sleep 600
chksub
echo -e "\n2nd Check" >> $flnout
if [ $x = 0 ];
then
echo -e "\n Continue to Run" >> $flnout
exit 0
else
echo -e "\n Finish Off" >> $flnout
rm -f ${cifsdir}shutdown.ini
shutdown -p now
fi;


------------------------------------------------------------------------------------


スクリプトを Cron Jobs に登録する。