#!/bin/bash
#Diagnostics utility
set -x
dirname=$1

if [ "$dirname" = "" ]; then
	echo "Diagnostics directory name not specified"
	exit 1
fi

logger "start diagnostics"

copy_file() {
	logger "copy_file $1"
	size=`stat --printf=%s $1`
	if [ "$?" != 0 ]; then
		return
	fi
	bname=`basename $1`
	if [ $size -le 2097152 ]; then 
		cp -f $1 $dirname/$bname 2>&1
		chmod +r $dirname/$bname
	else
		tail -n 262144 $1 > $dirname/$bname 2>&1
	fi
}

get_interface_stats() {
	iname=$1

	echo -e "\ninterface output for $iname" >> $dirname/iface.txt
	echo      "*************************" >> $dirname/iface.txt
	/sbin/ifconfig $iname >> $dirname/iface.txt 2>&1
	/sbin/ethtool $iname >> $dirname/iface.txt 2>&1
}

dump_ip_stats() {
	ip a >> $dirname/iface.txt 2>&1
	ip -s a >> $dirname/iface.txt 2>&1
	list=`ip a | cut -f 2 -d' ' | grep ':' | cut -f 1 -d ':'`
	for i in $list; do
		if [ "$i" != "" ]; then
			get_interface_stats $i
		fi
	done
}

dump_interface_stats() {
	if [ ! -f /sbin/ifconfig ]; then
		dump_ip_stats
		return
	fi

	/sbin/ifconfig >> $dirname/iface.txt 2>&1
	list=` /sbin/ifconfig  | cut -f 1 -d' '`
	for i in $list; do
		if [ "$i" != "" ]; then
			get_interface_stats $i
		fi
	done
	netstat -plnt >> $dirname/iface.txt 2>&1
	netstat -s >> $dirname/iface.txt 2>&1
	netstat -ie >> $dirname/iface.txt 2>&1
}

logger "Get interface stats"
dump_interface_stats

dump_scsi_info() {
	echo -e "\nproc scsi output" >> $dirname/scsi.txt
	echo      "****************" >> $dirname/scsi.txt
	cat /proc/scsi/scsi >> $dirname/scsi.txt

	echo -e "\nsg map output" >> $dirname/scsi.txt
	echo      "*************" >> $dirname/scsi.txt
	lsscsi -g >> $dirname/scsi.txt
}

logger "Dump scsi info"
dump_scsi_info

get_md_info() {
	dev="/dev/$1"

	echo -e "\nmdstat output for $dev" >> $dirname/md.txt
	echo      "************************" >> $dirname/md.txt
	/sbin/mdadm --detail $dev >> $dirname/md.txt 2>&1
}

dump_mdstats() {
	echo -e "\nproc mdstat output" >> $dirname/md.txt
	echo      "******************" >> $dirname/md.txt
	cat /proc/mdstat >> $dirname/md.txt

	mdlist=`cat /proc/mdstat | grep "^md" | cut -f 1 -d' '`
	for i in $mdlist; do
		get_md_info $i
	done
}

logger "Dump md stats"
dump_mdstats

dump_lvm() {
	echo "pvs output" > $dirname/lvm.txt
	echo      "******************" >> $dirname/lvm.txt
	pvs >> $dirname/lvm.txt

	echo -e "\nlvs output" >> $dirname/lvm.txt
	echo      "******************" >> $dirname/lvm.txt
	lvs >> $dirname/lvm.txt
}

logger "Dump LVM"
dump_lvm

