"""Auto-imports for interactive REPL sessions. Usage: activate — core imports (Proxmark3, Cmd, etc.) activate sim — + SimSession, all transponder models activate sniff — + SniffSession, trace decoders activate all — everything """ import os import sys _MODE = os.environ.get("PM3PY_MODE", "core") # --- Import groups --- CORE = [ ("pm3py", "Proxmark3"), ("pm3py", "Cmd"), ("pm3py", "PM3Status"), ("pm3py", "PM3Error"), ("pm3py", "PM3Response"), ] SIM = [ ("pm3py.sim", "SimSession"), ("pm3py.sim", "DualInterfaceSession"), ("pm3py.sim", "SoftwareMedium"), ("pm3py.sim", "TableCompiler"), ("pm3py.sim", "RFFrame"), # Transponder models ("pm3py.transponders.hf.iso14443a.base", "Tag14443A_3"), ("pm3py.transponders.hf.iso14443a.base", "Tag14443A_4"), ("pm3py.transponders.hf.iso14443a.nxp.mifare_classic", "MifareClassicTag"), ("pm3py.transponders.hf.iso14443a.nxp.desfire", "DesfireTag"), ("pm3py.transponders.hf.iso14443a.ndef", "NfcType2Tag"), ("pm3py.transponders.hf.iso14443a.ndef", "NfcType4Tag"), ("pm3py.transponders.hf.iso15693.base", "Tag15693"), ("pm3py.transponders.hf.iso15693.type5", "NfcType5Tag"), ("pm3py.transponders.hf.iso15693.type5", "ndef_text"), ("pm3py.transponders.hf.iso15693.type5", "ndef_uri"), ("pm3py.transponders.hf.iso15693.type5", "ndef_mime"), ("pm3py.transponders.hf.iso15693.nxp.nxp_icode", "NxpIcodeTag"), ("pm3py.transponders.hf.iso15693.nxp.icode_slix", "IcodeSlixTag"), ("pm3py.transponders.hf.iso15693.nxp.icode_slix2", "IcodeSlix2Tag"), ("pm3py.transponders.hf.iso15693.nxp.icode3", "Icode3Tag"), ("pm3py.transponders.hf.iso15693.nxp.icode_dna", "IcodeDnaTag"), ("pm3py.transponders.hf.iso15693.nxp.ntag5_platform", "Ntag5PlatformTag"), ("pm3py.transponders.hf.iso15693.nxp.ntag5_switch", "Ntag5SwitchTag"), ("pm3py.transponders.hf.iso15693.nxp.ntag5_link", "Ntag5LinkTag"), ("pm3py.transponders.hf.iso15693.nxp.ntag5_boost", "Ntag5BoostTag"), ("pm3py.transponders.lf.em.em4100", "EM4100Tag"), ("pm3py.transponders.lf.hid.hid", "HIDProxTag"), ("pm3py.transponders.lf.atmel.t5577", "T5577Tag"), ("pm3py.transponders.implants", "xEM"), ("pm3py.transponders.implants", "xNT"), ("pm3py.transponders.implants", "xM1"), ("pm3py.transponders.implants", "FlexDF"), ("pm3py.transponders.implants", "NExT"), ] SNIFF = [ ("pm3py.sniff", "SniffSession"), ("pm3py.trace", "parse_tracelog"), ("pm3py.trace", "decode_15693"), ("pm3py.trace", "decode_ndef_annotation"), ("pm3py.trace", "format_sniff_line"), ] # --- Mode selection --- MODES = { "core": [CORE], "sim": [CORE, SIM], "sniff": [CORE, SNIFF], "all": [CORE, SIM, SNIFF], } groups = MODES.get(_MODE, [CORE]) imports = [] for group in groups: imports.extend(group) # --- Load --- loaded = {} failed = {} for module_name, attr_name in imports: try: module = __import__(module_name, fromlist=[attr_name]) obj = getattr(module, attr_name) globals()[attr_name] = obj loaded[attr_name] = module_name except Exception as e: failed[attr_name] = (module_name, str(e)) # --- Report --- if loaded: print(f"[pm3py:{_MODE}] Loaded: {', '.join(loaded.keys())}") if _MODE == "core": try: pm3 = Proxmark3.sync() print() print("Synchronous connection established") print() except Exception as e: print(f" (Proxmark3 connection failed: {e})") if _MODE == "sniff": try: session = SniffSession.open() print("Sniff session ready -- session.start_15693()") except Exception as e: print(f" (Sniff session failed: {e})") if failed: print(f"\n[pm3py:{_MODE}] Failed:") for name, (mod, err) in failed.items(): print(f" {name} from {mod} -> {err}")