import ipaddress import subprocess import argparse from concurrent.futures import ThreadPoolExecutor, as_completed # Lista OID-ów do sprawdzenia (etykieta => OID) oids = { "sysName": "1.3.6.1.2.1.1.5.0", "sysDescr": "1.3.6.1.2.1.1.1.0", "sysLocation": "1.3.6.1.2.1.1.6.0", "sysContact": "1.3.6.1.2.1.1.4.0" } def get_oid_value(ip, community, oid): try: result = subprocess.run( ["snmpget", "-v2c", "-c", community, str(ip), oid], capture_output=True, text=True, timeout=2 ) if result.returncode == 0 and "STRING" in result.stdout: return result.stdout.split("STRING:")[-1].strip() except subprocess.TimeoutExpired: return "Timeout" return "Brak danych" def query_all_oids(ip, community): values = {name: get_oid_value(ip, community, oid) for name, oid in oids.items()} has_data = any(val not in ("Timeout", "Brak danych") for val in values.values()) if has_data: return (str(ip), values) return None def main(): parser = argparse.ArgumentParser(description="Skaner SNMP dla wielu podsieci.") parser.add_argument("subnets", nargs="+", help="Podsieci w formacie CIDR (np. 10.1.1.0/24 10.2.2.0/24)") parser.add_argument("-c", "--community", default="public", help="SNMP community (domyślnie: public)") args = parser.parse_args() ips = [] for subnet in args.subnets: try: ips.extend(ipaddress.IPv4Network(subnet)) except ValueError: print(f"Błędny format podsieci: {subnet}") print(f"{'IP':<15} {'sysName':<25} {'sysDescr':<40} {'sysLocation':<25} {'sysContact'}") print("-" * 130) with ThreadPoolExecutor(max_workers=6) as executor: futures = {executor.submit(query_all_oids, ip, args.community): ip for ip in ips} for future in as_completed(futures): result = future.result() if result: ip_str, values = result print(f"{ip_str:<15} {values['sysName']:<25} {values['sysDescr']:<40} {values['sysLocation']:<25} {values['sysContact']}") if __name__ == "__main__": main()