]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/env python | |
2 | import os | |
3 | import sys | |
4 | import getopt | |
5 | import signal | |
6 | from subprocess import Popen, PIPE | |
7 | ||
8 | STATE_OK = 0 | |
9 | STATE_WARNING = 1 | |
10 | STATE_CRITICAL = 2 | |
11 | STATE_UNKNOWN = 3 | |
12 | ||
13 | keys = sys.argv[1].split(",") | |
14 | ||
15 | def to_args(k): | |
16 | access, secret = k.split(":", 1) | |
17 | return [ | |
18 | "s3cmd", | |
19 | '-c=/dev/null', | |
20 | '--no-check-certificate', | |
21 | '--access_key={}'.format(access), | |
22 | '--secret_key={}'.format(secret), | |
23 | '--host=e.eriomem.net', | |
24 | '--host-bucket=%(bucket)s.e.eriomem.net', | |
25 | 'du' | |
26 | ] | |
27 | ||
28 | ARGS1= to_args(keys[0]) | |
29 | ARGS2= to_args(keys[1]) | |
30 | ||
31 | max_size = 1024*1024*1024*1024 | |
32 | warning_percent = 99.75 | |
33 | critical_percent = 99.95 | |
34 | ||
35 | def output(code, msg): | |
36 | print(msg) | |
37 | sys.exit(code) | |
38 | ||
39 | def main(): | |
40 | def handler(signum, frame): | |
41 | raise IOError | |
42 | signal.signal(signal.SIGALRM, handler) | |
43 | signal.alarm(60) | |
44 | ||
45 | try: | |
46 | ps = [Popen(to_args(a), stdout=PIPE, stderr=PIPE) for a in keys] | |
47 | outs = [p.communicate() for p in ps] | |
48 | rets = [p.wait() for p in ps] | |
49 | except IOError: | |
50 | for p in ps: | |
51 | os.kill(p.pid, signal.SIGTERM) | |
52 | output(STATE_UNKNOWN, | |
53 | "eriomem UNKNOWN - Command timeout after 60 seconds!") | |
54 | ||
55 | signal.alarm(0) | |
56 | ||
57 | if sum(rets) == 0: | |
58 | usages = [int(out[0].decode().split("\n")[-2].split()[0]) for out in outs] | |
59 | usage = sum(usages) | |
60 | use_percent = 100 * usage / max_size | |
61 | if use_percent > critical_percent: | |
62 | output(STATE_CRITICAL, | |
63 | "eriomem CRITICAL - bucket usage: %s (%s%%);| size=%s;;;;" % | |
64 | (sizeof_fmt(usage), use_percent, usage)) | |
65 | elif use_percent > warning_percent: | |
66 | output(STATE_WARNING, | |
67 | "eriomem WARNING - bucket usage: %s (%s%%);| size=%s;;;;" % | |
68 | (sizeof_fmt(usage), use_percent, usage)) | |
69 | else: | |
70 | output(STATE_OK, | |
71 | "eriomem OK - bucket usage: %s (%d%%);| size=%s;;;;" % | |
72 | (sizeof_fmt(usage), use_percent, usage)) | |
73 | else: | |
74 | messages = "\n".join([out[0].decode() + out[1].decode() for out in outs]) | |
75 | output(STATE_UNKNOWN, | |
76 | "eriomem Unknown - Error in command\n" + messages) | |
77 | ||
78 | def sizeof_fmt(num): | |
79 | for unit in ['','ko','Mo','Go','To','Po','Eo','Zo']: | |
80 | if abs(num) < 1024.0: | |
81 | return "%3.1f%s" % (num, unit) | |
82 | num /= 1024.0 | |
83 | return "%.1f%s%s" % (num, 'Yo') | |
84 | ||
85 | if __name__ == '__main__': | |
86 | main() |