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