#!/bin/sh
#
# how to load> gdb -e ./.build_um/vmlinux
# in gdb do> run ubd0=/usr0/var/local/um/Fedora7-AMD64-root_fs eth0=tuntap,,,192.168.0.117 mem=256M
# in gdb do> handle SIGUSR1 pass nostop noprint
# in gdb do> break sys_init_module (for loading .ko syboles
# in gdb do> add-symbol-file path-to-.ko-file addar from above ()
#

# which iscsiadm
iscsiadm=iscsiadm

# Name of iscsi service. .e.g at /etc/init.d/
# ISCSI=iscsi
# ISCSI=open-iscsi
ISCSI=iscsid

# iscsi start command (In new fedora systems it's broken)
# ISCSI_START=start
ISCSI_START=force-start

# iscsi used to hold it's files in /etc/iscsi/... it has now moved
ISCSI_CFG=/var/lib/iscsi

# TODO: edit path to osd device
DEV_OSD0=/dev/osd0
DEV_OSD1=/dev/osd1

# TODO: Edit info of your target (only $IP_OSD is used)
#
# OSD 2 osc's osd-target
# SIM=tgtd
# IQN_OSD=bh-buildlin2.bhalevy.com
# IP_OSD=192.168.0.115:3260	# buml-host
IP_OSD=192.168.0.142:3260	# buildlin2
# IP_OSD=141.212.112.114:3260	# panasas-2
# IP_OSD=192.168.0.241:3260	# testlin1
# IP_OSD=192.168.0.242:3260	# testlin2
# IP_OSD=10.64.1.132 		# pref-x4

# 0SD 1 IBM
# SIM=ibm-osd-sim
# IQN_OSD=iqn.2004-11.com.ibm:fb:bh-buildlin2.bhalevy.com
# IP_OSD=192.168.0.142:3261

do_cmd()
{
	$* 2>&1 | logger &
}

start_sim()
{
# FIXME: We want output to go to the other terminal we could
#	do less some_file in the other consul and rederect
#	here to some_file
	prompt "start target_simulator in other terminal"
}
stop_sim()
{
	prompt "Stop! target_simulator in other terminal"
}

do_iscsi_clean()
{
	rm -vrf $ISCSI_CFG/ifaces/*
	rm -vrf $ISCSI_CFG/ifaces/.*

	rm -vrf $ISCSI_CFG/nodes/*
	rm -vrf $ISCSI_CFG/nodes/.*

	rm -vrf $ISCSI_CFG/send_targets/*
	rm -vrf $ISCSI_CFG/send_targets/.*
}

start_iscsi_intiator()
{
	if ! service $ISCSI status; then
		do_cmd service $ISCSI $ISCSI_START ;

		until cat /sys/class/iscsi_transport/tcp/handle 2>/dev/null ; do
			sleep 1;
		done
	fi
}

stop_iscsi_intiator()
{
	do_cmd service $ISCSI stop

	until [ -n `modprobe -l scsi_transport_iscsi` ]; do
		sleep 1;
	done
}

start_open_osd()
{
# In-tree
	modprobe osd;

# Out-of-tree
# 	until insmod ./drivers/scsi/osd/libosd.ko; do sleep 1; done
# 	until insmod ./drivers/scsi/osd/osd.ko; do sleep 1; done
# 	until insmod ./drivers/scsi/osd/osd_ktests.ko; do sleep 1; done
}
stop_open_osd()
{
# In-tree
	modprobe --remove osd;

# Out-of-tree
# 	rmmod osd_ktests
# 	rmmod osd
# 	rmmod libosd
}

# ISCSI_DBG=--debug=8
login_iscsi_osd()
{
	echo login into: $IP_OSD
	until $iscsiadm $ISCSI_DBG -m discovery -t sendtargets -p $IP_OSD --login; do 
		sleep 1; 
	done

	until ls $DEV_OSD0 2>/dev/null; do sleep 1; done
}
logout_iscsi_osd()
{
	do_cmd $iscsiadm -m node -p $IP_OSD --logout

	while ls $DEV_OSD0 2>/dev/null; do sleep 1; done
	sleep 1;

# 	echo "logout_iscsi_osd $IP_OSD wait..."
# 	sleep 7;
# 	ls /dev/osd*
}

kernel_test_osd()
{
	until insmod ./drivers/scsi/osd/osd_ktests.ko; do sleep 1; done

	./usr/osd_test --kernel=1 --usrlib=0 $DEV_OSD0
	./usr/osd_test --kernel=1 --usrlib=0 $DEV_OSD1

	rmmod osd_ktests
}

test_osd()
{
	./usr/osd_test --kernel=0 --usrlib=1 $DEV_OSD0
	./usr/osd_test --kernel=0 --usrlib=1 $DEV_OSD1
}

do_osdblk()
{

# create
# 	usr/osdblk --create --pid=0x10017 --oid=0x10017 --length=100M /dev/osd0

# probe

# load_object
	modprobe osdblk
	echo $((0x10017)) $((0x10017)) /dev/osd0 > /sys/class/osdblk/add

# unload
# 	echo 0 > /sys/class/osdblk/remove

}

prompt()
{
	read -p "$* >>> "
}

case $1 in
stop)
	echo $0 Stopping | logger

	logout_iscsi_osd

	stop_iscsi_intiator

	stop_open_osd

	echo $0 Stopped | logger
	;;

test)
	test_osd
	;;

kernel_test)
	kernel_test_osd
	;;

osdblk)
	do_osdblk
	;;

login)
	login_iscsi_osd
	;;

logout)
	logout_iscsi_osd
	;;

iscsi_clean)
	do_iscsi_clean
	;;
*)
	if [ "$1" != "start" ] && [ -n "$1" ]; then
		echo "what is $0 $1?!?"
		exit
	fi
	echo $0 Starting | logger

	start_iscsi_intiator
	start_open_osd

	login_iscsi_osd

	echo $0 Initialized | logger
	;;
esac
