Skip to content

Instantly share code, notes, and snippets.

@takuya
Created December 13, 2013 12:26
Show Gist options
  • Save takuya/7943531 to your computer and use it in GitHub Desktop.
Save takuya/7943531 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
# coding : utf-8
require 'stringio'
require 'mail'
class ThinWire
attr_accessor :last_hash,:target_dir,:report
def initialize(target="/etc")
@target_dir = target
@target_dir = @target_dir+"/" unless @target_dir =~ /\\$/
@last_hash = {}
@report = Proc.new{|msg| puts msg}
end
def start
self.thread.join();
end
def make_hash_list
str = `find '#{self.target_dir}' -type f -exec md5sum {} \\; 2>/dev/null `
hash = Hash[*str.split]
hash.invert
end
def thread
Thread.new{
current = self.make_hash_list
last_hash = current
loop{
sleep 1;
current = self.make_hash_list
# puts (current.keys - last_hash.keys ).inspect
#puts current["a"]
alert(current.clone,last_hash.clone) unless current == last_hash
last_hash = current
#puts :wake
}
}
end
def alert(new_hash, old_hash)
Thread.new{
##新規追加されたファイル => new で増えたkey がある。
add_files = Hash[*(new_hash.keys - old_hash.keys).map{|e| [e,new_hash[e]]}.flatten]
##削除されたファイル => new でなくなった key
del_files = Hash[*(old_hash.keys - new_hash.keys).map{|e| [e,old_hash[e]]}.flatten]
##編集されたファイル => hash が違う
mod_files = old_hash.select{|e| old_hash[e] != new_hash[e] }
call_report( add_files,del_files,mod_files )
}
end
def call_report( add_files,del_files,mod_files )
message = StringIO.new
message.puts "ファイルの改変がありました。\n"
message.puts "-"*10
message.puts "\n"
unless add_files.empty? then
message.puts "\n"
message.puts "「追加」されました。\n"
message.puts add_files.map{|k,v|"#{v} => #{k}"}.join("\n")
message.puts "\n"
message.puts "-"*10
message.puts "\n"
end
unless del_files.empty? then
message.puts "\n"
message.puts "「削除」されました。\n"
message.puts del_files.map{|k,v|"#{v} => #{k}"}.join("\n")
message.puts "\n"
message.puts "-"*10
message.puts "\n"
end
unless mod_files.empty? then
message.puts "\n"
message.puts "「更新」されました。\n"
message.puts mod_files.map{|k,v|"#{v} => #{k}"}.join("\n")
message.puts "\n"
message.puts "-"*10
message.puts "\n"
end
message.rewind
self.report.call(message.read)
end
end
tw = ThinWire.new
tw.report = Proc.new{|msg|
require 'mail'
options = { :address => "smtp.gmail.com",
:port => 587,
:user_name => '[email protected]'
:password => '***',
:authentication => 'plain',
:enable_starttls_auto => true }
Mail.defaults do
delivery_method :smtp, options
end
mail = Mail.new do
from '[email protected]'
to '[email protected]'
subject "ThinWireレポート"
body msg
end
mail.deliver!
puts :end
}
tw.start()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment