mirror of
https://github.com/dortania/OpenCore-Legacy-Patcher.git
synced 2026-04-23 11:30:15 +10:00
Merge branch 'main' into main
This commit is contained in:
30
CHANGELOG.md
30
CHANGELOG.md
@@ -1,5 +1,17 @@
|
|||||||
# OpenCore Legacy Patcher changelog
|
# 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
|
## 0.6.2
|
||||||
- Work around Black Box rendering issues on certain Display Color Profiles
|
- Work around Black Box rendering issues on certain Display Color Profiles
|
||||||
- Limited to Ventura currently due to limitations with other 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
|
- Fixed System Settings hover effects, including Bluetooth connect button
|
||||||
- Add Books hacks (reimplement cover image generation, disable broken page curl animation)
|
- Add Books hacks (reimplement cover image generation, disable broken page curl animation)
|
||||||
- Fixed unresponsive buttons
|
- 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
|
- Applicable for pre-Haswell Macs on macOS Ventura
|
||||||
- Resolves DRM playback issues on Netflix, Disney+, etc.
|
- 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
|
- 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)
|
- Primarily applicable for MXM 3.0 variants of AMD WX3200 (0x6981) and AMD RX5500XT (0x7340)
|
||||||
- Credit to [Ausdauersportler](https://github.com/Ausdauersportler) for implementation
|
- Credit to [Ausdauersportler](https://github.com/Ausdauersportler) for implementation
|
||||||
- Implement Continuity Camera Unlocking for pre-Kaby Lake CPUs
|
- Implement Continuity Camera Unlocking for pre-Kaby Lake CPUs
|
||||||
- Applicable for all legacy Macs in macOS Ventura
|
- 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:
|
- Backend Changes:
|
||||||
- Refactored kdk_handler.py
|
- Refactored kdk_handler.py
|
||||||
- Prioritizes KdkSupportPkg repository for downloads
|
- Prioritizes KdkSupportPkg repository for downloads
|
||||||
@@ -34,7 +53,7 @@
|
|||||||
- Support local loose matching when no network connection is available
|
- Support local loose matching when no network connection is available
|
||||||
- Implement pkg receipt verification to validate integrity of KDKs
|
- Implement pkg receipt verification to validate integrity of KDKs
|
||||||
- Implemented logging framework usage for more reliable logging
|
- 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
|
- Subsequent runs are appended to the log, allowing for easy debugging
|
||||||
- Implemented new network_handler.py module
|
- Implemented new network_handler.py module
|
||||||
- Allows for more reliable network calls and downloads
|
- Allows for more reliable network calls and downloads
|
||||||
@@ -54,9 +73,14 @@
|
|||||||
- pyinstaller - 5.7.0
|
- pyinstaller - 5.7.0
|
||||||
- packaging - 23.0
|
- packaging - 23.0
|
||||||
- Increment Binaries:
|
- Increment Binaries:
|
||||||
- PatcherSupportPkg 0.8.4 - release
|
- PatcherSupportPkg 0.8.7 - release
|
||||||
- AutoPkgInstaller 1.0.2 - release
|
- AutoPkgInstaller 1.0.2 - release
|
||||||
- FeatureUnlock 1.1.4 - rolling (0e8d87f)
|
- 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
|
## 0.6.1
|
||||||
- Avoid usage of KDKlessWorkaround on hardware not requiring it
|
- Avoid usage of KDKlessWorkaround on hardware not requiring it
|
||||||
|
|||||||
@@ -1,35 +1,85 @@
|
|||||||
# Dictionary defining patch sets used during Root Volume patching (sys_patch.py)
|
# Dictionary defining patch sets used during Root Volume patching (sys_patch.py)
|
||||||
# Copyright (C) 2022, Mykola Grymalyuk
|
# Copyright (C) 2022-2023, Mykola Grymalyuk
|
||||||
|
|
||||||
# Schema for sys_patch_dict.py:
|
|
||||||
# Supports 6 types of higher level keys:
|
|
||||||
# - OS Support: Supported OSes by patches - Dictionary of Min/Max Kernel Major and Minor versions
|
|
||||||
# - Install: Install to root volume - Dictionary of strings with string value of source
|
|
||||||
# - Install Non-Root: Install to data partition - Dictionary of strings with string value of source
|
|
||||||
# - Remove: Files to remove - Array of strings
|
|
||||||
# - Processes: Additional processes to run - Dictionary of strings with boolean value of requires root
|
|
||||||
# - Display Name: User-friendly name - String
|
|
||||||
|
|
||||||
# File Storage is based off the origin, ie. '10.13.6/System/Library/Extensions/IOSurface.kext'
|
|
||||||
# Stubbed binaries are OS specific, they use the 'os_major' variable to denounce which folder to use
|
|
||||||
|
|
||||||
from data import os_data
|
from data import os_data
|
||||||
|
|
||||||
def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|
||||||
# @os_major: XNU Kernel Major (int)
|
class SystemPatchDictionary():
|
||||||
# @os_minor: XNU Kernel Minor (int)
|
"""
|
||||||
# @non_metal_os_support: Array of supported OSes (XNU Kernel Majors (int))
|
Library for generating patch sets for sys_patch.py and supporting modules
|
||||||
sys_patch_dict = {
|
|
||||||
|
Usage:
|
||||||
|
>>> patchsets = SystemPatchDictionary(22, 0, [20, 21, 22]).patchset_dict
|
||||||
|
|
||||||
|
|
||||||
|
Patchset Schema:
|
||||||
|
Supports 6 types of higher level keys:
|
||||||
|
- OS Support: Supported OSes by patches
|
||||||
|
- Minimum OS Support: Minimum supported OS version
|
||||||
|
- OS Major: Major XNU Kernel version
|
||||||
|
- OS Minor: Minor XNU Kernel version
|
||||||
|
- Maximum OS Support: Maximum supported OS version
|
||||||
|
- OS Major: Major XNU Kernel version
|
||||||
|
- OS Minor: Minor XNU Kernel version
|
||||||
|
- Install: Files to install to root volume
|
||||||
|
- Location:
|
||||||
|
- File (dict: { "File": "Source" })
|
||||||
|
- Install Non-Root: Files to install to data partition
|
||||||
|
- Location:
|
||||||
|
- File (dict: { "File": "Source" })
|
||||||
|
- Remove: Files to remove
|
||||||
|
- Location:
|
||||||
|
- File (array: [ "File" ])
|
||||||
|
- Processes: Additional processes to run
|
||||||
|
- Process (dict: { "Process": "Requires Root" })
|
||||||
|
- Display Name: User-friendly name (string, "" if user-friendly name is not required)
|
||||||
|
|
||||||
|
|
||||||
|
Schema file storage is based off the origin, ie. '10.13.6/System/Library/Extensions/IOSurface.kext':
|
||||||
|
|
||||||
|
"Install": {
|
||||||
|
"/System/Library/Extensions": {
|
||||||
|
"IOSurface.kext": "10.13.6",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
Note: Stubbed binaries are OS specific, thus use the 'self.os_major' variable to denounce which folder variant to use
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, os_major: int, os_minor: int, non_metal_os_support: list) -> None:
|
||||||
|
"""
|
||||||
|
Parameters:
|
||||||
|
os_major (int): Major XNU Kernel version
|
||||||
|
os_minor (int): Minor XNU Kernel version
|
||||||
|
non_metal_os_support (list): List of supported non-metal OSes (XNU Major Versions)
|
||||||
|
|
||||||
|
'non_metal_os_support' is assumed to be sorted from oldest to newest
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.os_major: int = os_major
|
||||||
|
self.os_minor: int = os_minor
|
||||||
|
self.non_metal_os_support: list = non_metal_os_support
|
||||||
|
self.patchset_dict: dict = {}
|
||||||
|
|
||||||
|
self._generate_sys_patch_dict()
|
||||||
|
|
||||||
|
|
||||||
|
def _generate_sys_patch_dict(self):
|
||||||
|
"""
|
||||||
|
Generates the sys_patch_dict dictionary
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.patchset_dict = {
|
||||||
"Graphics": {
|
"Graphics": {
|
||||||
"Non-Metal Common": {
|
"Non-Metal Common": {
|
||||||
"Display Name": "",
|
"Display Name": "",
|
||||||
"OS Support": {
|
"OS Support": {
|
||||||
"Minimum OS Support": {
|
"Minimum OS Support": {
|
||||||
"OS Major": non_metal_os_support[0],
|
"OS Major": self.non_metal_os_support[0],
|
||||||
"OS Minor": 0
|
"OS Minor": 0
|
||||||
},
|
},
|
||||||
"Maximum OS Support": {
|
"Maximum OS Support": {
|
||||||
"OS Major": non_metal_os_support[-1],
|
"OS Major": self.non_metal_os_support[-1],
|
||||||
"OS Minor": 99
|
"OS Minor": 99
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -39,13 +89,13 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
},
|
},
|
||||||
"/System/Library/Frameworks": {
|
"/System/Library/Frameworks": {
|
||||||
"OpenGL.framework": "10.14.3",
|
"OpenGL.framework": "10.14.3",
|
||||||
"CoreDisplay.framework": f"10.14.4-{os_major}",
|
"CoreDisplay.framework": f"10.14.4-{self.os_major}",
|
||||||
"IOSurface.framework": f"10.15.7-{os_major}",
|
"IOSurface.framework": f"10.15.7-{self.os_major}",
|
||||||
"QuartzCore.framework": f"10.15.7-{os_major}",
|
"QuartzCore.framework": f"10.15.7-{self.os_major}",
|
||||||
},
|
},
|
||||||
"/System/Library/PrivateFrameworks": {
|
"/System/Library/PrivateFrameworks": {
|
||||||
"GPUSupport.framework": "10.14.3",
|
"GPUSupport.framework": "10.14.3",
|
||||||
"SkyLight.framework": f"10.14.6-{os_major}",
|
"SkyLight.framework": f"10.14.6-{self.os_major}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"Remove": {
|
"Remove": {
|
||||||
@@ -79,13 +129,13 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
},
|
},
|
||||||
"Install Non-Root": {
|
"Install Non-Root": {
|
||||||
"/Library/Application Support/SkyLightPlugins": {
|
"/Library/Application Support/SkyLightPlugins": {
|
||||||
**({ "DropboxHack.dylib": "SkyLightPlugins" } if os_major >= os_data.os_data.monterey else {}),
|
**({ "DropboxHack.dylib": "SkyLightPlugins" } if self.os_major >= os_data.os_data.monterey else {}),
|
||||||
**({ "DropboxHack.txt": "SkyLightPlugins" } if os_major >= os_data.os_data.monterey else {}),
|
**({ "DropboxHack.txt": "SkyLightPlugins" } if self.os_major >= os_data.os_data.monterey else {}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"Processes": {
|
"Processes": {
|
||||||
# 'When Space Allows' option introduced in 12.4 (XNU 21.5)
|
# 'When Space Allows' option introduced in 12.4 (XNU 21.5)
|
||||||
**({"defaults write /Library/Preferences/.GlobalPreferences.plist ShowDate -int 1": True } if os_data.os_conversion.is_os_newer(os_data.os_data.monterey, 4, os_major, os_minor) else {}),
|
**({"defaults write /Library/Preferences/.GlobalPreferences.plist ShowDate -int 1": True } if os_data.os_conversion.is_os_newer(os_data.os_data.monterey, 4, self.os_major, self.os_minor) else {}),
|
||||||
"defaults write /Library/Preferences/.GlobalPreferences.plist InternalDebugUseGPUProcessForCanvasRenderingEnabled -bool false": True,
|
"defaults write /Library/Preferences/.GlobalPreferences.plist InternalDebugUseGPUProcessForCanvasRenderingEnabled -bool false": True,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -95,11 +145,11 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
"Display Name": "",
|
"Display Name": "",
|
||||||
"OS Support": {
|
"OS Support": {
|
||||||
"Minimum OS Support": {
|
"Minimum OS Support": {
|
||||||
"OS Major": non_metal_os_support[0],
|
"OS Major": self.non_metal_os_support[0],
|
||||||
"OS Minor": 0
|
"OS Minor": 0
|
||||||
},
|
},
|
||||||
"Maximum OS Support": {
|
"Maximum OS Support": {
|
||||||
"OS Major": non_metal_os_support[-1],
|
"OS Major": self.non_metal_os_support[-1],
|
||||||
"OS Minor": 99
|
"OS Minor": 99
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -109,12 +159,12 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
"IOSurface.kext": "10.14.6",
|
"IOSurface.kext": "10.14.6",
|
||||||
},
|
},
|
||||||
"/System/Library/Frameworks": {
|
"/System/Library/Frameworks": {
|
||||||
"IOSurface.framework": f"10.14.6-{os_major}",
|
"IOSurface.framework": f"10.14.6-{self.os_major}",
|
||||||
"OpenCL.framework": "10.13.6",
|
"OpenCL.framework": "10.13.6",
|
||||||
},
|
},
|
||||||
"/System/Library/PrivateFrameworks": {
|
"/System/Library/PrivateFrameworks": {
|
||||||
"GPUSupport.framework": "10.13.6",
|
"GPUSupport.framework": "10.13.6",
|
||||||
"IOAccelerator.framework": f"10.13.6-{os_major}",
|
"IOAccelerator.framework": f"10.13.6-{self.os_major}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"Remove": {
|
"Remove": {
|
||||||
@@ -129,17 +179,17 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
"Display Name": "",
|
"Display Name": "",
|
||||||
"OS Support": {
|
"OS Support": {
|
||||||
"Minimum OS Support": {
|
"Minimum OS Support": {
|
||||||
"OS Major": non_metal_os_support[0],
|
"OS Major": self.non_metal_os_support[0],
|
||||||
"OS Minor": 0
|
"OS Minor": 0
|
||||||
},
|
},
|
||||||
"Maximum OS Support": {
|
"Maximum OS Support": {
|
||||||
"OS Major": non_metal_os_support[-1],
|
"OS Major": self.non_metal_os_support[-1],
|
||||||
"OS Minor": 99
|
"OS Minor": 99
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"Install": {
|
"Install": {
|
||||||
"/System/Library/Frameworks": {
|
"/System/Library/Frameworks": {
|
||||||
"CoreDisplay.framework": f"10.13.6-{os_major}",
|
"CoreDisplay.framework": f"10.13.6-{self.os_major}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -154,11 +204,11 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
"Display Name": "",
|
"Display Name": "",
|
||||||
"OS Support": {
|
"OS Support": {
|
||||||
"Minimum OS Support": {
|
"Minimum OS Support": {
|
||||||
"OS Major": non_metal_os_support[0],
|
"OS Major": self.non_metal_os_support[0],
|
||||||
"OS Minor": 0
|
"OS Minor": 0
|
||||||
},
|
},
|
||||||
"Maximum OS Support": {
|
"Maximum OS Support": {
|
||||||
"OS Major": non_metal_os_support[-1],
|
"OS Major": self.non_metal_os_support[-1],
|
||||||
"OS Minor": 99
|
"OS Minor": 99
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -179,13 +229,13 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
"OS Minor": 0
|
"OS Minor": 0
|
||||||
},
|
},
|
||||||
"Maximum OS Support": {
|
"Maximum OS Support": {
|
||||||
"OS Major": non_metal_os_support[-1],
|
"OS Major": self.non_metal_os_support[-1],
|
||||||
"OS Minor": 99
|
"OS Minor": 99
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"Install": {
|
"Install": {
|
||||||
"/System/Library/Frameworks": {
|
"/System/Library/Frameworks": {
|
||||||
"ColorSync.framework": f"10.15.7-{os_major}",
|
"ColorSync.framework": f"10.15.7-{self.os_major}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -298,7 +348,6 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
|
|
||||||
# Support for 3802 GPUs were broken with 13.3+
|
# Support for 3802 GPUs were broken with 13.3+
|
||||||
# Downgrades 31001 stack to 13.2.1, however nukes AMFI support
|
# Downgrades 31001 stack to 13.2.1, however nukes AMFI support
|
||||||
# Extremely fugly, only for reference purposes at this time
|
|
||||||
"Metal 3802 Common Extended": {
|
"Metal 3802 Common Extended": {
|
||||||
"Display Name": "",
|
"Display Name": "",
|
||||||
"OS Support": {
|
"OS Support": {
|
||||||
@@ -311,7 +360,7 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
"OS Minor": 99
|
"OS Minor": 99
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"Install Reference": {
|
"Install": {
|
||||||
"/System/Library/Frameworks": {
|
"/System/Library/Frameworks": {
|
||||||
"Metal.framework": "13.2.1",
|
"Metal.framework": "13.2.1",
|
||||||
},
|
},
|
||||||
@@ -393,7 +442,7 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
"Display Name": "",
|
"Display Name": "",
|
||||||
"OS Support": {
|
"OS Support": {
|
||||||
"Minimum OS Support": {
|
"Minimum OS Support": {
|
||||||
"OS Major": non_metal_os_support[0],
|
"OS Major": self.non_metal_os_support[0],
|
||||||
"OS Minor": 0
|
"OS Minor": 0
|
||||||
},
|
},
|
||||||
"Maximum OS Support": {
|
"Maximum OS Support": {
|
||||||
@@ -489,7 +538,7 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
"NVDANV50HalTesla.kext": "10.13.6",
|
"NVDANV50HalTesla.kext": "10.13.6",
|
||||||
"NVDAResmanTesla.kext": "10.13.6",
|
"NVDAResmanTesla.kext": "10.13.6",
|
||||||
# Apple dropped NVDAStartup in 12.0 Beta 7 (XNU 21.1)
|
# Apple dropped NVDAStartup in 12.0 Beta 7 (XNU 21.1)
|
||||||
**({ "NVDAStartup.kext": "12.0 Beta 6" } if os_data.os_conversion.is_os_newer(os_data.os_data.monterey, 0, os_major, os_minor) else {})
|
**({ "NVDAStartup.kext": "12.0 Beta 6" } if os_data.os_conversion.is_os_newer(os_data.os_data.monterey, 0, self.os_major, self.os_minor) else {})
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -515,12 +564,12 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
"NVDAStartup.kext": "12.0 Beta 6",
|
"NVDAStartup.kext": "12.0 Beta 6",
|
||||||
"GeForceAIRPlugin.bundle": "11.0 Beta 3",
|
"GeForceAIRPlugin.bundle": "11.0 Beta 3",
|
||||||
"GeForceGLDriver.bundle": "11.0 Beta 3",
|
"GeForceGLDriver.bundle": "11.0 Beta 3",
|
||||||
"GeForceMTLDriver.bundle": "11.0 Beta 3" if os_major <= os_data.os_data.monterey else f"11.0 Beta 3-{os_major}",
|
"GeForceMTLDriver.bundle": "11.0 Beta 3" if self.os_major <= os_data.os_data.monterey else f"11.0 Beta 3-{self.os_major}",
|
||||||
"GeForceVADriver.bundle": "12.0 Beta 6",
|
"GeForceVADriver.bundle": "12.0 Beta 6",
|
||||||
},
|
},
|
||||||
"/System/Library/Frameworks": {
|
"/System/Library/Frameworks": {
|
||||||
# XNU 21.6 (macOS 12.5)
|
# XNU 21.6 (macOS 12.5)
|
||||||
**({ "Metal.framework": "12.5 Beta 2"} if (os_data.os_conversion.is_os_newer(os_data.os_data.monterey, 5, os_major, os_minor) and os_major < os_data.os_data.ventura) else {}),
|
**({ "Metal.framework": "12.5 Beta 2"} if (os_data.os_conversion.is_os_newer(os_data.os_data.monterey, 5, self.os_major, self.os_minor) and self.os_major < os_data.os_data.ventura) else {}),
|
||||||
},
|
},
|
||||||
"/System/Library/PrivateFrameworks": {
|
"/System/Library/PrivateFrameworks": {
|
||||||
"GPUCompiler.framework": "11.6",
|
"GPUCompiler.framework": "11.6",
|
||||||
@@ -1002,8 +1051,8 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
},
|
},
|
||||||
"Install Non-Root": {
|
"Install Non-Root": {
|
||||||
"/Library/Application Support/SkyLightPlugins": {
|
"/Library/Application Support/SkyLightPlugins": {
|
||||||
**({ "CoreWLAN.dylib": "SkyLightPlugins" } if os_major == os_data.os_data.monterey else {}),
|
**({ "CoreWLAN.dylib": "SkyLightPlugins" } if self.os_major == os_data.os_data.monterey else {}),
|
||||||
**({ "CoreWLAN.txt": "SkyLightPlugins" } if os_major == os_data.os_data.monterey else {}),
|
**({ "CoreWLAN.txt": "SkyLightPlugins" } if self.os_major == os_data.os_data.monterey else {}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -1094,11 +1143,11 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
"Display Name": "Miscellaneous: Legacy Keyboard Backlight",
|
"Display Name": "Miscellaneous: Legacy Keyboard Backlight",
|
||||||
"OS Support": {
|
"OS Support": {
|
||||||
"Minimum OS Support": {
|
"Minimum OS Support": {
|
||||||
"OS Major": non_metal_os_support[0],
|
"OS Major": self.non_metal_os_support[0],
|
||||||
"OS Minor": 0
|
"OS Minor": 0
|
||||||
},
|
},
|
||||||
"Maximum OS Support": {
|
"Maximum OS Support": {
|
||||||
"OS Major": non_metal_os_support[-1],
|
"OS Major": self.non_metal_os_support[-1],
|
||||||
"OS Minor": 99
|
"OS Minor": 99
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -1119,16 +1168,10 @@ def SystemPatchDictionary(os_major, os_minor, non_metal_os_support):
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
"Install": {
|
"Install": {
|
||||||
"/System/Library/Extensions/IOUSBHostFamily.kext/Contents/MacOS": {
|
"/System/Library/Extensions": {
|
||||||
"IOUSBHostFamily": "12.6.2",
|
"IOUSBHostFamily.kext": "12.6.2",
|
||||||
},
|
|
||||||
"/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns": {
|
|
||||||
"AppleUSBEHCI.kext": "12.6.2",
|
|
||||||
"AppleUSBHub.kext": "12.6.2",
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return sys_patch_dict
|
|
||||||
@@ -2699,6 +2699,8 @@
|
|||||||
<true/>
|
<true/>
|
||||||
<key>ResizeGpuBars</key>
|
<key>ResizeGpuBars</key>
|
||||||
<integer>-1</integer>
|
<integer>-1</integer>
|
||||||
|
<key>ResizeUsePciRbIo</key>
|
||||||
|
<false/>
|
||||||
<key>TscSyncTimeout</key>
|
<key>TscSyncTimeout</key>
|
||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
<key>UnblockFsConnect</key>
|
<key>UnblockFsConnect</key>
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
BIN
payloads/Kexts/Acidanthera/Lilu-v1.6.4-DEBUG.zip
Normal file
BIN
payloads/Kexts/Acidanthera/Lilu-v1.6.4-DEBUG.zip
Normal file
Binary file not shown.
BIN
payloads/Kexts/Acidanthera/Lilu-v1.6.4-RELEASE.zip
Normal file
BIN
payloads/Kexts/Acidanthera/Lilu-v1.6.4-RELEASE.zip
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
payloads/Kexts/Acidanthera/NVMeFix-v1.1.0-DEBUG.zip
Normal file
BIN
payloads/Kexts/Acidanthera/NVMeFix-v1.1.0-DEBUG.zip
Normal file
Binary file not shown.
BIN
payloads/Kexts/Acidanthera/NVMeFix-v1.1.0-RELEASE.zip
Normal file
BIN
payloads/Kexts/Acidanthera/NVMeFix-v1.1.0-RELEASE.zip
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
payloads/Kexts/Acidanthera/WhateverGreen-v1.6.4-DEBUG.zip
Normal file
BIN
payloads/Kexts/Acidanthera/WhateverGreen-v1.6.4-DEBUG.zip
Normal file
Binary file not shown.
BIN
payloads/Kexts/Acidanthera/WhateverGreen-v1.6.4-Navi-DEBUG.zip
Normal file
BIN
payloads/Kexts/Acidanthera/WhateverGreen-v1.6.4-Navi-DEBUG.zip
Normal file
Binary file not shown.
BIN
payloads/Kexts/Acidanthera/WhateverGreen-v1.6.4-Navi-RELEASE.zip
Normal file
BIN
payloads/Kexts/Acidanthera/WhateverGreen-v1.6.4-Navi-RELEASE.zip
Normal file
Binary file not shown.
BIN
payloads/Kexts/Acidanthera/WhateverGreen-v1.6.4-RELEASE.zip
Normal file
BIN
payloads/Kexts/Acidanthera/WhateverGreen-v1.6.4-RELEASE.zip
Normal file
Binary file not shown.
Binary file not shown.
BIN
payloads/Kexts/Misc/Innie-v1.3.1-DEBUG.zip
Normal file
BIN
payloads/Kexts/Misc/Innie-v1.3.1-DEBUG.zip
Normal file
Binary file not shown.
BIN
payloads/Kexts/Misc/Innie-v1.3.1-RELEASE.zip
Normal file
BIN
payloads/Kexts/Misc/Innie-v1.3.1-RELEASE.zip
Normal file
Binary file not shown.
253
payloads/Kexts/Update-Kexts.command
Executable file
253
payloads/Kexts/Update-Kexts.command
Executable 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.
@@ -28,7 +28,7 @@ class AmfiConfigurationDetection:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self) -> None:
|
||||||
self.AMFI_ALLOW_TASK_FOR_PID: bool = False
|
self.AMFI_ALLOW_TASK_FOR_PID: bool = False
|
||||||
self.AMFI_ALLOW_INVALID_SIGNATURE: bool = False
|
self.AMFI_ALLOW_INVALID_SIGNATURE: bool = False
|
||||||
self.AMFI_LV_ENFORCE_THIRD_PARTY: bool = False
|
self.AMFI_LV_ENFORCE_THIRD_PARTY: bool = False
|
||||||
@@ -45,7 +45,7 @@ class AmfiConfigurationDetection:
|
|||||||
self._parse_oclp_configuration()
|
self._parse_oclp_configuration()
|
||||||
|
|
||||||
|
|
||||||
def _init_nvram_dicts(self):
|
def _init_nvram_dicts(self) -> None:
|
||||||
"""
|
"""
|
||||||
Initialize the boot-args and OCLP-Settings NVRAM dictionaries
|
Initialize the boot-args and OCLP-Settings NVRAM dictionaries
|
||||||
"""
|
"""
|
||||||
@@ -60,7 +60,7 @@ class AmfiConfigurationDetection:
|
|||||||
self.oclp_args = oclp_args.split(" ")
|
self.oclp_args = oclp_args.split(" ")
|
||||||
|
|
||||||
|
|
||||||
def _parse_amfi_bitmask(self):
|
def _parse_amfi_bitmask(self) -> None:
|
||||||
"""
|
"""
|
||||||
Parse the AMFI bitmask from boot-args
|
Parse the AMFI bitmask from boot-args
|
||||||
See data/amfi_data.py for more information
|
See data/amfi_data.py for more information
|
||||||
@@ -96,7 +96,7 @@ class AmfiConfigurationDetection:
|
|||||||
self.AMFI_ALLOW_INVALID_SIGNATURE = True
|
self.AMFI_ALLOW_INVALID_SIGNATURE = True
|
||||||
|
|
||||||
|
|
||||||
def _parse_amfi_boot_args(self):
|
def _parse_amfi_boot_args(self) -> None:
|
||||||
"""
|
"""
|
||||||
Parse the AMFI boot-args
|
Parse the AMFI boot-args
|
||||||
"""
|
"""
|
||||||
@@ -121,7 +121,7 @@ class AmfiConfigurationDetection:
|
|||||||
self.AMFI_ALLOW_INVALID_SIGNATURE = True
|
self.AMFI_ALLOW_INVALID_SIGNATURE = True
|
||||||
|
|
||||||
|
|
||||||
def _parse_oclp_configuration(self):
|
def _parse_oclp_configuration(self) -> None:
|
||||||
"""
|
"""
|
||||||
Parse the OCLP configuration
|
Parse the OCLP configuration
|
||||||
"""
|
"""
|
||||||
@@ -130,7 +130,7 @@ class AmfiConfigurationDetection:
|
|||||||
self.SKIP_LIBRARY_VALIDATION = True
|
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
|
Check the AMFI configuration based on provided AMFI level
|
||||||
See AmfiConfigLevel enum for valid levels
|
See AmfiConfigLevel enum for valid levels
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from data import model_array
|
|||||||
# Generic building args
|
# Generic building args
|
||||||
class arguments:
|
class arguments:
|
||||||
|
|
||||||
def __init__(self, global_constants: constants.Constants):
|
def __init__(self, global_constants: constants.Constants) -> None:
|
||||||
self.constants: constants.Constants = global_constants
|
self.constants: constants.Constants = global_constants
|
||||||
|
|
||||||
self.args = utilities.check_cli_args()
|
self.args = utilities.check_cli_args()
|
||||||
@@ -20,7 +20,7 @@ class arguments:
|
|||||||
self._parse_arguments()
|
self._parse_arguments()
|
||||||
|
|
||||||
|
|
||||||
def _parse_arguments(self):
|
def _parse_arguments(self) -> None:
|
||||||
"""
|
"""
|
||||||
Parses arguments passed to the patcher
|
Parses arguments passed to the patcher
|
||||||
"""
|
"""
|
||||||
@@ -46,7 +46,7 @@ class arguments:
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def _validation_handler(self):
|
def _validation_handler(self) -> None:
|
||||||
"""
|
"""
|
||||||
Enter validation mode
|
Enter validation mode
|
||||||
"""
|
"""
|
||||||
@@ -54,7 +54,7 @@ class arguments:
|
|||||||
validation.PatcherValidation(self.constants)
|
validation.PatcherValidation(self.constants)
|
||||||
|
|
||||||
|
|
||||||
def _sys_patch_handler(self):
|
def _sys_patch_handler(self) -> None:
|
||||||
"""
|
"""
|
||||||
Start root volume patching
|
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()
|
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
|
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()
|
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
|
Start root volume auto patching
|
||||||
"""
|
"""
|
||||||
@@ -88,7 +88,7 @@ class arguments:
|
|||||||
sys_patch_auto.AutomaticSysPatch(self.constants).start_auto_patch()
|
sys_patch_auto.AutomaticSysPatch(self.constants).start_auto_patch()
|
||||||
|
|
||||||
|
|
||||||
def _build_handler(self):
|
def _build_handler(self) -> None:
|
||||||
"""
|
"""
|
||||||
Start config building process
|
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}")
|
logging.info(f"- Using detected model: {self.constants.computer.real_model}")
|
||||||
defaults.GenerateDefaults(self.constants.custom_model, True, self.constants)
|
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:
|
if self.args.verbose:
|
||||||
logging.info("- Set verbose configuration")
|
logging.info("- Set verbose configuration")
|
||||||
self.constants.verbose_debug = True
|
self.constants.verbose_debug = True
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import plistlib
|
|||||||
|
|
||||||
class ParseCommitInfo:
|
class ParseCommitInfo:
|
||||||
|
|
||||||
def __init__(self, binary_path: str):
|
def __init__(self, binary_path: str) -> None:
|
||||||
"""
|
"""
|
||||||
Parameters:
|
Parameters:
|
||||||
binary_path (str): Path to binary
|
binary_path (str): Path to binary
|
||||||
@@ -15,7 +15,7 @@ class ParseCommitInfo:
|
|||||||
self.plist_path = self._convert_binary_path_to_plist_path()
|
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
|
Resolve Info.plist path from binary path
|
||||||
"""
|
"""
|
||||||
@@ -27,7 +27,7 @@ class ParseCommitInfo:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def generate_commit_info(self):
|
def generate_commit_info(self) -> tuple:
|
||||||
"""
|
"""
|
||||||
Generate commit info from Info.plist
|
Generate commit info from Info.plist
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# pylint: disable=multiple-statements
|
# pylint: disable=multiple-statements
|
||||||
# Define Files
|
# Defines versioning, file paths and other settings for the patcher
|
||||||
# Copyright (C) 2020-2023, Dhinak G, Mykola Grymalyuk
|
# Copyright (C) 2020-2023, Dhinak G, Mykola Grymalyuk
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -10,212 +10,217 @@ from data import os_data
|
|||||||
|
|
||||||
|
|
||||||
class Constants:
|
class Constants:
|
||||||
def __init__(self):
|
def __init__(self) -> None:
|
||||||
# Patcher Versioning
|
# Patcher Versioning
|
||||||
self.patcher_version = "0.6.2" # OpenCore-Legacy-Patcher
|
self.patcher_version: str = "0.6.3" # OpenCore-Legacy-Patcher
|
||||||
self.patcher_support_pkg_version = "0.8.5" # PatcherSupportPkg
|
self.patcher_support_pkg_version: str = "0.9.2" # PatcherSupportPkg
|
||||||
self.url_patcher_support_pkg = "https://github.com/dortania/PatcherSupportPkg/releases/download/"
|
self.copyright_date: str = "Copyright © 2020-2023 Dortania"
|
||||||
self.nightly_url_patcher_support_pkg = "https://nightly.link/dortania/PatcherSupportPkg/workflows/build/master/"
|
|
||||||
self.discord_link = "https://discord.gg/rqdPgH8xSN"
|
# URLs
|
||||||
self.guide_link = "https://dortania.github.io/OpenCore-Legacy-Patcher/"
|
self.url_patcher_support_pkg: str = "https://github.com/dortania/PatcherSupportPkg/releases/download/"
|
||||||
self.repo_link = "https://github.com/dortania/OpenCore-Legacy-Patcher"
|
self.discord_link: str = "https://discord.gg/rqdPgH8xSN"
|
||||||
self.repo_link_latest = f"{self.repo_link}/releases/tag/{self.patcher_version}"
|
self.guide_link: str = "https://dortania.github.io/OpenCore-Legacy-Patcher/"
|
||||||
self.copyright_date = "Copyright © 2020-2023 Dortania"
|
self.repo_link: str = "https://github.com/dortania/OpenCore-Legacy-Patcher"
|
||||||
self.installer_pkg_url = f"{self.repo_link}/releases/download/{self.patcher_version}/AutoPkg-Assets.pkg"
|
self.installer_pkg_url: str = 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.installer_pkg_url_nightly: str = "http://nightly.link/dortania/OpenCore-Legacy-Patcher/workflows/build-app-wxpython/main/AutoPkg-Assets.pkg.zip"
|
||||||
|
|
||||||
# OpenCore Versioning
|
# OpenCore Versioning
|
||||||
# https://github.com/acidanthera/OpenCorePkg
|
# https://github.com/acidanthera/OpenCorePkg
|
||||||
self.opencore_commit = "a753334 - 01-02-2023"
|
self.opencore_commit: str = "e4f0ba1 - 03-06-2023"
|
||||||
self.opencore_version = "0.8.8"
|
self.opencore_version: str = "0.9.0"
|
||||||
|
|
||||||
# Kext Versioning
|
# Kext Versioning
|
||||||
## Acidanthera
|
## Acidanthera
|
||||||
## https://github.com/acidanthera
|
## https://github.com/acidanthera
|
||||||
self.lilu_version = "1.6.3" # Lilu
|
self.lilu_version: str = "1.6.4" # Lilu
|
||||||
self.whatevergreen_version = "1.6.3" # WhateverGreen
|
self.whatevergreen_version: str = "1.6.4" # WhateverGreen
|
||||||
self.whatevergreen_navi_version = "1.6.3-Navi" # WhateverGreen (Navi Patch)
|
self.whatevergreen_navi_version: str = "1.6.4-Navi" # WhateverGreen (Navi Patch)
|
||||||
self.airportbcrmfixup_version = "2.1.6" # AirPortBrcmFixup
|
self.airportbcrmfixup_version: str = "2.1.6" # AirPortBrcmFixup
|
||||||
self.nvmefix_version = "1.0.9" # NVMeFix
|
self.nvmefix_version: str = "1.1.0" # NVMeFix
|
||||||
self.applealc_version = "1.6.3" # AppleALC
|
self.applealc_version: str = "1.6.3" # AppleALC
|
||||||
self.restrictevents_version = "1.0.9" # RestrictEvents
|
self.restrictevents_version: str = "1.0.9" # RestrictEvents
|
||||||
self.featureunlock_version = "1.1.4" # FeatureUnlock
|
self.featureunlock_version: str = "1.1.4" # FeatureUnlock
|
||||||
self.debugenhancer_version = "1.0.7" # DebugEnhancer
|
self.debugenhancer_version: str = "1.0.7" # DebugEnhancer
|
||||||
self.cpufriend_version = "1.2.6" # CPUFriend
|
self.cpufriend_version: str = "1.2.6" # CPUFriend
|
||||||
self.bluetool_version = "2.6.4" # BlueToolFixup (BrcmPatchRAM)
|
self.bluetool_version: str = "2.6.4" # BlueToolFixup (BrcmPatchRAM)
|
||||||
self.cslvfixup_version = "2.6.1" # CSLVFixup
|
self.cslvfixup_version: str = "2.6.1" # CSLVFixup
|
||||||
self.autopkg_version = "1.0.2" # AutoPkgInstaller
|
self.autopkg_version: str = "1.0.2" # AutoPkgInstaller
|
||||||
self.cryptexfixup_version = "1.0.1" # CryptexFixup
|
self.cryptexfixup_version: str = "1.0.1" # CryptexFixup
|
||||||
|
|
||||||
## Apple
|
## Apple
|
||||||
## https://www.apple.com
|
## https://www.apple.com
|
||||||
self.marvel_version = "1.0.1" # MarvelYukonEthernet
|
self.marvel_version: str = "1.0.1" # MarvelYukonEthernet
|
||||||
self.nforce_version = "1.0.1" # nForceEthernet
|
self.nforce_version: str = "1.0.1" # nForceEthernet
|
||||||
self.piixata_version = "1.0.1" # AppleIntelPIIXATA
|
self.piixata_version: str = "1.0.1" # AppleIntelPIIXATA
|
||||||
self.fw_kext = "1.0.1" # IOFireWireFamily
|
self.fw_kext: str = "1.0.1" # IOFireWireFamily
|
||||||
self.apple_trackpad = "1.0.1" # AppleUSBTrackpad
|
self.apple_trackpad: str = "1.0.1" # AppleUSBTrackpad
|
||||||
self.apple_isight_version = "1.0.0" # AppleiSight
|
self.apple_isight_version: str = "1.0.0" # AppleiSight
|
||||||
self.apple_raid_version = "1.0.0" # AppleRAIDCard
|
self.apple_raid_version: str = "1.0.0" # AppleRAIDCard
|
||||||
self.apfs_zlib_version = "12.3.1" # NoAVXFSCompressionTypeZlib
|
self.apfs_zlib_version: str = "12.3.1" # NoAVXFSCompressionTypeZlib
|
||||||
self.apfs_zlib_v2_version = "12.6" # NoAVXFSCompressionTypeZlib (patched with AVXpel)
|
self.apfs_zlib_v2_version: str = "12.6" # NoAVXFSCompressionTypeZlib (patched with AVXpel)
|
||||||
self.multitouch_version = "1.0.0" # AppleUSBMultitouch
|
self.multitouch_version: str = "1.0.0" # AppleUSBMultitouch
|
||||||
self.topcase_version = "1.0.0" # AppleUSBTopCase
|
self.topcase_version: str = "1.0.0" # AppleUSBTopCase
|
||||||
self.intel_82574l_version = "1.0.0" # Intel82574L
|
self.intel_82574l_version: str = "1.0.0" # Intel82574L
|
||||||
self.intel_8254x_version = "1.0.0" # AppleIntel8254XEthernet
|
self.intel_8254x_version: str = "1.0.0" # AppleIntel8254XEthernet
|
||||||
self.apple_usb_11_injector = "1.0.0" # AppleUSBUHCI/OHCI
|
self.apple_usb_11_injector: str = "1.0.0" # AppleUSBUHCI/OHCI
|
||||||
self.aicpupm_version = "1.0.0" # AppleIntelCPUPowerManagement/Client
|
self.aicpupm_version: str = "1.0.0" # AppleIntelCPUPowerManagement/Client
|
||||||
|
|
||||||
## Apple - Dortania Modified
|
## Apple - Dortania Modified
|
||||||
self.bcm570_version = "1.0.2" # CatalinaBCM5701Ethernet
|
self.bcm570_version: str = "1.0.2" # CatalinaBCM5701Ethernet
|
||||||
self.i210_version = "1.0.0" # CatalinaIntelI210Ethernet
|
self.i210_version: str = "1.0.0" # CatalinaIntelI210Ethernet
|
||||||
self.corecaptureelcap_version = "1.0.1" # corecaptureElCap
|
self.corecaptureelcap_version: str = "1.0.1" # corecaptureElCap
|
||||||
self.io80211elcap_version = "2.0.0" # IO80211ElCap
|
self.io80211elcap_version: str = "2.0.0" # IO80211ElCap
|
||||||
self.bigsursdxc_version = "1.0.0" # BigSurSDXC
|
self.bigsursdxc_version: str = "1.0.0" # BigSurSDXC
|
||||||
self.monterey_ahci_version = "1.0.0" # CatalinaAHCI
|
self.monterey_ahci_version: str = "1.0.0" # CatalinaAHCI
|
||||||
|
|
||||||
## Dortania
|
## Dortania
|
||||||
## https://github.com/dortania
|
## https://github.com/dortania
|
||||||
self.backlight_injector_version = "1.1.0" # BacklightInjector
|
self.backlight_injector_version: str = "1.1.0" # BacklightInjector
|
||||||
self.backlight_injectorA_version = "1.0.0" # BacklightInjector iMac9,1
|
self.backlight_injectorA_version: str = "1.0.0" # BacklightInjector (iMac9,1)
|
||||||
self.smcspoof_version = "1.0.0" # SMC-Spoof
|
self.smcspoof_version: str = "1.0.0" # SMC-Spoof
|
||||||
self.mce_version = "1.0.0" # AppleMCEReporterDisabler
|
self.mce_version: str = "1.0.0" # AppleMCEReporterDisabler
|
||||||
self.btspoof_version = "1.0.0" # Bluetooth-Spoof
|
self.btspoof_version: str = "1.0.0" # Bluetooth-Spoof
|
||||||
self.aspp_override_version = "1.0.1" # ACPI_SMC_PlatformPlugin Override
|
self.aspp_override_version: str = "1.0.1" # ACPI_SMC_PlatformPlugin Override
|
||||||
self.rsrhelper_version = "1.0.0" # RSRHelper
|
self.rsrhelper_version: str = "1.0.0" # RSRHelper
|
||||||
|
|
||||||
## Syncretic
|
## Syncretic
|
||||||
## https://forums.macrumors.com/members/syncretic.1173816/
|
## https://forums.macrumors.com/members/syncretic.1173816/
|
||||||
## https://github.com/reenigneorcim/latebloom
|
## https://github.com/reenigneorcim/latebloom
|
||||||
self.mousse_version = "0.95-Dortania" # MouSSE
|
self.mousse_version: str = "0.95-Dortania" # MouSSE
|
||||||
self.telemetrap_version = "1.0.0" # telemetrap
|
self.telemetrap_version: str = "1.0.0" # telemetrap
|
||||||
|
|
||||||
## cdf
|
## cdf
|
||||||
## https://github.com/cdf/Innie
|
## https://github.com/cdf/Innie
|
||||||
self.innie_version = "1.3.0" # Innie
|
self.innie_version: str = "1.3.1" # Innie
|
||||||
|
|
||||||
## arter97
|
## arter97
|
||||||
## https://github.com/arter97/SimpleMSR/
|
## https://github.com/arter97/SimpleMSR/
|
||||||
self.simplemsr_version = "1.0.0" # SimpleMSR
|
self.simplemsr_version: str = "1.0.0" # SimpleMSR
|
||||||
|
|
||||||
## blackgate
|
## blackgate
|
||||||
## https://github.com/blackgate/AMDGPUWakeHandler
|
## https://github.com/blackgate/AMDGPUWakeHandler
|
||||||
self.gpu_wake_version = "1.0.0"
|
self.gpu_wake_version: str = "1.0.0"
|
||||||
|
|
||||||
## flagersgit
|
## flagersgit
|
||||||
## https://github.com/flagersgit/KDKlessWorkaround
|
## https://github.com/flagersgit/KDKlessWorkaround
|
||||||
self.kdkless_version = "1.0.0"
|
self.kdkless_version: str = "1.0.0"
|
||||||
|
|
||||||
# Get resource path
|
# Get resource path
|
||||||
self.current_path = Path(__file__).parent.parent.resolve()
|
self.current_path: Path = Path(__file__).parent.parent.resolve()
|
||||||
self.payload_path = self.current_path / Path("payloads")
|
self.payload_path: Path = self.current_path / Path("payloads")
|
||||||
|
|
||||||
# Patcher Settings
|
# Patcher Settings
|
||||||
self.allow_oc_everywhere = False # Set whether Patcher can be run on unsupported Macs
|
## Internal settings
|
||||||
self.gui_mode = False # Determine whether running in a GUI or TUI
|
self.allow_oc_everywhere: bool = False # Set whether Patcher can be run on unsupported Macs
|
||||||
self.disk = "" # Set installation ESP
|
self.gui_mode: bool = False # Determine whether running in a GUI or TUI
|
||||||
self.patch_disk = "" # Set Root Volume to patch
|
self.cli_mode: bool = False # Determine if running in CLI mode
|
||||||
self.validate = False # Enable validation testing for CI
|
self.validate: bool = False # Enable validation testing for CI
|
||||||
self.recovery_status = False # Detect if booted into RecoveryOS
|
self.recovery_status: bool = False # Detect if booted into RecoveryOS
|
||||||
self.launcher_binary = None # Determine launch binary (ie. Python vs PyInstaller)
|
self.ignore_updates: bool = False # Ignore OCLP updates
|
||||||
self.launcher_script = None # Determine launch file (if run via Python)
|
self.wxpython_variant: bool = False # Determine if using wxPython variant
|
||||||
self.ignore_updates = False # Ignore OCLP updates
|
self.has_checked_updates: bool = False # Determine if check for updates has been run
|
||||||
self.wxpython_variant = False # Determine if using wxPython variant
|
self.root_patcher_succeeded: bool = False # Determine if root patcher succeeded
|
||||||
self.unpack_thread = None # Determine if unpack thread finished
|
self.start_build_install: bool = False # Determine if build install should be started
|
||||||
self.cli_mode = False # Determine if running in CLI mode
|
self.host_is_non_metal: bool = False # Determine if host is non-metal (ie. enable UI hacks)
|
||||||
self.should_nuke_kdks = True # Determine if KDKs should be nuked if unused in /L*/D*/KDKs
|
self.needs_to_open_preferences: bool = False # Determine if preferences need to be opened
|
||||||
self.has_checked_updates = False # Determine if check for updates has been run
|
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
|
## Hardware
|
||||||
self.computer: device_probe.Computer = None # type: ignore
|
self.computer: device_probe.Computer = None # type: ignore
|
||||||
self.custom_model: Optional[str] = None
|
self.custom_model: Optional[str] = None
|
||||||
|
|
||||||
## OpenCore Settings
|
## OpenCore Settings
|
||||||
self.opencore_debug = False
|
self.opencore_debug: bool = False # Enable OpenCore debug
|
||||||
self.opencore_build = "RELEASE"
|
self.boot_efi: bool = False # Use EFI/BOOT/BOOTx64.efi vs boot.efi bootstrap
|
||||||
self.showpicker = True # Show or Hide OpenCore's Boot Picker
|
self.showpicker: bool = True # Show or Hide OpenCore's Boot Picker
|
||||||
self.boot_efi = False # Use EFI/BOOT/BOOTx64.efi bootstrap
|
self.nvram_write: bool = True # Write to hardware NVRAM
|
||||||
self.nvram_write = True # Write to hardware NVRAM
|
self.oc_timeout: int = 5 # Set OpenCore timeout
|
||||||
|
self.opencore_build: str = "RELEASE"
|
||||||
|
|
||||||
## Kext Settings
|
## Kext Settings
|
||||||
self.kext_debug = False # Enables Lilu debug and DebugEnhancer
|
self.kext_debug: bool = False # Enables Lilu debug and DebugEnhancer
|
||||||
self.kext_variant = "RELEASE"
|
self.kext_variant: str = "RELEASE"
|
||||||
|
|
||||||
## NVRAM Settings
|
## NVRAM Settings
|
||||||
self.verbose_debug = False # -v
|
self.verbose_debug: bool = False # -v
|
||||||
|
|
||||||
## SMBIOS Settings
|
## SMBIOS Settings
|
||||||
self.custom_cpu_model = 2 # Patch type value
|
self.serial_settings: str = "None" # Set SMBIOS level used
|
||||||
self.custom_cpu_model_value = "" # New CPU name within About This Mac
|
self.override_smbios: str = "Default" # Set SMBIOS model used
|
||||||
self.serial_settings = "None" # Set SMBIOS level used
|
self.allow_native_spoofs: bool = False # Allow native models to recieve spoofs
|
||||||
self.override_smbios = "Default" # Set SMBIOS model used
|
|
||||||
self.allow_native_spoofs = False # Allow native models to recieve spoofs
|
### RestrictEvents CPU renaming
|
||||||
self.custom_serial_number = "" # Set SMBIOS serial number
|
self.custom_cpu_model: int = 2 # Patch type value
|
||||||
self.custom_board_serial_number = "" # Set SMBIOS board serial number
|
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
|
## FeatureUnlock Settings
|
||||||
self.fu_status = True # Enable FeatureUnlock
|
self.fu_status: bool = True # Enable FeatureUnlock
|
||||||
self.fu_arguments = None # Set FeatureUnlock arguments
|
self.fu_arguments: str = None # Set FeatureUnlock arguments
|
||||||
|
|
||||||
## Security Settings
|
## Security Settings
|
||||||
self.apecid_support = False # ApECID
|
self.sip_status: bool = True # System Integrity Protection
|
||||||
self.sip_status = True # System Integrity Protection
|
self.secure_status: bool = False # Secure Boot Model
|
||||||
self.secure_status = False # Secure Boot Model
|
self.vault: bool = False # EFI Vault
|
||||||
self.vault = False # EFI Vault
|
self.disable_cs_lv: bool = False # Disable Library validation
|
||||||
self.disable_cs_lv = False # Disable Library validation
|
self.disable_amfi: bool = False # Disable AMFI
|
||||||
self.disable_amfi = False # Disable AMFI
|
|
||||||
|
|
||||||
## OS Settings
|
## OS Settings
|
||||||
self.os_support = 12.0
|
self.os_support: float = 12.0
|
||||||
self.detected_os = 0 # Major Kernel Version
|
self.detected_os: int = 0 # Major Kernel Version
|
||||||
self.detected_os_minor = 0 # Minor Kernel Version
|
self.detected_os_minor: int = 0 # Minor Kernel Version
|
||||||
self.detected_os_build = "" # OS Build
|
self.detected_os_build: str = "" # OS Build
|
||||||
self.detected_os_version = "" # OS Version
|
self.detected_os_version: str = "" # OS Version
|
||||||
|
|
||||||
## Boot Volume Settings
|
## Boot Volume Settings
|
||||||
self.firewire_boot = False # Allow macOS FireWire Boot
|
self.firewire_boot: bool = False # Allow macOS FireWire Boot (kernel)
|
||||||
self.nvme_boot = False # Allow UEFI NVMe Boot
|
self.nvme_boot: bool = False # Allow UEFI NVMe Boot
|
||||||
self.xhci_boot = False
|
self.xhci_boot: bool = False # Allow UEFI XHCI Boot
|
||||||
|
|
||||||
## Graphics Settings
|
## Graphics Settings
|
||||||
self.metal_build = False # Set MXM Build support
|
self.allow_ts2_accel: bool = True # Set TeraScale 2 Acceleration support
|
||||||
self.imac_vendor = "None" # Set MXM GPU vendor
|
self.drm_support: bool = False # Set iMac14,x DRM support
|
||||||
self.imac_model = "" # Set MXM GPU model
|
self.force_nv_web: bool = False # Force Nvidia Web Drivers on Tesla and Kepler
|
||||||
self.drm_support = False # Set iMac14,x DRM support
|
self.force_output_support: bool = False # Force Output support for Mac Pros with PC VBIOS
|
||||||
self.allow_ts2_accel = True # Set TeraScale 2 Acceleration support
|
self.amd_gop_injection: bool = False # Set GOP Injection support
|
||||||
self.force_nv_web = False # Force Nvidia Web Drivers on Tesla and Kepler
|
self.nvidia_kepler_gop_injection: bool = False # Set Kepler GOP Injection support
|
||||||
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
|
|
||||||
|
|
||||||
## Miscellaneous
|
### MXM GPU Support
|
||||||
self.disallow_cpufriend = False # Disable CPUFriend
|
self.metal_build: bool = False # Set MXM Build support
|
||||||
self.enable_wake_on_wlan = False # Allow Wake on WLAN for modern Broadcom
|
self.imac_vendor: str = "None" # Set MXM GPU vendor
|
||||||
self.disable_tb = False # Disable Thunderbolt Controller
|
self.imac_model: str = "" # Set MXM GPU model
|
||||||
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
|
|
||||||
|
|
||||||
|
## 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 = [
|
self.legacy_accel_support = [
|
||||||
os_data.os_data.big_sur,
|
os_data.os_data.big_sur,
|
||||||
os_data.os_data.monterey,
|
os_data.os_data.monterey,
|
||||||
@@ -283,10 +288,6 @@ class Constants:
|
|||||||
def link_rate_driver_path(self):
|
def link_rate_driver_path(self):
|
||||||
return self.payload_path / Path("Drivers/FixPCIeLinkRate.efi")
|
return self.payload_path / Path("Drivers/FixPCIeLinkRate.efi")
|
||||||
|
|
||||||
@property
|
|
||||||
def list_txt_path(self):
|
|
||||||
return self.payload_path / Path("List.txt")
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def installer_sh_path(self):
|
def installer_sh_path(self):
|
||||||
return self.payload_path / Path("Installer.sh")
|
return self.payload_path / Path("Installer.sh")
|
||||||
@@ -466,7 +467,7 @@ class Constants:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def innie_path(self):
|
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
|
@property
|
||||||
def simplemsr_path(self):
|
def simplemsr_path(self):
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ from data import (
|
|||||||
|
|
||||||
class GenerateDefaults:
|
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.constants: constants.Constants = global_constants
|
||||||
|
|
||||||
self.model: str = model
|
self.model: str = model
|
||||||
@@ -51,7 +51,7 @@ class GenerateDefaults:
|
|||||||
self._smbios_probe()
|
self._smbios_probe()
|
||||||
|
|
||||||
|
|
||||||
def _general_probe(self):
|
def _general_probe(self) -> None:
|
||||||
"""
|
"""
|
||||||
General probe for data
|
General probe for data
|
||||||
"""
|
"""
|
||||||
@@ -93,7 +93,7 @@ class GenerateDefaults:
|
|||||||
self.constants.should_nuke_kdks = False
|
self.constants.should_nuke_kdks = False
|
||||||
|
|
||||||
|
|
||||||
def _smbios_probe(self):
|
def _smbios_probe(self) -> None:
|
||||||
"""
|
"""
|
||||||
SMBIOS specific probe
|
SMBIOS specific probe
|
||||||
"""
|
"""
|
||||||
@@ -128,7 +128,7 @@ class GenerateDefaults:
|
|||||||
self.constants.force_vmm = False
|
self.constants.force_vmm = False
|
||||||
|
|
||||||
|
|
||||||
def _nvram_probe(self):
|
def _nvram_probe(self) -> None:
|
||||||
"""
|
"""
|
||||||
NVRAM specific probe
|
NVRAM specific probe
|
||||||
"""
|
"""
|
||||||
@@ -153,7 +153,7 @@ class GenerateDefaults:
|
|||||||
self.constants.custom_cpu_model_value = custom_cpu_model_value.split("%00")[0]
|
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
|
Networking specific probe
|
||||||
"""
|
"""
|
||||||
@@ -195,7 +195,7 @@ class GenerateDefaults:
|
|||||||
self.constants.fu_arguments = " -disable_sidecar_mac"
|
self.constants.fu_arguments = " -disable_sidecar_mac"
|
||||||
|
|
||||||
|
|
||||||
def _misc_hardwares_probe(self):
|
def _misc_hardwares_probe(self) -> None:
|
||||||
"""
|
"""
|
||||||
Misc probe
|
Misc probe
|
||||||
"""
|
"""
|
||||||
@@ -211,7 +211,7 @@ class GenerateDefaults:
|
|||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
def _gpu_probe(self):
|
def _gpu_probe(self) -> None:
|
||||||
"""
|
"""
|
||||||
Graphics specific probe
|
Graphics specific probe
|
||||||
"""
|
"""
|
||||||
@@ -245,6 +245,13 @@ class GenerateDefaults:
|
|||||||
device_probe.AMD.Archs.Vega,
|
device_probe.AMD.Archs.Vega,
|
||||||
device_probe.AMD.Archs.Navi,
|
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 [
|
if gpu in [
|
||||||
device_probe.AMD.Archs.Legacy_GCN_7000,
|
device_probe.AMD.Archs.Legacy_GCN_7000,
|
||||||
device_probe.AMD.Archs.Legacy_GCN_8000,
|
device_probe.AMD.Archs.Legacy_GCN_8000,
|
||||||
@@ -302,7 +309,8 @@ class GenerateDefaults:
|
|||||||
# Only disable AMFI if we officially support Ventura
|
# Only disable AMFI if we officially support Ventura
|
||||||
self.constants.disable_amfi = True
|
self.constants.disable_amfi = True
|
||||||
|
|
||||||
|
for key in ["Moraea_BlurBeta", "Amy.MenuBar2Beta"]:
|
||||||
# Enable BetaBlur if user hasn't disabled it
|
# 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()
|
is_key_enabled = subprocess.run(["defaults", "read", "-g", key], stdout=subprocess.PIPE).stdout.decode("utf-8").strip()
|
||||||
if is_blur_enabled in ["false", "0"]:
|
if is_key_enabled not in ["false", "0"]:
|
||||||
subprocess.run(["defaults", "write", "-g", "Moraea_BlurBeta", "-bool", "true"])
|
subprocess.run(["defaults", "write", "-g", key, "-bool", "true"])
|
||||||
@@ -15,7 +15,7 @@ class GlobalEnviromentSettings:
|
|||||||
Library for querying and writing global enviroment settings
|
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.file_name: str = ".com.dortania.opencore-legacy-patcher.plist"
|
||||||
self.global_settings_folder: str = "/Users/Shared"
|
self.global_settings_folder: str = "/Users/Shared"
|
||||||
self.global_settings_plist: str = f"{self.global_settings_folder}/{self.file_name}"
|
self.global_settings_plist: str = f"{self.global_settings_folder}/{self.file_name}"
|
||||||
@@ -25,7 +25,7 @@ class GlobalEnviromentSettings:
|
|||||||
self._fix_file_permission()
|
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
|
Reads a property from the global settings file
|
||||||
"""
|
"""
|
||||||
@@ -37,7 +37,7 @@ class GlobalEnviromentSettings:
|
|||||||
return None
|
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
|
Writes a property to the global settings file
|
||||||
"""
|
"""
|
||||||
@@ -51,7 +51,7 @@ class GlobalEnviromentSettings:
|
|||||||
logging.info("- Failed to write to global settings file")
|
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():
|
if Path(self.global_settings_plist).exists():
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
@@ -60,7 +60,7 @@ class GlobalEnviromentSettings:
|
|||||||
logging.info("- Permission error: Unable to write to global settings file")
|
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
|
Converts legacy defaults to global settings
|
||||||
"""
|
"""
|
||||||
@@ -86,7 +86,7 @@ class GlobalEnviromentSettings:
|
|||||||
logging.info("- Permission error: Unable to delete defaults plist")
|
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
|
Fixes file permission for log file
|
||||||
|
|
||||||
|
|||||||
@@ -1142,6 +1142,32 @@ class wx_python_gui:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
i = i + self.patch_label.GetSize().height + 3
|
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:
|
else:
|
||||||
if self.constants.computer.oclp_sys_version and self.constants.computer.oclp_sys_date:
|
if self.constants.computer.oclp_sys_version and self.constants.computer.oclp_sys_date:
|
||||||
date = self.constants.computer.oclp_sys_date.split(" @")
|
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:
|
with Path(self.constants.payload_path / Path("InstallAssistant.pkg")).open("rb") as f:
|
||||||
for chunk in chunks:
|
for chunk in chunks:
|
||||||
status = hashlib.sha256(f.read(chunk["length"])).digest()
|
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()}")
|
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.popup = wx.MessageDialog(
|
||||||
self.frame,
|
self.frame,
|
||||||
|
|||||||
@@ -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.constants: constants.Constants = global_constants
|
||||||
|
|
||||||
self.host_build: str = host_build # ex. 20A5384c
|
self.host_build: str = host_build # ex. 20A5384c
|
||||||
@@ -83,7 +83,7 @@ class KernelDebugKitObject:
|
|||||||
self._get_latest_kdk()
|
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
|
Fetches a list of available KDKs from the KdkSupportPkg API
|
||||||
Additionally caches the list for future use, avoiding extra API calls
|
Additionally caches the list for future use, avoiding extra API calls
|
||||||
@@ -119,7 +119,7 @@ class KernelDebugKitObject:
|
|||||||
return KDK_ASSET_LIST
|
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
|
Fetches the latest KDK for the current macOS version
|
||||||
|
|
||||||
@@ -229,7 +229,7 @@ class KernelDebugKitObject:
|
|||||||
self.success = True
|
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
|
Returns a DownloadObject for the KDK
|
||||||
|
|
||||||
@@ -263,7 +263,7 @@ class KernelDebugKitObject:
|
|||||||
return network_handler.DownloadObject(self.kdk_url, kdk_download_path)
|
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
|
Generates a KDK Info.plist
|
||||||
|
|
||||||
@@ -285,7 +285,7 @@ class KernelDebugKitObject:
|
|||||||
logging.error(f"- Failed to generate KDK Info.plist: {e}")
|
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
|
Validates provided KDK, ensure no corruption
|
||||||
|
|
||||||
@@ -334,7 +334,7 @@ class KernelDebugKitObject:
|
|||||||
return True
|
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
|
Legacy variant of validating provided KDK
|
||||||
Uses best guess of files that should be present
|
Uses best guess of files that should be present
|
||||||
@@ -363,7 +363,7 @@ class KernelDebugKitObject:
|
|||||||
return True
|
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
|
Checks if KDK matching build is installed
|
||||||
If so, validates it has not been corrupted
|
If so, validates it has not been corrupted
|
||||||
@@ -429,7 +429,7 @@ class KernelDebugKitObject:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _remove_kdk(self, kdk_path: str):
|
def _remove_kdk(self, kdk_path: str) -> None:
|
||||||
"""
|
"""
|
||||||
Removes provided KDK
|
Removes provided KDK
|
||||||
|
|
||||||
@@ -448,19 +448,18 @@ class KernelDebugKitObject:
|
|||||||
logging.warning(f"- KDK does not exist: {kdk_path}")
|
logging.warning(f"- KDK does not exist: {kdk_path}")
|
||||||
return
|
return
|
||||||
|
|
||||||
rm_args = ["rm", "-f", kdk_path]
|
rm_args = ["rm", "-rf" if Path(kdk_path).is_dir() else "-f", kdk_path]
|
||||||
if Path(kdk_path).is_dir():
|
|
||||||
rm_args = ["rm", "-rf", kdk_path]
|
|
||||||
|
|
||||||
result = utilities.elevated(rm_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
result = utilities.elevated(rm_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
if result.returncode != 0:
|
if result.returncode != 0:
|
||||||
logging.warning(f"- Failed to remove KDK: {kdk_path}")
|
logging.warning(f"- Failed to remove KDK: {kdk_path}")
|
||||||
logging.warning(f"- {result.stdout.decode('utf-8')}")
|
logging.warning(f"- {result.stdout.decode('utf-8')}")
|
||||||
|
return
|
||||||
|
|
||||||
logging.info(f"- Successfully removed KDK: {kdk_path}")
|
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
|
Removes KDKs that are not in use
|
||||||
|
|
||||||
@@ -486,13 +485,12 @@ class KernelDebugKitObject:
|
|||||||
|
|
||||||
logging.info("- Cleaning unused KDKs")
|
logging.info("- Cleaning unused KDKs")
|
||||||
for kdk_folder in Path(KDK_INSTALL_PATH).iterdir():
|
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"):
|
if kdk_folder.name.endswith(".kdk") or kdk_folder.name.endswith(".pkg"):
|
||||||
should_remove = True
|
should_remove = True
|
||||||
for build in exclude_builds:
|
for build in exclude_builds:
|
||||||
if build != "":
|
if build == "":
|
||||||
continue
|
continue
|
||||||
if kdk_folder.name.endswith(f"{build}.kdk") or kdk_folder.name.endswith(f"{build}.pkg"):
|
if kdk_folder.name.endswith(f"_{build}.kdk") or kdk_folder.name.endswith(f"_{build}.pkg"):
|
||||||
should_remove = False
|
should_remove = False
|
||||||
break
|
break
|
||||||
if should_remove is False:
|
if should_remove is False:
|
||||||
@@ -500,7 +498,7 @@ class KernelDebugKitObject:
|
|||||||
self._remove_kdk(kdk_folder)
|
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
|
Validates KDK DMG checksum
|
||||||
|
|
||||||
@@ -542,11 +540,11 @@ class KernelDebugKitUtilities:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self) -> None:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def install_kdk_pkg(self, kdk_path: Path):
|
def install_kdk_pkg(self, kdk_path: Path) -> bool:
|
||||||
"""
|
"""
|
||||||
Installs provided KDK packages
|
Installs provided KDK packages
|
||||||
|
|
||||||
@@ -577,7 +575,7 @@ class KernelDebugKitUtilities:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def install_kdk_dmg(self, kdk_path: Path):
|
def install_kdk_dmg(self, kdk_path: Path) -> bool:
|
||||||
"""
|
"""
|
||||||
Installs provided KDK disk image
|
Installs provided KDK disk image
|
||||||
|
|
||||||
@@ -617,7 +615,7 @@ class KernelDebugKitUtilities:
|
|||||||
logging.info("- Successfully installed KDK")
|
logging.info("- Successfully installed KDK")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _unmount_disk_image(self, mount_point):
|
def _unmount_disk_image(self, mount_point) -> None:
|
||||||
"""
|
"""
|
||||||
Unmounts provided disk image silently
|
Unmounts provided disk image silently
|
||||||
|
|
||||||
@@ -627,7 +625,7 @@ class KernelDebugKitUtilities:
|
|||||||
subprocess.run(["hdiutil", "detach", mount_point], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
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
|
Creates a backup of the KDK
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class InitializeLoggingSupport:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self) -> None:
|
||||||
self.log_filename: str = "OpenCore-Patcher.log"
|
self.log_filename: str = "OpenCore-Patcher.log"
|
||||||
self.log_filepath: Path = None
|
self.log_filepath: Path = None
|
||||||
|
|
||||||
@@ -43,11 +43,11 @@ class InitializeLoggingSupport:
|
|||||||
self._fix_file_permission()
|
self._fix_file_permission()
|
||||||
|
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self) -> None:
|
||||||
self._restore_original_excepthook()
|
self._restore_original_excepthook()
|
||||||
|
|
||||||
|
|
||||||
def _initialize_logging_path(self):
|
def _initialize_logging_path(self) -> None:
|
||||||
"""
|
"""
|
||||||
Initialize logging framework storage path
|
Initialize logging framework storage path
|
||||||
"""
|
"""
|
||||||
@@ -62,7 +62,7 @@ class InitializeLoggingSupport:
|
|||||||
print(f" - Log file: {self.log_filepath}")
|
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
|
Determine if log file should be cleaned
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ class InitializeLoggingSupport:
|
|||||||
print(f"- Failed to clean log file: {e}")
|
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
|
Fixes file permission for log file
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ class InitializeLoggingSupport:
|
|||||||
print(result.stderr.decode("utf-8"))
|
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
|
Initialize logging framework configuration
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ class InitializeLoggingSupport:
|
|||||||
logging.getLogger().handlers[1].maxBytes = self.max_file_size
|
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
|
Attempt to initialize logging framework configuration
|
||||||
|
|
||||||
@@ -145,18 +145,18 @@ class InitializeLoggingSupport:
|
|||||||
self._initialize_logging_configuration(log_to_file=False)
|
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
|
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
|
Reroute traceback in main thread to logging module
|
||||||
"""
|
"""
|
||||||
logging.error("Uncaught exception in main thread", exc_info=(type, value, tb))
|
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
|
Reroute traceback in spawned thread to logging module
|
||||||
"""
|
"""
|
||||||
@@ -166,7 +166,7 @@ class InitializeLoggingSupport:
|
|||||||
threading.excepthook = custom_thread_excepthook
|
threading.excepthook = custom_thread_excepthook
|
||||||
|
|
||||||
|
|
||||||
def _restore_original_excepthook(self):
|
def _restore_original_excepthook(self) -> None:
|
||||||
"""
|
"""
|
||||||
Restore original traceback handlers
|
Restore original traceback handlers
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -23,13 +23,19 @@ tmp_dir = tempfile.TemporaryDirectory()
|
|||||||
|
|
||||||
class InstallerCreation():
|
class InstallerCreation():
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self) -> None:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def install_macOS_installer(self, download_path: str):
|
def install_macOS_installer(self, download_path: str) -> bool:
|
||||||
"""
|
"""
|
||||||
Installs InstallAssistant.pkg
|
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")
|
logging.info("- Extracting macOS installer from InstallAssistant.pkg\n This may take some time")
|
||||||
@@ -52,7 +58,7 @@ class InstallerCreation():
|
|||||||
return True
|
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
|
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
|
tmp_location (str): Path to temporary directory
|
||||||
installer_path (str): Path to InstallAssistant.pkg
|
installer_path (str): Path to InstallAssistant.pkg
|
||||||
disk (str): Disk to install to
|
disk (str): Disk to install to
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if successful, False otherwise
|
||||||
"""
|
"""
|
||||||
|
|
||||||
additional_args = ""
|
additional_args = ""
|
||||||
@@ -136,7 +145,8 @@ fi
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def list_disk_to_format(self):
|
|
||||||
|
def list_disk_to_format(self) -> dict:
|
||||||
"""
|
"""
|
||||||
List applicable disks for macOS installer creation
|
List applicable disks for macOS installer creation
|
||||||
Only lists disks that are:
|
Only lists disks that are:
|
||||||
@@ -191,14 +201,20 @@ fi
|
|||||||
return list_disks
|
return list_disks
|
||||||
|
|
||||||
|
|
||||||
class SeedType(enum.Enum):
|
class SeedType(enum.IntEnum):
|
||||||
"""
|
"""
|
||||||
Enum for catalog types
|
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
|
DeveloperSeed: int = 0
|
||||||
PublicSeed = 1
|
PublicSeed: int = 1
|
||||||
CustomerSeed = 2
|
CustomerSeed: int = 2
|
||||||
PublicRelease = 3
|
PublicRelease: int = 3
|
||||||
|
|
||||||
|
|
||||||
class RemoteInstallerCatalog:
|
class RemoteInstallerCatalog:
|
||||||
@@ -206,7 +222,7 @@ class RemoteInstallerCatalog:
|
|||||||
Parses Apple's Software Update catalog and finds all macOS installers.
|
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)
|
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()
|
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
|
Constructs the catalog URL based on the seed type
|
||||||
|
|
||||||
Args:
|
Parameters:
|
||||||
seed_type (SeedType): The seed type to use
|
seed_type (SeedType): The seed type to use
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: The catalog URL
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@@ -237,7 +256,7 @@ class RemoteInstallerCatalog:
|
|||||||
return url
|
return url
|
||||||
|
|
||||||
|
|
||||||
def _fetch_catalog(self):
|
def _fetch_catalog(self) -> dict:
|
||||||
"""
|
"""
|
||||||
Fetches the catalog from Apple's servers
|
Fetches the catalog from Apple's servers
|
||||||
|
|
||||||
@@ -257,7 +276,13 @@ class RemoteInstallerCatalog:
|
|||||||
|
|
||||||
return catalog
|
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 = {}
|
available_apps: dict = {}
|
||||||
|
|
||||||
catalog: dict = self._fetch_catalog()
|
catalog: dict = self._fetch_catalog()
|
||||||
@@ -358,7 +383,7 @@ class RemoteInstallerCatalog:
|
|||||||
return available_apps
|
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.
|
Returns a dictionary of the newest macOS installers only.
|
||||||
Primarily used to avoid overwhelming the user with a list of
|
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.
|
Finds all macOS installers on the local machine.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self) -> None:
|
||||||
self.available_apps: dict = self._list_local_macOS_installers()
|
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
|
Searches for macOS installers in /Applications
|
||||||
|
|
||||||
@@ -537,7 +562,7 @@ class LocalInstallerCatalog:
|
|||||||
return application_list
|
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
|
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
|
This is required due to Info.plist reporting the application version, not the OS version
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class OpenCoreLegacyPatcher:
|
|||||||
Initial entry point for starting OpenCore Legacy Patcher
|
Initial entry point for starting OpenCore Legacy Patcher
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self) -> None:
|
||||||
logging_handler.InitializeLoggingSupport()
|
logging_handler.InitializeLoggingSupport()
|
||||||
|
|
||||||
self.constants: constants.Constants = constants.Constants()
|
self.constants: constants.Constants = constants.Constants()
|
||||||
@@ -40,7 +40,7 @@ class OpenCoreLegacyPatcher:
|
|||||||
gui_main.wx_python_gui(self.constants).main_menu(None)
|
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
|
Generate base data required for the patcher to run
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -32,14 +32,14 @@ class NetworkUtilities:
|
|||||||
Utilities for network related tasks, primarily used for downloading files
|
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
|
self.url: str = url
|
||||||
|
|
||||||
if self.url is None:
|
if self.url is None:
|
||||||
self.url = "https://github.com"
|
self.url = "https://github.com"
|
||||||
|
|
||||||
|
|
||||||
def verify_network_connection(self):
|
def verify_network_connection(self) -> bool:
|
||||||
"""
|
"""
|
||||||
Verifies that the network is available
|
Verifies that the network is available
|
||||||
|
|
||||||
@@ -58,8 +58,13 @@ class NetworkUtilities:
|
|||||||
):
|
):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def validate_link(self):
|
def validate_link(self) -> bool:
|
||||||
# Check if link is 404
|
"""
|
||||||
|
Check for 404 error
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if link is valid, False otherwise
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
response = SESSION.head(self.url, timeout=5, allow_redirects=True)
|
response = SESSION.head(self.url, timeout=5, allow_redirects=True)
|
||||||
if response.status_code == 404:
|
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.url: str = url
|
||||||
self.status: str = DownloadStatus.INACTIVE
|
self.status: str = DownloadStatus.INACTIVE
|
||||||
self.error_msg: str = ""
|
self.error_msg: str = ""
|
||||||
@@ -121,11 +126,11 @@ class DownloadObject:
|
|||||||
self._populate_file_size()
|
self._populate_file_size()
|
||||||
|
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self) -> None:
|
||||||
self.stop()
|
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
|
Download the file
|
||||||
|
|
||||||
@@ -152,7 +157,8 @@ class DownloadObject:
|
|||||||
self.should_checksum = verify_checksum
|
self.should_checksum = verify_checksum
|
||||||
self._download(display_progress)
|
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
|
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
|
return self.checksum.hexdigest() if self.checksum else True
|
||||||
|
|
||||||
|
|
||||||
def _get_filename(self):
|
def _get_filename(self) -> str:
|
||||||
"""
|
"""
|
||||||
Get the filename from the URL
|
Get the filename from the URL
|
||||||
|
|
||||||
@@ -187,7 +193,7 @@ class DownloadObject:
|
|||||||
return Path(self.url).name
|
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
|
Get the file size of the file to be downloaded
|
||||||
|
|
||||||
@@ -206,7 +212,7 @@ class DownloadObject:
|
|||||||
self.total_file_size = 0.0
|
self.total_file_size = 0.0
|
||||||
|
|
||||||
|
|
||||||
def _update_checksum(self, chunk: bytes):
|
def _update_checksum(self, chunk: bytes) -> None:
|
||||||
"""
|
"""
|
||||||
Update checksum with new chunk
|
Update checksum with new chunk
|
||||||
|
|
||||||
@@ -216,7 +222,7 @@ class DownloadObject:
|
|||||||
self._checksum_storage.update(chunk)
|
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
|
Validates working enviroment, including free space and removing existing files
|
||||||
|
|
||||||
@@ -253,7 +259,7 @@ class DownloadObject:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def _download(self, display_progress: bool = False):
|
def _download(self, display_progress: bool = False) -> None:
|
||||||
"""
|
"""
|
||||||
Download the file
|
Download the file
|
||||||
|
|
||||||
@@ -306,7 +312,7 @@ class DownloadObject:
|
|||||||
utilities.enable_sleep_after_running()
|
utilities.enable_sleep_after_running()
|
||||||
|
|
||||||
|
|
||||||
def get_percent(self):
|
def get_percent(self) -> float:
|
||||||
"""
|
"""
|
||||||
Query the download percent
|
Query the download percent
|
||||||
|
|
||||||
@@ -320,7 +326,7 @@ class DownloadObject:
|
|||||||
return self.downloaded_file_size / self.total_file_size * 100
|
return self.downloaded_file_size / self.total_file_size * 100
|
||||||
|
|
||||||
|
|
||||||
def get_speed(self):
|
def get_speed(self) -> float:
|
||||||
"""
|
"""
|
||||||
Query the download speed
|
Query the download speed
|
||||||
|
|
||||||
@@ -331,7 +337,7 @@ class DownloadObject:
|
|||||||
return self.downloaded_file_size / (time.time() - self.start_time)
|
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
|
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()
|
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
|
Query the file size of the file to be downloaded
|
||||||
|
|
||||||
@@ -356,7 +362,7 @@ class DownloadObject:
|
|||||||
return self.total_file_size
|
return self.total_file_size
|
||||||
|
|
||||||
|
|
||||||
def is_active(self):
|
def is_active(self) -> bool:
|
||||||
"""
|
"""
|
||||||
Query if the download is active
|
Query if the download is active
|
||||||
|
|
||||||
@@ -369,12 +375,11 @@ class DownloadObject:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
def stop(self) -> None:
|
||||||
"""
|
"""
|
||||||
Stop the download
|
Stop the download
|
||||||
|
|
||||||
Returns:
|
If the download is active, this function will hold the thread until stopped
|
||||||
boolean: If the download is active, this function will hold the thread until stopped
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.should_stop = True
|
self.should_stop = True
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ class OSProbe:
|
|||||||
Library for querying OS information specific to macOS
|
Library for querying OS information specific to macOS
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self) -> None:
|
||||||
self.uname_data = platform.uname()
|
self.uname_data = platform.uname()
|
||||||
|
|
||||||
|
|
||||||
def detect_kernel_major(self):
|
def detect_kernel_major(self) -> int:
|
||||||
"""
|
"""
|
||||||
Detect the booted major kernel version
|
Detect the booted major kernel version
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@ class OSProbe:
|
|||||||
return int(self.uname_data.release.partition(".")[0])
|
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
|
Detect the booted minor kernel version
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ class OSProbe:
|
|||||||
return int(self.uname_data.release.partition(".")[2].partition(".")[0])
|
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
|
Detect the booted OS version
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ class OSProbe:
|
|||||||
return result.stdout.decode().strip()
|
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
|
Detect the booted OS build
|
||||||
|
|
||||||
|
|||||||
@@ -13,13 +13,13 @@ from resources import constants
|
|||||||
|
|
||||||
class RoutePayloadDiskImage:
|
class RoutePayloadDiskImage:
|
||||||
|
|
||||||
def __init__(self, global_constants: constants.Constants):
|
def __init__(self, global_constants: constants.Constants) -> None:
|
||||||
self.constants: constants.Constants = global_constants
|
self.constants: constants.Constants = global_constants
|
||||||
|
|
||||||
self._setup_tmp_disk_image()
|
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
|
Initialize temp directory and mount payloads.dmg
|
||||||
Create overlay for patcher to write to
|
Create overlay for patcher to write to
|
||||||
@@ -55,7 +55,7 @@ class RoutePayloadDiskImage:
|
|||||||
logging.info(f"Return Code: {output.returncode}")
|
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
|
Unmounts disk images associated with OCLP
|
||||||
|
|
||||||
|
|||||||
@@ -120,6 +120,8 @@ class DetectRootPatch:
|
|||||||
self.supports_metal = True
|
self.supports_metal = True
|
||||||
if self.constants.detected_os >= os_data.os_data.ventura:
|
if self.constants.detected_os >= os_data.os_data.ventura:
|
||||||
self.amfi_must_disable = 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
|
||||||
elif gpu.arch in [
|
elif gpu.arch in [
|
||||||
device_probe.NVIDIA.Archs.Fermi,
|
device_probe.NVIDIA.Archs.Fermi,
|
||||||
device_probe.NVIDIA.Archs.Kepler,
|
device_probe.NVIDIA.Archs.Kepler,
|
||||||
@@ -205,11 +207,15 @@ class DetectRootPatch:
|
|||||||
self.ivy_gpu = True
|
self.ivy_gpu = True
|
||||||
if self.constants.detected_os >= os_data.os_data.ventura:
|
if self.constants.detected_os >= os_data.os_data.ventura:
|
||||||
self.amfi_must_disable = 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
|
self.supports_metal = True
|
||||||
elif gpu.arch == device_probe.Intel.Archs.Haswell:
|
elif gpu.arch == device_probe.Intel.Archs.Haswell:
|
||||||
if self.constants.detected_os > os_data.os_data.monterey:
|
if self.constants.detected_os > os_data.os_data.monterey:
|
||||||
self.haswell_gpu = True
|
self.haswell_gpu = True
|
||||||
self.amfi_must_disable = 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
|
self.supports_metal = True
|
||||||
elif gpu.arch == device_probe.Intel.Archs.Broadwell:
|
elif gpu.arch == device_probe.Intel.Archs.Broadwell:
|
||||||
if self.constants.detected_os > os_data.os_data.monterey:
|
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
|
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 = {}
|
required_patches: dict = {}
|
||||||
|
|
||||||
utilities.cls()
|
utilities.cls()
|
||||||
@@ -752,13 +758,16 @@ class DetectRootPatch:
|
|||||||
|
|
||||||
if hardware_details["Graphics: Intel Sandy Bridge"] is True:
|
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 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({"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({"WebKit Monterey Common": all_hardware_patchset["Graphics"]["WebKit Monterey Common"]})
|
||||||
required_patches.update({"Intel Sandy Bridge": all_hardware_patchset["Graphics"]["Intel Sandy Bridge"]})
|
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:
|
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": 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({"Catalina GVA": all_hardware_patchset["Graphics"]["Catalina GVA"]})
|
||||||
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
|
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
|
||||||
required_patches.update({"Big Sur OpenCL": all_hardware_patchset["Graphics"]["Big Sur 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:
|
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": 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 GVA": all_hardware_patchset["Graphics"]["Monterey GVA"]})
|
||||||
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
|
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
|
||||||
required_patches.update({"Intel Haswell": all_hardware_patchset["Graphics"]["Intel Haswell"]})
|
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"]})
|
required_patches.update({"Non-Metal Enforcement": all_hardware_patchset["Graphics"]["Non-Metal Enforcement"]})
|
||||||
|
|
||||||
if hardware_details["Graphics: Nvidia Kepler"] is True:
|
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": 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({"Catalina GVA": all_hardware_patchset["Graphics"]["Catalina GVA"]})
|
||||||
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
|
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
|
||||||
required_patches.update({"Big Sur OpenCL": all_hardware_patchset["Graphics"]["Big Sur 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"])
|
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:
|
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 GVA": all_hardware_patchset["Graphics"]["Monterey GVA"]})
|
||||||
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
|
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
|
||||||
if hardware_details["Graphics: AMD Legacy GCN"] is True:
|
if hardware_details["Graphics: AMD Legacy GCN"] is True:
|
||||||
|
|||||||
@@ -11,14 +11,14 @@ REPO_LATEST_RELEASE_URL: str = "https://api.github.com/repos/dortania/OpenCore-L
|
|||||||
|
|
||||||
|
|
||||||
class CheckBinaryUpdates:
|
class CheckBinaryUpdates:
|
||||||
def __init__(self, global_constants: constants.Constants):
|
def __init__(self, global_constants: constants.Constants) -> None:
|
||||||
self.constants: constants.Constants = global_constants
|
self.constants: constants.Constants = global_constants
|
||||||
|
|
||||||
self.binary_version = self.constants.patcher_version
|
self.binary_version = self.constants.patcher_version
|
||||||
self.binary_version_array = [int(x) for x in self.binary_version.split(".")]
|
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
|
Check if the remote version is newer than the local version
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ class CheckBinaryUpdates:
|
|||||||
return False
|
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
|
Check if the local build is a GUI or TUI build
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ class CheckBinaryUpdates:
|
|||||||
return "TUI"
|
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
|
Check if the remote build is a GUI or TUI build
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ class CheckBinaryUpdates:
|
|||||||
return "Unknown"
|
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
|
Check if any updates are available for the OpenCore Legacy Patcher binary
|
||||||
|
|
||||||
|
|||||||
@@ -422,9 +422,19 @@ def find_disk_off_uuid(uuid):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def get_free_space(disk=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:
|
if disk is None:
|
||||||
disk = "/"
|
disk = "/"
|
||||||
total, used, free = shutil.disk_usage("/")
|
|
||||||
|
total, used, free = shutil.disk_usage(disk)
|
||||||
return free
|
return free
|
||||||
|
|
||||||
def grab_mount_point_from_disk(disk):
|
def grab_mount_point_from_disk(disk):
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class PatcherValidation:
|
|||||||
Primarily for Continuous Integration
|
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: constants.Constants = global_constants
|
||||||
|
|
||||||
self.constants.validate = True
|
self.constants.validate = True
|
||||||
@@ -54,7 +54,7 @@ class PatcherValidation:
|
|||||||
self._validate_sys_patch()
|
self._validate_sys_patch()
|
||||||
|
|
||||||
|
|
||||||
def _build_prebuilt(self):
|
def _build_prebuilt(self) -> None:
|
||||||
"""
|
"""
|
||||||
Generate a build for each predefined model
|
Generate a build for each predefined model
|
||||||
Then validate against ocvalidate
|
Then validate against ocvalidate
|
||||||
@@ -73,7 +73,7 @@ class PatcherValidation:
|
|||||||
logging.info(f"Validation succeeded for predefined model: {model}")
|
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
|
Generate a build for each predefined model
|
||||||
Then validate against ocvalidate
|
Then validate against ocvalidate
|
||||||
@@ -93,12 +93,16 @@ class PatcherValidation:
|
|||||||
logging.info(f"Validation succeeded for predefined model: {self.constants.computer.real_model}")
|
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
|
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}")
|
host_os_float = float(f"{major_kernel}.{minor_kernel}")
|
||||||
|
|
||||||
for patch_subject in patchset:
|
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()
|
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
|
Validates sys_patch modules
|
||||||
"""
|
"""
|
||||||
@@ -160,7 +164,7 @@ class PatcherValidation:
|
|||||||
logging.info("- Skipping Root Patch File integrity validation")
|
logging.info("- Skipping Root Patch File integrity validation")
|
||||||
|
|
||||||
|
|
||||||
def _validate_configs(self):
|
def _validate_configs(self) -> None:
|
||||||
"""
|
"""
|
||||||
Validates build modules
|
Validates build modules
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user