#!/bin/bash
#
# Copyright (C) 2007 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

PROGNAME=`basename "$0"`

INSTALL_SCRIPT_NAME=META-INF/com/android/update-script

function cleantmp
{
    if [ ! -z "$TMPDIR" ]
    then
        rm -rf "$TMPDIR"
        TMPDIR=
    fi
}

function println
{
    if [ $# -gt 0 ]
    then
        echo "$PROGNAME: $@"
    fi
}

function fail
{
    println "$@"
    cleantmp
    exit 1
}

function usage
{
    println "$@"
    echo "Usage: $PROGNAME <command> [command-options] <ota-file>"
    echo "       Where <command> is one of:"
    echo "           --dump"
    echo "               Dump a description of the ota file"
    echo "           --dump-script"
    echo "               Dumps the install script to standard out"
    echo "           --append-script <file> -o|--output <outfile>"
    echo "               Append the contents of <file> to the install script"
    echo "           --replace-script <file> -o|--output <outfile>"
    echo "               Replace the install script with the contents of <file>"
    fail
}

if [ $# -lt 2 ]
then
    usage
fi
CMD="$1"
shift
if [ "$CMD" = --dump ]
then
    CMD_DUMP=1
    UNPACK_FILE=1
elif [ "$CMD" = --dump-script ]
then
    CMD_DUMP_SCRIPT=1
elif [ "$CMD" = --append-script ]
then
    CMD_APPEND_SCRIPT=1
    SCRIPT_FILE=$1
    shift
    NEEDS_SCRIPT_FILE=1
    NEEDS_OUTPUT=1
elif [ "$CMD" = --replace-script ]
then
    CMD_REPLACE_SCRIPT=1
    SCRIPT_FILE=$1
    shift
    NEEDS_SCRIPT_FILE=1
    NEEDS_OUTPUT=1
else
    usage "Unknown command $CMD"
fi

if [ ! -z "$NEED_SCRIPT_FILE" ]
then
    if [ -z "$SCRIPT_FILE" -o ! -f "$SCRIPT_FILE" ]
    then
        usage "$CMD requires a valid script file"
    fi
fi

if [ ! -z "$NEEDS_OUTPUT" ]
then
    if [ "x$1" != "x-o" -a "x$1" != "x--output" ]
    then
        usage "$CMD requires \"-o <file>\" or \"--output <file>\""
    fi
    shift

    OUTFILE="$1"
    shift
    if [ -z "$OUTFILE" ]
    then
        usage "$CMD requires \"-o <file>\" or \"--output <file>\""
    fi
    if [ -d "$OUTFILE" ]
    then
        fail "Output file \"$OUTFILE\" is a directory"
    fi
fi

FILE="$1"
if [ ! -f "$FILE" ]
then
    fail "$FILE doesn't exist or isn't a file"
fi
if [ ! -z "$OUTFILE" -a "$FILE" -ef "$OUTFILE" ]
then
    fail "Refusing to use the input file as the output file"
fi

if [ $CMD_DUMP_SCRIPT ]
then
    unzip -p "$FILE" "$INSTALL_SCRIPT_NAME"
    exit 0
fi

# Create a temporary directory for scratch files.
#
TMPDIR=`mktemp -d /tmp/$PROGNAME.XXXXXX`
if [ $? -ne 0 ]
then
    TMPDIR=
    fail "Can't create temporary directory"
fi


if [ $UNPACK_FILE ]
then
    ROOTDIR="$TMPDIR/root"
    mkdir -p "$ROOTDIR"

    println "Unpacking `basename $FILE`..."

    unzip -q -d "$ROOTDIR" "$FILE"
    if [ $? -ne 0 ]
    then
        fail "Couldn't unpack $FILE"
    fi
fi


if [ $CMD_DUMP ]
then
    function dumpfile
    {
        echo "BEGIN `basename $1`"
        cat "$1" | sed -e 's/^/    /'
        echo "END `basename $1`"
    }

    echo Contents of root:
    ls -1 "$ROOTDIR" | sed -e 's/^/    /'
    echo
    echo Contents of META-INF:
    (cd "$ROOTDIR" && find META-INF -type f) | sed -e 's/^/    /'

    echo
    dumpfile "$ROOTDIR/META-INF/MANIFEST.MF"
    echo
    dumpfile "$ROOTDIR/$INSTALL_SCRIPT_NAME"
    echo
    dumpfile "$ROOTDIR/android-product.txt"
    echo
    dumpfile "$ROOTDIR/system/build.prop"
fi

if [ $CMD_APPEND_SCRIPT ]
then
    TMPSCRIPT="$TMPDIR/script"
    NEWSCRIPT="$TMPDIR/$INSTALL_SCRIPT_NAME"
    unzip -p "$FILE" "$INSTALL_SCRIPT_NAME" > "$TMPSCRIPT"
    if [ $? -ne 0 ]
    then
        fail "Couldn't extract $INSTALL_SCRIPT_NAME from $FILE"
    fi
    mkdir -p `dirname "$NEWSCRIPT"`
    cat "$TMPSCRIPT" "$SCRIPT_FILE" > "$NEWSCRIPT"

    OVERWRITE_SCRIPT=1
fi

if [ $CMD_REPLACE_SCRIPT ]
then
    NEWSCRIPT="$TMPDIR/$INSTALL_SCRIPT_NAME"
    mkdir -p `dirname "$NEWSCRIPT"`
    cp "$SCRIPT_FILE" "$NEWSCRIPT"

    OVERWRITE_SCRIPT=1
fi

if [ $OVERWRITE_SCRIPT ]
then
    cp "$FILE" "$TMPDIR/outfile.zip"
    (cd "$TMPDIR" && zip -qu outfile.zip "$INSTALL_SCRIPT_NAME")
    if [ $? -ne 0 ]
    then
        fail "Couldn't add new $INSTALL_SCRIPT_NAME to output file"
    fi

    rm -f "$OUTFILE"
    mkdir -p `dirname "$OUTFILE"`
    mv "$TMPDIR/outfile.zip" "$OUTFILE"
fi

cleantmp
