#!/bin/bash
__doc__="
This logic is for formating and mounting a new drive. This handles:

* formatting the disk with a filesystem (btrfs)
* adding it to fstab
* creating the mount point
* mounting it
* modifying directory permissions so all new folders should default to the smart group

To setup the data see:
    horologic_flash_dvc_setup.py
"

####
## NOTE: flashfs inode usage is a bit constraining
# https://github.com/archlinux/archinstall/issues/771


# Install packages for the f2fs filesystem
# F2FS (Flash-Friendly File System)
# https://en.wikipedia.org/wiki/F2FS
# https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.14-File-Systems
#sudo apt-get install f2fs-tools -y  # Dont use F2FS, inodes are too low
# Use btrfs instead
sudo apt install btrfs-progs -y

# Output info about file systems to determine which disk devices to format
lsblk -fs
lsblk | grep disk

# Configure what device, filesystem, and mountpoint to use
DEVICE_DPATH=/dev/nvme0n1
MOUNT_NAME="flash"
MOUNT_DPATH=/$MOUNT_NAME
#FS_FORMAT="f2fs"
#FS_FORMAT="ext4"
FS_FORMAT="btrfs"

MOUNT_OWNER=root
MOUNT_GROUP=smart

# Force Unmount if necessary
#sudo fuser -km $DEVICE_DPATH
sudo umount $DEVICE_DPATH

# Format device filesystem
sudo mkfs -t "$FS_FORMAT" -f "$DEVICE_DPATH"


# Create mount point with group permissions
sudo mkdir -p "$MOUNT_DPATH"
sudo chown "$MOUNT_OWNER":"$MOUNT_GROUP" "$MOUNT_DPATH"

# Setup fstab to auto-mount the device on startup (if it doesnt exist)
FSTAB_LINE="${DEVICE_DPATH}  ${MOUNT_DPATH}              $FS_FORMAT    defaults        0 0  # from flash setup script"
grep "^$FSTAB_LINE" /etc/fstab || sudo sh -c "echo '$FSTAB_LINE' >> /etc/fstab"

# Mount the device if the mount point exists, but the device is unmounted
if [ -d $MOUNT_DPATH ]; then
    mountpoint "$MOUNT_DPATH"
    EXITCODE=$?
    if [ $EXITCODE -ne 0 ]; then
        # Mount the device right now
        sudo mount "$DEVICE_DPATH" "$MOUNT_DPATH"
    else
        echo "Device is already mounted"
    fi
else
    echo "Mount point does not exist"
fi

# After mounting set the owner and permissions

# Reset the owner on the mounted filesystem
sudo chown "$MOUNT_OWNER":"$MOUNT_GROUP" "$MOUNT_DPATH"
# Set group and user permissions to be permissive
# Restrict other permissions
sudo chmod ug+srwx $MOUNT_DPATH
sudo chmod o-rwx $MOUNT_DPATH

# Set file access control lists (ACL) so new directories and files are group read/write by default
# https://unix.stackexchange.com/questions/12842/make-all-new-files-in-a-directory-accessible-to-a-group
# Note: not all filesystems support ACL
#
# Install setfacl
sudo apt install acl
#
# Check the filesystem to ensure it is compatible with ACL
df "$MOUNT_DPATH" --output=source,fstype
#
sudo setfacl -d -m "group:${MOUNT_GROUP}:rwx" "$MOUNT_DPATH"
sudo setfacl -m "group:${MOUNT_GROUP}:rwx" "$MOUNT_DPATH"




__notes__='

# To Unmount
sudo umount $MOUNT_DPATH

'

# https://unix.stackexchange.com/questions/176666/how-do-i-know-acls-are-supported-on-my-file-system
#tune2fs -o acl /dev/nvme0n1
#grep acl /etc/mke2fs.conf
