#===============================================================================
# SSS Firmware
#===============================================================================
# File 			:	lib_sss
# Who			:	JWB
# Descripttion	:	libray of sss script
#
# Copyright		:	LG ELECTRONICS INC.
# history 		:	2008.02.29 started first
#===============================================================================
. /etc/sss_script/event/lib_io
. /etc/sss_script/event/lib_vol

CONF_LIST=(
"/etc/cron/"
"/etc/ddnscli.conf"
"/etc/inadyn.conf"
"/etc/krb5.conf"
"/etc/nsswitch.conf"
"/etc/resolv.conf"
"/etc/hosts"
"/etc/time.conf"
"/etc/localtime"
"/etc/passwd"
"/etc/passwd-"
"/etc/shadow"
"/etc/shadow-"
"/etc/group"
"/etc/gshadow"
"/etc/mt-daapd.conf"
"/etc/hostname"
"/usr/local/netatalk/etc/netatalk/afppasswd"
"/usr/local/samba/private/smbpasswd"
"/etc/sss_script/services/service.conf"
"/etc/sss_script/services/ddns.conf"
"/etc/sss_script/email/alert.conf"
"/etc/sss_script/network/ifcfg-egiga0"
"/etc/sss_script/share/DB/ns1.db"
"/etc/sss_script/network/domain.conf"
"/etc/sss_script/share/codepage.conf"
"/usr/local/etc/ssmtp/ssmtp.conf"
"/etc/sss_script/event/sss_odd_fw_version"
"/etc/cms/cmsbackup.xml"
"/etc/cms/cmssync.xml"
"/etc/sss_script/services/timemachine.conf"
"/etc/exports"
)

LOG_LIST=(
"/var/log/notice.log"
"/var/log/file.smb"
"/var/log/samba.log"
"/var/log/messages"
"/var/log/xferlog"
"/var/log/proftpd/ftp.log"
"/var/log/oddsts.log"
)

#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_Eject()
{
	if [ "$1" = "" ]; then
		SSS_Open
	elif [ "$1" = "-t" ]; then
		SSS_Close
	elif [ "$1" = "-l" ]; then
		SSS_Load
	fi
}
SSS_Open()
{
	MSG_Once ${MSG[67]}
	umount -l /dev/sr0 > /dev/null 2>&1
	eject /dev/sr0
}
SSS_Close()
{
	MSG_Once ${MSG[68]}
	eject -t /dev/sr0
}
SSS_Load()
{
	MSG_Once ${MSG[69]}
	eject -t /dev/sr0
	mount /dev/sr0 > /dev/null 2>&1
}
SSS_InitPasswd()
{
	MSG_Add ${MSG[20]}
	/etc/sss_script/share/admin-init.sh
	SSS_SetInitPasswdComplete
	MSG_Remove ${MSG[20]}
	MSG_Once ${MSG[21]}
}
#===============================================================================
# Description	:	Check Lge Script file in mount point and Run that
# input 		:	mount point
# output 		:   1: Is there   0: Isn't there
#===============================================================================
SSS_CheckIsLgeScript()
{
	#echo "SSS_CheckLgeScriptAndRun($*)"
	if [ -f "${1}/ns1/${AUTOSCRIPT}" ] ; then
		/usr/local/bin/sss_mkscript -c "${1}/ns1/${AUTOSCRIPT}" > /dev/null 2>&1
		if [ $? = 0 ] ; then
			return 1
		fi
	fi
	return 0
}
SSS_LgeScriptRun()
{
	#echo "SSS_CheckLgeScriptAndRun($*)"
	MSG_Once ${MSG[88]}
	SSS_SetBuzzerLgeScriptStart
	
	killall ${AUTOSCRIPT} > /dev/null 2>&1
	killall dd > /dev/null 2>&1
	killall mosilt > /dev/null 2>&1
	killall mopilt > /dev/null 2>&1
	
	/usr/local/bin/sss_mkscript -d "${1}/ns1/${AUTOSCRIPT}" "/tmp/"${AUTOSCRIPT} > /dev/null 2>&1
	/tmp/${AUTOSCRIPT} "${1}/ns1"
	rm -rf /tmp/${AUTOSCRIPT}
	#MSG_Once ${MSG[89]}
	SSS_SetBuzzerLgeScriptEnd
}

#===============================================================================
# Description	:
# input 		:	1
# output 		:   1
#===============================================================================
SSS_DiskCheck()
{
	#echo "SSS_DiskCheck($*)"
	echo -e y | fsck -p /dev/md2

	if [ $? = 0 ] ; then
		echo "No Error" > /dev/console
#	else if [ $(($? & 0x01)) != 0 ] ; then
#		echo "FS Error Fixed" > /dev/console
#	else if [ $(($? & 0x02)) != 0 ] ; then
#		echo "Reboot requested" > /dev/console
#	else if [ $(($? & 0x04)) != 0 ] ; then
#		echo "FS Error remain" > /dev/console
#	else if [ $(($? & 0x08)) != 0 ] ; then
#		echo "Execute Error" > /dev/console
#	else if [ $(($? & 0x10)) != 0 ] ; then
#		echo "Usage Error" > /dev/console
#	else if [ $(($? & 0x80)) != 0 ] ; then
#		echo "Library Error" > /dev/console
	fi
}

