#!/bin/bash

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

get_maj_min(){
  local majmin=$(cat "${VAR_PATH}/maj_min_map" 2>/dev/null | grep ",${1}" | cut -d',' -f1)
  if [ -z "$majmin" ]; then
    echo "I can\'t determine the realname for /srv/node/${1}"
 		for name in $(ls /dev/|grep -E "sd[a-z]"|grep -v "[0-9]"); 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 response
        if [ "$response" == "y" ]; then
          majmin=$(ls -l /dev/${name} | awk '{print $5$6}'|tr ',' ':')
          break
        fi
      fi
    done
  fi
  echo "$majmin"
}

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

readonly OLD_DISK="$AUXILIUM_ARG_fo_name"

readonly REALDISK=$(get_real_disk $OLD_DISK)
readonly OLD_UUID=$(cat /etc/fstab | grep -m1 /srv/node/${OLD_DISK} | awk '{print $1}' | sed -e 's/[#]*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"
readonly NEW_UUID=$(blkid -o value -s UUID /dev/${REALDISK})
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
echo "===> Mounting /srv/node/${OLD_DISK}"
mount /srv/node/${OLD_DISK} || exit 1
sleep 2
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"
  exit 1
fi
echo "===> Truncating /var/log/kern-legacy.log"
if [ -e /var/log/kern-legacy.log ] ; then
  echo -n "" >/var/log/kern-legacy.log
fi

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