#!/bin/bash
#	diskless updatever
#

PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
[ -f /etc/hintadmind/config.db ] || exit 0
work_dir=/opt
now_dbver=$1
db_dir=/etc/hintadmind
config_db=${db_dir}/config.db
disk_db=${db_dir}/disk.db
client_db=${db_dir}/client.db
tmp_config_db=${work_dir}/config.db
tmp_disk_db=${work_dir}/disk.db
tmp_client_db=${work_dir}/client.db
if [ -f /etc/hintver ]
then
	if  cat /etc/hintver |grep -q '-'
	then
		old_dbver=$(cat /etc/hintver|cut -d- -f2)
		[ -z "$old_dbver" ] && old_dbver="100101" 
	else
		old_dbver="100101"
	fi
else
	old_dbver="100101"
fi

updatedbfile()
{
	dbfile=$1
	dbfile_bak=${1}_bak
	db_updatefile=$2
	if [ -f $db_updatefile ]
	then
		[ -f $dbfile_bak ] && rm -fr $dbfile_bak
		[ -f $dbfile ] && mv $dbfile $dbfile_bak
		mv $db_updatefile $dbfile	
	fi
}
##########################################################################
##########################################################################

if [ $old_dbver -lt 100710 ]
then
	echo update $old_dbver to $now_dbver diskless_001
	/etc/init.d/hadmind stop
	[ -f $tmp_config_db ] && rm -fr $tmp_config_db
	[ -f $tmp_disk_db ] && rm -fr $tmp_disk_db
	[ -f $tmp_client_db ] && rm -fr $tmp_client_db


####################################################

	max=$(${work_dir}/dbget $config_db max_client)
	vdisk_ethlist=$(${work_dir}/dbget $config_db vdisk_ethlist)
	data_list=$(${work_dir}/dbget $config_db data_list)
	write_dev=$(${work_dir}/dbget $config_db write_back)
	system_list=$(${work_dir}/dbget $config_db system_list)
	xunshan=$(${work_dir}/dbget $config_db xunshan)

#	echo max=$max vdisk_ethlist=$vdisk_ethlist data_list=$data_list write_dev=$write_dev
	${work_dir}/dbput $tmp_config_db max $max
	${work_dir}/dbput $tmp_config_db vdisk_ethlist $vdisk_ethlist
	${work_dir}/dbput $tmp_config_db xunshan $xunshan

###################### set write disk
	${work_dir}/dbput $tmp_config_db  writeback_list write
	write_dev_s=$(echo $write_dev  |cut -d/ -f3)
	${work_dir}/dbput $tmp_config_db  write_dev $write_dev
	${work_dir}/dbput $tmp_config_db  write_dir /mnt/$write_dev_s
	${work_dir}/dbput $tmp_config_db  ${write_dev_s}_function writeback

	${work_dir}/dbput $tmp_config_db  data_list $data_list
	${work_dir}/dbput $tmp_config_db  image_list $system_list
#################### set data disk

	for data_disk in $(echo $data_list | tr ',' ' ')
	do
		disk_dev=$(${work_dir}/dbget $config_db ${data_disk}_location)
		data_size=$(${work_dir}/dbget $config_db ${data_disk}_size)
		data_dev_s=$(echo $disk_dev  |cut -d/ -f3)
		${work_dir}/dbput $tmp_config_db  ${data_disk}_dev $disk_dev
		${work_dir}/dbput $tmp_config_db  ${data_dev_s}_function data
		${work_dir}/dbput $tmp_config_db  ${data_disk}_size $[$data_size*1024]
	done
#################### update client_db
	for clientdb in $(${work_dir}/dbget $client_db -a | cut -d= -f1)
	do
		 data=$(${work_dir}/dbget $client_db $clientdb)
		 ${work_dir}/dbput $tmp_client_db  ${clientdb} ${data}#write
	done
####################  update disk_db
	for diskdb in $(${work_dir}/dbget $disk_db -a | cut -d= -f1)
	do
		 data=$(${work_dir}/dbget $disk_db $diskdb)
		 ${work_dir}/dbput $tmp_disk_db  ${diskdb} ${data}#write
	done