#===============================================================================
# Description	:	SSS_OddUpgrade
# input 		:	1
# output 		:   1
#===============================================================================
SSS_OddUpgrade()
{
	#echo "SSS_OddUpgrade($*)"
	echo [`date`]"Odd Upgrade" $*  >> ${SSS_LOG_SYS_NOTICE}

	#detect ODD type[BD|DVD]
	if [[ `cut -b1-3 /sys/block/sr0/device/model` = "BD-" ]]
	then
		MSG_Add ${MSG[83]}
	else
		MSG_Add ${MSG[90]}
	fi
	#kill odd manager daemon
	killall oddmngrt
	
	#tray open
	umount -l /dev/sr0 > /dev/null 2>&1
	eject /dev/sr0
	
	#update
	chmod u+x /tmp/${1} 
	/tmp/${1}
	ret=$?
	rm /tmp/${1}
	# odd reset time
	sleep 5
	
	# to avoid sr1 mount
	echo "scsi remove-single-device 4 0 0 0" > /proc/scsi/scsi
	sleep 1
	echo "scsi add-single-device 4 0 0 0" > /proc/scsi/scsi
	#odd manager start
    /sbin/start-stop-daemon -S -q -b -x /usr/local/bin/oddmngrt
	
	if [[ `cut -b1-3 /sys/block/sr0/device/model` = "BD-" ]]
	then
		MSG_Remove ${MSG[83]}
	else
		MSG_Remove ${MSG[90]}
	fi
	if [ "$ret" = 0 ]; then
		SSS_GetDiskInfoAndSaveScsi
		
		echo "ODDFWUPDATE="`date +%-0y%-0m%-0d%-0H%-0M` > ${SSS_ODD_FW_LOG}
		
		if [[ `cut -b1-3 /sys/block/sr0/device/model` = "BD-" ]]
		then
			MSG_Once ${MSG[84]}
		else
			MSG_Once ${MSG[91]}
		fi
		eject -t /dev/sr0
		mount /dev/sr0 > /dev/null 2>&1
		#SSS_SetVolume
		return 0
	else
		MSG_Once ${MSG[85]}
		return 1
	fi
}
#===============================================================================
# Description	:
# input 		:	1
# output 		:   1
#===============================================================================
SSS_SystemUpgradeCheck()
{
	UpState=`cat ${SSS_FW_LOG} |tail -1`
	if [ "$UpState" = 70 ] || [ "$UpState" = 7 ]; then
		UpName=`cat ${SSS_FW_LOG} |head -1`
		SSS_SystemUpgradeBoot $UpName
		if [ $? = 0 ]; then
			eject -t /dev/sr0
			MSG_Once ${MSG[74]}
			SSS_SetBuzzerOk1
			reboot -d3 &
			sleep 10
		fi
	else
		rm -rf /tmp/* > /dev/null
	fi
}
SSS_SystemUpgradeBoot()
{
	#echo "SSS_SystemUpgrade($*)"
	echo [`date`]"System Upgrade Boot" $*  >> ${SSS_LOG_SYS_NOTICE}
	echo "${1}" > ${SSS_FW_LOG}
	n4b1_dir_new="/tmp/n4b1.new"
	cd /
	
	for upcnt in 1
	do	
		MSG_Remove Update; MSG_Add "Update[*******_]";
		#----------------------------------------
		# update
		UpState=70;	echo $UpState >> ${SSS_FW_LOG};
		echo [`date`]"Copy Firmware Boot" >> ${SSS_LOG_SYS_NOTICE}
		sync
		for updir in ${aUpDir[*]}
		do
			for retry in 1 2 3
			do
				nice --10 cp -af  ${n4b1_dir_new}/${updir} / > ${n4b1_dir_new}/update.log 2>&1
				if [ $? != 0 ]; then
					echo [`date`]"Warning : Copy Boot [${updir}: retry=${retry} ]" >> ${SSS_LOG_SYS_NOTICE}
					if [ "$retry" -le 2 ]; then
						# to copy dir to dir sym link
						cat ${n4b1_dir_new}/update.log |grep 'is not a directory' |cut -d "'" -f 2 |xargs rm -rf > /dev/null 2>&1
						# to copy dir sym link to dir
						cat ${n4b1_dir_new}/update.log |grep 'Is a directory' |cut -d "'" -f 2 |xargs rm -rf > /dev/null 2>&1
					 	continue
					fi
					UpState=8;	echo $UpState >> ${SSS_FW_LOG};
					echo [`date`]"Error : Copy Boot[${updir}]" >> ${SSS_LOG_SYS_NOTICE}
					break
				fi
			done
			#----------------------------------------
			[ "$UpState" = 8 ] && break;
		done
		[ "$UpState" = 8 ] && break;
		
		# update success1
		UpState=71;	echo $UpState >> ${SSS_FW_LOG};
		echo [`date`]"Copy Firmware End Boot" >> ${SSS_LOG_SYS_NOTICE}
		sync
		
		# remove n4b1_dir_new
		echo [`date`]"Remove RootBackup Boot" >> ${SSS_LOG_SYS_NOTICE}
		rm -rf ${n4b1_dir_new}
		rm /tmp/${1}
			
	done

	MSG_Remove Update; MSG_Add "Update[********]";
	echo [`date`]"ConfRestore Boot" >> ${SSS_LOG_SYS_NOTICE}
	SSS_ConfRestore
	
	if [ $? != 0 ]; then
		UpState=6; echo $UpState >> ${SSS_FW_LOG};
		echo [`date`]"Error : ConfRestore Boot" >> ${SSS_LOG_SYS_NOTICE}
	else
		if [ "$UpState" = 71 ]; then
			#----------------------------------------
			# update success 2
			UpState=77;	echo $UpState >> ${SSS_FW_LOG};
		fi
	fi

	if [ "$UpState" = 77 ]; then
		VOL_CheckConf
		MSG_Remove Update; MSG_Once ${MSG[76]}; sleep 3;
		echo [`date`]"System Upgrade_Success Boot" >> ${SSS_LOG_SYS_NOTICE}
		eject -t /dev/sr0
		MSG_Once ${MSG[74]}
		SSS_SetBuzzerOk1
		reboot -d3
		return 0
	else
		#----------------------------------------
		# restart service and smb config
		echo [`date`]"System Upgrade_StartService Boot" >> ${SSS_LOG_SYS_NOTICE}
		/etc/sss_script/share/query_share.sh
		/etc/init.d/services start
		
		MSG_Remove Update; MSG_Once ${MSG[85]} [Status:$UpState]
		echo [`date`]"System Upgrade_Fail Boot [Status:$UpState]" >> ${SSS_LOG_SYS_NOTICE}
		return 1
	fi
}
SSS_LogClear()
{
	for log in ${LOG_LIST[*]}  
	do
		cat /dev/null > ${log}
	done
}
SSS_SystemUpgrade()
{
	#echo "SSS_SystemUpgrade($*)"
	#MSG_Add ${MSG[75]}
	MSG_Add "Update[*_______]"; sleep 1;

	SSS_LogClear
	
	echo [`date`]"System Upgrade" $*  >> ${SSS_LOG_SYS_NOTICE}
	echo "${1}" > ${SSS_FW_LOG}
	
	cd /
	
	for upcnt in 1
	do	
		MSG_Remove Update; MSG_Add "Update[**______]"; sleep 1;
		#----------------------------------------
		# Check Available size of md0
		UpState=10;	echo $UpState >> ${SSS_FW_LOG};
		sizeroot=`VOL_Remain rootfs`
		if [ "$sizeroot" -le 400000000 ]; then
			UpState=1; echo $UpState >> ${SSS_FW_LOG};
			echo [`date`]"Error : Rootfs Not enouph" >> ${SSS_LOG_SYS_NOTICE}
			break
		fi
		
		#----------------------------------------
		# make temp dir
		UpState=20;	echo $UpState >> ${SSS_FW_LOG}
		n4b1_dir_new="/tmp/n4b1.new"
		[ -d "$n4b1_dir_new" ] && rm -rf $n4b1_dir_new;
		mkdir -p $n4b1_dir_new
		
#		nice --10 cp -a /etc ${n4b1_dir_new}/.
		MSG_Remove Update; MSG_Add "Update[***_____]";
		#----------------------------------------
		# decompress to n4b1_dir_new
		UpState=30;	echo $UpState >> ${SSS_FW_LOG}
		echo [`date`]"Decompress" >> ${SSS_LOG_SYS_NOTICE}
		nice --10 tar -xjvf /tmp/${1} -C ${n4b1_dir_new}/ > /dev/null 2>&1
		if [ $? != 0 ]; then
			UpState=2;	echo $UpState >> ${SSS_FW_LOG};
			echo [`date`]"Error : Decompress" >> ${SSS_LOG_SYS_NOTICE}
			rm -rf /tmp/${1}
			break
		fi
		MSG_Remove Update; MSG_Add "Update[****____]"; sleep 1;
		#----------------------------------------
		# check update dir and version check
		if  [ ! -d "${n4b1_dir_new}/bin"  ] && \
		    [ ! -d "${n4b1_dir_new}/boot" ] && \
			[ ! -d "${n4b1_dir_new}/etc"  ] && \
			[ ! -d "${n4b1_dir_new}/lib"  ] && \
			[ ! -d "${n4b1_dir_new}/sbin" ] && \
			[ ! -d "${n4b1_dir_new}/var" ] && \
			[ ! -d "${n4b1_dir_new}/usr"  ]; then
			# Invalid update file
			UpState=3; echo $UpState >> ${SSS_FW_LOG};
			echo [`date`]"Error : Invalid Update file" >> ${SSS_LOG_SYS_NOTICE}
			break
		fi
		
		# version model check
        if [ "$2" != "force" ]; then
            cur_version=`cat ${SSS_SYS_FW_LOG} |grep Date |awk '{print $NF}'`
            new_version=`cat ${n4b1_dir_new}${SSS_SYS_FW_LOG} |grep Date |awk '{print $NF}'`
				
            cur_model=`cat ${SSS_SYS_FW_LOG} |grep Model |awk '{print $NF}'`
            new_model=`cat ${n4b1_dir_new}${SSS_SYS_FW_LOG} |grep Model |awk '{print $NF}'`
			if [ ! -z "$cur_model" ]; then
				if [ "$cur_model" != "$new_model" ]; then
          	      	UpState=4; echo $UpState >> ${SSS_FW_LOG};
            	    echo [`date`]"Error : Invalid Model Name" >> ${SSS_LOG_SYS_NOTICE}
               	 	echo [`date`]"new_model:$new_model cur_model:$cur_model" >> ${SSS_LOG_SYS_NOTICE}
					break
				fi
			fi
            if [ "$cur_version" -gt "$new_version" ] || [ -z "$new_version" ]; then
                UpState=4; echo $UpState >> ${SSS_FW_LOG};
                echo [`date`]"Error : Down grade" >> ${SSS_LOG_SYS_NOTICE}
                echo [`date`]"new_version:$new_version cur_version:$cur_version" >> ${SSS_LOG_SYS_NOTICE}
                break
            fi
        fi
		#----------------------------------------
		# remove unnecessary update dir and copy
		UpState=40; echo $UpState >> ${SSS_FW_LOG};
		[ -d "${n4b1_dir_new}/dev" 	 ] && rm -rf ${n4b1_dir_new}/dev   > /dev/null 2>&1;
		[ -d "${n4b1_dir_new}/sys" 	 ] && rm -rf ${n4b1_dir_new}/sys   > /dev/null 2>&1;
		[ -d "${n4b1_dir_new}/home"  ] && rm -rf ${n4b1_dir_new}/home  > /dev/null 2>&1;
		[ -d "${n4b1_dir_new}/proc"  ] && rm -rf ${n4b1_dir_new}/proc  > /dev/null 2>&1;
		[ -d "${n4b1_dir_new}/tmp" 	 ] && rm -rf ${n4b1_dir_new}/tmp   > /dev/null 2>&1;
		[ -d "${n4b1_dir_new}/mnt" 	 ] && rm -rf ${n4b1_dir_new}/mnt   > /dev/null 2>&1;
		[ -f "${n4b1_dir_new}/linuxrc" ] && rm -rf ${n4b1_dir_new}/linuxrc > /dev/null 2>&1;

		MSG_Remove Update; MSG_Add "Update[*****___]"; sleep 1;
		#----------------------------------------
		# backup configure and service stop
		UpState=50;	echo $UpState >> ${SSS_FW_LOG};
		if [ "$2" != "force" ]; then
			echo [`date`]"ConfBackup" >> ${SSS_LOG_SYS_NOTICE}
			SSS_ConfBackup
		fi
		# stop service
		echo [`date`]"StopService" >> ${SSS_LOG_SYS_NOTICE}
		/etc/init.d/services stop
		
		MSG_Remove Update; MSG_Add "Update[******__]";
		#----------------------------------------
		# move n4b1_dir_new to / (upgrade) 
		UpState=60;	echo $UpState >> ${SSS_FW_LOG};
		echo [`date`]"Diff Firmware" >> ${SSS_LOG_SYS_NOTICE}
		aUpDir=(`ls ${n4b1_dir_new}/`)
		for updir in ${aUpDir[*]}
		do
			# same file remove
			diff -rsq ${n4b1_dir_new}/${updir} /${updir} |grep identical |cut -d' ' -f2 |xargs rm -rf > /dev/null 2>&1
		done

		MSG_Remove Update; MSG_Add "Update[*******_]";
		#----------------------------------------
		# update
		UpState=70;	echo $UpState >> ${SSS_FW_LOG};
		echo [`date`]"Copy Firmware" >> ${SSS_LOG_SYS_NOTICE}
		sync
		for updir in ${aUpDir[*]}
		do
			for retry in 1 2 3
			do
				nice --10 cp -af  ${n4b1_dir_new}/${updir} / > ${n4b1_dir_new}/update.log 2>&1
				if [ $? != 0 ]; then
					echo [`date`]"Warning : Copy [${updir}: retry=${retry} ]" >> ${SSS_LOG_SYS_NOTICE}
					if [ "$retry" -le 2 ]; then
						# to copy dir to dir sym link
						cat ${n4b1_dir_new}/update.log |grep 'is not a directory' |cut -d "'" -f 2 |xargs rm -rf > /dev/null 2>&1
						# to copy dir sym link to dir
						cat ${n4b1_dir_new}/update.log |grep 'Is a directory' |cut -d "'" -f 2 |xargs rm -rf > /dev/null 2>&1
					 	continue
					fi
					UpState=7;	echo $UpState >> ${SSS_FW_LOG};
					echo [`date`]"Error : Copy [${updir}]" >> ${SSS_LOG_SYS_NOTICE}
					break
				fi
			done
			#----------------------------------------
			[ "$UpState" = 7 ] && break;
		done
		[ "$UpState" = 7 ] && break;
		
		# update success1
		UpState=71;	echo $UpState >> ${SSS_FW_LOG};
		echo [`date`]"Copy Firmware End" >> ${SSS_LOG_SYS_NOTICE}
		sync
		
		# remove n4b1_dir_new
		echo [`date`]"Remove RootBackup" >> ${SSS_LOG_SYS_NOTICE}
		rm -rf ${n4b1_dir_new}
		rm /tmp/${1}
			
	done
	
	if [ "$UpState" = 7 ]; then	
		
		if [ "$2" != "force" ]; then
			echo [`date`]"ConfRestore" >> ${SSS_LOG_SYS_NOTICE}
			SSS_ConfRestore
		else
			rm -rf /mnt/fs/Vol1/*
			mount | grep '/mnt/fs/Vol1' > /dev/null
			[ $? = 0 ] && tar xjvf /boot/home.tar.bz2 -C /;
		fi
		#----------------------------------------
		# emergency recovery To Do
	fi

	if [ "$UpState" -ge 50 ]; then	
		MSG_Remove Update; MSG_Add "Update[********]";
		#----------------------------------------
		# restore configure
		if [ "$2" != "force" ]; then
			echo [`date`]"ConfRestore" >> ${SSS_LOG_SYS_NOTICE}
			SSS_ConfRestore
		else
			rm -rf /mnt/fs/Vol1/*
			mount | grep '/mnt/fs/Vol1' > /dev/null
			[ $? = 0 ] && tar xjvf /boot/home.tar.bz2 -C /;
		fi
		
		if [ $? != 0 ]; then
			UpState=6; echo $UpState >> ${SSS_FW_LOG};
			echo [`date`]"Error : ConfRestore" >> ${SSS_LOG_SYS_NOTICE}
		else
			if [ "$UpState" = 71 ]; then
				#----------------------------------------
				# update success 2
				UpState=77;	echo $UpState >> ${SSS_FW_LOG};
			fi
		fi
	fi

	if [ "$UpState" = 77 ]; then
		#SSS_VerSave
		#SSS_GetDiskInfoAndSaveScsi
		#SSS_SetServerVersion
		VOL_CheckConf
		MSG_Remove Update; MSG_Once ${MSG[76]}; sleep 3;
		echo [`date`]"System Upgrade_Success" >> ${SSS_LOG_SYS_NOTICE}
		#Check_GrepPs "lge_script" 
		#if [ $? = 0 ]; then
		#	killall lge_script
		#	shutdown
		#fi		
		echo upstat_OK
		# web rebooting
		return 0
	else
		#----------------------------------------
		# restart service and smb config
		echo [`date`]"System Upgrade_StartService" >> ${SSS_LOG_SYS_NOTICE}
		/etc/sss_script/share/query_share.sh
		/etc/init.d/services start
		
		MSG_Remove Update; MSG_Once ${MSG[85]} [Status:$UpState]
		echo [`date`]"System Upgrade_Fail[Status:$UpState]" >> ${SSS_LOG_SYS_NOTICE}
		if [ "$UpState" = 1 ]; then	
			# not enouph size
			echo upstat_NG1
		elif [ "$UpState" = 2 ]; then	
			# not decompress error
			echo upstat_NG2
		elif [ "$UpState" = 3 ]; then	
			# invalid update file
			echo upstat_NG2
		elif [ "$UpState" = 4 ]; then	
			# downgrade fw version
			echo upstat_NG3	
		else
			# 
			echo upstat_NG
		fi
		return 1
	fi
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SystemConfigurationInit()
{
	#echo "<< SYSTEM DEFAULT >>"
	MSG_Add ${MSG[71]}
	ifconfig egiga0 down
	/etc/init.d/services stop
	tar xjvf /boot/sys_default_bin.tar.bz2 -C /
	rm -rf /mnt/fs/Vol1/*
	tar xjvf /boot/home.tar.bz2 -C /
	cp /etc/sss_script/share/smb_global_general.conf /etc/sss_script/share/smb_global.conf
	/etc/sss_script/share/query_share.sh
	#MSG_Once ${MSG[72]}
	MSG_Remove ${MSG[71]}
	MSG_Once ${MSG[74]}
	reboot
	#echo "<< SYSTEM DEFAULT >>"
}
#===============================================================================
# Description	:	SSS_SystemInitialize
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SystemInitialize()
{
	echo [`date`]"SSS_SystemInitialize($*)" >> ${SSS_LOG_SYS_NOTICE}
	# delete n4b1 log
	SSS_LogClear
	#MSG_Add ${MSG[71]}
	MSG_Add "Initialize [1/7]"; sleep 1;
    # 0. pre check
	if [ ! -f $SSS_INITIAL_FW ] ; then
		echo [`date`]"System Initialize : Initial firmware does not exits ($SSS_INITIAL_FW)" >> ${SSS_LOG_SYS_NOTICE}
		MSG_Remove Initialize; MSG_Once ${MSG[85]}; sleep 3;
		echo initstat_NG1
		return 1
	fi

  	MSG_Remove Initialize; MSG_Add "Initialize [2/7]"; sleep 1;
	# 1. stop all service (except httpd)
	echo [`date`]"STEP 1 : Stop all services & disk job" >> ${SSS_LOG_SYS_NOTICE}
	/etc/init.d/services stop
	umount -af
	killall resize2fs
	killall mkfs.ext3
  	mdadm -S /dev/md*
	mdadm --zero-superblock --force /dev/sd[abcd]3

	# 2. update firmware
	#----------------------------------------------------------------------------------------
	echo [`date`]"STEP 2 : Initialize firmware" >> ${SSS_LOG_SYS_NOTICE}
	MSG_Remove Initialize; MSG_Add "Initialize [3/7]"; sleep 1;
	# make temp dir
	n4b1_dir_new="/tmp/n4b1.new"
	[ -d "$n4b1_dir_new" ] && rm -rf $n4b1_dir_new;
	mkdir -p $n4b1_dir_new
	
	#----------------------------------------
	# decompress to n4b1_dir_new
	echo [`date`]"Decompress" >> ${SSS_LOG_SYS_NOTICE}
	nice --10 tar -xjvf ${SSS_INITIAL_FW} -C ${n4b1_dir_new}/ > /dev/null 2>&1
	if [ $? != 0 ]; then
		echo [`date`]"Error : Decompress" >> ${SSS_LOG_SYS_NOTICE}
		rm -rf ${n4b1_dir_new}
		break
	fi
	MSG_Remove Initialize; MSG_Add "Initialize [4/7]"; sleep 1;
	#----------------------------------------
	# check update dir and version check
	if  [ ! -d "${n4b1_dir_new}/bin"  ] && \
	    [ ! -d "${n4b1_dir_new}/boot" ] && \
		[ ! -d "${n4b1_dir_new}/etc"  ] && \
		[ ! -d "${n4b1_dir_new}/lib"  ] && \
		[ ! -d "${n4b1_dir_new}/sbin" ] && \
		[ ! -d "${n4b1_dir_new}/var" ] && \
		[ ! -d "${n4b1_dir_new}/usr"  ]; then
		# Invalid update file
		echo [`date`]"Error : Invalid Update file" >> ${SSS_LOG_SYS_NOTICE}
		MSG_Remove Initialize; MSG_Once ${MSG[86]}
		echo initstat_NG2
		return 1
	fi

	#----------------------------------------
	# remove unnecessary update dir and copy
	[ -d "${n4b1_dir_new}/dev" 	 ] && rm -rf ${n4b1_dir_new}/dev   > /dev/null 2>&1;
	[ -d "${n4b1_dir_new}/sys" 	 ] && rm -rf ${n4b1_dir_new}/sys   > /dev/null 2>&1;
	[ -d "${n4b1_dir_new}/home"  ] && rm -rf ${n4b1_dir_new}/home  > /dev/null 2>&1;
	[ -d "${n4b1_dir_new}/proc"  ] && rm -rf ${n4b1_dir_new}/proc  > /dev/null 2>&1;
	[ -d "${n4b1_dir_new}/tmp" 	 ] && rm -rf ${n4b1_dir_new}/tmp   > /dev/null 2>&1;
	[ -d "${n4b1_dir_new}/mnt" 	 ] && rm -rf ${n4b1_dir_new}/mnt   > /dev/null 2>&1;
	[ -f "${n4b1_dir_new}/linuxrc" ] && rm -rf ${n4b1_dir_new}/linuxrc > /dev/null 2>&1;

	MSG_Remove Initialize; MSG_Add "Initialize [5/7]"; sleep 1;
	#----------------------------------------
	# move n4b1_dir_new to / (upgrade) 
	echo [`date`]"Diff Firmware" >> ${SSS_LOG_SYS_NOTICE}
	aUpDir=(`ls ${n4b1_dir_new}/`)
	for updir in ${aUpDir[*]}
	do
		# same file remove
		diff -rsq ${n4b1_dir_new}/${updir} /${updir} |grep identical |cut -d' ' -f2 |xargs rm -rf > /dev/null 2>&1
	done

	MSG_Remove Initialize; MSG_Add "Initialize [6/7]"; sleep 1;
	#----------------------------------------
	# update
	echo [`date`]"Copy Firmware" >> ${SSS_LOG_SYS_NOTICE}
	sync
	for updir in ${aUpDir[*]}
	do
		for retry in 1 2 3
		do
			nice --10 cp -af  ${n4b1_dir_new}/${updir} / > ${n4b1_dir_new}/update.log 2>&1
			if [ $? != 0 ]; then
				echo [`date`]"Warning : Copy [${updir}: retry=${retry} ]" >> ${SSS_LOG_SYS_NOTICE}
				if [ "$retry" -le 2 ]; then
					# to copy dir to dir sym link
					cat ${n4b1_dir_new}/update.log |grep 'is not a directory' |cut -d "'" -f 2 |xargs rm -rf > /dev/null 2>&1
					# to copy dir sym link to dir
					cat ${n4b1_dir_new}/update.log |grep 'Is a directory' |cut -d "'" -f 2 |xargs rm -rf > /dev/null 2>&1
				 	continue
				fi
				echo [`date`]"Error : Copy [${updir}]" >> ${SSS_LOG_SYS_NOTICE}
				MSG_Remove Initialize; MSG_Once ${MSG[86]}
				echo initstat_NG3
				return 1
			fi
		done
	done
	
	# update success1
	sync
	
	# remove n4b1_dir_new
	echo [`date`]"Remove RootBackup" >> ${SSS_LOG_SYS_NOTICE}
	rm -rf ${n4b1_dir_new}

	#----------------------------------------------------------------------------------------
	MSG_Remove Initialize; MSG_Add "Initialize [7/7]"; sleep 1;
	SSS_VerSave
	SSS_SetServerVersion
	VOL_CheckConf

    # 3. restart
	echo [`date`]"STEP 3 : Restart" >> ${SSS_LOG_SYS_NOTICE}
	eject -t /dev/sr0
	echo initstat_OK
	MSG_Remove Initialize; MSG_Once ${MSG[74]}; sleep 1;
	#SSS_SetBuzzerOk1
	#reboot -d3
	return 0
}
#===============================================================================
# Description	:   SSS_ConfCheck for restoring from PC
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_ConfCheck()
{
	SIZE_CONF_MAX=2048000
	if [ ! -f "$1" ]; then
		echo "CONF_NOFILE"
		return 1
	fi
	# Check Config File Size
	SIZE_CONF=`stat -c %s $1`
	
	if [ "$SIZE_CONF" -gt "$SIZE_CONF_MAX" ]; then
		echo "CONF_SIZE"
		return 2
	fi
	
	# Check Contents
	DIR_CONFCUR="/tmp/config_cur"
	DIR_CONFNEW="/tmp/config_new"
	
	rm ${DIR_CONFCUR} -rf > /dev/null
	rm ${DIR_CONFNEW} -rf > /dev/null
	
	mkdir ${DIR_CONFCUR}
	mkdir ${DIR_CONFNEW}
	
	tar cf - ${CONF_LIST[*]} | tar xf - -C ${DIR_CONFCUR} > /dev/null 2>&1
	tar -xjvf $1 -C ${DIR_CONFNEW} > /dev/null 2>&1
	if [ $? != 0 ]; then
		echo "CONF_TAR"
		rm ${DIR_CONFCUR} ${DIR_CONFNEW} -rf > /dev/null
		return 3
	fi

	diff -srq ${DIR_CONFCUR} ${DIR_CONFNEW} |grep -v '/rsync' |grep "Only in" > /dev/null 2>&1

	if [ $? = 0 ]; then
		echo "CONF_DIFF"
		rm ${DIR_CONFCUR} ${DIR_CONFNEW} -rf > /dev/null
		return 4
	fi
	
	echo "CONF_OK"
	return 0
}

SSS_ConfBackup()
{
	[ -d "$SSS_CONF_USER_DIR" ] || mkdir -p $SSS_CONF_USER_DIR;
	[ -f "$SSS_CONF_USER_LIST" ] || touch $SSS_CONF_USER_LIST;
	sConfig=(`cat $SSS_CONF_USER_LIST`)
	sCntBackup=`find ${SSS_CONF_USER_DIR}/Config_*.tar.bz2 2>/dev/null |awk 'END{print NR}'`
	if [ "$sCntBackup" -gt 4 ]; then
		#delete list and config file
		flock $SSS_CONF_USER_LIST sed -i "/${sConfig[0]}/d" $SSS_CONF_USER_LIST
		rm $SSS_CONF_USER_DIR/${sConfig[0]}_${sConfig[2]}.tar.bz2
	fi
	sTime=`date +%H%M%S`
	sDate=`date +%C%y%m%d`
	sBackupName=Config_${sTime}
	tar -cjvf ${SSS_CONF_USER_DIR}/${sBackupName}_${sDate}.tar.bz2 ${CONF_LIST[*]}
	if [ "${#sConfig[*]}" -lt 3 ]; then
		flock $SSS_CONF_USER_LIST echo $sBackupName `SSS_SetSysVer` $sDate > $SSS_CONF_USER_LIST
	else
		flock $SSS_CONF_USER_LIST echo $sBackupName `SSS_SetSysVer` $sDate >> $SSS_CONF_USER_LIST
	fi
}
SSS_ConfRestore()
{
	sConfig=(`cat $SSS_CONF_USER_LIST`)
	sCntBackup=$((${#sConfig[*]} / 3 ))
	if [ "$1" = "" ]; then
		#latest configure resore
		sLastCnt=$(($(($sCntBackup - 1)) * 3))
		sRestoreName=${sConfig[$sLastCnt]}
		sDate=${sConfig[$(($sLastCnt + 2))]}
		
	else
		sRestoreName=$1
		sDate=$2
	fi
	if [ "$2" = "pc" ]; then 
		tar -xjvf $1 -C /
	else	
		tar -xjvf ${SSS_CONF_USER_DIR}/${sRestoreName}_${sDate}.tar.bz2 -C /
	fi
	#Stop Services
	/etc/init.d/services stop
	#Create Share Dir by DB
	/etc/sss_script/share/query_share.sh
	#Restart Services
	/etc/init.d/services start
}
#SSS_CONF_USER_DIR
#SSS_CONF_USER_LIST
#SSS_CONF_SYS_FW
#SSS_CONF_SYS
#CONF_LIST

SSS_SystemConfBackup()
{
	echo [`date`]"SSS_SystemConfBackup($*)" >> ${SSS_LOG_SYS_NOTICE}
	SSS_ConfBackup
	sleep 3
	MSG_Once $sBackupName 'backup complete!!!'
	return 0
}
SSS_SystemConfRestore()
{
	echo [`date`]"SSS_SystemConfRestore($*)" >> ${SSS_LOG_SYS_NOTICE}
	SSS_ConfRestore $1 $2
	sleep 3
	MSG_Once $1 'restore complete!!!'
	return 0
}
SSS_McuUpgrade()
{
	#echo "SSS_McuUpgrade($*)"
	echo [`date`]"Mcu Upgrade" $*  >> ${SSS_LOG_SYS_NOTICE}

	MSG_Add ${MSG[81]}
	ifconfig egiga0 down
	/etc/init.d/services stop
	killall sss_main > /dev/null 2>&1
	killall key_eventd > /dev/null 2>&1
	sleep 3

	#update
	nice --5 /usr/local/bin/sss_iodown /tmp/${1} 

	#rm /tmp/${1}
	MSG_Remove ${MSG[81]}
	#Shutdown
	halt
}

SSS_UbootUpgrade()
{
	#echo "SSS_UbootUpgrade($*)"
	echo [`date`]"U-boot Upgrade" $*  >> ${SSS_LOG_SYS_NOTICE}
	
	sFlash=`cat /dev/mtdblock0 |grep FL-MXIC`
	if [ $? != 0 ]; then
		MSG_Once Update fail Undefined Flash Type
		return 1
	fi
	cat ${1} | grep $sFlash > /dev/null 2>&1
	if [ $? != 0 ]; then
		MSG_Once Update fail Check Flash Type
		return 1
	fi
	MSG_Add ${MSG[77]}

	#update
	nice --10 dd if=${1} of=/dev/mtdblock0 bs=64k count=8 seek=1 skip=1
	SSS_VerSave
	MSG_Remove ${MSG[77]}
	MSG_Once ${MSG[78]}
	return 0
}
SSS_VerKernel()
{
	version=`uname -v |awk -F' |:' '{print substr($9,3)" "$3" "$4" "$5" "$6}'|awk '
	{
		sub(/Jan/,"1");
		sub(/Feb/,"2");
		sub(/Mar/,"3");
		sub(/Apr/,"4");
		sub(/May/,"5");
		sub(/Jun/,"6");
		sub(/Jul/,"7");
		sub(/Aug/,"8");
		sub(/Sep/,"9");
		sub(/Oct/,"10");
		sub(/Nov/,"11");
		sub(/Dec/,"12");
		sub(/^0*/,"");
		sub(/ 0/," ");
		print
	}'`
	version=`printf %02d%02d%02d%02d%02d ${version//^0*/""}`
}
SSS_VerMcu()
{
	version=`SSS_IoRead 0x02 | awk '{print $2" "$3" "$4" "$5" "$6}'`
	version=`printf %02d%02d%02d%02d%02d $version`
}
SSS_VerSys()
{
	version=`cat ${SSS_SYS_FW_LOG} |grep Date |awk '{print $NF}'`
}
SSS_VerUboot()
{
	cTemp=`cat /dev/mtdblock0 |grep 'U-Boot 1.1.'`
	cTemp=${cTemp##*(}
	cTemp=${cTemp%%)*}
	version=`echo $cTemp|awk -F' |:|\)' '{print substr($3,3)" "$1" "$2" "$5" "$6}' |awk '
	{
		sub(/Jan/,"1");
		sub(/Feb/,"2");
		sub(/Mar/,"3");
		sub(/Apr/,"4");
		sub(/May/,"5");
		sub(/Jun/,"6");
		sub(/Jul/,"7");
		sub(/Aug/,"8");
		sub(/Sep/,"9");
		sub(/Oct/,"10");
		sub(/Nov/,"11");
		sub(/Dec/,"12");
		sub(/^0*/,"");
		sub(/ 0/," ");
		print
	}'`
	version=`printf %02d%02d%02d%02d%02d $version`
}

