2011/12/22

Pythonでお手軽なHDD死活監視プログラムを作ってみた

先日低速病で有名なWD20EARSが突然OSから見えなくなる・・・という記事を書きましたが、HDDが突然見えなくと困るのでスクリプトを使ってHDDの死活監視をしてみたいと思います。

最近触っていないPythonを使ってプログラムを組みます。

死活監視の仕様

  1. LLを使って簡単にHDDの死活監視をする
  2. 該当ドライブが存在しているか定期的にチェック
  3. 存在していない場合、メールでアラートを出す

Pythonの環境を作る

  1. Pythonをインストールする
    何はともあれ、Pythonがインストールされていないとお話になりませんのでインストールしましょう。
    バージョンが2.x系と3.x系がありますが、私は2.7.xを使っています。
    2.x系を使う理由は安定性と3.x系の動向がどうなるか分からなかったから。

  2. pywin32をインストールする
    win32apiをコールすることができるpywin32をインストールしましょう。

プログラムを組んでみる

メール送信はウノウラボさんのPythonでメールを送信したい人のためのサンプル集の記事を参考にしました。

#coding:shift-jis
 
#
# HDD死活監視プログラム
# version - 1.0.0
#
 
#base module
import os, sys, datetime
import datetime
 
#pywin32 module
import win32api
 
#config-file parser module
import ConfigParser
 
#gmail
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate
 
def create_message(from_addr, to_addr, subject, body, encoding):
    msg = MIMEText(body, 'plain', encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    return msg
 
 
def send_via_gmail(from_addr, to_addr, msg):
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login('Gメールのアドレス', 'パスワード')
    s.sendmail(from_addr, [to_addr], msg.as_string())
    s.close()
 
def logging(msg):
    now = datetime.datetime.now()
    log_msg = str(now) + '\t' + (msg) + '\n'
    LOG_FILE = os.path.join(os.path.dirname(__file__), 'log.txt')
 
    write_file(LOG_FILE, log_msg)
 
def write_file(file_path, msg):
    file = open(file_path, 'a')
    file.write(msg)
    file.flush()
    file.close()
 
if __name__ == '__main__':
 
    hdd_path = '監視するドライブ文字(例c:)'
    
    #ドライブチェック-pywin32使用-
    try:
        chkhdd = win32api.GetDiskFreeSpaceEx(hdd_path)
        log_msg = 'Active'
        
    except:
        print('no hdd')
        print('alert email sending...')
        
        #Gメール送信
        from_addr = '送信元メールアドレス'
        to_addr = '宛先メールアドレス'
        to_subj = u'HDDが見えなくなりました'
        to_body = u'サーバのHDDが見えなくなりました。\n確認してください!'
        msg = create_message(from_addr, to_addr, to_subj, to_body, 'ISO-2022-JP')
        send_via_gmail(from_addr, to_addr, msg)
        
        log_msg = 'Error! No HDD'
    
    logging(log_msg)
    
    quit()

タスクスケジューラで定期的にチェック


後はタスクスケジューラを使って定期的にプログラムを実行します。


私は15分に1回実行するようにしました。




プログラムは10分程度で作れましたが、正直こんなプログラム組まずに、HDDがずっと見える状態であればいいんですけどね・・・

それにしても、Pythonは手軽&高機能ですな~!


スポンサーリンク

スポンサーリンク