diff --git a/CHANGELOG.md b/CHANGELOG.md index 0187d23dc..c7d2080d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ - Ensure `Moraea_BlurBeta` is set on non-Metal systems - Implement proper Root Unpatching verification in GUI - Removes arbitrary patch requirements used against unpatching (ex. network connection) +- Prioritize KdkSupportPkg repository for downloads + - Skips calls to Apple's now defunct Developer Portal API - Increment Binaries: - PatcherSupportPkg 0.8.3 - release diff --git a/docs/MODELS.md b/docs/MODELS.md index ba8780bd0..b1738418d 100644 --- a/docs/MODELS.md +++ b/docs/MODELS.md @@ -32,12 +32,12 @@ Regarding OS support, see below: | MacBook1,1 | Mid-2006 | NO | 32-Bit CPU limitation | | MacBook2,1 | Late 2006 | ^^ | 32-Bit Firmware limitation | | MacBook3,1 | Late 2007 | ^^ | ^^ | -| MacBook4,1 | Early 2008 | YES - Monterey and older | - No GPU Acceleration in Mavericks and newer
- No Keyboard and Trackpad
- No USB | -| MacBook5,1 | Late 2008 | ^^ | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- Supports macOS Monterey and older ([Ventura support in development](./VENTURA-DROP.md))| +| MacBook4,1 | Early 2008 | ^^ | - No GPU Acceleration in Mavericks and newer
- No Keyboard and Trackpad
- No USB | +| MacBook5,1 | Late 2008 | YES | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- UHCI/OHCI support in Public Beta, see current issues ([#1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021))| | MacBook5,2 | Early 2009 | ^^ | ^^ | | MacBook6,1 | Late 2009 | ^^ | ^^ | | MacBook7,1 | Mid-2010 | ^^ | ^^ | -| MacBook8,1 | Mid-2015 | YES | Everything is supported | +| MacBook8,1 | Mid-2015 | ^^ | Everything is supported | | MacBook9,1 | Early 2016 | ^^ | ^^ | ### MacBook Air @@ -45,12 +45,12 @@ Regarding OS support, see below: | SMBIOS | Year | Supported | Comment | | :--- | :--- | :--- | :--- | | MacBookAir1,1 | Early 2008 | NO | Requires SSE4.1 CPU | -| MacBookAir2,1 | Late 2008 | YES - Monterey and older | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- Supports macOS Monterey and older ([Ventura support in development](./VENTURA-DROP.md))| +| MacBookAir2,1 | Late 2008 | YES | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- UHCI/OHCI support in Public Beta, see current issues ([#1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021))| | MacBookAir3,1 | Late 2010 | ^^ | ^^ | | MacBookAir3,2 | ^^ | ^^ | ^^ | -| MacBookAir4,1 | Mid-2011 | ^^ | ^^ | +| MacBookAir4,1 | Mid-2011 | ^^ | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))| | MacBookAir4,2 | ^^ | ^^ | ^^ | -| MacBookAir5,1 | Mid-2012 | YES | Everything is supported | +| MacBookAir5,1 | Mid-2012 | ^^ | Everything is supported | | MacBookAir5,2 | ^^ | ^^ | ^^ | | MacBookAir6,1 | Mid-2013, Early 2014 | ^^ | ^^ | | MacBookAir6,2 | ^^ | ^^ | ^^ | @@ -66,19 +66,19 @@ Regarding OS support, see below: | MacBookPro2,1 | Late 2006 | ^^ | 32-Bit Firmware limitation | | MacBookPro2,2 | Late 2006 | ^^ | ^^ | | MacBookPro3,1 | Mid-2007 | ^^ | Requires SSE4.1 CPU | -| MacBookPro4,1 | Early 2008 | YES - Monterey and older | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- Supports macOS Monterey and older ([Ventura support in development](./VENTURA-DROP.md))| +| MacBookPro4,1 | Early 2008 | YES | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- UHCI/OHCI support in Public Beta, see current issues ([#1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021))| | MacBookPro5,1 | Late 2008 | ^^ | ^^ | | MacBookPro5,2 | Early 2009 | ^^ | ^^ | | MacBookPro5,3 | Mid-2009 | ^^ | ^^ | | MacBookPro5,4 | ^^ | ^^ | ^^ | | MacBookPro5,5 | ^^ | ^^ | ^^ | -| MacBookPro6,1 | Mid-2010 | ^^ | ^^ | +| MacBookPro6,1 | Mid-2010 | ^^ | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))| | MacBookPro6,2 | ^^ | ^^ | ^^ | -| MacBookPro7,1 | ^^ | ^^ | ^^ | -| MacBookPro8,1 | Early 2011 | ^^ | ^^ | +| MacBookPro7,1 | ^^ | ^^ | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- UHCI/OHCI support in Public Beta, see current issues ([#1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021))| +| MacBookPro8,1 | Early 2011 | ^^ | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))| | MacBookPro8,2 | ^^ | ^^ | ^^ | | MacBookPro8,3 | ^^ | ^^ | ^^ | -| MacBookPro9,1 | Mid-2012 | YES | Everything is supported | +| MacBookPro9,1 | Mid-2012 | ^^ | Everything is supported | | MacBookPro9,2 | ^^ | ^^ | ^^ | | MacBookPro10,1 | Mid-2012, Early 2013 | ^^ | ^^ | | MacBookPro10,2 | Late 2012, Early 2013 | ^^ | ^^ | @@ -98,12 +98,12 @@ Regarding OS support, see below: | :--- | :--- | :--- | :--- | | Macmini1,1 | Early 2006 | NO | 32-Bit CPU limitation | | Macmini2,1 | Mid-2007 | ^^ | 32-Bit Firmware limitation | -| Macmini3,1 | Early 2009 | YES - Monterey and older | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- Supports macOS Monterey and older ([Ventura support in development](./VENTURA-DROP.md)) | +| Macmini3,1 | Early 2009 | YES | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- UHCI/OHCI support in Public Beta, see current issues ([#1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021))| | Macmini4,1 | Mid-2010 | ^^ | ^^ | -| Macmini5,1 | Mid-2011 | ^^ | ^^ | +| Macmini5,1 | Mid-2011 | ^^ | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))| | Macmini5,2 | ^^ | ^^ | ^^ | | Macmini5,3 | ^^ | ^^ | ^^ | -| Macmini6,1 | Late 2012 | YES | Everything is supported | +| Macmini6,1 | Late 2012 | ^^ | Everything is supported | | Macmini6,2 | ^^ | ^^ | ^^ | | Macmini7,1 | Mid-2014 | ^^ | ^^ | @@ -116,16 +116,16 @@ Regarding OS support, see below: | iMac5,1 | Late 2006 | ^^ | 32-Bit Firmware limitation | | iMac5,2 | ^^ | ^^ | ^^ | | iMac6,1 | ^^ | ^^ | ^^ | -| iMac7,1 | Mid-2007 | YES - Monterey and older | - Requires an [SSE4.1 CPU Upgrade](https://lowendmac.com/2018/penryn-t9300-9500-cpu-upgrades-for-the-2007-imac/)
- GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- Stock Bluetooth 2.0 card non-functional
- Supports macOS Monterey and older ([Ventura support in development](./VENTURA-DROP.md)) | -| iMac8,1 | Early 2008 | ^^ | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)))
- Supports macOS Monterey and older ([Ventura support in development](./VENTURA-DROP.md))| +| iMac7,1 | Mid-2007 | YES | - Requires an [SSE4.1 CPU Upgrade](https://lowendmac.com/2018/penryn-t9300-9500-cpu-upgrades-for-the-2007-imac/)
- GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- Stock Bluetooth 2.0 card non-functional
- UHCI/OHCI support in Public Beta, see current issues ([#1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021))| +| iMac8,1 | Early 2008 | ^^ | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- UHCI/OHCI support in Public Beta, see current issues ([#1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021))| | iMac9,1 | Early 2009 | ^^ | ^^ | -| iMac10,1 | Late 2009 | ^^ | - GPU is socketed, [recommend upgrading to Metal GPU](https://forums.macrumors.com/threads/2011-imac-graphics-card-upgrade.1596614/?post=17425857#post-17425857)
- GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- Supports macOS Monterey and older ([Ventura support in development](./VENTURA-DROP.md))| -| iMac11,1 | ^^ | ^^ | ^^ | +| iMac10,1 | Late 2009 | ^^ | - GPU is socketed, [recommend upgrading to Metal GPU](https://forums.macrumors.com/threads/2011-imac-graphics-card-upgrade.1596614/?post=17425857#post-17425857)
- GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))
- UHCI/OHCI support in Public Beta, see current issues ([#1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021))| +| iMac11,1 | ^^ | ^^ | - GPU Acceleration in Public Beta, see current issues ([#108](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108))| | iMac11,2 | Mid-2010 | ^^ | ^^ | | iMac11,3 | ^^ | ^^ | ^^ | | iMac12,1 | Mid-2011 | ^^ | ^^ | | iMac12,2 | ^^ | ^^ | ^^ | -| iMac13,1 | Late 2012 | YES | Everything is supported | +| iMac13,1 | Late 2012 | ^^ | Everything is supported | | iMac13,2 | ^^ | ^^ | ^^ | | iMac13,3 | ^^ | ^^ | ^^ | | iMac14,1 | Late 2013 | ^^ | ^^ | @@ -145,8 +145,8 @@ Regarding OS support, see below: | :--- | :--- | :--- | :--- | | MacPro1,1 | Mid-2006 | NO | 32-Bit Firmware limitation | | MacPro2,1 | Mid-2007 | ^^ | ^^ | -| MacPro3,1 | Early 2008 | YES - Monterey and older | - Potential boot issues with built-in USB 1.1 ports (recommend using a USB 2.0 hub or dedicated USB PCIe controller)
- Potential boot issues with stock Bluetooth card, recommend removing to avoid kernel panics | -| MacPro4,1 | Early 2009 | ^^ | - Everything is supported as long as GPU is Metal capable
- Supports macOS Monterey and older ([Ventura support in development](./VENTURA-DROP.md)) | +| MacPro3,1 | Early 2008 | YES | - UHCI/OHCI support in Public Beta, see current issues ([#1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issesues/1021))
- Potential boot issues with stock Bluetooth card, recommend removing to avoid kernel panics | +| MacPro4,1 | Early 2009 | ^^ | - Everything is supported as long as GPU is Metal capable
- UHCI/OHCI support in Public Beta, see current issues ([#1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issesues/1021))| | MacPro5,1 | Mid-2010, Mid-2012 | ^^ | ^^ | | MacPro6,1 | Late 2013 | ^^ | - CPU Power Management currently unsupported
- No DRM support | @@ -155,7 +155,7 @@ Regarding OS support, see below: | SMBIOS | Year | Supported | Comment | | :--- | :--- | :--- | :--- | | Xserve1,1 | Mid-2006 | NO | 32-Bit Firmware limitation | -| Xserve2,1 | Early 2008 | YES - Monterey and older | - Everything is supported as long as GPU is Metal capable
- Supports macOS Monterey and older ([Ventura support in development](./VENTURA-DROP.md))| +| Xserve2,1 | Early 2008 | YES | - UHCI/OHCI support in Public Beta, see current issues ([#1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021))| | Xserve3,1 | Early 2009 | ^^ | ^^ | # Once you've verified your hardware is supported, head to [Download and build macOS Installers](./INSTALLER.md) diff --git a/resources/kdk_handler.py b/resources/kdk_handler.py index d28540851..ee9ee977b 100644 --- a/resources/kdk_handler.py +++ b/resources/kdk_handler.py @@ -11,8 +11,6 @@ import requests import subprocess -import logging - from resources import utilities from resources.constants import Constants @@ -22,114 +20,27 @@ class kernel_debug_kit_handler: self.constants = constants def get_available_kdks(self): - KDK_API_LINK = "https://kdk-api.dhinak.net/v1" + KDK_API_LINK = "https://raw.githubusercontent.com/dortania/KdkSupportPkg/gh-pages/manifest.json" - logging.info("- Fetching available KDKs") + print("- Fetching available KDKs") try: results = utilities.SESSION.get(KDK_API_LINK, headers={"User-Agent": f"OCLP/{self.constants.patcher_version}"}, timeout=10) except (requests.exceptions.Timeout, requests.exceptions.TooManyRedirects, requests.exceptions.ConnectionError): - logging.info("- Could not contact KDK API") + print("- Could not contact KDK API") return None if results.status_code != 200: - logging.info("- Could not fetch KDK list") + print("- Could not fetch KDK list") return None return sorted(results.json(), key=lambda x: (packaging.version.parse(x["version"]), datetime.datetime.fromisoformat(x["date"])), reverse=True) - def get_closest_match_legacy(self, host_version: str, host_build: str): - # Get the closest match to the provided version - # KDKs are generally a few days late, so we'll rely on N-1 matching - - # Note: AppleDB is manually updated, so this is not a perfect solution - - OS_DATABASE_LINK = "https://api.appledb.dev/main.json" - VERSION_PATTERN = re.compile(r"\d+\.\d+(\.\d+)?") - - parsed_host_version = cast(packaging.version.Version, packaging.version.parse(host_version)) - - logging.info(f"- Checking closest match for: {host_version} build {host_build}") - - try: - results = utilities.SESSION.get(OS_DATABASE_LINK) - except (requests.exceptions.Timeout, requests.exceptions.TooManyRedirects, requests.exceptions.ConnectionError): - logging.info("- Could not contact AppleDB") - return None, "", "" - - if results.status_code != 200: - logging.info("- Could not fetch database") - return None, "", "" - - macos_builds = [i for i in results.json()["ios"] if i["osType"] == "macOS"] - # If the version is borked, put it at the bottom of the list - # Would omit it, but can't do that in this lambda - macos_builds.sort(key=lambda x: (packaging.version.parse(VERSION_PATTERN.match(x["version"]).group() if VERSION_PATTERN.match(x["version"]) else "0.0.0"), datetime.datetime.fromisoformat(x["released"] if x["released"] != "" else "1984-01-01")), reverse=True) # type: ignore - - # Iterate through, find build that is closest to the host version - # Use date to determine which is closest - for build_info in macos_builds: - if build_info["osType"] == "macOS": - raw_version = VERSION_PATTERN.match(build_info["version"]) - if not raw_version: - # Skip if version is borked - continue - version = cast(packaging.version.Version, packaging.version.parse(raw_version.group())) - build = build_info["build"] - if build == host_build: - # Skip, as we want the next closest match - continue - elif version <= parsed_host_version and version.major == parsed_host_version.major and version.minor == parsed_host_version.minor: - # The KDK list is already sorted by date then version, so the first match is the closest - logging.info(f"- Closest match: {version} build {build}") - return self.generate_kdk_link(str(version), build), str(version), build - - logging.info("- Could not find a match") - return None, "", "" - - def generate_kdk_link(self, version: str, build: str): - return f"https://download.developer.apple.com/macOS/Kernel_Debug_Kit_{version}_build_{build}/Kernel_Debug_Kit_{version}_build_{build}.dmg" - - def verify_apple_developer_portal(self, link): - # Determine whether Apple Developer Portal is up - # and if the requested file is available - - # Returns following: - # 0: Portal is up and file is available - # 1: Portal is up but file is not available - # 2: Portal is down - # 3: Network error - - if utilities.verify_network_connection("https://developerservices2.apple.com/services/download") is False: - logging.info("- Could not connect to the network") - return 3 - - TOKEN_URL_BASE = "https://developerservices2.apple.com/services/download" - remote_path = urllib.parse.urlparse(link).path - token_url = urllib.parse.urlunparse(urllib.parse.urlparse(TOKEN_URL_BASE)._replace(query=urllib.parse.urlencode({"path": remote_path}))) - - try: - response = utilities.SESSION.get(token_url, timeout=5) - except (requests.exceptions.Timeout, requests.exceptions.TooManyRedirects, requests.exceptions.ConnectionError): - logging.info("- Could not contact Apple download servers") - return 2 - - try: - response.raise_for_status() - except requests.exceptions.HTTPError: - if response.status_code == 400 and "The path specified is invalid" in response.text: - logging.info("- File does not exist on Apple download servers") - return 1 - else: - logging.info("- Could not request download authorization from Apple download servers") - return 2 - return 0 - def download_kdk(self, version: str, build: str): detected_build = build if self.is_kdk_installed(detected_build) is True: - logging.info("- KDK is already installed") + print("- KDK is already installed") self.remove_unused_kdks(exclude_builds=[detected_build]) return True, "", detected_build @@ -147,84 +58,56 @@ class kernel_debug_kit_handler: kdk_version = cast(packaging.version.Version, packaging.version.parse(kdk["version"])) if kdk["build"] == build: download_link = kdk["url"] - elif not closest_match_download_link and kdk_version <= parsed_version and kdk_version.major == parsed_version.major and (kdk_version.minor == parsed_version.minor or kdk_version.minor == parsed_version.minor - 1): - # The KDK list is already sorted by date then version, so the first match is the closest + elif not closest_match_download_link and kdk_version <= parsed_version and kdk_version.major == parsed_version.major and (kdk_version.minor in range(parsed_version.minor - 1, parsed_version.minor + 1)): + # The KDK list is already sorted by version then date, so the first match is the closest closest_match_download_link = kdk["url"] closest_version = kdk["version"] closest_build = kdk["build"] else: - logging.info("- Could not fetch KDK list, falling back to brute force") - download_link = self.generate_kdk_link(version, build) - closest_match_download_link, closest_version, closest_build = self.get_closest_match_legacy(version, build) + msg = "Could not fetch KDK list" + print(f"- {msg}") + return False, msg, "" - logging.info(f"- Checking for KDK matching macOS {version} build {build}") + print(f"- Checking for KDK matching macOS {version} build {build}") # download_link is None if no matching KDK is found, so we'll fall back to the closest match - result = self.verify_apple_developer_portal(download_link) if download_link else 1 - if result == 0: - logging.info("- Downloading KDK") - elif result == 1: - logging.info("- Could not find KDK, finding closest match") + if not download_link: + print("- Could not find KDK, finding closest match") if self.is_kdk_installed(closest_build) is True: - logging.info(f"- Closet Build ({closest_build}) already installed") + print(f"- Closest build ({closest_build}) already installed") self.remove_unused_kdks(exclude_builds=[detected_build, closest_build]) return True, "", closest_build if closest_match_download_link is None: msg = "Could not find KDK for host, nor closest match" - logging.info(f"- {msg}") + print(f"- {msg}") return False, msg, "" - logging.info(f"- Closest match: {closest_version} build {closest_build}") - result = self.verify_apple_developer_portal(closest_match_download_link) + print(f"- Closest match: {closest_version} build {closest_build}") + download_link = closest_match_download_link - if result == 0: - logging.info("- Downloading KDK") - download_link = closest_match_download_link - elif result == 1: - msg = "Could not find KDK for host on Apple's servers, nor closest match" - logging.info(f"- {msg}") - return False, msg, "" - elif result == 2: - msg = "Could not contact Apple download servers" - download_link = self.kdk_backup_site(closest_build) - if download_link is None: - msg += " and could not find a backup copy online" - logging.info(f"- {msg}") - return False, msg, "" - else: - msg = "Unknown error" - logging.info(f"- {msg}") - return False, msg, "" - elif result == 2: - msg = "Could not contact Apple download servers" - download_link = self.kdk_backup_site(build) - if download_link is None: - msg += " and could not find a backup copy online" - logging.info(f"- {msg}") - return False, msg, "" - elif result == 3: - msg = "Failed to connect to the internet" - logging.info(f"- {msg}") + if utilities.verify_network_connection(download_link): + print("- Downloading KDK") + else: + msg = "Could not contact download site" + print(f"- {msg}") return False, msg, "" - if "github" in download_link: - result = utilities.download_file(download_link, self.constants.kdk_download_path) - else: - result = utilities.download_apple_developer_portal(download_link, self.constants.kdk_download_path) + result = utilities.download_file(download_link, self.constants.kdk_download_path) if result: + # TODO: should we use the checksum from the API? result = subprocess.run(["hdiutil", "verify", self.constants.kdk_download_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) if result.returncode != 0: - logging.info(f"Error: Kernel Debug Kit checksum verification failed!") - logging.info(f"Output: {result.stderr}") + print("Error: Kernel Debug Kit checksum verification failed!") + print(f"Output: {result.stderr}") msg = "Kernel Debug Kit checksum verification failed, please try again.\n\nIf this continues to fail, ensure you're downloading on a stable network connection (ie. Ethernet)" - logging.info(f"- {msg}") + print(f"- {msg}") return False, msg, "" self.remove_unused_kdks(exclude_builds=[detected_build, closest_build]) return True, "", detected_build msg = "Failed to download KDK" - logging.info(f"- {msg}") + print(f"- {msg}") return False, msg, "" def is_kdk_installed(self, build): @@ -241,7 +124,7 @@ class kernel_debug_kit_handler: if file.name.endswith(f"{build}.kdk"): for kext in kexts_to_check: if not Path(f"{file}/System/Library/Extensions/{kext}").exists(): - logging.info(f"- Corrupted KDK found, removing due to missing: {file}/System/Library/Extensions/{kext}") + print(f"- Corrupted KDK found, removing due to missing: {file}/System/Library/Extensions/{kext}") utilities.elevated(["rm", "-rf", file], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) return False return True @@ -257,7 +140,7 @@ class kernel_debug_kit_handler: if exclude_builds == []: return - logging.info("- Cleaning unused KDKs") + print("- Cleaning unused KDKs") for kdk_folder in Path("/Library/Developer/KDKs").iterdir(): if kdk_folder.is_dir(): if kdk_folder.name.endswith(".kdk"): @@ -268,7 +151,7 @@ class kernel_debug_kit_handler: break if should_remove is False: continue - logging.info(f" - Removing {kdk_folder.name}") + print(f" - Removing {kdk_folder.name}") utilities.elevated(["rm", "-rf", kdk_folder], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) @@ -278,17 +161,17 @@ class kernel_debug_kit_handler: # Check if tag exists catalog = requests.get(KDK_MIRROR_REPOSITORY) if catalog.status_code != 200: - logging.info(f"- Could not contact KDK mirror repository") + print(f"- Could not contact KDK mirror repository") return None catalog = catalog.json() for release in catalog: if release["tag_name"] == build: - logging.info(f"- Found KDK mirror for build: {build}") + print(f"- Found KDK mirror for build: {build}") for asset in release["assets"]: if asset["name"].endswith(".dmg"): return asset["browser_download_url"] - logging.info(f"- Could not find KDK mirror for build {build}") + print(f"- Could not find KDK mirror for build {build}") return None \ No newline at end of file diff --git a/resources/utilities.py b/resources/utilities.py index c4b81ec0d..f9b6f5c95 100644 --- a/resources/utilities.py +++ b/resources/utilities.py @@ -15,7 +15,6 @@ import requests import shutil import urllib.parse import py_sip_xnu -import logging from resources import constants, ioreg from data import sip_data, os_data @@ -40,8 +39,8 @@ def string_to_hex(input_string): def process_status(process_result): if process_result.returncode != 0: - logging.info(f"Process failed with exit code {process_result.returncode}") - logging.info(f"Please report the issue on the Discord server") + print(f"Process failed with exit code {process_result.returncode}") + print(f"Please report the issue on the Discord server") raise Exception(f"Process result: \n{process_result.stdout.decode()}") @@ -56,11 +55,11 @@ def human_fmt(num): def header(lines): lines = [i for i in lines if i is not None] total_length = len(max(lines, key=len)) + 4 - logging.info("#" * (total_length)) + print("#" * (total_length)) for line in lines: left_side = math.floor(((total_length - 2 - len(line.strip())) / 2)) - logging.info("#" + " " * left_side + line.strip() + " " * (total_length - len("#" + " " * left_side + line.strip()) - 1) + "#") - logging.info("#" * total_length) + print("#" + " " * left_side + line.strip() + " " * (total_length - len("#" + " " * left_side + line.strip()) - 1) + "#") + print("#" * total_length) RECOVERY_STATUS = None @@ -125,7 +124,7 @@ sleep_process = None def disable_sleep_while_running(): global sleep_process - logging.info("- Disabling Idle Sleep") + print("- Disabling Idle Sleep") if sleep_process is None: # If sleep_process is active, we'll just keep it running sleep_process = subprocess.Popen(["caffeinate", "-d", "-i", "-s"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) @@ -135,7 +134,7 @@ def disable_sleep_while_running(): def enable_sleep_after_running(): global sleep_process if sleep_process: - logging.info("- Re-enabling Idle Sleep") + print("- Re-enabling Idle Sleep") sleep_process.kill() sleep_process = None @@ -284,7 +283,7 @@ def cls(): if not check_recovery(): os.system("cls" if os.name == "nt" else "clear") else: - logging.info("\u001Bc") + print("\u001Bc") def check_command_line_tools(): # Determine whether Command Line Tools exist @@ -296,7 +295,7 @@ def check_command_line_tools(): return False def get_nvram(variable: str, uuid: str = None, *, decode: bool = False): - # TODO: Properly fix for El Capitan, which does not logging.info the XML representation even though we say to + # TODO: Properly fix for El Capitan, which does not print the XML representation even though we say to if uuid is not None: uuid += ":" @@ -328,7 +327,7 @@ def get_nvram(variable: str, uuid: str = None, *, decode: bool = False): def get_rom(variable: str, *, decode: bool = False): - # TODO: Properly fix for El Capitan, which does not logging.info the XML representation even though we say to + # TODO: Properly fix for El Capitan, which does not print the XML representation even though we say to rom = ioreg.IORegistryEntryFromPath(ioreg.kIOMasterPortDefault, "IODeviceTree:/rom".encode()) @@ -391,7 +390,7 @@ def download_file(link, location, is_gui=None, verify_checksum=False): # Check if we have enough space if total_file_size > get_free_space(): - logging.info(f"Not enough space to download {base_name} ({file_size_rounded}MB)") + print(f"Not enough space to download {base_name} ({file_size_rounded}MB)") return False else: file_size_string = "" @@ -408,78 +407,46 @@ def download_file(link, location, is_gui=None, verify_checksum=False): dl = 0 total_downloaded_string = "" global clear + checksum = hashlib.sha256() if verify_checksum else None with location.open("wb") as file: count = 0 start = time.perf_counter() - for i, chunk in enumerate(response.iter_content(1024 * 1024 * 4)): + for chunk in response.iter_content(1024 * 1024 * 4): dl += len(chunk) file.write(chunk) + if checksum: + checksum.update(chunk) count += len(chunk) if is_gui is None: if clear: cls() - logging.info(box_string) - logging.info(header) - logging.info(box_string) - logging.info("") + print(box_string) + print(header) + print(box_string) + print("") if total_file_size > 1024: total_downloaded_string = f" ({round(float(dl / total_file_size * 100), 2)}%)" - if i % 100 == 0: - logging.info(f"{round(count / 1024 / 1024, 2)}MB Downloaded{file_size_string}{total_downloaded_string}\nAverage Download Speed: {round(dl//(time.perf_counter() - start) / 100000 / 8, 2)} MB/s") + print(f"{round(count / 1024 / 1024, 2)}MB Downloaded{file_size_string}{total_downloaded_string}\nAverage Download Speed: {round(dl//(time.perf_counter() - start) / 100000 / 8, 2)} MB/s") - if verify_checksum is True: - # Verify checksum - # Note that this can be quite taxing on slower Macs - checksum = hashlib.sha256() - with location.open("rb") as file: - chunk = file.read(1024 * 1024 * 16) - while chunk: - checksum.update(chunk) - chunk = file.read(1024 * 1024 * 16) - enable_sleep_after_running() - return checksum enable_sleep_after_running() - return True + return checksum.hexdigest() if checksum else True else: cls() header = "# Could not establish Network Connection with provided link! #" box_length = len(header) box_string = "#" * box_length - logging.info(box_string) - logging.info(header) - logging.info(box_string) + print(box_string) + print(header) + print(box_string) if constants.Constants().url_patcher_support_pkg in link: # If we're downloading PatcherSupportPkg, present offline build - logging.info("\nPlease grab the offline variant of OpenCore Legacy Patcher from Github:") - logging.info(f"https://github.com/dortania/OpenCore-Legacy-Patcher/releases/download/{constants.Constants().patcher_version}/OpenCore-Patcher-TUI-Offline.app.zip") + print("\nPlease grab the offline variant of OpenCore Legacy Patcher from Github:") + print(f"https://github.com/dortania/OpenCore-Legacy-Patcher/releases/download/{constants.Constants().patcher_version}/OpenCore-Patcher-TUI-Offline.app.zip") else: - logging.info(link) + print(link) return None -def download_apple_developer_portal(link, location, is_gui=None, verify_checksum=False): - TOKEN_URL_BASE = "https://developerservices2.apple.com/services/download?path=" - remote_path = urllib.parse.urlparse(link).path - token_url = urllib.parse.urlunparse(urllib.parse.urlparse(TOKEN_URL_BASE)._replace(query=urllib.parse.urlencode({"path": remote_path}))) - - try: - response = SESSION.get(token_url, timeout=5) - except (requests.exceptions.Timeout, requests.exceptions.TooManyRedirects, requests.exceptions.ConnectionError): - logging.info(" - Could not contact Apple download servers") - return None - - try: - response.raise_for_status() - except requests.exceptions.HTTPError: - if response.status_code == 400 and "The path specified is invalid" in response.text: - logging.info(" - File does not exist on Apple download servers") - else: - logging.info(" - Could not request download authorization from Apple download servers") - return None - - return download_file(link, location, is_gui, verify_checksum) - - def dump_constants(constants): with open(os.path.join(os.path.expanduser('~'), 'Desktop', 'internal_data.txt'), 'w') as f: f.write(str(vars(constants))) @@ -593,7 +560,7 @@ def block_os_updaters(): for bad_process in bad_processes: if bad_process in current_process: if pid != "": - logging.info(f"- Killing Process: {pid} - {current_process.split('/')[-1]}") + print(f"- Killing Process: {pid} - {current_process.split('/')[-1]}") subprocess.run(["kill", "-9", pid]) break