| #!/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 |