#! /bin/sh
#
# qemu-httpfuse.sh qemu/kqemu/kvm startup script on http-fuse
# Toshiki Yagi and Kuniyasu Suzaki, May 15, 2007
# Copyright 2007, Toshiki Yagi <yagi-toshiki@aist.go.jp>
# Copyright 2007, Kuniyasu Suzaki <k.suzaki@aist.go.jp>
#
# 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.
#
# 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

do_tun()
{
if [ ! -c /dev/net/tun -a ! -r /dev/net/tun -a ! -w /dev/net/tun ];then
  sudo sh -c "\
  rm -rf /dev/net;\
  mkdir -p /dev/net;\
  mknod /dev/net/tun c 10 200;\
  chgrp -R users /dev/net;\
  chmod -R 775 /dev/net;"
fi

if [ -e /proc/sys/net/ipv4/ip_forward -a x`cat /proc/sys/net/ipv4/ip_forward` != x1 ];then
  sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
fi

}

MEM=256
KVM=1
KQEMU=1

CDNURL="http://unit.aist.go.jp/itri/knoppix/knxblock"
URL_SELECT=/usr/share/httpfuse-xen/url_select.sh
DELIVERMENU=deliver_etch_amd64.list
BLOCK_SELECT=/usr/share/httpfuse-xen/block_select.sh
CONTENTSMENU=contents_etch_amd64.list
HTTPSTORAGED=httpstoraged
HTTPSTORAGED_OPTIONS="-f"
HTTPSTORAGED_BASEMOUNTPOINT="/mnt/fake"
HTTPSTORAGED_SOURCE=""

while [ ! -z "$1" ]
do
  case $1 in
    -no-kvm)
      KVM=0
    ;;
    -no-kqemu)
      KQEMU=0
    ;;
    -no-module)
      KVM=0
      KQEMU=0
    ;;
    -*)
      echo "usage: $0 [-no-kvm|-no-kqemu|-no-module]"
      echo "  -no-kvm   : disable KVM kernel module usage"
      echo "  -no-kqemu : disable KQEMU kernel module usage"
      echo "  -no-module: disable all kernel module usage"
      exit
    ;;
    *)
      echo $1: invalid argument.
      exit;
    ;;
  esac
  shift;
done

# check kvm,kqemu
KVM_MOD=0
KQEMU_MOD=0
NOKQEMU="-no-kqemu"
PROGRAM=/usr/bin/qemu

sudo modprobe fuse 2> /dev/null
sudo modprobe kvm_intel 2> /dev/null && KVM_MOD=1
sudo modprobe kvm_amd 2> /dev/null && KVM_MOD=1
sudo modprobe kqemu 2> /dev/null && KQEMU_MOD=1

# kvm
if [ "$KVM_MOD" == "1" -a "$KVM" != "0" ];then
  echo "KVM mode."
  NOKQEMU=""
  PROGRAM=/usr/bin/kvm
fi

# qemu
echo "QEMU mode."
if [ "$KQEMU_MOD" == "1" -a "$KQEMU" != "0" ];then
  echo "Found kqemu module."
  SHM=$(( $MEM + 16 ))
  FREEMEM="$(awk 'BEGIN{m=0};/MemFree|Cached|SwapFree/{m+=$2};END{printf"%d\n",m/1024}' /proc/meminfo)"
  if [ $FREEMEM -lt $(( $SHM + $MEM )) ];then
    echo You do not have enough memory for the ${MEM}MB of QEMU with kqemu.
    echo Disable the accelerator module with -no-kqemu.
    exit;
  fi

  if [ -d /ramdisk/tmp ];then
    echo Found /ramdisk/tmp.
    export QEMU_TMPDIR=/ramdisk/tmp
  elif ! mount | grep -q /dev/shm 2> /dev/null ; then
    echo mount /dev/shm...
    sudo sh -c "mount -t tmpfs -o size=${SHM}m none /dev/shm"
  fi
  NOKQEMU= 
fi

if [ -e /proc/sys/dev/rtc/max-user-freq -a  x`cat /proc/sys/dev/rtc/max-user-freq` != x1024 ];then
  sudo sh -c "echo 1024 > /proc/sys/dev/rtc/max-user-freq"
fi

[ -f $URL_SELECT  ] && . $URL_SELECT
[ -f $BLOCK_SELECT ] && . $BLOCK_SELECT

HTTPSTORAGED_SOURCE=${CDN}/${BLOCKDIR}.idx

[ -d /var/tmp/blocks ] || sudo mkdir -p /var/tmp/blocks
[ -f /var/tmp/blocks/${BLOCKDIR}.idx ] || wget $HTTPSTORAGED_SOURCE -O /var/tmp/blocks/${BLOCKDIR}.idx

HTTPSTORAGED_MOUNTPOINT=$HTTPSTORAGED_BASEMOUNTPOINT
tempnum=1
while [ -d $HTTPSTORAGED_MOUNTPOINT ] ; do
    HTTPSTORAGED_MOUNTPOINT=$HTTPSTORAGED_BASEMOUNTPOINT$tempnum
    tempnum=$(expr $tempnum + 1)
done
sudo mkdir $HTTPSTORAGED_MOUNTPOINT

sudo $HTTPSTORAGED $HTTPSTORAGED_OPTIONS $HTTPSTORAGED_MOUNTPOINT $HTTPSTORAGED_SOURCE > /dev/null 2>&1 &

echo -n "waiting until $HTTPSTORAGED is ready."
while true ; do
    sleep 1
    test -e /tmp/.fuse_ready && break
    echo -n "."
done
echo "done."

## use tun.
#do_tun
#/usr/bin/qemu -m $MEM -n /etc/qemu/qemu-ifup -boot d -cdrom /dev/cdrom

# user mode network.
#/usr/bin/qemu -m $MEM -user-net -boot c -hda /dev/cdrom -localtime -enable-audio
$PROGRAM $NOKQEMU -m $MEM -boot c -hda ${HTTPSTORAGED_MOUNTPOINT}/${BLOCKDIR} -localtime 