################### save super disk
	for image_disk in $(echo $system_list | tr ',' ' ')
	do
		ramdisk=$(${work_dir}/dbget $config_db ${image_disk}_ramdisk)
		if [ "$(${work_dir}/dbget $config_db ${image}_ramdisk }_ramdisk )" == "yes" ]
      		then
                	${work_dir}/dbput $tmp_config_db image_${image_disk}_ramdisk  on
       		fi
                if [ -f /mnt/Caches/${image_disk}_init ]
                then
                        [ -f /mnt/Caches/super_${image_disk} ] && rm -fr /mnt/Caches/super_${image_disk}
                        if [ "$ramdisk" == "yes" ]
                        then
               		         [ -f /mnt/system/$image_disk ] && rm -fr /mnt/system/$image_disk
                        fi
                        echo  save super_disk : $image_disk
                        cp -fr /mnt/Caches/$image_disk /mnt/Caches/super_${image_disk} && rm -fr /mnt/Caches/${image_disk}_init
                else
                        if [ ! -f /mnt/Caches/super_${image_disk} ]
                        then
                       		 echo  save super_disk : $image_disk
                       		 cp -fr /mnt/Caches/$image_disk /mnt/Caches/super_${image_disk}
                        fi
                fi
	done
#################### stop vdisk
        cowdev_status=$(cowdev -l)
        if [ -n "$cowdev_status" ]
        then
                disk_status=$(get_vdisk_status 0 0)
                if [ "$disk_status" == "on" ]
                then
                        echo "set /dev/rwsep/1 0 0 $iface" > /proc/vDisk
                fi
                /usr/sbin/cowsync
                cowdev -l |grep -q 'rwsep/1' && cowdev -d /dev/rwsep/1
                cowdev -l |grep -q 'rwsep/0' && cowdev -d /dev/rwsep/0
        fi

	[ -f /proc/vDisk ] && rmmod vDisk
	for f in $(losetup -a | cut -d: -f1)
        do
                losetup -d $f
        done
	ps -A|grep -q bootio && killall -9 bootio
	ps -A|grep -q in.tftpd && killall -9 in.tftpd 
