aboutsummaryrefslogblamecommitdiff
path: root/modules/private/monitoring/plugins/check_eriomem
blob: 880b88a0bd85fcbcfa131bc502559c7fd1f63701 (plain) (tree)


























                                                     





















                                                                        
                                                                      








                                                                                  

                                                                                

                                           

                                                                               

                            

                                                                          


                                                                                 
                                                     









                                                        
#!/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()