+#!/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'
+ ]
+
+ARGS1= to_args(keys[0])
+ARGS2= to_args(keys[1])
+
+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()