1061da546Spatrickimport binascii 2*f6aab3d8Srobertimport shlex 3061da546Spatrickimport subprocess 4061da546Spatrick 5061da546Spatrickdef get_command_output(command): 6*f6aab3d8Srobert try: 7*f6aab3d8Srobert return subprocess.check_output( 8*f6aab3d8Srobert command, 9*f6aab3d8Srobert shell=True, 10*f6aab3d8Srobert universal_newlines=True).rstrip() 11*f6aab3d8Srobert except subprocess.CalledProcessError as e: 12*f6aab3d8Srobert return e.output 13061da546Spatrick 14*f6aab3d8Srobertdef bitcast_to_string(b: bytes) -> str: 15*f6aab3d8Srobert """ 16*f6aab3d8Srobert Take a bytes object and return a string. The returned string contains the 17*f6aab3d8Srobert exact same bytes as the input object. (latin1 <-> unicode transformation is 18*f6aab3d8Srobert an identity operation for the first 256 code points). 19*f6aab3d8Srobert """ 20*f6aab3d8Srobert return b.decode("latin1") 21061da546Spatrick 22*f6aab3d8Srobertdef bitcast_to_bytes(s: str) -> bytes: 23061da546Spatrick """ 24*f6aab3d8Srobert Take a string and return a bytes object. The returned object contains the 25*f6aab3d8Srobert exact same bytes as the input string. (latin1 <-> unicode transformation isi 26*f6aab3d8Srobert an identity operation for the first 256 code points). 27061da546Spatrick """ 28*f6aab3d8Srobert return s.encode("latin1") 29061da546Spatrick 30061da546Spatrickdef unhexlify(hexstr): 31061da546Spatrick """Hex-decode a string. The result is always a string.""" 32061da546Spatrick return bitcast_to_string(binascii.unhexlify(hexstr)) 33061da546Spatrick 34061da546Spatrickdef hexlify(data): 35061da546Spatrick """Hex-encode string data. The result if always a string.""" 36061da546Spatrick return bitcast_to_string(binascii.hexlify(bitcast_to_bytes(data))) 37*f6aab3d8Srobert 38*f6aab3d8Srobert# TODO: Replace this with `shlex.join` when minimum Python version is >= 3.8 39*f6aab3d8Srobertdef join_for_shell(split_command): 40*f6aab3d8Srobert return " ".join([shlex.quote(part) for part in split_command]) 41