特定ディレクトリに特定の名称のフォルダを作成したらメール飛ばして検知するRubyコード
約半日で適当に書いたのでうp。異常系はなんも考慮してないけどとりあえず動く。
前提はRuby1.8.7
起動時に勝手にデーモンとして仕込む話題はまた別途投稿かなー。
#!/usr/bin/env ruby
################################################################################
# 名前:WatchFolder.rb
# 目的:特定の名称のディレクトリ作成を監視する。
# 機能:第一引数に指定したディレクトリ配下に特定の文字列でディレクトリを作成した時、
# 特定のメールアドレスに検知メールを送信する。
# 第一引数:監視したいディレクトリの絶対パス。
# 作成日:2013/05/13
# 作成者:澤津健吾
# 特記事項:監視対象は0-9の文字列で始まるディレクトリ。
# 例:130331_aikatsuとか100531_sawatsu_kimoiとか。
# 上記以外のフォルダを作成しても何もしない。
# 引数チェックは行わない。仕込んだ後の動作チェック忘れないでね。
# まともなエラー処理は期待するな。
# 本プログラムの動作にはfssmとtmailをインストールする必要がある。
# デーモンとしてしれっと常駐させるのを想定してるよ。
################################################################################
require 'rubygems'
require 'fssm'
require 'tmail'
require 'socket'
require 'net/smtp'
#FSSMモニターで無限ループするよ。
#監視対象のパスは第一引数に指定したやつね。
#監視対象のディレクトリ名については特記事項参照
FSSM.monitor(ARGV[0].to_s, '**/[0-9]*', :directories => true) do
update do|base, file|
#ファイル更新の出口なんて興味ないよ。
end
create do|base, file|
#ファイル作成の出口は興味あるよ
#出来たファイルの詳細情報取るべかな。
stat = File.stat("#{base}" + "/" + "#{file}")
#FSSM側で判定してるけど、なんとなくもっかいチェックしとく。
#ファイルがディレクトリかな?
if(stat.directory?)
#対象はディレクトリだな。
watchdirname = "#{base}" + "/" + "#{file}"
#Mail送る準備すっかー。
#まずはホスト名をそれっぽく取得、Macの場合は***.localとかやな。
hostname = Socket::gethostname
mail = TMail::Mail.new
#複数送信する場合は,区切りで文字列送り込めばよかったらしい。
#設定ファイル読み込みとかはめんどくさいしなー。
#宛先は随時必要に応じて変えたりしてください。
mail.to = 'hoge@hoge.co.jp,hoge@hoge.co.jp'
#送信元メールアドレス設定
mail.from = "#{hostname}@hoge.co.jp"
#サブジェクト作成
mail.subject = "#{hostname} Project folder create detected."
#送信時刻設定
mail.date = Time.now
#MIMEversion設定
mail.mime_version = '1.0'
#本文設定する。フォルダ作成時刻は厳密にはstatから拾うのがいいんだろうけど
#Windowsとか、異機種から適当に作られたりとかLTFSとか、アテにならない奴もいるので
#プログラム実行時の時刻で代用。精度が大事なワケじゃないからいいでしょ?
mail.body = "project Folder create detected.\n" +
"created Folder path = #{watchdirname}\n" +
"created Time = " + Time.now.to_s + "\n"
mail.set_content_type 'text', 'plain', {'charset'=>'iso-2022-jp'}
#メール送信サーバ設定はそれっぽく必要に応じて変えたりしてください
Net::SMTP.start('38.38.38.38',25) do |smtp|
smtp.sendmail( mail.encoded, mail.from, mail.to)
end
else
#対象がファイルなんで興味ないよ
end
end
delete do|base, file|
#ファイル削除の出口なんて興味ないよ
end
end