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):
        # 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)
示例#6
0
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()
示例#7
0
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 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 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)
示例#10
0
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()
示例#11
0
    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)
示例#12
0
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()
示例#13
0
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()
示例#14
0
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()
示例#15
0
    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)
示例#16
0
    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)
示例#17
0
    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)
示例#18
0
    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)
示例#19
0
    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)
示例#20
0
    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)
示例#21
0
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)
示例#22
0
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
示例#23
0
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)
示例#24
0
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))
示例#25
0
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()
示例#26
0
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()
示例#27
0
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))
示例#28
0
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()
示例#29
0
    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)
示例#30
0
    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)
示例#31
0
    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)
示例#32
0
    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)
示例#33
0
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)
示例#34
0
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)
示例#35
0
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)
示例#37
0
    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 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()
示例#39
0
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()
示例#40
0
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
示例#41
0
    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]