commit 46e30c37170262b63bc2946dec60d32fe50cf9f6 Author: gru Date: Tue May 6 08:41:16 2025 +0200 Upload files to "/" diff --git a/scan.py b/scan.py new file mode 100644 index 0000000..ba03bb6 --- /dev/null +++ b/scan.py @@ -0,0 +1,58 @@ +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() \ No newline at end of file