12b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo#!/bin/bash 22b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# 4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# Copyright (C) 2015 The Android Open Source Project 5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# 6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# Licensed under the Apache License, Version 2.0 (the "License"); 7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# you may not use this file except in compliance with the License. 8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# You may obtain a copy of the License at 9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# 10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# http://www.apache.org/licenses/LICENSE-2.0 11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# 12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# Unless required by applicable law or agreed to in writing, software 13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# distributed under the License is distributed on an "AS IS" BASIS, 14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# See the License for the specific language governing permissions and 16aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# limitations under the License. 17aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# 182b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 1904ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo# This script generates some sample images used in unittests and packages them 2004ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo# in the sample_images.tar.bz2 file. The list of generated images and their 2104ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo# options are described in the main() function. You need to manually run this 2204ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo# script to update the generated images whenever you modify this script. 2304ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo 242b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymoset -e 252b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 262b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo# cleanup <path> 272b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo# Unmount and remove the mountpoint <path> 282b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymocleanup() { 292b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo if ! sudo umount "$1" 2>/dev/null; then 302b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo if mountpoint -q "$1"; then 312b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sync && sudo umount "$1" 322b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo fi 332b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo fi 342b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo rmdir "$1" 352b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo} 362b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 372e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# add_files_default <mntdir> <block_size> 382e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# Add several test files to the image mounted in <mntdir>. 392e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymoadd_files_default() { 402e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local mntdir="$1" 412e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local block_size="$2" 422b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 432b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo ### Generate the files used in unittest with descriptive names. 442b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo touch "${mntdir}"/empty-file 452b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 462b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # regular: Regular files. 472b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "small file" | sudo dd of="${mntdir}"/regular-small status=none 482b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo dd if=/dev/zero bs=1024 count=16 status=none | tr '\0' '\141' | 492b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo dd of="${mntdir}"/regular-16k status=none 502b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo dd if=/dev/zero of="${mntdir}"/regular-32k-zeros bs=1024 count=16 \ 512b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo status=none 522b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 532b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "with net_cap" | sudo dd of="${mntdir}"/regular-with_net_cap status=none 542b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo setcap cap_net_raw=ep "${mntdir}"/regular-with_net_cap 552b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 562b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # sparse_empty: Files with no data blocks at all (only sparse holes). 572b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo truncate --size=10240 "${mntdir}"/sparse_empty-10k 582b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo truncate --size=$(( block_size * 2 )) "${mntdir}"/sparse_empty-2blocks 592b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 602b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # sparse: Files with some data blocks but also sparse holes. 612b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo -n "foo" | 622b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo dd of="${mntdir}"/sparse-16k-last_block bs=1 \ 632b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo seek=$(( 16 * 1024 - 3)) status=none 642b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 652b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # ext2 inodes have 12 direct blocks, one indirect, one double indirect and 662b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # one triple indirect. 10000 should be enough to have an indirect and double 672b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # indirect block. 682b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo -n "foo" | 692b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo dd of="${mntdir}"/sparse-10000blocks bs=1 \ 702b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo seek=$(( block_size * 10000 )) status=none 712b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 722b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo truncate --size=16384 "${mntdir}"/sparse-16k-first_block 732b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "first block" | sudo dd of="${mntdir}"/sparse-16k-first_block status=none 742b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 752b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo truncate --size=16384 "${mntdir}"/sparse-16k-holes 762b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "a" | sudo dd of="${mntdir}"/sparse-16k-holes bs=1 seek=100 status=none 772b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "b" | sudo dd of="${mntdir}"/sparse-16k-holes bs=1 seek=10000 status=none 782b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 792b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # link: symlinks and hardlinks. 802b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo ln -s "broken-link" "${mntdir}"/link-short_symlink 812b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo ln -s $(dd if=/dev/zero bs=256 count=1 status=none | tr '\0' '\141') \ 822b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo "${mntdir}"/link-long_symlink 832b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo ln "${mntdir}"/regular-16k "${mntdir}"/link-hard-regular-16k 842b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 852b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # Directories. 862b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo mkdir -p "${mntdir}"/dir1/dir2/dir1 872b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "foo" | sudo tee "${mntdir}"/dir1/dir2/file >/dev/null 882b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "bar" | sudo tee "${mntdir}"/dir1/file >/dev/null 892b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 902b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # removed: removed files that should not be listed. 912b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "We will remove this file so it's contents will be somewhere in the " \ 922b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo "empty space data but it won't be all zeros." | 932b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo dd of="${mntdir}"/removed conv=fsync status=none 942b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo rm "${mntdir}"/removed 952e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo} 962e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 972e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# add_files_ue_settings <mntdir> <block_size> 982e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# Add the update_engine.conf settings file. This file contains the 992e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymoadd_files_ue_settings() { 1002e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local mntdir="$1" 1012e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 1022e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo sudo mkdir -p "${mntdir}"/etc >/dev/null 1032e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo sudo tee "${mntdir}"/etc/update_engine.conf >/dev/null <<EOF 1042e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoPAYLOAD_MINOR_VERSION=1234 1052e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoEOF 1062e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo # Example of a real lsb-release file released on link stable. 1072e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo sudo tee "${mntdir}"/etc/lsb-release >/dev/null <<EOF 1082e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_AUSERVER=https://tools.google.com/service/update2 1092e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_BOARD_APPID={F26D159B-52A3-491A-AE25-B23670A66B32} 1102e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_CANARY_APPID={90F229CE-83E2-4FAF-8479-E368A34938B1} 1112e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_DEVSERVER= 1122e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_APPID={F26D159B-52A3-491A-AE25-B23670A66B32} 1132e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BOARD=link-signed-mp-v4keys 1142e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BRANCH_NUMBER=63 1152e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BUILD_NUMBER=6946 1162e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BUILD_TYPE=Official Build 1172e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_CHROME_MILESTONE=43 1182e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_DESCRIPTION=6946.63.0 (Official Build) stable-channel link 1192e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_NAME=Chrome OS 1202e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_PATCH_NUMBER=0 1212e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_TRACK=stable-channel 1222e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_VERSION=6946.63.0 1232e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoGOOGLE_RELEASE=6946.63.0 1242e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoEOF 1252e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo} 1262e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 127c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymoadd_files_postinstall() { 128c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo local mntdir="$1" 129c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo 130c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo sudo mkdir -p "${mntdir}"/bin >/dev/null 131c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo 132c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo # A postinstall bash program. 133c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo sudo tee "${mntdir}"/bin/postinst_example >/dev/null <<EOF 134c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo#!/etc/../bin/sh 135c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymoecho "I'm a postinstall program and I know how to write to stdout" 136c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymoecho "My call was $@" 137c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymoexit 0 138c975d7bc6767711c4802e104c4a9d4731910c9beAlex DeymoEOF 139c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo 140c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo # A symlink to another program. This should also work. 141c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo sudo ln -s "postinst_example" "${mntdir}"/bin/postinst_link 142c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo 143c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo sudo tee "${mntdir}"/bin/postinst_fail3 >/dev/null <<EOF 144c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo#!/etc/../bin/sh 145c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymoexit 3 146c975d7bc6767711c4802e104c4a9d4731910c9beAlex DeymoEOF 147c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo 148c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo sudo tee "${mntdir}"/bin/postinst_fail1 >/dev/null <<EOF 149c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo#!/etc/../bin/sh 150c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymoexit 1 151c975d7bc6767711c4802e104c4a9d4731910c9beAlex DeymoEOF 152c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo 153bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymo # A program that succeeds if it is suspended during the first 5 minutes. 154bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymo sudo tee "${mntdir}"/bin/postinst_suspend >/dev/null <<EOF 155bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymo#!/etc/../bin/sh 156bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymotrap "{ echo Got a SIGCONT; exit 0; }" CONT 157bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymo# Signal that we are ready to receive the signal by redirecting our stdin to 158bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymo# /dev/zero, the test can detect that. 159bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymoexec </dev/zero 160bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymo# Allow the signal handler to run every 100 ms. 161bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymoi=3000 162bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymowhile [ \$i -ge 0 ]; do 163bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymo sleep 0.1 164bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymo i=\$((i-1)) 165bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymodone 166bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymoexit 1 167bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex DeymoEOF 168bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymo 16972ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo # A program that reports back progress. 17072ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo sudo tee "${mntdir}"/bin/postinst_progress >/dev/null <<EOF 17172ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo#!/etc/../bin/sh 17272ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo# These values have exact representation in IEEE 754 so we avoid rounding 17372ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo# errors. 17472ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymoecho global_progress 0.25 >&3 17572ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymoecho global_progress 0.5 >&3 17672ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymoecho global_progress 1.0 >&3 17772ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymoexit 0 17872ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex DeymoEOF 17972ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo 180c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo # A postinstall bash program. 181c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo sudo tee "${mntdir}"/bin/self_check_context >/dev/null <<EOF 182c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo#!/etc/../bin/sh 183c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymoecho "This is my context:" 184c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymols -lZ "\$0" | grep -F ' u:object_r:postinstall_file:s0 ' || exit 5 185c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymoexit 0 186c975d7bc6767711c4802e104c4a9d4731910c9beAlex DeymoEOF 187c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo 188c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo sudo tee "${mntdir}"/postinst >/dev/null <<EOF 189c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo#!/etc/../bin/sh 190c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymoecho "postinst" 191c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymoexit 0 192c975d7bc6767711c4802e104c4a9d4731910c9beAlex DeymoEOF 193c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo 194c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo sudo chmod +x "${mntdir}"/postinst "${mntdir}"/bin/* 195c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo} 196c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo 1972e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# generate_fs <filename> <kind> <size> [block_size] [block_groups] 1982e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymogenerate_fs() { 1992e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local filename="$1" 2002e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local kind="$2" 2012e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local size="$3" 2022e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local block_size="${4:-4096}" 2032e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local block_groups="${5:-}" 2042e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 2052e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local mkfs_opts=( -q -F -b "${block_size}" -L "ROOT-TEST" -t ext2 ) 2062e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo if [[ -n "${block_groups}" ]]; then 2072e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo mkfs_opts+=( -G "${block_groups}" ) 2082e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo fi 2092e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 2102e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local mntdir=$(mktemp --tmpdir -d generate_ext2.XXXXXX) 2112e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo trap 'cleanup "${mntdir}"; rm -f "${filename}"' INT TERM EXIT 2122e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 2132e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo # Cleanup old image. 2142e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo if [[ -e "${filename}" ]]; then 2152e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo rm -f "${filename}" 2162e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo fi 2172e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo truncate --size="${size}" "${filename}" 2182e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 2192e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo mkfs.ext2 "${mkfs_opts[@]}" "${filename}" 2202e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo sudo mount "${filename}" "${mntdir}" -o loop 2212e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 2222e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo case "${kind}" in 223bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymo unittest) 2242e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo add_files_ue_settings "${mntdir}" "${block_size}" 225c975d7bc6767711c4802e104c4a9d4731910c9beAlex Deymo add_files_postinstall "${mntdir}" "${block_size}" 2262e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo ;; 2272e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo default) 2282e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo add_files_default "${mntdir}" "${block_size}" 2292e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo ;; 230c90be63117cdad2622694b6f9ac2aec65fa80bf0Alex Deymo empty) 231c90be63117cdad2622694b6f9ac2aec65fa80bf0Alex Deymo ;; 2322e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo esac 2332b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 2342b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo cleanup "${mntdir}" 2352b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo trap - INT TERM EXIT 2362b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo} 2372b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 23804ef2078a1c17733b363971394dacad5f5f5b524Alex DeymoOUTPUT_DIR=$(dirname "$0") 23904ef2078a1c17733b363971394dacad5f5f5b524Alex DeymoIMAGES=() 24004ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo 24104ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo# generate_image <image_name> [<image args> ...] 24204ef2078a1c17733b363971394dacad5f5f5b524Alex Deymogenerate_image() { 24304ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo echo "Generating image $1.img" 24404ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo IMAGES+=( "$1.img" ) 24504ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo generate_fs "${OUTPUT_DIR}/$1.img" "${@:2}" 24604ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo} 2472b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 24804ef2078a1c17733b363971394dacad5f5f5b524Alex Deymomain() { 24904ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo # Add more sample images here. 25004ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo generate_image disk_ext2_1k default 16777216 1024 25104ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo generate_image disk_ext2_4k default 16777216 4096 252c90be63117cdad2622694b6f9ac2aec65fa80bf0Alex Deymo generate_image disk_ext2_4k_empty empty $((1024 * 4096)) 4096 253bb0c067bf37c98cc55b6c79c1174084b1e0c9b0bAlex Deymo generate_image disk_ext2_unittest unittest $((1024 * 4096)) 4096 25404ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo 25504ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo # Generate the tarball and delete temporary images. 25604ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo echo "Packing tar file sample_images.tar.bz2" 25704ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo tar -jcf "${OUTPUT_DIR}/sample_images.tar.bz2" -C "${OUTPUT_DIR}" \ 2583275606278533a27f61263e39718acc8d77afebbAlex Deymo --sparse "${IMAGES[@]}" 25904ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo cd "${OUTPUT_DIR}" 26004ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo rm "${IMAGES[@]}" 26104ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo} 2622b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 26304ef2078a1c17733b363971394dacad5f5f5b524Alex Deymomain 264