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