Merge branch 'main' into main

This commit is contained in:
Mykola Grymalyuk
2023-03-28 14:15:56 -06:00
committed by GitHub
45 changed files with 1827 additions and 1423 deletions
+27 -3
View File
@@ -1,5 +1,17 @@
# OpenCore Legacy Patcher changelog
## 0.6.3
- Update non-Metal Binaries:
- Resolves Safari 16.4 rendering issue
- Resolves left side menubar selections
- Implements automatic menubar text color
- New Menubar implementation can be disabled via `defaults write -g Amy.MenuBar2Beta -bool false`
- Implement full IOUSBHostFamily downgrade for UHCI/OHCI
- Resolves panics on certain iMac models
- Resolve unused KDKs not being properly cleaned up
- Increment Binaries:
- PatcherSupportPkg 0.9.2 - release
## 0.6.2
- Work around Black Box rendering issues on certain Display Color Profiles
- Limited to Ventura currently due to limitations with other color profiles
@@ -19,14 +31,21 @@
- Fixed System Settings hover effects, including Bluetooth connect button
- Add Books hacks (reimplement cover image generation, disable broken page curl animation)
- Fixed unresponsive buttons
- Implement Hardware Encoding support for AMD Polaris and Vega GPUs
- Implement Hardware Encoding support for AMD GCN 1-3, Polaris and Vega GPUs
- Applicable for pre-Haswell Macs on macOS Ventura
- Resolves DRM playback issues on Netflix, Disney+, etc.
- Note: GCN 1-3 DRM is functional, however hardware video encoding is still experimental
- AppleTV+ may be unstable due to this
- Implement support for AMD Navi and Lexa MXM GPUs in 2009-2011 iMacs
- Primarily applicable for MXM 3.0 variants of AMD WX3200 (0x6981) and AMD RX5500XT (0x7340)
- Credit to [Ausdauersportler](https://github.com/Ausdauersportler) for implementation
- Implement Continuity Camera Unlocking for pre-Kaby Lake CPUs
- Applicable for all legacy Macs in macOS Ventura
- Resolve boot support for 3802-based GPUs with macOS 13.3
- Applicable for following GPUs:
- Intel Ivy Bridge and Haswell iGPUs
- Nvidia Kepler dGPUs
- Note: patchset now requires AMFI to be disabled, patchset still in active development to remove this requirement
- Backend Changes:
- Refactored kdk_handler.py
- Prioritizes KdkSupportPkg repository for downloads
@@ -34,7 +53,7 @@
- Support local loose matching when no network connection is available
- Implement pkg receipt verification to validate integrity of KDKs
- Implemented logging framework usage for more reliable logging
- Logs are stored under `~/OpenCore-Patcher.log`
- Logs are stored under `~/Library/Logs/OpenCore-Patcher.log`
- Subsequent runs are appended to the log, allowing for easy debugging
- Implemented new network_handler.py module
- Allows for more reliable network calls and downloads
@@ -54,9 +73,14 @@
- pyinstaller - 5.7.0
- packaging - 23.0
- Increment Binaries:
- PatcherSupportPkg 0.8.4 - release
- PatcherSupportPkg 0.8.7 - release
- AutoPkgInstaller 1.0.2 - release
- FeatureUnlock 1.1.4 - rolling (0e8d87f)
- Lilu 1.6.4 - release
- WhateverGreen 1.6.4 - release
- NVMeFix 1.1.0 - release
- Innie 1.3.1 - release
- OpenCorePkg 0.9.0 - release
## 0.6.1
- Avoid usage of KDKlessWorkaround on hardware not requiring it
+1163 -1120
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -2699,6 +2699,8 @@
<true/>
<key>ResizeGpuBars</key>
<integer>-1</integer>
<key>ResizeUsePciRbIo</key>
<false/>
<key>TscSyncTimeout</key>
<integer>0</integer>
<key>UnblockFsConnect</key>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+253
View File
@@ -0,0 +1,253 @@
#!/usr/bin/env python3
import os
import subprocess
from pathlib import Path
import requests
import packaging.version
import tempfile
# For kexts with basic handling requirements
KEXT_DICTIONARY = {
"Acidanthera": {
"AirportBrcmFixup": {
"Repository": "https://github.com/acidanthera/AirportBrcmFixup",
"Constants Variable": "self.airportbcrmfixup_version",
},
# Due to issues with legacy Macs, don't update
# "AppleALC": {
# "Repository": "https://github.com/acidanthera/AppleALC",
# "Constants Variable": "self.applealc_version",
# },
"BlueToolFixup": {
"Repository": "https://github.com/acidanthera/BrcmPatchRAM",
"Constants Variable": "self.bluetoolfixup_version",
"Override": "BrcmPatchRAM",
},
"CPUFriend": {
"Repository": "https://github.com/acidanthera/CPUFriend",
"Constants Variable": "self.cpufriend_version",
},
"CryptexFixup": {
"Repository": "https://github.com/acidanthera/CryptexFixup",
"Constants Variable": "self.cryptexfixup_version",
},
"DebugEnhancer": {
"Repository": "https://github.com/acidanthera/DebugEnhancer",
"Constants Variable": "self.debugenhancer_version",
},
"FeatureUnlock": {
"Repository": "https://github.com/acidanthera/FeatureUnlock",
"Constants Variable": "self.featureunlock_version",
},
"Lilu": {
"Repository": "https://github.com/acidanthera/Lilu",
"Constants Variable": "self.lilu_version",
},
"NVMeFix": {
"Repository": "https://github.com/acidanthera/NVMeFix",
"Constants Variable": "self.nvmefix_version",
},
"RestrictEvents": {
"Repository": "https://github.com/acidanthera/RestrictEvents",
"Constants Variable": "self.restrictevents_version",
},
"RSRHelper": {
"Repository": "https://github.com/khronokernel/RSRHelper",
"Constants Variable": "self.rsrhelper_version",
},
"WhateverGreen": {
"Repository": "https://github.com/acidanthera/WhateverGreen",
"Constants Variable": "self.whatevergreen_version",
},
},
"Misc": {
"Innie": {
"Repository": "https://github.com/cdf/Innie",
"Constants Variable": "self.innie_version",
},
},
}
class GenerateKexts:
def __init__(self):
self.weg_version = None
self.weg_old = None
self.lilu_version = None
self._set_cwd()
self._iterate_over_kexts()
self._special_kext_handling()
def _set_cwd(self):
# Set working directory to script location
script_path = Path(__file__).parent.absolute()
os.chdir(script_path)
def _special_kext_handling(self):
# Generate custom WhateverGreen
if self.weg_version is None or self.lilu_version is None or self.weg_old is None:
raise Exception("Unable to find latest WEG version!")
if packaging.version.parse(self.weg_version) <= packaging.version.parse(self.weg_old):
print(" WEG is up to date!")
return
# WhateverGreen
print("Building modified WhateverGreen...")
# We have to compile WEG ourselves
weg_source_url = f"https://github.com/acidanthera/WhateverGreen/archive/refs/tags/{self.weg_version}.zip"
lilu_url = f"https://github.com/acidanthera/Lilu/releases/download/{self.lilu_version}/Lilu-{self.lilu_version}-DEBUG.zip"
with tempfile.TemporaryDirectory() as temp_dir:
# Download source
weg_source_zip = f"{temp_dir}/WhateverGreen-{self.weg_version}.zip"
subprocess.run(["curl", "-L", weg_source_url, "-o", weg_source_zip], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# Unzip source
subprocess.run(["unzip", weg_source_zip, "-d", temp_dir], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# Git clone MacKernelSDK into source
subprocess.run(["git", "clone", "https://github.com/acidanthera/MacKernelSDK", f"{temp_dir}/WhateverGreen-{self.weg_version}/MacKernelSDK"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# Grab latest Lilu release, debug version
lilu_zip = f"{temp_dir}/Lilu-{self.lilu_version}-DEBUG.zip"
subprocess.run(["curl", "-L", lilu_url, "-o", lilu_zip], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# Unzip Lilu into WEG source
subprocess.run(["unzip", lilu_zip, "-d", f"{temp_dir}/WhateverGreen-{self.weg_version}"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# Apply patch
patch_path = Path("./Acidanthera/WhateverGreen-Navi-Backlight.patch").absolute()
subprocess.run(["git", "apply", patch_path], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=f"{temp_dir}/WhateverGreen-{self.weg_version}")
# Build WEG
for variant in ["Release", "Debug"]:
subprocess.run(["xcodebuild", "-configuration", variant], cwd=f"{temp_dir}/WhateverGreen-{self.weg_version}", check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# Zip Release
for variant in ["RELEASE", "DEBUG"]:
dst_path = Path(f"./Acidanthera/WhateverGreen-v{self.weg_version}-Navi-{variant}.zip").absolute()
subprocess.run(["zip", "-r", dst_path, "WhateverGreen.kext"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=f"{temp_dir}/WhateverGreen-{self.weg_version}/build/{'Release' if variant == 'RELEASE' else 'Debug'}")
if Path(f"./Acidanthera/WhateverGreen-v{self.weg_old}-Navi-{variant}.zip").exists():
subprocess.run(["rm", f"./Acidanthera/WhateverGreen-v{self.weg_old}-Navi-{variant}.zip"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
self._update_constants_file("self.whatevergreen_navi_version", f"{self.weg_old}-Navi", f"{self.weg_version}-Navi")
def _iterate_over_kexts(self):
for kext_folder in KEXT_DICTIONARY:
for kext_name in KEXT_DICTIONARY[kext_folder]:
print(f"Checking {kext_name}...")
if "Override" in KEXT_DICTIONARY[kext_folder][kext_name]:
self._get_latest_release(kext_folder, kext_name, override_kext_zip_name=KEXT_DICTIONARY[kext_folder][kext_name]["Override"])
else:
self._get_latest_release(kext_folder, kext_name)
def _get_latest_release(self, kext_folder, kext_name, override_kext_zip_name=None):
# Get latest release from GitHub API
repo_url = KEXT_DICTIONARY[kext_folder][kext_name]["Repository"].replace("https://github.com", "https://api.github.com/repos")
latest_release = requests.get(f"{repo_url}/releases/latest").json()
for variant in ["RELEASE", "DEBUG"]:
if "tag_name" not in latest_release:
print(f" Error: {latest_release['message']}")
continue
remote_version = latest_release["tag_name"]
if remote_version.startswith("v"):
remote_version = remote_version[1:]
if kext_name == "WhateverGreen":
self.weg_version = remote_version
elif kext_name == "Lilu":
self.lilu_version = remote_version
local_version = self._get_local_version(kext_folder, kext_name, variant)
if kext_name == "WhateverGreen":
self.weg_old = local_version
if packaging.version.parse(remote_version) <= packaging.version.parse(local_version):
print(f" {kext_name} {variant} is up to date: v{local_version}")
continue
for asset in latest_release["assets"]:
if not asset["name"].endswith(f"{variant}.zip"):
continue
print(f" Downloading {kext_name} {variant}: v{remote_version}...")
zip_name = f"{override_kext_zip_name}-v{remote_version}-{variant}.zip" if override_kext_zip_name else f"{kext_name}-v{remote_version}-{variant}.zip"
self._download_file(asset["browser_download_url"], f"./{kext_folder}/{zip_name}", f"{kext_name}.kext")
if Path(f"./{kext_folder}/{zip_name}").exists():
subprocess.run(["rm", "-rf", f"./{kext_folder}/{zip_name.replace(f'v{remote_version}', f'v{local_version}')}"])
self._update_constants_file(KEXT_DICTIONARY[kext_folder][kext_name]["Constants Variable"], local_version, remote_version)
if override_kext_zip_name:
# rename zip file
os.rename(f"./{kext_folder}/{zip_name}", f"./{kext_folder}/{kext_name}-v{remote_version}-{variant}.zip")
subprocess.run(["rm", "-rf", f"./{kext_folder}/{kext_name}-v{local_version}-{variant}.zip"])
def _get_local_version(self, kext_folder, kext_name, variant):
loose_name_start = f"{kext_name}-v"
loose_name_end = f"-{variant}.zip"
for file in Path(f"./{kext_folder}").iterdir():
if file.name.startswith(loose_name_start) and file.name.endswith(loose_name_end):
local_version = file.name.replace(loose_name_start, "").replace(loose_name_end, "")
if local_version.startswith("v"):
local_version = local_version[1:]
return local_version[:5]
raise Exception(f"Could not find local version for {kext_name} {variant}")
def _download_file(self, url, file_path, file):
# Download file
if Path(file_path).exists():
os.remove(file_path)
with tempfile.TemporaryDirectory() as temp_dir:
download = requests.get(url)
with open(f"{temp_dir}/temp.zip", "wb") as f:
f.write(download.content)
# Unzip file
subprocess.run(["unzip", "-q", f"{temp_dir}/temp.zip", "-d", f"{temp_dir}"], check=True)
print(f" Moving {file} to {file_path}...")
# Zip file
subprocess.run(["zip", "-q", "-r", Path(file_path).name, file], cwd=f"{temp_dir}", check=True)
# Move file
subprocess.run(["mv", f"{temp_dir}/{Path(file_path).name}", file_path], check=True)
def _update_constants_file(self, variable_name, old_version, new_version):
print(f" Updating {variable_name} to {new_version}...")
constants_file = Path("../../resources/constants.py")
if not constants_file.exists():
raise Exception("Constants file does not exist")
constants_file_contents = constants_file.read_text()
# Replace version
for line in constants_file_contents.splitlines():
if variable_name in line:
constants_file_contents = constants_file_contents.replace(line, line.replace(old_version, new_version))
break
# Write file
constants_file.write_text(constants_file_contents)
if __name__ == '__main__':
GenerateKexts()
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8 -8
View File
@@ -28,7 +28,7 @@ class AmfiConfigurationDetection:
"""
def __init__(self):
def __init__(self) -> None:
self.AMFI_ALLOW_TASK_FOR_PID: bool = False
self.AMFI_ALLOW_INVALID_SIGNATURE: bool = False
self.AMFI_LV_ENFORCE_THIRD_PARTY: bool = False
@@ -45,7 +45,7 @@ class AmfiConfigurationDetection:
self._parse_oclp_configuration()
def _init_nvram_dicts(self):
def _init_nvram_dicts(self) -> None:
"""
Initialize the boot-args and OCLP-Settings NVRAM dictionaries
"""
@@ -60,7 +60,7 @@ class AmfiConfigurationDetection:
self.oclp_args = oclp_args.split(" ")
def _parse_amfi_bitmask(self):
def _parse_amfi_bitmask(self) -> None:
"""
Parse the AMFI bitmask from boot-args
See data/amfi_data.py for more information
@@ -96,7 +96,7 @@ class AmfiConfigurationDetection:
self.AMFI_ALLOW_INVALID_SIGNATURE = True
def _parse_amfi_boot_args(self):
def _parse_amfi_boot_args(self) -> None:
"""
Parse the AMFI boot-args
"""
@@ -121,7 +121,7 @@ class AmfiConfigurationDetection:
self.AMFI_ALLOW_INVALID_SIGNATURE = True
def _parse_oclp_configuration(self):
def _parse_oclp_configuration(self) -> None:
"""
Parse the OCLP configuration
"""
@@ -130,16 +130,16 @@ class AmfiConfigurationDetection:
self.SKIP_LIBRARY_VALIDATION = True
def check_config(self, level: int):
def check_config(self, level: int) -> bool:
"""
Check the AMFI configuration based on provided AMFI level
See AmfiConfigLevel enum for valid levels
Parameters:
level (int): The level of AMFI checks to check for
level (int): The level of AMFI checks to check for
Returns:
bool: True if the AMFI configuration matches the level, False otherwise
bool: True if the AMFI configuration matches the level, False otherwise
"""
if level == AmfiConfigDetectLevel.NO_CHECK:
+7 -11
View File
@@ -12,7 +12,7 @@ from data import model_array
# Generic building args
class arguments:
def __init__(self, global_constants: constants.Constants):
def __init__(self, global_constants: constants.Constants) -> None:
self.constants: constants.Constants = global_constants
self.args = utilities.check_cli_args()
@@ -20,7 +20,7 @@ class arguments:
self._parse_arguments()
def _parse_arguments(self):
def _parse_arguments(self) -> None:
"""
Parses arguments passed to the patcher
"""
@@ -46,7 +46,7 @@ class arguments:
return
def _validation_handler(self):
def _validation_handler(self) -> None:
"""
Enter validation mode
"""
@@ -54,7 +54,7 @@ class arguments:
validation.PatcherValidation(self.constants)
def _sys_patch_handler(self):
def _sys_patch_handler(self) -> None:
"""
Start root volume patching
"""
@@ -71,7 +71,7 @@ class arguments:
sys_patch.PatchSysVolume(self.constants.custom_model or self.constants.computer.real_model, self.constants, None).start_patch()
def _sys_unpatch_handler(self):
def _sys_unpatch_handler(self) -> None:
"""
Start root volume unpatching
"""
@@ -79,7 +79,7 @@ class arguments:
sys_patch.PatchSysVolume(self.constants.custom_model or self.constants.computer.real_model, self.constants, None).start_unpatch()
def _sys_patch_auto_handler(self):
def _sys_patch_auto_handler(self) -> None:
"""
Start root volume auto patching
"""
@@ -88,7 +88,7 @@ class arguments:
sys_patch_auto.AutomaticSysPatch(self.constants).start_auto_patch()
def _build_handler(self):
def _build_handler(self) -> None:
"""
Start config building process
"""
@@ -109,10 +109,6 @@ If you plan to create the USB for another machine, please select the "Change Mod
logging.info(f"- Using detected model: {self.constants.computer.real_model}")
defaults.GenerateDefaults(self.constants.custom_model, True, self.constants)
if self.args.disk:
logging.info(f"- Install Disk set: {self.args.disk}")
self.constants.disk = self.args.disk
if self.args.verbose:
logging.info("- Set verbose configuration")
self.constants.verbose_debug = True
+3 -3
View File
@@ -5,7 +5,7 @@ import plistlib
class ParseCommitInfo:
def __init__(self, binary_path: str):
def __init__(self, binary_path: str) -> None:
"""
Parameters:
binary_path (str): Path to binary
@@ -15,7 +15,7 @@ class ParseCommitInfo:
self.plist_path = self._convert_binary_path_to_plist_path()
def _convert_binary_path_to_plist_path(self):
def _convert_binary_path_to_plist_path(self) -> str or None:
"""
Resolve Info.plist path from binary path
"""
@@ -27,7 +27,7 @@ class ParseCommitInfo:
return None
def generate_commit_info(self):
def generate_commit_info(self) -> tuple:
"""
Generate commit info from Info.plist
+154 -153
View File
@@ -1,5 +1,5 @@
# pylint: disable=multiple-statements
# Define Files
# Defines versioning, file paths and other settings for the patcher
# Copyright (C) 2020-2023, Dhinak G, Mykola Grymalyuk
from pathlib import Path
@@ -10,212 +10,217 @@ from data import os_data
class Constants:
def __init__(self):
def __init__(self) -> None:
# Patcher Versioning
self.patcher_version = "0.6.2" # OpenCore-Legacy-Patcher
self.patcher_support_pkg_version = "0.8.5" # PatcherSupportPkg
self.url_patcher_support_pkg = "https://github.com/dortania/PatcherSupportPkg/releases/download/"
self.nightly_url_patcher_support_pkg = "https://nightly.link/dortania/PatcherSupportPkg/workflows/build/master/"
self.discord_link = "https://discord.gg/rqdPgH8xSN"
self.guide_link = "https://dortania.github.io/OpenCore-Legacy-Patcher/"
self.repo_link = "https://github.com/dortania/OpenCore-Legacy-Patcher"
self.repo_link_latest = f"{self.repo_link}/releases/tag/{self.patcher_version}"
self.copyright_date = "Copyright © 2020-2023 Dortania"
self.installer_pkg_url = f"{self.repo_link}/releases/download/{self.patcher_version}/AutoPkg-Assets.pkg"
self.installer_pkg_url_nightly = "http://nightly.link/dortania/OpenCore-Legacy-Patcher/workflows/build-app-wxpython/main/AutoPkg-Assets.pkg.zip"
self.patcher_version: str = "0.6.3" # OpenCore-Legacy-Patcher
self.patcher_support_pkg_version: str = "0.9.2" # PatcherSupportPkg
self.copyright_date: str = "Copyright © 2020-2023 Dortania"
# URLs
self.url_patcher_support_pkg: str = "https://github.com/dortania/PatcherSupportPkg/releases/download/"
self.discord_link: str = "https://discord.gg/rqdPgH8xSN"
self.guide_link: str = "https://dortania.github.io/OpenCore-Legacy-Patcher/"
self.repo_link: str = "https://github.com/dortania/OpenCore-Legacy-Patcher"
self.installer_pkg_url: str = f"{self.repo_link}/releases/download/{self.patcher_version}/AutoPkg-Assets.pkg"
self.installer_pkg_url_nightly: str = "http://nightly.link/dortania/OpenCore-Legacy-Patcher/workflows/build-app-wxpython/main/AutoPkg-Assets.pkg.zip"
# OpenCore Versioning
# https://github.com/acidanthera/OpenCorePkg
self.opencore_commit = "a753334 - 01-02-2023"
self.opencore_version = "0.8.8"
self.opencore_commit: str = "e4f0ba1 - 03-06-2023"
self.opencore_version: str = "0.9.0"
# Kext Versioning
## Acidanthera
## https://github.com/acidanthera
self.lilu_version = "1.6.3" # Lilu
self.whatevergreen_version = "1.6.3" # WhateverGreen
self.whatevergreen_navi_version = "1.6.3-Navi" # WhateverGreen (Navi Patch)
self.airportbcrmfixup_version = "2.1.6" # AirPortBrcmFixup
self.nvmefix_version = "1.0.9" # NVMeFix
self.applealc_version = "1.6.3" # AppleALC
self.restrictevents_version = "1.0.9" # RestrictEvents
self.featureunlock_version = "1.1.4" # FeatureUnlock
self.debugenhancer_version = "1.0.7" # DebugEnhancer
self.cpufriend_version = "1.2.6" # CPUFriend
self.bluetool_version = "2.6.4" # BlueToolFixup (BrcmPatchRAM)
self.cslvfixup_version = "2.6.1" # CSLVFixup
self.autopkg_version = "1.0.2" # AutoPkgInstaller
self.cryptexfixup_version = "1.0.1" # CryptexFixup
self.lilu_version: str = "1.6.4" # Lilu
self.whatevergreen_version: str = "1.6.4" # WhateverGreen
self.whatevergreen_navi_version: str = "1.6.4-Navi" # WhateverGreen (Navi Patch)
self.airportbcrmfixup_version: str = "2.1.6" # AirPortBrcmFixup
self.nvmefix_version: str = "1.1.0" # NVMeFix
self.applealc_version: str = "1.6.3" # AppleALC
self.restrictevents_version: str = "1.0.9" # RestrictEvents
self.featureunlock_version: str = "1.1.4" # FeatureUnlock
self.debugenhancer_version: str = "1.0.7" # DebugEnhancer
self.cpufriend_version: str = "1.2.6" # CPUFriend
self.bluetool_version: str = "2.6.4" # BlueToolFixup (BrcmPatchRAM)
self.cslvfixup_version: str = "2.6.1" # CSLVFixup
self.autopkg_version: str = "1.0.2" # AutoPkgInstaller
self.cryptexfixup_version: str = "1.0.1" # CryptexFixup
## Apple
## https://www.apple.com
self.marvel_version = "1.0.1" # MarvelYukonEthernet
self.nforce_version = "1.0.1" # nForceEthernet
self.piixata_version = "1.0.1" # AppleIntelPIIXATA
self.fw_kext = "1.0.1" # IOFireWireFamily
self.apple_trackpad = "1.0.1" # AppleUSBTrackpad
self.apple_isight_version = "1.0.0" # AppleiSight
self.apple_raid_version = "1.0.0" # AppleRAIDCard
self.apfs_zlib_version = "12.3.1" # NoAVXFSCompressionTypeZlib
self.apfs_zlib_v2_version = "12.6" # NoAVXFSCompressionTypeZlib (patched with AVXpel)
self.multitouch_version = "1.0.0" # AppleUSBMultitouch
self.topcase_version = "1.0.0" # AppleUSBTopCase
self.intel_82574l_version = "1.0.0" # Intel82574L
self.intel_8254x_version = "1.0.0" # AppleIntel8254XEthernet
self.apple_usb_11_injector = "1.0.0" # AppleUSBUHCI/OHCI
self.aicpupm_version = "1.0.0" # AppleIntelCPUPowerManagement/Client
self.marvel_version: str = "1.0.1" # MarvelYukonEthernet
self.nforce_version: str = "1.0.1" # nForceEthernet
self.piixata_version: str = "1.0.1" # AppleIntelPIIXATA
self.fw_kext: str = "1.0.1" # IOFireWireFamily
self.apple_trackpad: str = "1.0.1" # AppleUSBTrackpad
self.apple_isight_version: str = "1.0.0" # AppleiSight
self.apple_raid_version: str = "1.0.0" # AppleRAIDCard
self.apfs_zlib_version: str = "12.3.1" # NoAVXFSCompressionTypeZlib
self.apfs_zlib_v2_version: str = "12.6" # NoAVXFSCompressionTypeZlib (patched with AVXpel)
self.multitouch_version: str = "1.0.0" # AppleUSBMultitouch
self.topcase_version: str = "1.0.0" # AppleUSBTopCase
self.intel_82574l_version: str = "1.0.0" # Intel82574L
self.intel_8254x_version: str = "1.0.0" # AppleIntel8254XEthernet
self.apple_usb_11_injector: str = "1.0.0" # AppleUSBUHCI/OHCI
self.aicpupm_version: str = "1.0.0" # AppleIntelCPUPowerManagement/Client
## Apple - Dortania Modified
self.bcm570_version = "1.0.2" # CatalinaBCM5701Ethernet
self.i210_version = "1.0.0" # CatalinaIntelI210Ethernet
self.corecaptureelcap_version = "1.0.1" # corecaptureElCap
self.io80211elcap_version = "2.0.0" # IO80211ElCap
self.bigsursdxc_version = "1.0.0" # BigSurSDXC
self.monterey_ahci_version = "1.0.0" # CatalinaAHCI
self.bcm570_version: str = "1.0.2" # CatalinaBCM5701Ethernet
self.i210_version: str = "1.0.0" # CatalinaIntelI210Ethernet
self.corecaptureelcap_version: str = "1.0.1" # corecaptureElCap
self.io80211elcap_version: str = "2.0.0" # IO80211ElCap
self.bigsursdxc_version: str = "1.0.0" # BigSurSDXC
self.monterey_ahci_version: str = "1.0.0" # CatalinaAHCI
## Dortania
## https://github.com/dortania
self.backlight_injector_version = "1.1.0" # BacklightInjector
self.backlight_injectorA_version = "1.0.0" # BacklightInjector iMac9,1
self.smcspoof_version = "1.0.0" # SMC-Spoof
self.mce_version = "1.0.0" # AppleMCEReporterDisabler
self.btspoof_version = "1.0.0" # Bluetooth-Spoof
self.aspp_override_version = "1.0.1" # ACPI_SMC_PlatformPlugin Override
self.rsrhelper_version = "1.0.0" # RSRHelper
self.backlight_injector_version: str = "1.1.0" # BacklightInjector
self.backlight_injectorA_version: str = "1.0.0" # BacklightInjector (iMac9,1)
self.smcspoof_version: str = "1.0.0" # SMC-Spoof
self.mce_version: str = "1.0.0" # AppleMCEReporterDisabler
self.btspoof_version: str = "1.0.0" # Bluetooth-Spoof
self.aspp_override_version: str = "1.0.1" # ACPI_SMC_PlatformPlugin Override
self.rsrhelper_version: str = "1.0.0" # RSRHelper
## Syncretic
## https://forums.macrumors.com/members/syncretic.1173816/
## https://github.com/reenigneorcim/latebloom
self.mousse_version = "0.95-Dortania" # MouSSE
self.telemetrap_version = "1.0.0" # telemetrap
self.mousse_version: str = "0.95-Dortania" # MouSSE
self.telemetrap_version: str = "1.0.0" # telemetrap
## cdf
## https://github.com/cdf/Innie
self.innie_version = "1.3.0" # Innie
self.innie_version: str = "1.3.1" # Innie
## arter97
## https://github.com/arter97/SimpleMSR/
self.simplemsr_version = "1.0.0" # SimpleMSR
self.simplemsr_version: str = "1.0.0" # SimpleMSR
## blackgate
## https://github.com/blackgate/AMDGPUWakeHandler
self.gpu_wake_version = "1.0.0"
self.gpu_wake_version: str = "1.0.0"
## flagersgit
## https://github.com/flagersgit/KDKlessWorkaround
self.kdkless_version = "1.0.0"
self.kdkless_version: str = "1.0.0"
# Get resource path
self.current_path = Path(__file__).parent.parent.resolve()
self.payload_path = self.current_path / Path("payloads")
self.current_path: Path = Path(__file__).parent.parent.resolve()
self.payload_path: Path = self.current_path / Path("payloads")
# Patcher Settings
self.allow_oc_everywhere = False # Set whether Patcher can be run on unsupported Macs
self.gui_mode = False # Determine whether running in a GUI or TUI
self.disk = "" # Set installation ESP
self.patch_disk = "" # Set Root Volume to patch
self.validate = False # Enable validation testing for CI
self.recovery_status = False # Detect if booted into RecoveryOS
self.launcher_binary = None # Determine launch binary (ie. Python vs PyInstaller)
self.launcher_script = None # Determine launch file (if run via Python)
self.ignore_updates = False # Ignore OCLP updates
self.wxpython_variant = False # Determine if using wxPython variant
self.unpack_thread = None # Determine if unpack thread finished
self.cli_mode = False # Determine if running in CLI mode
self.should_nuke_kdks = True # Determine if KDKs should be nuked if unused in /L*/D*/KDKs
self.has_checked_updates = False # Determine if check for updates has been run
## Internal settings
self.allow_oc_everywhere: bool = False # Set whether Patcher can be run on unsupported Macs
self.gui_mode: bool = False # Determine whether running in a GUI or TUI
self.cli_mode: bool = False # Determine if running in CLI mode
self.validate: bool = False # Enable validation testing for CI
self.recovery_status: bool = False # Detect if booted into RecoveryOS
self.ignore_updates: bool = False # Ignore OCLP updates
self.wxpython_variant: bool = False # Determine if using wxPython variant
self.has_checked_updates: bool = False # Determine if check for updates has been run
self.root_patcher_succeeded: bool = False # Determine if root patcher succeeded
self.start_build_install: bool = False # Determine if build install should be started
self.host_is_non_metal: bool = False # Determine if host is non-metal (ie. enable UI hacks)
self.needs_to_open_preferences: bool = False # Determine if preferences need to be opened
self.host_is_hackintosh: bool = False # Determine if host is Hackintosh
self.should_nuke_kdks: bool = True # Determine if KDKs should be nuked if unused in /L*/D*/KDKs
self.launcher_binary: str = None # Determine launch binary path (ie. Python vs PyInstaller)
self.launcher_script: str = None # Determine launch file path (None if PyInstaller)
self.booted_oc_disk: str = None # Determine current disk OCLP booted from
self.unpack_thread = None # Determine if unpack thread finished (threading.Thread)
self.commit_info: tuple = (None, None, None) # Commit info (Branch, Commit Date, Commit URL)
## Hardware
self.computer: device_probe.Computer = None # type: ignore
self.custom_model: Optional[str] = None
self.custom_model: Optional[str] = None
## OpenCore Settings
self.opencore_debug = False
self.opencore_build = "RELEASE"
self.showpicker = True # Show or Hide OpenCore's Boot Picker
self.boot_efi = False # Use EFI/BOOT/BOOTx64.efi bootstrap
self.nvram_write = True # Write to hardware NVRAM
self.opencore_debug: bool = False # Enable OpenCore debug
self.boot_efi: bool = False # Use EFI/BOOT/BOOTx64.efi vs boot.efi bootstrap
self.showpicker: bool = True # Show or Hide OpenCore's Boot Picker
self.nvram_write: bool = True # Write to hardware NVRAM
self.oc_timeout: int = 5 # Set OpenCore timeout
self.opencore_build: str = "RELEASE"
## Kext Settings
self.kext_debug = False # Enables Lilu debug and DebugEnhancer
self.kext_variant = "RELEASE"
self.kext_debug: bool = False # Enables Lilu debug and DebugEnhancer
self.kext_variant: str = "RELEASE"
## NVRAM Settings
self.verbose_debug = False # -v
self.verbose_debug: bool = False # -v
## SMBIOS Settings
self.custom_cpu_model = 2 # Patch type value
self.custom_cpu_model_value = "" # New CPU name within About This Mac
self.serial_settings = "None" # Set SMBIOS level used
self.override_smbios = "Default" # Set SMBIOS model used
self.allow_native_spoofs = False # Allow native models to recieve spoofs
self.custom_serial_number = "" # Set SMBIOS serial number
self.custom_board_serial_number = "" # Set SMBIOS board serial number
self.serial_settings: str = "None" # Set SMBIOS level used
self.override_smbios: str = "Default" # Set SMBIOS model used
self.allow_native_spoofs: bool = False # Allow native models to recieve spoofs
### RestrictEvents CPU renaming
self.custom_cpu_model: int = 2 # Patch type value
self.custom_cpu_model_value: str = "" # New CPU name within About This Mac
### Serial Number Overrides
self.custom_serial_number: str = "" # Set SMBIOS serial number
self.custom_board_serial_number: str = "" # Set SMBIOS board serial number
## FeatureUnlock Settings
self.fu_status = True # Enable FeatureUnlock
self.fu_arguments = None # Set FeatureUnlock arguments
self.fu_status: bool = True # Enable FeatureUnlock
self.fu_arguments: str = None # Set FeatureUnlock arguments
## Security Settings
self.apecid_support = False # ApECID
self.sip_status = True # System Integrity Protection
self.secure_status = False # Secure Boot Model
self.vault = False # EFI Vault
self.disable_cs_lv = False # Disable Library validation
self.disable_amfi = False # Disable AMFI
self.sip_status: bool = True # System Integrity Protection
self.secure_status: bool = False # Secure Boot Model
self.vault: bool = False # EFI Vault
self.disable_cs_lv: bool = False # Disable Library validation
self.disable_amfi: bool = False # Disable AMFI
## OS Settings
self.os_support = 12.0
self.detected_os = 0 # Major Kernel Version
self.detected_os_minor = 0 # Minor Kernel Version
self.detected_os_build = "" # OS Build
self.detected_os_version = "" # OS Version
self.os_support: float = 12.0
self.detected_os: int = 0 # Major Kernel Version
self.detected_os_minor: int = 0 # Minor Kernel Version
self.detected_os_build: str = "" # OS Build
self.detected_os_version: str = "" # OS Version
## Boot Volume Settings
self.firewire_boot = False # Allow macOS FireWire Boot
self.nvme_boot = False # Allow UEFI NVMe Boot
self.xhci_boot = False
self.firewire_boot: bool = False # Allow macOS FireWire Boot (kernel)
self.nvme_boot: bool = False # Allow UEFI NVMe Boot
self.xhci_boot: bool = False # Allow UEFI XHCI Boot
## Graphics Settings
self.metal_build = False # Set MXM Build support
self.imac_vendor = "None" # Set MXM GPU vendor
self.imac_model = "" # Set MXM GPU model
self.drm_support = False # Set iMac14,x DRM support
self.allow_ts2_accel = True # Set TeraScale 2 Acceleration support
self.force_nv_web = False # Force Nvidia Web Drivers on Tesla and Kepler
self.force_output_support = False # Force Output support for Mac Pros with PC VBIOS
self.amd_gop_injection = False # Set GOP Injection support
self.nvidia_kepler_gop_injection = False # Set Kepler GOP Injection support
self.allow_ts2_accel: bool = True # Set TeraScale 2 Acceleration support
self.drm_support: bool = False # Set iMac14,x DRM support
self.force_nv_web: bool = False # Force Nvidia Web Drivers on Tesla and Kepler
self.force_output_support: bool = False # Force Output support for Mac Pros with PC VBIOS
self.amd_gop_injection: bool = False # Set GOP Injection support
self.nvidia_kepler_gop_injection: bool = False # Set Kepler GOP Injection support
## Miscellaneous
self.disallow_cpufriend = False # Disable CPUFriend
self.enable_wake_on_wlan = False # Allow Wake on WLAN for modern Broadcom
self.disable_tb = False # Disable Thunderbolt Controller
self.set_alc_usage = True # Set AppleALC usage
self.dGPU_switch = False # Set Display GPU Switching for Windows
self.force_surplus = False # Force SurPlus patch in newer OSes
self.force_latest_psp = False # Force latest PatcherSupportPkg
self.disable_msr_power_ctl = False # Disable MSR Power Control (missing battery throttling)
self.software_demux = False # Enable Software Demux patch set
self.force_vmm = False # Force VMM patch
self.custom_sip_value = None # Set custom SIP value
self.walkthrough = False # Enable Walkthrough
self.disable_connectdrivers = False # Disable ConnectDrivers (hibernation)
self.allow_3rd_party_drives = True # Allow ThridPartyDrives quirk
self.set_content_caching = False # Set Content Caching
self.allow_nvme_fixing = True # Allow NVMe Kernel Space Patches
self.disable_xcpm = False # Disable XCPM (X86PlatformPlugin.kext)
self.root_patcher_succeeded = False # Determine if root patcher succeeded
self.booted_oc_disk = None # Determine current disk OCLP booted from
self.start_build_install = False # Determine if build install should be started
self.host_is_non_metal = False # Determine if host is non-metal (ie. enable UI hacks)
self.needs_to_open_preferences = False # Determine if preferences need to be opened
self.host_is_hackintosh = False # Determine if host is Hackintosh
self.commit_info = (None, None, None)
self.set_vmm_cpuid = False # Set VMM bit inside CPUID
self.oc_timeout = 5 # Set OpenCore timeout
self.apfs_trim_timeout = True # Set APFS Trim timeout
### MXM GPU Support
self.metal_build: bool = False # Set MXM Build support
self.imac_vendor: str = "None" # Set MXM GPU vendor
self.imac_model: str = "" # Set MXM GPU model
## Miscellaneous build settings
self.disallow_cpufriend: bool = False # Disable CPUFriend
self.enable_wake_on_wlan: bool = False # Allow Wake on WLAN for modern Broadcom
self.disable_tb: bool = False # Disable Thunderbolt Controller
self.dGPU_switch: bool = False # Set Display GPU Switching for Windows
self.force_surplus: bool = False # Force SurPlus patch in newer OSes
self.force_latest_psp: bool = False # Force latest PatcherSupportPkg
self.disable_msr_power_ctl: bool = False # Disable MSR Power Control (missing battery throttling)
self.software_demux: bool = False # Enable Software Demux patch set
self.force_vmm: bool = False # Force VMM patch
self.disable_connectdrivers: bool = False # Disable ConnectDrivers (hibernation)
self.set_content_caching: bool = False # Set Content Caching
self.disable_xcpm: bool = False # Disable XCPM (X86PlatformPlugin.kext)
self.set_vmm_cpuid: bool = False # Set VMM bit inside CPUID
self.set_alc_usage: bool = True # Set AppleALC usage
self.allow_3rd_party_drives: bool = True # Allow ThridPartyDrives quirk
self.allow_nvme_fixing: bool = True # Allow NVMe Kernel Space Patches
self.apfs_trim_timeout: bool = True # Set APFS Trim timeout
self.custom_sip_value: int = None # Set custom SIP value
## Non-Metal OS support
self.legacy_accel_support = [
os_data.os_data.big_sur,
os_data.os_data.monterey,
@@ -283,10 +288,6 @@ class Constants:
def link_rate_driver_path(self):
return self.payload_path / Path("Drivers/FixPCIeLinkRate.efi")
@property
def list_txt_path(self):
return self.payload_path / Path("List.txt")
@property
def installer_sh_path(self):
return self.payload_path / Path("Installer.sh")
@@ -466,7 +467,7 @@ class Constants:
@property
def innie_path(self):
return self.payload_kexts_path / Path(f"Misc/Innie-v{self.innie_version}.zip")
return self.payload_kexts_path / Path(f"Misc/Innie-v{self.innie_version}-{self.kext_variant}.zip")
@property
def simplemsr_path(self):
+19 -11
View File
@@ -17,7 +17,7 @@ from data import (
class GenerateDefaults:
def __init__(self, model: str, host_is_target: bool, global_constants: constants.Constants):
def __init__(self, model: str, host_is_target: bool, global_constants: constants.Constants) -> None:
self.constants: constants.Constants = global_constants
self.model: str = model
@@ -51,7 +51,7 @@ class GenerateDefaults:
self._smbios_probe()
def _general_probe(self):
def _general_probe(self) -> None:
"""
General probe for data
"""
@@ -93,7 +93,7 @@ class GenerateDefaults:
self.constants.should_nuke_kdks = False
def _smbios_probe(self):
def _smbios_probe(self) -> None:
"""
SMBIOS specific probe
"""
@@ -128,7 +128,7 @@ class GenerateDefaults:
self.constants.force_vmm = False
def _nvram_probe(self):
def _nvram_probe(self) -> None:
"""
NVRAM specific probe
"""
@@ -153,7 +153,7 @@ class GenerateDefaults:
self.constants.custom_cpu_model_value = custom_cpu_model_value.split("%00")[0]
def _networking_probe(self):
def _networking_probe(self) -> None:
"""
Networking specific probe
"""
@@ -195,7 +195,7 @@ class GenerateDefaults:
self.constants.fu_arguments = " -disable_sidecar_mac"
def _misc_hardwares_probe(self):
def _misc_hardwares_probe(self) -> None:
"""
Misc probe
"""
@@ -211,7 +211,7 @@ class GenerateDefaults:
break
def _gpu_probe(self):
def _gpu_probe(self) -> None:
"""
Graphics specific probe
"""
@@ -245,6 +245,13 @@ class GenerateDefaults:
device_probe.AMD.Archs.Vega,
device_probe.AMD.Archs.Navi,
]:
if gpu in [
device_probe.Intel.Archs.Ivy_Bridge,
device_probe.Intel.Archs.Haswell,
device_probe.NVIDIA.Archs.Kepler,
]:
self.constants.disable_amfi = True
if gpu in [
device_probe.AMD.Archs.Legacy_GCN_7000,
device_probe.AMD.Archs.Legacy_GCN_8000,
@@ -302,7 +309,8 @@ class GenerateDefaults:
# Only disable AMFI if we officially support Ventura
self.constants.disable_amfi = True
# Enable BetaBlur if user hasn't disabled it
is_blur_enabled = subprocess.run(["defaults", "read", "-g", "Moraea_BlurBeta"], stdout=subprocess.PIPE).stdout.decode("utf-8").strip()
if is_blur_enabled in ["false", "0"]:
subprocess.run(["defaults", "write", "-g", "Moraea_BlurBeta", "-bool", "true"])
for key in ["Moraea_BlurBeta", "Amy.MenuBar2Beta"]:
# Enable BetaBlur if user hasn't disabled it
is_key_enabled = subprocess.run(["defaults", "read", "-g", key], stdout=subprocess.PIPE).stdout.decode("utf-8").strip()
if is_key_enabled not in ["false", "0"]:
subprocess.run(["defaults", "write", "-g", key, "-bool", "true"])
+6 -6
View File
@@ -15,7 +15,7 @@ class GlobalEnviromentSettings:
Library for querying and writing global enviroment settings
"""
def __init__(self):
def __init__(self) -> None:
self.file_name: str = ".com.dortania.opencore-legacy-patcher.plist"
self.global_settings_folder: str = "/Users/Shared"
self.global_settings_plist: str = f"{self.global_settings_folder}/{self.file_name}"
@@ -25,7 +25,7 @@ class GlobalEnviromentSettings:
self._fix_file_permission()
def read_property(self, property_name: str):
def read_property(self, property_name: str) -> str or None:
"""
Reads a property from the global settings file
"""
@@ -37,7 +37,7 @@ class GlobalEnviromentSettings:
return None
def write_property(self, property_name: str, property_value):
def write_property(self, property_name: str, property_value) -> None:
"""
Writes a property to the global settings file
"""
@@ -51,7 +51,7 @@ class GlobalEnviromentSettings:
logging.info("- Failed to write to global settings file")
def _generate_settings_file(self):
def _generate_settings_file(self) -> None:
if Path(self.global_settings_plist).exists():
return
try:
@@ -60,7 +60,7 @@ class GlobalEnviromentSettings:
logging.info("- Permission error: Unable to write to global settings file")
def _convert_defaults_to_global_settings(self):
def _convert_defaults_to_global_settings(self) -> None:
"""
Converts legacy defaults to global settings
"""
@@ -86,7 +86,7 @@ class GlobalEnviromentSettings:
logging.info("- Permission error: Unable to delete defaults plist")
def _fix_file_permission(self):
def _fix_file_permission(self) -> None:
"""
Fixes file permission for log file
+27 -1
View File
@@ -1142,6 +1142,32 @@ class wx_python_gui:
)
)
i = i + self.patch_label.GetSize().height + 3
i += 10
if self.constants.host_is_hackintosh is False:
self.patch_label = wx.StaticText(self.frame_modal, label="Please run 'Build and Install OpenCore' and reboot")
self.patch_label.SetFont(wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
self.patch_label.SetPosition(
wx.Point(
self.subheader.GetPosition().x,
self.subheader.GetPosition().y + self.subheader.GetSize().height + 3 + i
)
)
self.patch_label.Centre(wx.HORIZONTAL)
i = i + self.patch_label.GetSize().height + 3
self.patch_label = wx.StaticText(self.frame_modal, label="to remove these errors.")
self.patch_label.SetFont(wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
self.patch_label.SetPosition(
wx.Point(
self.subheader.GetPosition().x,
self.subheader.GetPosition().y + self.subheader.GetSize().height + 3 + i
)
)
self.patch_label.Centre(wx.HORIZONTAL)
i = i + self.patch_label.GetSize().height + 3
else:
if self.constants.computer.oclp_sys_version and self.constants.computer.oclp_sys_date:
date = self.constants.computer.oclp_sys_date.split(" @")
@@ -1941,7 +1967,7 @@ class wx_python_gui:
with Path(self.constants.payload_path / Path("InstallAssistant.pkg")).open("rb") as f:
for chunk in chunks:
status = hashlib.sha256(f.read(chunk["length"])).digest()
if not status == chunk["checksum"]:
if status != chunk["checksum"]:
logging.info(f"Chunk {chunks.index(chunk) + 1} checksum status FAIL: chunk sum {binascii.hexlify(chunk['checksum']).decode()}, calculated sum {binascii.hexlify(status).decode()}")
self.popup = wx.MessageDialog(
self.frame,
+28 -30
View File
@@ -49,7 +49,7 @@ class KernelDebugKitObject:
"""
def __init__(self, global_constants: constants.Constants, host_build: str, host_version: str, ignore_installed: bool = False, passive: bool = False):
def __init__(self, global_constants: constants.Constants, host_build: str, host_version: str, ignore_installed: bool = False, passive: bool = False) -> None:
self.constants: constants.Constants = global_constants
self.host_build: str = host_build # ex. 20A5384c
@@ -83,7 +83,7 @@ class KernelDebugKitObject:
self._get_latest_kdk()
def _get_remote_kdks(self):
def _get_remote_kdks(self) -> list or None:
"""
Fetches a list of available KDKs from the KdkSupportPkg API
Additionally caches the list for future use, avoiding extra API calls
@@ -119,7 +119,7 @@ class KernelDebugKitObject:
return KDK_ASSET_LIST
def _get_latest_kdk(self, host_build: str = None, host_version: str = None):
def _get_latest_kdk(self, host_build: str = None, host_version: str = None) -> None:
"""
Fetches the latest KDK for the current macOS version
@@ -229,7 +229,7 @@ class KernelDebugKitObject:
self.success = True
def retrieve_download(self, override_path: str = ""):
def retrieve_download(self, override_path: str = "") -> network_handler.DownloadObject or None:
"""
Returns a DownloadObject for the KDK
@@ -263,7 +263,7 @@ class KernelDebugKitObject:
return network_handler.DownloadObject(self.kdk_url, kdk_download_path)
def _generate_kdk_info_plist(self, plist_path: str):
def _generate_kdk_info_plist(self, plist_path: str) -> None:
"""
Generates a KDK Info.plist
@@ -285,7 +285,7 @@ class KernelDebugKitObject:
logging.error(f"- Failed to generate KDK Info.plist: {e}")
def _local_kdk_valid(self, kdk_path: Path):
def _local_kdk_valid(self, kdk_path: Path) -> bool:
"""
Validates provided KDK, ensure no corruption
@@ -334,7 +334,7 @@ class KernelDebugKitObject:
return True
def _local_kdk_valid_legacy(self, kdk_path: Path):
def _local_kdk_valid_legacy(self, kdk_path: Path) -> bool:
"""
Legacy variant of validating provided KDK
Uses best guess of files that should be present
@@ -363,7 +363,7 @@ class KernelDebugKitObject:
return True
def _local_kdk_installed(self, match: str = None, check_version: bool = False):
def _local_kdk_installed(self, match: str = None, check_version: bool = False) -> str or None:
"""
Checks if KDK matching build is installed
If so, validates it has not been corrupted
@@ -429,7 +429,7 @@ class KernelDebugKitObject:
return None
def _remove_kdk(self, kdk_path: str):
def _remove_kdk(self, kdk_path: str) -> None:
"""
Removes provided KDK
@@ -448,19 +448,18 @@ class KernelDebugKitObject:
logging.warning(f"- KDK does not exist: {kdk_path}")
return
rm_args = ["rm", "-f", kdk_path]
if Path(kdk_path).is_dir():
rm_args = ["rm", "-rf", kdk_path]
rm_args = ["rm", "-rf" if Path(kdk_path).is_dir() else "-f", kdk_path]
result = utilities.elevated(rm_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if result.returncode != 0:
logging.warning(f"- Failed to remove KDK: {kdk_path}")
logging.warning(f"- {result.stdout.decode('utf-8')}")
return
logging.info(f"- Successfully removed KDK: {kdk_path}")
def _remove_unused_kdks(self, exclude_builds: list = None):
def _remove_unused_kdks(self, exclude_builds: list = None) -> None:
"""
Removes KDKs that are not in use
@@ -486,21 +485,20 @@ class KernelDebugKitObject:
logging.info("- Cleaning unused KDKs")
for kdk_folder in Path(KDK_INSTALL_PATH).iterdir():
if kdk_folder.is_dir():
if kdk_folder.name.endswith(".kdk") or kdk_folder.name.endswith(".pkg"):
should_remove = True
for build in exclude_builds:
if build != "":
continue
if kdk_folder.name.endswith(f"{build}.kdk") or kdk_folder.name.endswith(f"{build}.pkg"):
should_remove = False
break
if should_remove is False:
if kdk_folder.name.endswith(".kdk") or kdk_folder.name.endswith(".pkg"):
should_remove = True
for build in exclude_builds:
if build == "":
continue
self._remove_kdk(kdk_folder)
if kdk_folder.name.endswith(f"_{build}.kdk") or kdk_folder.name.endswith(f"_{build}.pkg"):
should_remove = False
break
if should_remove is False:
continue
self._remove_kdk(kdk_folder)
def validate_kdk_checksum(self, kdk_dmg_path: str = None):
def validate_kdk_checksum(self, kdk_dmg_path: str = None) -> bool:
"""
Validates KDK DMG checksum
@@ -542,11 +540,11 @@ class KernelDebugKitUtilities:
"""
def __init__(self):
def __init__(self) -> None:
pass
def install_kdk_pkg(self, kdk_path: Path):
def install_kdk_pkg(self, kdk_path: Path) -> bool:
"""
Installs provided KDK packages
@@ -577,7 +575,7 @@ class KernelDebugKitUtilities:
return True
def install_kdk_dmg(self, kdk_path: Path):
def install_kdk_dmg(self, kdk_path: Path) -> bool:
"""
Installs provided KDK disk image
@@ -617,7 +615,7 @@ class KernelDebugKitUtilities:
logging.info("- Successfully installed KDK")
return True
def _unmount_disk_image(self, mount_point):
def _unmount_disk_image(self, mount_point) -> None:
"""
Unmounts provided disk image silently
@@ -627,7 +625,7 @@ class KernelDebugKitUtilities:
subprocess.run(["hdiutil", "detach", mount_point], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
def _create_backup(self, kdk_path: Path, kdk_info_plist: Path):
def _create_backup(self, kdk_path: Path, kdk_info_plist: Path) -> None:
"""
Creates a backup of the KDK
+11 -11
View File
@@ -26,7 +26,7 @@ class InitializeLoggingSupport:
"""
def __init__(self):
def __init__(self) -> None:
self.log_filename: str = "OpenCore-Patcher.log"
self.log_filepath: Path = None
@@ -43,11 +43,11 @@ class InitializeLoggingSupport:
self._fix_file_permission()
def __del__(self):
def __del__(self) -> None:
self._restore_original_excepthook()
def _initialize_logging_path(self):
def _initialize_logging_path(self) -> None:
"""
Initialize logging framework storage path
"""
@@ -62,7 +62,7 @@ class InitializeLoggingSupport:
print(f" - Log file: {self.log_filepath}")
def _clean_log_file(self):
def _clean_log_file(self) -> None:
"""
Determine if log file should be cleaned
@@ -87,7 +87,7 @@ class InitializeLoggingSupport:
print(f"- Failed to clean log file: {e}")
def _fix_file_permission(self):
def _fix_file_permission(self) -> None:
"""
Fixes file permission for log file
@@ -105,7 +105,7 @@ class InitializeLoggingSupport:
print(result.stderr.decode("utf-8"))
def _initialize_logging_configuration(self, log_to_file: bool = True):
def _initialize_logging_configuration(self, log_to_file: bool = True) -> None:
"""
Initialize logging framework configuration
@@ -130,7 +130,7 @@ class InitializeLoggingSupport:
logging.getLogger().handlers[1].maxBytes = self.max_file_size
def _attempt_initialize_logging_configuration(self):
def _attempt_initialize_logging_configuration(self) -> None:
"""
Attempt to initialize logging framework configuration
@@ -145,18 +145,18 @@ class InitializeLoggingSupport:
self._initialize_logging_configuration(log_to_file=False)
def _implement_custom_traceback_handler(self):
def _implement_custom_traceback_handler(self) -> None:
"""
Reroute traceback to logging module
"""
def custom_excepthook(type, value, tb):
def custom_excepthook(type, value, tb) -> None:
"""
Reroute traceback in main thread to logging module
"""
logging.error("Uncaught exception in main thread", exc_info=(type, value, tb))
def custom_thread_excepthook(args):
def custom_thread_excepthook(args) -> None:
"""
Reroute traceback in spawned thread to logging module
"""
@@ -166,7 +166,7 @@ class InitializeLoggingSupport:
threading.excepthook = custom_thread_excepthook
def _restore_original_excepthook(self):
def _restore_original_excepthook(self) -> None:
"""
Restore original traceback handlers
"""
+43 -18
View File
@@ -23,13 +23,19 @@ tmp_dir = tempfile.TemporaryDirectory()
class InstallerCreation():
def __init__(self):
def __init__(self) -> None:
pass
def install_macOS_installer(self, download_path: str):
def install_macOS_installer(self, download_path: str) -> bool:
"""
Installs InstallAssistant.pkg
Parameters:
download_path (str): Path to InstallAssistant.pkg
Returns:
bool: True if successful, False otherwise
"""
logging.info("- Extracting macOS installer from InstallAssistant.pkg\n This may take some time")
@@ -52,7 +58,7 @@ class InstallerCreation():
return True
def generate_installer_creation_script(self, tmp_location, installer_path, disk):
def generate_installer_creation_script(self, tmp_location: str, installer_path: str, disk: str) -> bool:
"""
Creates installer.sh to be piped to OCLP-Helper and run as admin
@@ -67,6 +73,9 @@ class InstallerCreation():
tmp_location (str): Path to temporary directory
installer_path (str): Path to InstallAssistant.pkg
disk (str): Disk to install to
Returns:
bool: True if successful, False otherwise
"""
additional_args = ""
@@ -136,7 +145,8 @@ fi
return True
return False
def list_disk_to_format(self):
def list_disk_to_format(self) -> dict:
"""
List applicable disks for macOS installer creation
Only lists disks that are:
@@ -191,14 +201,20 @@ fi
return list_disks
class SeedType(enum.Enum):
class SeedType(enum.IntEnum):
"""
Enum for catalog types
Variants:
DeveloperSeed: Developer Beta (Part of the Apple Developer Program)
PublicSeed: Public Beta
CustomerSeed: AppleSeed Program (Generally mirrors DeveloperSeed)
PublicRelease: Public Release
"""
DeveloperSeed = 0
PublicSeed = 1
CustomerSeed = 2
PublicRelease = 3
DeveloperSeed: int = 0
PublicSeed: int = 1
CustomerSeed: int = 2
PublicRelease: int = 3
class RemoteInstallerCatalog:
@@ -206,7 +222,7 @@ class RemoteInstallerCatalog:
Parses Apple's Software Update catalog and finds all macOS installers.
"""
def __init__(self, seed_override: SeedType = SeedType.PublicRelease):
def __init__(self, seed_override: SeedType = SeedType.PublicRelease) -> None:
self.catalog_url: str = self._construct_catalog_url(seed_override)
@@ -214,12 +230,15 @@ class RemoteInstallerCatalog:
self.available_apps_latest: dict = self._list_newest_installers_only()
def _construct_catalog_url(self, seed_type: SeedType):
def _construct_catalog_url(self, seed_type: SeedType) -> str:
"""
Constructs the catalog URL based on the seed type
Args:
Parameters:
seed_type (SeedType): The seed type to use
Returns:
str: The catalog URL
"""
@@ -237,7 +256,7 @@ class RemoteInstallerCatalog:
return url
def _fetch_catalog(self):
def _fetch_catalog(self) -> dict:
"""
Fetches the catalog from Apple's servers
@@ -257,7 +276,13 @@ class RemoteInstallerCatalog:
return catalog
def _parse_catalog(self):
def _parse_catalog(self) -> dict:
"""
Parses the catalog and returns a dictionary of available installers
Returns:
dict: Dictionary of available installers
"""
available_apps: dict = {}
catalog: dict = self._fetch_catalog()
@@ -358,7 +383,7 @@ class RemoteInstallerCatalog:
return available_apps
def _list_newest_installers_only(self):
def _list_newest_installers_only(self) -> dict:
"""
Returns a dictionary of the newest macOS installers only.
Primarily used to avoid overwhelming the user with a list of
@@ -449,11 +474,11 @@ class LocalInstallerCatalog:
Finds all macOS installers on the local machine.
"""
def __init__(self):
def __init__(self) -> None:
self.available_apps: dict = self._list_local_macOS_installers()
def _list_local_macOS_installers(self):
def _list_local_macOS_installers(self) -> dict:
"""
Searches for macOS installers in /Applications
@@ -537,7 +562,7 @@ class LocalInstallerCatalog:
return application_list
def _parse_sharedsupport_version(self, sharedsupport_path: Path):
def _parse_sharedsupport_version(self, sharedsupport_path: Path) -> tuple:
"""
Determine true version of macOS installer by parsing SharedSupport.dmg
This is required due to Info.plist reporting the application version, not the OS version
+2 -2
View File
@@ -25,7 +25,7 @@ class OpenCoreLegacyPatcher:
Initial entry point for starting OpenCore Legacy Patcher
"""
def __init__(self):
def __init__(self) -> None:
logging_handler.InitializeLoggingSupport()
self.constants: constants.Constants = constants.Constants()
@@ -40,7 +40,7 @@ class OpenCoreLegacyPatcher:
gui_main.wx_python_gui(self.constants).main_menu(None)
def _generate_base_data(self):
def _generate_base_data(self) -> None:
"""
Generate base data required for the patcher to run
"""
+26 -21
View File
@@ -32,14 +32,14 @@ class NetworkUtilities:
Utilities for network related tasks, primarily used for downloading files
"""
def __init__(self, url: str = None):
def __init__(self, url: str = None) -> None:
self.url: str = url
if self.url is None:
self.url = "https://github.com"
def verify_network_connection(self):
def verify_network_connection(self) -> bool:
"""
Verifies that the network is available
@@ -58,8 +58,13 @@ class NetworkUtilities:
):
return False
def validate_link(self):
# Check if link is 404
def validate_link(self) -> bool:
"""
Check for 404 error
Returns:
bool: True if link is valid, False otherwise
"""
try:
response = SESSION.head(self.url, timeout=5, allow_redirects=True)
if response.status_code == 404:
@@ -93,7 +98,7 @@ class DownloadObject:
"""
def __init__(self, url: str, path: str):
def __init__(self, url: str, path: str) -> None:
self.url: str = url
self.status: str = DownloadStatus.INACTIVE
self.error_msg: str = ""
@@ -121,11 +126,11 @@ class DownloadObject:
self._populate_file_size()
def __del__(self):
def __del__(self) -> None:
self.stop()
def download(self, display_progress: bool = False, spawn_thread: bool = True, verify_checksum: bool = False):
def download(self, display_progress: bool = False, spawn_thread: bool = True, verify_checksum: bool = False) -> None:
"""
Download the file
@@ -152,7 +157,8 @@ class DownloadObject:
self.should_checksum = verify_checksum
self._download(display_progress)
def download_simple(self, verify_checksum: bool = False):
def download_simple(self, verify_checksum: bool = False) -> str or bool:
"""
Alternative to download(), mimics utilities.py's old download_file() function
@@ -176,7 +182,7 @@ class DownloadObject:
return self.checksum.hexdigest() if self.checksum else True
def _get_filename(self):
def _get_filename(self) -> str:
"""
Get the filename from the URL
@@ -187,7 +193,7 @@ class DownloadObject:
return Path(self.url).name
def _populate_file_size(self):
def _populate_file_size(self) -> None:
"""
Get the file size of the file to be downloaded
@@ -206,7 +212,7 @@ class DownloadObject:
self.total_file_size = 0.0
def _update_checksum(self, chunk: bytes):
def _update_checksum(self, chunk: bytes) -> None:
"""
Update checksum with new chunk
@@ -216,7 +222,7 @@ class DownloadObject:
self._checksum_storage.update(chunk)
def _prepare_working_directory(self, path: Path):
def _prepare_working_directory(self, path: Path) -> bool:
"""
Validates working enviroment, including free space and removing existing files
@@ -253,7 +259,7 @@ class DownloadObject:
return True
def _download(self, display_progress: bool = False):
def _download(self, display_progress: bool = False) -> None:
"""
Download the file
@@ -306,7 +312,7 @@ class DownloadObject:
utilities.enable_sleep_after_running()
def get_percent(self):
def get_percent(self) -> float:
"""
Query the download percent
@@ -320,7 +326,7 @@ class DownloadObject:
return self.downloaded_file_size / self.total_file_size * 100
def get_speed(self):
def get_speed(self) -> float:
"""
Query the download speed
@@ -331,7 +337,7 @@ class DownloadObject:
return self.downloaded_file_size / (time.time() - self.start_time)
def get_time_remaining(self):
def get_time_remaining(self) -> float:
"""
Query the time remaining for the download
@@ -345,7 +351,7 @@ class DownloadObject:
return (self.total_file_size - self.downloaded_file_size) / self.get_speed()
def get_file_size(self):
def get_file_size(self) -> float:
"""
Query the file size of the file to be downloaded
@@ -356,7 +362,7 @@ class DownloadObject:
return self.total_file_size
def is_active(self):
def is_active(self) -> bool:
"""
Query if the download is active
@@ -369,12 +375,11 @@ class DownloadObject:
return False
def stop(self):
def stop(self) -> None:
"""
Stop the download
Returns:
boolean: If the download is active, this function will hold the thread until stopped
If the download is active, this function will hold the thread until stopped
"""
self.should_stop = True
+5 -5
View File
@@ -10,11 +10,11 @@ class OSProbe:
Library for querying OS information specific to macOS
"""
def __init__(self):
def __init__(self) -> None:
self.uname_data = platform.uname()
def detect_kernel_major(self):
def detect_kernel_major(self) -> int:
"""
Detect the booted major kernel version
@@ -25,7 +25,7 @@ class OSProbe:
return int(self.uname_data.release.partition(".")[0])
def detect_kernel_minor(self):
def detect_kernel_minor(self) -> int:
"""
Detect the booted minor kernel version
@@ -36,7 +36,7 @@ class OSProbe:
return int(self.uname_data.release.partition(".")[2].partition(".")[0])
def detect_os_version(self):
def detect_os_version(self) -> str:
"""
Detect the booted OS version
@@ -51,7 +51,7 @@ class OSProbe:
return result.stdout.decode().strip()
def detect_os_build(self, rsr: bool = False):
def detect_os_build(self, rsr: bool = False) -> str:
"""
Detect the booted OS build
+3 -3
View File
@@ -13,13 +13,13 @@ from resources import constants
class RoutePayloadDiskImage:
def __init__(self, global_constants: constants.Constants):
def __init__(self, global_constants: constants.Constants) -> None:
self.constants: constants.Constants = global_constants
self._setup_tmp_disk_image()
def _setup_tmp_disk_image(self):
def _setup_tmp_disk_image(self) -> None:
"""
Initialize temp directory and mount payloads.dmg
Create overlay for patcher to write to
@@ -55,7 +55,7 @@ class RoutePayloadDiskImage:
logging.info(f"Return Code: {output.returncode}")
def _unmount_active_dmgs(self, unmount_all_active=True):
def _unmount_active_dmgs(self, unmount_all_active=True) -> None:
"""
Unmounts disk images associated with OCLP
+13 -4
View File
@@ -120,6 +120,8 @@ class DetectRootPatch:
self.supports_metal = True
if self.constants.detected_os >= os_data.os_data.ventura:
self.amfi_must_disable = True
if (self.constants.detected_os == os_data.os_data.ventura and self.constants.detected_os_minor >= 4) or self.constants.detected_os > os_data.os_data.ventura:
self.amfi_shim_bins = True
elif gpu.arch in [
device_probe.NVIDIA.Archs.Fermi,
device_probe.NVIDIA.Archs.Kepler,
@@ -205,11 +207,15 @@ class DetectRootPatch:
self.ivy_gpu = True
if self.constants.detected_os >= os_data.os_data.ventura:
self.amfi_must_disable = True
if (self.constants.detected_os == os_data.os_data.ventura and self.constants.detected_os_minor >= 4) or self.constants.detected_os > os_data.os_data.ventura:
self.amfi_shim_bins = True
self.supports_metal = True
elif gpu.arch == device_probe.Intel.Archs.Haswell:
if self.constants.detected_os > os_data.os_data.monterey:
self.haswell_gpu = True
self.amfi_must_disable = True
if (self.constants.detected_os == os_data.os_data.ventura and self.constants.detected_os_minor >= 4) or self.constants.detected_os > os_data.os_data.ventura:
self.amfi_shim_bins = True
self.supports_metal = True
elif gpu.arch == device_probe.Intel.Archs.Broadwell:
if self.constants.detected_os > os_data.os_data.monterey:
@@ -738,7 +744,7 @@ class DetectRootPatch:
dict: Dictionary of patches to be applied from sys_patch_dict.py
"""
all_hardware_patchset: dict = sys_patch_dict.SystemPatchDictionary(self.constants.detected_os, self.constants.detected_os_minor, self.constants.legacy_accel_support)
all_hardware_patchset: dict = sys_patch_dict.SystemPatchDictionary(self.constants.detected_os, self.constants.detected_os_minor, self.constants.legacy_accel_support).patchset_dict
required_patches: dict = {}
utilities.cls()
@@ -752,13 +758,16 @@ class DetectRootPatch:
if hardware_details["Graphics: Intel Sandy Bridge"] is True:
required_patches.update({"Non-Metal Common": all_hardware_patchset["Graphics"]["Non-Metal Common"]})
required_patches.update({"Non-Metal ColorSync Workaround": all_hardware_patchset["Graphics"]["Non-Metal ColorSync Workaround"]})
required_patches.update({"High Sierra GVA": all_hardware_patchset["Graphics"]["High Sierra GVA"]})
required_patches.update({"WebKit Monterey Common": all_hardware_patchset["Graphics"]["WebKit Monterey Common"]})
required_patches.update({"Intel Sandy Bridge": all_hardware_patchset["Graphics"]["Intel Sandy Bridge"]})
# Patchset breaks Display Profiles, don't install if primary GPU is AMD
if self.constants.computer.real_model not in ["Macmini5,2", "iMac12,1", "iMac12,2"]:
required_patches.update({"Non-Metal ColorSync Workaround": all_hardware_patchset["Graphics"]["Non-Metal ColorSync Workaround"]})
if hardware_details["Graphics: Intel Ivy Bridge"] is True:
required_patches.update({"Metal 3802 Common": all_hardware_patchset["Graphics"]["Metal 3802 Common"]})
required_patches.update({"Metal 3802 Common Extended": all_hardware_patchset["Graphics"]["Metal 3802 Common Extended"]})
required_patches.update({"Catalina GVA": all_hardware_patchset["Graphics"]["Catalina GVA"]})
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
required_patches.update({"Big Sur OpenCL": all_hardware_patchset["Graphics"]["Big Sur OpenCL"]})
@@ -767,6 +776,7 @@ class DetectRootPatch:
if hardware_details["Graphics: Intel Haswell"] is True:
required_patches.update({"Metal 3802 Common": all_hardware_patchset["Graphics"]["Metal 3802 Common"]})
required_patches.update({"Metal 3802 Common Extended": all_hardware_patchset["Graphics"]["Metal 3802 Common Extended"]})
required_patches.update({"Monterey GVA": all_hardware_patchset["Graphics"]["Monterey GVA"]})
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
required_patches.update({"Intel Haswell": all_hardware_patchset["Graphics"]["Intel Haswell"]})
@@ -795,8 +805,8 @@ class DetectRootPatch:
required_patches.update({"Non-Metal Enforcement": all_hardware_patchset["Graphics"]["Non-Metal Enforcement"]})
if hardware_details["Graphics: Nvidia Kepler"] is True:
required_patches.update({"Revert Metal Downgrade": all_hardware_patchset["Graphics"]["Revert Metal Downgrade"]})
required_patches.update({"Metal 3802 Common": all_hardware_patchset["Graphics"]["Metal 3802 Common"]})
required_patches.update({"Metal 3802 Common Extended": all_hardware_patchset["Graphics"]["Metal 3802 Common Extended"]})
required_patches.update({"Catalina GVA": all_hardware_patchset["Graphics"]["Catalina GVA"]})
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
required_patches.update({"Big Sur OpenCL": all_hardware_patchset["Graphics"]["Big Sur OpenCL"]})
@@ -827,7 +837,6 @@ class DetectRootPatch:
del(required_patches["AMD TeraScale 2"]["Install"]["/System/Library/Extensions"]["AMDRadeonX3000.kext"])
if hardware_details["Graphics: AMD Legacy GCN"] is True or hardware_details["Graphics: AMD Legacy Polaris"] is True:
required_patches.update({"Revert Metal Downgrade": all_hardware_patchset["Graphics"]["Revert Metal Downgrade"]})
required_patches.update({"Monterey GVA": all_hardware_patchset["Graphics"]["Monterey GVA"]})
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
if hardware_details["Graphics: AMD Legacy GCN"] is True:
+5 -5
View File
@@ -11,14 +11,14 @@ REPO_LATEST_RELEASE_URL: str = "https://api.github.com/repos/dortania/OpenCore-L
class CheckBinaryUpdates:
def __init__(self, global_constants: constants.Constants):
def __init__(self, global_constants: constants.Constants) -> None:
self.constants: constants.Constants = global_constants
self.binary_version = self.constants.patcher_version
self.binary_version_array = [int(x) for x in self.binary_version.split(".")]
def _check_if_build_newer(self, remote_version: list = None, local_version: list = None):
def _check_if_build_newer(self, remote_version: list = None, local_version: list = None) -> bool:
"""
Check if the remote version is newer than the local version
@@ -50,7 +50,7 @@ class CheckBinaryUpdates:
return False
def _determine_local_build_type(self):
def _determine_local_build_type(self) -> str:
"""
Check if the local build is a GUI or TUI build
@@ -64,7 +64,7 @@ class CheckBinaryUpdates:
return "TUI"
def _determine_remote_type(self, remote_name: str):
def _determine_remote_type(self, remote_name: str) -> str:
"""
Check if the remote build is a GUI or TUI build
@@ -83,7 +83,7 @@ class CheckBinaryUpdates:
return "Unknown"
def check_binary_updates(self):
def check_binary_updates(self) -> dict:
"""
Check if any updates are available for the OpenCore Legacy Patcher binary
+11 -1
View File
@@ -422,9 +422,19 @@ def find_disk_off_uuid(uuid):
return None
def get_free_space(disk=None):
"""
Get free space on disk in bytes
Parameters:
disk (str): Path to mounted disk (or folder on disk)
Returns:
int: Free space in bytes
"""
if disk is None:
disk = "/"
total, used, free = shutil.disk_usage("/")
total, used, free = shutil.disk_usage(disk)
return free
def grab_mount_point_from_disk(disk):
+11 -7
View File
@@ -15,7 +15,7 @@ class PatcherValidation:
Primarily for Continuous Integration
"""
def __init__(self, global_constants: constants.Constants):
def __init__(self, global_constants: constants.Constants) -> None:
self.constants: constants.Constants = global_constants
self.constants.validate = True
@@ -54,7 +54,7 @@ class PatcherValidation:
self._validate_sys_patch()
def _build_prebuilt(self):
def _build_prebuilt(self) -> None:
"""
Generate a build for each predefined model
Then validate against ocvalidate
@@ -73,7 +73,7 @@ class PatcherValidation:
logging.info(f"Validation succeeded for predefined model: {model}")
def _build_dumps(self):
def _build_dumps(self) -> None:
"""
Generate a build for each predefined model
Then validate against ocvalidate
@@ -93,12 +93,16 @@ class PatcherValidation:
logging.info(f"Validation succeeded for predefined model: {self.constants.computer.real_model}")
def _validate_root_patch_files(self, major_kernel, minor_kernel):
def _validate_root_patch_files(self, major_kernel: int, minor_kernel: int) -> None:
"""
Validate that all files in the patchset are present in the payload
Parameters:
major_kernel (int): Major kernel version
minor_kernel (int): Minor kernel version
"""
patchset = sys_patch_dict.SystemPatchDictionary(major_kernel, minor_kernel, self.constants.legacy_accel_support)
patchset = sys_patch_dict.SystemPatchDictionary(major_kernel, minor_kernel, self.constants.legacy_accel_support).patchset_dict
host_os_float = float(f"{major_kernel}.{minor_kernel}")
for patch_subject in patchset:
@@ -124,7 +128,7 @@ class PatcherValidation:
Path(self.constants.payload_path / f"OpenCore-Legacy-Patcher-{major_kernel}.{minor_kernel}.plist").unlink()
def _validate_sys_patch(self):
def _validate_sys_patch(self) -> None:
"""
Validates sys_patch modules
"""
@@ -160,7 +164,7 @@ class PatcherValidation:
logging.info("- Skipping Root Patch File integrity validation")
def _validate_configs(self):
def _validate_configs(self) -> None:
"""
Validates build modules
"""