#!/bin/bash
#
# Copyright (C) 2001,2002,2003,2004,2005,2006,2007,2008 Andreas Lang-Nevyjel
#
# Send feedback to: <lang-nevyjel@init.at>
#
# This file is part of cluster-backbone
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License Version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

BM_MESG="boot maintenance (stage2)"
PS_NORMAL="preparing normal mode"
PS_TEST="preparing test mode"
PS_RESCUE="preparing rescue mode"
JT_NORMAL="starting"
JT_TEST="starting test mode"
JT_RESCUE="starting rescue mode"
JT_CLEAN="starting clean mode"
PART_MESG="partitioning"
FORM_MESG="formatting"
MP_MESG="creating mountpoints"
UNP_MESG="unpacking"
INS_MESG="installing"
RSYNC_MESG="rsyncing"
RSYNC_REFRESH_MESG="rsyncing"
FIX_MESG="fixing directory structure"
PACK_MESG="installing packages"
COPY_CONF="copying config for"
GENERATE_INITRD="generating initrd"
START_SYSLOG="start syslog"
LILO_MSG="running lilo"
GRUB_MSG="running grub"
REBOOT_MSG="down to runlevel 6"
S2_DONE="stage2 finished"
MOUNT_STRING="mounting config"

if [ true ] ; then
    BOLD="\033[1m"
    RED="\033[31m"
    GREEN="\033[32m"
    YELLOW="\033[33m"
    OFF="\033[m"
fi

[ ! -f /bin/sh ] && ln -s /bin/bash /bin/sh

basedir="new"

export LS_OPTIONS="-a -N --color=tty -T 0"
alias l='ls -alF'
alias la='ls -la'
alias ll='ls -l'
alias ls='ls $LS_OPTIONS'
alias ls-l='ls -l'
alias ..='cd ..'
alias ...='cd ../..'

RW_MOUNTOPTS="-o nolock,rw,udp,rsize=8192,wsize=8192,noac"
RO_MOUNTOPTS="-o nolock,ro,udp,rsize=8192,wsize=8192,noac"
MOUNT_RETRIES=10
MOUNT_SLEEP=30

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

# modify reboot
cp -a /sbin/reboot /sbin/reboot.old
rm /sbin/reboot
echo "#!/bin/bash" > /sbin/reboot
echo "/sbin/reboot.old -f " >> /sbin/reboot
chmod +x /sbin/reboot

function start_shell() {
    echo "Starting /bin/bash" | logger -s
    mkdir -p /root
    alias > /root/.bashrc
    chmod 0540 /etc/shadow
    echo $motherserver > /root/.rhosts
    /bin/bash  2>&1
}

function reboot() {
    set_hoststat ${REBOOT_MSG}
    /sbin/sync
    /sbin/reboot -f
}

function err_exit() {
    set_hoststat "Error $@"
    echo -e "${RED}Some error occured ($@), executing /bin/bash${OFF}"
    echo "server root" > /root/.rhosts
    echo "mounting /dev/pts"
    [ ! -d /dev/pts ] && mkdir /dev/pts
    mount -n -t devpts -o mode=0620,gid=5 devpts /dev/pts 
    if [ -x /usr/sbin/xinetd ] ; then
        logger -s "starting /usr/sbin/xinetd"
	/usr/sbin/xinetd & 
    elif [ -x /usr/sbin/inetd ] ; then
        logger -s "starting /usr/sbin/inetd"
	/usr/sbin/inetd &
    else
	logger "no inetd or xinetd found "
	echo -e "${RED}No inetd found, skipping${OFF}"
    fi
    start_shell
#  exit -1
}

function generate_devicefiles() {
    mknod /dev/tty c 5 0
    mknod -m 0644 /dev/urandom c 1 9
    for dsk in hda:3:0 hdb:3:64 hdc:22:0 hdd:22:64 hde:33:0 hdf:33:64 hdg:34:0 hdh:34:64 ; do
	bname=/dev/`echo $dsk | cut -d ":" -f 1`
	major=`echo $dsk | cut -d ":" -f 2`
	minor=`echo $dsk | cut -d ":" -f 3`
	mknod -m 0600 $bname b $major $minor
	for i in $(seq 31) ; do
	    minor=$(( $minor + 1 ))
	    mknod -m 0600 $bname$i b $major $minor
	done
    done
    major=8
    minor=0
    for dsk in a b c d e f g h i j k l m n o p ; do
	bname=/dev/sd$dsk
	mknod -m 0600 $bname b $major $minor
	for i in $(seq 15) ; do
	    minor=$(( $minor + 1 ))
	    mknod -m 0600 $bname$i b $major $minor
	done
	minor=$(( $minor + 1 ))
    done
    cpq=/dev/cciss
    mkdir $cpq
    major=104
    for cac in 0 1 ; do
	minor=0
	bname=${cpq}/c${cac}
	for dsk in $(seq 0 4) ; do 
	    dname=${bname}d${dsk}
	    mknod -m 0600 $dname b $major $minor
	    minor=$(( $minor + 1 ))
	    for i in $(seq 15) ; do
		mknod -m 0600 ${dname}p$i b $major $minor
		minor=$(( $minor + 1 ))
	    done
	done
	major=$(( $major + 1 ))
    done
    cpq=/dev/ida
    mkdir $cpq
    major=72
    for cac in 0 1 ; do
	minor=0
	bname=${cpq}/c${cac}
	for dsk in $(seq 0 4) ; do
	    dname=${bname}d${dsk}
	    mknod -m 0600 $dname b $major $minor
	    minor=$(( $minor + 1 ))
	    for i in $(seq 15) ; do
		mknod -m 0600 ${dname}p$i b $major $minor
		minor=$(( $minor + 1 ))
	    done
	done
	major=$(( $major + 1 ))
    done
}

#python-init

echo
echo -e "\n${GREEN}${BOLD}init.at local initrd (c) 2008 init.at (lang-nevyjel@init.at)${OFF}"
echo "/dev/ram1 / ext2 rw 0 0" > /etc/mtab

echo -e "mounting /proc and /sys"
[ ! -d /proc ] && mkdir /proc
mount -n proc  /proc -t proc
[ ! -d /sys ] && mkdir /sys
mount -n sysfs  /sys -t sysfs

# do depmod call
depmod -a
# load xen stuff
modprobe xennet
modprobe xenblk
modprobe nfs

for line in `cat /proc/cmdline` ; do
    echo $line | grep "=" > /dev/null && eval $line ;
done

echo -e "generating device files"
generate_devicefiles

# setup interface
ipaddr=$(echo $ip | awk -F ":" '{print $1}')
gateway=$(echo $ip | awk -F ":" '{print $3}')
netmask=$(echo $ip | awk -F ":" '{print $4}')
device=$(echo $ip | awk -F ":" '{print $6}')
ifconfig $device $ipaddr netmask $netmask up

echo "Actual network setup (ifconfig -a):"
ifconfig -a

server=$(echo $nfsroot | awk -F ":" '{print $1}')
nfs_root=$(echo $nfsroot | awk -F ":" '{print $2}')

basedir=/nfs

mkdir ${basedir}

mount -t nfs -o nolock ${server}:${nfs_root} ${basedir}

umount /proc
umount /sys

cd ${basedir}
rm -rf initrd
mkdir -v initrd

[ ! -c $basedir/dev/console ] && mknod $basedir/dev/console -m 0640 c 5 1

# no pivot root because of BA/CA bug
#pivot_root . initrd || exec /lib/mkinitrd/bin/run-init -c ./dev/console ${basedir} /sbin/init

exec chroot . /sbin/init q < dev/console > dev/console 2>&1
