|
3 | 3 | import sys |
4 | 4 | import subprocess |
5 | 5 |
|
6 | | -# OSX4VM - Master Recovery Engine (Personal Edition) |
| 6 | +# OSX4VM - Master Recovery Engine (Mastered Edition) |
7 | 7 | # ------------------------------------------------ |
8 | 8 | # Supports macOS 10.7 (Lion) to 26.0 (Tahoe) |
9 | | -# Uses robust Board ID / MLB matching for official Apple downloads. |
| 9 | +# Powered by official acidanthera/macrecovery logic. |
10 | 10 |
|
11 | | -RECOVERY_DATA = { |
12 | | - "1": {"name": "Lion (10.7)", "bid": "Mac-2E6FAB96566FE58C", "m": "00000000000F25Y00"}, |
13 | | - "2": {"name": "Mountain Lion (10.8)", "bid": "Mac-7DF2A3B5E5D671ED", "m": "00000000000F65100"}, |
14 | | - "3": {"name": "Mavericks (10.9)", "bid": "Mac-F60DEB81FF30ACF6", "m": "00000000000FNN100"}, |
15 | | - "4": {"name": "Yosemite (10.10)", "bid": "Mac-E43C1C25D4880AD6", "m": "00000000000GDVW00"}, |
16 | | - "5": {"name": "El Capitan (10.11)", "bid": "Mac-FFE5EF870D7BA81A", "m": "00000000000GQRX00"}, |
17 | | - "6": {"name": "Sierra (10.12)", "bid": "Mac-77F17D7DA9285301", "m": "00000000000J0DX00"}, |
18 | | - "7": {"name": "High Sierra (10.13)", "bid": "Mac-7BA5B2D9E42DDD94", "m": "00000000000J80300"}, |
19 | | - "8": {"name": "Mojave (10.14)", "bid": "Mac-7BA5B2DFE22DDD8C", "m": "00000000000KXPG00"}, |
20 | | - "9": {"name": "Catalina (10.15)", "bid": "Mac-CFF7D910A743CAAF", "m": "00000000000PHCD00"}, |
21 | | - "10": {"name": "Big Sur (11)", "bid": "Mac-2BD1B31983FE1663", "m": "00000000000000000"}, |
22 | | - "11": {"name": "Monterey (12)", "bid": "Mac-E43C1C25D4880AD6", "m": "00000000000000000"}, |
23 | | - "12": {"name": "Ventura (13)", "bid": "Mac-B4831CEBD52A0C4C", "m": "00000000000000000"}, |
24 | | - "13": {"name": "Sonoma (14)", "bid": "Mac-827FAC58A8FDFA22", "m": "00000000000000000"}, |
25 | | - "14": {"name": "Sequoia (15)", "bid": "Mac-7BA5B2D9E42DDD94", "m": "00000000000000000"}, |
26 | | - "15": {"name": "Tahoe (26, Latest)", "bid": "Mac-CFF7D910A743CAAF", "m": "00000000000000000", "latest": True}, |
27 | | -} |
| 11 | +RECOVERY_DATA = [ |
| 12 | + {"name": "Lion (10.7)", "bid": "Mac-2E6FAB96566FE58C", "m": "00000000000F25Y00"}, |
| 13 | + {"name": "Mountain Lion (10.8)", "bid": "Mac-7DF2A3B5E5D671ED", "m": "00000000000F65100"}, |
| 14 | + {"name": "Mavericks (10.9)", "bid": "Mac-F60DEB81FF30ACF6", "m": "00000000000FNN100"}, |
| 15 | + {"name": "Yosemite (10.10)", "bid": "Mac-E43C1C25D4880AD6", "m": "00000000000GDVW00"}, |
| 16 | + {"name": "El Capitan (10.11)", "bid": "Mac-FFE5EF870D7BA81A", "m": "00000000000GQRX00"}, |
| 17 | + {"name": "Sierra (10.12)", "bid": "Mac-77F17D7DA9285301", "m": "00000000000J0DX00"}, |
| 18 | + {"name": "High Sierra (10.13)", "bid": "Mac-7BA5B2D9E42DDD94", "m": "00000000000J80300"}, |
| 19 | + {"name": "Mojave (10.14)", "bid": "Mac-7BA5B2DFE22DDD8C", "m": "00000000000KXPG00"}, |
| 20 | + {"name": "Catalina (10.15)", "bid": "Mac-00BE6ED71E35EB86", "m": "00000000000000000"}, |
| 21 | + {"name": "Big Sur (11)", "bid": "Mac-2BD1B31983FE1663", "m": "00000000000000000"}, |
| 22 | + {"name": "Monterey (12)", "bid": "Mac-E43C1C25D4880AD6", "m": "00000000000000000"}, |
| 23 | + {"name": "Ventura (13)", "bid": "Mac-B4831CEBD52A0C4C", "m": "00000000000000000"}, |
| 24 | + {"name": "Sonoma (14)", "bid": "Mac-827FAC58A8FDFA22", "m": "00000000000000000"}, |
| 25 | + {"name": "Sequoia (15)", "bid": "Mac-7BA5B2D9E42DDD94", "m": "00000000000000000"}, |
| 26 | + {"name": "Tahoe (26)", "bid": "Mac-CFF7D910A743CAAF", "m": "00000000000000000", "os": "latest"}, |
| 27 | +] |
28 | 28 |
|
29 | 29 | def main(): |
30 | 30 | print("\033[1;36mOSX4VM Master Recovery Engine\033[0m") |
31 | 31 | print("-----------------------------------") |
32 | 32 |
|
33 | | - for k, v in RECOVERY_DATA.items(): |
34 | | - print(f"{k.rjust(2)}. {v['name']}") |
| 33 | + for i, target in enumerate(RECOVERY_DATA, 1): |
| 34 | + print(f"{str(i).rjust(2)}. {target['name']}") |
35 | 35 |
|
36 | 36 | try: |
37 | | - choice = input("\nSelect version to fetch (1-15): ") |
38 | | - if choice not in RECOVERY_DATA: |
| 37 | + choice = input(f"\nSelect version to fetch (1-{len(RECOVERY_DATA)}): ") |
| 38 | + if not choice.isdigit() or not (1 <= int(choice) <= len(RECOVERY_DATA)): |
39 | 39 | print("[-] Invalid selection.") |
40 | 40 | return |
41 | 41 |
|
42 | | - target = RECOVERY_DATA[choice] |
43 | | - print(f"[*] Fetching recovery data for {target['name']}...") |
| 42 | + target = RECOVERY_DATA[int(choice)-1] |
| 43 | + print(f"[*] Initializing secure stream for {target['name']}...") |
44 | 44 |
|
45 | | - # Ensure macrecovery.py exists or is fetched if needed |
46 | | - # For the Mastered Edition, we assume it's part of the engine |
47 | 45 | cmd = [ |
48 | | - sys.executable, "macrecovery.py", |
49 | | - "-b", target["bid"], |
50 | | - "-m", target["m"] |
| 46 | + str(sys.executable), "macrecovery.py", |
| 47 | + "--board", str(target["bid"]), |
| 48 | + "--mlb", str(target["m"]), |
| 49 | + "--os-type", str(target.get("os", "default")), |
| 50 | + "--action", "download" |
51 | 51 | ] |
52 | | - |
53 | | - if target.get("latest"): |
54 | | - cmd += ["-os", "latest"] |
55 | | - |
56 | | - cmd.append("download") |
57 | 52 |
|
58 | | - print(f"[*] Executing: {' '.join(cmd)}") |
59 | | - subprocess.run(cmd) |
| 53 | + print(f"[*] Executing official recovery logic...") |
| 54 | + subprocess.run(cmd, check=True) |
60 | 55 |
|
61 | | - print("\n[!] If download succeeded, you will see BaseSystem.dmg/chunklist in this folder.") |
62 | | - print("[!] Run ./boot.sh to begin installation.") |
| 56 | + print("\n[!] Success. BaseSystem.dmg and chunklist should be in this folder.") |
| 57 | + print("[!] Next Step: Run ./boot.sh to begin installation.") |
63 | 58 |
|
64 | 59 | except KeyboardInterrupt: |
65 | 60 | print("\n[-] Operation cancelled.") |
| 61 | + except subprocess.CalledProcessError: |
| 62 | + print("\n[-] Error: The recovery download failed. Check your internet connection.") |
66 | 63 | except Exception as e: |
67 | | - print(f"[-] Error: {e}") |
| 64 | + print(f"[-] Unexpected Error: {e}") |
68 | 65 |
|
69 | 66 | if __name__ == "__main__": |
70 | 67 | main() |
0 commit comments