pingツール

pingオブジェクト

javascriptpingできることがわかったのでオブジェクトにまとめてみることにしました.Pingerオブジェクトです.

var Pinger = function(){};
Pinger.ipid = {};
Pinger.wmi = GetObject("winmgmts:\\\\.\\root\\CIMV2");

Pinger.prototype.start = function(ip) {
  this.ping(ip, 0);
  var tspan =  $("select[@name='tspan']").val();
  var that = this;
  Pinger.ipid[ip] = setInterval(function(){that.ping(ip, 0)}, tspan);
}

ipidとwmiはクラスアトリビュートで,startはインスタンスメソッドになります.汎用的に作るんだったら,jqueryの記法が出て来ないように作るべきだけど,ささっとつくったのでそこは目をつぶってください.startすると,tspan間隔でpingを実行します.timer idをipアドレスをキートしたハッシュ(ipid)に登録しています.

pingインスタンスメソッドです.ここで実際にパケットの送受信を行います.

Pinger.prototype.ping = function(ip, count) {
  var cols = Pinger.wmi.ExecQuery(
    "Select * from Win32_PingStatus Where Address = '" + ip + "'"
  );
  var items = new Enumerator(cols);
  var item = items.item();
  var date = new Date;
  var str = '<div class="log"><span class="date">' +
    date.toDateString() + ' ' + date.toLocaleTimeString() +
    '</span><span class="msg">' + ip;
  
  if (item.StatusCode == 0) {
    str += " is alive</span></div>";
  } else {
    str += " not respond</span></div>";
  } 
  $("#log").prepend(str);
  if (item.StatusCode != 0) {
    var retryt =  $("select[@name='retryt']").val();
    var retryts = $("select[@name='retryts']").val();
    if ( count <= retryts){
      var that = this;
      setTimeout(function(){that.ping(ip, ++count)}, retryt);
    }else{
      send_mail(ip);
    }
  }
}

実行結果を"$("#log").prepend(str);"という形で画面に表示します.retryt間隔でretryts回数pingを実行して全部失敗したらメールを飛ばします.メールの飛ばし方はまたいずれ.http://yamashita.dyndns.org/blog/358が参考になります.

stopallはクラスメソッドです.ipidに登録されたtimer idをクリアしてpingを停止させます.

Pinger.stopall = function() {
  $.each(Pinger.ipid, function(i){
    clearInterval(this);
  });
}