PythonでOSのPingコマンドを叩いて死活監視する

[`evernote` not found]
Bookmark this on Hatena Bookmark
Share on Facebook
LINEで送る

ここを参考にしたのだが,うまく動かなかった→[Python] Pingコマンド実行 : Edo::World::Blog
上のサイトのスクリプトでは,pingコマンド自体のエラーを見ているため,存在しないFQDNなどを指定した場合にはpingがIPアドレスを引けないことからエラーを返す.
つまりDNSが設定されていないホスト名の検出になっている.
一方で,pingコマンドを使用する通常のケースでは,たとえばあるセグメント配下の全IPアドレスにpingを飛ばすなどの作業を行なう.
この場合,例えばDestination Host Unreachableを返す場合であっても,pingコマンド自体は正常に完了するため,コマンドのエラーではDestination Host Unreachableを検出できない.
ということで,ちょっとだけ手を入れて検出できるようにした.

#!/usr/bin/python
# vim: fileencoding=utf-8

import subprocess

class Ping(object):
    def __init__(self, hosts):
        loss_pat='0 received'
        msg_pat='icmp_seq=1 '
        for host in hosts:
            ping = subprocess.Popen(
                ["ping", "-c", "1", host],
                stdout = subprocess.PIPE,
                stderr = subprocess.PIPE
            )
            out, error = ping.communicate()
            msg = ''
            for line in out.splitlines():
                if line.find(msg_pat)>-1:
                    msg = line.split(msg_pat)[1] # エラーメッセージの抽出
                if line.find(loss_pat)>-1: # パケット未到着ログの抽出
                    flag=False
                    break
            else:
                flag=True # breakしなかった場合 = パケットは到着している
            if flag:
                print('[OK]: ' + 'ServerName->' + host)
            else:
                print('[NG]: ' + 'ServerName->' + host + ', Msg->\'' + msg + '\'')


if __name__ == '__main__':
    hosts=map(lambda x:'xxx.xxx.xxx.'+str(x),range(1,255))
    Ping(hosts)