dump_sysinfo() {
	echo -e "\nuname output" >> $dirname/sys.txt
	echo "****************" >> $dirname/sys.txt
	uname -a >> $dirname/sys.txt
	uptime >> $dirname/sys.txt

	echo -e "\nredhat release output" >> $dirname/sys.txt
	echo "****************" >> $dirname/sys.txt
	cat /etc/redhat-release >> $dirname/sys.txt 2>&1

	echo -e "\nproc cpuinfo output" >> $dirname/sys.txt
	echo       "******************" >> $dirname/sys.txt
	cat /proc/cpuinfo >> $dirname/sys.txt

	echo -e "\nproc cmdline output" >> $dirname/sys.txt
	echo       "******************" >> $dirname/sys.txt
	cat /proc/cmdline >> $dirname/sys.txt

	echo -e "\nproc devices output" >> $dirname/sys.txt
	echo       "******************" >> $dirname/sys.txt
	cat /proc/devices >> $dirname/sys.txt

	echo -e "\nproc interrupts output" >> $dirname/sys.txt
	echo       "*********************" >> $dirname/sys.txt
	cat /proc/interrupts >> $dirname/sys.txt

	echo -e "\nproc diskstats output" >> $dirname/sys.txt
	echo    "***********************" >> $dirname/sys.txt
	cat /proc/diskstats >> $dirname/sys.txt

	echo -e "\nmultipath output" >> $dirname/sys.txt
	echo    "***********************" >> $dirname/sys.txt
	multipath -ll >> $dirname/sys.txt 2>&1

	logger "Dump ps axu"
	echo -e "\nprocess information" >> $dirname/sys.txt
	echo    "*********************" >> $dirname/sys.txt
	ps axu >> $dirname/sys.txt

	logger "Dump ps axjf"
	echo -e "\nprocess tree information" >> $dirname/sys.txt
	echo    "**************************" >> $dirname/sys.txt
	ps axjf >> $dirname/sys.txt

	logger "top information"
	echo -e "\ntop output" >> $dirname/sys.txt
	echo    "**************************" >> $dirname/sys.txt
	top -b -n 1 >> $dirname/sys.txt 2> /dev/null

	logger "vmstat information"
	echo -e "\nvmstat information" >> $dirname/sys.txt
	echo    "********************" >> $dirname/sys.txt
	vmstat >> $dirname/sys.txt

	logger "lsmod information"
	echo -e "\nlsmod output" >> $dirname/sys.txt
	echo    "********************" >> $dirname/sys.txt
	/sbin/lsmod >> $dirname/sys.txt

	logger "iostat information"
	echo -e "\niostat output" >> $dirname/iostat.txt
	iostat -x >> $dirname/iostat.txt 2>&1

	logger "iotop information"
	echo -e "\niotop output" >> $dirname/iostat.txt
	iotop -b -n 1 >> $dirname/iostat.txt 2> /dev/null

	logger "df information"
	echo -e "\ndf output" >> $dirname/sys.txt
	df >> $dirname/sys.txt 2> /dev/null

	logger "mount information"
	echo -e "\nmount,fstab output" >> $dirname/sys.txt
	mount >> $dirname/sys.txt 2> /dev/null
	cat /etc/fstab >> $dirname/sys.txt 2> /dev/null

	logger "last information"
	echo -e "\nlast output" >> $dirname/sys.txt
	last -a >> $dirname/sys.txt 2> /dev/null

	logger "systemd unit files"
	echo -e "\nsystemd unit files" >> $dirname/sys.txt
	systemctl list-unit-files >> $dirname/sys.txt 2> /dev/null
}

logger "Dump sysinfo"
dump_sysinfo

dump_meminfo() {
	echo -e "\nproc meminfo output" >> $dirname/mem.txt
	echo      "*******************" >> $dirname/mem.txt
	cat /proc/meminfo >> $dirname/mem.txt

	echo -e "\nproc slabinfo output" >> $dirname/mem.txt
	echo      "********************" >> $dirname/mem.txt
	cat /proc/slabinfo >> $dirname/mem.txt

	echo -e "\nproc slab_allocators output" >> $dirname/mem.txt
	echo      "***************************" >> $dirname/mem.txt
	cat /proc/slab_allocators >> $dirname/mem.txt

	echo -e "\nfree cmd output" >> $dirname/mem.txt
	echo      "***************" >> $dirname/mem.txt
	free >> $dirname/mem.txt
	echo -e "\n" >> $dirname/mem.txt
	free -m >> $dirname/mem.txt

}

logger "Dump meminfo"
dump_meminfo

logger "Dump dmesg"
dmesg -s 2097152  > $dirname/dmesg.txt

rpmcmd=`which rpm`
if [ "$?" = "0" ]; then
	logger "Dump rpm db"
	rpm -qa > $dirname/rpmdb.txt
