117 lines
4.5 KiB
Python
Executable File
117 lines
4.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""speedtest.net python check for icinga"""
|
|
"""dependencys:
|
|
- pip3 install nagiosplugin
|
|
- pip3 install argparse
|
|
- pip3 install speedtest-cli
|
|
or
|
|
system package on debian:
|
|
- apt install speedtest
|
|
"""
|
|
|
|
__version__ = '0.1.0'
|
|
__author__ = 'anima'
|
|
|
|
# imports
|
|
import logging
|
|
import argparse
|
|
import nagiosplugin
|
|
import speedtest
|
|
|
|
# log settings
|
|
logging.basicConfig(format='[%(asctime)s] %(levelname)s %(message)s', level=logging.INFO)
|
|
|
|
class SpeedtestResource(nagiosplugin.Resource):
|
|
def __init__(self) -> None:
|
|
self.test = speedtest.Speedtest(secure=True)
|
|
|
|
def probe(self) -> list:
|
|
"""speedtest check for up & download
|
|
|
|
Returns:
|
|
Generator[nagisplugin.Metric]: multiple metric elements (yield)
|
|
"""
|
|
def to_mb(byte) -> float:
|
|
kb = byte / 1024
|
|
mb = kb / 1024
|
|
return mb
|
|
|
|
logging.debug('start download speedtest...')
|
|
self.test.download()
|
|
logging.debug(f'download speed: {self.test.results.download}')
|
|
|
|
logging.debug('start upload speedtest...')
|
|
self.test.upload()
|
|
logging.debug(f'upload speed: {self.test.results.upload}')
|
|
|
|
logging.debug(f'used server: {self.test.results.server}')
|
|
|
|
yield nagiosplugin.Metric(name='download', value=round(to_mb(self.test.results.download), 2), uom='mbps', context='download_scalar_context')
|
|
yield nagiosplugin.Metric(name='upload', value=round(to_mb(self.test.results.upload), 2), uom='mbps', context='upload_scalar_context')
|
|
yield nagiosplugin.Metric(name='ping', value=self.test.results.ping, uom='ms', context='ping_scalar_context')
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
"""evaluates given arguments
|
|
|
|
Returns:
|
|
argsparse.Namespace: Namespace Object with all arguments insert (use: args.long_name_of_argument)
|
|
"""
|
|
argp = argparse.ArgumentParser(description=__doc__)
|
|
# Default args
|
|
argp.add_argument('-v', '--verbose', action='count', default=0,
|
|
help='increase output verbosity (use up to 3 times)')
|
|
argp.add_argument('-H', '--hostname', default='localhost',
|
|
help='IP address or hostname of device to query')
|
|
argp.add_argument('-t', '--timeout', default=60,
|
|
help='abort execution after TIMEOUT seconds')
|
|
argp.add_argument('-m', '--check_mode',
|
|
choices=[
|
|
'speedtest',
|
|
], default='speedtest',
|
|
help='check mode to run')
|
|
|
|
# Nagios args / see https://nagios-plugins.org/doc/guidelines.html#THRESHOLDFORMAT
|
|
argp.add_argument('-w', '--warning', default='80:',
|
|
help='not used for this check') # for compatibility not removed
|
|
argp.add_argument('-c', '--critical', default='90:',
|
|
help='not used for this check') # for compatibility not removed
|
|
argp.add_argument('-wd', '--warning-download', default='90:',
|
|
help='warning threshold for download in mb')
|
|
argp.add_argument('-cd', '--critical-download', default='25:',
|
|
help='critical threshold for download in mb')
|
|
argp.add_argument('-wu', '--warning-upload', default='25:',
|
|
help='warning threshold for upload in mb')
|
|
argp.add_argument('-cu', '--critical-upload', default='10:',
|
|
help='critical threshold for upload in mb')
|
|
argp.add_argument('-wp', '--warning-ping', default=':50',
|
|
help='warning threshold for ping in ms')
|
|
argp.add_argument('-cp', '--critical-ping', default=':100',
|
|
help='critical threshold for ping in ms')
|
|
|
|
args = argp.parse_args()
|
|
return args
|
|
|
|
# @nagiosplugin.guarded(verbose=0)
|
|
def main():
|
|
args = parse_args()
|
|
if args.verbose >= 3:
|
|
logging.getLogger().setLevel(logging.DEBUG)
|
|
|
|
# dice which check will be run bases on check_mode
|
|
match args.check_mode:
|
|
case 'speedtest':
|
|
check = nagiosplugin.Check(
|
|
SpeedtestResource(),
|
|
nagiosplugin.ScalarContext(name='download_scalar_context', warning=args.warning_download, critical=args.critical_download),
|
|
nagiosplugin.ScalarContext(name='upload_scalar_context', warning=args.warning_upload, critical=args.critical_upload),
|
|
nagiosplugin.ScalarContext(name='ping_scalar_context', warning=args.warning_ping, critical=args.critical_ping),
|
|
nagiosplugin.Summary())
|
|
check.name = "speedtest"
|
|
case _:
|
|
raise nagiosplugin.CheckError(f'Unknown check mode: {args.check_mode}')
|
|
|
|
check.main(args.verbose, args.timeout)
|
|
|
|
if __name__ == '__main__':
|
|
main() |