130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#!/bin/bash
230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#
330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Copyright (C) 2010 The Android Open Source Project
430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 
530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Licensed under the Apache License, Version 2.0 (the "License");
630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# you may not use this file except in compliance with the License.
730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# You may obtain a copy of the License at
830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#      http://www.apache.org/licenses/LICENSE-2.0
1030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# 
1130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Unless required by applicable law or agreed to in writing, software
1230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# distributed under the License is distributed on an "AS IS" BASIS,
1330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# See the License for the specific language governing permissions and
1530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# limitations under the License.
1630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#
1730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
1830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# mkobb.sh - Creates OBB files on Linux machines
1930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
2030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Directory where we should temporarily mount the OBB loopback to copy files
2130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootMOUNTDIR=/tmp
2230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
2330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Presets. Changing these will probably break your OBB on the device
24735de3b38abbd6564082a819377673ee593744a6Kenny RootCRYPTO=twofish
2530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootFS=vfat
2630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootMKFS=mkfs.vfat
2730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootLOSETUP=losetup
2830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootBLOCK_SIZE=512
2930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny RootSLOP=512 # Amount of filesystem slop in ${BLOCK_SIZE} blocks
3030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
3130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfind_binaries() {
3230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    MKFSBIN=`which ${MKFS}`
3330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    LOSETUPBIN=`which ${LOSETUP}`
3430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    MOUNTBIN=`which mount`
3530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    UMOUNTBIN=`which umount`
3630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    DDBIN=`which dd`
3730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    RSYNCBIN=`which rsync`
383b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    PBKDF2GEN=`which pbkdf2gen`
3930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root}
4030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
4130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootcheck_prereqs() {
4230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if [ "`uname -s`x" != "Linuxx" ]; then \
4330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "ERROR: This script only works on Linux!"
4430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        exit 1
4530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
4630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
4730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if ! egrep -q "^cryptoloop " /proc/modules; then \
4830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "ERROR: Could not find cryptoloop in the kernel."
4930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "Perhaps you need to: modprobe cryptoloop"
5030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        exit 1
5130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
5230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
5330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if ! egrep -q "name\s*:\s*${CRYPTO}$" /proc/crypto; then \
5430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "ERROR: Could not find crypto \`${CRYPTO}' in the kernel."
5530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "Perhaps you need to: modprobe ${CRYPTO}"
5630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        exit 1
5730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
5830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
5930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if ! egrep -q "^\s*${FS}$" /proc/filesystems; then \
6030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "ERROR: Could not find filesystem \`${FS}' in the kernel."
6130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "Perhaps you need to: modprobe ${FS}"
6230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        exit 1
6330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
6430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
6530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if [ "${MKFSBIN}x" = "x" ]; then \
6630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "ERROR: Could not find ${MKFS} in your path!"
6730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        exit 1
6830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    elif [ ! -x "${MKFSBIN}" ]; then \
6930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "ERROR: ${MKFSBIN} is not executable!"
7030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        exit 1
7130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
7230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
7330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if [ "${LOSETUPBIN}x" = "x" ]; then \
7430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "ERROR: Could not find ${LOSETUP} in your path!"
7530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        exit 1
7630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    elif [ ! -x "${LOSETUPBIN}" ]; then \
7730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "ERROR: ${LOSETUPBIN} is not executable!"
7830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        exit 1
7930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
803b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root
813b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    if [ "${PBKDF2GEN}x" = "x" ]; then \
823b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        echo "ERROR: Could not find pbkdf2gen in your path!"
833b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        exit 1
843b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    fi
8530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root}
8630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
8730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootcleanup() {
8830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if [ "${loopdev}x" != "x" ]; then \
8930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        ${LOSETUPBIN} -d ${loopdev}
9030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
9130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root}
9230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
9330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Roothidden_prompt() {
9430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    unset output
9530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    prompt="$1"
9630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    outvar="$2"
9730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    while read -s -n 1 -p "$prompt" c; do \
9830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        if [ "x$c" = "x" ]; then \
9930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root            break
10030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        fi
10130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        prompt='*'
10230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        output="${output}${c}"
10330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    done
10430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo
10530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    eval $outvar="$output"
10630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    unset output
10730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root}
10830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
10930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootread_key() {
11030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    hidden_prompt "        Encryption key: " key
11130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
11230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if [ "${key}x" = "x" ]; then \
11330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "ERROR: An empty key is not allowed!"
11430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        exit 1
11530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
11630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
11730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    hidden_prompt "Encryption key (again): " key2
11830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
11930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if [ "${key}x" != "${key2}x" ]; then \
12030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        echo "ERROR: Encryption keys do not match!"
12130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        exit 1
12230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
12330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root}
12430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
12530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootonexit() {
12630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if [ "x${temp_mount}" != "x" ]; then \
12730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        ${UMOUNTBIN} ${temp_mount}
12830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        rmdir ${temp_mount}
12930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
13030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if [ "x${loop_dev}" != "x" ]; then \
131735de3b38abbd6564082a819377673ee593744a6Kenny Root        if [ ${use_crypto} -eq 1 ]; then \
132735de3b38abbd6564082a819377673ee593744a6Kenny Root            dmsetup remove -f ${loop_dev}
133735de3b38abbd6564082a819377673ee593744a6Kenny Root            ${LOSETUPBIN} -d ${old_loop_dev}
134735de3b38abbd6564082a819377673ee593744a6Kenny Root        else \
135735de3b38abbd6564082a819377673ee593744a6Kenny Root            ${LOSETUPBIN} -d ${loop_dev}
136735de3b38abbd6564082a819377673ee593744a6Kenny Root        fi
13730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
13830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if [ "x${tempfile}" != "x" -a -f "${tempfile}" ]; then \
13930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        rm -f ${tempfile}
14030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
14130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    if [ "x${keyfile}" != "x" -a -f "${keyfile}" ]; then \
14230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        rm -f ${keyfile}
14330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    fi
14430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo "Fatal error."
14530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    exit 1
14630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root}
14730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
14830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootusage() {
14930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo "mkobb.sh -- Create OBB files for use on Android"
15030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo ""
15130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo " -d <directory> Use <directory> as input for OBB files"
15230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo " -k <key>       Use <key> to encrypt OBB file"
15330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo " -K             Prompt for key to encrypt OBB file"
15430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo " -o <filename>  Write OBB file out to <filename>"
15530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo " -v             Verbose mode"
15630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo " -h             Help; this usage screen"
15730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root}
15830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
15930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfind_binaries
16030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootcheck_prereqs
16130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
16230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootuse_crypto=0
16330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
1643b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Rootargs=`getopt -o d:hk:Ko:v -- "$@"`
16530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rooteval set -- "$args"
16630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
16730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootwhile true; do \
16830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    case "$1" in
16930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        -d) directory=$2; shift 2;;
17030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        -h) usage; exit 1;;
17112ffd9bf4c2cc9075ea7602b4932f823ba940f80Kenny Root        -k) key=$2; use_crypto=1; shift 2;;
17212ffd9bf4c2cc9075ea7602b4932f823ba940f80Kenny Root        -K) prompt_key=1; use_crypto=1; shift;;
17330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        -v) verbose=1; shift;;
17430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        -o) filename=$2; shift 2;;
17530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        --) shift; break;;
17630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root        *) echo "ERROR: Invalid argument in option parsing! Cannot recover. Ever."; exit 1;;
17730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    esac
17830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootdone
17930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
18030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ "${directory}x" = "x" -o ! -d "${directory}" ]; then \
18130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo "ERROR: Must specify valid input directory"
18230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo ""
18330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    usage
18430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    exit 1;
18530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi
18630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
18730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ "${filename}x" = "x" ]; then \
18830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo "ERROR: Must specify filename"
18930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo ""
19030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    usage
19130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    exit 1;
19230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi
19330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
19430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ ${use_crypto} -eq 1 -a "${key}x" = "x" -a 0${prompt_key} -eq 0 ]; then \
19530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo "ERROR: Crypto desired, but no key supplied or requested to prompt for."
19630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    exit 1
19730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi
19830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
19930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ 0${prompt_key} -eq 1 ]; then \
20030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    read_key
20130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi
20230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
20330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootoutdir=`dirname ${filename}`
20430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ ! -d "${outdir}" ]; then \
20530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo "ERROR: Output directory does not exist: ${outdir}"
20630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    exit 1
20730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi
20830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
20930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Make sure we clean up any stuff we create from here on during error conditions
21030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Roottrap onexit ERR
21130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
21230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Roottempfile=$(tempfile -d ${outdir}) || ( echo "ERROR: couldn't create temporary file in ${outdir}"; exit 1 )
21330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
214735de3b38abbd6564082a819377673ee593744a6Kenny Rootblock_count=`du -s --apparent-size --block-size=512 ${directory} | awk '{ print $1; }'`
21530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ $? -ne 0 ]; then \
21630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo "ERROR: Couldn't read size of input directory ${directory}"
21730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    exit 1
21830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi
21930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
22030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho "Creating temporary file..."
22130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root${DDBIN} if=/dev/zero of=${tempfile} bs=${BLOCK_SIZE} count=$((${block_count} + ${SLOP})) > /dev/null 2>&1
22230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ $? -ne 0 ]; then \
22330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root    echo "ERROR: creating temporary file: $?"
22430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi
22530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
22630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootloop_dev=$(${LOSETUPBIN} -f) || ( echo "ERROR: losetup wouldn't tell us the next unused device"; exit 1 )
22730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
228735de3b38abbd6564082a819377673ee593744a6Kenny Root${LOSETUPBIN} ${loop_dev} ${tempfile} || ( echo "ERROR: couldn't create loopback device"; exit 1 )
229735de3b38abbd6564082a819377673ee593744a6Kenny Root
23030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootif [ ${use_crypto} -eq 1 ]; then \
2313b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    eval `${PBKDF2GEN} ${key}`
232735de3b38abbd6564082a819377673ee593744a6Kenny Root    unique_dm_name=`basename ${tempfile}`
2333b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    echo "0 `blockdev --getsize ${loop_dev}` crypt ${CRYPTO} ${key} 0 ${loop_dev} 0" | dmsetup create ${unique_dm_name}
234735de3b38abbd6564082a819377673ee593744a6Kenny Root    old_loop_dev=${loop_dev}
235735de3b38abbd6564082a819377673ee593744a6Kenny Root    loop_dev=/dev/mapper/${unique_dm_name}
23630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootfi
23730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
23830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#
23930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Create the filesystem
24030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#
24130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho ""
24230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root${MKFSBIN} -I ${loop_dev}
24330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho ""
24430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
24530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#
24630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Make the temporary mount point and mount it
24730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#
24830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Roottemp_mount="${MOUNTDIR}/${RANDOM}"
24930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootmkdir ${temp_mount}
25030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root${MOUNTBIN} -t ${FS} -o loop ${loop_dev} ${temp_mount}
25130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
25230c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#
25330c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# rsync the files!
25430c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#
25530c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho "Copying files:"
25630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root${RSYNCBIN} -av --no-owner --no-group ${directory}/ ${temp_mount}/
25730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho ""
25830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
25930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootecho "Successfully created \`${filename}'"
26030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
2613b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Rootif [ ${use_crypto} -eq 1 ]; then \
2623b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    echo "salt for use with obbtool is:"
2633b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    echo "${salt}"
2643b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Rootfi
2653b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root
26630c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#
26730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root# Undo all the temporaries
26830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root#
26930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootumount ${temp_mount}
27030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootrmdir ${temp_mount}
271735de3b38abbd6564082a819377673ee593744a6Kenny Rootif [ ${use_crypto} -eq 1 ]; then \
272735de3b38abbd6564082a819377673ee593744a6Kenny Root    dmsetup remove -f ${loop_dev}
273735de3b38abbd6564082a819377673ee593744a6Kenny Root    ${LOSETUPBIN} -d ${old_loop_dev}
274735de3b38abbd6564082a819377673ee593744a6Kenny Rootelse \
275735de3b38abbd6564082a819377673ee593744a6Kenny Root    ${LOSETUPBIN} -d ${loop_dev}
276735de3b38abbd6564082a819377673ee593744a6Kenny Rootfi
27730c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootmv ${tempfile} ${filename}
27830c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
27930c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Roottrap - ERR
28030c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Root
28130c1102fecda5e9ef071c58c0e54b721961ae4e3Kenny Rootexit 0
282