#!/bin/sh /etc/rc.common
# Copyright (C) 2006 OpenWrt.org

START=10
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
}

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

# Chris, add start, 20100427, deal with persistent partition
mount_config_and_data() {
	#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
	}
	[ -L /etc/passwd ] || {
		[ -f /etc/passwd ] && {
			#echo "[Convert config type]passwd is a file"
			mv /etc/passwd /etc/persistence/data/passwd
		}
	}
	[ -L /etc/group ] || {
		[ -f /etc/group ] && {
			#echo "[Convert config type]group is a file"
			mv /etc/group /etc/persistence/data/group
		}
	}
	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

	# 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
		}
	}

	# 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
	}
	for file in $(ls /etc/config-default); do
	[ -f /etc/config/$file ] || {
		cp /etc/config-default/$file /etc/config
	}
	done
	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
	}

	# Link data
	ln -sf /etc/persistence/data/passwd /etc/passwd
	ln -sf /etc/persistence/data/group /etc/group
	
	
	# Copy IPSec
	[ -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
	

	
	
}
# Chris, add end, 20100427

kernel_boot_ok() {
	#added by Vincent F. 2013/02/07
	#kernel boot successfully, reset folloing env variables
	[ "`mtd fw_printenv 0 |grep ker_boot_check`" ] && mtd fw_setenv ker_boot_check
	[ "`mtd fw_printenv 0 |grep ker_boot_retry`" ] && mtd fw_setenv ker_boot_retry
	echo "[boot.init][kernel_boot_ok]" > /dev/console
}

check_uboot_ver() {
	local ver_uboot
	ver_uboot=`mtd fw_printenv 1 |grep ver_uboot |sed -e "s/ver_uboot=//"`
	[ "$ver_uboot" ] || ver_uboot=0
	if [ $ver_uboot -lt 29 ]; then
		echo " " > /dev/console
		echo "============================================================" > /dev/console
		echo "** Warning !!                                             **" > /dev/console
		echo "** Your bootloader version is out of date!                **" > /dev/console
		echo "** Please manually upgrade bootloader or contact DRAYTEK. **" > /dev/console
		echo "============================================================" > /dev/console
		echo " " > /dev/console
	fi
}

