from snmp import CommunityData, ContextData, SNMPv1, SNMPv2c, SNMPv3
from snmp import Version
from ipaddress import IPv4Network
import socket

def get_printers(community="public", ip_range="192.168.251.0/24", version=Version.V1):
    oids = {
        "printer_name": "1.3.6.1.2.1.25.3.2.1.3",
        "printer_status": "1.3.6.1.2.1.25.3.5.1.1",
        "printer_location": "1.3.6.1.2.1.1.6"

    }

    printers = []

    for ip in IPv4Network(ip_range):
        ip_str = str(ip)
        if ip_str == "192.168.251.249":
            continue
            
        try:
            if version == Version.V1:
                snmp_client = SNMPv1(CommunityData(community))
            elif version == Version.V2c:
                snmp_client = SNMPv2c(CommunityData(community))
            else:  # Version 3
                snmp_client = SNMPv3(ContextData())
            
            printer_info = {}

            for key, oid in oids.items():
                try:
                    result = snmp_client.get(oid, ip_str)
                    printer_info[key] = result.value
                except socket.timeout:
                    #print(f"Timeout for {ip_str}")
                    break
                except Exception as e:
                    #print(f"Error querying {ip_str}: {e}")
                    break

            if printer_info:
                printer_info["ip"] = ip_str
                printers.append(printer_info)

        except Exception as e:
            # print(f"SNMP error for {ip_str}: {e}")  # Handle SNMP errors
            pass

    return printers




if __name__ == "__main__":
    printers = get_printers()
    if printers:
        for printer in printers:
            print(printer)
    else:
        print("No printers found.")