diff --git a/check_opnsense_traffic_for_host.py b/check_opnsense_traffic_for_host.py index 2021dc6..8f90306 100755 --- a/check_opnsense_traffic_for_host.py +++ b/check_opnsense_traffic_for_host.py @@ -23,9 +23,10 @@ def main(): parser.add_argument('--duration', default=10, type=int, help='How many seconds to gather statistics.') parser.add_argument('--fail-empty', action='store_true', help='If the API did not return any data, fail with UNKNOWN. Otherwise, assume that there was no traffic.') parser.add_argument('--bandwidth', type=float, required=True, help='Bandwidth speed in Mbps. Used to calculate percentage.') - parser.add_argument('--critical', type=int, default=75, help='Critical if percent of bandwidth usage is greater than or equal to this.') - parser.add_argument('--warn', type=int, default=50, help='Warning if percent of bandwidth usage is greater than or equal to this.') - parser.add_argument('--max', type=int, default=None, help='Set the max value the bandwidth can be. Useful for graphs and whatever.') + parser.add_argument('--bandwidth-critical', type=int, default=75, help='Critical if percent of bandwidth usage is greater than or equal to this.') + parser.add_argument('--bandwidth-warn', type=int, default=50, help='Warning if percent of bandwidth usage is greater than or equal to this.') + parser.add_argument('--conn-critical', type=int, default=-1, help='Set critical level for number of connections. Default: -1 (disabled).') + parser.add_argument('--conn-warn', type=int, default=-1, help='Set warning level for number of connections. Default: -1 (disabled).') args = parser.parse_args() check_result = {} @@ -98,8 +99,8 @@ def main(): print(traffic_data) sys.exit(nagios.UNKNOWN) - warn_value = (args.bandwidth * args.warn / 100) - crit_value = (args.bandwidth * args.critical / 100) + warn_b_value = (args.bandwidth * args.bandwidth_warn / 100) * 1e+6 + crit_b_value = (args.bandwidth * args.bandwidth_critical / 100) * 1e+6 exit_code = nagios.OK critical = [] @@ -107,33 +108,68 @@ def main(): ok = [] perf_data = [] - for name, data in check_result.items(): - # TODO: figure out status - if -1 >= crit_value: - critical.append(name) - status = '[CRITICAL]' + output_table = [ + ('Host', 'Interface', 'Rate In', 'Rate Out', 'Cumulative In', 'Cumulative Out', 'Connections', 'Status') + ] + + def check_b(name, value): + nonlocal exit_code + if value >= crit_b_value: + critical.append((name, filesize(value))) exit_code = nagios.CRITICAL - elif -1 >= warn_value: - warn.append(name) - status = '[WARNING]' + return '[CRITICAL]', nagios.CRITICAL + elif value >= warn_b_value: + warn.append((name, filesize(value))) exit_code = nagios.WARNING + return '[WARNING]', nagios.WARNING else: - ok.append(name) - status = '[OK]' + ok.append((name, filesize(value))) + return '[OK]', nagios.OK - perf_data.append(f'\'{name}_rate_in\'={int(data["rate_in"])}B;{warn_value};{crit_value};0;') - perf_data.append(f'\'{name}_rate_out\'={int(data["rate_out"])}B;{warn_value};{crit_value};0;') - perf_data.append(f'\'{name}_cumulative_in\'={int(data["cumulative_in"])}B;{warn_value};{crit_value};0;') - perf_data.append(f'\'{name}_cumulative_out\'={int(data["cumulative_out"])}B;{warn_value};{crit_value};0;') - perf_data.append(f'\'{name}_connections\'={int(data["connections"])}B;{warn_value};{crit_value};0;') + for name, data in check_result.items(): + status = '[OK]' - output_table = [ - ('Host', 'Interface', 'Rate In', 'Rate Out', 'Cumulative In', 'Cumulative Out', 'Connections', 'Status'), - (args.host, name, filesize(data['rate_in']), filesize(data['rate_out']), filesize(data['cumulative_in']), - filesize(data['cumulative_out']), data['connections'], status) - ] - print(list_to_markdown_table(output_table, align='left', seperator='!', borders=False)) + in_status, in_rc = check_b('rate_in', data['rate_in']) + if in_rc >= exit_code: + status = in_status + out_status, out_rc = check_b('rate_out', data['rate_out']) + if out_rc >= exit_code: + status = out_status + + if data['connections'] >= args.conn_critical > 0: + critical.append(('connections', data['connections'])) + exit_code = nagios.CRITICAL + status = '[CRITICAL]' + elif data['connections'] >= args.conn_warn > 0: + warn.append(('connections', data['connections'])) + exit_code = nagios.WARNING + status = '[WARNING]' + else: + ok.append(('connections', data['connections'])) + + perf_data.append(f'\'{name}_rate_in\'={int(data["rate_in"])}B;{warn_b_value};{crit_b_value};0;') + perf_data.append(f'\'{name}_rate_out\'={int(data["rate_out"])}B;{warn_b_value};{crit_b_value};0;') + perf_data.append(f'\'{name}_cumulative_in\'={int(data["cumulative_in"])}B;{warn_b_value};{crit_b_value};0;') + perf_data.append(f'\'{name}_cumulative_out\'={int(data["cumulative_out"])}B;{warn_b_value};{crit_b_value};0;') + perf_data.append(f'\'{name}_connections\'={int(data["connections"])}B;{warn_b_value};{crit_b_value};0;') + + output_table.append((args.host, name, filesize(data['rate_in']), filesize(data['rate_out']), filesize(data['cumulative_in']), filesize(data['cumulative_out']), data['connections'], status)) + + if len(critical): + x = ['CRITICAL: '] + for i in critical: + x.append(f'{i[0]}: {i[1]}, ') + print(''.join(x).strip(', ')) + if len(warn): + x = ['WARN: '] + for i in warn: + x.append(f'{i[0]}: {i[1]}') + print(''.join(x).strip(', ')) + if not len(warn) and not len(critical): + print(f'OK: bandwidth is below {args.bandwidth} Mbps.') + + print(list_to_markdown_table(output_table, align='left', seperator='!', borders=False)) print(f'| {" ".join(perf_data)}') sys.exit(exit_code)