1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#!/bin/bash
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# Copyright (C) 2010 The Android Open Source Project
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# 
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# Licensed under the Apache License, Version 2.0 (the "License");
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# you may not use this file except in compliance with the License.
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# You may obtain a copy of the License at
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#      http://www.apache.org/licenses/LICENSE-2.0
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# 
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# Unless required by applicable law or agreed to in writing, software
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# distributed under the License is distributed on an "AS IS" BASIS,
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# See the License for the specific language governing permissions and
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# limitations under the License.
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# mkobb.sh - Creates OBB files on Linux machines
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# Directory where we should temporarily mount the OBB loopback to copy files
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMOUNTDIR=/tmp
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# Presets. Changing these will probably break your OBB on the device
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiCRYPTO=twofish
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiFS=vfat
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiMKFS=mkfs.vfat
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiLOSETUP=losetup
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiBLOCK_SIZE=512
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiSLOP=512 # Amount of filesystem slop in ${BLOCK_SIZE} blocks
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifind_binaries() {
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    MKFSBIN=`which ${MKFS}`
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    LOSETUPBIN=`which ${LOSETUP}`
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    MOUNTBIN=`which mount`
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    UMOUNTBIN=`which umount`
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    DDBIN=`which dd`
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    RSYNCBIN=`which rsync`
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    PBKDF2GEN=`which pbkdf2gen`
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskicheck_prereqs() {
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if [ "`uname -s`x" != "Linuxx" ]; then \
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "ERROR: This script only works on Linux!"
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        exit 1
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if ! egrep -q "^cryptoloop " /proc/modules; then \
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "ERROR: Could not find cryptoloop in the kernel."
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "Perhaps you need to: modprobe cryptoloop"
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        exit 1
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if ! egrep -q "name\s*:\s*${CRYPTO}$" /proc/crypto; then \
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "ERROR: Could not find crypto \`${CRYPTO}' in the kernel."
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "Perhaps you need to: modprobe ${CRYPTO}"
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        exit 1
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if ! egrep -q "^\s*${FS}$" /proc/filesystems; then \
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "ERROR: Could not find filesystem \`${FS}' in the kernel."
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "Perhaps you need to: modprobe ${FS}"
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        exit 1
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if [ "${MKFSBIN}x" = "x" ]; then \
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "ERROR: Could not find ${MKFS} in your path!"
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        exit 1
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    elif [ ! -x "${MKFSBIN}" ]; then \
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "ERROR: ${MKFSBIN} is not executable!"
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        exit 1
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if [ "${LOSETUPBIN}x" = "x" ]; then \
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "ERROR: Could not find ${LOSETUP} in your path!"
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        exit 1
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    elif [ ! -x "${LOSETUPBIN}" ]; then \
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "ERROR: ${LOSETUPBIN} is not executable!"
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        exit 1
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if [ "${PBKDF2GEN}x" = "x" ]; then \
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "ERROR: Could not find pbkdf2gen in your path!"
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        exit 1
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskicleanup() {
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if [ "${loopdev}x" != "x" ]; then \
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ${LOSETUPBIN} -d ${loopdev}
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskihidden_prompt() {
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    unset output
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    prompt="$1"
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    outvar="$2"
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    while read -s -n 1 -p "$prompt" c; do \
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if [ "x$c" = "x" ]; then \
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            break
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fi
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        prompt='*'
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        output="${output}${c}"
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    done
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    eval $outvar="$output"
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    unset output
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiread_key() {
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    hidden_prompt "        Encryption key: " key
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if [ "${key}x" = "x" ]; then \
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "ERROR: An empty key is not allowed!"
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        exit 1
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    hidden_prompt "Encryption key (again): " key2
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if [ "${key}x" != "${key2}x" ]; then \
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        echo "ERROR: Encryption keys do not match!"
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        exit 1
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskionexit() {
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if [ "x${temp_mount}" != "x" ]; then \
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ${UMOUNTBIN} ${temp_mount}
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        rmdir ${temp_mount}
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if [ "x${loop_dev}" != "x" ]; then \
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if [ ${use_crypto} -eq 1 ]; then \
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            dmsetup remove -f ${loop_dev}
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ${LOSETUPBIN} -d ${old_loop_dev}
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        else \
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            ${LOSETUPBIN} -d ${loop_dev}
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fi
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if [ "x${tempfile}" != "x" -a -f "${tempfile}" ]; then \
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        rm -f ${tempfile}
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    if [ "x${keyfile}" != "x" -a -f "${keyfile}" ]; then \
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        rm -f ${keyfile}
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    fi
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo "Fatal error."
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    exit 1
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiusage() {
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo "mkobb.sh -- Create OBB files for use on Android"
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo ""
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo " -d <directory> Use <directory> as input for OBB files"
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo " -k <key>       Use <key> to encrypt OBB file"
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo " -K             Prompt for key to encrypt OBB file"
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo " -o <filename>  Write OBB file out to <filename>"
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo " -v             Verbose mode"
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo " -h             Help; this usage screen"
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifind_binaries
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskicheck_prereqs
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiuse_crypto=0
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiargs=`getopt -o d:hk:Ko:v -- "$@"`
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskieval set -- "$args"
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiwhile true; do \
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    case "$1" in
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        -d) directory=$2; shift 2;;
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        -h) usage; exit 1;;
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        -k) key=$2; use_crypto=1; shift 2;;
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        -K) prompt_key=1; use_crypto=1; shift;;
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        -v) verbose=1; shift;;
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        -o) filename=$2; shift 2;;
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        --) shift; break;;
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        *) echo "ERROR: Invalid argument in option parsing! Cannot recover. Ever."; exit 1;;
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    esac
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskidone
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiif [ "${directory}x" = "x" -o ! -d "${directory}" ]; then \
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo "ERROR: Must specify valid input directory"
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo ""
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    usage
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    exit 1;
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifi
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiif [ "${filename}x" = "x" ]; then \
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo "ERROR: Must specify filename"
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo ""
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    usage
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    exit 1;
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifi
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiif [ ${use_crypto} -eq 1 -a "${key}x" = "x" -a 0${prompt_key} -eq 0 ]; then \
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo "ERROR: Crypto desired, but no key supplied or requested to prompt for."
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    exit 1
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifi
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiif [ 0${prompt_key} -eq 1 ]; then \
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    read_key
201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifi
202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskioutdir=`dirname ${filename}`
204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiif [ ! -d "${outdir}" ]; then \
205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo "ERROR: Output directory does not exist: ${outdir}"
206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    exit 1
207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifi
208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# Make sure we clean up any stuff we create from here on during error conditions
210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitrap onexit ERR
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitempfile=$(tempfile -d ${outdir}) || ( echo "ERROR: couldn't create temporary file in ${outdir}"; exit 1 )
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiblock_count=`du -s --apparent-size --block-size=512 ${directory} | awk '{ print $1; }'`
215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiif [ $? -ne 0 ]; then \
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo "ERROR: Couldn't read size of input directory ${directory}"
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    exit 1
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifi
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiecho "Creating temporary file..."
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski${DDBIN} if=/dev/zero of=${tempfile} bs=${BLOCK_SIZE} count=$((${block_count} + ${SLOP})) > /dev/null 2>&1
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiif [ $? -ne 0 ]; then \
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo "ERROR: creating temporary file: $?"
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifi
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiloop_dev=$(${LOSETUPBIN} -f) || ( echo "ERROR: losetup wouldn't tell us the next unused device"; exit 1 )
227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski${LOSETUPBIN} ${loop_dev} ${tempfile} || ( echo "ERROR: couldn't create loopback device"; exit 1 )
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiif [ ${use_crypto} -eq 1 ]; then \
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    eval `${PBKDF2GEN} ${key}`
232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    unique_dm_name=`basename ${tempfile}`
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo "0 `blockdev --getsize ${loop_dev}` crypt ${CRYPTO} ${key} 0 ${loop_dev} 0" | dmsetup create ${unique_dm_name}
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    old_loop_dev=${loop_dev}
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    loop_dev=/dev/mapper/${unique_dm_name}
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifi
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# Create the filesystem
240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#
241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiecho ""
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski${MKFSBIN} -I ${loop_dev}
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiecho ""
244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#
246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# Make the temporary mount point and mount it
247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#
248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitemp_mount="${MOUNTDIR}/${RANDOM}"
249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskimkdir ${temp_mount}
250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski${MOUNTBIN} -t ${FS} -o loop ${loop_dev} ${temp_mount}
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#
253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# rsync the files!
254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#
255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiecho "Copying files:"
256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski${RSYNCBIN} -av --no-owner --no-group ${directory}/ ${temp_mount}/
257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiecho ""
258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiecho "Successfully created \`${filename}'"
260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiif [ ${use_crypto} -eq 1 ]; then \
262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo "salt for use with obbtool is:"
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    echo "${salt}"
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifi
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski# Undo all the temporaries
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiumount ${temp_mount}
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskirmdir ${temp_mount}
271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiif [ ${use_crypto} -eq 1 ]; then \
272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    dmsetup remove -f ${loop_dev}
273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ${LOSETUPBIN} -d ${old_loop_dev}
274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskielse \
275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ${LOSETUPBIN} -d ${loop_dev}
276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskifi
277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskimv ${tempfile} ${filename}
278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskitrap - ERR
280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiexit 0
282