#!/bin/sh
#
# LinkStation HackKit Installer.
# Copyright (C) Yasunari YAMASHITA. All Rights Reserved.
#

ADDRESS=192.168.2.47
NETWORK=192.168.2.0
NETMASK=255.255.255.0
BROADCAST=192.168.2.255
GATEWAY=192.168.2.1
NAMESERVER=192.168.1.2
HOSTNAME=hackkit

WORK=/mnt/disk1/share/hackkit
HACKKIT=$WORK/hackkit_081122.tar.gz
MOUNTPOINT=/mnt/debinst

BOOTPARTITION=/dev/sdb1
BOOTPARTITIONTYPE=ext3
ROOTPARTITION=/dev/sdb2
SWAPPARTITION=/dev/sdb3
DATAPARTITION=/dev/sdb4
#======================================================================
# 各パーティションのフォーマット(LS-WSGL 以外)

format_disk() {
	echo formating hard drive ...

	# /boot
	if [ "$BOOTPARTITIONTYPE" = ext3 ]
	then
	    mke2fs -j $BOOTPARTITION || exit
	else
	    mke2fs $BOOTPARTITION || exit
	fi

	# /
	mkfs.xfs -f $ROOTPARTITION || exit

	# swap
	mkswap $SWAPPARTITION || exit

	# data /mnt/xxx
	if [ "$DATAPARTITION" != "" ]
	then
	    mkfs.xfs -f $DATAPARTITION || exit
	fi
}
#---------------------------------------------------------
# / のマウント

