def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-d', '--disk', dest='disk', required=False, default=None, type=int, help='Number of the disk to check') self.__parser.add_argument( '-w', '--warning', dest='warning', required=False, type=str, help='Warning load. Format: LOAD1,LOAD5,LOAD15') self.__parser.add_argument( '-c', '--critical', dest='critical', required=False, type=str, help='Critical load. Format: LOAD1,LOAD5,LOAD15')
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-d', '--disks', dest='disks', required=True, type=int, help='Number of disks') self.__parser.add_argument('-w', '--warning', dest='warning', required=True, type=int, help='Warning temperature') self.__parser.add_argument('-c', '--critical', dest='critical', required=True, type=int, help='Critical temperature')
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-g', '--gpu', dest='gpu', required=True, type=int, help='Number of the gpu to check') self.__parser.add_argument('-w', '--warning', dest='warning', required=False, type=int, help='Warning usage (%)') self.__parser.add_argument('-c', '--critical', dest='critical', required=False, type=int, help='Critical usage (%)')
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-r', '--raids', dest='disks', required=True, type=int, help='Number of RAIDs') self.__parser.add_argument('-w', '--warning', dest='warning', required=True, type=int, help='Warning free disk space (%)') self.__parser.add_argument('-c', '--critical', dest='critical', required=True, type=int, help='Critical disk space (%)')
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args()
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-d', '--disk', dest='disk', required=True, type=int, help='Number of the disk to check')
class BatteryPacksAttached(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__count = None self.__oid = '1.3.6.1.4.1.318.1.1.1.2.2.5' Plugin.__init__(self, 'Check the number of attached external battery packs') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument( '-c', '--count', dest='count', required=True, type=int, help='Number of attached external battery packs') def configure(self, args): self.__snmp_executor.configure(args) self.__count = args.count def run(self): oids = self.__snmp_executor.run() if 1 != len(oids) or '0' != oids[0]['oid']: self.__status_builder.unknown( Output( f'Couldn\'t get the number of attached external battery packs' )) return attached = oids[0]['value'] output = Output( f'There are currently {attached} external batteries attached (required {self.__count})' ) if attached != self.__count: self.__status_builder.critical(output) else: self.__status_builder.success(output)
class LastDiagnosticTestResultTime(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__warning = None self.__critical = None self.__snmp_executor = None self.__oid = '1.3.6.1.4.1.318.1.1.1.7.2.4' Plugin.__init__(self, 'Check last self diagnostic test result time') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-w', '--warning', dest='warning', required=False, type=int, help='Time, until exit in warning state (in days)', default=7) self.__parser.add_argument('-c', '--critical', dest='critical', required=False, type=int, help='Time, until exit in critical state (in days)', default=10) def configure(self, args): self.__snmp_executor.configure(args) self.__warning = args.warning self.__critical = args.critical def run(self): oids = self.__snmp_executor.run() if 1 != len(oids) or '0' != oids[0]['oid']: self.__status_builder.unknown(Output(f'Couldn\'t get last diagnostic test result time')) return last_run = oids[0]["value"] last_check = datetime.strptime(last_run, '%m/%d/%Y') now = datetime.now() warning = timedelta(days=self.__warning) critical = timedelta(days=self.__critical) output = Output(f'Last selftest runtime {last_run}') if (now - critical) >= last_check: self.__status_builder.critical(output) elif (now - warning) >= last_check: self.__status_builder.warning(output) else: self.__status_builder.success(output)
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-w', '--warning', dest='warning', required=False, type=int, help='Time, until exit in warning state (in days)', default=7) self.__parser.add_argument('-c', '--critical', dest='critical', required=False, type=int, help='Time, until exit in critical state (in days)', default=10)
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-w', '--warning', dest='warning', required=True, type=int, help='Warning users bound') self.__parser.add_argument('-c', '--critical', dest='critical', required=True, type=int, help='Critical users bound') self.__parser.add_argument('-s', '--service', dest='service', required=True, type=str, help='Service to check user status')
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument( '-c', '--count', dest='count', required=True, type=int, help='Number of attached external battery packs')
class Upgrade(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__oid = '1.3.6.1.4.1.6574.1.5.4' Plugin.__init__(self, 'Check if an upgrade is available on the system') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() def configure(self, args): self.__snmp_executor.configure(args) def run(self): oids = self.__snmp_executor.run() if len(oids) != 1: self.__status_builder.unknown( Output('Can\'t find the upgrade status of the system.')) self.__status_builder.exit() if 1 == oids[0]['value']: self.__status_builder.critical( Output('System upgrade is available')) elif 2 == oids[0]['value']: self.__status_builder.success( Output('No system upgrade is available')) elif 3 == oids[0]['value']: self.__status_builder.unknown( Output('Connecting to update server')) elif 4 == oids[0]['value']: self.__status_builder.unknown( Output('Disconnected from update server')) elif 5 == oids[0]['value']: self.__status_builder.unknown(Output('Other unknown status')) else: self.__status_builder.unknown( Output('Can\'t find the upgrade status of the system.'))
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument( '-s', '--service', dest='services', action='append', default=[], type=str, help='Service, which should run. Can be repeated')
class BatteryStatus(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__oid = '1.3.6.1.4.1.318.1.1.1.2.1.1' Plugin.__init__(self, 'Check the battery status') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() def configure(self, args): self.__snmp_executor.configure(args) def run(self): oids = self.__snmp_executor.run() if 1 != len(oids) or '0' != oids[0]['oid']: self.__status_builder.unknown( Output(f'Couldn\'t get Battery status information')) return if 1 == oids[0]['value']: self.__status_builder.unknown( Output(f'Got unknown battery status')) elif 2 == oids[0]['value']: self.__status_builder.success(Output(f'Battery status normal')) elif 3 == oids[0]['value']: self.__status_builder.warning(Output(f'Low Battery status')) elif 4 == oids[0]['value']: self.__status_builder.critical( Output(f'Battery in pre-fail status')) else: self.__status_builder.unknown( Output( f'Got unknown Battery status information "{oids[0]["value"]}"' ))
class BatteryBadBatteryPacks(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__oid = '1.3.6.1.4.1.318.1.1.1.2.2.6' Plugin.__init__( self, 'Check the number of attached defective external battery packs') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() def configure(self, args): self.__snmp_executor.configure(args) def run(self): oids = self.__snmp_executor.run() if 1 != len(oids) or '0' != oids[0]['oid']: self.__status_builder.unknown( Output( f'Couldn\'t get the number of attached external battery packs' )) return defective = oids[0]['value'] output = Output( f'There are currently {defective} external batteries defective') if defective > 0: self.__status_builder.critical(output) else: self.__status_builder.success(output)
class PowerStatus(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__oid = '1.3.6.1.4.1.6574.1.3' Plugin.__init__(self, 'Check the power status of the system') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() def configure(self, args): self.__snmp_executor.configure(args) def run(self): oids = self.__snmp_executor.run() if len(oids) != 1: self.__status_builder.unknown( Output('Can\'t find the status of the system.')) self.__status_builder.exit() if 1 == oids[0]['value']: self.__status_builder.success( Output('System power status is normal')) elif 2 == oids[0]['value']: self.__status_builder.critical( Output('System power status is critical')) else: self.__status_builder.unknown( Output('Got an unknown power status code "{code}"'.format( code=oids[0]['value']))) self.__status_builder.exit(True)
class BatteryReplacement(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__oid = '1.3.6.1.4.1.318.1.1.1.2.2.4' Plugin.__init__(self, 'Check if a battery replacement is needed') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() def configure(self, args): self.__snmp_executor.configure(args) def run(self): oids = self.__snmp_executor.run() if 1 != len(oids) or '0' != oids[0]['oid']: self.__status_builder.unknown( Output(f'Couldn\'t get Battery replacement information')) return if 1 == oids[0]['value']: self.__status_builder.success( Output(f'No Battery replacement needed')) elif 2 == oids[0]['value']: self.__status_builder.critical( Output(f'Battery replacement needed')) else: self.__status_builder.unknown( Output( f'Got unknown Battery replacement information "{oids[0]["value"]}"' ))
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-w', '--warning', dest='warning', required=False, type=int, help='Warning Runtime (in seconds)', default=25 * 60) self.__parser.add_argument('-c', '--critical', dest='critical', required=False, type=int, help='Critical Runtime (in seconds)', default=15 * 60)
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-w', '--warning', dest='warning', required=False, type=int, help='Warning Temperature', default=25) self.__parser.add_argument('-c', '--critical', dest='critical', required=False, type=int, help='Critical Temperature', default=30)
class GPUInfo(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__gpu_id = None self.__warning = None self.__critical = None self.__oid = '1.3.6.1.4.1.6574.108' Plugin.__init__(self, 'Check GPU information') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-g', '--gpu', dest='gpu', required=True, type=int, help='Number of the gpu to check') self.__parser.add_argument('-w', '--warning', dest='warning', required=False, type=int, help='Warning usage (%)') self.__parser.add_argument('-c', '--critical', dest='critical', required=False, type=int, help='Critical usage (%)') def configure(self, args): self.__snmp_executor.configure(args) self.__gpu_id = args.gpu self.__warning = args.warning self.__critical = args.critical failed = False if None is not self.__critical: if self.__critical > 100: self.__status_builder.unknown( Output('Critical value can\'t be greater than 100 %')) failed = True elif self.__critical < 0: self.__status_builder.unknown( Output('Critical value must be at least 0 %')) failed = True if None is not self.__warning: if self.__warning < 0: self.__status_builder.unknown( Output('Warning value must be at least 0 %')) failed = True if None is not self.__critical and None is self.__warning: self.__status_builder.unknown( Output( 'If you set a critical bound you have to specify a warning bound' )) failed = True elif None is self.__critical and None is not self.__warning: self.__status_builder.unknown( Output( 'If you set a warning bound you have to specify a critical bound' )) failed = True elif None is not self.__critical and None is not self.__warning: if self.__warning > self.__critical: self.__status_builder.unknown( Output( 'Warning value can\'t be greater than critical value')) failed = True if failed: self.__status_builder.exit() def run(self): oids = self.__snmp_executor.run() status_data = {} keys = { '1': 'supported', '2': 'utilization', '3': 'usage', '4': 'free', '5': 'used', '6': 'total', } for oid in oids: base = oid['oid'].split('.') id = int(base[1]) if int(base[1]) != self.__gpu_id: continue data = status_data.get(id, {}) data[keys.get(base[0])] = oid['value'] status_data[id] = data if 0 == len(status_data): self.__status_builder.unknown( Output( f'GPU "{self.__gpu_id}" either does not exist or not accessible' )) self.__status_builder.exit() for status_data_id in status_data: data = status_data[status_data_id] if 1 == data['supported']: output = Output(f"GPU \"{self.__gpu_id}\" is unsupported") self.__status_builder.unknown(output) continue if None is self.__warning: perfdata = [ Perfdata(f'{self.__gpu_id}', data['used'], min=0, max=data['total']), ] else: perfdata = [ Perfdata(f'{self.__gpu_id}', data['used'], warning=self.__warning / 100 * data['total'], critical=self.__critical / 100 * data['total'], min=0, max=data['total']), ] output = Output(f"GPU \"{self.__gpu_id}\"", perfdata) if None is self.__warning: self.__status_builder.success(output) else: if self.__critical <= data['usage']: self.__status_builder.critical(output) elif self.__warning <= data['usage']: self.__status_builder.warning(output) else: self.__status_builder.success(output)
class Temperature(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__warning = None self.__critical = None self.__oid = '1.3.6.1.4.1.6574.1.2' Plugin.__init__(self, 'Check The temperature of the system') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-w', '--warning', dest='warning', required=True, type=int, help='Warning temperature') self.__parser.add_argument('-c', '--critical', dest='critical', required=True, type=int, help='Critical temperature') def configure(self, args): self.__snmp_executor.configure(args) self.__warning = args.warning self.__critical = args.critical def run(self): oids = self.__snmp_executor.run() if len(oids) != 1: self.__status_builder.unknown( Output('Can\'t find the temperature of the system.')) self.__status_builder.exit() perfdata = [ Perfdata("temperature", oids[0]['value'], warning=self.__warning, critical=self.__critical), ] output = Output('Temperature is "' + str(oids[0]['value']) + '°C"', perfdata) if self.__critical <= oids[0]['value']: self.__status_builder.critical(output) elif self.__warning <= oids[0]['value']: self.__status_builder.warning(output) else: self.__status_builder.success(output) self.__status_builder.exit(True)
class BatteryRemainingRuntime(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__warning = None self.__critical = None self.__oid = '1.3.6.1.4.1.318.1.1.1.2.2.3' Plugin.__init__( self, 'Check the remaining runtime of the battery (in seconds)') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-w', '--warning', dest='warning', required=False, type=int, help='Warning Runtime (in seconds)', default=25 * 60) self.__parser.add_argument('-c', '--critical', dest='critical', required=False, type=int, help='Critical Runtime (in seconds)', default=15 * 60) def configure(self, args): self.__snmp_executor.configure(args) self.__warning = args.warning self.__critical = args.critical def run(self): oids = self.__snmp_executor.run() if 1 != len(oids) or '0' != oids[0]['oid']: self.__status_builder.unknown( Output(f'Couldn\'t get Battery remaining runtime information')) return value = oids[0]['value'] remaining = int(value[value.find('(') + 1:value.find(')')]) sec = timedelta(seconds=remaining) d = datetime(1, 1, 1) + sec output = Output( f'Remaining runtime {remaining}s ({d.day - 1}d {d.hour}h {d.minute}m {d.second}s)', [ Perfdata('remaining', remaining, unit='s', warning=self.__warning, critical=self.__critical, min=0) ]) if remaining <= self.__critical: self.__status_builder.critical(output) elif remaining <= self.__warning: self.__status_builder.warning(output) else: self.__status_builder.success(output)
class DiskTemperature(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__num_disks = None self.__warning = None self.__critical = None self.__oid = '1.3.6.1.4.1.6574.2.1.1' Plugin.__init__(self, 'Check The temperature of the disks') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-d', '--disks', dest='disks', required=True, type=int, help='Number of disks') self.__parser.add_argument('-w', '--warning', dest='warning', required=True, type=int, help='Warning temperature') self.__parser.add_argument('-c', '--critical', dest='critical', required=True, type=int, help='Critical temperature') def configure(self, args): self.__snmp_executor.configure(args) self.__num_disks = args.disks self.__warning = args.warning self.__critical = args.critical def run(self): oids = self.__snmp_executor.run() if len(oids) != self.__num_disks * 6: self.__status_builder.unknown( Output( 'You try to check "{disks}" but there are "{configured}" disks in your system.' .format(disks=self.__num_disks, configured=int(len(oids) / 6)))) self.__status_builder.exit() disks = [{} for i in range(0, self.__num_disks)] for oid in oids: base = oid['oid'].split('.') disk_id = int(base[1]) if '1' == base[0]: disks[disk_id]['index'] = oid['value'] elif '2' == base[0]: disks[disk_id]['id'] = oid['value'] elif '3' == base[0]: disks[disk_id]['model'] = oid['value'] elif '4' == base[0]: disks[disk_id]['type'] = oid['value'] elif '5' == base[0]: disks[disk_id]['status'] = oid['value'] elif '6' == base[0]: disks[disk_id]['temperature'] = oid['value'] for disk in disks: if self.__critical <= disk['temperature']: self.__status_builder.critical( Output(self.__get_disk_description(disk), self.__get_disk_perfdata(disk))) elif self.__warning <= disk['temperature']: if 4 <= disk['status']: self.__status_builder.critical( Output(self.__get_disk_description(disk), self.__get_disk_perfdata(disk))) else: self.__status_builder.warning( Output(self.__get_disk_description(disk), self.__get_disk_perfdata(disk))) else: if 4 <= disk['status']: self.__status_builder.critical( Output(self.__get_disk_description(disk), self.__get_disk_perfdata(disk))) elif 2 <= disk['status']: self.__status_builder.warning( Output(self.__get_disk_description(disk), self.__get_disk_perfdata(disk))) else: self.__status_builder.success( Output(self.__get_disk_description(disk), self.__get_disk_perfdata(disk))) self.__status_builder.exit(True) def __get_disk_description(self, disk): status = { 1: 'Normal', 2: 'No data', 3: 'Not initialized', 4: 'System partition failed', 5: 'Crashed', } return disk['id'] + ' - ' + status[disk['status']] + ' / temperature "' + str(disk['temperature']) \ + '°C" (' + str(disk['model']) + ' - ' + str(disk['type']) + ')' def __get_disk_perfdata(self, disk): return [ Perfdata(disk['id'], disk['temperature'], unit='°C', warning=self.__warning, critical=self.__critical), ]
class ServiceUsed(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__service = None self.__warning = None self.__critical = None self.__oid = '1.3.6.1.4.1.6574.6.1.1' Plugin.__init__(self, 'Check how many users using a service') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-w', '--warning', dest='warning', required=True, type=int, help='Warning users bound') self.__parser.add_argument('-c', '--critical', dest='critical', required=True, type=int, help='Critical users bound') self.__parser.add_argument('-s', '--service', dest='service', required=True, type=str, help='Service to check user status') def configure(self, args): self.__snmp_executor.configure(args) self.__service = args.service self.__warning = args.warning self.__critical = args.critical def run(self): oids = self.__snmp_executor.run() services_running = {} for oid in oids: base = oid['oid'].split('.') id = int(base[1]) config = services_running.get(id, {}) if '2' == base[0]: config['service'] = oid['value'].lower() elif '3' == base[0]: config['users'] = oid['value'] services_running[id] = config for service_id in services_running: config = services_running[service_id] if config['service'] == self.__service.lower(): output = Output(f"Service \"{config['service']}\" is currently used by {config['users']} users.", [Perfdata(config["service"].replace('/', '_'), config["users"])]) if config['users'] >= self.__critical: self.__status_builder.critical(output) elif config['users'] >= self.__warning: self.__status_builder.warning(output) else: self.__status_builder.success(output) self.__status_builder.exit() self.__status_builder.unknown(Output(f'Service "{self.__service}" not found. Is it running?'))
class SMART(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__disk_id = None self.__oid = '1.3.6.1.4.1.6574.5.1.1' Plugin.__init__(self, 'Check the SMART status of a specific disk') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-d', '--disk', dest='disk', required=True, type=int, help='Number of the disk to check') def configure(self, args): self.__snmp_executor.configure(args) self.__disk_id = args.disk def run(self): oids = self.__snmp_executor.run() first_datapoint = self.__disk_id * 17 - 16 last_datapoint = self.__disk_id * 17 status_data = {} keys = { '3': 'attributeName', '4': 'attributeId', '5': 'current', '6': 'worst', '7': 'threshold', '8': 'raw', '9': 'status', } for oid in oids: base = oid['oid'].split('.') id = int(base[1]) if base[0] in ['1', '2'] or id < first_datapoint or id > last_datapoint: continue data = status_data.get(id, {}) data[keys.get(base[0])] = oid['value'] status_data[id] = data critical_values = ['pre-fail', 'pre fail', 'pre_fail', 'old-age', 'old age', 'old_age'] for status_data_id in status_data: data = status_data[status_data_id] perfdata = [ Perfdata(f"{data['attributeName']}.id", data['attributeId']), Perfdata(f"{data['attributeName']}.status", data['status']), Perfdata(f"{data['attributeName']}.current", data['current']), Perfdata(f"{data['attributeName']}.threshold", data['threshold']), Perfdata(f"{data['attributeName']}.worst", data['worst']), Perfdata(f"{data['attributeName']}.raw", data['raw']), ] output = Output(f"{data['attributeName']} [{data['attributeId']}] is \"{data['status']}\" current: " \ f"{data['current']}, worst: {data['worst']}, threshold: {data['threshold']}, raw: " \ f"{data['raw']}", perfdata) if data['status'].lower() == 'ok': self.__status_builder.success(output) elif data['status'].lower() in critical_values: self.__status_builder.critical(output) else: self.__status_builder.warning(output)
class BatteryTemperature(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__warning = None self.__critical = None self.__oid = '1.3.6.1.4.1.318.1.1.1.2.2.2' Plugin.__init__(self, 'Check the temperature of the battery') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-w', '--warning', dest='warning', required=False, type=int, help='Warning Temperature', default=25) self.__parser.add_argument('-c', '--critical', dest='critical', required=False, type=int, help='Critical Temperature', default=30) def configure(self, args): self.__snmp_executor.configure(args) self.__warning = args.warning self.__critical = args.critical def run(self): oids = self.__snmp_executor.run() if 1 != len(oids) or '0' != oids[0]['oid']: self.__status_builder.unknown( Output(f'Couldn\'t get Battery temperature information')) return temperature = oids[0]['value'] output = Output(f'Temperature is {temperature}°', [ Perfdata('temperature', temperature, unit='°', warning=self.__warning, critical=self.__critical, min=0, max=50) ]) if temperature >= self.__critical: self.__status_builder.critical(output) elif temperature >= self.__warning: self.__status_builder.warning(output) else: self.__status_builder.success(output)
class Memory(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__memory_id = None self.__warning_total = None self.__critical_total = None self.__check_total = None self.__warning_swap = None self.__critical_swap = None self.__check_swap = None self.__warning_swap_txt = None self.__critical_swap_txt = None self.__check_swap_txt = None self.__warning_real = None self.__critical_real = None self.__check_real = None self.__warning_real_txt = None self.__critical_real_txt = None self.__check_real_txt = None self.__warning_shared = None self.__critical_shared = None self.__check_shared = None self.__warning_buffer = None self.__critical_buffer = None self.__check_buffer = None self.__warning_cache = None self.__critical_cache = None self.__check_cache = None self.__warning_min_swap = None self.__critical_min_swap = None self.__check_min_swap = None self.__oid = '1.3.6.1.4.1.2021.4' Plugin.__init__(self, 'Check Memory status') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-m', '--memory', dest='memory', required=True, type=int, help='Number of the Memory to check') self.__parser.add_argument('-w', '--warning-total', dest='warningtotal', required=False, type=int, help='Warning usage (%) for total memory') self.__parser.add_argument('-c', '--critical-total', dest='criticaltotal', required=False, type=int, help='Critical usage (%) for total memory') self.__parser.add_argument('--ignore-total', dest='ignoretotal', required=False, default=False, action='store_true', help='Ignore the total memory check') self.__parser.add_argument('--warning-swap', dest='warningswap', required=False, type=int, help='Warning usage (%) for swap memory') self.__parser.add_argument('--critical-swap', dest='criticalswap', required=False, type=int, help='Critical usage (%) for swap memory') self.__parser.add_argument('--ignore-swap', dest='ignoreswap', required=False, default=False, action='store_true', help='Ignore the swap check') self.__parser.add_argument('--warning-swap-txt', dest='warningswaptxt', required=False, type=int, help='Warning usage (%) for swaptxt memory') self.__parser.add_argument( '--critical-swap-txt', dest='criticalswaptxt', required=False, type=int, help='Critical usage (%) for swaptxt memory') self.__parser.add_argument('--ignore-swap-txt', dest='ignoreswaptxt', required=False, default=False, action='store_true', help='Ignore the swap txt check') self.__parser.add_argument('--warning-real', dest='warningreal', required=False, type=int, help='Warning usage (%) for real memory') self.__parser.add_argument('--critical-real', dest='criticalreal', required=False, type=int, help='Critical usage (%) for real memory') self.__parser.add_argument('--ignore-real', dest='ignorereal', required=False, default=False, action='store_true', help='Ignore the real memory check') self.__parser.add_argument('--warning-real-txt', dest='warningrealtxt', required=False, type=int, help='Warning usage (%) for realtxt memory') self.__parser.add_argument( '--critical-real-txt', dest='criticalrealtxt', required=False, type=int, help='Critical usage (%) for realtxt memory') self.__parser.add_argument('--ignore-real-txt', dest='ignorerealtxt', required=False, default=False, action='store_true', help='Ignore the reaö txt check') self.__parser.add_argument('--warning-shared', dest='warningshared', required=False, type=int, help='Warning usage (%) for shared memory') self.__parser.add_argument('--critical-shared', dest='criticalshared', required=False, type=int, help='Critical usage (%) for shared memory') self.__parser.add_argument('--check-shared', dest='checkshared', required=False, default=False, action='store_true', help='Check the shared memory') self.__parser.add_argument('--warning-buffer', dest='warningbuffer', required=False, type=int, help='Warning usage (%) for buffer memory') self.__parser.add_argument('--critical-buffer', dest='criticalbuffer', required=False, type=int, help='Critical usage (%) for buffer memory') self.__parser.add_argument('--check-buffer', dest='checkbuffer', required=False, default=False, action='store_true', help='Check the buffer') self.__parser.add_argument('--warning-cache', dest='warningcache', required=False, type=int, help='Warning usage (%) for cache memory') self.__parser.add_argument('--critical-cache', dest='criticalcache', required=False, type=int, help='Critical usage (%) for cache memory') self.__parser.add_argument('--check-cache', dest='checkcache', required=False, default=False, action='store_true', help='Check the cache') self.__parser.add_argument('--warning-min-swap', dest='warningminswap', required=False, type=int, help='Warning usage (%) for minswap memory') self.__parser.add_argument( '--critical-min-swap', dest='criticalminswap', required=False, type=int, help='Critical usage (%) for minswap memory') self.__parser.add_argument('--check-min-swap', dest='checkminswap', required=False, default=False, action='store_true', help='Check the minimum swap') def configure(self, args): self.__snmp_executor.configure(args) self.__memory_id = args.memory self.__warning_total = args.warningtotal self.__critical_total = args.criticaltotal self.__check_total = not args.ignoretotal self.__warning_swap = args.warningswap self.__critical_swap = args.criticalswap self.__check_swap = not args.ignoreswap self.__warning_swap_txt = args.warningswaptxt self.__critical_swap_txt = args.criticalswaptxt self.__check_swap_txt = not args.ignoreswaptxt self.__warning_real = args.warningreal self.__critical_real = args.criticalreal self.__check_real = not args.ignorereal self.__warning_real_txt = args.warningrealtxt self.__critical_real_txt = args.criticalrealtxt self.__check_real_txt = not args.ignorerealtxt self.__warning_shared = args.warningshared self.__critical_shared = args.criticalshared self.__check_shared = args.checkshared self.__warning_buffer = args.warningbuffer self.__critical_buffer = args.criticalbuffer self.__check_buffer = args.checkbuffer self.__warning_cache = args.warningcache self.__critical_cache = args.criticalcache self.__check_cache = args.checkcache self.__warning_min_swap = args.warningminswap self.__critical_min_swap = args.criticalminswap self.__check_min_swap = args.checkminswap success = self.__check_bounds(self.__warning_total, self.__critical_total, 'total memory') success = self.__check_bounds(self.__warning_swap, self.__critical_swap, 'swap') and success success = self.__check_bounds(self.__warning_swap_txt, self.__critical_swap_txt, 'swap txt') and success success = self.__check_bounds(self.__warning_real, self.__critical_real, 'real') and success success = self.__check_bounds(self.__warning_real_txt, self.__critical_real_txt, 'real txt') and success success = self.__check_bounds(self.__warning_shared, self.__critical_shared, 'shared') and success success = self.__check_bounds(self.__warning_buffer, self.__critical_buffer, 'buffer') and success success = self.__check_bounds( self.__warning_cache, self.__critical_cache, 'cache') and success success = self.__check_bounds(self.__warning_min_swap, self.__critical_min_swap, 'min swap') and success if not success: self.__status_builder.exit() def __check_bounds(self, warning, critical, name): success = True if None is not critical: if critical > 100: self.__status_builder.unknown( Output( f'Critical value for {name} can\'t be greater than 100 %' )) success = False elif critical < 0: self.__status_builder.unknown( Output(f'Critical value for {name} must be at least 0 %')) success = False if None is not warning: if warning < 0: self.__status_builder.unknown( Output(f'Warning value for {name} must be at least 0 %')) success = False if None is not critical and None is warning: self.__status_builder.unknown( Output( f'If you set a critical bound for {name} you have to specify a warning bound' )) success = False elif None is critical and None is not warning: self.__status_builder.unknown( Output( f'If you set a warning bound for {name} you have to specify a critical bound' )) success = False elif None is not critical and None is not warning: if warning > critical: self.__status_builder.unknown( Output( f'Warning value for {name} can\'t be greater than critical value' )) success = False return success def run(self): oids = self.__snmp_executor.run() status_data = {} keys = { '2': 'name', '3': 'totalSwap', '4': 'availableSwap', '5': 'totalReal', '6': 'availableReal', '7': 'totalSwapTXT', '8': 'availableSwapTXT', '9': 'totalRealTXT', '10': 'availableRealTXT', '11': 'totalFree', '12': 'minSwap', '13': 'shared', '14': 'buffer', '15': 'cached', '16': 'usedSwapTXT', '17': 'usedRealTXT', '100': 'swapError', '101': 'swapErrorMsg', } for oid in oids: base = oid['oid'].split('.') id = int(base[1]) if int(base[1]) != self.__memory_id: continue data = status_data.get(id, {}) data[keys.get(base[0])] = oid['value'] status_data[id] = data if 0 == len(status_data): self.__status_builder.unknown( Output( f'Memory "{self.__memory_id}" either does not exist or not accessible' )) self.__status_builder.exit() for status_data_id in status_data: data = status_data[status_data_id] self.__check_data(data, 'Swap', 'Swap', self.__warning_swap, self.__critical_swap, self.__check_swap) self.__check_data(data, 'SwapTXT', 'Swap txt', self.__warning_swap_txt, self.__critical_swap_txt, self.__check_swap_txt) self.__check_data(data, 'Real', 'Real', self.__warning_real, self.__critical_real, self.__check_real) self.__check_data(data, 'RealTXT', 'Real txt', self.__warning_real_txt, self.__critical_real_txt, self.__check_real_txt) total = data.get('totalSwap', 0) + data.get( 'totalSwapTXT', 0) + data.get('totalReal', 0) + data.get( 'totalRealTXT', 0) self.__check_data( { 'totalTotal': total, 'availableTotal': total - data['totalFree'], 'name': data['name'] }, 'Total', 'Total', self.__warning_total, self.__critical_total, self.__check_total) self.__check_value('shared', 'Shared', data, self.__warning_shared, self.__critical_shared, self.__check_shared) self.__check_value('buffer', 'Buffer', data, self.__warning_buffer, self.__critical_buffer, self.__check_buffer) self.__check_value('cached', 'Cached', data, self.__warning_cache, self.__critical_cache, self.__check_cache) self.__check_value('minSwap', 'Min SWAP', data, self.__warning_min_swap, self.__critical_min_swap, self.__check_min_swap) if 0 != data['swapError']: self.__status_builder.critical( Output( f'Got an unexpected SWAP error "{data["swapErrorMessage"]}" ' f'(code {data["swapError"]})')) def __check_value(self, suffix, name, data, warning, critical, check): if not check: return self.__logger.debug(f'Check memory {suffix}') value = data.get(suffix, None) if value is None: self.__status_builder.unknown( Output( f"Couldn't check {name} because it either not exist or is not accessible " f"(value not found).|{suffix}=0;0;0;0;0")) return perfdata = f";;;" if None is warning else f"{warning};{critical};;" output = f"Memory \"{name}\";| {suffix}={value};{perfdata}" if None is warning: self.__status_builder.success(output) else: if critical <= value: self.__status_builder.critical(output) elif self.__warning_total <= value: self.__status_builder.warning(output) else: self.__status_builder.success(output) def __check_data(self, data, suffix, name, warning, critical, check): if not check: return self.__logger.debug(f'Check memory {suffix}') total = data.get('total' + suffix, None) available = data.get('available' + suffix, None) perfdata = [ Perfdata(f'{suffix}', 0, unit='B', warning=0, critical=0, min=0, max=0), ] if total is None: self.__status_builder.unknown( Output( f"Couldn't check {name} because it either not exist or is not accessible " f"(total value not found).", perfdata)) return if available is None: self.__status_builder.unknown( Output( f"Couldn't check {name} because it either not exist or is not accessible " f"(available value not found).", perfdata)) return used = total - available if None is warning: perfdata = [ Perfdata(f'{suffix}', used, unit='B', warning=0, critical=0, min=0, max=total), ] else: perfdata = [ Perfdata(f'{suffix}', used, unit='B', warning=warning / 100 * total, critical=critical / 100 * total, min=0, max=total), ] output = Output(f"Memory \"{name}\"", perfdata) if None is warning: self.__status_builder.success(output) else: usage = used / total * 100 if critical <= usage: self.__status_builder.critical(output) elif self.__warning_total <= usage: self.__status_builder.warning(output) else: self.__status_builder.success(output)
class BatteryCapacity(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__warning = None self.__critical = None self.__oid = '1.3.6.1.4.1.318.1.1.1.2.2.1' Plugin.__init__(self, 'Check the capacity of the battery') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-w', '--warning', dest='warning', required=False, type=int, help='Warning Capacity', default=50) self.__parser.add_argument('-c', '--critical', dest='critical', required=False, type=int, help='Critical Capacity', default=20) def configure(self, args): self.__snmp_executor.configure(args) self.__warning = args.warning self.__critical = args.critical def run(self): oids = self.__snmp_executor.run() if 1 != len(oids) or '0' != oids[0]['oid']: self.__status_builder.unknown( Output(f'Couldn\'t get Battery capacity information')) return capacity = oids[0]['value'] output = Output(f'Capacity is {capacity}%', [ Perfdata('capacity', capacity, unit='%', warning=self.__warning, critical=self.__critical, min=0, max=100) ]) if capacity <= self.__critical: self.__status_builder.critical(output) elif capacity <= self.__warning: self.__status_builder.warning(output) else: self.__status_builder.success(output)
class Load(Plugin): def __init__(self): self.__logger = None self.__status_builder = None self.__snmp_executor = None self.__warning = None self.__critical = None self.__oid = '1.3.6.1.4.1.2021.10.1' Plugin.__init__(self, 'Check CPU Load average') def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument( '-w', '--warning', dest='warning', required=False, type=str, help='Warning load. Format: LOAD1,LOAD5,LOAD15') self.__parser.add_argument( '-c', '--critical', dest='critical', required=False, type=str, help='Critical load. Format: LOAD1,LOAD5,LOAD15') def configure(self, args): self.__snmp_executor.configure(args) warning = args.warning if None is not warning: warning = warning.split(',') if len(warning) != 3: self.__status_builder.unknown( Output( 'Format for warning load mismatch. Expected Format: LOAD1,LOAD5,LOAD15' )) self.__status_builder.exit() self.__warning = [ float(warning[0]), float(warning[1]), float(warning[2]) ] critical = args.critical if None is not critical: critical = critical.split(',') if len(critical) != 3: self.__status_builder.unknown( Output( 'Format for critical load mismatch. Expected Format: LOAD1,LOAD5,LOAD15' )) self.__status_builder.exit() self.__critical = [ float(critical[0]), float(critical[1]), float(critical[2]) ] if None is self.__warning and self.__critical is not None: self.__status_builder.unknown( Output( 'If critical load is defined, you have to set warning load' )) self.__status_builder.exit() if None is not self.__warning and self.__critical is None: self.__status_builder.unknown( Output( 'If warning load is defined, you have to set critical load' )) self.__status_builder.exit() def run(self): oids = self.__snmp_executor.run() status_data = {1: {}, 2: {}, 3: {}} keys = { '2': 'name', '3': 'load', '4': 'configuredError', '5': 'loadInt', '6': 'loadFloat', '100': 'error', '101': 'errorMessage', } for oid in oids: base = oid['oid'].split('.') id = int(base[1]) if base[0] == '1': continue status_data[id][keys.get(base[0])] = oid['value'] for status_data_id in status_data: data = status_data[status_data_id] index = status_data_id - 1 perfdata = [ Perfdata(f'load', data['loadFloat'], warning=self.__warning[index], critical=self.__critical[index]), ] if 0 != data['error']: output = Output( f'Load \"{data["name"]}\" Got an unexpected error "{data["errorMessage"]}" (code {data["swapError"]})', perfdata) self.__status_builder.critical(output) continue output = Output(f"Disk load \"{data['name']}\"", perfdata) if None is self.__warning: self.__status_builder.success(output) else: if self.__critical[index] <= data['loadFloat']: self.__status_builder.critical(output) elif self.__warning[index] <= data['loadFloat']: self.__status_builder.warning(output) else: self.__status_builder.success(output)
def add_args(self): self.__parser = self.get_parser() self.__logger = self.get_logger() self.__status_builder = self.get_status_builder() self.__snmp_executor = SNMPExecutor(self.__logger, self.__status_builder, self.__parser, self.__oid) self.__snmp_executor.add_args() self.__parser.add_argument('-m', '--memory', dest='memory', required=True, type=int, help='Number of the Memory to check') self.__parser.add_argument('-w', '--warning-total', dest='warningtotal', required=False, type=int, help='Warning usage (%) for total memory') self.__parser.add_argument('-c', '--critical-total', dest='criticaltotal', required=False, type=int, help='Critical usage (%) for total memory') self.__parser.add_argument('--ignore-total', dest='ignoretotal', required=False, default=False, action='store_true', help='Ignore the total memory check') self.__parser.add_argument('--warning-swap', dest='warningswap', required=False, type=int, help='Warning usage (%) for swap memory') self.__parser.add_argument('--critical-swap', dest='criticalswap', required=False, type=int, help='Critical usage (%) for swap memory') self.__parser.add_argument('--ignore-swap', dest='ignoreswap', required=False, default=False, action='store_true', help='Ignore the swap check') self.__parser.add_argument('--warning-swap-txt', dest='warningswaptxt', required=False, type=int, help='Warning usage (%) for swaptxt memory') self.__parser.add_argument( '--critical-swap-txt', dest='criticalswaptxt', required=False, type=int, help='Critical usage (%) for swaptxt memory') self.__parser.add_argument('--ignore-swap-txt', dest='ignoreswaptxt', required=False, default=False, action='store_true', help='Ignore the swap txt check') self.__parser.add_argument('--warning-real', dest='warningreal', required=False, type=int, help='Warning usage (%) for real memory') self.__parser.add_argument('--critical-real', dest='criticalreal', required=False, type=int, help='Critical usage (%) for real memory') self.__parser.add_argument('--ignore-real', dest='ignorereal', required=False, default=False, action='store_true', help='Ignore the real memory check') self.__parser.add_argument('--warning-real-txt', dest='warningrealtxt', required=False, type=int, help='Warning usage (%) for realtxt memory') self.__parser.add_argument( '--critical-real-txt', dest='criticalrealtxt', required=False, type=int, help='Critical usage (%) for realtxt memory') self.__parser.add_argument('--ignore-real-txt', dest='ignorerealtxt', required=False, default=False, action='store_true', help='Ignore the reaö txt check') self.__parser.add_argument('--warning-shared', dest='warningshared', required=False, type=int, help='Warning usage (%) for shared memory') self.__parser.add_argument('--critical-shared', dest='criticalshared', required=False, type=int, help='Critical usage (%) for shared memory') self.__parser.add_argument('--check-shared', dest='checkshared', required=False, default=False, action='store_true', help='Check the shared memory') self.__parser.add_argument('--warning-buffer', dest='warningbuffer', required=False, type=int, help='Warning usage (%) for buffer memory') self.__parser.add_argument('--critical-buffer', dest='criticalbuffer', required=False, type=int, help='Critical usage (%) for buffer memory') self.__parser.add_argument('--check-buffer', dest='checkbuffer', required=False, default=False, action='store_true', help='Check the buffer') self.__parser.add_argument('--warning-cache', dest='warningcache', required=False, type=int, help='Warning usage (%) for cache memory') self.__parser.add_argument('--critical-cache', dest='criticalcache', required=False, type=int, help='Critical usage (%) for cache memory') self.__parser.add_argument('--check-cache', dest='checkcache', required=False, default=False, action='store_true', help='Check the cache') self.__parser.add_argument('--warning-min-swap', dest='warningminswap', required=False, type=int, help='Warning usage (%) for minswap memory') self.__parser.add_argument( '--critical-min-swap', dest='criticalminswap', required=False, type=int, help='Critical usage (%) for minswap memory') self.__parser.add_argument('--check-min-swap', dest='checkminswap', required=False, default=False, action='store_true', help='Check the minimum swap')