#!/bin/bash
# Copyright ©2007-2008 Hugo Mills <hugo@carfax.org.uk>
# Licensed under GPLv2. See the file COPYING for full details.

CONFDIR=/etc/vamos
QEMU_COMMAND=qemu-system-x86_64

NETMASK=255.255.255.0
VIDEO=sdl

if [ -f ${CONFDIR}/vamos.conf ]; then
    . ${CONFDIR}/vamos.conf
fi

if [ -f ${USERCONFDIR}/vamos.conf ]; then
    . ${USERCONFDIR}/vamos.conf
fi

VMNAME=${1}

if [ -z "${VMNAME}" ]; then
    echo No config file specified
    exit 1
fi

#echo ${CONFDIR}
#echo ${VMNAME}

if [ -f ${CONFDIR}/${VMNAME} ]; then
    . ${CONFDIR}/${VMNAME}
elif [ -f ${USERCONFDIR}/${VMNAME} ]; then
    . ${USERCONFDIR}/${VMNAME}
else
    echo Config ${VMNAME} not found.
    exit 1
fi

if [ -z "${ID}" ]; then
    echo No ID specified for ${VMNAME}
    exit 1
fi

shift

# Disks
if [ "${HDA}" ]; then DISKS="${DISKS} -hda ${HDA}"; fi
if [ "${HDB}" ]; then DISKS="${DISKS} -hdb ${HDB}"; fi
if [ "${CDROM}" ]; then
    DISKS="${DISKS} -cdrom ${CDROM}"
else
    if [ "${HDC}" ]; then DISKS="${DISKS} -hdc ${HDC}"; fi
fi
if [ "${HDD}" ]; then DISKS="${DISKS} -hdd ${HDD}"; fi
for VAR in ${!VIRTIO*}; do
    DISKS="${DISKS} -drive file=${!VAR},if=virtio"
done
for VAR in ${!SCSI*}; do
    DISKS="${DISKS} -drive file=${!VAR},if=scsi"
done

# Platform
if [ "${RAM}" ]; then MEMORY="-m ${RAM}"; fi
if [ "${CPUS}" ]; then CPU_CMD="-smp ${CPUS}"; fi

# Network
if [ "${GUEST_MAC}" ]; then MAC=",macaddr=${GUEST_MAC}"; fi
if [ -z "${VLAN}" ]; then VLAN=${ID}; fi
if [ "${GUEST_NIC}" ]; then NIC=",model=${GUEST_NIC}"; fi

case "${NET_TYPE}" in
    routed)
	if [ $UID -ne 0 ]; then
	    echo root permissions needed to run in routed mode
	    exit 1
	fi
	NETWORK="-net nic,vlan=${VLAN}${MAC}${NIC}"
	NETWORK="${NETWORK} -net tap,vlan=${VLAN},ifname=tap${VLAN},script=${CONFDIR}/scripts/ifup-routed"
	;;
    bridged)
	if [ $UID -ne 0 ]; then
	    echo root permissions needed to run in bridged mode
	    exit 1
	fi
	NETWORK="-net nic,vlan=${VLAN}${MAC}${NIC}"
	NETWORK="${NETWORK} -net tap,vlan=${VLAN},ifname=tap${VLAN},script=${CONFDIR}/scripts/ifup-bridged"
	;;
    *)
	NETWORK="-net nic,vlan=${VLAN}${MAC}${NIC} -net user,vlan=${VLAN}"
	;;
esac

# Video
if [ -z "${VNC_DISPLAY}" ]; then VNC_DISPLAY=${ID}; fi
case ${VIDEO} in
    sdl)
	VIDEO_CMD=
	;;
    vnc)
	VIDEO_CMD="-vnc :${VNC_DISPLAY}"
	;;
    *)
	VIDEO_CMD="-nographic"
	TCP_PORT=$((7500 + ${VLAN}))
	if [ -z "${CONSOLE}" ]; then
	    CONSOLE="-serial tcp::${TCP_PORT},server,nowait"
	fi
	;;
esac

COMMAND="${QEMU_COMMAND} ${DISKS} ${VIDEO_CMD} ${MEMORY} ${CPU_CMD} "
COMMAND="${COMMAND} ${NETWORK} ${CONSOLE} ${OPTIONS} $@"

if [ "${NOEXEC}" ]; then
    echo "${COMMAND}"
    exit 0
else
    ${QEMU_COMMAND} ${DISKS} ${VIDEO_CMD} ${MEMORY} ${CPU_CMD} \
	${NETWORK} ${CONSOLE} ${OPTIONS} $@ &
    VM_PID=$!
    if [ ${UID} -eq 0 ]; then
	PIDDIR=/var/run/vamos
    else
	PIDDIR=${HOME}/.vamos/run
    fi
    mkdir -p ${PIDDIR}
    echo ${VM_PID} >${PIDDIR}/vm.${VMNAME}.${ID}
fi

if [ "${NETHOST}" ]; then
    sleep 1
    ifconfig tap${VLAN} ${NETHOST} netmask ${NETMASK} up
fi
