def multi_boot(directory, bootimg = None, device_check = True, partition_config = None): updater_script = 'META-INF/com/google/android/updater-script' lines = fileio.all_lines(updater_script, directory = directory) i = 0 while i < len(lines): # Remove existing dualboot.sh lines if 'system/bin/dualboot.sh' in lines[i]: del lines[i] # Remove confusing messages elif 'boot installation is' in lines[i]: # Can't remove - sole line inside if statement lines[i] = 'ui_print("");\n' i += 1 elif 'set-secondary' in lines[i]: lines[i] = 'ui_print("");\n' i += 1 else: i += 1 fileio.write_lines(updater_script, lines, directory = directory) # Create /tmp/dualboot.prop lines = fileio.all_lines('dualboot.sh', directory = directory) lines.append("echo 'ro.dualboot=0' > /tmp/dualboot.prop") fileio.write_lines('dualboot.sh', lines, directory = directory)
def patch(self, directory, file_info, bootimages=None): # My ROM has dual-boot support built in, so we'll hack around that to # support triple, quadruple, ... boot updater_script = 'META-INF/com/google/android/updater-script' lines = fileio.all_lines(os.path.join(directory, updater_script)) i = 0 while i < len(lines): # Remove existing dualboot.sh lines if 'system/bin/dualboot.sh' in lines[i]: del lines[i] # Remove confusing messages elif 'boot installation is' in lines[i]: # Can't remove - sole line inside if statement lines[i] = 'ui_print("");\n' i += 1 elif 'set-secondary' in lines[i]: lines[i] = 'ui_print("");\n' i += 1 else: i += 1 fileio.write_lines(os.path.join(directory, updater_script), lines) # Create /tmp/dualboot.prop lines = fileio.all_lines(os.path.join(directory, 'dualboot.sh')) lines.append("echo 'ro.dualboot=0' > /tmp/dualboot.prop") fileio.write_lines(os.path.join(directory, 'dualboot.sh'), lines)
def patch(self, directory, file_info, bootimages=None): # The auto-updater in my ROM needs to know if the ROM has been patched lines = fileio.all_lines(os.path.join(directory, 'system/build.prop')) lines.append('ro.chenxiaolong.patched=%s\n' % file_info.partconfig.id) fileio.write_lines(os.path.join(directory, 'system/build.prop'), lines)
def system_prop(directory, bootimg = None, device_check = True, partition_config = None): lines = fileio.all_lines('system/build.prop', directory = directory) lines.append('ro.chenxiaolong.patched=%s\n' % partition_config.id) fileio.write_lines('system/build.prop', lines, directory = directory)
def modify_init_rc(directory): lines = fileio.all_lines('init.rc', directory = directory) f = fileio.open_file('init.rc', fileio.WRITE, directory = directory) for line in lines: if 'export ANDROID_ROOT' in line: fileio.write(f, line) fileio.write(f, fileio.whitespace(line) + "export ANDROID_CACHE /cache\n") elif re.search(r"mkdir /system(\s|$)", line): fileio.write(f, line) fileio.write(f, re.sub("/system", "/raw-system", line)) elif re.search(r"mkdir /data(\s|$)", line): fileio.write(f, line) fileio.write(f, re.sub("/data", "/raw-data", line)) elif re.search(r"mkdir /cache(\s|$)", line): fileio.write(f, line) fileio.write(f, re.sub("/cache", "/raw-cache", line)) elif 'yaffs2' in line: fileio.write(f, re.sub(r"^", "#", line)) elif re.search(r"^.*setprop.*selinux.reload_policy.*$", line): fileio.write(f, re.sub(r"^", "#", line)) else: fileio.write(f, line) f.close()
def modify_init_target_rc(directory): lines = fileio.all_lines('init.target.rc', directory = directory) previous_line = "" f = fileio.open_file('init.target.rc', fileio.WRITE, directory = directory) for line in lines: if re.search(r"^\s+wait\s+/dev/.*/cache.*$", line): fileio.write(f, re.sub(r"^", "#", line)) elif re.search(r"^\s+check_fs\s+/dev/.*/cache.*$", line): fileio.write(f, re.sub(r"^", "#", line)) elif re.search(r"^\s+mount\s+ext4\s+/dev/.*/cache.*$", line): fileio.write(f, re.sub(r"^", "#", line)) elif re.search(r"^\s+mount_all\s+fstab.qcom.*$", line) and \ re.search(r"^on\s+fs_selinux.*$", previous_line): fileio.write(f, line) fileio.write(f, fileio.whitespace(line) + "exec /sbin/busybox-static sh /init.multiboot.mounting.sh\n") elif re.search(r"^.*setprop.*selinux.reload_policy.*$", line): fileio.write(f, re.sub(r"^", "#", line)) else: fileio.write(f, line) previous_line = line f.close()
def auto_patch(directory, bootimg=None, device_check=True, partition_config=None): updater_script = 'META-INF/com/google/android/updater-script' lines = fileio.all_lines(updater_script, directory=directory) attempt_auto_patch(lines, bootimg=bootimg, device_check=device_check, partition_config=partition_config) fileio.write_lines(updater_script, lines, directory=directory)
def modify_fstab(directory, partition_config): # Ignore all contents for TouchWiz lines = fileio.all_lines('fstab.qcom', directory = directory) system = "/dev/block/platform/msm_sdcc.1/by-name/system /raw-system ext4 ro,errors=panic wait\n" cache = "/dev/block/platform/msm_sdcc.1/by-name/cache /raw-cache ext4 nosuid,nodev,barrier=1 wait,check\n" data = "/dev/block/platform/msm_sdcc.1/by-name/userdata /raw-data ext4 nosuid,nodev,noatime,noauto_da_alloc,discard,journal_async_commit,errors=panic wait,check,encryptable=footer\n" system_fourth = 'ro,barrier=1,errors=panic' system_fifth = 'wait' cache_fourth = 'nosuid,nodev,barrier=1' cache_fifth = 'wait,check' # Target cache on /system partition target_cache_on_system = "/dev/block/platform/msm_sdcc.1/by-name/system /raw-system ext4 %s %s\n" % (cache_fourth, cache_fifth) # Target system on /cache partition target_system_on_cache = "/dev/block/platform/msm_sdcc.1/by-name/cache /raw-cache ext4 %s %s\n" % (system_fourth, system_fifth) # Target system on /data partition target_system_on_data = "/dev/block/platform/msm_sdcc.1/by-name/userdata /raw-data ext4 %s %s\n" % (system_fourth, system_fifth) has_cache_line = False f = fileio.open_file('fstab.qcom', fileio.WRITE, directory = directory) for line in lines: if re.search(r"^/dev[a-zA-Z0-9/\._-]+\s+/system\s+.*$", line): if '/raw-system' in partition_config.target_cache: fileio.write(f, target_cache_on_system) else: fileio.write(f, system) elif re.search(r"^/dev[^\s]+\s+/cache\s+.*$", line): if '/raw-cache' in partition_config.target_system: fileio.write(f, target_system_on_cache) else: fileio.write(f, cache) has_cache_line = True elif re.search(r"^/dev[^\s]+\s+/data\s+.*$", line): if '/raw-data' in partition_config.target_system: fileio.write(f, target_system_on_data) else: fileio.write(f, data) else: fileio.write(f, line) if not has_cache_line: if '/raw-cache' in partition_config.target_system: fileio.write(f, target_system_on_cache) else: fileio.write(f, cache) f.close()
def patch(self, directory, file_info, bootimages=None): lines = fileio.all_lines(os.path.join(directory, 'system/build.prop')) i = 0 while i < len(lines): if 'dalvik.vm.dexopt-data-only' in lines[i]: del lines[i] else: i += 1 fileio.write_lines(os.path.join(directory, 'system/build.prop'), lines)
def modify_init_target_rc(directory): lines = fileio.all_lines('init.target.rc', directory = directory) f = fileio.open_file('init.target.rc', fileio.WRITE, directory = directory) for line in lines: if 'init.dualboot.mounting.sh' in line: fileio.write(f, re.sub('init.dualboot.mounting.sh', 'init.multiboot.mounting.sh', line)) else: fileio.write(f, line) f.close()
def modify_MSM8960_lpm_rc(directory): lines = fileio.all_lines('MSM8960_lpm.rc', directory = directory) f = fileio.open_file('MSM8960_lpm.rc', fileio.WRITE, directory = directory) for line in lines: if re.search(r"^\s+mount.*/cache.*$", line): fileio.write(f, re.sub(r"^", "#", line)) else: fileio.write(f, line) f.close()
def modify_init_qcom_rc(directory): lines = fileio.all_lines('init.qcom.rc', directory = directory) f = fileio.open_file('init.qcom.rc', fileio.WRITE, directory = directory) for line in lines: # Change /data/media to /raw-data/media if re.search(r"/data/media(\s|$)", line): fileio.write(f, re.sub('/data/media', '/raw-data/media', line)) else: fileio.write(f, line) f.close()
def patch(self, directory, file_info, bootimages=None): lines = fileio.all_lines( os.path.join(directory, 'system/etc/init.qcom.audio.sh')) i = 0 while i < len(lines): if 'snd_soc_msm_2x_Fusion3_auxpcm' in lines[i]: del lines[i] else: i += 1 fileio.write_lines( os.path.join(directory, 'system/etc/init.qcom.audio.sh'), lines)
def patch(self, directory, file_info, bootimages=None): lines = fileio.all_lines(os.path.join( directory, 'system/etc/init.qcom.audio.sh')) i = 0 while i < len(lines): if 'snd_soc_msm_2x_Fusion3_auxpcm' in lines[i]: del lines[i] else: i += 1 fileio.write_lines(os.path.join( directory, 'system/etc/init.qcom.audio.sh'), lines)
def patch(self, directory, file_info, bootimages=None): updater_script = 'META-INF/com/google/android/updater-script' lines = fileio.all_lines(os.path.join(directory, updater_script)) i = 0 while i < len(lines): if re.search('run_program.*/tmp/wipedata.sh', lines[i]): del lines[i] StandardPatcher.insert_format_data(i, lines) break i += 1 fileio.write_lines(os.path.join(directory, updater_script), lines)
def qcom_audio_fix(directory, bootimg=None, device_check=True, partition_config=None): lines = fileio.all_lines('system/etc/init.qcom.audio.sh', directory=directory) i = 0 while i < len(lines): if 'snd_soc_msm_2x_Fusion3_auxpcm' in lines[i]: del lines[i] else: i += 1 fileio.write_lines('system/etc/init.qcom.audio.sh', lines, directory=directory)
def patch(self, directory, file_info, bootimages=None): updater_script = 'META-INF/com/google/android/updater-script' lines = fileio.all_lines(os.path.join(directory, updater_script)) i = 0 while i < len(lines): if re.search('getprop.*/system/build.prop', lines[i]): i += StandardPatcher.insert_mount_system(i, lines) i += StandardPatcher.insert_mount_cache(i, lines) i += StandardPatcher.insert_mount_data(i, lines) lines[i] = re.sub('/system', file_info.partconfig.target_system, lines[i]) i += 1 fileio.write_lines(os.path.join(directory, updater_script), lines)
def dont_wipe_data(directory, bootimg = None, device_check = True, partition_config = None): updater_script = 'META-INF/com/google/android/updater-script' lines = fileio.all_lines(updater_script, directory = directory) i = 0 while i < len(lines): if re.search('run_program.*/tmp/wipedata.sh', lines[i]): del lines[i] autopatcher.insert_format_data(i, lines) break i += 1 fileio.write_lines(updater_script, lines, directory = directory)
def process_def(def_file, cpiofile, partition_config): debug.debug("Loading ramdisk definition %s" % def_file) for line in fileio.all_lines(def_file): if line.startswith("pyscript"): path = os.path.join(OS.ramdiskdir, re.search(r"^pyscript\s*=\s*\"?(.*)\"?\s*$", line).group(1)) debug.debug("Loading pyscript " + path) plugin = imp.load_source(os.path.basename(path)[:-3], os.path.join(OS.ramdiskdir, path)) plugin.patch_ramdisk(cpiofile, partition_config) return True
def fix_aroma(directory, bootimg = None, device_check = True, partition_config = None): updater_script = 'META-INF/com/google/android/updater-script' lines = fileio.all_lines(updater_script, directory = directory) i = 0 while i < len(lines): if re.search('getprop.*/system/build.prop', lines[i]): i += autopatcher.insert_mount_system(i, lines) i += autopatcher.insert_mount_cache(i, lines) i += autopatcher.insert_mount_data(i, lines) lines[i] = re.sub('/system', partition_config.target_system, lines[i]) i += 1 fileio.write_lines(updater_script, lines, directory = directory)
def process_def(def_file, cpiofile, partition_config): try: debug.debug("Loading ramdisk definition %s" % def_file) for line in fileio.all_lines(def_file): if line.startswith("pyscript"): path = re.search(r"^pyscript\s*=\s*\"?(.*)\"?\s*$", line).group(1) debug.debug("Loading pyscript " + path) plugin = plugins.ramdisks[path] common.init(cpiofile, partition_config) plugin.patch_ramdisk(cpiofile, partition_config) except Exception as e: raise RamdiskPatchError(str(e))
def modify_fstab(directory, partition_config): lines = fileio.all_lines('fstab.qcom', directory = directory) system_fourth = 'ro,barrier=1,errors=panic' system_fifth = 'wait' cache_fourth = 'noatime,nosuid,nodev,journal_async_commit' cache_fifth = 'wait,check' f = fileio.open_file('fstab.qcom', fileio.WRITE, directory = directory) for line in lines: if re.search(r"^/dev[a-zA-Z0-9/\._-]+\s+/raw-system\s+.*$", line): if '/raw-system' in partition_config.target_cache: r = re.search(r"^([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)", line) line = "%s %s %s %s %s\n" % (r.groups()[0], r.groups()[1], r.groups()[2], cache_fourth, cache_fifth) fileio.write(f, line) elif re.search(r"^/dev[^\s]+\s+/raw-cache\s+.*$", line): if '/raw-cache' in partition_config.target_system: # /raw-cache needs to always be mounted rw so OpenDelta can write to # /cache/recovery args = system_fourth if 'ro' in args: args = re.sub('ro', 'rw', args) else: args = 'rw,' + args r = re.search(r"^([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)", line) line = "%s %s %s %s %s\n" % (r.groups()[0], r.groups()[1], r.groups()[2], args, system_fifth) fileio.write(f, line) elif re.search(r"^/dev[^\s]+\s+/raw-data\s+.*$", line): if '/raw-data' in partition_config.target_system: r = re.search(r"^([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)", line) line = "%s %s %s %s %s\n" % (r.groups()[0], r.groups()[1], r.groups()[2], system_fourth, system_fifth) fileio.write(f, line) else: fileio.write(f, line) f.close()
def modify_init_qcom_rc(directory): lines = fileio.all_lines('init.qcom.rc', directory = directory) f = fileio.open_file('init.qcom.rc', fileio.WRITE, directory = directory) for line in lines: if 'export EMULATED_STORAGE_TARGET' in line: fileio.write(f, line) fileio.write(f, fileio.whitespace(line) + "export EXTERNAL_SD /storage/sdcard1\n") # Change /data/media to /raw-data/media elif re.search(r"/data/media(\s|$)", line): fileio.write(f, re.sub('/data/media', '/raw-data/media', line)) else: fileio.write(f, line) f.close()
def modify_fstab(directory, partition_config): lines = fileio.all_lines('fstab.hammerhead', directory = directory) system_fourth = 'ro,barrier=1' system_fifth = 'wait' cache_fourth = 'noatime,nosuid,nodev,barrier=1,data=ordered,noauto_da_alloc,journal_async_commit,errors=panic' cache_fifth = 'wait,check' f = fileio.open_file('fstab.hammerhead', fileio.WRITE, directory = directory) for line in lines: if re.search(r"^/dev[a-zA-Z0-9/\._-]+\s+/system\s+.*$", line): temp = re.sub("\s/system\s", " /raw-system ", line) if '/raw-system' in partition_config.target_cache: r = re.search(r"^([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)", temp) temp = "%s %s %s %s %s\n" % (r.groups()[0], r.groups()[1], r.groups()[2], cache_fourth, cache_fifth) fileio.write(f, temp) elif re.search(r"^/dev[^\s]+\s+/cache\s+.*$", line): temp = re.sub("\s/cache\s", " /raw-cache ", line) if '/raw-cache' in partition_config.target_system: r = re.search(r"^([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)", temp) temp = "%s %s %s %s %s\n" % (r.groups()[0], r.groups()[1], r.groups()[2], system_fourth, system_fifth) fileio.write(f, temp) elif re.search(r"^/dev[^\s]+\s+/data\s+.*$", line): temp = re.sub("\s/data\s", " /raw-data ", line) if '/raw-data' in partition_config.target_system: r = re.search(r"^([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)\s+([^\ ]+)", temp) temp = "%s %s %s %s %s\n" % (r.groups()[0], r.groups()[1], r.groups()[2], system_fourth, system_fifth) fileio.write(f, temp) else: fileio.write(f, line) f.close()
def patch(self, directory, file_info, bootimages=None): lines = fileio.all_lines(os.path.join(directory, UPDATER_SCRIPT)) StandardPatcher.insert_dual_boot_sh(lines) StandardPatcher.replace_mount_lines(file_info.device, lines) StandardPatcher.replace_unmount_lines(file_info.device, lines) StandardPatcher.replace_format_lines(file_info.device, lines) if bootimages: for img in bootimages: StandardPatcher.insert_write_kernel(img, lines) # Too many ROMs don't unmount partitions after installation StandardPatcher.insert_unmount_everything(len(lines), lines) # Remove device checks if not file_info.patchinfo.device_check: StandardPatcher.remove_device_checks(lines) fileio.write_lines(os.path.join(directory, UPDATER_SCRIPT), lines)
def patch(self, directory, file_info, bootimages=None): aroma_config = 'META-INF/com/google/android/aroma-config' lines = fileio.all_lines(os.path.join(directory, aroma_config)) i = 0 while i < len(lines): if re.search('/system/build.prop', lines[i]): # Remove 'raw-' since aroma mounts the partitions directly target_dir = re.sub("raw-", "", file_info.partconfig.target_system) lines[i] = re.sub('/system', target_dir, lines[i]) elif re.search(r"/sbin/mount.*/system", lines[i]): i += autopatcher.insert_line( i + 1, re.sub('/system', '/cache', lines[i]), lines) i += autopatcher.insert_line( i + 1, re.sub('/system', '/data', lines[i]), lines) i += 1 fileio.write_lines(os.path.join(directory, aroma_config), lines)
def patch(self, directory, file_info, bootimages=None): updater_script = 'META-INF/com/google/android/updater-script' lines = fileio.all_lines(os.path.join(directory, updater_script)) StandardPatcher.insert_dual_boot_sh(lines) StandardPatcher.replace_mount_lines(file_info.device, lines) StandardPatcher.replace_unmount_lines(file_info.device, lines) StandardPatcher.replace_format_lines(file_info.device, lines) StandardPatcher.insert_unmount_everything(len(lines), lines) # Insert set kernel line set_kernel_line = 'run_program("/tmp/dualboot.sh", "set-multi-kernel");\n' i = len(lines) - 1 while i > 0: if 'Umounting Partitions' in lines[i]: lines.insert(i + 1, set_kernel_line) break i -= 1 fileio.write_lines(os.path.join(directory, updater_script), lines)
def insert_partition_info(directory, f, config, target_path_only=False): magic = '# PATCHER REPLACE ME - DO NOT REMOVE\n' lines = fileio.all_lines(f, directory=directory) i = 0 while i < len(lines): if magic in lines[i]: del lines[i] if not target_path_only: i += insert_line(i, 'KERNEL_NAME=\"%s\"' % config.kernel, lines) i += insert_line(i, 'DEV_SYSTEM=\"%s\"' % config.dev_system, lines) i += insert_line(i, 'DEV_CACHE=\"%s\"' % config.dev_cache, lines) i += insert_line(i, 'DEV_DATA=\"%s\"' % config.dev_data, lines) i += insert_line(i, 'TARGET_SYSTEM_PARTITION=\"%s\"' % config.target_system_partition, lines) i += insert_line(i, 'TARGET_CACHE_PARTITION=\"%s\"' % config.target_cache_partition, lines) i += insert_line(i, 'TARGET_DATA_PARTITION=\"%s\"' % config.target_data_partition, lines) i += insert_line(i, 'TARGET_SYSTEM=\"%s\"' % config.target_system, lines) i += insert_line(i, 'TARGET_CACHE=\"%s\"' % config.target_cache, lines) i += insert_line(i, 'TARGET_DATA=\"%s\"' % config.target_data, lines) break i += 1 fileio.write_lines(f, lines, directory=directory)
def fix_aroma(directory, bootimg = None, device_check = True, partition_config = None): aroma_config = 'META-INF/com/google/android/aroma-config' lines = fileio.all_lines(aroma_config, directory = directory) i = 0 while i < len(lines): if re.search('/system/build.prop', lines[i]): # Remove 'raw-' since aroma mounts the partitions directly target_dir = re.sub("raw-", "", partition_config.target_system) lines[i] = re.sub('/system', target_dir, lines[i]) elif re.search(r"/sbin/mount.*/system", lines[i]): i += autopatcher.insert_line(i + 1, re.sub('/system', '/cache', lines[i]), lines) i += autopatcher.insert_line(i + 1, re.sub('/system', '/data', lines[i]), lines) elif '~welcome.title' in lines[i]: i += autopatcher.insert_line(i + 1, '"***IMPORTANT***: You MUST choose the stock kernel for dual booting to work. If you want to use a custom kernel, you can patch and flash it afterwards.\\n\\n" +', lines) i += 1 fileio.write_lines(aroma_config, lines, directory = directory)
def modify_init_hammerhead_rc(directory): lines = fileio.all_lines('init.hammerhead.rc', directory = directory) previous_line = "" f = fileio.open_file('init.hammerhead.rc', fileio.WRITE, directory = directory) for line in lines: if re.search(r"^\s+mount_all\s+./fstab.hammerhead.*$", line) and \ re.search(r"^on\s+fs\s*$", previous_line): fileio.write(f, line) fileio.write(f, fileio.whitespace(line) + "exec /sbin/busybox-static sh /init.multiboot.mounting.sh\n") # Change /data/media to /raw-data/media elif re.search(r"/data/media(\s|$)", line): fileio.write(f, re.sub('/data/media', '/raw-data/media', line)) else: fileio.write(f, line) previous_line = line f.close()
def patch(self, directory, file_info, bootimages=None): updater_script = 'META-INF/com/google/android/updater-script' lines = fileio.all_lines(os.path.join(directory, updater_script)) i = 0 while i < len(lines): if re.search('/tmp/mount.*/system', lines[i]): del lines[i] i += StandardPatcher.insert_mount_system(i, lines) elif re.search('/tmp/mount.*/cache', lines[i]): del lines[i] i += StandardPatcher.insert_mount_cache(i, lines) elif re.search('/tmp/mount.*/data', lines[i]): del lines[i] i += StandardPatcher.insert_mount_data(i, lines) else: i += 1 fileio.write_lines(os.path.join(directory, updater_script), lines)
def modify_init_rc(directory): lines = fileio.all_lines('init.rc', directory = directory) previous_line = "" f = fileio.open_file('init.rc', fileio.WRITE, directory = directory) for line in lines: if 'export ANDROID_ROOT' in line: fileio.write(f, line) fileio.write(f, fileio.whitespace(line) + "export ANDROID_CACHE /cache\n") elif re.search(r"mkdir /system(\s|$)", line): fileio.write(f, line) fileio.write(f, re.sub("/system", "/raw-system", line)) elif re.search(r"mkdir /data(\s|$)", line): fileio.write(f, line) fileio.write(f, re.sub("/data", "/raw-data", line)) elif re.search(r"mkdir /cache(\s|$)", line): fileio.write(f, line) fileio.write(f, re.sub("/cache", "/raw-cache", line)) elif 'yaffs2' in line: fileio.write(f, re.sub(r"^", "#", line)) elif version == 'kk44' \ and re.search(r"mount.*/system", line) \ and re.search(r"on\s+charger", previous_line): fileio.write(f, " mount_all fstab.jgedlte\n") fileio.write(f, " exec /sbin/busybox-static sh /init.multiboot.mounting.sh\n") else: fileio.write(f, line) previous_line = line f.close()
def modify_init_target_rc(directory): lines = fileio.all_lines('init.target.rc', directory = directory) previous_line = "" f = fileio.open_file('init.target.rc', fileio.WRITE, directory = directory) for line in lines: if re.search(r"^\s+wait\s+/dev/.*/cache.*$", line): fileio.write(f, re.sub(r"^", "#", line)) elif re.search(r"^\s+check_fs\s+/dev/.*/cache.*$", line): fileio.write(f, re.sub(r"^", "#", line)) elif re.search(r"^\s+mount\s+ext4\s+/dev/.*/cache.*$", line): fileio.write(f, re.sub(r"^", "#", line)) elif re.search(r"^\s+mount_all\s+fstab.qcom.*$", line) and \ re.search(r"^on\s+fs\s*$", previous_line): fileio.write(f, line) fileio.write(f, fileio.whitespace(line) + "exec /sbin/busybox-static sh /init.multiboot.mounting.sh\n") elif re.search(r"^\s+setprop\s+ro.crypto.fuse_sdcard\s+true", line): fileio.write(f, line) if move_apnhlos_mount: fileio.write(f, fileio.whitespace(line) + "wait /dev/block/platform/msm_sdcc.1/by-name/apnhlos\n") fileio.write(f, fileio.whitespace(line) + "mount vfat /dev/block/platform/msm_sdcc.1/by-name/apnhlos /firmware ro shortname=lower,uid=1000,gid=1000,dmask=227,fmask=337\n") if move_mdm_mount: fileio.write(f, fileio.whitespace(line) + "wait /dev/block/platform/msm_sdcc.1/by-name/mdm\n") fileio.write(f, fileio.whitespace(line) + "mount vfat /dev/block/platform/msm_sdcc.1/by-name/mdm /firmware-mdm ro shortname=lower,uid=1000,gid=1000,dmask=227,fmask=337\n") else: fileio.write(f, line) previous_line = line f.close()
def files_in_patch(patch_file): global error_msg files = [] lines = fileio.all_lines(os.path.join(OS.patchdir, patch_file)) counter = 0 while counter < len(lines): if re.search(r"^---", lines[counter]) \ and re.search(r"^\+\+\+", lines[counter + 1]) \ and re.search(r"^@", lines[counter + 2]): temp = re.search(r"^--- .*?/(.*)$", lines[counter]) debug.debug("Found in patch %s: %s" % (patch_file, temp.group(1))) files.append(temp.group(1)) counter += 3 else: counter += 1 if not files: error_msg = "Failed to read list of files in patch" return files
def patch_zip(self): if not OS.is_android(): OS.ui.info('--- Please wait. This may take a while ---') tempdir = tempfile.mkdtemp() self.tempdirs.append(tempdir) OS.ui.set_task(self.tasks['EXTRACTING_ZIP']) OS.ui.details('Loading zip file ...') z = zipfile.ZipFile(self.file_info.filename, 'r') try: z.extract(UPDATER_SCRIPT, path=tempdir) except: OS.ui.failed('Failed to extract updater-script') return None z.close() OS.ui.clear() OS.ui.set_task(self.tasks['PATCHING_FILES']) lines = fileio.all_lines(os.path.join(tempdir, UPDATER_SCRIPT)) i = 0 i += autopatcher.insert_line( i, EXTRACT % (PERM_TOOL, '/tmp/' + PERM_TOOL), lines) i += autopatcher.insert_line( i, EXTRACT % ('dualboot.sh', '/tmp/dualboot.sh'), lines) i += autopatcher.insert_line(i, EXTRACT % ('setfacl', '/tmp/setfacl'), lines) i += autopatcher.insert_line(i, EXTRACT % ('setfattr', '/tmp/setfattr'), lines) i += autopatcher.insert_line(i, EXTRACT % ('getfacl', '/tmp/getfacl'), lines) i += autopatcher.insert_line(i, EXTRACT % ('getfattr', '/tmp/getfattr'), lines) i += autopatcher.insert_line(i, MAKE_EXECUTABLE % ('/tmp/' + PERM_TOOL), lines) i += autopatcher.insert_line(i, MAKE_EXECUTABLE % '/tmp/dualboot.sh', lines) i += autopatcher.insert_line(i, MAKE_EXECUTABLE % '/tmp/setfacl', lines) i += autopatcher.insert_line(i, MAKE_EXECUTABLE % '/tmp/setfattr', lines) i += autopatcher.insert_line(i, MAKE_EXECUTABLE % '/tmp/getfacl', lines) i += autopatcher.insert_line(i, MAKE_EXECUTABLE % '/tmp/getfattr', lines) i += autopatcher.insert_line(i, MOUNT % '/system', lines) i += autopatcher.insert_line(i, PERMS_BACKUP % '/system', lines) i += autopatcher.insert_line(i, UNMOUNT % '/system', lines) i += autopatcher.insert_line(i, MOUNT % '/cache', lines) i += autopatcher.insert_line(i, PERMS_BACKUP % '/cache', lines) i += autopatcher.insert_line(i, UNMOUNT % '/cache', lines) def insert_format_system(index, lines, mount): i = 0 if mount: i += autopatcher.insert_line(index + i, MOUNT % '/system', lines) i += autopatcher.insert_line(index + i, FORMAT_SYSTEM, lines) if mount: i += autopatcher.insert_line(index + i, UNMOUNT % '/system', lines) return i def insert_format_cache(index, lines, mount): i = 0 if mount: i += autopatcher.insert_line(index + i, MOUNT % '/cache', lines) i += autopatcher.insert_line(index + i, FORMAT_CACHE, lines) if mount: i += autopatcher.insert_line(index + i, UNMOUNT % '/cache', lines) return i psystem = config.get_partition(self.file_info.device, 'system') pcache = config.get_partition(self.file_info.device, 'cache') replaced_format_system = False replaced_format_cache = False i = 0 while i < len(lines): if re.search(r"^\s*format\s*\(.*$", lines[i]): if 'system' in lines[i] or (psystem and psystem in lines[i]): replaced_format_system = True del lines[i] i += insert_format_system(i, lines, True) elif 'cache' in lines[i] or (pcache and pcache in lines[i]): replaced_format_cache = True del lines[i] i += insert_format_cache(i, lines, True) else: i += 1 elif re.search(r'delete_recursive\s*\([^\)]*"/system"', lines[i]): replaced_format_system = True del lines[i] i += insert_format_system(i, lines, False) elif re.search(r'delete_recursive\s*\([^\)]*"/cache"', lines[i]): replaced_format_cache = True del lines[i] i += insert_format_cache(i, lines, False) else: i += 1 if not replaced_format_system and not replaced_format_cache: OS.ui.failed('The patcher could not find any /system or /cache' ' formatting lines in the updater-script file.\n\n' 'If the file is a ROM, then something failed. If the' ' file is not a ROM (eg. kernel or mod), it doesn\'t' ' need to be patched.') return None i += autopatcher.insert_line(i, MOUNT % '/system', lines) i += autopatcher.insert_line(i, PERMS_RESTORE % '/system', lines) i += autopatcher.insert_line(i, UNMOUNT % '/system', lines) i += autopatcher.insert_line(i, MOUNT % '/cache', lines) i += autopatcher.insert_line(i, PERMS_RESTORE % '/cache', lines) i += autopatcher.insert_line(i, UNMOUNT % '/cache', lines) i += autopatcher.insert_line( i, 'run_program("/tmp/dualboot.sh", "set-multi-kernel");', lines) fileio.write_lines(os.path.join(tempdir, UPDATER_SCRIPT), lines) shutil.copy(os.path.join(OS.patchdir, 'dualboot.sh'), tempdir) autopatcher.insert_partition_info(os.path.join(tempdir, 'dualboot.sh'), self.file_info.partconfig) OS.ui.set_task(self.tasks['COMPRESSING_ZIP_FILE']) OS.ui.details('Opening input and output zip files ...') # We can't avoid recompression, unfortunately # Only show progress for this stage on Android, since it's, by far, the # most time consuming part of the process new_zip_file = tempfile.mkstemp() z_input = zipfile.ZipFile(self.file_info.filename, 'r') z_output = zipfile.ZipFile(new_zip_file[1], 'w', zipfile.ZIP_DEFLATED) # Five extra files progress_total = len(z_input.infolist()) + 6 OS.ui.max_progress(progress_total) for i in z_input.infolist(): if i.filename == UPDATER_SCRIPT: continue OS.ui.details('Adding file to zip: %s' % i.filename) OS.ui.progress() in_info = z_input.getinfo(i.filename) z_output.writestr(in_info, z_input.read(in_info)) OS.ui.clear() z_input.close() OS.ui.details('Adding file to zip: ' + UPDATER_SCRIPT) OS.ui.progress() z_output.write(os.path.join(tempdir, UPDATER_SCRIPT), arcname=UPDATER_SCRIPT) OS.ui.details('Adding file to zip: ' + 'dualboot.sh') OS.ui.progress() z_output.write(os.path.join(tempdir, 'dualboot.sh'), arcname='dualboot.sh') for f in [PERM_TOOL, 'setfacl', 'setfattr', 'getfacl', 'getfattr']: OS.ui.details('Adding file to zip: ' + f) OS.ui.progress() z_output.write(os.path.join(OS.patchdir, f), arcname=f) OS.ui.clear() z_output.close() os.close(new_zip_file[0]) return new_zip_file[1]