7月の出張から帰ってみると、自宅サーバのHDD残量が0になって数日分の記録データが消失した模様。出張前にそれなりの容量を空けておいたはずなのですが、予定外に不要なものが記録されていたようで。
毎年このようなことが起きるので残量を監視してメールで報告してくれるプログラムでも探そうかなと思ったのですが、内容が簡単なので作ることに。ついでに仕事でPythonを覚えることになったので、IronPython で作ってみようかと。
- 残量以外にHDDの健全性チェック機能も付けたので、実行には要管理者権限。
- 調べたいのはデータドライブだけなので、100GB以上のドライブ限定(STORAGE_MIN_TOTAL_SIZE)。
- ドライブの使用量が90%を超えた場合にメール (STORAGE_MAX_FREE_RATIO)
- スクリプト内にメールサーバのパスワードが平文であるのがセキュリティ的に難ありですが、それはおいおい修正ということで(と言って、やらないんだろうな>自分)
MAIL_FROM = "from@example.net" MAIL_TO = "to@example.net" SMTP_SERVER = "mail.example.net" SMTP_PORT = 587 SMTP_USER = "smtpuser" SMTP_PASSWORD = "smtppassword" STORAGE_MIN_TOTAL_SIZE = 100e+9 STORAGE_MAX_FREE_RATIO = 0.9 import clr clr.AddReferenceByPartialName("System.Management") clr.AddReferenceByPartialName("System.Net") from System.Management import ManagementScope,ObjectQuery,ManagementObjectSearcher,ManagementObjectCollection from System.IO import DriveInfo,DriveType from System import String from System.Net import NetworkCredential from System.Net.Mail import SmtpClient,MailMessage message = "" # Check HDD health scope = ManagementScope("¥¥¥¥.¥¥ROOT¥¥WMI") query = ObjectQuery("SELECT * FROM MSStorageDriver_FailurePredictStatus WHERE PredictFailure=True") searcher = ManagementObjectSearcher(scope, query) mgrCollection = searcher.Get() for aMgr in mgrCollection: message = message + aMgr["InstanceName"] + " is predicted to be failure.¥n" # Check drive free space drives = DriveInfo.GetDrives() for aDrive in drives: if aDrive.DriveType == DriveType.Fixed and ¥ aDrive.TotalSize > STORAGE_MIN_TOTAL_SIZE and ¥ float(aDrive.TotalFreeSpace)/aDrive.TotalSize>STORAGE_MAX_FREE_RATIO: message = message + String.Format("{0} has {1:0.0}GB free.¥n", aDrive.Name, aDrive.TotalFreeSpace/1e+9) try: if message <> "": mailMsg = MailMessage(MAIL_FROM, MAIL_TO) mailMsg.Subject = "Storage alert" mailMsg.Body = message smtpClient = SmtpClient(SMTP_SERVER, SMTP_PORT) smtpClient.Credentials = NetworkCredential(SMTP_USER, SMTP_PASSWORD) smtpClient.Send(mailMsg) except Exception as ex: print ex.clsException[参照]
Comments