Files
2020-11-24 09:43:27 +03:00

71 lines
2.2 KiB
Python
Executable File

import binascii, subprocess, sys
def get_clover_uuid():
bd = bdmesg()
if not len(bd):
return ""
# Get bdmesg output - then parse for SelfDevicePath
if not "SelfDevicePath=" in bd:
# Not found
return ""
try:
# Split to just the contents of that line
line = bd.split("SelfDevicePath=")[1].split("\n")[0]
# Get the HD section
hd = line.split("HD(")[1].split(")")[0]
# Get the UUID
uuid = hd.split(",")[2]
return uuid
except:
pass
return ""
def get_oc_uuid():
p = subprocess.Popen(["nvram","4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:boot-path"], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
oc, oe = p.communicate()
oc = _decode(oc)
try:
path = oc.split("GPT,")[1].split(",")[0]
except:
path = ""
return path
def get_bootloader_uuid():
b_uuid = get_clover_uuid()
if not b_uuid:
b_uuid = get_oc_uuid()
return b_uuid
def bdmesg(just_clover = True):
b = "" if just_clover else _bdmesg(["ioreg","-l","-p","IOService","-w0"])
if b == "":
b = _bdmesg(["ioreg","-l","-p","IODeviceTree","-w0"])
return b
def _decode(var):
if sys.version_info >= (3,0) and isinstance(var, bytes):
var = var.decode("utf-8","ignore")
return var
def _bdmesg(comm):
# Runs ioreg -l -p IODeviceTree -w0 and searches for "boot-log"
p = subprocess.Popen(comm, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
bd, be = p.communicate()
bd = _decode(bd)
for line in bd.split("\n"):
# We're just looking for the "boot-log" property, then we need to format it
if not '"boot-log"' in line:
# Skip it!
continue
# Must have found it - let's try to split it, then get the hex data and process it
try:
# Split it up, then convert from hex to ascii
ascii_bytes = binascii.unhexlify(line.split("<")[1].split(">")[0].encode("utf-8"))
ascii_bytes = _decode(ascii_bytes)
return ascii_bytes
except:
# Failed to convert
return ""
# Didn't find it
return ""