#!/usr/bin/env python3 """Check CPU governor scaling and alert.""" import argparse import os import re from nagios_plugin3 import ( CriticalError, try_check, ) def wanted_governor(governor): """Check /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor.""" cpu_path = os.listdir("/sys/devices/system/cpu") regex = re.compile("(cpu[0-9][0-9]*)") numcpus = sum(1 for x in cpu_path if regex.match(x)) error_cpus = set() for cpu in range(0, numcpus): path = f"/sys/devices/system/cpu/cpu{cpu}/cpufreq/scaling_governor" with open(path) as f: out = f.readline().strip() if governor in out: continue else: error_cpus.add(f"CPU{cpu}") if error_cpus: error_cpus = ",".join(error_cpus) raise CriticalError(f"CRITICAL: {error_cpus} not set to {governor}") print(f"OK: All CPUs set to {governor}.") def parse_args(): """Parse command-line options.""" parser = argparse.ArgumentParser(description="Check CPU governor") parser.add_argument( "--governor", "-g", type=str, help="The requested governor to check for each CPU", default="performance", ) args = parser.parse_args() return args def main(): """Check the CPU governors.""" args = parse_args() try_check(wanted_governor, args.governor) if __name__ == "__main__": main()