#!/usr/bin/perl

use lib "/etc/kvm/api";
use strict;
use Getopt::Std;
use POSIX qw(floor);

use KVMapi;

my $vm_name = shift;
my $kvm = KVMapi->new($vm_name);
if ($kvm->isRunning())
{
	printf("KVMctrl: machine $vm_name is already running...\n");
	exit(1);
}


my %options = $kvm->getOptions();
my $args = "";
if ($options{"boot"} && $options{"boot"} ne 'c')
{
	$args .= sprintf("-boot %s \\\n", $options{"boot"});
}
$args .= sprintf("-name %s \\\n", $options{"name"});
if ($options{"features"})
{
	$args .= sprintf("-cpu %s \\\n", $options{"features"});
}
$args .= sprintf("-smp %s \\\n", $options{"cpus"});
$args .= sprintf("-m %s \\\n", $options{"mem"});
#	$args .= "-localtime -daemonize -usb -usbdevice tablet \\\n";
#	$args .= "-daemonize -usb -usbdevice tablet \\\n";
$args .= "-usb -usbdevice tablet \\\n";
$args .= "-k de -parallel none \\\n";
$args .= sprintf("-vga %s \\\n", $options{"vga"});
$args .= sprintf("-pidfile %s \\\n", $options{"pidfile"});

if ($options{"vnc_enabled"})
{
	$args .= sprintf("-vnc %s:%s", $options{"vnc_listen"}, $options{"id"});
	if ($options{"vnc_password"} ne "")
	{
		$args .= ",password";
	}
	$args .= " \\\n";
}
if ($options{"localtime"})
{
	$args .= sprintf("-localtime \\\n");
}

for (my $i = 0; $i < $options{"disks"}; $i++)
{
	my $key = "disk" . $i;
	$args .= "-drive index=" . $i;
	#disk: type=virtio, media=disk, phy=/dev/vg/europdf-vol0
	$args .= sprintf(",media=%s", $options{$key . "_media"});
	$args .= sprintf(",if=%s", $options{$key . "_type"});
	$args .= sprintf(",cache=%s", $options{$key . "_cache"});
	$args .= sprintf(",file=%s", $options{$key . "_phy"});
	
	if ($options{"boot"} eq "c" && $i == 0)
	{
		$args .= sprintf(",boot=on");
	}
	
	$args .= " \\\n";
}

for (my $i = 0; $i < $options{"nics"}; $i++)
{
	my $key = "nic" . $i;
	my $vlan = $options{$key ."_vlan"};
	$args .= "-net nic";
	#vif: type=virtio, bridge=br0, mode=route, ip=78.47.10.42
	if ($options{"boot"} eq 'n')
	{
		$args .= ",model=e1000";
	}
	else
	{
		$args .= sprintf(",model=%s", $options{$key . "_type"});
	}

	if ($options{$key . "_mac"} ne "")
	{
		$args .= sprintf(",macaddr=%s", $options{$key . "_mac"});
	}
	$args .= sprintf(",vlan=%s", $vlan);
	$args .= " -net tap";

	# $args .= sprintf(",ifname=vif_%s", $options{"name"});
	$args .= sprintf(",ifname=vif_%s_%s", $options{"id"}, $vlan);
	$args .= sprintf(",vlan=%s", $vlan);
	$args .= ",script=/etc/kvm/api/ifup";
	$args .= ",downscript=/etc/kvm/api/ifdown";
	$args .= " \\\n";
}


$args .= sprintf("-monitor tcp:127.0.0.1:%s,server,nowait \\\n", $options{"console_port"});
#	if ($options{"serial_port"})
#	{
#		$args .= sprintf("-serial tcp:127.0.0.1:%s,server,nowait \\\n", $options{"serial_port"});
#	}
if ($options{"kernel"})
{
	$args .= sprintf("-no-reboot \\\n");
	$args .= sprintf("-no-shutdown \\\n");
	$args .= sprintf("-kernel %s \\\n", $options{"kernel"})
}
if ($options{"initrd"})
{
	$args .= sprintf("-initrd %s \\\n", $options{"initrd"})
}
if ($options{"kernel-append"})
{
	$args .= sprintf("-append \"%s\" \\\n", $options{"kernel-append"});
}
$args .= "-tdf \n";

print "args: '$args'\n\n";

my $cmd = sprintf("/var/run/kvm_%s", $vm_name);

unless ( -f $cmd )
{
	unless (link("/usr/bin/kvm", $cmd))
	{
		printf("unable to create link for %s\n", $cmd);
	}
}

#exit(0);
#my $rval = system("/usr/bin/kvm $args");
#while (1)
#{
	my $rval = system("$cmd $args");
	printf("kvm rval: %d\n", $rval);
	if ($rval == 0)
	{
#		sleep(5);
#		next;
	}


	unlink($cmd);
	printf("something wen't wrong...\n");
	exit($rval);
#}