mount_root() {
	echo mounting root file system ...

	if [ ! -d $MOUNTPOINT ]
	then
		mkdir $MOUNTPOINT || exit
	fi
	mount -t xfs $ROOTPARTITION $MOUNTPOINT || exit

	if [ $MACHINE = LSWSGL ]
	then
		mkdir $MOUNTPOINT/.buffalo
		mv $MOUNTPOINT/lib/modules $MOUNTPOINT/.buffalo
		rm -fr $MOUNTPOINT/*
		mkdir $MOUNTPOINT/lib
		mv $MOUNTPOINT/.buffalo/modules $MOUNTPOINT/lib
		rmdir $MOUNTPOINT/.buffalo

		mkdir $MOUNTPOINT/mnt/disk1
		mkdir $MOUNTPOINT/mnt/disk2
	fi
}
#---------------------------------------------------------
# アーカイブの展開

extract_hackkit() {
	echo extracting hackkit archive ...

	cd $MOUNTPOINT 
	tar zxvf $HACKKIT
}

#---------------------------------------------------------
# fstab の修正（LS-WSGL のみ）

create_fstab() {
	echo creating /etc/fstab ...

cat > etc/fstab <<EOF
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>                       <dump>  <pass>
/dev/md1        /               xfs     defaults,noatime                0 0
proc            /proc           proc    defaults                        0 0
/dev/md10       swap            swap    defaults                        0 0
/dev/md0        /boot           ext2    defaults,noatime                0 0
/dev/sda6       /mnt/disk1      xfs     defaults,noatime                0 0
/dev/sdb6       /mnt/disk2      xfs     defaults,noatime                0 0
EOF
}

#---------------------------------------------------------
# miconapl のコピー（LS-GL/HS-DHGLのみ）

copy_miconapl() {
	echo copying miconapl ...

	cd /
	tar cf - usr/local/sbin/miconapl |(cd $MOUNTPOINT; tar xvf -)
	chmod +x $MOUNTPOINT/usr/local/sbin/miconapl
	tar cf - usr/local/lib/libbuffalo_bin.* |(cd $MOUNTPOINT; tar xvf -)
}

#---------------------------------------------------------
# LED コントロールスクリプトの作成

create_miconapl() {
	echo creating miconapl ...

	cd $MOUNTPOINT

	cat > etc/init.d/miconapl <<EOF
#!/bin/sh

if [ -d /proc/buffalo/gpio/led ]
then
	LED=/proc/buffalo/gpio/led
else
	LED=/proc/buffalo/led
fi

case "\$1" in
  start)
  	echo off > \$LED/power_blink
  	echo on > \$LED/power
  	echo on > \$LED/eth
	;;
  stop)
  	echo on > \$LED/power_blink
	;;
  *)
	echo "Usage: \$0 {start|stop}"
	exit 1
esac

exit 0
EOF
	chmod +x etc/init.d/miconapl
	ln -s ../init.d/miconapl etc/rc0.d/K10miconapl
	ln -s ../init.d/miconapl etc/rc6.d/K10miconapl
	ln -s ../init.d/miconapl etc/rcS.d/S80miconapl
}

create_miconapl_lsgl() {
	echo creating miconapl ...

	cd $MOUNTPOINT
	cat > etc/init.d/miconapl <<EOF
#!/bin/sh

[ -f /usr/local/sbin/miconapl ] || exit 0

case "\$1" in
  start)
  	/usr/local/sbin/miconapl -b -a boot_flash_ok
	/usr/local/sbin/miconapl -a boot_end
	;;
  stop)
	/usr/local/sbin/miconapl -a shutdown_wait
	;;
  *)
	echo "Usage: \$0 {start|stop}"
	exit 1
esac

exit 0
EOF
	chmod +x etc/init.d/miconapl
	ln -s ../init.d/miconapl etc/rc0.d/K10miconapl
	ln -s ../init.d/miconapl etc/rc6.d/K10miconapl
	ln -s ../init.d/miconapl etc/rcS.d/S80miconapl
}


#---------------------------------------------------------
# Fan コントロールスクリプトの作成（LS-GL/HS-DHGLのみ）
create_fancontrol() {
	echo creating fancontrol ...
	
	cd $MOUNTPOINT
	cat > usr/local/sbin/fancontrol <<EOF
#!/bin/sh
# LS-GL, HS-DHGL, KURO-BOX/Pro Fancontrol
# (C) Copyright Yasunari YAMASHITA 2007. All Rights Reserved.

PATH=\$PATH:/usr/sbin

# stop -> LOW |- slow -> MID |- fast -> HIGH |- full
HIGH=40
MID=30
LOW=20

if [ -f /etc/fancontrol.conf ]
then
        . /etc/fancontrol.conf
fi

#       ude:/usr/local/sbin# /usr/local/sbin/miconapl -a temp_get
#       #[miconapl.temp_get]
#       temp=45

CURTEMP=`/usr/local/sbin/miconapl -a temp_get | sed -n -e 's/temp=//p'`

echo \$CURTEMP

if [ \$CURTEMP -gt \$HIGH ] # full
then
        /usr/local/sbin/miconapl -a fan_set_speed full
        echo fan_set_speed full
elif [ \$CURTEMP -gt \$MID ] # fast
then
        /usr/local/sbin/miconapl -a fan_set_speed fast
        echo fan_set_speed fast
elif [ \$CURTEMP -gt \$LOW ] # slow
then
        /usr/local/sbin/miconapl -a fan_set_speed slow
        echo fan_set_speed slow
else                       # stop
        /usr/local/sbin/miconapl -a fan_set_speed stop
        echo fan_set_speed stop
fi
EOF

	cat > etc/fancontrol.conf <<EOF
#
# LS-GL, HS-DHGL, KURO-BOX/Pro Fancontrol configuration file
# (C) Copyright Yasunari YAMASHITA 2007. All Rights Reserved.

# stop -> LOW |- slow -> MID |- fast -> HIGH |- full

HIGH=40
MID=30
LOW=20
EOF
}

#---------------------------------------------------------
# 電源 SW による電源 OFF 対応

create_kernelmon() {
	echo creating kernelmon ...

	cd $MOUNTPOINT
	cat > etc/init.d/kernelmon <<EOF
#!/bin/sh

case "\$1" in
start)
	if [ -e /proc/buffalo/gpio/switch/sw_control ]
	then
 		echo on > /proc/buffalo/gpio/switch/sw_control
	fi
  	/usr/local/sbin/kernelmon &
	;;
stop)
	;;
*)
	echo "Usage: \$0 {start|stop}"
	exit 1
esac

exit 0
EOF
	chmod +x  $MOUNTPOINT/etc/init.d/kernelmon
	ln -s ../init.d/kernelmon $MOUNTPOINT/etc/rcS.d/S81kernelmon
	
cat > $MOUNTPOINT/usr/local/sbin/kernelmon <<EOF
#!/bin/sh

while :
do
	LINE=\`cat /proc/buffalo/kernevnt\`
	#echo "line [\$LINE]"
	if [ "\$LINE" = PSW_off ]
	then
		shutdown -h now
	fi
done
EOF
	chmod +x $MOUNTPOINT/usr/local/sbin/kernelmon
}



create_kernelmon_lsgl() {
	cd /
	sed -e 's/^\(.*logtag.*\)$/# \1/' -e 's/^\(.*logger.*\)$/# \1/' \
		/etc/init.d/kernelmon.sh > $MOUNTPOINT/etc/init.d/kernelmon
	chmod +x  $MOUNTPOINT/etc/init.d/kernelmon
	ln -s ../init.d/kernelmon $MOUNTPOINT/etc/rcS.d/S81kernelmon
	
	tar cf - usr/local/sbin/kernelmon |(cd $MOUNTPOINT; tar xvf -)
}


#---------------------------------------------------------
# カーネルモジュールのコピー

copy_modules() {
	echo copying /lib/modules ...

	cd /
	tar cf - lib/modules | (cd $MOUNTPOINT ; tar xvf -)
}

#---------------------------------------------------------
# カーネルモジュールのロードスクリプトの作成

create_usb() {
	echo creating usb ...
	
	cd $MOUNTPOINT
	cat > etc/init.d/usb <<EOF
#!/bin/sh

case "\$1" in
  start)
	if [ -e /proc/buffalo/gpio/power_control/usb0 ]
	then
		echo on > /proc/buffalo/gpio/power_control/usb0
	fi
	if [ -e /proc/buffalo/usb_control ]
	then
		echo on > /proc/buffalo/usb_control
	fi

	if [ -f /lib/modules/*/kernel/drivers/usb/core/usbcore.ko ]
	then
		insmod /lib/modules/*/kernel/drivers/usb/core/usbcore.ko
	fi
	if [ -f /lib/modules/*/kernel/drivers/usb/host/ehci-hcd.ko ]
	then
		insmod /lib/modules/*/kernel/drivers/usb/host/ehci-hcd.ko
	fi
	if [ -f /lib/modules/*/kernel/drivers/usb/host/ohci-hcd.ko ]
	then
		insmod /lib/modules/*/kernel/drivers/usb/host/ohci-hcd.ko
	fi
	if [ -f /lib/modules/*/kernel/drivers/usb/host/uhci-hcd.ko ]
	then
		insmod /lib/modules/*/kernel/drivers/usb/host/uhci-hcd.ko
	fi
	if [ -f /lib/modules/*/kernel/drivers/usb/storage/usb-storage.ko ]
	then
		insmod /lib/modules/*/kernel/drivers/usb/storage/usb-storage.ko
	fi
	if [ -f /lib/modules/*/kernel/drivers/usb/class/usblp.ko ]
	then
		insmod /lib/modules/*/kernel/drivers/usb/class/usblp.ko
	fi
	if [ -f /lib/modules/*/kernel/fs/fat/fat.ko ]
	then
		insmod /lib/modules/*/kernel/fs/fat/fat.ko
	fi
	if [ -f /lib/modules/*/kernel/fs/vfat/vfat.ko ]
	then
		insmod /lib/modules/*/kernel/fs/vfat/vfat.ko
	fi
	;;
  stop)
	if [ -f /lib/modules/*/kernel/fs/vfat/vfat.ko ]
	then
		rmmod vfat.ko
	fi
	if [ -f /lib/modules/*/kernel/fs/vfat/fat.ko ]
	then
		rmmod fat.ko
	fi
	if [ -f /lib/modules/*/kernel/fs/vfat/usblp.ko ]
	then
		rmmod usblp.ko
	fi
	if [ -f /lib/modules/*/kernel/fs/vfat/usb-storage.ko ]
	then
		rmmod usb-storage.ko
	fi
	if [ -f /lib/modules/*/kernel/fs/vfat/uhci-hcd.ko ]
	then
		rmmod uhci-hcd.ko
	fi
	if [ -f /lib/modules/*/kernel/fs/vfat/ohci-hcd.ko ]
	then
		rmmod ohci-hcd.ko
	fi
	if [ -f /lib/modules/*/kernel/fs/vfat/ehci-hcd.ko ]
	then
		rmmod ehci-hcd.ko
	fi
	if [ -f /lib/modules/*/kernel/fs/vfat/usbcore.ko ]
	then
		rmmod usbcore.ko
	fi

	if [ -e /proc/buffalo/usb_control ]
	then
		echo off > /proc/buffalo/usb_control
	fi
	if [ -e /proc/buffalo/gpio/power_control/usb0 ]
	then
		echo off > /proc/buffalo/gpio/power_control/usb0
	fi
	;;
  *)
	echo "Usage: \$0 {start|stop}"
	exit 1
esac

exit 0
EOF

	chmod +x etc/init.d/usb
	ln -s ../init.d/usb etc/rc0.d/K85usb
	ln -s ../init.d/usb etc/rc1.d/K85usb
	ln -s ../init.d/usb etc/rc2.d/S15usb
	ln -s ../init.d/usb etc/rc3.d/S15usb
	ln -s ../init.d/usb etc/rc4.d/S15usb
	ln -s ../init.d/usb etc/rc5.d/S15usb
	ln -s ../init.d/usb etc/rc6.d/K85usb
}

#======================================================================
# setup network
network_interfaces() {
	cat > $MOUNTPOINT/etc/network/interfaces <<EOF
######################################################################
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
# See the interfaces(5) manpage for information on what options are
# available.
######################################################################

# We always want the loopback interface.
#
auto lo
iface lo inet loopback

# To use dhcp:
#
# auto eth0
# iface eth0 inet dhcp

# Static IP setup: (broadcast and gateway are optional)
#
auto eth0
iface eth0 inet static
EOF
	(
	echo "	address $ADDRESS"
	echo "	network $NETWORK"
	echo "	netmask $NETMASK"
	echo "	broadcast  $BROADCAST"
	echo "	gateway $GATEWAY"
	) >> $MOUNTPOINT/etc/network/interfaces
}
#---------------------------------------------------------
# resolv.conf
resolv_conf() {
	echo "nameserver $NAMESERVER" > $MOUNTPOINT/etc/resolv.conf
}

#---------------------------------------------------------
# hosts
hosts() {
	cat > $MOUNTPOINT/etc/hosts <<EOF
127.0.0.1       localhost localhost.localdomain
EOF
	echo "$ADDRESS	$HOSTNAME" >> $MOUNTPOINT/etc/hosts
}
#---------------------------------------------------------
# hostname
hostname() {
	echo "$HOSTNAME" > $MOUNTPOINT/etc/hostname
}

#======================================================================
# / のアンマウント

umount_root() {
	umount $MOUNTPOINT
}
#======================================================================

#---------------------------------------------------------
# mount_boot

mount_boot() {
	echo checking $BOOTPARTITION

	fsck -f -y $BOOTPARTITION

	echo mounting /boot ...

	cd /
	if [ ! -d $MOUNTPOINT/boot ]
	then
		mkdir $MOUNTPOINT/boot || exit
	fi
	mount -t $BOOTPARTITIONTYPE $BOOTPARTITION $MOUNTPOINT/boot || exit
}

#---------------------------------------------------------
# copy_boot

copy_boot() {
	echo copying /boot ...

	(cd /boot ; tar cf - uImage.buffalo)|(cd $MOUNTPOINT/boot; tar xvf -)
}

#---------------------------------------------------------
# edit_initrd

edit_initrd() {
	echo editing initrd ...

	dd if=/boot/initrd.buffalo of=/boot/initrd.gz bs=64 skip=1
	echo gunziping /boot/initrd.gz ...
	gunzip /boot/initrd.gz
	if [ ! -d /tmp/root ]
	then
		mkdir /tmp/root || exit
	fi

	for minor in 0 1 2 3 4 5 6 7 8 9
	do
		if [ ! -e /dev/loop$minor ]
		then
			mknod /dev/loop$minor b 7 $minor
		fi
	done

	mount -o loop /boot/initrd /tmp/root || exit
	mv /tmp/root/linuxrc /tmp/root/linuxrc.orig
	if [ $MACHINE = LSWSGL ]
	then
	cat > /tmp/root/linuxrc <<EOF
#!/bin/sh

export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

echo "---- in hackkit linuxrc ---"

exit 0
EOF
	else
	cat > linuxrc <<EOF
#!/bin/sh

export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

echo "---- in hackkit linuxrc ---"

mount proc /proc -t proc
mount sysfs /sys -t sysfs

ldconfig
depmod

/etc/init.d/startSysMd.sh
echo "0x901" > /proc/sys/kernel/real-root-dev

umount /sys
umount /proc
umount -a
exit 0
EOF

	chmod 700 /tmp/root/linuxrc
	umount /tmp/root
	echo gziping /boot/initrd ... wait 5 minutes
	gzip /boot/initrd || exit
	
	chmod 755 $WORK/mkimage
	chown root.root $WORK/mkimage
	
	$WORK/mkimage -A ARM -O Linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n initrd -d /boot/initrd.gz $MOUNTPOINT/boot/initrd.buffalo

	rm -f /boot/initrd.gz
}

#---------------------------------------------------------
# umount_boot

umount_boot() {
	echo unmount /boot ...

	sync
	umount $MOUNTPOINT/boot
}

#======================================================================
if [ ! -r $HACKKIT ]
then
	echo $HACKKIT not found
	exit
fi
if [ ! -r $WORK/mkimage ]
then
	echo $WORK/mkimage not found
	exit
fi

if [ ! -f /proc/buffalo/firmware ]
then
	echo /proc/buffalo/firmware dose not exist.
	exit
fi

# PRODUCTID=0x0000x00y
PRODUCTID=`sed -n -e 's/^PRODUCTID=\(.*\)$/\1/p' /proc/buffalo/firmware`
echo PRODUCTID = "$PRODUCTID"

case "$PRODUCTID" in
0x00000009)
	MACHINE=LSGL
	# 各パーティションのフォーマット
	format_disk
	# / のマウント
	mount_root
	# アーカイブの展開
	extract_hackkit
	# fstab の修正（LS-WSGL のみ）
	#create_fstab
	# miconapl のコピー（LS-GL/HS-DHGLのみ）
	copy_miconapl
	# LED コントロールスクリプトの作成
	create_miconapl_lsgl
	# Fan コントロールスクリプトの作成（LS-GL/HS-DHGLのみ）
	create_fancontrol
	# 電源 SW による電源 OFF 対応
	create_kernelmon_lsgl
	# カーネルモジュールのコピー(LS-WSGL 以外)
	copy_modules
	# カーネルモジュールのロードスクリプトの作成
	create_usb

	# ネットワークのセットアップ
	network_interfaces
	resolv_conf
	hosts
	hostname

	# / のアンマウント
	umount_root

	# /boot のマウント
	mount_boot
	# /boot のコピー
	copy_boot
	# initrd の編集
	edit_initrd
	# /boot のアンマウント
	umount_boot
	;;
0x0000000A)
	MACHINE=HSDHGL

	# 各パーティションのフォーマット
	format_disk
	# / のマウント
	mount_root
	# アーカイブの展開
	extract_hackkit
	# fstab の修正（LS-WSGL のみ）
	#create_fstab
	# miconapl のコピー（LS-GL/HS-DHGLのみ）
	copy_miconapl
	# LED コントロールスクリプトの作成
	create_miconapl_lsgl
	# Fan コントロールスクリプトの作成（LS-GL/HS-DHGLのみ）
	create_fancontrol
	# 電源 SW による電源 OFF 対応
	create_kernelmon_lsgl
	# カーネルモジュールのコピー(LS-WSGL 以外)
	copy_modules
	# カーネルモジュールのロードスクリプトの作成
	create_usb

	# ネットワークのセットアップ
	network_interfaces
	resolv_conf
	hosts
	hostname

	# / のアンマウント
	umount_root

	# /boot のマウント
	mount_boot
	# /boot のコピー
	copy_boot
	# initrd の編集
	edit_initrd
	# /boot のアンマウント
	umount_boot
	;;
0x0000000B)
	MACHINE=LSLGL
	echo LS-LGL is not supported.
	exit
	;;
0x0000000E)
	MACHINE=LSHGL

	# 各パーティションのフォーマット
	format_disk
	# / のマウント
	mount_root
	# アーカイブの展開
	extract_hackkit
	# fstab の修正（LS-WSGL のみ）
	#create_fstab
	# miconapl のコピー（LS-GL/HS-DHGLのみ）
	#copy_miconapl
	# LED コントロールスクリプトの作成
	create_miconapl
	# Fan コントロールスクリプトの作成（LS-GL/HS-DHGLのみ）
	# create_fancontrol
	# 電源 SW による電源 OFF 対応
	create_kernelmon
	# カーネルモジュールのコピー(LS-WSGL 以外)
	copy_modules
	# カーネルモジュールのロードスクリプトの作成
	create_usb

	# ネットワークのセットアップ
	network_interfaces
	resolv_conf
	hosts
	hostname

	# / のアンマウント
	umount_root

	# /boot のマウント
	mount_boot
	# /boot のコピー
	copy_boot
	# initrd の編集
	edit_initrd
	# /boot のアンマウント
	umount_boot
	;;
0x0000000F)
	MACHINE=LSCL

	# 各パーティションのフォーマット
	format_disk
	# / のマウント
	mount_root
	# アーカイブの展開
	extract_hackkit
	# fstab の修正（LS-WSGL のみ）
	#create_fstab
	# miconapl のコピー（LS-GL/HS-DHGLのみ）
	#copy_miconapl
	# LED コントロールスクリプトの作成
	create_miconapl
	# Fan コントロールスクリプトの作成（LS-GL/HS-DHGLのみ）
	# create_fancontrol
	# 電源 SW による電源 OFF 対応
	create_kernelmon
	# カーネルモジュールのコピー(LS-WSGL 以外)
	copy_modules
	# カーネルモジュールのロードスクリプトの作成
	create_usb

	# ネットワークのセットアップ
	network_interfaces
	resolv_conf
	hosts
	hostname

	# / のアンマウント
	umount_root

	# /boot のマウント
	mount_boot
	# /boot のコピー
	copy_boot
	# initrd の編集
	edit_initrd
	# /boot のアンマウント
	umount_boot
	;;
0x00003002)
	MACHINE=LSWSGL

	BOOTPARTITION=/dev/md0
	BOOTPARTITIONTYPE=ext2
	ROOTPARTITION=/dev/md1
	SWAPPARTITION=/dev/md10
	DATAPARTITION=""

	# 各パーティションのフォーマット
	format_disk
	# / のマウント
	mount_root
	# アーカイブの展開
	extract_hackkit
	# fstab の修正（LS-WSGL のみ）
	create_fstab
	# miconapl のコピー（LS-GL/HS-DHGLのみ）
	#copy_miconapl
	# LED コントロールスクリプトの作成
	create_miconapl
	# Fan コントロールスクリプトの作成（LS-GL/HS-DHGLのみ）
	# create_fancontrol
	# 電源 SW による電源 OFF 対応
	create_kernelmon
	# カーネルモジュールのコピー(LS-WSGL 以外)
	# copy_modules
	# カーネルモジュールのロードスクリプトの作成
	create_usb

	# ネットワークのセットアップ
	network_interfaces
	resolv_conf
	hosts
	hostname

	# / のアンマウント
	umount_root

	# /boot のマウント
	mount_boot
	# /boot のコピー
	copy_boot
	# initrd の編集
	edit_initrd
	# /boot のアンマウント
	umount_boot
	;;
*)
	echo unknown PRODUCTID = "$PRODUCTID"
	exit
	;;
esac

