#!/bin/sh /etc/rc.common

START=12

system_config() {
	local cfg="$1"
	local hostname
	
	config_get hostname "$cfg" hostname
	echo "${hostname:-OpenWrt}" > /proc/sys/kernel/hostname
	echo "127.0.0.1 localhost ${hostname:-OpenWrt}" > /etc/hosts

#	klogd -c1
}
set_hosts() {
	local model

	model=`head -n 1 /etc/version`
	echo "${model:-OpenWrt}" > /proc/sys/kernel/hostname
	echo "127.0.0.1 localhost ${model:-OpenWrt}" > /etc/hosts
}

apply_uci_config() {(
	include /lib/config
	uci_apply_defaults
)}

is_uci_config() {
	config_name=$1
	for file2 in $(cat /etc/non_uci_list); do
		if [ "$config_name" = "$file2" ]
		then
			#echo "skip" $file2
			return 1
		fi
	done
	return 0
}

check_version() {
	local org_rev

	if [ -e /etc/persistence/data/rev ]; then
		org_rev=$(cat /etc/persistence/data/rev)
	else
		org_rev=0
		#echo "check_version return 0"
		return 0
	fi

	if [ $org_rev -ge 2315 ]; then
		#echo "check_version return 1"
		return 1
	fi
	#echo "check_version return 0"
	return 0
}

restore_uci_config() {
	config_name=$1
	if [ -f /data/config_modified/$config_name ]; then
		cp /data/config_modified/$config_name /etc/config
		echo "[WARNING] Restore from /data/config_modified/$config_name " > /dev/console
	else
		cp /etc/config-default/$config_name /etc/config
		echo "[WARNING] Set $config_name to DEFAULT " > /dev/console
	fi
}

