#! /bin/sh
# Copyright (c) 2010, Novell Inc.
#
# Author: adrian@suse.de
#
# /etc/init.d/obsstoragesetup
#   and its symbolic link
# /usr/sbin/rcobsstoragesetup
#
### BEGIN INIT INFO
# Provides:          obsstoragesetup
# X-Start-Before:    mysql
# Required-Start:    $remote_fs boot.lvm
# Required-Stop:     $null
# Default-Start:     3 5
# Default-Stop:      0 1 2 4 6
# Description:       Finds the storage device to be used for OBS server and/or worker
### END INIT INFO

. /etc/rc.status

. /etc/sysconfig/obs-server

if [ "$OBS_STORAGE_AUTOSETUP" != "yes" ]; then
   echo "OBS Storage Autosetup is not enabled in sysconfig, skipping!"
   exit 0
fi

# Determine the base and follow a runlevel link name.
base=${0##*/}
link=${base#*[SK][0-9][0-9]}

backenddir=/srv/obs

rc_reset
case "$1" in
	start)
		echo "Looking for OBS Server LVM Volume"
                if [ -e /dev/OBS/server ]; then
			[ -d /obs ] || { rm -f /obs; mkdir /obs ; }
			mount /dev/OBS/server /obs
			[ -d /obs/log ] || mkdir /obs/log
			[ -d /obs/run ] || mkdir /obs/run
			chown obsrun.obsrun /obs/{,log,run}
		else
			echo "Setup local storage"
               		if [ -e /obs -a ! -L /obs ]; then
	       			echo "/obs already exists !"
               		        exit 1
               		fi
			ln -sf $backenddir /obs
                fi
		echo "Looking for OBS Worker Cache LVM Volume"
                if [ -e /dev/OBS/cache ]; then
			mkdir -p /OBS.worker/cache
			mount /dev/OBS/cache /OBS.worker/cache

			echo "OBS_WORKER_DIRECTORY=\"/OBS.worker/\""  > /etc/buildhost.config
			echo "OBS_CACHE_DIR=\"/OBS.worker/cache\""   >> /etc/buildhost.config
			CACHEMB=`df -m /OBS.worker/cache | tail -n 1 | sed -n 's,^/dev/[^ ]*[ ]*\([^ ]*\).*,\1,p'`
			[ -z "$CACHEMB" ] && CACHEMB=`df -m /OBS.worker/cache | tail -n 1 | sed -n 's,[^ ]*[ ]*\([^ ]*\).*,\1,p'`
			[ -n "$CACHEMB" ] && echo "OBS_CACHE_SIZE=\"$(( $CACHEMB / 2 ))\"" >> /etc/buildhost.config
			if [ -e /sys/hypervisor/type ]; then
				echo "OBS_USE_XEN=\"yes\""           >> /etc/buildhost.config
			fi
        		if [ -e /sys/hypervisor/type ] && grep -q xen /sys/hypervisor/type; then
				echo "Found XEN virtualization"
				RUN_VIRT=1
			else
				if grep ^flags /proc/cpuinfo | grep -q " vmx " && modprobe kvm; then
					echo "Found KVM virtualization"
					RUN_VIRT=1
                                        # support virtio
                                        # FIXME: find a better way to do this without getting remove by kiwi again.
                                        if ! grep -q "^INITRD_MODULES=.*virtio_pci virtio_blk" /etc/sysconfig/kernel; then
                                           sed -i 's,^INITRD_MODULES="\(.*\)",INITRD_MODULES="\1 binfmt_misc virtio_pci virtio_blk",' /etc/sysconfig/kernel
                                           mkinitrd
                                        fi
				else
					echo "*** NO virtualization found, BUILDING IN UNSECURE ENVIROMENT ***"
					unset RUN_VIRT
				fi
			fi
			OBS_WORKER_INSTANCES="0"
			for i in /dev/OBS/worker_root* ; do
				name="${i##*/worker_}"
				swap="/dev/OBS/worker_swap${i#/dev/OBS/worker_root}"
				[ -e $swap ] || continue
				if [ -n "$RUN_VIRT" ]; then
					#prepare xen or kvm setup
					mkdir -p "/OBS.worker/$name"
					ln -sf "$i"    "/OBS.worker/$name/root"
					ln -sf "$swap" "/OBS.worker/$name/swap"
				else
					#plain chroot build
					mkdir -p "/OBS.worker/$name"
					mount $i "/OBS.worker/$name"
				fi
				OBS_WORKER_INSTANCES=$(( $OBS_WORKER_INSTANCES + 1 ))
			done
			echo "OBS_WORKER_INSTANCES=\"$OBS_WORKER_INSTANCES\"" >> /etc/buildhost.config
			# Memory which can be used
                        TOTALMEM=$(( `free | sed -n 's/^Mem:[ ]*\([^ ]*\).*/\1/p'` / 1024 ))
                        INSTANCEMEM=$(( $TOTALMEM / ( 2 * $OBS_WORKER_INSTANCES ) ))
			echo "OBS_INSTANCE_MEMORY=\"$INSTANCEMEM\"" >> /etc/buildhost.config
                fi
		rc_status -v
	;;
	stop)
                # nothing to do
		rc_status -v
	;;
	restart)
                # nothing to do
		rc_status
	;;
	try-restart)
                # nothing to do
		rc_status
	;;
	reload)
                # nothing to do
		rc_status
	;;
	status)
		# nothing to do
		rc_status -v
	;;
	*)
		echo "Usage: $0 {start|stop|status|try-restart|restart|reload}"
		exit 1
	;;
esac
rc_exit