start() {
	kernel_boot_ok
	check_uboot_ver
	[ -f /proc/mounts ] || /sbin/mount_root
	[ -f /proc/jffs2_bbc ] && echo "S" > /proc/jffs2_bbc

	# move to draytek_flash_partition and boot_post
	# Chris, add start, 20100427, deal with persistent partition
#	mount_config_and_data
	# Chris, add end, 20100427

	vconfig set_name_type DEV_PLUS_VID_NO_PAD

	# move to boot_post
#	apply_uci_config
#	config_load system
#	config_foreach system_config system
	klogd -c1
	
	mkdir -p /var/run
	mkdir -p /var/log
	mkdir -p /var/lock
	mkdir -p /tmp/web_apply_lock		#this directory contains locks for blocking the function script from executing when multiple users concurrently access the same function from WebUI
	mkdir -p /tmp/profile_backup		#this directory allows function scripts to save their important data for future referneces
	mkdir -p /tmp/exec_time_measure		#this directory is for saving process execution time for future speedup referneces
	mkdir -p /tmp/dray_debug            #this directory is to restore debug log file
	touch /var/log/wtmp
	touch /var/log/lastlog
	touch /tmp/enabled_lan_attr
	touch /tmp/web_portal_attr
	
	sn2=$(mtd fw_printenv 1 | grep sn2= | cut -d '=' -f 2)
	model=$(head -n 1 /etc/version)
	DEF_CFG_NAME=/etc/"$sn2"_"$model"_default.tar.gz
	SN2_FILE=/etc/persistence/config/model.sn2
	[ -n "$sn2" -a -e "$DEF_CFG_NAME" ] && {	# default state
		[ -e "$SN2_FILE" ] || { 
			#mount -t jffs2 /dev/mtdblock7 /etc/persistence
			cp $DEF_CFG_NAME /tmp/cfg.tar.gz
			/sbin/cfg_restore 0 0 1		# restore default cfg for sn2
			#uci commit
			echo "Apply default configuration for model $model $sn2 ....." >/dev/console
			logger "Apply default configuration for model $model $sn2"
		}

	}
	
	[ "$(strings $SN2_FILE 2> /dev/null)" == "" ] && { 
		# rm all other default cfg file
		for tar_file in /etc/*_default.tar.gz
		do 
			[ "$DEF_CFG_NAME" == "$tar_file" ] || {
				[ -f "$tar_file" ] && rm "$tar_file" 2>/dev/null
			}
		done
			
		#uci set system.@system[0].sn2=$sn2
		#uci commit system
		case "$sn2" in
			*)
				echo $model > $SN2_FILE
				;;
		esac
	}

	if [ "$model" = "Vigor3900" ] ;then
		#Get Vigor 3900 switch model config
		switch_model=$(/sbin/mtd fw_printenv 1|grep switch_model|awk -F = '{print $2}')
		if [ "$switch_model" = 0 ] ;then
			touch /tmp/v39sw_model
			echo "rtk8366" >/tmp/v39sw_model
			echo STATUS > /tmp/rtk_wanstatus_cfg
			echo wan >> /tmp/rtk_wanstatus_cfg
			echo false >> /tmp/rtk_wanstatus_cfg
			
			echo STATUS > /tmp/rtk_lanstatus_cfg
			echo lan >> /tmp/rtk_lanstatus_cfg
			echo false >> /tmp/rtk_lanstatus_cfg
		elif [ "$switch_model" = 1 ] ;then
			touch /tmp/v39sw_model
			echo "ar8327" >/tmp/v39sw_model
		fi
	elif [ "$model" = "Vigor2960" -o "$model" = "Vigor2960F" ] ;then
		#Set Vigor2960 switch model config
		touch /tmp/v29sw_model
		echo "ar8327" >/tmp/v29sw_model
	fi
	
	ln -s /tmp/resolv.conf.auto /tmp/resolv.conf >&- 2>&- <&-
	[ "$FAILSAFE" = "true" ] && touch /tmp/.failsafe
	
	# We change this sysctl here because we want to do it as early as possible
	echo 2 > /proc/sys/vm/lowmem_reserve_ratio

	killall -q hotplug2
	#power off USB device
	if [ "$model" = "Vigor2960" -o "$model" = "Vigor300B" -o "$model" = "Vigor2960F" ];then
		mmiotool -w 0x24000c00 0x31313131 1>/dev/null 2>&1
	else	# for Vigor3900
		mmiotool -w 0x28018000 0x3c3c3c3c 1>/dev/null 2>&1
	fi
	[ -x /sbin/hotplug2 ] && /sbin/hotplug2 --override --persistent \
						--set-worker /lib/hotplug2/worker_fork.so \
						--set-rules-file /etc/hotplug2.rules \
						--max-children 1 >/dev/null 2>&1 &

	# the coldplugging of network interfaces needs to happen later, so we do it manually here
	for iface in $(awk -F: '/:/ {print $1}' /proc/net/dev); do
		/usr/bin/env -i ACTION=add INTERFACE="$iface" /sbin/hotplug-call net
	done

	# the coldplugging of network interfaces needs to happen later, so we do it manually here
##### ian.20091012 fix PPPoE failure, use "ifup -a" to initial network instead of hotplug2
#	for iface in $(awk -F: '/:/ {print $1}' /proc/net/dev); do
#		/usr/bin/env -i ACTION=add INTERFACE="$iface" /sbin/hotplug-call net
#	done
##### ian.20091012 end

	# create /dev/root if it doesn't exist
	[ -e /dev/root ] || {
		rootdev=$(awk 'BEGIN { RS=" "; FS="="; } $1 == "root" { print $2 }' < /proc/cmdline)
		[ -n "$rootdev" ] && ln -s "$rootdev" /dev/root
	}

	load_modules /etc/modules.d/*
	
	#dennis added for core dump file
	touch /.init_enable_core
	sysctl -w "kernel.core_pattern=/tmp/%e.%p.%s.%t.core"

	#enable watchdog, touch every 2 seconds
	watchdog -t 2 /dev/comcerto_wdt
}
