#!/usr/bin/env python3 import argparse import sys import traceback import warnings from cloudflarepycli import cloudflareclass import checker.nagios as nagios def main(): """ Copied from __main__.py https://github.com/tevslin/cloudflarepycli/blob/main/src/cloudflarepycli/__main__.py """ parser = argparse.ArgumentParser(description='Check internet speed.') parser.add_argument('--warn-up', type=int, default=0, help='Warn level of upload speed in Mbps.') parser.add_argument('--critical-up', type=int, default=0, help='Critical level of upload speed in Mbps.') parser.add_argument('--warn-down', type=int, default=0, help='Warn level of download speed in Mbps.') parser.add_argument('--critical-down', type=int, default=0, help='Critical level of download speed in Mbps.') parser.add_argument('--warn-latency', type=int, default=60, help='Warn level of latency in ms.') parser.add_argument('--critical-latency', type=int, default=100, help='Critical level of latency in ms.') args = parser.parse_args() # Silence this error: """ lib/python3.10/site-packages/numpy/core/fromnumeric.py:3464: RuntimeWarning: Mean of empty slice. return _methods._mean(a, axis=axis, dtype=dtype, lib/python3.10/site-packages/numpy/core/_methods.py:192: RuntimeWarning: invalid value encountered in scalar divide ret = ret.dtype.type(ret / rcount) """ with warnings.catch_warnings(): warnings.simplefilter("ignore", category=RuntimeWarning) speedtest_results = cloudflareclass.cloudflare(printit=False).runalltests() out_str = f"upload: {speedtest_results['90th_percentile_upload_speed']['value']} Mbps, download: {speedtest_results['90th_percentile_download_speed']['value']} Mbps, latency: {speedtest_results['latency_ms']['value']} ms, jitter: {speedtest_results['Jitter_ms']['value']} ms" perf_data = f"'upload'={speedtest_results['90th_percentile_upload_speed']['value'] * 1e+6}B;{args.warn_up * 1e+6};{args.critical_up * 1e+6};0; 'download'={speedtest_results['90th_percentile_download_speed']['value'] * 1e+6}B;{args.warn_down * 1e+6};{args.critical_down * 1e+6};0; 'latency_ms'={speedtest_results['latency_ms']['value']}ms;{args.warn_latency};{args.critical_latency};0; 'jitter_ms'={speedtest_results['Jitter_ms']['value']}ms;;;0;" exit_code = nagios.OK if speedtest_results['90th_percentile_upload_speed']['value'] <= args.critical_up and exit_code < nagios.CRITICAL: exit_code = nagios.CRITICAL elif speedtest_results['90th_percentile_upload_speed']['value'] <= args.warn_up and exit_code < nagios.WARNING: exit_code = nagios.WARNING if speedtest_results['90th_percentile_download_speed']['value'] <= args.critical_down and exit_code < nagios.CRITICAL: exit_code = nagios.CRITICAL elif speedtest_results['90th_percentile_download_speed']['value'] <= args.warn_down and exit_code < nagios.WARNING: exit_code = nagios.WARNING if speedtest_results['latency_ms']['value'] >= args.warn_latency and exit_code < nagios.CRITICAL: exit_code = nagios.CRITICAL elif speedtest_results['latency_ms']['value'] >= args.warn_latency and exit_code < nagios.WARNING: exit_code = nagios.WARNING if exit_code == nagios.OK: status_str = 'OK' elif exit_code == nagios.WARNING: status_str = 'WARN' elif exit_code == nagios.CRITICAL: status_str = 'CRITICAL' else: status_str = 'UNKNOWN' print(f'{status_str} - {out_str} |{perf_data}') sys.exit(exit_code) if __name__ == "__main__": try: main() except Exception as e: print(f'UNKNOWN: exception "{e}"') print(traceback.format_exc()) sys.exit(nagios.UNKNOWN)