Switch to Python 3, part 1

This commit is contained in:
Dhinak G
2021-01-24 13:51:38 -05:00
parent c655c4a910
commit e94f68d6e3
8 changed files with 601 additions and 633 deletions

13
.pylintrc Normal file
View File

@@ -0,0 +1,13 @@
[MASTER]
init-hook="from pylint.config import find_pylintrc; import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"
[MESSAGES CONTROL]
disable=unused-import,
subprocess-run-check,
line-too-long,
too-few-public-methods,
missing-module-docstring,
missing-class-docstring,
missing-function-docstring

52
Build-App.command Executable file
View File

@@ -0,0 +1,52 @@
#!/usr/bin/env python
from __future__ import print_function
from shutil import copy
from shutil import rmtree
from distutils.dir_util import copy_tree
import os
import json
import subprocess
import sys
import zipfile
os.chdir(os.path.dirname(os.path.realpath(__file__)))
current_path = os.getcwd()
print(current_path)
# File location
command_path = os.path.join(current_path, "OpenCore-Patcher.command")
resources_path = os.path.join(current_path, "Resources/")
payloads_path = os.path.join(current_path, "payloads/")
icns_path = os.path.join(current_path, "OC-Patcher.icns")
plist_path = os.path.join(current_path, "Info.plist")
app_path = os.path.join(current_path, "App/")
app_app_path = os.path.join(current_path, "App/OpenCore-Patcher.app/")
contents_path = os.path.join(current_path, "App/OpenCore-Patcher.app/Contents/")
app_macos_path = os.path.join(current_path, "App/OpenCore-Patcher.app/Contents/MacOS/")
app_macos_payload_path = os.path.join(current_path, "App/OpenCore-Patcher.app/Contents/MacOS/payloads")
app_macos_resources_path = os.path.join(current_path, "App/OpenCore-Patcher.app/Contents/MacOS/Resources")
app_resources_path = os.path.join(current_path, "App/OpenCore-Patcher.app/Contents/Resources/")
if os.path.exists(app_path):
print("Cleaning App folder")
rmtree(app_path)
print("Creating new App folder")
os.mkdir(app_path)
os.mkdir(app_app_path)
os.mkdir(contents_path)
os.mkdir(app_macos_path)
os.mkdir(app_resources_path)
copy(command_path, app_macos_path)
copy_tree(resources_path, app_macos_resources_path)
copy_tree(payloads_path, app_macos_payload_path)
copy(icns_path, app_resources_path)
copy(plist_path, contents_path)
copy(icns_path, app_macos_path)

View File

