1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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, 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()
|