SSS_VerSave()
{
	SSS_VerMcu
	echo "MCU_VER="${version} > ${SIF_VER_LIST}
	SSS_VerKernel
	echo "KER_VER="${version} >> ${SIF_VER_LIST}
	SSS_VerUboot
	echo "UBT_VER="${version} >> ${SIF_VER_LIST}
	SSS_VerSys
	echo "SYS_VER="${version} >> ${SIF_VER_LIST}
}

SSS_SetSysVer()
{
	cat $SSS_SYS_FW_LOG |grep Version |awk -F'-' '{print $NF }'
}
SSS_VerMemModule()
{
	version=""
	[ ! -d "/sys/devices/platform/ehci_marvell.4523/usb1/1-1/1-1.4" ] && return 1;
	version=`find /sys/devices/platform/ehci_marvell.4523/usb1/1-1/1-1.4/ -name rev |xargs cat`
	return 0
}
#===============================================================================
# Description	:	SSS_GetDiskInfoAndSaveScsi
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_GetDiskInfoAndSaveScsi()
{
	echo "SSS_GetDiskInfoAndSaveScsi($*)"
	find /sys/block/ -name device |xargs ls -l |awk '{print $9 $11}'|sort -t'/' -k8,9 |awk -F'/' '{
		addr = $(NF-2)
		if(match($4,"sr")){
			gsub(/host4/, "CDROM",$10);
		}
		if(match($10,"host5")){
			gsub(/host5/, "ESATA",$10);
		}
		if(match($10,"usb1")){
			gsub(/^[0-9]*:/, "",$NF);
			gsub(/0/, "",$NF);
			gsub(/:/, "",$NF);
			if($NF != "")
				$NF = "_"$NF;
			gsub(/1-1./, "USB",$(NF-3));
			gsub(/:1.0/, "",$(NF-3));
			#gsub(/\./, "-",$(NF-3));
			gsub(/USB4/, "MemCard",$(NF-3));
			print $4" "$(NF-3)$NF" "addr$NF
		}else{
			print $4" "$10" "addr
		}
	}' > ${DIF_SCSI_LIST}
}
#===============================================================================
SSS_Logrotate()
{
  echo [`date`]"LOG rotate"  >> ${SSS_LOG_SYS_NOTICE}
  /usr/sbin/logrotate /etc/cron/cron.d/logrotate.conf > /dev/null 2>&1 
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_SetBootEndProc()
{
	SSS_Tunning
	MSG_JobClear
	# SSS_SetDiskFailLed
	SSS_KernelEventDaemon
	VOL_RaidPriority
	SSS_SetServerName
	SSS_SetIpAddr
	SSS_SetServerVersion
	SSS_VerSave
	SSS_GetDiskInfoAndSaveScsi
	VOL_CheckRaidSysSwap
	SSS_SetStorageCapa
	SSS_SetRaidState
  SSS_Logrotate
	SSS_SystemUpgradeCheck
	SSS_SetBootEnd
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_Tunning()
{
	mount -o remount,commit=30 / /
	
	echo 3000 > /proc/sys/vm/dirty_writeback_centisecs
	echo 3000 > /proc/sys/vm/dirty_expire_centisecs
	echo 80 > /proc/sys/vm/swappiness
	echo 40 > /proc/sys/vm/dirty_ratio
	echo 38 > /proc/sys/vm/dirty_background_ratio
	
	[ -f /sys/block/md2/md/stripe_cache_size ] && echo 1024 > /sys/block/md2/md/stripe_cache_size;
	/sbin/sysctl -w vm.min_free_kbytes=4096 > /dev/null 2>&1
}
#===============================================================================
# Description	:	RMV_RebootMount
# input 		:	1(sde)
# output 		:   1()
#===============================================================================
RMV_RebootMount()
{
	#rm ${SSS_VOL1_SYSTEM_DIR}/Removable* > /dev/null 2>&1
	rm /mnt/Removable* -rf > /dev/null 2>&1
	rm ${SSS_LAST_USB} -rf > /dev/null 2>&1 
	
	mopilt -i | grep 'No Disc' > /dev/null 2>&1
	if [ $? != 0 ]; then
		Status=`mopilt -i |grep 'Disc Status' |awk '{ print $4}'`
		Media=`mopilt -i |grep 'Media' |awk '{ print $4}'`
		if [ "$Status" != "Blank" ] && [ "$Status" != "Audio" ]; then
			mount /dev/sr0
		fi
	fi
	
	while read line 
	do
		echo $line | grep 'ESATA' && RMV_Mount $line;
	done < /etc/sss_script/disk/scsi_list
	
	Check_GrepPs "sss_usbd" 
	if [ $? != 0 ]; then
		/sbin/start-stop-daemon -S -q -b -x /usr/local/bin/sss_usbd
	fi
	return 0
}
#===============================================================================
# Description	:	RMV_Mount
# input 		:	1(USB1,2,3/MemCard), 2(mount point)
# output 		:   1()
#===============================================================================
RMV_AutoSync()
{
	if [ -d "${SSS_VOL1_SYSTEM_DIR}" ]; then
		if [ ${1} = "USB" -o ${1} = "MemCard" ]; then
			cmssync -s ${2} -d ${SSS_BACKUP_DIR}/USB -p usbauto -i backupdate &
			return 0
		fi
	fi
}

RMV_Mount2()
{
	# check remount without port information
	if [ -z $2 ]; then
		return 0
        fi
                                        
        # Check already mounted device ?
        DEV=
        DEV=(`cat /proc/mounts | grep $1 | cut -d " " -f 1`)
        if [ ! -z $DEV ]; then
        	return 0
        fi
                                                               
        # Check partition
        # echo "RMV_Mount is called with $1 $2" > /dev/console
        RMVDEV="$1"
        RMVMNT="Removable_$2"
        if [ "${RMVDEV%%[0-9]}" != "sr" ]; then
        	aRmvPart=(`cat /proc/partitions |grep $RMVDEV |awk '{print $NF}'`)
        else
                aRmvPart=${RMVDEV}
        fi
        
                mountOk=0
                
        for rmvpart in ${aRmvPart[*]}
        do
        	RMVDEVP=/dev/${rmvpart}
#               echo "RMVDEVP : ${RMVDEVP}" > /dev/console
                FSTYPE=$(udevinfo --query=all -n $RMVDEVP | grep ID_FS_TYPE | cut -d "=" -f 2)
                if [ -z $FSTYPE ]; then
                	if [ "${RMVDEV%%[0-9]}" == "sr" ];
                        then
                        	FSTYPE="udf"
                        else
                        	continue
                        fi
                fi
                
                echo "External Device($RMVDEVP)'s FS TYPE : ${FSTYPE}" > /dev/console
                 
                vol=${rmvpart##sd[a-z]}
                vol=${vol##sr}
                if [ -z "$vol" ]; then
                	RMVMNTV=/${RMVMNT}"_Vol"
                else
                        RMVMNTV=/${RMVMNT}"_Vol"${vol}
                fi
                                                                                                                                
                RMVMNTP=/mnt${RMVMNTV}
                                                                                                                                                
                # re Unmount
                ret=`grep ${RMVMNTP} /proc/mounts`
                if [ "$ret" != "" ] ; then
                	umount -l ${RMVMNTP}
                fi
                                                                                                                                                                                                                                        
                if [ ! -d "${RMVMNTP}" ] ; then
                         mkdir ${RMVMNTP}
                fi
                
                case "$FSTYPE" in
                "vfat")
                	mount -t vfat -o users,gid=users,fmask=000,dmask=000,iocharset=utf8,shortname=mixed,noatime ${RMVDEVP} ${RMVMNTP} > /dev/console 2>&1
                        RET=$?
                        if [ $? = 0 ]; then
                        	#SSS_CheckLgeScriptAndRun ${RMVMNTP}
                                SSS_CheckIsLgeScript ${RMVMNTP}
                                if [ $? = 1 ] ; then
                                	/sbin/start-stop-daemon -S -q -b -x /usr/local/bin/sss_runscript ${RMVMNTP}
                                         return 0
                                fi
                        fi
                        ;;
                 "ntfs")
#                       mount -t ntfs-3g -o users,gid=users,nls=utf8,noatime ${RMVDEVP} ${RMVMNTP} > /dev/console 2>&1
                        mount -t ntfs-3g -o users,umask=000,nls=utf8,remove_hiberfile ${RMVDEVP} ${RMVMNTP} > /dev/console 2>&1
                        RET=$?
                        ;;
                 "ext3"|"ext4")
                        mount -t $FSTYPE -o users,noatime ${RMVDEVP} ${RMVMNTP} > /dev/console 2>&1
                        RET=$?
                        ;;
                 "udf")
                        mount -t udf,iso9660 -o ro,iocharset=utf8 ${RMVDEVP} ${RMVMNTP} > /dev/console 2>&1
                        RET=$?
                        ;;
                 *)
                        mount -t auto -o users,gid=users,iocharset=utf8 ${RMVDEVP} ${RMVMNTP} > /dev/console 2>&1
                        RET=$?
                        ;;
                esac
                                                                                                                                                                                                                                                                   
                if [ $RET = 0 ]; then
                	mountOk=1
                	break
                fi
	done

        if [ "$mountOk" = 0 ]; then
		# 5. Unknown Format or H/W Failure
                echo "Unknown Format External Device : $RMVMNTV ${MSG[3]}" > /dev/console
                MSG_Once ${RMVMNTV} is ${MSG[3]}
                SSS_SetBuzzerErr1
                                                                        
                if [ -d $RMVMNTP ] ; then
                	rmdir ${RMVMNTP}
                fi
                return 1
        else
                echo "${RMVMNTP}" >> ${SSS_LAST_USB}
                MSG_Once ${RMVMNT} ${MSG[6]}
                SSS_SetBuzzerRmvMount
                RMV_AutoSync ${2%%[0-9]} ${RMVMNTP}
                . /usr/lib/nas/storage.sh
                DESCRIPTION=$(get_device_name $RMVDEVP desc)
                SMBFOLDER=
                                                                                                      
                if [ "$2" = "CDROM" ];
                then
                	SMBFOLDER="USB_CDROM"	
                else
                        SMBFOLDER="$2"
                fi
                              
                /usr/sbin/nas-share add_samba_usb $SMBFOLDER $RMVMNTP $DESCRIPTION
                                                                        
                /etc/init.d/samba reload
                return 0
	fi
}
                                                                                                                