@@ -1,234 +1,108 @@
#!/usr/bin/env python
#!/usr/bin/env python3
from __future__ import print_function
from shutil import copy
from shutil import rmtree
import os
import json
import subprocess
import sys
import zipfile
from pathlib import Path
from Resources import *
from Resources import build, ModelArray, Versions, utilities
PATCHER_VERSION = "0.0.9"
# Allow py2 and 3 support
try:
input = raw_input
except NameError:
pass
class OpenCoreLegacyPatcher():
def __init__(self):
self.custom_model: str = None
self.current_model: str = None
opencore_model: str = subprocess.run("nvram 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:oem-product".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode()
if not opencore_model.startswith("nvram: Error getting variable"):
opencore_model = subprocess.run("nvram 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:oem-product".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
opencore_model = [line.strip().split(":oem-product ", 1)[1] for line in opencore_model.stdout.decode().split("\n") if line.strip().startswith("4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:")][0]
self.current_model = opencore_model
else:
self.current_model = subprocess.run("system_profiler SPHardwareDataType".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
self.current_model = [line.strip().split(": ", 1)[1] for line in self.current_model.stdout.decode().split("\n") if line.strip().startswith("Model Identifier")][0]
# List build versions
patcher_version = "0.0.9"
def build_opencore(self):
build.OpenCoreMenus().build_opencore_menu(self.custom_model or self.current_model)
CustomSMBIOS=False
MainMenu=True
MenuWidth = 52
header = '#' * MenuWidth
subheader = '-' * MenuWidth
def install_opencore(self):
utilities.cls()
utilities.header(["Installing OpenCore to Drive"])
while MainMenu:
os.system('clear')
if Path(Versions.opencore_path_done).exists():
print("\nFound OpenCore in Build Folder")
build.BuildOpenCore.copy_efi()
input("Press [Enter] to go back.")
print(header)
print(" OpenCore Legacy patcher v%s" % patcher_version)
print(" Current Model: %s" % BuildOpenCore.current_model)
print(header)
print("")
if BuildOpenCore.current_model not in ModelArray.SupportedSMBIOS:
print(" Your model is not supported by this patcher!")
print("")
print(" If you plan to create the USB for another machine,")
print(" please select option 5")
print(subheader)
print("")
elif BuildOpenCore.current_model in ("MacPro3,1", "iMac7,1"):
print(" This model is supported")
print(" However please ensure the CPU have been upgraded")
print(" to support SSE4.1+")
print(subheader)
print("")
else:
print(" This model is supported")
print(subheader)
print("")
print(" 1. Build OpenCore")
print(" 2. Install OpenCore to USB/internal drive")
print(" 3. Change model")
print(" 4. Credits")
print(" 5. Exit")
print("")
else:
utilities.TUIOnlyPrint(["Installing OpenCore to Drive"],
"Press [Enter] to go back.\n",
["""OpenCore folder missing!
Please build OpenCore first!"""]).start()
MainMenu = input('Please select an option: ')
def change_model(self):
utilities.cls()
utilities.header(["Select Different Model"])
print("""
Tip: Run the following command on the target machine to find the model identifier:
if MainMenu=="1":
OpenCoreBuilderMenu=True
while OpenCoreBuilderMenu:
os.system('clear')
system_profiler SPHardwareDataType | grep 'Model Identifier'
""")
self.custom_model = input("Please enter the model identifier of the target machine: ").strip()
print(header)
print(" Build OpenCore v%s for model: %s" % (Versions.opencore_version, BuildOpenCore.current_model))
print(header)
print("")
print(" 1. Auto build OpenCore")
print(" 2. Change OpenCore version")
print(" 3. Return to main menu")
print("")
def credits(self):
utilities.TUIOnlyPrint(["Credits"], "Press enter to go back\n",
["""Many thanks to the following:
OpenCoreBuilderMenu = input('Please select an option: ')
- Acidanthera:\tOpenCore, kexts and other tools
- DhinakG:\t\tWriting and maintaining this patcher
- Khronokernel:\tWriting and maintaining this patcher
- Syncretic:\t\tAAAMouSSE and telemetrap
- Slice:\t\tVoodooHDA"""]).start()
if OpenCoreBuilderMenu=="1":
AutoBuilderMenu=True
while AutoBuilderMenu:
os.system('clear')
print(header)
print(" Building OpenCore for model: %s" % BuildOpenCore.current_model)
print(header)
print("")
print("The current working directory:")
print (" %s" % Versions.current_path)
print("")
BuildOpenCore.BuildEFI()
#BuildOpenCore.BuildGUI()
BuildOpenCore.BuildSMBIOS()
BuildOpenCore.SavePlist()
BuildOpenCore.CleanBuildFolder()
print("")
print("Your OpenCore EFI has been built at:")
print(" %s" % Versions.opencore_path_done)
print("")
AutoBuilderMenu = input("Press any key to return to previous menu: ")
if AutoBuilderMenu=="1":
print("Returning to previous menu...")
AutoBuilderMenu=False
OpenCoreBuilderMenu=False
elif OpenCoreBuilderMenu=="2":
ChangeOCversion=True
while ChangeOCversion:
os.system('clear')
print(header)
print(" Current OpenCore version: %s" % Versions.opencore_version)
print(header)
print("")
print(" Supported versions: 0.6.3, 0.6.4")
print("")
OpenCoreOption = input('Please enter the OpenCore you want (Press enter to exit): ')
if OpenCoreOption == "":
print("Exiting...")
ChangeOCversion=False
MainMenu=True
else:
print("")
print(" New SMBIOS: %s" % OpenCoreOption)
print("")
ChangeOCversionYN = input("Is this correct? (y/n)")
if ChangeOCversionYN in {"y", "Y", "yes", "Yes"}:
ChangeOCversion=False
Versions.opencore_version = OpenCoreOption
MainMenu=True
elif OpenCoreBuilderMenu=="3":
print("\n Returning to main menu...")
OpenCoreBuilderMenu=False
MainMenu=True
def main_menu(self):
response = None
while not (response and response == -1):
title = [
f"OpenCore Legacy Patcher v{PATCHER_VERSION}",
f"Selected Model: {self.custom_model or self.current_model}"
]
if (self.custom_model or self.current_model) not in ModelArray.SupportedSMBIOS:
in_between = [
'Your model is not supported by this patcher!',
'',
'If you plan to create the USB for another machine, please select the "Change Model" option in the menu.'
]
elif not self.custom_model and self.current_model in ("MacPro3,1", "iMac7,1") and \
"SSE4.1" not in subprocess.run("sysctl machdep.cpu.features".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode():
in_between = [
'Your model requires a CPU upgrade to a CPU supporting SSE4.1+ to be supported by this patcher!',
'',
'If you plan to create the USB for another machine, please select option 5'
]
elif self.custom_model in ("MacPro3,1", "iMac7,1"):
in_between = ["This model is supported",
"However please ensure the CPU has been upgraded to support SSE4.1+"
]
else:
print("\n Not Valid Choice Try again")
OpenCoreBuilderMenu = True
in_between = ["This model is supported"]
elif MainMenu=="2":
print("\n Not yet implemented")
OpenCoreInstallerMenu=True
while OpenCoreInstallerMenu:
os.system('clear')
menu = utilities.TUIMenu(title, "Please select an option: ", in_between=in_between, auto_number=True, top_level=True)
print(header)
print(" Install OpenCore to drive")
print(header)
print("")
print(" 1. Install to USB/internal drive")
print(" 2. Return to main menu")
print("")
options = ([["Build OpenCore", self.build_opencore]] if ((self.custom_model or self.current_model) in ModelArray.SupportedSMBIOS) else []) + [
["Install OpenCore to USB/internal drive", self.install_opencore],
["Change Model", self.change_model],
["Credits", self.credits]
]
OpenCoreInstallerMenu = input('Please select an option: ')
for option in options:
menu.add_menu_option(option[0], function=option[1])
if OpenCoreInstallerMenu=="1":
os.system('clear')
if os.path.exists(Versions.opencore_path_done):
print("Found OpenCore in Build Folder")
BuildOpenCore.ListDiskutil()
BuildOpenCore.MoveOpenCore()
response = menu.start()
else:
print("OpenCore folder missing!")
print("Please build OpenCore first")
print("")
OpenCoreInstallerMenu = input("Press any key to exit: ")
if OpenCoreInstallerMenu=="1":
print("Returning to main menu...")
OpenCoreInstallerMenu=False
elif OpenCoreInstallerMenu=="2":
print("\n Returning to main menu...")
OpenCoreInstallerMenu=False
MainMenu=True
else:
print("\n Not Valid Choice Try again")
OpenCoreInstallerMenu = True
print("Bye")
elif MainMenu=="3":
SMBIOSMenu=True
while SMBIOSMenu:
os.system('clear')
print(header)
print(" Enter a new SMBIOS")
print(header)
print("")
print(" Tip: Run this command on the machine to find the SMBIOS")
print("")
print(" system_profiler SPHardwareDataType | grep 'Model Identifier'")
print("")
SMBIOSOption = input('Please enter the SMBIOS of your machine (Press enter to exit): ')
if SMBIOSOption == "":
print("Exiting...")
SMBIOSMenu=False
MainMenu=True
else:
print("")
print(" New SMBIOS: %s" % SMBIOSOption)
print("")
SMBIOSMenuYN = input("Is this correct? (y/n)")
if SMBIOSMenuYN in {"y", "Y", "yes", "Yes"}:
SMBIOSMenu=False
BuildOpenCore.current_model = SMBIOSOption
MainMenu=True
CustomSMBIOS=True
elif MainMenu=="4":
CreditMenu=True
while CreditMenu:
os.system('clear')
print(header)
print(" Credits")
print(header)
print("")
print(" Many thanks to the following:")
print("")
print(" - Acidanthera: OpenCore, kexts and other tools")
print(" - DhinakG: Writing and maintaining this Patcher")
print(" - Khronokernel: Writing and maintaining this Patcher")
print(" - Syncretic: AAAMouSSE and telemetrap")
print(" - Slice: VoodooHDA")
print("")
CreditMenu = input(" Press any key to exit: ")
print("Returning to main menu...")
CreditMenu=False
MainMenu=True
elif MainMenu=="5":
print("\n Closing program...")
sys.exit(1)
else:
print("\n Not Valid Choice Try again")
MainMenu=True
OpenCoreLegacyPatcher().main_menu()

37
OpenCore-Patcher.spec Normal file
View File

@@ -0,0 +1,37 @@
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['OpenCore-Patcher.command'],
pathex=['/Users/dhinak/Documents/GitHub/Opencore-Legacy-Patcher'],
binaries=[],
datas=[('payloads', 'payloads'), ('Resources', 'Resources')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='OpenCore-Patcher',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True )
app = BUNDLE(exe,
name='OpenCore-Patcher.app',
icon=None,
bundle_identifier=None)

View File

@@ -1,399 +0,0 @@
# Commands for building the EFI and SMBIOS
from __future__ import print_function
from shutil import copy
from shutil import rmtree
from distutils.dir_util import copy_tree
import os
import json
import subprocess
import sys
import zipfile
from Resources import Versions
from Resources import ModelArray
# Allow py2 and 3 support
try:
input = raw_input
except NameError:
pass
# Find SMBIOS of machine
opencore_model = subprocess.Popen(["NVRAM", "4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:oem-product"], stdout=subprocess.PIPE).communicate()[0]
if opencore_model not in ("NVRAM: Error getting variable - '4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:oem-product': (iokit/common) data was not found"):
print("Detected OpenCore machine")
opencore_model = subprocess.Popen("nvram 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:oem-product".split(), stdout=subprocess.PIPE)
opencore_model = [line.strip().split(":oem-product ", 1)[1] for line in opencore_model.stdout.read().split("\n") if line.strip().startswith("4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:")][0]
current_model = opencore_model
else:
print("No OpenCore detected")
current_model = subprocess.Popen("system_profiler SPHardwareDataType".split(), stdout=subprocess.PIPE)
current_model = [line.strip().split(": ", 1)[1] for line in current_model.stdout.read().split("\n") if line.strip().startswith("Model Identifier")][0]
print("Current Model: %s" % current_model)
OCExist = False
def BuildEFI():
if not os.path.exists(Versions.build_path):
os.makedirs(Versions.build_path)
print("Created Build Folder")
else:
print("Build Folder already present, skipping")
# Copy OpenCore into Build Folder
if os.path.exists(Versions.opencore_path_build):
print("Deleting old copy of OpenCore zip")
os.remove(Versions.opencore_path_build)
if os.path.exists(Versions.opencore_path_done):
print("Deleting old copy of OpenCore folder")
rmtree(Versions.opencore_path_done)
print("")
print("- Adding OpenCore v%s" % Versions.opencore_version)
copy(Versions.opencore_path, Versions.build_path)
zipfile.ZipFile(Versions.opencore_path_build).extractall(Versions.build_path)
print("- Adding config.plist v%s" % Versions.opencore_version)
# Setup config.plist for editing
copy(Versions.plist_path, Versions.plist_path_build)
with open(Versions.plist_path_build_full, 'r') as file :
Versions.plist_data = file.read()
# Adding must have kexts
print("- Adding Lilu v%s" % Versions.lilu_version)
copy(Versions.lilu_path, Versions.kext_path_build)
print("- Adding WhateverGreen v%s" % Versions.whatevergreen_version)
copy(Versions.whatevergreen_path, Versions.kext_path_build)
if current_model in ModelArray.MacPro71:
print("- Adding RestrictEvents v%s" % Versions.restrictevents_version)
copy(Versions.restrictevents_path, Versions.kext_path_build)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--RestrictEvents-->",
"<true/><!--RestrictEvents-->"
)
# Checks for kexts
# CPU Kext Patches
if current_model in ModelArray.DualSocket:
print("- Adding AppleMCEReporterDisabler v%s" % Versions.mce_version)
copy(Versions.mce_path, Versions.kext_path_build)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--AppleMCEReporterDisabler-->",
"<true/><!--AppleMCEReporterDisabler-->"
)
if current_model in ModelArray.SSEEmulator:
print("- Adding AAAMouSSE v%s" % Versions.mousse_version)
copy(Versions.mousse_path, Versions.kext_path_build)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--AAAMouSSE-->",
"<true/><!--AAAMouSSE-->"
)
if current_model in ModelArray.MissingSSE42:
print("- Adding telemetrap v%s" % Versions.telemetrap_version)
copy(Versions.telemetrap_path, Versions.kext_path_build)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--telemetrap-->",
"<true/><!--telemetrap-->"
)
# Ethernet Patches
if current_model in ModelArray.EthernetNvidia:
print("- Adding nForceEthernet v%s" % Versions.nforce_version)
copy(Versions.nforce_path, Versions.kext_path_build)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--nForceEthernet-->",
"<true/><!--nForceEthernet-->"
)
if current_model in ModelArray.EthernetMarvell:
print("- Adding MarvelYukonEthernet v%s" % Versions.marvel_version)
copy(Versions.marvel_path, Versions.kext_path_build)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--MarvelYukonEthernet-->",
"<true/><!--MarvelYukonEthernet-->"
)
if current_model in ModelArray.EthernetBroadcom:
print("- Adding CatalinaBCM5701Ethernet v%s" % Versions.bcm570_version)
copy(Versions.bcm570_path, Versions.kext_path_build)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--CatalinaBCM5701Ethernet-->",
"<true/><!--CatalinaBCM5701Ethernet-->"
)
# Wifi Patches
if current_model in ModelArray.WifiAtheros:
print("- Adding IO80211HighSierra v%s" % Versions.io80211high_sierra_version)
copy(Versions.io80211high_sierra_path, Versions.kext_path_build)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--IO80211HighSierra-->",
"<true/><!--IO80211HighSierra-->"
)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--AirPortAtheros40-->",
"<true/><!--AirPortAtheros40-->"
)
#if current_model in ModelArray.WifiBCM94328:
# print("- Wifi patches currently unsupported")
#if current_model in ModelArray.WifiBCM94322:
# print("- Adding IO80211Mojave %s" % Versions.io80211mojave_version)
# copy(Versions.io80211mojave_path, Versions.kext_path_build)
# Versions.plist_data = Versions.plist_data.replace(
# "<false/><!--IO80211Mojave-->",
# "<true/><!--IO80211Mojave-->"
# )
# Versions.plist_data = Versions.plist_data.replace(
# "<false/><!--AirPortBrcm4331-->",
# "<true/><!--AirPortBrcm4331-->"
# )
#if current_model in ModelArray.WifiBCM943224:
# print("- Adding IO80211Mojave %s" % Versions.io80211mojave_version)
# copy(Versions.io80211mojave_path, Versions.kext_path_build)
# Versions.plist_data = Versions.plist_data.replace(
# "<false/><!--IO80211Mojave-->",
# "<true/><!--IO80211Mojave-->"
# )
# Versions.plist_data = Versions.plist_data.replace(
# "<false/><!--AirPortBrcm4331-->",
# "<true/><!--AirPortBrcm4331-->"
# )
if current_model in ModelArray.WifiBCM94331:
print("- Adding AirportBrcmFixup and appling fake ID")
copy(Versions.airportbcrmfixup_path, Versions.kext_path_build)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--AirportBrcmFixup-->",
"<true/><!--AirportBrcmFixup-->"
)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--AirPortBrcmNIC_Injector-->",
"<true/><!--AirPortBrcmNIC_Injector-->"
)
if current_model in ModelArray.EthernetNvidia:
# Nvidia chipsets all have the same path to ARPT
Versions.plist_data = Versions.plist_data.replace(
"#PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)",
"PciRoot(0x0)/Pci(0x15,0x0)/Pci(0x0,0x0)"
)
if current_model in ("MacBookAir2,1", "MacBookAir3,1", "MacBookAir3,2" ):
Versions.plist_data = Versions.plist_data.replace(
"#PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)",
"PciRoot(0x0)/Pci(0x15,0x0)/Pci(0x0,0x0)"
)
elif current_model in ("iMac7,1", "iMac8,1" ):
Versions.plist_data = Versions.plist_data.replace(
"#PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)",
"PciRoot(0x0)/Pci(0x1C,0x4)/Pci(0x0,0x0)"
)
elif current_model in ("iMac13,1", "iMac13,2"):
Versions.plist_data = Versions.plist_data.replace(
"#PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)",
"PciRoot(0x0)/Pci(0x1C,0x3)/Pci(0x0,0x0)"
)
elif current_model in ("MacPro5,1"):
Versions.plist_data = Versions.plist_data.replace(
"#PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)",
"PciRoot(0x0)/Pci(0x1C,0x5)/Pci(0x0,0x0)"
)
else:
# Assumes we have a laptop with Intel chipset
Versions.plist_data = Versions.plist_data.replace(
"#PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)",
"PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)"
)
if current_model in ModelArray.LegacyHID:
print("- Adding legacy IOHIDFamily Patch")
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--IOHIDFamily-->",
"<true/><!--IOHIDFamily-->"
)
if current_model in ModelArray.LegacyAudio:
print("- Adding VoodooHDA v%s" % Versions.voodoohda_version)
copy(Versions.voodoohda_path, Versions.kext_path_build)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--VoodooHDA-->",
"<true/><!--VoodooHDA-->"
)
if current_model in ModelArray.pciSSDT:
print("- Adding SSDT-CPBG")
copy(Versions.pci_ssdt_path, Versions.acpi_path_build)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--SSDT-CPBG-->",
"<true/><!--SSDT-CPBG-->"
)
usb_map_path = os.path.join(Versions.current_path, "payloads/Kexts/Maps/Zip/" "USB-Map-%s.zip" % current_model)
if os.path.exists(usb_map_path):
print("- Adding USB Map for %s" % current_model)
copy(usb_map_path, Versions.kext_path_build)
map_name = ("USB-Map-%s.kext" % current_model)
Versions.plist_data = Versions.plist_data.replace(
"<false/><!--USBmap-->",
"<true/><!--USBmap-->"
)
Versions.plist_data = Versions.plist_data.replace(
"USB-Map-SMBIOS.kext",
map_name
)
if current_model in ModelArray.DualGPUPatch:
print("- Adding dual GPU patch")
Versions.plist_data = Versions.plist_data.replace(
"debug=0x100",
"debug=0x100 agdpmod=pikera"
)
if current_model in ModelArray.HiDPIpicker:
print("- Setting HiDPI picker")
Versions.plist_data = Versions.plist_data.replace(
"<data>AQ==</data>",
"<data>Ag==</data>"
)
def BuildGUI():
print("- Adding OpenCanopy GUI")
rmtree(Versions.gui_path_build)
copy(Versions.gui_path, Versions.plist_path_build)
Versions.plist_data = Versions.plist_data.replace(
"#OpenCanopy.efi",
"OpenCanopy.efi"
)
def BuildSMBIOS():
# Set new SMBIOS
new_model = current_model
if current_model in ModelArray.MacBookAir61:
print("- Spoofing to MacBookAir6,1")
new_model = "MacBookAir6,1"
elif current_model in ModelArray.MacBookAir62:
print("- Spoofing to MacBookAir6,2")
new_model = "MacBookAir6,2"
elif current_model in ModelArray.MacBookPro111:
print("- Spoofing to MacBookPro11,1")
new_model = "MacBookPro11,1"
elif current_model in ModelArray.MacBookPro112:
print("- Spoofing to MacBookPro11,2")
new_model = "MacBookPro11,2"
elif current_model in ModelArray.Macmini71:
print("- Spoofing to Macmini7,1")
new_model = "Macmini7,1"
elif current_model in ModelArray.iMac151:
print("- Spoofing to iMac15,1")
new_model = "iMac15,1"
elif current_model in ModelArray.iMac144:
print("- Spoofing to iMac14,4")
new_model = "iMac14,4"
elif current_model in ModelArray.MacPro71:
print("- Spoofing to MacPro7,1")
new_model = "MacPro7,1"
# Grab serials from macserial
serialPatch = subprocess.Popen(["xattr", "-cr", "./payloads/tools/macserial"], stdout=subprocess.PIPE).communicate()[0]
print(serialPatch)
serialData = subprocess.Popen((r"./payloads/tools/macserial -g -m " + new_model + " -n 1").split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
serialData = serialData.stdout.read().strip().split(" | ")
# Patch SMBIOS
Versions.plist_data = Versions.plist_data.replace(
"iMac19,1",
new_model
)
if serialData == "['']":
# Used as a backup for when macserial fails
print("Failed to load macserial")
else:
# Patch Number Serial
Versions.plist_data = Versions.plist_data.replace(
"W00000000001",
serialData[0]
)
# Patch MLB
Versions.plist_data = Versions.plist_data.replace(
"M0000000000000001",
serialData[1]
)
# Patch UUID
uuidGen = subprocess.Popen(["uuidgen"], stdout=subprocess.PIPE).communicate()[0]
Versions.plist_data = Versions.plist_data.replace(
"00000000-0000-0000-0000-000000000000",
uuidGen
)
def SavePlist():
with open(Versions.plist_path_build_full, 'w') as file:
file.write(Versions.plist_data)
def CleanBuildFolder():
# Clean up Build Folder
print("")
print("Cleaning build folder")
os.chdir(Versions.kext_path_build)
for item in os.listdir(Versions.kext_path_build):
if item.endswith(".zip"):
file_name = os.path.abspath(item)
zip_ref = zipfile.ZipFile(file_name)
zip_ref.extractall(Versions.kext_path_build)
zip_ref.close()
os.remove(file_name)
# Clean up Python's unzip
if os.path.exists("__MACOSX"):
rmtree("__MACOSX")
os.chdir(Versions.plist_path_build)
os.chdir(Versions.plist_path_build)
for item in os.listdir(Versions.plist_path_build):
if item.endswith(".zip"):
file_name = os.path.abspath(item)
zip_ref = zipfile.ZipFile(file_name)
zip_ref.extractall(Versions.plist_path_build)
zip_ref.close()
os.remove(file_name)
if os.path.exists("__MACOSX"):
rmtree("__MACOSX")
os.chdir(Versions.build_path)
if os.path.exists("__MACOSX"):
rmtree("__MACOSX")
os.remove(Versions.opencore_path_build)
os.chdir(Versions.current_path)
def ListDiskutil():
DiskMenu = True
while DiskMenu:
os.system('clear')
print("Loading diskutil...(This may take some time)")
diskList = subprocess.Popen(["diskutil", "list"], stdout=subprocess.PIPE).communicate()[0]
print(diskList)
ChosenDisk = input('Please select the disk you want to install OpenCore to(ie. disk1): ')
ChosenDisk = ChosenDisk + "s1"
print("Trying to mount %s" % ChosenDisk)
diskMount = subprocess.Popen(["sudo", "diskutil", "mount", ChosenDisk], stdout=subprocess.PIPE).communicate()[0]
print(diskMount)
DiskMenu = input("Press any key to continue: ")
def MoveOpenCore():
print("")
efiVol = "/Volumes/EFI"
if os.path.exists(efiVol):
print("Coping OpenCore onto Volumes/EFI")
if os.path.exists("/Volumes/EFI/EFI"):
print("Cleaning EFI folder")
rmtree("/Volumes/EFI/EFI")
if os.path.exists(Versions.opencore_path_done):
copy_tree(Versions.opencore_path_done, efiVol)
copy(Versions.icon_path, efiVol)
print("OpenCore transfer complete")
print("")
else:
print("Couldn't find EFI partition")
print("Please ensure your drive is formatted as GUID Partition Table")
print("")
def MountOpenCore():
subprocess.Popen((r"sudo diskutil mount $(nvram 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:boot-path | sed 's/.*GPT,\([^,]*\),.*/\1/')").split())

View File

@@ -9,6 +9,7 @@ import os
import json
import subprocess
import sys
from pathlib import Path
# List build versions
opencore_version = "0.6.6"
@@ -29,33 +30,34 @@ restrictevents_version = "1.0.0"
# List current location
os.chdir(os.path.dirname(os.path.realpath(__file__)))
os.chdir("..")
current_path = os.getcwd()
resource_path = os.getcwd()
current_path = Path(sys.executable).parent
# Payload Location
# OpenCore
opencore_path = os.path.join(current_path, "payloads/OpenCore/" "OpenCore-v%s.zip" % opencore_version)
plist_path = os.path.join(current_path, "payloads/Config/v%s/" "config.plist" % opencore_version)
opencore_path = os.path.join(resource_path, "payloads/OpenCore/" "OpenCore-v%s.zip" % opencore_version)
plist_path = os.path.join(resource_path, "payloads/Config/v%s/" "config.plist" % opencore_version)
# ACPI
pci_ssdt_path = os.path.join(current_path, "payloads/ACPI/" "SSDT-CPBG.aml")
pci_ssdt_path = os.path.join(resource_path, "payloads/ACPI/" "SSDT-CPBG.aml")
# Drivers
nvme_driver_path = os.path.join(current_path, "payloads/Drivers/" "NvmExpressDxe.efi")
nvme_driver_path = os.path.join(resource_path, "payloads/Drivers/" "NvmExpressDxe.efi")
# Kexts
lilu_path = os.path.join(current_path, "payloads/Kexts/Acidanthera/" "Lilu-v%s.zip" % lilu_version)
whatevergreen_path = os.path.join(current_path, "payloads/Kexts/Acidanthera/" "WhateverGreen-v%s.zip" % whatevergreen_version)
airportbcrmfixup_path = os.path.join(current_path, "payloads/Kexts/Acidanthera/" "AirportBrcmFixup-v%s.zip" % airportbcrmfixup_version)
restrictevents_path = os.path.join(current_path, "payloads/Kexts/Acidanthera/" "RestrictEvents-v%s.zip" % restrictevents_version)
bcm570_path = os.path.join(current_path, "payloads/Kexts/Ethernet/" "CatalinaBCM5701Ethernet-v%s.zip" % bcm570_version)
marvel_path = os.path.join(current_path, "payloads/Kexts/Ethernet/" "MarvelYukonEthernet-v%s.zip" % marvel_version)
nforce_path = os.path.join(current_path, "payloads/Kexts/Ethernet/" "nForceEthernet-v%s.zip" % nforce_version)
mce_path = os.path.join(current_path, "payloads/Kexts/Misc/" "AppleMCEReporterDisabler-v%s.zip" % mce_version)
mousse_path = os.path.join(current_path, "payloads/Kexts/SSE/" "AAAMouSSE-v%s.zip" % mousse_version)
telemetrap_path = os.path.join(current_path, "payloads/Kexts/SSE/" "telemetrap-v%s.zip" % telemetrap_version)
io80211high_sierra_path = os.path.join(current_path, "payloads/Kexts/Wifi/" "IO80211HighSierra-v%s.zip" % io80211high_sierra_version)
io80211mojave_path = os.path.join(current_path, "payloads/Kexts/Wifi/" "IO80211Mojave-v%s.zip" % io80211mojave_version)
voodoohda_path = os.path.join(current_path, "payloads/Kexts/Audio/" "VoodooHDA-v%s.zip" % voodoohda_version)
lilu_path = os.path.join(resource_path, "payloads/Kexts/Acidanthera/" "Lilu-v%s.zip" % lilu_version)
whatevergreen_path = os.path.join(resource_path, "payloads/Kexts/Acidanthera/" "WhateverGreen-v%s.zip" % whatevergreen_version)
airportbcrmfixup_path = os.path.join(resource_path, "payloads/Kexts/Acidanthera/" "AirportBrcmFixup-v%s.zip" % airportbcrmfixup_version)
restrictevents_path = os.path.join(resource_path, "payloads/Kexts/Acidanthera/" "RestrictEvents-v%s.zip" % restrictevents_version)
bcm570_path = os.path.join(resource_path, "payloads/Kexts/Ethernet/" "CatalinaBCM5701Ethernet-v%s.zip" % bcm570_version)
marvel_path = os.path.join(resource_path, "payloads/Kexts/Ethernet/" "MarvelYukonEthernet-v%s.zip" % marvel_version)
nforce_path = os.path.join(resource_path, "payloads/Kexts/Ethernet/" "nForceEthernet-v%s.zip" % nforce_version)
mce_path = os.path.join(resource_path, "payloads/Kexts/Misc/" "AppleMCEReporterDisabler-v%s.zip" % mce_version)
mousse_path = os.path.join(resource_path, "payloads/Kexts/SSE/" "AAAMouSSE-v%s.zip" % mousse_version)
telemetrap_path = os.path.join(resource_path, "payloads/Kexts/SSE/" "telemetrap-v%s.zip" % telemetrap_version)
io80211high_sierra_path = os.path.join(resource_path, "payloads/Kexts/Wifi/" "IO80211HighSierra-v%s.zip" % io80211high_sierra_version)
io80211mojave_path = os.path.join(resource_path, "payloads/Kexts/Wifi/" "IO80211Mojave-v%s.zip" % io80211mojave_version)
voodoohda_path = os.path.join(resource_path, "payloads/Kexts/Audio/" "VoodooHDA-v%s.zip" % voodoohda_version)
# Build Location
opencore_path_build = os.path.join(current_path, "Build-Folder/" "OpenCore-v%s.zip" % opencore_version)
@@ -65,13 +67,13 @@ acpi_path_build = os.path.join(current_path, "Build-Folder/" "OpenCore-v%s/EFI/O
drivers_path_build = os.path.join(current_path, "Build-Folder/" "OpenCore-v%s/EFI/OC/Drivers" % opencore_version)
kext_path_build = os.path.join(current_path, "Build-Folder/" "OpenCore-v%s/EFI/OC/Kexts" % opencore_version)
opencore_path_done = os.path.join(current_path, "Build-Folder/" "OpenCore-v%s" % opencore_version)
build_path = os.path.join(current_path, r'Build-Folder/')
build_path = os.path.join(current_path, "Build-Folder/")
gui_path_build = os.path.join(current_path, "Build-Folder/" "OpenCore-v%s/EFI/OC/Resources" % opencore_version)
# Tools
macserial_path = os.path.join(current_path, "payloads/" "Tools")
macserial_path = os.path.join(resource_path, "payloads/" "Tools")
# Icons
app_icon_path = os.path.join(current_path, "OC-Patcher.icns")
icon_path = os.path.join(current_path, "payloads/Icon/" ".VolumeIcon.icns")
gui_path = os.path.join(current_path, "payloads/Icon/" "Resources.zip")
app_icon_path = os.path.join(resource_path, "OC-Patcher.icns")
icon_path = os.path.join(resource_path, "payloads/Icon/" ".VolumeIcon.icns")
gui_path = os.path.join(resource_path, "payloads/Icon/" "Resources.zip")

275
Resources/build.py Normal file
View File

@@ -0,0 +1,275 @@
# Commands for building the EFI and SMBIOS
from __future__ import print_function
import binascii
import plistlib
import re
import shutil
import subprocess
import uuid
import zipfile
from pathlib import Path
from Resources import ModelArray, Versions, utilities
class BuildOpenCore():
def __init__(self, model, version):
self.model = model
self.config = None
Versions.opencore_version = version
def build_efi(self):
utilities.cls()
if not Path(Versions.build_path).exists():
Path(Versions.build_path).mkdir()
print("Created build folder")
else:
print("Build folder already present, skipping")
if Path(Versions.opencore_path_build).exists():
print("Deleting old copy of OpenCore zip")
Path(Versions.opencore_path_build).unlink()
if Path(Versions.opencore_path_done).exists():
print("Deleting old copy of OpenCore folder")
shutil.rmtree(Versions.opencore_path_done)
print()
print("- Adding OpenCore v" + Versions.opencore_version)
shutil.copy(Versions.opencore_path, Versions.build_path)
zipfile.ZipFile(Versions.opencore_path_build).extractall(Versions.build_path)
print("- Adding config.plist for OpenCore")
# Setup config.plist for editing
shutil.copy(Versions.plist_path, Versions.plist_path_build)
self.config = plistlib.load(Path(Versions.plist_path_build_full).open("rb"))
for name, version, path, check in [
# Essential kexts
("Lilu.kext", Versions.lilu_version, Versions.lilu_path, lambda: True),
("WhateverGreen.kext", Versions.whatevergreen_version, Versions.whatevergreen_path, lambda: True),
("RestrictEvents.kext", Versions.restrictevents_version, Versions.restrictevents_path, lambda: self.model in ModelArray.MacPro71),
# CPU patches
("AppleMCEReporterDisabler.kext", Versions.mce_version, Versions.mce_path, lambda: self.model in ModelArray.DualSocket),
("AAAMouSSE.kext", Versions.mousse_version, Versions.mousse_path, lambda: self.model in ModelArray.SSEEmulator),
("telemetrap.kext", Versions.telemetrap_version, Versions.telemetrap_path, lambda: self.model in ModelArray.MissingSSE42),
# Ethernet patches
("nForceEthernet.kext", Versions.nforce_version, Versions.nforce_path, lambda: self.model in ModelArray.EthernetNvidia),
("MarvelYukonEthernet.kext", Versions.marvel_version, Versions.marvel_path, lambda: self.model in ModelArray.EthernetMarvell),
("CatalinaBCM5701Ethernet.kext", Versions.bcm570_version, Versions.bcm570_path, lambda: self.model in ModelArray.EthernetBroadcom),
# Legacy audio
("VoodooHDA.kext", Versions.voodoohda_version, Versions.voodoohda_path, lambda: self.model in ModelArray.LegacyAudio)
]:
self.enable_kext(name, version, path, check)
# WiFi patches
if self.model in ModelArray.WifiAtheros:
self.enable_kext("IO80211HighSierra.kext", Versions.io80211high_sierra_version, Versions.io80211high_sierra_path)
self.get_kext_by_bundle_path("IO80211HighSierra.kext/Contents/PlugIns/AirPortAtheros40.kext")["Enabled"] = True
if self.model in ModelArray.WifiBCM94331:
self.enable_kext("AirportBrcmFixup.kext", Versions.airportbcrmfixup_version, Versions.airportbcrmfixup_path)
self.get_kext_by_bundle_path("AirportBrcmFixup.kext/Contents/PlugIns/AirPortBrcmNIC_Injector.kext")["Enabled"] = True
if self.model in ModelArray.EthernetNvidia:
# Nvidia chipsets all have the same path to ARPT
property_path = "PciRoot(0x0)/Pci(0x15,0x0)/Pci(0x0,0x0)"
if self.model in ("MacBookAir2,1", "MacBookAir3,1", "MacBookAir3,2"):
property_path = "PciRoot(0x0)/Pci(0x15,0x0)/Pci(0x0,0x0)"
elif self.model in ("iMac7,1", "iMac8,1"):
property_path = "PciRoot(0x0)/Pci(0x1C,0x4)/Pci(0x0,0x0)"
elif self.model in ("iMac13,1", "iMac13,2"):
property_path = "PciRoot(0x0)/Pci(0x1C,0x3)/Pci(0x0,0x0)"
elif self.model in ("MacPro5,1"):
property_path = "PciRoot(0x0)/Pci(0x1C,0x5)/Pci(0x0,0x0)"
else:
# Assumes we have a laptop with Intel chipset
property_path = "PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)"
print("- Applying fake ID for WiFi")
self.config["DeviceProperties"]["Add"][property_path] = {
"device-id": binascii.unhexlify("ba430000"),
"compatible": "pci14e4,43ba"
}
# HID patches
if self.model in ModelArray.LegacyHID:
print("- Adding IOHIDFamily patch")
self.get_item_by_kv(self.config["Kernel"]["Patch"], "Identifier", "com.apple.iokit.IOHIDFamily")["Enabled"] = True
# SSDT patches
if self.model in ModelArray.pciSSDT:
print("- Adding SSDT-CPBG.aml")
self.get_item_by_kv(self.config["ACPI"]["Add"], "Path", "SSDT-CPBG.aml")["Enabled"] = True
# USB map
map_name = f"USB-Map-{self.model}.zip"
map_entry = f"USB-Map-{self.model}.kext"
usb_map_path = Path(Versions.current_path) / Path(f"payloads/Kexts/Maps/Zip/{map_name}")
if usb_map_path.exists():
print(f"- Adding {map_entry}")
shutil.copy(usb_map_path, Versions.kext_path_build)
self.get_kext_by_bundle_path("USB-Map-SMBIOS.kext")["Enabled"] = True
self.get_kext_by_bundle_path("USB-Map-SMBIOS.kext")["BundlePath"] = map_entry
if self.model in ModelArray.DualGPUPatch:
print("- Adding dual GPU patch")
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " agdpmod=pikera"
if self.model in ModelArray.HiDPIpicker:
print("- Setting HiDPI picker")
self.config["NVRAM"]["Add"]["4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14"]["UIScale"] = binascii.unhexlify("02")
# Add OpenCanopy
print("- Adding OpenCanopy GUI")
shutil.rmtree(Versions.gui_path_build)
shutil.copy(Versions.gui_path, Versions.plist_path_build)
self.config["UEFI"]["Drivers"] = ["OpenCanopy.efi", "OpenRuntime.efi"]
plistlib.dump(self.config, Path(Versions.plist_path_build_full).open("wb"), sort_keys=True)
def set_smbios(self):
spoofed_model = self.model
if self.model in ModelArray.MacBookAir61:
print("- Spoofing to MacBookAir6,1")
spoofed_model = "MacBookAir6,1"
elif self.model in ModelArray.MacBookAir62:
print("- Spoofing to MacBookAir6,2")
spoofed_model = "MacBookAir6,2"
elif self.model in ModelArray.MacBookPro111:
print("- Spoofing to MacBookPro11,1")
spoofed_model = "MacBookPro11,1"
elif self.model in ModelArray.MacBookPro112:
print("- Spoofing to MacBookPro11,2")
spoofed_model = "MacBookPro11,2"
elif self.model in ModelArray.Macmini71:
print("- Spoofing to Macmini7,1")
spoofed_model = "Macmini7,1"
elif self.model in ModelArray.iMac151:
print("- Spoofing to iMac15,1")
spoofed_model = "iMac15,1"
elif self.model in ModelArray.iMac144:
print("- Spoofing to iMac14,4")
spoofed_model = "iMac14,4"
elif self.model in ModelArray.MacPro71:
print("- Spoofing to MacPro7,1")
spoofed_model = "MacPro7,1"
macserial_output = subprocess.run((f"./payloads/tools/macserial -g -m {spoofed_model} -n 1").split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
macserial_output = macserial_output.stdout.decode().strip().split(" | ")
self.config["PlatformInfo"]["Generic"]["SystemProductName"] = spoofed_model
self.config["PlatformInfo"]["Generic"]["SystemSerialNumber"] = macserial_output[0]
self.config["PlatformInfo"]["Generic"]["MLB"] = macserial_output[1]
self.config["PlatformInfo"]["Generic"]["SystemUUID"] = str(uuid.uuid4()).upper()
@staticmethod
def get_item_by_kv(iterable, key, value):
item = None
for i in iterable:
if i[key] == value:
item = i
break
return item
def get_kext_by_bundle_path(self, bundle_path):
kext = self.get_item_by_kv(self.config["Kernel"]["Add"], "BundlePath", bundle_path)
if not kext:
print(f"- Could not find kext {bundle_path}!")
raise IndexError
return kext
def enable_kext(self, kext_name, kext_version, kext_path, check=False):
kext = self.get_kext_by_bundle_path(kext_name)
if callable(check) and not check():
# Check failed
return
print(f"- Adding {kext_name} {kext_version}")
shutil.copy(kext_path, Versions.kext_path_build)
kext["Enabled"] = True
def cleanup(self):
print("- Cleaning up files")
for kext in Path(Versions.kext_path_build).glob("*.zip"):
with zipfile.ZipFile(kext) as zip_file:
zip_file.extractall(Versions.kext_path_build)
kext.unlink()
shutil.rmtree((Path(Versions.kext_path_build) / Path("__MACOSX")), ignore_errors=True)
for item in Path(Versions.plist_path_build).glob("*.zip"):
with zipfile.ZipFile(item) as zip_file:
zip_file.extractall(Versions.plist_path_build)
item.unlink()
shutil.rmtree((Path(Versions.build_path) / Path("__MACOSX")), ignore_errors=True)
Path(Versions.opencore_path_build).unlink()
def build_opencore(self):
self.build_efi()
self.set_smbios()
self.cleanup()
print("")
print("Your OpenCore EFI has been built at:")
print(f" {Versions.opencore_path_done}")
print("")
input("Press enter to go back")
@staticmethod
def copy_efi():
diskutil = [subprocess.run("diskutil list".split(), stdout=subprocess.PIPE).stdout.decode().strip()]
menu = utilities.TUIMenu(["Select Disk"], "Please select the disk you want to install OpenCore to: ", in_between=diskutil, return_number_instead_of_direct_call=True, add_quit=False)
for disk in [i for i in Path("/dev").iterdir() if re.fullmatch("disk[0-9]+", i.stem)]:
menu.add_menu_option(disk.stem, key=disk.stem[4:])
disk_num = menu.start()
print(subprocess.run(("sudo diskutil mount disk" + disk_num).split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout)
utilities.cls()
utilities.header(["Copying OpenCore"])
efi_dir = Path("/Volumes/EFI")
if efi_dir.exists():
print("- Coping OpenCore onto EFI partition")
if (efi_dir / Path("EFI")).exists():
print("Removing preexisting EFI folder")
shutil.rmtree(efi_dir / Path("EFI"))
if Path(Versions.opencore_path_done).exists():
shutil.copytree(Versions.opencore_path_done, efi_dir)
shutil.copy(Versions.icon_path, efi_dir)
print("OpenCore transfer complete")
print("")
else:
print("Couldn't find EFI partition")
print("Please ensure your drive is formatted as GUID Partition Table")
print("")
class OpenCoreMenus():
def __init__(self):
self.version = Versions.opencore_version
def change_opencore_version(self):
utilities.cls()
utilities.header(["Change OpenCore Version"])
print(f"\nCurrent OpenCore version: {self.version}\nSupported versions: 0.6.3, 0.6.4")
version = input("Please enter the desired OpenCore version: ").strip()
if version:
self.version = version
def build_opencore_menu(self, model):
response = None
while not (response and response == -1):
title = [
f"Build OpenCore v{self.version} EFI",
"Selected Model: " + model
]
menu = utilities.TUIMenu(title, "Please select an option: ", auto_number=True)
options = [
["Build OpenCore", lambda: BuildOpenCore(model, self.version).build_opencore()],
["Change OpenCore Version", self.change_opencore_version],
]
for option in options:
menu.add_menu_option(option[0], function=option[1])
response = menu.start()
# response = utilities.menu(title, "zoomer, Please select an option: ", options, auto_number=True, top_level=True)

114
Resources/utilities.py Normal file
View File

@@ -0,0 +1,114 @@
from __future__ import print_function
import os
import math as m
def header(lines):
lines = [i for i in lines if i is not None]
total_length = len(max(lines, key=len)) + 4
print("#" * (total_length))
for line in lines:
left_side = m.floor(((total_length - 2 - len(line.strip())) / 2))
print("#" + " " * left_side + line.strip() + " " * (total_length - len("#" + " " * left_side + line.strip()) - 1) + "#")
print("#" * total_length)
def cls():
os.system('cls' if os.name == 'nt' else 'clear')
# def menu(title, prompt, menu_options, add_quit=True, auto_number=False, in_between=[], top_level=False):
# return_option = ["Q", "Quit", None] if top_level else ["B", "Back", None]
# if add_quit: menu_options.append(return_option)
# cls()
# header(title)
# print()
# for i in in_between: print(i)
# if in_between: print()
# for index, option in enumerate(menu_options):
# if auto_number and not (index == (len(menu_options) - 1) and add_quit):
# option[0] = str((index + 1))
# print(option[0] + ". " + option[1])
# print()
# selected = input(prompt)
# keys = [option[0].upper() for option in menu_options]
# if not selected or selected.upper() not in keys:
# return
# if selected.upper() == return_option[0]:
# return -1
# else:
# menu_options[keys.index(selected.upper())][2]() if menu_options[keys.index(selected.upper())][2] else None
class TUIMenu():
def __init__(self, title, prompt, options=None, return_number_instead_of_direct_call=False, add_quit=True, auto_number=False, in_between=None, top_level=False):
self.title = title
self.prompt = prompt
self.in_between = in_between or []
self.options = options or []
self.return_number_instead_of_direct_call = return_number_instead_of_direct_call
self.auto_number = auto_number
self.add_quit = add_quit
self.top_level = top_level
def add_menu_option(self, name, description="", function=None, key=""):
self.options.append([key, name, description, function])
def start(self):
return_option = ["Q", "Quit"] if self.top_level else ["B", "Back"]
if self.add_quit:
self.add_menu_option(
return_option[1], function=None, key=return_option[0])
cls()
header(self.title)
print()
for i in self.in_between:
print(i)
if self.in_between:
print()
for index, option in enumerate(self.options):
if self.auto_number and not (index == (len(self.options) - 1) and self.add_quit):
option[0] = str((index + 1))
print(option[0] + ". " + option[1])
for i in option[2]:
print("\t" + i)
print()
selected = input(self.prompt)
keys = [option[0].upper() for option in self.options]
if not selected or selected.upper() not in keys:
return
if self.add_quit and selected.upper() == return_option[0]:
return -1
elif self.return_number_instead_of_direct_call:
return self.options[keys.index(selected.upper())][0]
else:
self.options[keys.index(selected.upper())][3]() if self.options[keys.index(selected.upper())][3] else None
class TUIOnlyPrint():
def __init__(self, title, prompt, in_between=None):
self.title = title
self.prompt = prompt
self.in_between = in_between or []
def start(self):
cls()
header(self.title)
print()
for i in self.in_between:
print(i)
if self.in_between:
print()
input(self.prompt)