71 lines
2.2 KiB
Python
Executable File
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 ""
|