share facebook facebook2 twitter menu hatena pocket slack

2016.06.06 MON

pythonのwrapper書きました

WRITTEN BY三浦 剛慈

linuxのコマンドや実行形式ファイルなどをpythonでwrappingするスクリプト書きました。

以下のソースコードは、pythonでwrappingして元の出力文字列をマッチングさせて出力を書き換える処理内容になります。

  • 変数”wrap_command”にwrappingしたいコマンドなどのフルパス

  • 変数”pattern”にマッチングする文字列

  • 変数”repmsg”に置換させたい文字列

を適宜入れ替えて使えます。

今回のものは、nagios pluginのcheck_httpがチェックURLのサーバとのsocket通信時にタイムアウトしたときの'CRITICAL - Socket timeout after 10 seconds'がnagiosエージェント・サーバー間の通信タイムアウト時のメッセージと似ていてまぎらわしいので、それを'failed to connect target URL!'に変える為に書きました。
check_http.cのソースコードで直接メッセージを書き換えてリコンパイルしようとしたら、どうもシステムコールが出力しているメッセージで書き換えられなかったので、今回pyhonでwrappingし出力メッセージを置換させるようにしました。

ソースコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def printrepmsg(list):
        for line in list[:-1]:
            matchOB = re.match(pattern , line)
            if matchOB:
                sys.stdout.write(timeoutmsg + 'n')
            else:
                sys.stdout.write(line + 'n')

if __name__ == '__main__':
    import subprocess
    import sys
    import re

    pattern=r'CRITICAL - Socket timeout after 10 seconds'
    timeoutmsg='failed to connect target URL!'
    wrap_command='/usr/lib64/nagios/plugins/check_http'

    args = sys.argv
    args[0] = wrap_command
    p = subprocess.Popen(args,
                         stdin=subprocess.PIPE,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         shell=False)
    stdout, stderr = p.communicate()

    if stdout:
    printrepmsg(stdout.split('n'))
    if stderr:
    printrepmsg(stderr.split('n'))

    ret = p.wait ()
    exit (ret)

元記事はこちら

pythonのwrapper書きました