#!/bin/bash shopt -s nullglob PATH=/sbin:$PATH msg() { printf '%s: %s: %s\n' "$0" "$1" "$2" >&2; } die() { msg Error "${*:-exiting on fatal error.}"; exit 1; } warn() { msg Warning "${*:-Something is wrong.}"; } notice() { msg Notice "$*"; } validate_name() { case "$1" in *[^a-zA-Z0-9_]*) false ;; *) true ;; esac } read_config_file() { validate_name "$img" || { warn "invalid name: $img"; return 1; } while read line do line=${line%%#*} # ignore comments k=${line%%=*} v=${line#*=} [ "$k" -a "$k" != "$line" ] || return eval "conf_${1}_$k=\$v" done < "$1".conf } inquire_var() { _inquire_var "$img" "$1"; } _inquire_var() { local v v=conf_${1}_${2} v=${!v} if [ "$v" ] then eval "$2=\$v" else false fi } require_var() { _require_var "$img" "$1"; } _require_var() { _inquire_var "$@" || die "Missing required field '$2' for image file '$1'" } get_root_hash() { sed -ne 's/^Root hash:[ \t]*//p' "$1" } require_exists() { local f for f do [ -f "$f" ] || die "Not a file: $f" done } set -e builddir=_build mkdir -p "$builddir" for f in part*.conf do notice "Processing $f" img=${f%.conf} read_config_file "$img" || warn "Received error return from command: read_config_file $img" require_var name require_var type case "$type" in efi-system-partition|bios-grub|samizdat-*) ;; dm-verity-hashes|dm-verity-data) require_var data_path ;; *) die "invalid type: $type" ;; esac imgfile=$builddir/$img if inquire_var rebuild then case "$rebuild" in always) ;; never) ;; *) die "invalid value for field 'rebuild': $rebuild" ;; esac fi if [ "$rebuild" = 'always' ] || [ ! -e "$imgfile" -a "$rebuild" != 'never' ] then if [ -e "$imgfile" ] then notice "Image file exists: $imgfile" fi case "$type" in dm-verity-hashes|dm-verity-data) require_var data_path require_exists "$data_path" "$data_path".verity "$data_path".verity.log root_hash=$(get_root_hash "$data_path".verity.log) [ ${#root_hash} = 64 ] ;; *) require_var allocation tmp=$imgfile~tmp fallocate -l "$allocation" "$tmp" ;; esac case "$type" in efi-system-partition) mkfs.vfat "$tmp" || die "mkfs.vfat failed" ;; bios-grub) mkfs.vfat "$tmp" || die "mkfs.vfat failed" ;; samizdat-keys) mkfs.btrfs -q "$tmp" || die "mkfs.btrfs failed" ;; dm-verity-data) partuuid=${root_hash:0:32} cp -f -T --reflink "$data_path" "$builddir"/"$partuuid" ln -sfT "$partuuid" "$tmp" ;; dm-verity-hashes) partuuid=${root_hash:32:32} cp -f -T --reflink "$data_path".verity "$builddir"/"$partuuid" ln -sfT "$partuuid" "$tmp" ;; *) die "Unrecognized type: $type" ;; esac mv -T "$tmp" "$imgfile" notice "Successfully wrote $imgfile" fi done