#!/bin/bash
# shellcheck shell=sh
# shellcheck disable=SC2034 
# shellcheck disable=SC2059
# shellcheck disable=SC1091
# shellcheck disable=SC1090

set -e
#set -x

if [ "$(id -u)" -ne 0 ]; then
	echo "$0 needs root: please use sudo."
	exit 1
fi

# Source Auxilium (args parser)
. /usr/share/auxilium/auxilium.sh

auxilium_init "$(basename "$0")" -m 'Reconfigure an HDD after replacing it'

auxilium_add fo_name -t positional -m 'Resolve by FO name (sdX or Box0Disk0)'

if [ -f "/usr/share/ferreus-orbit/common.sh" ]; then
	. "/usr/share/ferreus-orbit/common.sh"
elif [ -f "share/common.sh" ] ; then
	. "share/common.sh"
elif [ -e "../share/common.sh" ] ; then
	. "../share/common.sh"
else
	echo "Cannot load common.sh: exiting."
	exit 1
fi

auxilium_parse "$@"

fo_lock

if [ -z "$AUXILIUM_ARG_sh_completion" ]; then
	fo_init
fi

get_maj_min(){
  majmin=$(rep ",${1}" "${VAR_PATH}/maj_min_map"| cut -d',' -f1)
  if [ -z "$majmin" ]; then
    echo "I can't determine the realname for /srv/node/${1}"
 		for name in /dev/sd[a-z]; do
			realname="/dev/${name}"
			if ! mount | grep -q "${realname}"; then
        echo "I found the disk /dev/${name} unmounted, do you want use it ? (y|n)" >&2
        read -r response
        if [ "$response" = "y" ]; then
          maj=$()
          # shellcheck disable=SC2183 # Stat return 2 args
          # shellcheck disable=SC2046 # For preserve 2 args
          majmin=$(printf "%d:%d" $(stat -c "0x%t 0x%T" "/dev/${name}"))
          break
        fi
      fi
    done
  fi
  echo "$majmin"
}

get_real_disk(){
  if [ -L "${SORTED_PATH}/$1" ];then
    realdisk=$(basename "$(realpath "${SORTED_PATH}/${1}")")
  else
    maj_min=$(get_maj_min "$1")
    realdisk="$(lsblk | grep " ${maj_min} " | cut -d' ' -f1)"
  fi
  echo "$realdisk"
}

# shellcheck disable=SC2154
readonly OLD_DISK="$AUXILIUM_ARG_fo_name"

REALDISK=$(get_real_disk "$OLD_DISK")
readonly REALDISK
OLD_UUID=$(grep -m1 "/srv/node/${OLD_DISK}" /etc/fstab| awk '{print $1}' | sed -e 's/[#]*UUID=//')
readonly OLD_UUID

echo "===> udevadm trigger new devices"
udevadm trigger -t devices

eval "$(udevadm info -q property --export "/dev/${REALDISK}" 2>/dev/null)"

echo "===> Updater firmware of /dev/${REALDISK}"
fo-fw-updater "/dev/$REALDISK" 

if [ "$FO_DEFAULT_RAID0" -eq 1 ]; then
  echo "===> Create Raid0 on /dev/${REALDISK}"
  did=$(fo_get_id)
  fo-configure-raid0 "$did" || exit 1
fi

echo "===> Formating /dev/${REALDISK} (for /srv/node/${OLD_DISK})"
mkfs.xfs -f "/dev/${REALDISK}" || exit 1
echo "===> Get new UUID"
NEW_UUID=$(blkid -o value -s UUID "/dev/${REALDISK}")
readonly NEW_UUID
echo "===> Uncommenting from fstab, ${OLD_UUID} to ${NEW_UUID}"
sed -i "s/[#]*UUID=${OLD_UUID}/UUID=${NEW_UUID}/" /etc/fstab
echo "===> Reloading systemd after fstab edit"
systemctl daemon-reload
sleep 1
echo "===> Mounting /srv/node/${OLD_DISK}"
mount "/srv/node/${OLD_DISK}" || exit 1
sleep 1
if mount | grep -q "/srv/node/${OLD_DISK}"; then
  echo "===> Changing disk's owner"
  chown swift:swift "/srv/node/${OLD_DISK}"
else
  echo "Waiting 5 seconds for device mounted"
  sleep 5
  if mount | grep -q "/srv/node/${OLD_DISK}"; then
    echo "===> Changing disk's owner"
    chown swift:swift "/srv/node/${OLD_DISK}"
  else
    echo "Device not mounted, manually mount it and chown owner of mount_point to swift:swift"
    exit 1
  fi
  exit 1
fi
echo "===> Truncating /var/log/kern-legacy.log"
if [ -e /var/log/kern-legacy.log ] ; then
  printf "" >/var/log/kern-legacy.log
fi

echo
echo "Device /srv/node/${OLD_DISK} correctly replace"
