mirror of
https://github.com/dortania/OpenCore-Legacy-Patcher.git
synced 2026-06-20 14:10:51 +10:00
Move payload reroutes to dedicated class
This commit is contained in:
+1
-1
@@ -1288,7 +1288,7 @@ class wx_python_gui:
|
|||||||
thread_ia = threading.Thread(target=ia)
|
thread_ia = threading.Thread(target=ia)
|
||||||
thread_ia.start()
|
thread_ia.start()
|
||||||
|
|
||||||
while thread_ia.is_alive():
|
while thread_ia.is_alive() or self.constants.unpack_thread.is_alive():
|
||||||
self.pulse_alternative(self.progress_bar)
|
self.pulse_alternative(self.progress_bar)
|
||||||
wx.GetApp().Yield()
|
wx.GetApp().Yield()
|
||||||
available_installers = self.available_installers
|
available_installers = self.available_installers
|
||||||
|
|||||||
+2
-42
@@ -1,17 +1,14 @@
|
|||||||
# Copyright (C) 2020-2022, Dhinak G, Mykola Grymalyuk
|
# Copyright (C) 2020-2022, Dhinak G, Mykola Grymalyuk
|
||||||
|
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
import plistlib
|
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import atexit
|
|
||||||
import time
|
import time
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
from resources import build, cli_menu, constants, utilities, device_probe, os_probe, defaults, arguments, install, tui_helpers
|
from resources import build, cli_menu, constants, utilities, device_probe, os_probe, defaults, arguments, install, tui_helpers, reroute_payloads
|
||||||
from data import model_array
|
from data import model_array
|
||||||
|
|
||||||
class OpenCoreLegacyPatcher:
|
class OpenCoreLegacyPatcher:
|
||||||
@@ -45,7 +42,7 @@ class OpenCoreLegacyPatcher:
|
|||||||
launcher_script = launcher_script.replace("/resources/main.py", "/OpenCore-Patcher-GUI.command")
|
launcher_script = launcher_script.replace("/resources/main.py", "/OpenCore-Patcher-GUI.command")
|
||||||
self.constants.launcher_binary = launcher_binary
|
self.constants.launcher_binary = launcher_binary
|
||||||
self.constants.launcher_script = launcher_script
|
self.constants.launcher_script = launcher_script
|
||||||
self.constants.unpack_thread = threading.Thread(target=self.reroute_payloads)
|
self.constants.unpack_thread = threading.Thread(target=reroute_payloads.reroute_payloads(self.constants).setup_tmp_disk_image)
|
||||||
self.constants.unpack_thread.start()
|
self.constants.unpack_thread.start()
|
||||||
|
|
||||||
defaults.generate_defaults.probe(self.computer.real_model, True, self.constants)
|
defaults.generate_defaults.probe(self.computer.real_model, True, self.constants)
|
||||||
@@ -66,43 +63,6 @@ class OpenCoreLegacyPatcher:
|
|||||||
else:
|
else:
|
||||||
print(f"- No arguments present, loading {'GUI' if self.constants.wxpython_variant is True else 'TUI'} mode")
|
print(f"- No arguments present, loading {'GUI' if self.constants.wxpython_variant is True else 'TUI'} mode")
|
||||||
|
|
||||||
def reroute_payloads(self):
|
|
||||||
if self.constants.launcher_binary and self.constants.wxpython_variant is True and not self.constants.launcher_script:
|
|
||||||
print("- Running in Binary GUI mode, switching to tmp directory")
|
|
||||||
self.temp_dir = tempfile.TemporaryDirectory()
|
|
||||||
print(f"- New payloads location: {self.temp_dir.name}")
|
|
||||||
print("- Creating payloads directory")
|
|
||||||
Path(self.temp_dir.name / Path("payloads")).mkdir(parents=True, exist_ok=True)
|
|
||||||
self.clean_up()
|
|
||||||
output = subprocess.run(
|
|
||||||
[
|
|
||||||
"hdiutil", "attach", "-noverify", f"{self.constants.payload_path}.dmg", "-mountpoint", Path(self.temp_dir.name / Path("payloads")),
|
|
||||||
"-nobrowse", "-shadow", Path(self.temp_dir.name / Path("payloads_overlay")), "-passphrase", "password"
|
|
||||||
],
|
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.STDOUT
|
|
||||||
)
|
|
||||||
if output.returncode == 0:
|
|
||||||
print("- Mounted payloads.dmg")
|
|
||||||
self.constants.current_path = Path(self.temp_dir.name)
|
|
||||||
self.constants.payload_path = Path(self.temp_dir.name) / Path("payloads")
|
|
||||||
atexit.register(self.clean_up)
|
|
||||||
else:
|
|
||||||
print("- Failed to mount payloads.dmg")
|
|
||||||
print(f"Output: {output.stdout.decode()}")
|
|
||||||
print(f"Return Code: {output.returncode}")
|
|
||||||
print("- Exiting...")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
def clean_up(self):
|
|
||||||
# Grab info on all dmgs mounted
|
|
||||||
dmg_info = subprocess.run(["hdiutil", "info", "-plist"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
|
||||||
dmg_info = plistlib.loads(dmg_info.stdout)
|
|
||||||
|
|
||||||
for image in dmg_info["images"]:
|
|
||||||
if image["image-path"].endswith("payloads.dmg"):
|
|
||||||
print(f"- Unmounting payloads.dmg")
|
|
||||||
subprocess.run(["hdiutil", "detach", image["system-entities"][0]["dev-entry"], "-force"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
|
||||||
|
|
||||||
|
|
||||||
def main_menu(self):
|
def main_menu(self):
|
||||||
response = None
|
response = None
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
# Reoute binaries to tmp directory, and mount a disk image of the payloads
|
||||||
|
# Implements a shadowfile to avoid direct writes to the dmg
|
||||||
|
# Copyright (C) 2022, Mykola Grymalyuk
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import plistlib
|
||||||
|
from pathlib import Path
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
|
import atexit
|
||||||
|
|
||||||
|
class reroute_payloads:
|
||||||
|
def __init__(self, constants):
|
||||||
|
self.constants = constants
|
||||||
|
|
||||||
|
def setup_tmp_disk_image(self):
|
||||||
|
# Create a temp directory to mount the payloads.dmg
|
||||||
|
# Then reroute r/w to this new temp directory
|
||||||
|
# Currently only applicable for GUI variant
|
||||||
|
if self.constants.launcher_binary and self.constants.wxpython_variant is True and not self.constants.launcher_script:
|
||||||
|
print("- Running in Binary GUI mode, switching to tmp directory")
|
||||||
|
self.temp_dir = tempfile.TemporaryDirectory()
|
||||||
|
print(f"- New payloads location: {self.temp_dir.name}")
|
||||||
|
print("- Creating payloads directory")
|
||||||
|
Path(self.temp_dir.name / Path("payloads")).mkdir(parents=True, exist_ok=True)
|
||||||
|
self.unmount_active_dmgs()
|
||||||
|
output = subprocess.run(
|
||||||
|
[
|
||||||
|
"hdiutil", "attach", "-noverify", f"{self.constants.payload_path}.dmg",
|
||||||
|
"-mountpoint", Path(self.temp_dir.name / Path("payloads")),
|
||||||
|
"-nobrowse", "-shadow", Path(self.temp_dir.name / Path("payloads_overlay")),
|
||||||
|
"-passphrase", "password"
|
||||||
|
],
|
||||||
|
stdout=subprocess.PIPE, stderr=subprocess.STDOUT
|
||||||
|
)
|
||||||
|
if output.returncode == 0:
|
||||||
|
print("- Mounted payloads.dmg")
|
||||||
|
self.constants.current_path = Path(self.temp_dir.name)
|
||||||
|
self.constants.payload_path = Path(self.temp_dir.name) / Path("payloads")
|
||||||
|
atexit.register(self.unmount_active_dmgs)
|
||||||
|
else:
|
||||||
|
print("- Failed to mount payloads.dmg")
|
||||||
|
print(f"Output: {output.stdout.decode()}")
|
||||||
|
print(f"Return Code: {output.returncode}")
|
||||||
|
print("- Exiting...")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def unmount_active_dmgs(self):
|
||||||
|
# Find all DMGs that are mounted, and forcefully unmount them
|
||||||
|
# If our disk image was previously mounted, we need to unmount it to use again
|
||||||
|
# This can happen if we crash during a previous scession, however 'atexit' class should hopefully avoid this
|
||||||
|
dmg_info = subprocess.run(["hdiutil", "info", "-plist"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
|
dmg_info = plistlib.loads(dmg_info.stdout)
|
||||||
|
|
||||||
|
for image in dmg_info["images"]:
|
||||||
|
if image["image-path"].endswith("payloads.dmg"):
|
||||||
|
print(f"- Unmounting payloads.dmg")
|
||||||
|
subprocess.run(
|
||||||
|
["hdiutil", "detach", image["system-entities"][0]["dev-entry"], "-force"],
|
||||||
|
stdout=subprocess.PIPE, stderr=subprocess.STDOUT
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user