#!/usr/bin/env bash ############################################################################### # # Copyright (C) 2009-2013 Nintendo. All rights reserved. # # These coded instructions, statements, and computer programs contain # proprietary information of Nintendo of America Inc. and/or Nintendo # Company Ltd., and are protected by Federal copyright law. They may # not be disclosed to third parties or copied or duplicated in any form, # in whole or in part, without the prior written consent of Nintendo. # ############################################################################### ############################################################################### # display name ############################################################################### display_name () { echo "$(basename $0) - Download image creator, Copyright 2012 Nintendo." echo "" } ############################################################################### # wuma check ############################################################################### wuma_check () { local WUMA="$1" if [ ! -e "$WUMA" ] then echo "$(basename $0) failed: $WUMA does not exist." return 1 else if [ ! -f "$WUMA" ] then echo "$(basename $0) failed: $WUMA is not a file." return 1 fi fi if [ ! "${WUMA##*.}" == "wumad" -a ! "${WUMA##*.}" == "wumat" -a ! "${WUMA##*.}" == "wumap" ] then echo "$(basename $0) failed: $WUMA is not a wumad/wumat/wumap file." return 1 fi return 0 } ############################################################################### # dir check ############################################################################### dir_check () { local DIR="$1" local CLEAN_UP="$2" if [ -e "$DIR" ] then if [ ! -d "$DIR" ] then echo "$(basename $0) failed: $DIR is not a directory." return 1 fi if [ "$CLEAN_UP" -eq 1 ] then rm -Rf "$DIR" mkdir "$DIR" fi else mkdir "$DIR" fi return 0 } ############################################################################### # erase temporary items ############################################################################### erase_work () { rm -Rf "$TEMP_WORK_DIR" } ############################################################################### # print usage help message ############################################################################### usage () { cat < [-o ] [-w ] [-z] options: -i : Master archive file to create download image from. -o : Output base directory to create download images. They are created under here with generating each partition folder. If omitted, they'll be created at "$DEFAULT_OUTPUT_BASE_DIR". -w : Temporary directory for processing. If omitted, create temporary directory at the current work dir. -z : Omit extracting zip file EOF } ############################################################################### # main ############################################################################### # Environment settings BIN_TOOL_DIR="$CAFE_ROOT/system/bin/tool" DEFAULT_OUTPUT_BASE_DIR="$CAFE_ROOT/${SESSION_PATH_PREFIX}data/mlc/install" OMIT_EXTRACTING= while getopts ":i:o:w:zv" opt; do case $opt in i ) INPUT_WUMA_FILE="`cygpath -a $OPTARG`" ;; o ) OUTPUT_BASE_DIR="`cygpath -a $OPTARG`" ;; w ) TEMP_WORK_DIR="`cygpath -a $OPTARG`" ;; z ) OMIT_EXTRACTING="TRUE" ;; v ) VERBOSE=1 ;; \? ) usage exit 1 ;; esac done # setup bin/tool MASTER2PART="$BIN_TOOL_DIR/mastering/master2part.exe" UNPACKFILE="$BIN_TOOL_DIR/mastering/unpackfile.exe" # display script name display_name # check for bin tools if [ ! -f "$MASTER2PART" ] then echo "$(basename $0) failed: $MASTER2PART not found." exit 2 fi # input wuma check if [ -z "$INPUT_WUMA_FILE" ] then echo "$(basename $0) failed: Please specify input wumad/wumap file with -i." exit 3 fi wuma_check "$INPUT_WUMA_FILE" rval=$? if [ $rval -ne 0 ] then exit 4 fi # output base dir check if [ -z "$OUTPUT_BASE_DIR" ] then OUTPUT_BASE_DIR="$DEFAULT_OUTPUT_BASE_DIR" fi dir_check "$OUTPUT_BASE_DIR" 0 rval=$? if [ $rval -ne 0 ] then exit 5 fi # temp work dir check if [ -z "$TEMP_WORK_DIR" ] then TEMP_WORK_DIR="`basename "${INPUT_WUMA_FILE%.*}"`_tmp" else if [ -e "$TEMP_WORK_DIR" ] then TEMP_WORK_SUBDIR="`basename "${INPUT_WUMA_FILE%.*}"`_tmp" TEMP_WORK_DIR="$TEMP_WORK_DIR/$TEMP_WORK_SUBDIR" fi fi dir_check "$TEMP_WORK_DIR" 1 rval=$? if [ $rval -ne 0 ] then erase_work exit 7 fi TEMP_WORK_DIR_DOS=`cygpath -w -a "$TEMP_WORK_DIR"` # unpack partition data to the destination PART_DIR="$TEMP_WORK_DIR/part" INPUT_WUMA_FILE_DOS=`cygpath -w -a "$INPUT_WUMA_FILE"` PART_DIR_DOS=`cygpath -w -a "$PART_DIR"` "$MASTER2PART" -v -nc "-wd=$TEMP_WORK_DIR_DOS" "$INPUT_WUMA_FILE_DOS" "$PART_DIR_DOS" rval=$? if [ $rval -ne 0 ] then erase_work exit $rval fi # create package list PACKAGE_LIST=`find "$PART_DIR" | grep ".*p[0-9A-Fa-f][0-9A-Fa-f]\.zip.*$"` PACKAGE_LIST_FILE="$TEMP_WORK_DIR/package_list.txt" echo "`echo "$PACKAGE_LIST" | wc -l` package(s) found." echo "$PACKAGE_LIST" > "$PACKAGE_LIST_FILE" BUFIFS=$IFS IFS= l_num=1 exec 3< "$PACKAGE_LIST_FILE" while read PACKAGE_FILE 0<&3 do echo "Processing $PACKAGE_FILE..." # output dir check OUTPUT_DIR="$OUTPUT_BASE_DIR/$(basename ${INPUT_WUMA_FILE%.*})_$(basename ${PACKAGE_FILE%.*})" if [ -e "$OUTPUT_DIR" ] then echo "$(basename $0) WARNING: $OUTPUT_DIR already exists, erasing..." rm -Rf "$OUTPUT_DIR" fi if [ -n "$OMIT_EXTRACTING" ]; then OUTPUT_FILE="$(cygpath -a $OUTPUT_DIR).zip" mv "$PACKAGE_FILE" "$OUTPUT_FILE" echo "output file: $OUTPUT_FILE" else # unpack zip to output dir PACKAGE_FILE_DOS=`cygpath -w -a "$PACKAGE_FILE"` OUTPUT_DIR_DOS=`cygpath -w -a "$OUTPUT_DIR"` "$UNPACKFILE" -v -nc "-wd=$TEMP_WORK_DIR_DOS" "$PACKAGE_FILE_DOS" "$OUTPUT_DIR_DOS" rval=$? if [ $rval -ne 0 ] then echo "$(basename $0) failed: Unable to unpack $(basename $PACKAGE_FILE)" erase_work exit $rval fi echo "unpacked $(basename $PACKAGE_FILE) to $OUTPUT_DIR" fi done exec 3<&- IFS=$BUFIFS echo "Download image(s) successfully created under $OUTPUT_BASE_DIR." # Erase settings erase_work