#!/bin/sh # # Copyright (c) 2014 Canonical # # Author: Oliver Grawert # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA # set -e TARPATH=$1 SYSIMG=$2 check_prereq() { if [ ! $(which make_ext4fs) ] || [ ! -x $(which simg2img) ] || \ [ ! -x $(which adb) ]; then echo "please install the android-tools-fsutils and android-tools-adb packages" && exit 1 fi } do_shell() { adb shell "$@" } convert_android_img() { if file $SYSIMG | grep -v ": Linux rev 1.0 ext4" >/dev/null; then simg2img $SYSIMG $WORKDIR/system.img.raw mkdir $TMPMOUNT mount -t ext4 -o loop $WORKDIR/system.img.raw $TMPMOUNT make_ext4fs -l 160M $WORKDIR/system.img $TMPMOUNT SYSIMAGE=$WORKDIR/system.img else SYSIMAGE=$SYSIMG fi } check_mounts(){ MOUNTS=$(do_shell "cat /proc/mounts") if ! echo $MOUNTS | grep -qs '/cache'; then do_shell "mount /cache" fi if ! echo $MOUNTS | grep -qs '/data'; then do_shell "mount /data" fi } prepare_halium_system() { do_shell "rm -f /data/rootfs.img" do_shell "dd if=/dev/zero of=/data/rootfs.img seek=500K bs=4096 count=0" do_shell "mkfs.ext2 -F /data/rootfs.img" do_shell "mkdir -p /cache/system" do_shell "mount -o loop /data/rootfs.img /cache/system/" } cleanup() { echo echo "cleaning up" mount | grep -q $TMPMOUNT 2>/dev/null && umount $TMPMOUNT cleanup_device rm -rf $WORKDIR echo } cleanup_device() { [ -e $WORKDIR/device-clean ] && return do_shell "umount /cache/system/ && rm -rf /cache/system" do_shell "rm -f /recovery/$TARBALL" [ -e $WORKDIR ] && touch $WORKDIR/device-clean 2>/dev/null || true } trap cleanup 0 1 2 3 9 15 usage() { echo "usage: $(basename $0) [options] options: -h|--help this message -c|--custom path to customization tarball (needs to be tar.xz) -k|--keep-userdata do not wipe user data on device -w|--wipe-file absolute path of a file inside the image to wipe (empty)" exit 1 } SUDOARGS="$@" while [ $# -gt 0 ]; do case "$1" in -h|--help) usage ;; -c|--custom) [ -n "$2" ] && CUST_TARPATH=$2 shift || usage ;; -k|--keep-userdata) KEEP=1 ;; -w|--wipe-file) [ -n "$2" ] && WIPE_PATH=$2 shift || usage ;; esac shift done if [ -z "$TARPATH" ]; then echo "need valid rootfs tarball path" usage fi TARBALL=$(basename $TARPATH) if [ -z "$TARBALL" ]; then echo "need valid rootfs tarball path" usage fi TARTYPE=$(file --mime-type $TARPATH|sed 's/^.* //') case ${TARTYPE#application\/} in gzip|x-gzip) ;; *) echo "Need valid rootfs tarball gzip type" usage ;; esac if [ -z "$SYSIMG" ] || \ [ "$(file --mime-type $SYSIMG|sed 's/^.* //')" != "application/octet-stream" ]; then echo "need valid system.img path and type application/octet-stream" usage fi if [ ! -z "$CUST_TARPATH" ] && \ [ "$(file --mime-type $CUST_TARPATH|sed 's/^.* //')" != "application/x-xz" ]; then echo "Custom tarball needs to be valid path and type .tar.xz" usage fi [ $(id -u) -ne 0 ] && exec sudo $0 $SUDOARGS check_prereq if ! adb devices | grep -q recovery; then echo "please make sure the device is attched via USB in recovery mode" exit 1 fi check_mounts WORKDIR=$(mktemp -d /tmp/halium-install.XXXXX) TMPMOUNT="$WORKDIR/tmpmount" echo "transfering rootfs tarball ... " adb push $TARPATH /recovery/ echo "[done]" if [ ! -z "$CUST_TARPATH" ]; then CUST_TARBALL=$(basename $CUST_TARPATH) echo -n "transferring custom tarball" adb push $CUST_TARPATH /recovery/ echo "[done]" fi echo -n "preparing system-image on device ... " prepare_halium_system echo "[done]" echo -n "unpacking rootfs tarball to system-image ... " do_shell "cd /cache/system && zcat /recovery/$TARBALL | tar xf -" do_shell "[ -e /cache/system/SWAP.swap ] && mv /cache/system/SWAP.swap /data/SWAP.img" echo "[done]" echo -n "adding android system image to installation ... " convert_android_img ANDROID_DIR="/data" adb push $SYSIMAGE $ANDROID_DIR/system.img echo "[done]" echo -n "cleaning up on device ... " cleanup_device echo "[done]" echo "All done! Now you can use 'adb shell' to get a shell to the recovery, or" echo "simply reboot your device to start Halium."