fi
dpkgcmd=`which dpkg`
if [ "$?" = "0" ]; then
	logger "Dump dpkg"
	dpkg --get-selections > $dirname/dpkg.txt
fi

for i in `ls -1 /var/log/messages* 2> /dev/null`;do
	copy_file $i
done

for i in `ls -1 /var/log/syslog* 2> /dev/null`;do
	copy_file $i
done
for i in `ls -1 /var/log/kernlog* 2> /dev/null`;do
	copy_file $i
done
for i in `ls -1 /var/log/dmesg* 2> /dev/null`;do
	copy_file $i
done

grep QUADSTOR_VIRT_VERSION /quadstor/src/common/commondefs.h > $dirname/version 2>&1

logger "copy quadstor.log"
cp /quadstor/etc/quadstor.log* $dirname/
chmod +r $dirname/quadstor.log*

cp -f /quadstor/etc/*.conf $dirname/

logger "copy tmp/*log"
mkdir -p $dirname/tmp
cp -f /quadstor/tmp/*.log $dirname/tmp/
cp -f /quadstor/tmp/*.txt $dirname/tmp/

cp -f /proc/iet/session $dirname/proc.iet.session

dump_sar() {
	sar -A > $dirname/sar.out
	i=1
	while [ $i -le 31 ]; do
		printf -v id "%02d" $i
		if [ -f /var/log/sa/sa${id} ]; then
			sar -A -f /var/log/sa/sa${id} > $dirname/sar${id}.out 2>&1
		fi
		let i=i+1
	done
}

logger "dump sar"
dump_sar

dump_sysblock() {
	echo -e "sys block output" > $dirname/sysblock.txt
	echo  "***************" >> $dirname/sysblock.txt
	ls -1 /sys/block >> $dirname/sysblock.txt
	echo -e "\nsys block long listing output" >> $dirname/sysblock.txt
	echo  "***************" >> $dirname/sysblock.txt
	ls -lR /sys/block >> $dirname/sysblock.txt
	echo -e "\nsys dev long listing output" >> $dirname/sysblock.txt
	echo  "***************" >> $dirname/sysblock.txt
	ls -lR /dev/ >> $dirname/sysblock.txt
}

logger "dump sysblock"
dump_sysblock

dump_sql() {
echo 'select * from sysinfo' | psql -p 9984 -U postgres qsdb > $dirname/sql.out 2>&1 
echo 'select * from storagegroup' | psql -p 9984 -U postgres qsdb >> $dirname/sql.out 2>&1 
echo 'select * from physstor' | psql -p 9984 -U postgres qsdb >> $dirname/sql.out 2>&1 
echo 'select * from tdisk' | psql -p 9984 -U postgres qsdb >> $dirname/sql.out 2>&1 
echo 'select * from vdrives' | psql -p 9984 -U postgres qsdb >> $dirname/sql.out 2>&1 
echo 'select * from iscsiconf' | psql -p 9984 -U postgres qsdb >> $dirname/sql.out 2>&1 
echo 'select * from fcconfig' | psql -p 9984 -U postgres qsdb >> $dirname/sql.out 2>&1 
echo 'select * from fchost' | psql -p 9984 -U postgres qsdb >> $dirname/sql.out 2>&1 
echo 'select * from fcport' | psql -p 9984 -U postgres qsdb >> $dirname/sql.out 2>&1 
echo 'select * from mirrorcheck' | psql -p 9984 -U postgres qsdb >> $dirname/sql.out 2>&1 
}

logger "dump sql"
dump_sql

if [ ! -f /var/log/messages -a ! -f /var/log/syslog ] ; then
	logger "journalctl"
	journalctl -n 262144 >> $dirname/journal.out 2>&1
fi

copy_file /quadstor/pgsql/pg.log
cp -f /quadstor/pgsqlsys/data/vtvrdedupe $dirname/ > /dev/null 2>&1
cp -f /quadstor/pgsql/data/vtvrdedupe $dirname/vtvrdedupe.1 > /dev/null 2>&1
cp -f /sys/class/dmi/id/product_uuid  $dirname/dmiid > /dev/null 2>&1

#Give read permisstions
chmod +r $dirname/*
chmod +r $dirname/tmp/*
logger "end diagnostics"