RMV_Mount()
{
	# Check partition
	RMVDEV="$1"
	RMVMNT="Removable_$2"
	if [ "${RMVDEV%%[0-9]}" != "sr" ]; then
		aRmvPart=(`cat /proc/partitions |grep $RMVDEV |awk '{print $NF}'`)
	else
		aRmvPart=${RMVDEV}
	fi
	
	mountOk=0
	
	for rmvpart in ${aRmvPart[*]}
	do
		RMVDEVP=/dev/${rmvpart}
		vol=${rmvpart##sd[a-z]}
		vol=${vol##sr}
		if [ -z "$vol" ]; then
			RMVMNTV=/${RMVMNT}"_Vol"
		else
			RMVMNTV=/${RMVMNT}"_Vol"${vol}
		fi

		RMVMNTP=/mnt${RMVMNTV}

		# re Unmount
		ret=`grep ${RMVMNTP} /proc/mounts`
		if [ "$ret" != "" ] ; then
			umount -l ${RMVMNTP}
		fi

		if [ ! -d "${RMVMNTP}" ] ; then
			mkdir ${RMVMNTP}
		fi

		# 1. vfat mount
		mount -t vfat -o users,gid=users,fmask=000,dmask=000,iocharset=utf8,shortname=mixed ${RMVDEVP} ${RMVMNTP}
		if [ $? = 0 ]; then
			#SSS_CheckLgeScriptAndRun ${RMVMNTP}
			SSS_CheckIsLgeScript ${RMVMNTP}
			if [ $? = 1 ] ; then
				/sbin/start-stop-daemon -S -q -b -x /usr/local/bin/sss_runscript ${RMVMNTP}
				return 0
			fi
			mountOk=1
			break
		fi
		# 2. ntfs-3g mount
		#mount -t ntfs-3g -o force,users,gid=users,fmask=000,dmask=000,iocharset=utf8 ${RMVDEVP} ${RMVMNTP}
		mount -t ntfs-3g -o force,users,gid=users ${RMVDEVP} ${RMVMNTP}
		if [ $? = 0 ]; then
			rm "${RMVMNTP}${RMVMNTV}" > /dev/null 2>&1
			ntfspid=(`ps -w |grep ntfs-3g |grep -v grep |cup -d' ' -f1`)
			renice 0 ${ntfspid[*]}
			mountOk=1
			break
		fi
		# 3. ext3 mount
		mount -t ext3 -o users ${RMVDEVP} ${RMVMNTP}
		if [ $? = 0 ]; then
			mountOk=1
			break
		fi
		# 4. iso9660 mount
		mount -t udf,iso9660 -o ro,iocharset=utf8 ${RMVDEVP} ${RMVMNTP}
		if [ $? = 0 ]; then
			mountOk=1
			break
		fi
		# 5. autofs mount
		#mount -t auto -o users,gid=users,fmask=000,dmask=000,iocharset=utf8 ${RMVDEVP} ${RMVMNTP}
		mount -t auto -o users,gid=users,iocharset=utf8 ${RMVDEVP} ${RMVMNTP}
		if [ $? = 0 ]; then
			mountOk=1
			break
		fi
		
		grep "${RMVMNTP} " /proc/mounts > /dev/null 2>&1
		if [ $? != 0 ] ; then
			rm ${RMVMNTP} -rf
		fi
	done
	
	if [ "$mountOk" = 0 ]; then
		# 5. Unknown Format
		MSG_Once ${RMVMNTV} is ${MSG[3]}
		SSS_SetBuzzerErr1
        if [ -d $RMVMNTP ] ; then
        	rmdir ${RMVMNTP}
        fi
		return 1
	else
		echo "${RMVMNTP}" >> ${SSS_LAST_USB}
		MSG_Once ${RMVMNT} ${MSG[6]}
		SSS_SetBuzzerRmvMount
		RMV_AutoSync ${2%%[0-9]} ${RMVMNTP} 
        SMBFOLDER=
                                                                                                     
        if [ "$2" = "CDROM" ];
        then
              	SMBFOLDER="USB_CDROM"	
        		DESCRIPTION="USB_CDROM Driver"
        else
                SMBFOLDER="$2"
        		DESCRIPTION="External Mass Storage"
        fi
                              
        /usr/sbin/nas-share add_samba_usb $SMBFOLDER $RMVMNTP $DESCRIPTION
                                                                        
        /etc/init.d/samba reload
		return 0
	fi
}
#===============================================================================
# Description	:	RMV_Unmount
# input 		:	1(sde)
# output 		:   1()
#===============================================================================
RMV_Unmount()
{
        echo "RMV_unmount is called with $1 $2" > /dev/console
        #check unmount without RMV Type
        if [ -z $2 ]; then
        	return 0
        fi
                                                
	#echo "RMV_Unmount($*)"
	# Check partition
	RMVDEV="$1"
	RMVMNT="Removable_$2"
	
	aRmvDev=(`cat /proc/mounts |grep $RMVDEV |awk '{print $1}'`)
	for rmvdev in ${aRmvDev[*]}
	do
		RMVDEVP=$rmvdev
		RMVMNTP=`mount |grep $rmvdev" " |awk '{print $3}'`

		if [ ! -z "$RMVMNTP" ] ; then
			# Unmount
			umount -f ${RMVDEVP}
			if [ $? = 0 ] ; then
				rm -rf ${RMVMNTP}
			else
				umount -l ${RMVDEVP}
				if [ $? = 0 ] ; then
					rm -rf ${RMVMNTP}
				fi
			fi
		fi
	done

	grep "${RMVDEVP} " /proc/mounts > /dev/null 2>&1
	if [ $? != 0 ] ; then
		sed -i /${RMVMNTP//\//\\/}/c ${SSS_LAST_USB}
		#echo "This USB unmounted"
		MSG_Once ${RMVMNT} ${MSG[7]}
		SSS_SetBuzzerRmvUnmount
                echo "RMV_unmount : del samba configuration with $2" > /dev/console
                if [ "$2" != "CDROM" ];
                then
                	/usr/sbin/nas-share del_samba_usb $2
                else
                        /usr/sbin/nas-share del_samba_usb "USB_CDROM"
                fi
                /etc/init.d/samba reload
		return 1
	fi
	return 0
}
#===============================================================================
# Description	:	UpsSystemShutdown

# output 		:   1()
#===============================================================================
UpsSystemShutdown()
{
	#echo "UpsSystemShutdown($*)"
	SSS_McuUpgrade UpsSystemShutdown ${MSG[34]}
	sleep 5
	shutdown
}
#===============================================================================
# Description	:	UPS_ServiceConfig
# input 		:	1:ups (on/off) 2:shutdown_seconds(0:low battery) 3: ups_power(on/off)
# output 		:   1()
#===============================================================================
UPS_ServiceConfig()
{
	echo [`date`]"UPS_ServiceConfig($*)" >> ${SSS_LOG_SYS_NOTICE}
	
	if [ "$1" = "on" ] ; then
		killall apcupsd > /dev/null 2>&1
		sleep 1
		echo -n "11\n" | /sbin/apctest > /dev/null 2>&1
		if [ $? != 0 ]; then
			MSG_Once ${MSG[28]}
			return 1
		fi
	fi
	
	if [ "$1" != "" ] ; then
		sed -i '/ups=/c ups='${1} /etc/sss_script/services/service.conf
	fi	
	if [ "$2" != "" ] ; then
		sed -i '/ups_shutdown_time=/c ups_shutdown_time='${2} /etc/sss_script/services/service.conf
		sed -i '/TIMEOUT /c TIMEOUT '${2} /etc/apcupsd/apcupsd.conf
	fi	
	if [ "$3" != "" ] ; then
		sed -i '/ups_poweroff=/c ups_poweroff='${3} /etc/sss_script/services/service.conf
	fi

	if [ "$1" = "on" ] ; then
		UPS_Restart
	else
		UPS_Stop
	fi	
}
UPS_Start()
{
	echo [`date`]"UPS_Start($*)" >> ${SSS_LOG_SYS_NOTICE}
	. /etc/sss_script/services/service.conf

	if [ "${ups}" = "off" ] ; then
		UPS_Stop
		MSG_Once ${MSG[29]}
		return 1
	fi

	#ns1 support usb ups only
	sed -i '/UPSCABLE /c UPSCABLE usb' /etc/apcupsd/apcupsd.conf
	sed -i '/UPSTYPE /c UPSTYPE usb' /etc/apcupsd/apcupsd.conf
	sed -i '/DEVICE /c DEVICE' /etc/apcupsd/apcupsd.conf

	#sed -i '/UPSCABLE /c UPSCABLE smart' /etc/apcupsd/apcupsd.conf
	#sed -i '/UPSTYPE /c UPSTYPE apcsmart' /etc/apcupsd/apcupsd.conf
	#sed -i '/DEVICE /c DEVICE \/dev/ttyS0' /etc/apcupsd/apcupsd.conf	

	#ns1 shutdown time by ups power fail
	sed -i '/TIMEOUT /c TIMEOUT '${ups_shutdown_time} /etc/apcupsd/apcupsd.conf

	if [ "${ups_poweroff}" = "off" ] ; then
		/sbin/apcupsd
	else
		/sbin/apcupsd -p
	fi
	
	if [ $? = 0 ] ; then
		echo [`date`]"Start upsd : power fail shutdown lge-nas after ${ups_shutdown_time} seconds" >> ${SSS_LOG_SYS_NOTICE}
		MSG_Once ${MSG[30]}
	else
		MSG_Once ${MSG[28]}
	fi
}
UPS_Stop()
{
	#echo [`date`]"UPS_Stop($*)" >> ${SSS_LOG_SYS_NOTICE}
	Check_GrepPs "apcupsd" || return 0;
	killall apcupsd > /dev/null 2>&1
	if [ $? = 0 ] ; then
		MSG_Once ${MSG[29]}
	fi
}
UPS_Restart()
{
	#echo [`date`]"UPS_Restart($*)" >> ${SSS_LOG_SYS_NOTICE}
	UPS_Stop
	UPS_Start
}

#===============================================================================
# Description	:	HDD hibernation
# input 		:	1()
# output 		:   1()
#===============================================================================
HIB_SpinToBeDown()
{
	#echo [`date`]"HIB_SpinToBeDown($*)" >> ${SSS_LOG_SYS_NOTICE}

	#Cron Stop
	#/etc/init.d/cron.sh stop
	/usr/bin/crontab -d root
        /usr/bin/crontab /var/spool/cron/root_hib -u root
	#killall crond
	#/usr/sbin/crond
	
	#session expire
	[ -d "/tmp/session" ] && find /tmp/session/ -type f | xargs rm > /dev/null 2>&1;
	#Root FileSystem Remount
	mount -t ext3 -o remount,noatime,commit=3000 / /
	#3000s
    #echo 300000 > /proc/sys/vm/dirty_writeback_centisecs
    echo 1 > /proc/sys/vm/laptop_mode
	#Fan Rpm Stop
	SSS_SetFanRpm 0
#	FAN_Control
	sync
	sync
}
HIB_SpinWasUp()
{
	#echo [`date`]"HddSpinWasUp($*)" >> ${SSS_LOG_SYS_NOTICE}

	#Root FileSystem Remount
	mount -t ext3 -o remount,noatime,commit=30 / /

	FAN_Control
	
	#60s
	echo 3000 > /proc/sys/vm/dirty_writeback_centisecs
	echo 0 > /proc/sys/vm/laptop_mode
	
#	#Cron Start
#	while :
#	do
#		/etc/init.d/cron.sh restart
#		sleep 1
#		Check_GrepPs "crond"
#		if [ $? != 0 ]; then
#			echo [`date`]"Error: crond nostarted ($*)" >> ${SSS_LOG_SYS_NOTICE}
#		else
#			break
#		fi
#	done
        /usr/bin/crontab -d root
	/usr/bin/crontab /var/spool/cron/root -u root
}
HIB_ServiceConfig()
{
	echo [`date`]"HIB_ServiceConfig($*)" >> ${SSS_LOG_SYS_NOTICE}
	if [ "$1" != "" ] ; then
		sed -i '/hibernation=/c hibernation='${1} /etc/sss_script/services/service.conf
	fi
	if [ "$2" != "" ] ; then
		sed -i '/hibernation_minutes=/c hibernation_minutes='${2} /etc/sss_script/services/service.conf
	fi

	if [ "$1" = "on" ] ; then
		HIB_Restart
	else
		HIB_Stop
	fi
}
HIB_Start()
{
	echo [`date`]"HIB_Start($*)" >> ${SSS_LOG_SYS_NOTICE}
	#except usb device : usb is not support usb stanby command
	#NOHIBDEV=`cat /etc/sss_script/disk/scsi_list |grep USB |awk 'BEGIN{i=0;}{D[i++]=$1}END{for(i=0;i<NR;i++) printf "-r /dev/"D[i]" "}'`
	#usb/ esabe hdd disk hibernation ==> usb hdd noflushd error
	NOHIBDEV=(`find /sys/block -name removable |grep '^/sys/block/sd' |xargs grep 1 |cut -d'/' -f4 |awk '{print "-r /dev/"$1}'`)

	. /etc/sss_script/services/service.conf

	if [ "${hibernation}" = "off" ] ; then
		return 1;
	fi

	echo "Start noflushd Period : "${hibernation_minutes}" minute"
	/usr/local/bin/noflushd -n ${hibernation_minutes} ${NOHIBDEV[*]}
}
HIB_Stop()
{
	echo [`date`]"HIB_Stop($*)" >> ${SSS_LOG_SYS_NOTICE}
	HIB_SpinWasUp
	#joowonbae
	#killall noflushd > /dev/null 2>&1
	/sbin/start-stop-daemon -K -q -x /usr/local/bin/noflushd
}
HIB_Restart()
{
	echo [`date`]"HIB_Restart($*)" >> ${SSS_LOG_SYS_NOTICE}
	HIB_Stop
	HIB_Start
}
#===============================================================================
# Description	:
# input 		:	1()
# output 		:   1()
#===============================================================================
TST_MakeZeroBin()
{
	if [ -d "${SSS_VOL1_SHARE_DIR}" ]; then
		cd ${SSS_VOL1_SHARE_DIR}
		if [ $? = 0 ]; then
			if [ ! -d "AgingCdHddTest" ]; then
				mkdir AgingCdHddTest
			fi
			cd AgingCdHddTest
			dd if=/dev/zero of=${1} bs=1M count="${2}"
		fi
	fi
}
TST_MakeZeroIso()
{
	if [ -d "${SSS_VOL1_SHARE_DIR}" ]; then
		cd ${SSS_VOL1_SHARE_DIR}
		if [ $? = 0 ]; then
			if [ ! -d "AgingCdHddTest" ]; then
				mkdir AgingCdHddTest
			fi
			cd AgingCdHddTest
			dd if=/dev/zero of=TST_Burn.bin bs=1M count="${2}"
			motilt -o ${1} -p ./TST_Burn.bin
			rm TST_Burn.bin
		fi
	fi
}
TST_EraseAgingCdHddTest()
{
	cd ${SSS_VOL1_SHARE_DIR}
	rm "${SSS_VOL1_SHARE_DIR}/AgingCdHddTest" -rf
}
TST_Burn()
{
	TST_Close
	mosilt $1 /dev/sg4
}
TST_GetIso()
{
	mopilt $1
}
TST_Verify()
{
	cmp $1 $2
}
TST_Eject()
{
	umount -l /dev/sr0
	eject /dev/sr0
}
TST_Close()
{
	eject -t /dev/sr0
	sleep 5
}
TST_Load()
{
	TST_Close
	mount  /dev/sr0
}
TST_CheckEnd()
{
	TST_RETRY=0
	while [ "$TST_RETRY" -le 10 ] ; do
		TST_RETRY=$((${TST_RETRY} + 1))
		DATA=`SSS_IoRead 0xa | awk '{print $3}'`
		#time display 0x84=132
	    if [ "${DATA}" = 0 ] ; then
	    		MSG_Once Complete Aging Test
	            return 1
	    fi
	done

	return 0
}
TST_CheckError()
{
	if [ $? = 1 ] ; then
		MSG_Once ${1} Count[${2}]
		TST_Eject
		exit 0
	fi
}
TST_AgingCdHdd()
{
	MSG_Once Start Aging Test
	sleep 5
	TST_CNT=0
	while true ; do
		TST_CNT=$(($TST_CNT + 1))
		MSG_Once TST_AgingCdHdd Count[${TST_CNT}]
		TST_CheckEnd
		if [ $? = 1 ]; then
			break
		fi
		BURN_ISO="TST_Burn.iso"
		# 500M
		TST_MakeZeroIso ${BURN_ISO} 500
		TST_Burn ${BURN_ISO}
		TST_Eject
		TST_EraseAgingCdHddTest
	done
}
#===============================================================================
# Description	:	KernelEventProcess()
# input 		:	1()
# output 		:   1()
#===============================================================================
SSS_KernelEventDaemon()
{
	killall key_eventd > /dev/null 2>&1
	/sbin/start-stop-daemon -S -q -b -x /etc/sss_script/event/key_eventd
	return 0
}
KernelEventProcess()
{
	KECnt=$1
	KEvent=$2
	KDevName=$3

    #echo [`date`]"KERNEL Event(${KECnt},${KEvent},${KDevName})"  >> ${SSS_LOG_SYS_NOTICE} &
    
	case "$KEvent" in
	0000)
		echo SSS_KEVENT_NONE
		echo [`date`]"SSS_KEVENT_NONE"  >> ${SSS_LOG_SYS_NOTICE}
		;;
	0001)
		#echo SSS_KEVENT_SCSI_SUSPEND
		DevToHostNumWithFile $KDevName
		echo [`date`]"SSS_KEVENT_SCSI_SUSPEND(${HostNum})"  >> ${SSS_LOG_SYS_NOTICE}
		;;
	0002)
		#echo SSS_KEVENT_SCSI_SHUTDOWN
		HIB_Restart
		VOL_CheckNode
		DevToHostNumWithFile $KDevName
		
		case "$HostNum" in
		host[0123])
			BAY_HotRemoved $HostNum
			;;
		ESATA)
			RMV_Unmount $KDevName $HostNum
			;;
		*)
			return
			;;
		esac
		SSS_GetDiskInfoAndSaveScsi
		echo [`date`]"SSS_KEVENT_SCSI_SHUTDOWN(${HostNum})"  >> ${SSS_LOG_SYS_NOTICE}
		;;
	0003)
		#echo SSS_KEVENT_SCSI_SCANED
		HIB_Restart
		ls -al /sys/block/${KDevName%%[0-9]}/device |grep usb1
		if [ $? = 0 ]; then return; fi
		SSS_GetDiskInfoAndSaveScsi
		DevToHostNumWithFile $KDevName
		
		case "$HostNum" in
		host[0123])
			echo "Scaned "$HostNum
			BAY_HotAdded $HostNum $KDevName
			;;
		ESATA)
			RMV_Mount $KDevName $HostNum
			;;
		*)
			return
			;;
		esac
		
		echo [`date`]"SSS_KEVENT_SCSI_SCANED(${HostNum})"  >> ${SSS_LOG_SYS_NOTICE}
		;;
	0010)
		VOL_RaidPriority
		if [ "${KDevName#md}" -ge 2 ]; then
			sVolName=`cat ${VOLCONF}| grep ${KDevName} |cut -d' ' -f1`
			MSG_Add ${sVolName} ${MSG[15]}
			SSS_SetRaidSync 1
		elif [ "${KDevName#md}" = 0 ]; then
			MSG_Add System ${MSG[15]}
		fi
		echo [`date`]"SSS_KEVENT_RAID_RESYNCH"  >> ${SSS_LOG_SYS_NOTICE}
		;;
	0011)
		if [ "${KDevName#md}" -ge 2 ]; then
			sVolName=`cat ${VOLCONF}| grep ${KDevName} |cut -d' ' -f1`
			MSG_Remove ${MSG[15]}
			MSG_Once ${sVolName} ${MSG[16]}
			SSS_SetRaidSync 0
		elif [ "${KDevName#md}" = 0 ]; then
			MSG_Remove System ${MSG[15]}
			MSG_Once System ${MSG[16]}
		fi
		sync
		echo [`date`]"SSS_KEVENT_RAID_RESYNCHED"  >> ${SSS_LOG_SYS_NOTICE}
		;;
	001d)
		VOL_CheckNode

		if [ "${KDevName#sd[a-z]}" -ge 3 ]; then
			DevToHostNumWithFile $KDevName
			sBayName=`BAY_HostToBayName ${HostNum}`
			sBayNameR=`BAY_ToDisplayBayName ${sBayName}`
			sVolName=`cat ${VOLCONF}| grep ${sBayName} |cut -d' ' -f1`
			SSS_SetEventMsgKeep "${MSG[18]}"
			SSS_SetDiskFailLed $HostNum on
		fi
		echo [`date`]"SSS_KEVENT_RAID_FAILURE_1"  >> ${SSS_LOG_SYS_NOTICE}
		;;
	001e)
		VOL_CheckNode

		if [ "${KDevName#sd[a-z]}" -ge 3 ]; then
			DevToHostNumWithFile $KDevName
			sBayName=`BAY_HostToBayName ${HostNum}`
			sBayNameR=`BAY_ToDisplayBayName ${sBayName}`
			sVolName=`cat ${VOLCONF}| grep ${sBayName} |cut -d' ' -f1`
			SSS_SetEventMsgKeep "${MSG[18]}"
			SSS_SetDiskFailLed $HostNum on
		fi
		echo [`date`]"SSS_KEVENT_RAID_FAILURE_10"  >> ${SSS_LOG_SYS_NOTICE}
		;;
	001f)
		VOL_CheckNode

		if [ "${KDevName#sd[a-z]}" -ge 3 ]; then
			DevToHostNumWithFile $KDevName
			sBayName=`BAY_HostToBayName ${HostNum}`
			sBayNameR=`BAY_ToDisplayBayName ${sBayName}`
			sVolName=`cat ${VOLCONF}| grep ${sBayName} |cut -d' ' -f1`
			SSS_SetEventMsgKeep "${MSG[18]}"
			SSS_SetDiskFailLed $HostNum on
		fi
		echo [`date`]"SSS_KEVENT_RAID_FAILURE_5"  >> ${SSS_LOG_SYS_NOTICE}
		;;
	0020)
		SSS_SetIpAddr
		
		MSG_Once ${MSG[1]}
		SSS_SetBuzzerOk1
		#SSS_SetSysState 0x01
		
		echo [`date`]"SSS_KEVENT_LAN_ACTIVE"  >> ${SSS_LOG_SYS_NOTICE}
		dmesg |grep egiga0: |tail -1 > /etc/sss_script/network/link_status
		#/etc/sss_script/network/ifup-egiga0
		;;
	0021)
		#echo SSS_KEVENT_LAN_NOACT
		MSG_Once ${MSG[0]}
		SSS_SetBuzzerErr1
		echo [`date`]"SSS_KEVENT_LAN_NOACT"  >> ${SSS_LOG_SYS_NOTICE}
		dmesg |grep egiga0: |tail -1 > /etc/sss_script/network/link_status
		#dmesg | grep egiga0: | tail -1 > /etc/sss_script/network/link_status
		;;
	*)
		echo [`date`]"SSS_KEVENT_UNKNOWN"  >> ${SSS_LOG_SYS_NOTICE}
		;;
	esac

}

