diff --git a/snmp-scan.py b/snmp-scan.py index 5110b6a4a0..47a2de1550 100755 --- a/snmp-scan.py +++ b/snmp-scan.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Scan networks for snmp hosts and add them to LibreNMS @@ -21,13 +21,10 @@ along with this program. If not, see . @author Tony Murray """ -from __future__ import print_function -from __future__ import unicode_literals - import argparse -from argparse import RawTextHelpFormatter import json from collections import namedtuple +from ipaddress import ip_network, ip_address from multiprocessing import Pool from os import path, chdir from socket import gethostbyname, gethostbyaddr, herror, gaierror @@ -35,14 +32,6 @@ from subprocess import check_output, CalledProcessError from sys import stdout from time import time -try: - from ipaddress import ip_network, ip_address -except: - print('Could not import ipaddress module. Please install python-ipaddress or use python3 to run this script') - print('Debian/Ubuntu: apt install python-ipaddress') - print('RHEL/CentOS: yum install python-ipaddress') - exit(2) - Result = namedtuple('Result', ['ip', 'hostname', 'outcome', 'output']) @@ -100,53 +89,53 @@ def handle_result(data): stats[data.outcome] += 1 -def check_ip_excluded(ip): - for net in EXCLUDED_NETS: - if ip in net: - debug("\033[91m{} excluded by autodiscovery.nets-exclude\033[0m".format(ip), 1) +def check_ip_excluded(check_ip): + for network_check in EXCLUDED_NETS: + if check_ip in network_check: + debug("\033[91m{} excluded by autodiscovery.nets-exclude\033[0m".format(check_ip), 1) stats[Outcome.EXCLUDED] += 1 return True return False -def scan_host(ip): +def scan_host(scan_ip): hostname = None try: try: # attempt to convert IP to hostname, if anything goes wrong, just use the IP - tmp = gethostbyaddr(ip)[0] - if gethostbyname(tmp) == ip: # check that forward resolves + tmp = gethostbyaddr(scan_ip)[0] + if gethostbyname(tmp) == scan_ip: # check that forward resolves hostname = tmp except (herror, gaierror): pass try: - arguments = ['/usr/bin/env', 'php', 'addhost.php', hostname or ip] + arguments = ['/usr/bin/env', 'php', 'addhost.php', hostname or scan_ip] if args.ping: arguments.insert(3, args.ping) add_output = check_output(arguments) - return Result(ip, hostname, Outcome.ADDED, add_output) + return Result(scan_ip, hostname, Outcome.ADDED, add_output) except CalledProcessError as err: output = err.output.decode().rstrip() if err.returncode == 2: if 'Could not ping' in output: - return Result(ip, hostname, Outcome.UNPINGABLE, output) + return Result(scan_ip, hostname, Outcome.UNPINGABLE, output) else: - return Result(ip, hostname, Outcome.FAILED, output) + return Result(scan_ip, hostname, Outcome.FAILED, output) elif err.returncode == 3: - return Result(ip, hostname, Outcome.KNOWN, output) + return Result(scan_ip, hostname, Outcome.KNOWN, output) except KeyboardInterrupt: - return Result(ip, hostname, Outcome.TERMINATED, 'Terminated') + return Result(scan_ip, hostname, Outcome.TERMINATED, 'Terminated') - return Result(ip, hostname, Outcome.UNDEFINED, output) + return Result(scan_ip, hostname, Outcome.UNDEFINED, output) if __name__ == '__main__': ################### # Parse arguments # ################### - parser = argparse.ArgumentParser(description='Scan network for snmp hosts and add them to LibreNMS.', formatter_class=RawTextHelpFormatter) + parser = argparse.ArgumentParser(description='Scan network for snmp hosts and add them to LibreNMS.', formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('network', action='append', nargs='*', type=str, help="""CIDR noted IP-Range to scan. Can be specified multiple times This argument is only required if 'nets' config is not set Example: 192.168.0.0/24