diff --git a/zfs/zfs-media-drive.sh b/zfs/zfs-media-drive.sh index 6ffba24..e7de594 100644 --- a/zfs/zfs-media-drive.sh +++ b/zfs/zfs-media-drive.sh @@ -2,109 +2,93 @@ set -euo pipefail # @TODO: Implement more soft-coding and interactivity to this script -ZFS_KEY_LOC="file:///etc/zfs/keys/zroot.key" +ZFS_POOL_NAME="media" ZFS_COMPAT="openzfs-2.1-linux" +ZFS_KEY_LOC="file:///etc/zfs/keys/zroot.key" ZFS_KEY_FORMAT="passphrase" ZFS_COMPRESSION="zstd-3" -if [ -z "$1" ]; then - exit 1 -fi - -if [ -z "$3" ] && [ "$1" == "init" ]; then - ZFS_POOL_NAME="media" -else - if [ "$1" == "init" ]; then - ZFS_POOL_NAME="$3" - fi -fi - -if [ -z "$2" ] && [ "$1" == "init" ]; then - exit 1 -else - if [ "$1" == "init" ]; then - ZFS_TARGET_DRIVE="$2" # @NOTE typically, device name will be disk by-id and end with "-part1" given how it is to be used with other scripts - fi -fi - -if [ "$1" == "init" ]; then +create_zpool () { sudo zpool create \ -o ashift=12 \ -o autotrim=on \ - -o compatibility="$ZFS_COMPAT" \ + -o compatibility="$3" \ -O encryption=on \ - -O keylocation="$ZFS_KEY_LOC" \ - -O keyformat="$ZFS_KEY_FORMAT" \ + -O keylocation="$4" \ + -O keyformat="$5" \ -O acltype=posixacl \ -O xattr=sa \ -O dnodesize=auto \ - -O compression="$ZFS_COMPRESSION" \ + -O compression="$6" \ -O normalization=formD \ -O relatime=on \ -O canmount=off \ -O mountpoint=none \ - "$ZFS_POOL_NAME" \ - /dev/disk/by-id/"${ZFS_TARGET_DRIVE}" -elif [ "$1" == "ext" ]; then - if [ -z "$2" ]; then - exit 1 - else - ZFS_POOL_NAME="$2" - fi + "$2" \ + /dev/disk/by-id/"${1}" +} - ZFS_DATASET_OPTS="$3" - - shift 3 - - # @NOTE from this point on, @ must be list of arrays each containing two strings - for i in "$@"; do - mkdir -p "${i[0]}" - sudo zfs create "${ZFS_DATASET_OPTS}" -o mountpoint="${HOME}${i[0]}" "${ZFS_POOL_NAME}/${i[1]}" - done -fi - -if [ -z "$4" ] && [ "$1" == "init" ]; then - DATASET=("${HOME}/Documents/.calibre" "${ZFS_POOL_NAME}/LITERATURE") +create_datasets () { + DATASET=("${HOME}/Documents/.calibre" "${1}/LITERATURE") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" - DATASET=("${HOME}/Videos" "${ZFS_POOL_NAME}/FILM") + DATASET=("${HOME}/Videos" "${1}/FILM") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" - DATASET=("${HOME}/.var/app/com.valvesoftware.Steam" "${ZFS_POOL_NAME}/STEAMGAMES") + DATASET=("${HOME}/.var/app/com.valvesoftware.Steam" "${1}/STEAMGAMES") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" - DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${ZFS_POOL_NAME}/RARCHGAMES") + DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${1}/RARCHGAMES") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" - DATASET=("${HOME}/Games" "${ZFS_POOL_NAME}/GAMES") + DATASET=("${HOME}/Games" "${1}/GAMES") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" ln -s "${HOME}/.var/app/com.valvesoftware.Steam" "${DATASET[0]}/Steam" ln -s "${HOME}/.var/app/org.libretro.RetroArch" "${DATASET[0]}/libRetro" - DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${ZFS_POOL_NAME}/RARCHGAMES") + DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${1}/RARCHGAMES") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" - DATASET=("${HOME}/.XXX" "${ZFS_POOL_NAME}/XXX") + DATASET=("${HOME}/.XXX" "${1}/XXX") mkdir -p "${DATASET[0]}" sudo zfs create -o keylocation=prompt -o keyformat=passphrase -o mountpoint="${DATASET[0]}" "${DATASET[1]}" -else - if [ "$1" == "init" ]; then - ZFS_DATASET_OPTS="$4" +} - shift 4 +print_menu () { + echo "Placeholder content" +} - # @NOTE from this point on, @ must be list of arrays each containing two strings - for i in "$@"; do - mkdir -p "${i[0]}" - sudo zfs create "${ZFS_DATASET_OPTS}" -o mountpoint="${HOME}${i[0]}" "${ZFS_POOL_NAME}/${i[1]}" - done - else - exit 0 +while getopts "h" flag; do + case "$flag" in + h) print_menu;; + *) exit 1;; + esac +done + +if ! [ -z "$1" ] && [ "$1" == "init" ]; then + while getopts "d:p:k:f:c:v:" opt; do + case $opt in + k) ZFS_KEY_LOC="${OPTARG}";; + f) ZFS_KEY_FORMAT="${OPTARG}";; + c) ZFS_COMPRESSION="${OPTARG}";; + v) ZFS_COMPAT="${OPTARG}";; + p) ZFS_POOL_NAME="${OPTARG}";; + d) ZFS_TARGET_DRIVE="${OPTARG}";; + *) exit 1; + esac + done + + if [ -z "$ZFS_TARGET_DRIVE" ]; then + echo "It is necessary to argue a -d option." + exit 1 fi + + create_zpool "$ZFS_TARGET_DRIVE" "$ZFS_POOL_NAME" "$ZFS_COMPAT" "$ZFS_KEY_LOC" "$ZFS_KEY_FORMAT" "$ZFS_COMPRESSION" + create_datasets "$ZFS_POOL_NAME" fi