#!/usr/bin/env bash

# Buildroot wrapper to the collection of ext2/3/4 filesystem tools:
# - genext2fs, to generate ext2 filesystem images
# - tune2fs, to modify an ext2/3/4 filesystem (possibly in an image file)
# - e2fsck, to check and fix an ext2/3/4 filesystem (possibly in an image file)

set -e

main() {
    local OPT OPTARG
    local nb_blocks nb_inodes nb_res_blocks root_dir image gen rev label uuid
    local -a genext2fs_opts
    local -a tune2fs_opts
    local tune2fs_O_opts

    # Default values
    gen=2
    rev=1
    nb_extra_blocks=0
    nb_extra_inodes=0

    while getopts :hb:B:i:I:r:d:o:G:R:l:u: OPT; do
        case "${OPT}" in
        h)  help; exit 0;;
        b)  nb_blocks=${OPTARG};;
        B)  nb_extra_blocks=${OPTARG};;
        i)  nb_inodes=${OPTARG};;
        I)  nb_extra_inodes=${OPTARG};;
        r)  nb_res_blocks=${OPTARG};;
        d)  root_dir="${OPTARG}";;
        o)  image="${OPTARG}";;
        G)  gen=${OPTARG};;
        R)  rev=${OPTARG};;
        l)  label="${OPTARG}";;
        u)  uuid="${OPTARG}";;
        :)  error "option '%s' expects a mandatory argument\n" "${OPTARG}";;
        \?) error "unknown option '%s'\n" "${OPTARG}";;
        esac
    done

    # Sanity checks
    if [ -z "${root_dir}" ]; then
        error "you must specify a root directory with '-d'\n"
    fi
    if [ -z "${image}" ]; then
        error "you must specify an output image file with '-o'\n"
    fi
    case "${gen}:${rev}" in
    2:0|2:1|3:1|4:1)
        ;;
    3:0|4:0)
        error "revision 0 is invalid for ext3 and ext4\n"
        ;;
    *)  error "unknown ext generation '%s' and/or revision '%s'\n" \
               "${gen}" "${rev}"
        ;;
    esac

    # calculate needed inodes
    if [ -z "${nb_inodes}" ]; then
        nb_inodes=$(find "${root_dir}" | wc -l)
        nb_inodes=$((nb_inodes+400))
    fi
    nb_inodes=$((nb_inodes+nb_extra_inodes))

    # calculate needed blocks
    if [ -z "${nb_blocks}" ]; then
        # size ~= superblock, block+inode bitmaps, inodes (8 per block),
        # blocks; we scale inodes / blocks with 10% to compensate for
        # bitmaps size + slack
        nb_blocks=$(du -s -k "${root_dir}" |sed -r -e 's/[[:space:]]+.*$//')
        nb_blocks=$((500+(nb_blocks+nb_inodes/8)*11/10))
        if [ ${gen} -ge 3 ]; then
            # we add 1300 blocks (a bit more than 1 MiB, assuming 1KiB blocks)
            # for the journal
            # Note: I came to 1300 blocks after trial-and-error checks. YMMV.
            nb_blocks=$((nb_blocks+1300))
        fi
    fi
    nb_blocks=$((nb_blocks+nb_extra_blocks))

    # Upgrade to rev1 if needed
    if [ ${rev} -ge 1 ]; then
        tune2fs_O_opts+=",filetype"
    fi

    # Add a journal for ext3 and above
    if [ ${gen} -ge 3 ]; then
        tune2fs_opts+=( -j -J size=1 )
    fi

    # Add ext4 specific features
    if [ ${gen} -ge 4 ]; then
        tune2fs_O_opts+=",extents,uninit_bg,dir_index"
    fi

    # Add our -O options (there will be at most one leading comma, remove it)
    if [ -n "${tune2fs_O_opts}" ]; then
        tune2fs_opts+=( -O "${tune2fs_O_opts#,}" )
    fi

    # Add the label if specified
    if [ -n "${label}" ]; then
        tune2fs_opts+=( -L "${label}" )
    fi

    # Generate the filesystem
    genext2fs_opts=( -z -b ${nb_blocks} -N ${nb_inodes} -d "${root_dir}" )
    if [ -n "${nb_res_blocks}" ]; then
        genext2fs_opts+=( -m ${nb_res_blocks} )
    fi
    genext2fs "${genext2fs_opts[@]}" "${image}"

    # genext2fs does not generate a UUID, but fsck will whine if one
    # is missing, so we need to add a UUID.
    # Of course, this has to happen _before_ we run fsck.
    # Also, some ext4 metadata are based on the UUID, so we must
    # set it before we can convert the filesystem to ext4.
    # If the user did not specify a UUID, we generate a random one.
    # Although a random UUID may seem bad for reproducibility, there
    # already are so many things that are not reproducible in a
    # filesystem: file dates, file ordering, content of the files...
    tune2fs -U "${uuid:-random}" "${image}"

    # Upgrade the filesystem
    if [ ${#tune2fs_opts[@]} -ne 0 ]; then
        tune2fs "${tune2fs_opts[@]}" "${image}"
    fi

    # After changing filesystem options, running fsck is required
    # (see: man tune2fs). Running e2fsck in other cases will ensure
    # coherency of the filesystem, although it is not required.
    # 'e2fsck -pDf' means:
    #  - automatically repair
    #  - optimise and check for duplicate entries
    #  - force checking
    # Sending output to oblivion, as e2fsck can be *very* verbose,
    # especially with filesystems generated by genext2fs.
    # Exit codes 1 & 2 are OK, it means fs errors were successfully
    # corrected, hence our little trick with $ret.
    ret=0
    e2fsck -pDf "${image}" >/dev/null || ret=$?
    case ${ret} in
       0|1|2) ;;
       *)   errorN ${ret} "failed to run e2fsck on '%s' (ext%d)\n" \
                   "${image}" ${gen}
    esac
    printf "\n"
    trace "e2fsck was successfully run on '%s' (ext%d)\n" "${image}" ${gen}
    printf "\n"

    # Remove count- and time-based checks, they are not welcome
    # on embedded devices, where they can cause serious boot-time
    # issues by tremendously slowing down the boot.
    tune2fs -c 0 -i 0 "${image}"
}

