読者です 読者をやめる 読者になる 読者になる

harry’s memorandum

おれおれメモ

RubyでIP Messanger

ruby

IP Messanger のv2.07がリリースされました。なんと6年振の更新だそうです。バルーンで通知してくれたり、ちょっぴりカッコよくなっています。
http://www.forest.impress.co.jp/docs/news/20100421_362762.html

  • Vista/Win7環境の menu 位置修正
  • UTF-8ログ保存オプションの追加
  • Balloon通知機能の追加
  • XP Visual Style (Manifest)の適用

f:id:dharry:20100421221439j:image

IP Messanger で監視のアラートも悪くないなぁ、と思ったので、ちょっと遊んでみました。

#!/usr/bin/ruby

require "socket"
require "kconv"
require 'ping'

def ping(host,cnt=1)
  Ping.pingecho(host, cnt) ? [true, host] : [false, host]
end

class IPMessanger
  def initialize(user)
    @port, @version, @command = 2425, 1, 32
    @sock = UDPsocket.new
    @user = user
    @num = $$ || 0
  end
  def sendmsg(host, msg)
    @num += 1
    str = sprintf("%d:%d:%s:%s:%d:%s", @version, @num, @user, host, @command, msg.tosjis)
    @sock.send(str, 0, host, @port)
  end
end

# ipmessanger
msg_server = "192.168.1.3"
ip = IPMessanger.new("alert")

interval = 300
hosts = [
  "192.168.1.3",
  "192.168.1.101",
  "192.168.1.102",
  "192.168.1.103",
  "192.168.1.104",
]

loop {
  threads = []
  hosts.each {|host|
    threads << Thread.new { ping(host) }
  }
  threads.each {|t|
    r = t.join.value
    ip.sendmsg(msg_server, "host down! - #{r[1]}") unless r[0]
  }
  sleep interval
}