#!/usr/bin/env python import os import sys import getopt import signal from subprocess import Popen, PIPE STATE_OK = 0 STATE_WARNING = 1 STATE_CRITICAL = 2 STATE_UNKNOWN = 3 keys = sys.argv[1].split(",") def to_args(k): access, secret = k.split(":", 1) return [ "s3cmd", '-c=/dev/null', '--no-check-certificate', '--access_key={}'.format(access), '--secret_key={}'.format(secret), '--host=e.eriomem.net', '--host-bucket=%(bucket)s.e.eriomem.net', 'du' ] max_size = 1024*1024*1024*1024 warning_percent = 99.75 critical_percent = 99.95 def output(code, msg): print(msg) sys.exit(code) def main(): def handler(signum, frame): raise IOError signal.signal(signal.SIGALRM, handler) signal.alarm(60) try: ps = [Popen(to_args(a), stdout=PIPE, stderr=PIPE) for a in keys] outs = [p.communicate() for p in ps] rets = [p.wait() for p in ps] except IOError: for p in ps: os.kill(p.pid, signal.SIGTERM) output(STATE_UNKNOWN, "eriomem UNKNOWN - Command timeout after 60 seconds!") signal.alarm(0) if sum(rets) == 0: usages = [int(out[0].decode().split("\n")[-2].split()[0]) for out in outs] usage = sum(usages) use_percent = 100 * usage / max_size if use_percent > critical_percent: output(STATE_CRITICAL, "eriomem CRITICAL - bucket usage: %s (%s%%);| size=%s;;;;" % (sizeof_fmt(usage), use_percent, usage)) elif use_percent > warning_percent: output(STATE_WARNING, "eriomem WARNING - bucket usage: %s (%s%%);| size=%s;;;;" % (sizeof_fmt(usage), use_percent, usage)) else: output(STATE_OK, "eriomem OK - bucket usage: %s (%d%%);| size=%s;;;;" % (sizeof_fmt(usage), use_percent, usage)) else: messages = "\n".join([out[0].decode() + out[1].decode() for out in outs]) output(STATE_UNKNOWN, "eriomem Unknown - Error in command\n" + messages) def sizeof_fmt(num): for unit in ['','ko','Mo','Go','To','Po','Eo','Zo']: if abs(num) < 1024.0: return "%3.1f%s" % (num, unit) num /= 1024.0 return "%.1f%s%s" % (num, 'Yo') if __name__ == '__main__': main()