#!/bin/bash
#
# rbdmap Ceph RBD Mapping
#
# chkconfig: 2345 20 80
# description: Ceph RBD Mapping

### BEGIN INIT INFO
# Provides:          rbdmap
# Required-Start:    $network
# Required-Stop:     $network
# 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/ceph/rbdmap"

. /lib/lsb/init-functions

modprobe rbd || exit 1

do_map() {
    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
        if [ ! -b /dev/rbd/$DEV ]; then
            log_progress_msg $DEV
            #rbd map $DEV $CMDPARAMS
            mons=`egrep 'mon[ _]host' /etc/ceph/ceph.conf | cut -f2 -d'=' | sed 's/ //g'`
            args=`echo $PARAMS | sed 's/id/name/g'`
            rbddev=`echo $DEV | tr '/' ' '`
            echo "$mons $args $rbddev" > /sys/bus/rbd/add
            [ $? -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
    # Recursive umount that depends /dev/rbd*
    MNTDEP=$(findmnt --mtab | awk '$2 ~ /^\/dev\/rbd[0-9]*$/ {print $1}' | sort -r)
    for MNT in $MNTDEP; do
        umount $MNT
    done 
    # Unmap all rbd device
    cd /sys/bus/rbd/devices/
    if ls * >/dev/null 2>&1; then
        for DEV in *; do
            log_progress_msg $DEV
            echo $DEV > /sys/bus/rbd/remove
            [ $? -ne "0" ] && RET=1
        done
    fi
    log_end_msg $RET
}


case "$1" in
  start)
    do_map
    ;;

  stop)
    do_unmap
    ;;

  reload)
    do_map
    ;;

  status)
    ls /sys/bus/rbd/devices/
    ;;

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

exit 0