%PDF- %PDF-
Direktori : /lib64/nagios/plugins/nccustom/ |
Current File : //lib64/nagios/plugins/nccustom/check_cpu_temperature.py |
#!/usr/libexec/platform-python # -*- coding: utf-8 -*- import re import json import argparse from subprocess import Popen, PIPE class CpuTemperature(object): def __init__(self): self.info = None self.model = None self.vendor = None self.revision = None self.temperature = dict() def get_vendor(self): cmd = '/usr/bin/env lscpu' _raw = self.execute(cmd) for line in _raw.split("\n"): if 'Model name:' in line: self.info = line if 'intel' in line.lower(): self.vendor = 'Intel' elif "AMD" in line.upper(): self.vendor = 'AMD' else: raise RuntimeError("CPU's vendor hasn't defined.") def get_details(self): if self.vendor == 'Intel': info = self.info.split("@")[0].split() self.revision = info[-1] self.model = info[-2] else: infosplitted = self.info.split() if "EPYC" in self.info.upper(): self.model = "EPYC_" + str(infosplitted[infosplitted.index('EPYC') + 1]) elif "ROME" in self.info.upper(): self.model = "ROME_" + str(infosplitted[infosplitted.index('ROME') + 1]) else: self.model = "_".join(infosplitted[-2:]) def get_temperature(self, data): if self.vendor == 'Intel': re_intel = re.compile(r"(Physical|Package)\s+id\s+(\d+):\s*([+-]?\d*\.?\d*)", re.I) matches = re_intel.finditer(data) for find in matches: proc_num = find.group(2) proc_temp = find.group(3) self.temperature[proc_num] = float(proc_temp) else: proc_num = 0 re_amd = re.compile(r"k10temp-pci.*\n(temp|Tctl)\d*:\s*([+-]?\d*\.?\d*)", re.I) matches = re_amd.finditer(data) for find in matches: proc_temp = find.group(2) self.temperature[proc_num] = float(proc_temp) proc_num += 1 def sensors(self): cmd = '/usr/bin/env sensors -A' return self.execute(cmd) @staticmethod def execute(cmd): process = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True) stdout, error = process.communicate() if error: raise RuntimeError(error.decode("utf-8")) return stdout.decode("utf-8") def load_config(cfg): with open(cfg) as f: try: return json.loads(f.read()) except json.JSONDecodeError as err: print("Error decoding JSON in the configuration file: {}".format(err)) raise SystemExit(2) except Exception as err: print(err) raise SystemExit(2) if __name__ == '__main__': parser = argparse.ArgumentParser(description="CPU Temperature Check") parser.add_argument("-c", "--config", required=True, help="Path to the configuration file") parser.add_argument("-v", "--verbose", action="store_true", help="More verbose output") args = parser.parse_args() try: config = load_config(args.config) except IOError as err: print("Error loading the configuration file: {}".format(err)) raise SystemExit(2) cpu = CpuTemperature() try: cpu.get_vendor() except RuntimeError as err: print(err) raise SystemExit(2) if args.verbose: print("CPU Vendor: {}".format(cpu.vendor)) cpu.get_details() if args.verbose: print("CPU Model: {}".format(cpu.model)) try: raw = cpu.sensors() except RuntimeError as err: print(err) raise SystemExit(2) if args.verbose: print("-=-=-=-=-=-=-=-=-=-=-=-=-") print("Sensors Raw Output:\n") print(raw) print("-=-=-=-=-=-=-=-=-=-=-=-=-") cpu.get_temperature(raw) crit = [] warn = [] ok = [] try: if cpu.vendor == 'Intel': max_temp = float(config.get(cpu.vendor, {}).get(cpu.revision, {}).get(cpu.model, 0)) else: max_temp = float(config.get(cpu.vendor, {}).get(cpu.model, 0)) except ValueError: print("Invalid temperature value in configuration for {}: {}".format(cpu.vendor, cpu.model)) raise SystemExit(2) for p, t in cpu.temperature.items(): if float(t) >= max_temp: crit.append("CPU {}: temperature +{}C".format(p, t)) elif float(t) >= max_temp - 5: warn.append("CPU {}: temperature +{}C".format(p, t)) else: ok.append("CPU {}: temperature +{}C".format(p, t)) if crit: print("; ".join(crit)) raise SystemExit(2) elif warn: print("; ".join(warn)) raise SystemExit(1) else: print("; ".join(ok)) raise SystemExit(0)