]> git.immae.eu Git - perso/Immae/Config/Nix.git/blobdiff - flakes/private/monitoring/plugins/check_eriomem
Squash changes containing private information
[perso/Immae/Config/Nix.git] / flakes / private / monitoring / plugins / check_eriomem
diff --git a/flakes/private/monitoring/plugins/check_eriomem b/flakes/private/monitoring/plugins/check_eriomem
new file mode 100755 (executable)
index 0000000..880b88a
--- /dev/null
@@ -0,0 +1,83 @@
+#!/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, sizeof_fmt(usage)))
+        elif use_percent > warning_percent:
+            output(STATE_WARNING,
+                    "Eriomem WARNING - bucket usage: %s (%s%%);| size=%s;;;;" %
+                    (sizeof_fmt(usage), use_percent, sizeof_fmt(usage)))
+        else:
+            output(STATE_OK,
+                    "Eriomem OK - bucket usage: %s (%d%%);| size=%s;;;;" %
+                    (sizeof_fmt(usage), use_percent, sizeof_fmt(usage)))
+    else:
+        messages = "\n".join([out[0].decode() + out[1].decode() for out in outs])
+        output(STATE_UNKNOWN,
+                "Eriomem UNKNOWN - Error in command")
+
+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()