#!/bin/bash
# Create UML root filesystem
#
# Copyright (C) 2004  Eric Marchionni, Patrik Rayo
# Zuercher Hochschule Winterthur
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
#
# 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.

DIR=`dirname $0`

source $DIR/function.sh

[ -f $DIR/../testing.conf ] || die "!! Configuration file 'testing.conf' not found"

source $DIR/../testing.conf

cecho-n " * Looking for root image at '$ROOTFS'.."
if [ -f "$ROOTFS" ]
then
    cgecho "found it"
else
    cecho "none"
    exit
fi

[ -d $BUILDDIR ] || die "!! Directory '$BUILDDIR' does not exist"

ROOTFSDIR=$BUILDDIR/root-fs

if [ ! -d $ROOTFSDIR ]
then
    cecho-n " * Root file system directory '$ROOTFSDIR' does not exist..creating.."
    mkdir $ROOTFSDIR
    cgecho "done"
fi

cd $ROOTFSDIR

if [ ! -d $LOOPDIR ]
then
    mkdir $LOOPDIR
fi

######################################################
# mount root image
#
BASE=$BUILDDIR/base.img
cecho-n " * Mounting base image $BASE.."
cp $ROOTFS $BASE
mount -o loop $BASE $LOOPDIR >> $LOGFILE 2>&1
mount -t proc none $LOOPDIR/proc >> $LOGFILE 2>&1
cgecho "done"

######################################################
# setting up mountpoint for shared source tree
#
if [ "${SHAREDTREE+set}" = "set" ]; then
    cecho " * setting up shared strongswan tree at '$SHAREDTREE'"
    mkdir $LOOPDIR/root/strongswan-shared
    echo "" >> $LOOPDIR/etc/fstab
    echo "none /root/strongswan-shared hostfs $SHAREDTREE" >> $LOOPDIR/etc/fstab
fi

######################################################
# install software from source using 'recipes'
#
mkdir -p $ROOTFSCOMPILEDIR
cecho " * Mounting $ROOTFSCOMPILEDIR as /root/compile.."
mkdir -p $LOOPDIR/root/compile
mount -o bind $ROOTFSCOMPILEDIR $LOOPDIR/root/compile >> $LOGFILE 2>&1

cecho " * Installing software from source.."
RECPDIR=$UMLTESTDIR/testing/scripts/recipes
RECIPES=`ls $RECPDIR/*.mk | xargs -n1 basename`
for r in $RECIPES
do
	cecho-n "   - $r.."
	cp $RECPDIR/$r ${LOOPDIR}/root/compile
	chroot ${LOOPDIR} make -C /root/compile -f $r >>$LOGFILE 2>&1
	if [ $? != 0 ]; then
		cecho "failed"
	else
		cgecho "done"
	fi
done

umount $LOOPDIR/root/compile

######################################################
# remove /etc/resolv.conf
#
cecho " * Removing /etc/resolv.conf"
rm -f $LOOPDIR/etc/resolv.conf

#####################################
# preparing ssh for PK authentication
#
if [ ! -d ~/.ssh ]
then
	cecho-n " * Creating directory '~/.ssh'.."
	mkdir ~/.ssh
	cgecho "done"
fi

cecho-n " * Checking for ssh rsa key '~/.ssh/id_rsa.pub'.."
if [ -f ~/.ssh/id_rsa.pub ]
then
	cecho "already exists"
else
	cecho "not found"
	cecho-n " * Generating ssh rsa key pair.."
	echo "" | ssh-keygen -N "" -t rsa -f ~/.ssh/id_rsa >> $LOGFILE 2>&1
	cgecho "done"
fi

if [ -f ~/.ssh/known_hosts ]
then
	cecho-n " * Backing up ~/.ssh/known_hosts to '~/.ssh/known_hosts.before_uml'.."
	cp -fp ~/.ssh/known_hosts ~/.ssh/known_hosts.before_uml
	cgecho "done"
fi
rm ~/.ssh/known_hosts
cecho-n " * Creating new '~/.ssh/known_hosts'.."
touch ~/.ssh/known_hosts
cgecho "done"

for host in $HOSTNAMEIPV4
do
	HOSTNAME=`echo $host | awk -F, '{ print $1 }'`
	IP=`echo $host | awk -F, '{ print $2 }'`
	cecho-n " * Adding uml host $HOSTNAME ($IP) to '~/.ssh/known_hosts'.."
	echo "$HOSTNAME,$IP `cat $LOOPDIR/etc/ssh/ssh_host_rsa_key.pub`" >> ~/.ssh/known_hosts
	cgecho "done"
done

######################################################
# copying the host's ssh public key
#
if [ ! -d $LOOPDIR/root/.ssh ]
then
    mkdir $LOOPDIR/root/.ssh
fi
cp ~/.ssh/id_rsa.pub $LOOPDIR/root/.ssh/authorized_keys

######################################################
# setup public key based login among all hosts
#
cp $LOOPDIR/etc/ssh/ssh_host_rsa_key $LOOPDIR/root/.ssh/id_rsa

for host in $STRONGSWANHOSTS
do
    eval ip="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F- '{ print $1 }' | awk '{ print $1 }'`"
    echo "$host,$ip `cat $LOOPDIR/etc/ssh/ssh_host_rsa_key.pub`" >> $LOOPDIR/root/.ssh/known_hosts
    echo "`cat $LOOPDIR/etc/ssh/ssh_host_rsa_key.pub` root@$host" >> $LOOPDIR/root/.ssh/authorized_keys
done

umount $LOOPDIR/proc
umount $LOOPDIR
