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
90990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang  # FIFO
91990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang  sudo mkfifo "${mntdir}"/fifo
92990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang
93990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang  # character special file
94990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang  sudo mknod "${mntdir}"/cdev c 2 3
95990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang
962b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo  # removed: removed files that should not be listed.
972b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo  echo "We will remove this file so it's contents will be somewhere in the " \
982b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo    "empty space data but it won't be all zeros." |
992b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo    sudo dd of="${mntdir}"/removed conv=fsync status=none
1002b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo  sudo rm "${mntdir}"/removed
1012e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo}
1022e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo
1032e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# add_files_ue_settings <mntdir> <block_size>
1042e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# Add the update_engine.conf settings file. This file contains the
1052e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymoadd_files_ue_settings() {
1062e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  local mntdir="$1"
1072e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo
1082e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  sudo mkdir -p "${mntdir}"/etc >/dev/null
1092e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  sudo tee "${mntdir}"/etc/update_engine.conf >/dev/null <<EOF
1102e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoPAYLOAD_MINOR_VERSION=1234
1112e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoEOF
1122e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  # Example of a real lsb-release file released on link stable.
1132e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  sudo tee "${mntdir}"/etc/lsb-release >/dev/null <<EOF
1142e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_AUSERVER=https://tools.google.com/service/update2
1152e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_BOARD_APPID={F26D159B-52A3-491A-AE25-B23670A66B32}
1162e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_CANARY_APPID={90F229CE-83E2-4FAF-8479-E368A34938B1}
1172e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_DEVSERVER=
1182e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_APPID={F26D159B-52A3-491A-AE25-B23670A66B32}
1192e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BOARD=link-signed-mp-v4keys
1202e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BRANCH_NUMBER=63
1212e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BUILD_NUMBER=6946
1222e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BUILD_TYPE=Official Build
1232e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_CHROME_MILESTONE=43
1242e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_DESCRIPTION=6946.63.0 (Official Build) stable-channel link
1252e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_NAME=Chrome OS
1262e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_PATCH_NUMBER=0
1272e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_TRACK=stable-channel
1282e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_VERSION=6946.63.0
1292e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoGOOGLE_RELEASE=6946.63.0
1302e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoEOF
1312e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo}
1322e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo
133cbc2274c4160805bf726df872390112654816ca7Alex Deymoadd_files_postinstall() {
134cbc2274c4160805bf726df872390112654816ca7Alex Deymo  local mntdir="$1"
135cbc2274c4160805bf726df872390112654816ca7Alex Deymo
136cbc2274c4160805bf726df872390112654816ca7Alex Deymo  sudo mkdir -p "${mntdir}"/bin >/dev/null
137cbc2274c4160805bf726df872390112654816ca7Alex Deymo
138cbc2274c4160805bf726df872390112654816ca7Alex Deymo  # A postinstall bash program.
139cbc2274c4160805bf726df872390112654816ca7Alex Deymo  sudo tee "${mntdir}"/bin/postinst_example >/dev/null <<EOF
140cbc2274c4160805bf726df872390112654816ca7Alex Deymo#!/etc/../bin/sh
141cbc2274c4160805bf726df872390112654816ca7Alex Deymoecho "I'm a postinstall program and I know how to write to stdout"
142cbc2274c4160805bf726df872390112654816ca7Alex Deymoecho "My call was $@"
143cbc2274c4160805bf726df872390112654816ca7Alex Deymoexit 0
144cbc2274c4160805bf726df872390112654816ca7Alex DeymoEOF
145cbc2274c4160805bf726df872390112654816ca7Alex Deymo
146cbc2274c4160805bf726df872390112654816ca7Alex Deymo  # A symlink to another program. This should also work.
147cbc2274c4160805bf726df872390112654816ca7Alex Deymo  sudo ln -s "postinst_example" "${mntdir}"/bin/postinst_link
148cbc2274c4160805bf726df872390112654816ca7Alex Deymo
149cbc2274c4160805bf726df872390112654816ca7Alex Deymo  sudo tee "${mntdir}"/bin/postinst_fail3 >/dev/null <<EOF
150cbc2274c4160805bf726df872390112654816ca7Alex Deymo#!/etc/../bin/sh
151cbc2274c4160805bf726df872390112654816ca7Alex Deymoexit 3
152cbc2274c4160805bf726df872390112654816ca7Alex DeymoEOF
153cbc2274c4160805bf726df872390112654816ca7Alex Deymo
154cbc2274c4160805bf726df872390112654816ca7Alex Deymo  sudo tee "${mntdir}"/bin/postinst_fail1 >/dev/null <<EOF
155cbc2274c4160805bf726df872390112654816ca7Alex Deymo#!/etc/../bin/sh
156cbc2274c4160805bf726df872390112654816ca7Alex Deymoexit 1
157cbc2274c4160805bf726df872390112654816ca7Alex DeymoEOF
158cbc2274c4160805bf726df872390112654816ca7Alex Deymo
159d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo  # A program that succeeds if it is suspended during the first 5 minutes.
160d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo  sudo tee "${mntdir}"/bin/postinst_suspend >/dev/null <<EOF
161d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo#!/etc/../bin/sh
162d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymotrap "{ echo Got a SIGCONT; exit 0; }" CONT
163d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo# Signal that we are ready to receive the signal by redirecting our stdin to
164d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo# /dev/zero, the test can detect that.
165d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymoexec </dev/zero
166d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo# Allow the signal handler to run every 100 ms.
167d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymoi=3000
168d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymowhile [ \$i -ge 0 ]; do
169d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo  sleep 0.1
170d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo  i=\$((i-1))
171d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymodone
172d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymoexit 1
173d15c546ed794293d0a63770467a0f3c4c84c6214Alex DeymoEOF
174d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo
1750d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo  # A program that reports back progress.
1760d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo  sudo tee "${mntdir}"/bin/postinst_progress >/dev/null <<EOF
1770d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo#!/etc/../bin/sh
1780d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo# These values have exact representation in IEEE 754 so we avoid rounding
1790d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo# errors.
1800d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymoecho global_progress 0.25 >&3
1810d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymoecho global_progress 0.5 >&3
1820d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymoecho global_progress 1.0 >&3
1830d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymoexit 0
1840d29854cf5bb05a22cf161b50052539aa420a36eAlex DeymoEOF
1850d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo
186cbc2274c4160805bf726df872390112654816ca7Alex Deymo  # A postinstall bash program.
187cbc2274c4160805bf726df872390112654816ca7Alex Deymo  sudo tee "${mntdir}"/bin/self_check_context >/dev/null <<EOF
188cbc2274c4160805bf726df872390112654816ca7Alex Deymo#!/etc/../bin/sh
189cbc2274c4160805bf726df872390112654816ca7Alex Deymoecho "This is my context:"
190cbc2274c4160805bf726df872390112654816ca7Alex Deymols -lZ "\$0" | grep -F ' u:object_r:postinstall_file:s0 ' || exit 5
191cbc2274c4160805bf726df872390112654816ca7Alex Deymoexit 0
192cbc2274c4160805bf726df872390112654816ca7Alex DeymoEOF
193cbc2274c4160805bf726df872390112654816ca7Alex Deymo
194cbc2274c4160805bf726df872390112654816ca7Alex Deymo  sudo tee "${mntdir}"/postinst >/dev/null <<EOF
195cbc2274c4160805bf726df872390112654816ca7Alex Deymo#!/etc/../bin/sh
196cbc2274c4160805bf726df872390112654816ca7Alex Deymoecho "postinst"
197cbc2274c4160805bf726df872390112654816ca7Alex Deymoexit 0
198cbc2274c4160805bf726df872390112654816ca7Alex DeymoEOF
199cbc2274c4160805bf726df872390112654816ca7Alex Deymo
200cbc2274c4160805bf726df872390112654816ca7Alex Deymo  sudo chmod +x "${mntdir}"/postinst "${mntdir}"/bin/*
201cbc2274c4160805bf726df872390112654816ca7Alex Deymo}
202cbc2274c4160805bf726df872390112654816ca7Alex Deymo
2032e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# generate_fs <filename> <kind> <size> [block_size] [block_groups]
2042e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymogenerate_fs() {
2052e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  local filename="$1"
2062e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  local kind="$2"
2072e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  local size="$3"
2082e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  local block_size="${4:-4096}"
2092e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  local block_groups="${5:-}"
2102e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo
2112e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  local mkfs_opts=( -q -F -b "${block_size}" -L "ROOT-TEST" -t ext2 )
2122e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  if [[ -n "${block_groups}" ]]; then
2132e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo    mkfs_opts+=( -G "${block_groups}" )
2142e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  fi
2152e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo
2162e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  local mntdir=$(mktemp --tmpdir -d generate_ext2.XXXXXX)
2172e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  trap 'cleanup "${mntdir}"; rm -f "${filename}"' INT TERM EXIT
2182e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo
2192e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  # Cleanup old image.
2202e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  if [[ -e "${filename}" ]]; then
2212e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo    rm -f "${filename}"
2222e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  fi
2232e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  truncate --size="${size}" "${filename}"
2242e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo
2252e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  mkfs.ext2 "${mkfs_opts[@]}" "${filename}"
2262e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  sudo mount "${filename}" "${mntdir}" -o loop
2272e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo
2282e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  case "${kind}" in
229d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo    unittest)
2302e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo      add_files_ue_settings "${mntdir}" "${block_size}"
231cbc2274c4160805bf726df872390112654816ca7Alex Deymo      add_files_postinstall "${mntdir}" "${block_size}"
2322e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo      ;;
2332e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo    default)
2342e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo      add_files_default "${mntdir}" "${block_size}"
2352e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo      ;;
236c90be63117cdad2622694b6f9ac2aec65fa80bf0Alex Deymo    empty)
237c90be63117cdad2622694b6f9ac2aec65fa80bf0Alex Deymo      ;;
2382e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo  esac
2392b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo
2402b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo  cleanup "${mntdir}"
2412b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo  trap - INT TERM EXIT
2422b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo}
2432b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo
24404ef2078a1c17733b363971394dacad5f5f5b524Alex DeymoOUTPUT_DIR=$(dirname "$0")
24504ef2078a1c17733b363971394dacad5f5f5b524Alex DeymoIMAGES=()
24604ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo
24704ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo# generate_image <image_name> [<image args> ...]
24804ef2078a1c17733b363971394dacad5f5f5b524Alex Deymogenerate_image() {
24904ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo  echo "Generating image $1.img"
25004ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo  IMAGES+=( "$1.img" )
25104ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo  generate_fs "${OUTPUT_DIR}/$1.img" "${@:2}"
25204ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo}
2532b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo
25404ef2078a1c17733b363971394dacad5f5f5b524Alex Deymomain() {
25504ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo  # Add more sample images here.
256990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang  generate_image disk_ext2_1k default $((1024 * 1024)) 1024
257990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang  generate_image disk_ext2_4k default $((1024 * 4096)) 4096
258c90be63117cdad2622694b6f9ac2aec65fa80bf0Alex Deymo  generate_image disk_ext2_4k_empty empty $((1024 * 4096)) 4096
259d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo  generate_image disk_ext2_unittest unittest $((1024 * 4096)) 4096
26004ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo
26104ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo  # Generate the tarball and delete temporary images.
26204ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo  echo "Packing tar file sample_images.tar.bz2"
26304ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo  tar -jcf "${OUTPUT_DIR}/sample_images.tar.bz2" -C "${OUTPUT_DIR}" \
264a3553e42ce7255034044f364f72516b29417bbdcAlex Deymo    --sparse "${IMAGES[@]}"
26504ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo  cd "${OUTPUT_DIR}"
26604ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo  rm "${IMAGES[@]}"
26704ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo}
2682b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo
26904ef2078a1c17733b363971394dacad5f5f5b524Alex Deymomain
270