# Chris, add start, 20100427, deal with persistent partition
mount_config_part_post() {
	#echo "Mounting config partition"
#	[ -d /etc/persistence ] || {
#		echo "[BOOT] persistence does not exist, maked."
#		mkdir -p /etc/persistence
#	}

#	if [ -e /dev/mtdblock7 ]
#	then
#		mount -t jffs2 /dev/mtdblock7 /etc/persistence
#	else
#		echo "[ERROR][BOOT] persistence partition not found, please update bootloader."
#		mount -t jffs2 /dev/mtdblock5 /etc/persistence
#	fi
#	RETURN_VALUE=$?
#	[ $RETURN_VALUE = 0 ] || {
#		echo "[BOOT] persistence mount failed."
#		return 1
#	}
	
	# Upgrade config and data from old firmware version
	[ -d /etc/persistence/config ] || {
		#echo "/etc/persistence/config maked"
		mkdir -p /etc/persistence/config
	}
	[ -d /etc/persistence/data ] || {
		#echo "/etc/persistence/data maked"
		mkdir -p /etc/persistence/data
	}

	[ -d /data/config_modified ] || {
		#echo "/data/config_modified"
		mkdir -p /data/config_modified
	}

	for file in $(ls /etc/persistence); do
		[ -f /etc/persistence/$file ] && {
			if [ $file = passwd ]
			then
				cp /etc/persistence/$file /etc/persistence/data
			elif [ $file = group ]
			then
				cp /etc/persistence/$file /etc/persistence/data
			else
				cp /etc/persistence/$file /etc/persistence/config
			fi
			rm -f /etc/persistence/$file
		}
	done
	# if passwd or group is null
	[ -f /etc/persistence/data/passwd ] && {
		grep root /etc/persistence/data/passwd >/dev/null 2>&1
		passwd_ret=$?
	}	
	[ -s /etc/persistence/data/passwd -a "$passwd_ret" = "0" ] || {
		[ -f /etc/persistence/data/passwd_backup ] && {
			grep root /etc/persistence/data/passwd_backup >/dev/null 2>&1
			passwd_backup_ret=$?
		}
		if [ -s /etc/persistence/data/passwd_backup -a "$passwd_backup_ret" = "0" ]; then
			cp /etc/persistence/data/passwd_backup /etc/persistence/data/passwd
		else
			rm -f /etc/persistence/data/passwd
		fi
	}	
	[ -f /etc/persistence/data/group ] && {
		grep root /etc/persistence/data/group >/dev/null 2>&1
		group_ret=$?
	}	
	[ -s /etc/persistence/data/group -a "$group_ret" = "0" ] || {
		[ -f /etc/persistence/data/group_backup ] && {
			grep root /etc/persistence/data/group_backup >/dev/null 2>&1
			group_backup_ret=$?
		}		
		if [ -s /etc/persistence/data/group_backup -a "$group_backup_ret" = "0" ]; then
			cp /etc/persistence/data/group_backup /etc/persistence/data/group
		else
			rm -f /etc/persistence/data/group
		fi
	}	
	# Link uci config
	[ -e /etc/config ] || {
		ln -sf /etc/persistence/config /etc/
	}
	[ -e /etc/persistence/config/config ] && {
		[ -f /etc/persistence/config/config ] || {
			rm /etc/persistence/config/config
		}
	}
	if [ -f /etc/persistence/data/fwupgrade_reset_default ];then
		rm -f /etc/persistence/config/*
		rm -rf /etc/persistence/checksum/config
		rm -f /etc/passwd
		rm -f /etc/group
		rm -f /etc/passwd_md5
		rm -f /etc/persistence/data/rev
		rm -f /etc/persistence/data/fwupgrade_reset_default
		rm -f /etc/ucarp/revision
	fi
	# checksum if not exist
	[ -d /etc/persistence/checksum/config ] || {
		echo "[BOOT] creating config checksum"
		mkdir -p /etc/persistence/checksum/config
		for file in $(ls /etc/config-default); do
			if [ -f /etc/config/$file ]; then
				md5sum /etc/config/$file | awk '{print $1}' > /etc/persistence/checksum/config/$file
			fi
		done
	}
	
	# For reset default or partial reset default
	[ -d /etc/config-default ] || {
		echo "[BOOT] default config not exist"
		return 2
	}
	[ -d /etc/data-default ] || {
		echo "[BOOT] default data not exist"
		return 3
	}

	# config
	if [ -d /data/default_set ]; then
		mkdir -p /tmp/default_set
		CONFIG_NAME=`ls -1 /data/default_set | grep tar.gz | awk '{FS=".tar.gz"}{print $1}'`
		tar -zxf /data/default_set/$CONFIG_NAME.tar.gz -C /tmp/default_set
	fi
	for file in $(ls /etc/config-default); do
	[ -f /etc/config/$file ] || {
		if [ -d /data/default_set ]; then
			if [ -f /tmp/default_set/etc/persistence/config/$file ]; then
				cp /tmp/default_set/etc/persistence/config/$file /etc/config
			else
				cp /etc/config-default/$file /etc/config
			fi
		else
			cp /etc/config-default/$file /etc/config
		fi
		md5sum /etc/config/$file | awk '{print $1}' > /etc/persistence/checksum/config/$file
	}
	done

	# data
	for file in $(ls /etc/data-default); do
	[ -f /etc/persistence/data/$file ] || {
		cp /etc/data-default/$file /etc/persistence/data
	}
	done

	# reset passwd and group to default
	[ -f /etc/persistence/data/passwd ] || {
		cp /etc/data-default/passwd /etc/persistence/data/passwd
	}
	[ -f /etc/persistence/data/group ] || {
		cp /etc/data-default/group /etc/persistence/data/group
	}
	[ -f /etc/persistence/data/passwd_md5 ] || {
		cp /etc/data-default/passwd_md5 /etc/persistence/data/passwd_md5
	}

:<< 'COMMENT_OUT_END'
	# checksum
	check_version
	if [ "$?" = "1" ]
	then
		for file in $(ls /etc/config-default); do
			is_uci_config $file
			if [ "$?" -eq 0 ]; then
				#echo "check" $file
				if [ -f /etc/config/$file ]; then
					if [ -f /etc/persistence/checksum/config/$file ]; then
						CHECKSUM_1=`cat /etc/persistence/checksum/config/$file`
						CHECKSUM_2=`md5sum /etc/config/$file | awk '{print $1}'`
						[ "$CHECKSUM_1" = "$CHECKSUM_2" ] || {
							echo "[WARNING] uci config file" $file "checksum error!!" > /dev/console 
							#cp /etc/config-default/$file /etc/config
							if [ -d /data/default_set ]; then
								if [ -f /tmp/default_set/etc/persistence/config/$file ]; then
									cp /tmp/default_set/etc/persistence/config/$file /etc/config
								else
									restore_uci_config $file
								fi
							else
								restore_uci_config $file
							fi
							md5sum /etc/config/$file | awk '{print $1}' > /etc/persistence/checksum/config/$file
						}
					fi
				fi
			#else
			#	echo "skip" $file
			fi
		done
	else
		echo "[BOOT] upgrade from 1.0.3.2 or below, update checksum"
		for file in $(ls /etc/config-default); do
			is_uci_config $file
			if [ "$?" -eq 0 ]; then
				if [ -f /etc/config/$file ]; then
					if [ -f /etc/persistence/checksum/config/$file ]; then
						md5sum /etc/config/$file | awk '{print $1}' > /etc/persistence/checksum/config/$file
					fi
				fi
			fi
		done
	fi
COMMENT_OUT_END
	echo `cat /etc/version` >/dev/console

	#remove temp config
	rm -rf /tmp/default_set
	
	# 2012/5/8, Boham modified, recover passwd file to /etc/
	cp /etc/persistence/data/passwd /etc/passwd
	cp /etc/persistence/data/group /etc/group
	#2012/5/8, Boham end modified
	
	# Copy IPSec
	#Certificate mechanism has been removed in Vigor300B
	model=$(head -n 1 /etc/version)	
	if [ "$model" != "Vigor300B" ] ;then		
		[ -d /etc/persistence/data/ipsec.d ] || {
			mkdir -p /etc/persistence/data/ipsec.d
			mkdir -p /etc/persistence/data/ipsec.d/aacerts
			mkdir -p /etc/persistence/data/ipsec.d/cacerts
			mkdir -p /etc/persistence/data/ipsec.d/certs
			mkdir -p /etc/persistence/data/ipsec.d/crls
			mkdir -p /etc/persistence/data/ipsec.d/ocspcerts
			mkdir -p /etc/persistence/data/ipsec.d/private
			mkdir -p /etc/persistence/data/ipsec.d/newcerts
		}
		
		[ -d  /etc/persistence/data/ipsec.d/newcerts ] || {
			mkdir -p /etc/persistence/data/ipsec.d/newcerts
		}
		
		[ -d  /etc/persistence/data/ipsec.d/private ] || {
			mkdir -p /etc/persistence/data/ipsec.d/private
		}
		
		[ -d  /etc/persistence/data/ipsec.d/crls ] || {
			mkdir -p /etc/persistence/data/ipsec.d/crls
		}
		
		[ -d  /etc/persistence/data/ipsec.d/cacerts ] || {
			mkdir -p /etc/persistence/data/ipsec.d/cacerts
		}
		
		[ -d  /etc/persistence/data/ipsec.d/certs ] || {
			mkdir -p /etc/persistence/data/ipsec.d/certs
		}
		
		[ -d  /etc/persistence/data/ipsec.d/ocspcerts ] || {
			mkdir -p /etc/persistence/data/ipsec.d/ocspcerts
		}
		
		[ -d  /etc/persistence/data/ipsec.d/aacerts ] || {
			mkdir -p /etc/persistence/data/ipsec.d/aacerts
		}
		
		rm -rf /etc/ipsec.d/aacerts
		rm -rf /etc/ipsec.d/cacerts
		rm -rf /etc/ipsec.d/certs
		rm -rf /etc/ipsec.d/crls
		rm -rf /etc/ipsec.d/ocspcerts
		rm -rf /etc/ipsec.d/private
		rm -rf /etc/ipsec.d/newcerts
		
		ln -sf /etc/persistence/data/ipsec.d/aacerts /etc/ipsec.d/aacerts
		ln -sf /etc/persistence/data/ipsec.d/cacerts /etc/ipsec.d/cacerts
		ln -sf /etc/persistence/data/ipsec.d/certs /etc/ipsec.d/certs
		ln -sf /etc/persistence/data/ipsec.d/crls /etc/ipsec.d/crls
		ln -sf /etc/persistence/data/ipsec.d/ocspcerts /etc/ipsec.d/ocspcerts
		ln -sf /etc/persistence/data/ipsec.d/private /etc/ipsec.d/private
		ln -sf /etc/persistence/data/ipsec.d/newcerts /etc/ipsec.d/newcerts
	fi
}
# Chris, add end, 20100427

start() {
	# Chris, add start, 20100427, deal with persistent partition
	mount_config_part_post
	sync
	# Chris, add end, 20100427
	
	echo "[ready to login]"

	apply_uci_config
	#config_load system
	#config_foreach system_config system
	set_hosts
}
