#!/bin/bash

SYSTEMD_TOOL="/usr/bin/systemctl"
CONFIG_DIR="/etc/vstorage"

check_cluster() {
  local clustername=$1
  for cl in `ls $CONFIG_DIR/clusters`; do
    if [ $cl == "$clustername" ]
    then
	return 0
    fi
  done;
  return 1
}

get_lvm_devices() {
  local vg_name=$1
  local r=$2
  local devices=`pvs 2>/dev/null | grep $vg_name | awk '{print $1}' | sed -e 's/\/dev\///g' | sed ':a;N;$!ba;s/\n/,/g'` 
  if [ "$devices" != "" ]; then echo "($devices)"; fi
}

find_raid_device() {
  local devname=`echo $1 | sed -e 's/.dev.\(.*[0-9]\+\).*$/\1/g'`
  local result=`cat /proc/mdstat | grep "$devname : " | sed -e 's/ :.*$//g'` 
  echo "$result"
}

get_raid_info() {
  local devname=`echo $1 | sed -e 's/.dev.\(.*[0-9]\+\).*$/\1/g'`
  local devices=`ls /sys/block/$devname/slaves | sed ':a;N;$!ba;s/\n/,/g'`
  local raidtype=`cat /proc/mdstat | grep "$devname : " | sed -e 's/.*\(raid[0-9]\+\).*/\1/g' | sed -e 's/raid/Raid/g'` 
  if [ "$devices" != "" ]; then devices="($devices)"; fi
  echo "$raidtype $devices"
}

print_service_status() {
	local service="$1"
	local status=$($SYSTEMD_TOOL is-active $service 2>/dev/null)
	if [ "$status" == "active" ]; then
		local pid=$($SYSTEMD_TOOL status $service 2>/dev/null| grep "Main PID" | awk '{print $3}')
		[ -n "$pid" ] &&  pid=" [$pid]"
	fi
	echo "$status$pid"
}

for_services() {
	TYPE="$1"d
	local OP="$2"
	local CLUSTER_NAME="$3"
	services=$($SYSTEMD_TOOL --plain list-dependencies vstorage-$TYPE.$CLUSTER_NAME.target 2>/dev/null| grep "service" | tr '\n' ' ')
	for service in $services; do
		#extract path from service environmenr (DAEMON_DIR=/path)
		DAEMON_DIR=$($SYSTEMD_TOOL cat $service 2>/dev/null| grep -i "Environment" | grep -o '\/.*[^"]')
		("$OP" "${DAEMON_DIR}" "${service}")
	done;
}

show_path() {
	local path="$1"
	local service="$2"

	[ -z "$path" ] && return

	[ ! -d $path -o -f "$path/.deleted" ] && return

	if [ "$TYPE" == "mdsd" ];
	then 
		id=$(cat $path/id 2>/dev/null | head -n 1)
		t=MDS 
	fi

	if [ "$TYPE" == "csd" ];
	then 
		id=$(cat $path/control/id 2>/dev/null | head -n 1)
		t=CS
	fi
	dev=`df $path | grep "^\/dev" | awk '{ print $1 }'`
	if [ -n "$dev" ] ; then

	full_dev_path=`readlink -f $dev`
	dev_name=`echo $full_dev_path | sed -e 's/\/dev\///g'`
	if [ -d /sys/block/$dev_name/slaves/ ] && [ -n "$(ls -A /sys/block/$dev_name/slaves/)" ]
	then
		if [ "`find_raid_device $dev`" != "" ]
		then
			info=`get_raid_info $dev`
		else
			dev_name=`lvdisplay $dev 2>/dev/null`
			[ -n "$dev_name" ] && dev_name=`echo "$dev_name" | grep 'VG Name' | awk '{print $3}'`
			if [ -n "$dev_name" ]; then 
				full_dev_path=$dev_name
				lvm_devices=`get_lvm_devices $dev_name`
				info="LVM $lvm_devices"
			else
				info="LVM"
			fi
		fi
	else
		if [ ! -L "/sys/block/$dev_name" ]; then
			dev_name=`basename "$(readlink -f "/sys/class/block/$dev_name/..")"`
		fi
		if [ -L "/sys/block/$dev_name/device" ]; then
			disk_vendor=`cat /sys/block/$dev_name/device/vendor 2>/dev/null`
			disk_name=`cat /sys/block/$dev_name/device/model 2>/dev/null`
			[ -n "$disk_vendor" ] && info="$disk_vendor "
			info="$info$disk_name"
		else
			info="Unknown"
		fi
	fi

	else
		dev=`df $path | grep "DiskDescriptor.xml" | cut -d ' ' -f1`
		if [ -n "$dev" ] ; then
			dev=`grep $(dirname $dev) /proc/mounts | cut -d ' ' -f1`
                        full_dev_path=`readlink -f $dev`
                        info="PLOOP"
		fi

                if [ -z "$dev" ] ; then
                        full_dev_path="Unknown"
                        info="Unknown"
                fi
	fi

	service_enabled=$($SYSTEMD_TOOL is-enabled $service)
	if [ -n "$id" ]; then
		service_status=$(print_service_status $service)
	else
		id="unknown"
		service_status="unknown"
	fi
	echo "$t!$id!$service_enabled!$service_status!$full_dev_path!$info!$path" |awk -F '!' '{printf "%s\t%s\t%-20s\t%-20s\t%-30s %-35s %s\n",$1,$2,$3,$4,$5,$6,$7}'
}


if [ $# == 2 ]; then
	if [ "$2" == "-C" ]; then
		types="cs"
	elif [ "$2" == "-M" ]; then
		types="mds"
	fi
elif [ $# == 1 ]; then
	types="cs mds"
else
	exit 0
fi

cluster=$1
check_cluster $cluster
if [ $? -ne 0 ]; then
	echo "No such cluster: $cluster"
	exit 0
fi

echo "TYPE!ID!ENABLED!STATUS!DEVICE/VOLUME GROUP!DEVICE INFO!PATH" |awk -F '!' '{printf "%s\t%s\t%-20s\t%-20s\t%-30s %-35s %s\n",$1,$2,$3,$4,$5,$6,$7}'
for type in $types; do
	for_services $type show_path $cluster 
done;
