if '-' in ip: start_ip, end_ip = ip.split('-') printers = discover_printers(start_ip, end_ip) else: printers = [ip]

pip install pyinstaller pyinstaller --onefile ethernet_printer_tester_v2.py The .exe will be in the dist folder.

return result def discover_printers(ip_range_start, ip_range_end): """Discover printers by scanning IP range for open port 9100.""" base = '.'.join(ip_range_start.split('.')[:3]) start_octet = int(ip_range_start.split('.')[-1]) end_octet = int(ip_range_end.split('.')[-1]) printers = []

with ThreadPoolExecutor(max_workers=THREADS) as executor: futures = [executor.submit(test_single_printer, p) for p in printers] for future in futures: res = future.result() results.append(res) print(f"✅ res['ip'] | RAW: res['port_9100'] | Print: res['raw_print'] | Speed: res['throughput_kbps'] kbps")

def test_single_printer(ip, name="Unknown"): """Run all tests on one printer.""" result = "ip": ip, "name": name, "timestamp": datetime.now().isoformat(), "port_9100": test_port(ip, RAW_PORT), "port_515": test_port(ip, LPD_PORT), "raw_print": None, "throughput_kbps": None, "toner_level": None, "errors": []

# Print test success, msg = raw_print(ip, TEST_PAGE) result["raw_print"] = success if not success: result["errors"].append(f"Print failed: msg")

if not printers: print("No printers found.") return

# SNMP toner toner = get_snmp_toner(ip) if toner is not None: result["toner_level"] = toner

print(f"[*] Scanning base.start_octet-end_octet for printers...") for last in range(start_octet, end_octet + 1): ip = f"base.last" if test_port(ip, RAW_PORT): printers.append(ip) print(f"[+] Printer found at ip") return printers def main(): print("Ethernet Printer Test Program v2.0") print("==================================")

# Option 1: Single IP ip = input("Enter printer IP (or range e.g., 192.168.1.10-20): ").strip()

# Throughput test speed = throughput_test(ip) if speed: result["throughput_kbps"] = speed