#!/bin/bash

### BEGIN INIT INFO
# Provides:          rbdmap
# Required-Start:    $network ocfs2
# Required-Stop:     $network ocfs2
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Ceph RBD Mapping
# Description:       Ceph RBD Mapping
### END INIT INFO

DESC="RBD Mapping"
RBDMAPFILE="/etc/rbdmap"

. /lib/lsb/init-functions

do_map() {

  service o2cb online
  [ $? -ne "0" ] && exit 0

  if [ ! -f "$RBDMAPFILE" ]; then
    log_warning_msg "$DESC : No $RBDMAPFILE found."
    exit 0
  fi

  log_daemon_msg "Starting $DESC"
  # Read /etc/rbdtab to create non-existant mapping
  newrbd=
  RET=0
  while read DEV PARAMS; do
    case "$DEV" in
      ""|\#*)
      continue
      ;;
      */*)
      ;;
      *)
      DEV=rbd/$DEV
      ;;
    esac
    OIFS=$IFS
    IFS=','
    for PARAM in ${PARAMS[@]}; do
      CMDPARAMS="$CMDPARAMS --$(echo $PARAM | tr '=' ' ')"
    done
    IFS=$OIFS
    #log_daemon_msg "rbd map $DEV $CMDPARAMS"
    if [ ! -b /dev/rbd/$DEV ]; then
      log_progress_msg $DEV
      rbd map $DEV $CMDPARAMS

      [ $? -ne "0" ] && RET=1
      newrbd="yes"
    fi
  done < $RBDMAPFILE
  log_end_msg $RET

  # Mount new rbd
  if [ "$newrbd" ]; then
                log_action_begin_msg "Mounting all filesystems"
    mount -a
    log_action_end_msg $?
  fi
}

do_unmap() {
  log_daemon_msg "Stopping $DESC"
  RET=0
  # Unmap all rbd device
  for DEV in /dev/rbd[0-9]*; do
    log_progress_msg $DEV
    # Umount before unmap
    MNTDEP=$(findmnt --mtab --source $DEV --output TARGET | sed 1,1d | sort -r)
    for MNT in $MNTDEP; do
      umount $MNT || sleep 1 && umount -l $DEV
    done
    rbd unmap $DEV
    [ $? -ne "0" ] && RET=1
  done
  log_end_msg $RET
}


case "$1" in
  start)
  do_map
  ;;

  stop)
  do_unmap
  ;;

  reload)
  do_map
  ;;

  status)
  rbd showmapped
  ;;

  *)
  log_success_msg "Usage: rbdmap {start|stop|reload|status}"
  exit 1
  ;;
esac

exit 0