diff --git a/README.md b/README.md index 59379fa..6093ab0 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,8 @@ docker compose up netbox-importer - `NETWORKS`: comma-separated networks to scan - `TENANT`: NetBox tenant name - `SSL_VERIFY`: whether to verify SSL (`false`, `0`, `no` disable verification) +- `SCAN_SOURCE`: `env`, `netbox`, or `mixed` (use NetBox prefix data for scan networks) +- `NETBOX_PREFIX_STATUS`: optional prefix status filter for NetBox prefixes (for example `active`) ## Output format diff --git a/docker-compose.yml b/docker-compose.yml index fdaa3f7..42c424a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,3 +21,4 @@ services: - NETWORKS=192.168.85.0/24,192.168.86.0/24 - TENANT=Xxxxx Praha - SSL_VERIFY=false + - SCAN_SOURCE=env diff --git a/ipscan-v2.py b/ipscan-v2.py index c8deb9f..7a6d55f 100644 --- a/ipscan-v2.py +++ b/ipscan-v2.py @@ -18,6 +18,10 @@ nm = nmap.PortScanner() networks_env = os.getenv("NETWORKS", "192.168.85.0/24,192.168.86.0/24") networks = [network.strip() for network in networks_env.split(",") if network.strip()] +# Scan source configuration: env, netbox, or mixed +scan_source = os.getenv("SCAN_SOURCE", "env").strip().lower() +netbox_prefix_status = os.getenv("NETBOX_PREFIX_STATUS", "").strip().lower() + # NetBox configuration netbox_url = os.getenv("NETBOX_URL", "https://netbox.xxxxx.xx/") netbox_token = os.getenv("NETBOX_TOKEN", "xxxxx") @@ -26,6 +30,27 @@ netbox = pynetbox.api(url=netbox_url, token=netbox_token, ssl_verify=ssl_verify) tenant = os.getenv("TENANT", "Xxxxx Praha") + +def load_networks_from_netbox(): + print("Loading networks from NetBox...") + prefixes = netbox.ipam.prefixes.filter(status=netbox_prefix_status) if netbox_prefix_status else netbox.ipam.prefixes.all() + networks_from_netbox = [] + for prefix in prefixes: + address = getattr(prefix, 'prefix', None) + if address: + networks_from_netbox.append(address) + print(f"Found NetBox prefix: {address}") + return networks_from_netbox + + +if scan_source == 'netbox': + networks = load_networks_from_netbox() +elif scan_source == 'mixed': + networks = networks + load_networks_from_netbox() + +if not networks: + raise ValueError('No networks configured to scan. Set NETWORKS or SCAN_SOURCE to include NetBox prefixes.') + def scan_network(network): print(f"Scanning network: {network}") nm.scan(hosts=network, arguments='-p 1-32768 -T4 --host-timeout 2m') # Adding a host-timeout of 2 minutes