#!/bin/bash
TIMEOUT=30 #timeout for vstorage put-diskinfo in seconds

[ ! -x /usr/sbin/smartctl ] && exit 0

[ ! -f /usr/libexec/vstorage/service-lib.sh ] && exit 1

source /usr/libexec/vstorage/service-lib.sh

SYSTEMD_TOOL="/usr/bin/systemctl"

check_service_status() {
	local daemon_name="$1"
        local cluster_name="$2"
	local service_id="$3"

	local service="vstorage-${daemon_name}.${cluster_name}.${service_id}.service"
	local status=$($SYSTEMD_TOOL is-active $service 2>/dev/null)
	[ "$status" == "active" ] && return 0

	return 1
}

get_block_device() {
	local path="$1"
	local id="$2"
	local dev=`df $path | grep "^\/dev" | awk '{ print $1 }'`
	[ -z "$dev" ] && return

        dev_path=`readlink -f $dev 2>/dev/null`
	[ -z "$dev_path" ] && return

	local dev_name=`echo $dev_path | sed -e 's/\/dev\///g'`
	if [ -d /sys/block/$dev_name/slaves/ ] && [ -n "$(ls -A /sys/block/$dev_name/slaves/)" ]; then
		ls /sys/block/$dev_name/slaves 2>/dev/null | while read block_dev ; do
			block_dev=`readlink -f /sys/block/$dev_name/slaves/$block_dev 2>/dev/null`
			if [ -n $block_dev  ]; then
				dev=`dirname $block_dev`
				echo "`basename $dev` $id"
			fi
		done
	else
		echo "$dev_name $id"
	fi
}

get_disk_info() {
        local cluster_name="$1"
        local path="$2"
	# skip deleted
	[ ! -d $path -o -f "$path/.deleted" ] && return

        if [ "$LIST_FILE" == "mds.list" ];
        then 
                id=`cat $path/id 2>/dev/null` 

		#skip stopped
		check_service_status "mdsd" "$cluster_name" "$id"
		[ $? -ne 0 ] && return
        fi

        if [ "$LIST_FILE" == "cs.list" ];
        then 
                id=`cat $path/control/id 2>/dev/null`
		[ "$id" = "init" ] && return

		#skip stopped
		check_service_status "csd" "$cluster_name" "$id"
		[ $? -ne 0 ] && return
	
		journal=`readlink -f $path/control/journal 2>/dev/null`
		[ -n "$journal" -a -d "$journal" ] && get_block_device "$journal" "$id"
        fi

	get_block_device "$path" "$id"
}

get_list() {
	local cluster="$1"
	LIST_FILE="cs.list"
	for_cluster get_disk_info $cluster
	LIST_FILE="mds.list"
	for_cluster get_disk_info $cluster
}

ls /etc/vstorage/clusters 2>/dev/null | while read cluster
do
	disks=`get_list $cluster`
	ls /sys/block 2>/dev/null | while read disk
	do
		ids=`echo "$disks" | grep "^$disk" | awk '{ print "-S " $2 }' | uniq | tr '\n' ' '`
		if [ -n "$ids" ] ; then
			$CTL_TOOL -c $cluster -t $TIMEOUT put-diskinfo -d "/dev/$disk" $ids 2>/dev/null &
		fi
	done
done

