#!/usr/bin/bash
#
# /opt/45drives/ubm/patch_vdev_id_conf $env{UBM_SLOT_NAME} $env{ID_PATH}
#
# Patches /etc/vdev_id.conf alias path for given drive
#
# Part of 45drives-tools
#
# Authors
# Josh Boudreau <jboudreau@45drives.com>

[ -z "$BASH" ] && echo "Must use bash" >&2 && exit 1

umask 022

SLOT_NAME=$1
SLOT_DEV_BY_PATH=$2

VDEV_ID_CONF=/etc/vdev_id.conf

PATCHED_COMMENT_TAG="# Patched by $(realpath "$0") via /usr/lib/udev/rules.d/67-ubm.rules (or 68-0-custom-aliases.rules)"

[ -z "$SLOT_NAME" ] && echo "SLOT_NAME not given" >&2 && exit 0
[ -z "$SLOT_DEV_BY_PATH" ] && echo "SLOT_DEV_BY_PATH not given" >&2 && exit 0

generate_vdev_id_conf() {
  local TMPFILE
  # shellcheck source=./ubm_funcs.sh
  source "$(dirname -- "$(readlink -f -- "${BASH_SOURCE[0]}")")/ubm_funcs.sh"
  check_ubm_func_support || exit 0
  TMPFILE=$(mktemp)
  echo "# Generated by $(realpath "$0") via /usr/lib/udev/rules.d/67-ubm.rules (or 68-0-custom-aliases.rules)" > "$TMPFILE"
  ALL_SLOT_NAMES=$(all_slot_names) || perror "all_slot_names failed" || exit 0
  for slot_name in $ALL_SLOT_NAMES; do
    echo "alias $slot_name /dev/disk/by-path/non-existent-placeholder" >> "$TMPFILE"
  done
  mv "$TMPFILE" "$VDEV_ID_CONF"
}

(
  flock -w 30 200
  RESULT=$?
  [[ $RESULT != 0 ]] && exit 0
  [[ ! -f "$VDEV_ID_CONF" ]] && generate_vdev_id_conf
  FOUND_LINE=false
  TMPFILE=$(mktemp)
  LINE_TEST="^alias $SLOT_NAME"
  while IFS="" read -r line || [ -n "$line" ]; do
    if [[ "$line" =~ $LINE_TEST ]]; then
      FOUND_LINE=true
      printf "alias %s /dev/disk/by-path/%s\n" "$SLOT_NAME" "$SLOT_DEV_BY_PATH" >>"$TMPFILE"
    else
      printf '%s\n' "$line" >>"$TMPFILE"
    fi
  done <"$VDEV_ID_CONF"

  if ! $FOUND_LINE; then
    printf "alias %s /dev/disk/by-path/%s\n" "$SLOT_NAME" "$SLOT_DEV_BY_PATH" >>"$TMPFILE"
  fi

  grep -q "^$PATCHED_COMMENT_TAG$" "$TMPFILE" || echo "$PATCHED_COMMENT_TAG" >>"$TMPFILE"

  # sort entries, keeping comments on top
  sed -i 's/#/\x0/g' "$TMPFILE"
  sort --version-sort -o "$TMPFILE" "$TMPFILE"
  sed -i 's/\x0/#/g' "$TMPFILE"

  mv "$TMPFILE" "$VDEV_ID_CONF"
) 200>/var/lock/patch_vdev_id_conf.lock
