mirror of
https://github.com/RasppleII/a2server.git
synced 2025-02-28 17:29:38 +00:00
install-gsos.py: refactor HFS image operations
Because the way we deal with the A2SETUP.img varies based on your OS, there's a lot of platform-specific clutter. Not only that, the boot block installation function has started to get rather unwieldy. So we begin thinning it out a little.
This commit is contained in:
parent
1ae17e23b2
commit
bfa985068e
@ -238,28 +238,14 @@ def find_mountpoint(xmlstr):
|
|||||||
else:
|
else:
|
||||||
raise ValueError("Root element is not a dict")
|
raise ValueError("Root element is not a dict")
|
||||||
|
|
||||||
|
a2setup_platform = "hfsutils"
|
||||||
|
|
||||||
def install_bootblocks(dest_dir, dest_fmt, gsos_version):
|
def a2setup_set_a2setup_platform():
|
||||||
if dest_fmt not in ["unix", "netatalk"]:
|
a2setup_platform = os.uname()[0]
|
||||||
raise ValueError("Only basic UNIX and netatalk formats are supported for now")
|
a2setup_platform = "hfsutils"
|
||||||
|
if a2setup_platform not in ["Linux", "Darwin"]:
|
||||||
if not quiet:
|
a2setup_platform = "hfsutils"
|
||||||
print("Installing Apple // boot blocks (GS/OS version %s)..." % (gsos_version))
|
elif a2setup_platform == "Linux":
|
||||||
|
|
||||||
devnull = open(os.devnull, "wb")
|
|
||||||
if not os.path.isdir(dest_dir):
|
|
||||||
os.makedirs(dest_dir, mode=0o0755)
|
|
||||||
|
|
||||||
work_dir = tempfile.mkdtemp(prefix = "tmp-a2sv-bootblocks.")
|
|
||||||
a2setup_name = "A2SETUP.img"
|
|
||||||
if verbose:
|
|
||||||
print(" dest_fmt : %s\n dest_dir : %s\n work_dir : %s\n"
|
|
||||||
% (dest_fmt, dest_dir, work_dir))
|
|
||||||
|
|
||||||
platform = os.uname()[0]
|
|
||||||
if platform not in ["Linux", "Darwin"]:
|
|
||||||
platform = "hfsutils"
|
|
||||||
elif platform == "Linux":
|
|
||||||
use_sudo = False
|
use_sudo = False
|
||||||
if os.geteuid() != 0:
|
if os.geteuid() != 0:
|
||||||
reply = stdin_input("""
|
reply = stdin_input("""
|
||||||
@ -272,7 +258,70 @@ you want to mount the image using the sudo command? [y] """)
|
|||||||
Okay, if asked for a password, type your user password. It
|
Okay, if asked for a password, type your user password. It
|
||||||
will not be echoed when you type.""")
|
will not be echoed when you type.""")
|
||||||
else:
|
else:
|
||||||
platform = "hfsutils"
|
a2setup_platform = "hfsutils"
|
||||||
|
|
||||||
|
|
||||||
|
def a2setup_mount(image_path):
|
||||||
|
mountpoint = None
|
||||||
|
if a2setup_platform == "Linux":
|
||||||
|
mountpoint = tempfile.mkdtemp(prefix = "tmp-hfsmount.")
|
||||||
|
mount_cmd = ["mount", "-t", "hfs", "-o", "ro,loop", image_path, mountpoint]
|
||||||
|
if use_sudo:
|
||||||
|
mount_cmd = ["sudo"] + mount_cmd
|
||||||
|
subprocess.call(mount_cmd)
|
||||||
|
elif a2setup_platform == "Darwin":
|
||||||
|
xmlstr = subprocess.check_output(["hdiutil", "attach", "-plist",
|
||||||
|
image_path])
|
||||||
|
mountpoint = find_mountpoint(xmlstr)
|
||||||
|
elif a2setup_platform == "hfsutils":
|
||||||
|
mountpoint = tempfile.mkdtemp(prefix = "tmp-hfsmount.")
|
||||||
|
sys_folder = os.path.join(mountpoint, "System Folder")
|
||||||
|
os.mkdir(sys_folder)
|
||||||
|
devnull = open(os.devnull, "wb")
|
||||||
|
subprocess.call(["hmount", image_path], stdout=devnull)
|
||||||
|
devnull.close()
|
||||||
|
subprocess.call(["hcopy", "Apple II Setup:System Folder:*", sys_folder])
|
||||||
|
subprocess.call(["humount", "Apple II Setup"])
|
||||||
|
|
||||||
|
return mountpoint
|
||||||
|
|
||||||
|
|
||||||
|
def a2setup_umount(mountpoint):
|
||||||
|
if a2setup_platform == "Linux":
|
||||||
|
umount_cmd = ["umount", mountpoint]
|
||||||
|
if use_sudo:
|
||||||
|
umount_cmd = ["sudo"] + umount_cmd
|
||||||
|
subprocess.call(umount_cmd)
|
||||||
|
os.rmdir(mountpoint)
|
||||||
|
elif a2setup_platform == "Darwin":
|
||||||
|
devnull = open(os.devnull, "wb")
|
||||||
|
subprocess.call(["hdiutil", "eject", mountpoint], stdout=devnull)
|
||||||
|
devnull.close()
|
||||||
|
elif a2setup_platform == "hfsutils":
|
||||||
|
sys_folder = os.path.joint(mountpoint, "System Folder")
|
||||||
|
for f in os.listdir(sys_folder):
|
||||||
|
os.unlink(os.path.join(sys_folder, f))
|
||||||
|
os.rmdir(sys_folder)
|
||||||
|
os.rmdir(mountpoint)
|
||||||
|
|
||||||
|
|
||||||
|
def install_bootblocks(dest_dir, dest_fmt, gsos_version):
|
||||||
|
if dest_fmt not in ["unix", "netatalk"]:
|
||||||
|
raise ValueError("Only basic UNIX and netatalk formats are supported for now")
|
||||||
|
|
||||||
|
if not quiet:
|
||||||
|
print("Installing Apple // boot blocks (GS/OS version %s)..." % (gsos_version))
|
||||||
|
|
||||||
|
if not os.path.isdir(dest_dir):
|
||||||
|
os.makedirs(dest_dir, mode=0o0755)
|
||||||
|
|
||||||
|
work_dir = tempfile.mkdtemp(prefix = "tmp-a2sv-bootblocks.")
|
||||||
|
a2setup_name = "A2SETUP.img"
|
||||||
|
if verbose:
|
||||||
|
print(" dest_fmt : %s\n dest_dir : %s\n work_dir : %s\n"
|
||||||
|
% (dest_fmt, dest_dir, work_dir))
|
||||||
|
|
||||||
|
a2setup_set_a2setup_platform()
|
||||||
|
|
||||||
a2boot_needed = False
|
a2boot_needed = False
|
||||||
a2boot_unpacked = False
|
a2boot_unpacked = False
|
||||||
@ -328,33 +377,15 @@ will not be echoed when you type.""")
|
|||||||
if not disk7_downloaded:
|
if not disk7_downloaded:
|
||||||
raise IOError("Could not download disk7")
|
raise IOError("Could not download disk7")
|
||||||
|
|
||||||
if platform == "Linux":
|
mountpoint = a2setup_mount(a2setup_path)
|
||||||
mountpoint = os.path.join(work_dir, "a2boot")
|
|
||||||
os.mkdir(mountpoint)
|
|
||||||
mount_cmd = ["mount", "-t", "hfs", "-o", "ro,loop", a2setup_path, mountpoint]
|
|
||||||
if use_sudo:
|
|
||||||
mount_cmd = ["sudo"] + mount_cmd
|
|
||||||
subprocess.call(mount_cmd)
|
|
||||||
src_dir = os.path.join(mountpoint, "System Folder")
|
src_dir = os.path.join(mountpoint, "System Folder")
|
||||||
elif platform == "Darwin":
|
|
||||||
xmlstr = subprocess.check_output(["hdiutil", "attach", "-plist",
|
|
||||||
a2setup_path])
|
|
||||||
mountpoint = find_mountpoint(xmlstr)
|
|
||||||
src_dir = os.path.join(mountpoint, "System Folder")
|
|
||||||
elif platform == "hfsutils":
|
|
||||||
src_dir = os.path.join(work_dir, "a2boot")
|
|
||||||
os.mkdir(src_dir)
|
|
||||||
subprocess.call(["hmount", a2setup_path], stdout=devnull)
|
|
||||||
subprocess.call(["hcopy", "Apple II Setup:System Folder:*",
|
|
||||||
src_dir], stdout=devnull)
|
|
||||||
subprocess.call(["humount", "Apple II Setup"], stdout=devnull)
|
|
||||||
|
|
||||||
a2boot_unpacked = True
|
a2boot_unpacked = True
|
||||||
|
|
||||||
# Copy the file
|
# Copy the file
|
||||||
if platform == "Linux" or platform == "Darwin":
|
if a2setup_platform == "Linux" or a2setup_platform == "Darwin":
|
||||||
src_path = os.path.join(src_dir, bootfile["unix"])
|
src_path = os.path.join(src_dir, bootfile["unix"])
|
||||||
elif platform == "hfsutils":
|
elif a2setup_platform == "hfsutils":
|
||||||
src_path = os.path.join(src_dir, bootfile["hfsutils"])
|
src_path = os.path.join(src_dir, bootfile["hfsutils"])
|
||||||
shutil.copyfile(src_path, dest_path)
|
shutil.copyfile(src_path, dest_path)
|
||||||
else:
|
else:
|
||||||
@ -363,23 +394,9 @@ will not be echoed when you type.""")
|
|||||||
|
|
||||||
# Clean up the mounted/unpacked image
|
# Clean up the mounted/unpacked image
|
||||||
if a2boot_unpacked:
|
if a2boot_unpacked:
|
||||||
if platform == "Linux":
|
a2setup_umount(mountpoint)
|
||||||
umount_cmd = ["umount", mountpoint]
|
|
||||||
if use_sudo:
|
|
||||||
umount_cmd = ["sudo"] + umount_cmd
|
|
||||||
subprocess.call(umount_cmd)
|
|
||||||
os.rmdir(mountpoint)
|
|
||||||
elif platform == "Darwin":
|
|
||||||
subprocess.call(["hdiutil", "eject", mountpoint], stdout=devnull)
|
|
||||||
elif platform == "hfsutils":
|
|
||||||
for bootfile in a2boot_files:
|
|
||||||
name = os.path.join(src_dir, bootfile["hfsutils"])
|
|
||||||
if os.path.isfile(name):
|
|
||||||
os.unlink(name)
|
|
||||||
os.rmdir(src_dir)
|
|
||||||
os.unlink(a2setup_path)
|
os.unlink(a2setup_path)
|
||||||
|
|
||||||
devnull.close()
|
|
||||||
os.rmdir(work_dir)
|
os.rmdir(work_dir)
|
||||||
|
|
||||||
def do_install():
|
def do_install():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user