################### remount write disk
	mount |grep -q /mnt/Caches && umount /mnt/Caches
	[ -b /mnt/${write_dev_s} ] || mkdir -p /mnt/${write_dev_s}
        mount -o noatime $write_dev /mnt/${write_dev_s}
	rm -fr  /mnt/${write_dev_s}/*tmp_*
	[ -b /mnt/${write_dev_s}/Caches ] || mkdir -p /mnt/${write_dev_s}/Caches

################### update image_list
	for image_disk in $(echo $system_list | tr ',' ' ')
	do
		ramdisk=$(${work_dir}/dbget $config_db ${image_disk}_ramdisk)
		if [ "$(${work_dir}/dbget $config_db ${image}_ramdisk }_ramdisk )" == "yes" ]
      		then
                	${work_dir}/dbput $tmp_config_db image_${image_disk}_ramdisk  on
       		fi
		image_size=$(${work_dir}/dbget $config_db ${image_disk}_size)
		${work_dir}/dbput $tmp_config_db  image_${image_disk}_size $[$image_size*1024]
		${work_dir}/dbput $tmp_config_db  image_${image_disk}_dir write
		mv /mnt/${write_dev_s}/${image_disk} /mnt/${write_dev_s}/${image_disk}_image
		mv /mnt/${write_dev_s}/super_${image_disk} /mnt/${write_dev_s}/super_${image_disk}_image
		[ -b /mnt/${write_dev_s}/${image_disk} ] || mkdir -p /mnt/${write_dev_s}/${image_disk}
		mv  /mnt/${write_dev_s}/${image_disk}_image /mnt/${write_dev_s}/${image_disk}/image
		mv  /mnt/${write_dev_s}/super_${image_disk}_image /mnt/${write_dev_s}/${image_disk}/super_image
		######### update pf db
		pf_list=$(${work_dir}/dbget $config_db ${image_disk}_pf_list)
		${work_dir}/dbput /mnt/${write_dev_s}/${image_disk}/profile.db pf_list $pf_list
		for pf in $(echo $pf_list | tr ',' ' ')	
		do
			profile=$(${work_dir}/dbget $config_db ${image_disk}_profile${pf} | cut -d# -f1)
			profile_comment=$(${work_dir}/dbget $config_db ${image_disk}_profile${pf} | cut -d# -f2)
			${work_dir}/dbput /mnt/${write_dev_s}/${image_disk}/profile.db profile${pf} $profile
			${work_dir}/dbput /mnt/${write_dev_s}/${image_disk}/profile.db profile${pf}_comment $profile_comment
		done
	done
################## bootserver config
	${work_dir}/dbput $tmp_config_db prefix  $(${work_dir}/dbget $config_db prefix )
	${work_dir}/dbput $tmp_config_db prelength  $(${work_dir}/dbget $config_db prelength )
	${work_dir}/dbput $tmp_config_db begin  $(${work_dir}/dbget $config_db begin )
	${work_dir}/dbput $tmp_config_db begin_ip  $(${work_dir}/dbget $config_db ip_begin )
	${work_dir}/dbput $tmp_config_db netmask  $(${work_dir}/dbget $config_db netmask )
	${work_dir}/dbput $tmp_config_db gateway  $(${work_dir}/dbget $config_db gateway )
	${work_dir}/dbput $tmp_config_db dns1  $(${work_dir}/dbget $config_db dns_list | cut -d, -f1 )
	${work_dir}/dbput $tmp_config_db dns2  $(${work_dir}/dbget $config_db dns_list | cut -d, -f2 )
	${work_dir}/dbput $tmp_config_db default_address  $(${work_dir}/dbget $config_db default_address )
	${work_dir}/dbput $tmp_config_db mode  $(${work_dir}/dbget $config_db mode )
	${work_dir}/dbput $tmp_config_db width  $(${work_dir}/dbget $config_db width )
	${work_dir}/dbput $tmp_config_db height  $(${work_dir}/dbget $config_db height )
	${work_dir}/dbput $tmp_config_db refresh  $(${work_dir}/dbget $config_db refresh )
	${work_dir}/dbput $tmp_config_db depth  $(${work_dir}/dbget $config_db depth )
	${work_dir}/dbput $tmp_config_db default_dataserver  $(${work_dir}/dbget $config_db dataserver )
	${work_dir}/dbput $tmp_config_db default_data  $(${work_dir}/dbget $config_db default_data )
	${work_dir}/dbput $tmp_config_db default_profile  $(${work_dir}/dbget $config_db profile )
	${work_dir}/dbput $tmp_config_db default_image  $(${work_dir}/dbget $config_db default_disk )
	${work_dir}/dbput $tmp_config_db rcache  $(${work_dir}/dbget $config_db rcache )
	${work_dir}/dbput $tmp_config_db wcache  $(${work_dir}/dbget $config_db wcache )
	${work_dir}/dbput $tmp_config_db default_writeback  write
	if [ "$(${work_dir}/dbget $config_db dhcp )" == "yes" ]
	then
		${work_dir}/dbput $tmp_config_db dhcp  on
	fi
	
################## update all db
	updatedbfile  $config_db $tmp_config_db
	updatedbfile  $disk_db $tmp_disk_db
	updatedbfile  $client_db $tmp_client_db

	/etc/init.d/kvdisk restart
	/etc/init.d/hadmind restart
	exit 0
fi
##########################################################################################
##########################################################################################

if [  "$old_dbver" -lt 100713 ]
then
	echo update $old_dbver to $now_dbver diskless_002
	/usr/local/bin/mountdisk -a
        for image_disk in $(hintget image_list | tr ',' ' ')
        do
                profile_path=$(${work_dir}/dbget $config_db $(${work_dir}/dbget $config_db image_${image_disk}_dir)_dir)/${image_disk}/profile.db
		pf_list=$(${work_dir}/dbget $profile_path ${image_disk}_pf_list)
		if [ -n "$pf_list" ]
		then
			${work_dir}/dbput ${profile_path}_tmp pf_list $pf_list
	                for pf in $(echo $pf_list | tr ',' ' ')
	                do
                	        profile=$(${work_dir}/dbget $profile_path ${image_disk}_profile${pf})
                	        profile_comment=$(${work_dir}/dbget $profile_path ${image_disk}_profile${pf}_comment)
                       		${work_dir}/dbput  ${profile_path}_tmp profile${pf} $profile
                       		${work_dir}/dbput ${profile_path}_tmp profile${pf}_comment $profile_comment
	                done
			rm -fr $profile_path
			mv ${profile_path}_tmp $profile_path
		
		fi
        done
	/etc/init.d/hadmind restart
	exit 0
fi