help() {
    cat <<_EOF_
NAME
    ${my_name} - Create an ext2/3/4 filesystem image

SYNOPSIS
    ${my_name} [OPTION]...

DESCRIPTION
    Create ext2/3/4 filesystem image from the content of a directory.

    -b BLOCKS
        Create a filesystem of BLOCKS 1024-byte blocs. The default is to
        compute the required number of blocks.

    -i INODES
        Create a filesystem with INODES inodes. The default is to compute
        the required number of inodes.

    -r RES_BLOCKS
        Create a filesystem with RES_BLOCKS reserved blocks. The default
        is to reserve 0 block.

    -d ROOT_DIR
        Create a filesystem, using the content of ROOT_DIR as the content
        of the root of the filesystem. Mandatory.

    -o FILE
        Create the filesystem in FILE. Madatory.

    -G GEN -R REV
        Create a filesystem of generation GEN (2, 3 or 4), and revision
        REV (0 or 1). The default is to generate an ext2 revision 1
        filesystem; revision 0 is invalid for ext3 and ext4.

    -l LABEL
        Create a filesystem with label LABEL. The default is to not set
        a label.

    -u UUID
        Create filesystem with uuid UUID. The default is to set a random
        UUID.

  Exit status:
    0   if OK
    !0  in case of error
_EOF_
}

trace()  { local msg="${1}"; shift; printf "%s: ${msg}" "${my_name}" "${@}"; }
warn()   { trace "${@}" >&2; }
errorN() { local ret="${1}"; shift; warn "${@}"; exit ${ret}; }
error()  { errorN 1 "${@}"; }

my_name="${0##*/}"
main "$@"
