summaryrefslogtreecommitdiffstats
path: root/os-plugins
diff options
context:
space:
mode:
authorMichael Janczyk2010-08-18 22:00:51 +0200
committerMichael Janczyk2010-08-18 22:00:51 +0200
commit304f7d60e1bbe0098a6c0aaf64c8e352025cffe4 (patch)
tree85cfe26dbddadef9c469dff24635b5d1989c82b9 /os-plugins
parentupdate makefile to install squashfs binaries (diff)
parentMerge branch 'master' into vmgrid (diff)
downloadcore-304f7d60e1bbe0098a6c0aaf64c8e352025cffe4.tar.gz
core-304f7d60e1bbe0098a6c0aaf64c8e352025cffe4.tar.xz
core-304f7d60e1bbe0098a6c0aaf64c8e352025cffe4.zip
Merge branch 'vmgrid'
Diffstat (limited to 'os-plugins')
-rw-r--r--os-plugins/plugins/qemukvm/files/kvm.cmdline152
-rw-r--r--os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm124
-rw-r--r--os-plugins/plugins/virtualbox/XX_virtualbox.sh70
-rw-r--r--os-plugins/plugins/virtualbox/files/empty-diff-00.vdi.gzbin0 -> 282 bytes
-rw-r--r--os-plugins/plugins/virtualbox/files/empty-diff-01.vdi.gzbin0 -> 279 bytes
-rw-r--r--os-plugins/plugins/virtualbox/files/empty-diff-02.vdi.gzbin0 -> 284 bytes
-rw-r--r--os-plugins/plugins/virtualbox/files/empty-diff-03.vdi.gzbin0 -> 282 bytes
-rw-r--r--os-plugins/plugins/virtualbox/files/empty-diff-04.vdi.gzbin0 -> 282 bytes
-rw-r--r--os-plugins/plugins/virtualbox/files/empty-diff.vdi.gzbin0 -> 282 bytes
-rw-r--r--os-plugins/plugins/virtualbox/files/machine.include134
-rw-r--r--os-plugins/plugins/virtualbox/files/run-virt.include465
-rw-r--r--os-plugins/plugins/virtualbox/files/run-virt.include.bak159
-rw-r--r--os-plugins/plugins/virtualbox/files/run-virt2.include323
-rw-r--r--os-plugins/plugins/virtualbox/files/rwimg.vdi.gzbin0 -> 268 bytes
-rw-r--r--os-plugins/plugins/virtualbox/files/virtualbox.include47
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/README51
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/README.incompatibilities38
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/examples/xmexample.disks32
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/examples/xmexample.domUloader28
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/examples/xmexample.hvm358
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/examples/xmexample.hvm-stubdom314
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/examples/xmexample.pv-grub186
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/examples/xmexample1213
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/examples/xmexample2248
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/examples/xmexample3234
l---------os-plugins/plugins/xen/files/xen.examples/images1
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/qemu-ifup23
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/blktap93
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/block398
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/scripts/block-common.sh117
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/block-iscsi78
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/block-nbd34
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/block-npiv77
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/block-npiv-common.sh238
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/block-npiv-vport79
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/domain-lock83
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/external-device-migrate98
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/scripts/locking.sh98
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/scripts/logging.sh22
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/network-bridge380
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/network-nat125
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/network-route27
l---------os-plugins/plugins/xen/files/xen.examples/scripts/set-lock1
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/vif-bridge100
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/scripts/vif-common.sh158
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/vif-nat192
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/vif-route56
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/vm-monitor41
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/vscsi22
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/vtpm22
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-common.sh448
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/vtpm-delete18
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-hotplug-common.sh35
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-impl208
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-migration.sh19
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/xen-hotplug-cleanup36
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/scripts/xen-hotplug-common.sh93
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/scripts/xen-network-common.sh118
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/scripts/xen-script-common.sh44
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/xend-relocation.sh159
-rwxr-xr-xos-plugins/plugins/xen/files/xen.examples/scripts/xmclone.sh793
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/xenapiusers1
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/xend-config-xenapi.sxp193
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/xend-config.sxp323
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/xend-pci-permissive.sxp27
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/xend-pci-quirks.sxp96
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/xm-config-xenapi.xml43
-rw-r--r--os-plugins/plugins/xen/files/xen.examples/xm-config.xml45
68 files changed, 8252 insertions, 186 deletions
diff --git a/os-plugins/plugins/qemukvm/files/kvm.cmdline b/os-plugins/plugins/qemukvm/files/kvm.cmdline
new file mode 100644
index 00000000..c566879d
--- /dev/null
+++ b/os-plugins/plugins/qemukvm/files/kvm.cmdline
@@ -0,0 +1,152 @@
+QEMU PC emulator version 0.9.1 (kvm-84), Copyright (c) 2003-2008 Fabrice Bellard
+usage: qemu [options] [disk_image]
+
+'disk_image' is a raw hard image image for IDE hard disk 0
+
+Standard options:
+-h or -help display this help and exit
+-M machine select emulated machine (-M ? for list)
+-cpu cpu select CPU (-cpu ? for list)
+-smp n set the number of CPUs to 'n' [default=1]
+-fda/-fdb file use 'file' as floppy disk 0/1 image
+-hda/-hdb file use 'file' as IDE hard disk 0/1 image
+-hdc/-hdd file use 'file' as IDE hard disk 2/3 image
+-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)
+-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]
+ [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]
+ [,cache=writethrough|writeback|none][,format=f][,serial=s]
+ [,boot=on|off]
+ use 'file' as a drive image
+-mtdblock file use 'file' as on-board Flash memory image
+-sd file use 'file' as SecureDigital card image
+-pflash file use 'file' as a parallel flash image
+-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n)
+-snapshot write to temporary files instead of disk image files
+-m megs set virtual RAM size to megs MB [default=128]
+-k language use keyboard layout (for example "fr" for French)
+-audio-help print list of audio drivers and their options
+-soundhw c1,... enable audio support
+ and only specified sound cards (comma separated list)
+ use -soundhw ? to get the list of supported cards
+ use -soundhw all to enable all of them
+-usb enable the USB driver (will be the default soon)
+-usbdevice name add the host or guest USB device 'name'
+-name string set the name of the guest
+-uuid %08x-%04x-%04x-%04x-%012x
+ specify machine UUID
+
+Display options:
+-nographic disable graphical output and redirect serial I/Os to console
+-curses use a curses/ncurses interface instead of SDL
+-no-frame open SDL window without a frame and window decorations
+-alt-grab use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)
+-no-quit disable SDL window close capability
+-sdl enable SDL
+-portrait rotate graphical output 90 deg left (only PXA LCD)
+-vga [std|cirrus|vmware|none]
+ select video card type
+-full-screen start in full screen
+-vnc display start a VNC server on display
+-name string set the name of the guest
+-uuid %08x-%04x-%04x-%04x-%012x specify machine UUID
+
+Network options:
+-net nic[,vlan=n][,macaddr=addr][,model=type][,name=str]
+ create a new Network Interface Card and connect it to VLAN 'n'
+-net user[,vlan=n][,name=str][,hostname=host]
+ connect the user mode network stack to VLAN 'n' and send
+ hostname 'host' to DHCP clients
+-net tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile]
+ connect the host TAP network interface to VLAN 'n' and use the
+ network scripts 'file' (default=/etc/kvm-ifup)
+ and 'dfile' (default=/etc/kvm-ifdown);
+ use '[down]script=no' to disable script execution;
+ use 'fd=h' to connect to an already opened TAP interface
+-net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port]
+ connect the vlan 'n' to another VLAN using a socket connection
+-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port]
+ connect the vlan 'n' to multicast maddr and port
+-net none use it alone to have zero network devices; if no -net option
+ is provided, the default is '-net nic -net user'
+-tftp dir allow tftp access to files in dir [-net user]
+-bootp file advertise file in BOOTP replies
+-smb dir allow SMB access to files in 'dir' [-net user]
+-redir [tcp|udp]:host-port:[guest-host]:guest-port
+ redirect TCP or UDP connections from host to guest [-net user]
+
+-bt hci,null dumb bluetooth HCI - doesn't respond to commands
+-bt hci,host[:id]
+ use host's HCI with the given name
+-bt hci[,vlan=n]
+ emulate a standard HCI in virtual scatternet 'n'
+-bt vhci[,vlan=n]
+ add host computer to virtual scatternet 'n' using VHCI
+-bt device:dev[,vlan=n]
+ emulate a bluetooth device 'dev' in scatternet 'n'
+
+
+i386 target only:
+-win2k-hack use it when installing Windows 2000 to avoid a disk full bug
+-rtc-td-hack use it to fix time drift in Windows ACPI HAL
+-no-fd-bootchk disable boot signature checking for floppy disks
+-no-acpi disable ACPI
+-no-hpet disable HPET
+Linux boot specific:
+-kernel bzImage use 'bzImage' as kernel image
+-append cmdline use 'cmdline' as kernel command line
+-initrd file use 'file' as initial ram disk
+
+Debug/Expert options:
+-serial dev redirect the serial port to char device 'dev'
+-parallel dev redirect the parallel port to char device 'dev'
+-monitor dev redirect the monitor to char device 'dev'
+-pidfile file write PID to 'file'
+-S freeze CPU at startup (use 'c' to start execution)
+-s wait gdb connection to port
+-p port set gdb connection port [default=1234]
+-d item1,... output log to /tmp/qemu.log (use -d ? for a list of log items)
+-hdachs c,h,s[,t]
+ force hard disk 0 physical geometry and the optional BIOS
+ translation (t=none or lba) (usually qemu can guess them)
+-L path set the directory for the BIOS, VGA BIOS and keymaps
+-bios file set the filename for the BIOS
+-no-kvm disable KVM hardware virtualization
+-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC
+-no-kvm-pit disable KVM kernel mode PIT
+-no-kvm-pit-reinjection disable KVM kernel mode PIT interrupt reinjection
+-enable-nesting enable support for running a VM inside the VM (AMD only)
+-pcidevice host=bus:dev.func[,dma=none][,name=string]
+ expose a PCI device to the guest OS.
+ dma=none: don't perform any dma translations (default is to use an iommu)
+ 'string' is used in log output.
+-no-reboot exit instead of rebooting
+-no-shutdown stop before shutdown
+-loadvm [tag|id]
+ start right away with a saved state (loadvm in monitor)
+-daemonize daemonize QEMU after initializing
+-tdf inject timer interrupts that got lost
+-kvm-shadow-memory megs set the amount of shadow pages to be allocated
+-mem-path set the path to hugetlbfs/tmpfs mounted directory, also
+ enables allocation of guest memory with huge pages
+-mem-prealloc toggles preallocation of -mem-path backed physical memory
+ at startup. Default is enabled.
+-option-rom rom load a file, rom, into the option ROM space
+-clock force the use of the given methods for timer alarm.
+ To see what timers are available use -clock ?
+-localtime set the real time clock to local time [default=utc]
+-startdate select initial date of the clock
+-icount [N|auto]
+ enable virtual instruction counter with 2^N clock ticks per instruction
+-echr chr set terminal escape character instead of ctrl-a
+-virtioconsole c
+ set virtio console
+-show-cursor show cursor
+-tb-size n set TB size
+-incoming p prepare for incoming migration, listen on port p
+
+During emulation, the following keys are useful:
+ctrl-alt-f toggle full screen
+ctrl-alt-n switch to virtual console 'n'
+ctrl-alt toggle mouse and keyboard grab
+
+When using -nographic, press 'ctrl-a h' to get some help. \ No newline at end of file
diff --git a/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm b/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm
index fd1424f1..07ec9dc0 100644
--- a/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm
+++ b/os-plugins/plugins/virtualbox/OpenSLX/OSPlugin/virtualbox.pm
@@ -1,3 +1,4 @@
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
# Copyright (c) 2009..2010 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
@@ -45,7 +46,8 @@ sub getInfo
stateless client.
End-of-Here
precedence => 70,
- required => [ qw( desktop ) ],
+ # headless mode does not require a desktop!
+ #required => [ qw( desktop ) ],
};
}
@@ -67,7 +69,7 @@ sub getAttrInfo
should the 'virtualbox'-plugin be executed during boot?
End-of-Here
content_regex => qr{^(0|1)$},
- content_descr => '1 means active - 0 means inactive',
+ content_descr => '1 for active, 0 for inactive',
default => '1',
},
# attribute 'imagesrc' defines where we can find virtualbox images
@@ -77,13 +79,14 @@ sub getAttrInfo
description => unshiftHereDoc(<<' End-of-Here'),
Where do we store our virtualbox images? NFS? Filesystem?
End-of-Here
- #TODO: check if the input is valid
- #content_regex => qr{^(0|1)$},
- content_descr => 'Allowed values: local path or URI',
- default => '',
+ content_regex => qr{^(/|nfs://)},
+ content_descr => 'local path or URI or "-" (unset)',
+ default => undef,
},
# attribute 'bridge' defines if bridged network mode should be
# switched on
+ # TODO: change to net -> nat, bridge, hostonly?
+ # TODO: since we use def in XML maybe use to override
'virtualbox::bridge' => {
applies_to_systems => 1,
applies_to_clients => 1,
@@ -92,10 +95,46 @@ sub getAttrInfo
to the ethernet the host is connected to) be enabled
End-of-Here
content_regex => qr{^(0|1)$},
- content_descr => 'Allowed values: 0 or 1',
+ content_descr => '0 or 1',
default => '1',
},
-
+ # attribute 'mem' defines if memory should be forced
+ 'virtualbox::mem' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Do you want to force a ralative amount of RAM?
+ (Not implemented right now!)
+ End-of-Here
+ content_regex => qr{^(\d\d??)$},
+ content_descr => 'Between 0 - 99',
+ default => undef,
+ },
+ # attribute 'kvm' defines if KVM modules should be forced
+ 'virtualbox::kvm' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Do you want to force the usage of KVM modules where applicable?
+ (Not implemented right now!)
+ End-of-Here
+ content_regex => qr{^(0|1)$},
+ content_descr => '0 or 1',
+ default => undef,
+ },
+ # attribute 'tftpdir' defines TFTP dir for network boots /w NAT
+ 'virtualbox::tftpdir' => {
+ applies_to_systems => 1,
+ applies_to_clients => 1,
+ description => unshiftHereDoc(<<' End-of-Here'),
+ Do you want to define a stage 4 TFTP dir for netwoork boots when
+ using NAT?
+ Hint: Mount your TFTP ro via NFS to a local dir
+ End-of-Here
+ content_regex => qr{^(/)},
+ content_descr => 'local path or "-" (unset)',
+ default => '/var/lib/virt/virtualbox',
+ },
};
}
@@ -103,7 +142,7 @@ sub installationPhase
{
my $self = shift;
my $info = shift;
-
+
$self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
$self->{pluginTempPath} = $info->{'plugin-temp-path'};
$self->{openslxBasePath} = $info->{'openslx-base-path'};
@@ -111,22 +150,31 @@ sub installationPhase
$self->{attrs} = $info->{'plugin-attrs'};
my $engine = $self->{'os-plugin-engine'};
-
+
# Different names of the tool (should be unified somehow!?)
if (!isInPath('VirtualBox')) {
# todo: fix this
- $self->{distro}->installVbox();
+ $self->{distro}->installVbox();
}
if (!isInPath('VirtualBox')) {
- print "VirtualBox is not installed. VirtualBox Plugin won't be installed!\n";
-# exit
- }
+ print
+ "VirtualBox is not installed. VirtualBox Plugin won't be installed!\n"
+ ;
+ #exit
+ }
$self->_writeRunlevelScript();
- # Copy run-virt.include to the appropriate place for inclusion in stage4
- copyFile("$self->{openslxBasePath}/lib/plugins/virtualbox/files/run-virt.include",
- "$self->{pluginRepositoryPath}/");
+ # Copy run-virt.include and template files to the appropriate place for
+ # inclusion in stage4
+ my $pluginName = $self->{'name'};
+ my $pluginBasePath =
+ "$self->{openslxBasePath}/lib/plugins/$pluginName/files";
+ foreach my $file ( qw( run-virt.include virtualbox.include machine.include
+ empty-diff.vdi.gz rwimg.vdi.gz ) ) {
+ copyFile("$pluginBasePath/$file", "$self->{pluginRepositoryPath}/");
+ chmod 0644, "$self->{pluginRepositoryPath}/$file";
+ }
return;
}
@@ -155,8 +203,8 @@ sub checkStage3AttrValues
sub _writeRunlevelScript
{
my $self = shift;
-
my $initfile = newInitFile();
+ my $script = "";
$initfile->setName("vbox-slx");
$initfile->setDesc("Setup environment for virtualbox. Part of OpenSLX virtualbox plugin.");
@@ -166,30 +214,34 @@ sub _writeRunlevelScript
'running',
'lsmod | grep -q "$1[^_-]"'
);
+ #
+ $script = unshiftHereDoc(<<' End-of-Here');
+ if running vboxdrv; then
+ if running vboxnetflt; then
+ echo "VirtualBox kernel modules (vboxdrv and vboxnetflt) are loaded."
+ else
+ echo "VirtualBox kernel module is loaded."
+ fi
+ #TODO: check it: ignore user check. handling our own way:
+ for i in /tmp/.vbox-*-ipc; do
+ echo "Running: "
+ $(VBoxManage -q list runningvms | sed -e 's/^".*"//' 2>/dev/null)
+ done
+ else
+ echo "VirtualBox kernel module(s) are not loaded."
+ fi
+ End-of-Here
$initfile->addFunction(
- 'vmstatus',
- 'if running vboxdrv; then
- if running vboxnetflt; then
- echo "VirtualBox kernel modules (vboxdrv and vboxnetflt) are loaded."
- else
- echo "VirtualBox kernel module is loaded."
- fi
- #TODO: check it: ignore user check. handling our own way:
- for i in /tmp/.vbox-*-ipc; do
- echo "Running: "
- $(VBoxManage --nologo list runningvms | sed -e \'s/^".*"//\' 2>/dev/null)
- done
- else
- echo "VirtualBox kernel module is not loaded."
- fi'
+ "vmstatus",
+ "$script"
);
$initfile->addFunction(
'start',
- ' modprobe vboxdrv && modprobe vboxnetflt',
+ ' modprobe -qa vboxdrv vboxnetflt vboxnetadp',
);
$initfile->addFunction(
'stop',
- ' rmmod vboxnetflt && rmmod vboxdrv',
+ ' rmmod vboxnetadp vboxnetflt vboxdrv',
);
$initfile->addToCase(
'start',
@@ -212,8 +264,6 @@ sub _writeRunlevelScript
my $distro = (split('-',$self->{'os-plugin-engine'}->distroName()))[0];
my $runlevelscript = getInitFileForDistro($initfile, $distro);
- # todo: because we dont have distribution or version dependend
- # init scripts we could put it directly into /etc/init.d...
spitFile("$self->{'pluginRepositoryPath'}/vbox-slx", $runlevelscript);
}
diff --git a/os-plugins/plugins/virtualbox/XX_virtualbox.sh b/os-plugins/plugins/virtualbox/XX_virtualbox.sh
index 38dd80ec..b54b4bec 100644
--- a/os-plugins/plugins/virtualbox/XX_virtualbox.sh
+++ b/os-plugins/plugins/virtualbox/XX_virtualbox.sh
@@ -1,4 +1,5 @@
-# Copyright (c) 2009 - OpenSLX GmbH
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2009..2010 - OpenSLX GmbH
#
# This program/file is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
@@ -11,19 +12,28 @@
# script is included from init via the "." load function - thus it has all
# variables and functions available
+# include default directories
+. /etc/openslx.conf
+
+CONFFILE=/initramfs/plugin-conf/virtualbox.conf
+PLUGINCONFDIR=/mnt/${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualbox
+PLUGINDIR=/mnt/${OPENSLX_DEFAULT_DIR}/plugin-repo/virtualbox
+VIRTDIR=/mnt/${OPENSLX_DEFAULT_VIRTDIR}/virtualbox
+
# check if the configuration file is available
-if [ -e /initramfs/plugin-conf/virtualbox.conf ]; then
+if [ -e ${CONFFILE} ]; then
# load needed variables
- . /initramfs/plugin-conf/virtualbox.conf
+ . ${CONFFILE}
# Test if this plugin is activated... more or less useless with the
# new plugin system
- if [ $virtualbox_active -ne 0 ]; then
+ if [ $virtualbox_active -ne 0 2>/dev/null ]; then
[ $DEBUGLEVEL -gt 0 ] && echo "executing the 'virtualbox' os-plugin ...";
+
# load general configuration
- . /initramfs/machine-setup
+ . /etc/initramfs-setup
# get source of virtualbox image server (get type, server and path)
if strinstr "/" "${virtualbox_imagesrc}" ; then
@@ -33,28 +43,56 @@ if [ -e /initramfs/plugin-conf/virtualbox.conf ]; then
fi
if [ -n "${vbimgserv}" ] ; then
# directory where qemu images are expected in
- mnttarget=/mnt/var/lib/virt/virtualbox
+ mnttarget=${VIRTDIR}
# mount the virtualbox image source readonly (ro)
fsmount ${vbimgprot} ${vbimgserv} ${vbimgpath} ${mnttarget} ro
else
- [ $DEBUGLEVEL -gt 1 ] && error " * Incomplete information in variable \
-${virtualbox_imagesrc}." nonfatal
+ [ $DEBUGLEVEL -gt 1 ] && \
+ error " * Incomplete information in variable ${virtualbox_imagesrc}." \
+ nonfatal
fi
- # copy version depending files - the vmchooser expects for every virtua-
- # lization plugin a file named after it (here run-virtualbox.include)
- testmkd /mnt/etc/opt/openslx
- cp /mnt/opt/openslx/plugin-repo/virtualbox/run-virt.include \
- /mnt/etc/opt/openslx/run-virtualbox.include
+
+ # copy virtualization include files to config dir
+ testmkd ${PLUGINCONFDIR}
+ cp ${PLUGINDIR}/*.include ${PLUGINCONFDIR}
+ # copy ${CONFFILE} to ${PLUGINCONFDIR} just in case
+ cp ${CONFFILE} ${PLUGINCONFDIR}
+
+# # TODO: create rawdisk if requested
+# # create raw disk
+# for part in $(grep -qE " 44 | 45 " /etc/disk.partition); do
+# case "${part}" in
+# * 45 *)
+# id4x=$(grep " 45 " /etc/disk.partition | grep -E " 44 | 45 " \
+# | awk '{print $1}' | cut -c -8)
+# break
+# ;;
+# * 44 *)
+# id4x=$(grep " 44 " /etc/disk.partition | grep -E " 44 | 45 " \
+# | awk '{print $1}' | cut -c -8)
+# break
+# ;;
+# esac
+# if [ -n "${id4x}" ]; then
+# mount --bind /dev /mnt/dev
+# chroot /mnt VBoxManage -q internalcommands createrawvmdk -filename \
+# ${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualbox/raw.vmdk -rawdisk ${id4x}
+# chmod 777 ${OPENSLX_DEFAULT_CONFDIR}/plugins/virtualbox/raw.vmdk
+# umount -f /mnt/dev 2>/dev/null
+# fi
# copy and activate init file
- cp /mnt/opt/openslx/plugin-repo/virtualbox/vbox-slx \
- /mnt/etc/init.d
+ cp ${PLUGINDIR}/vbox-slx /mnt/etc/init.d/
chmod 755 /mnt/etc/init.d/vbox-slx
rllinker "vbox-slx" 20 2
mknod -m 0660 /dev/vboxdrv c 10 59
chown root:vboxusers /dev/vboxdrv
+
+ # finished ...
+ [ $DEBUGLEVEL -gt 0 ] && echo "done with 'virtualbox' os-plugin ..."
fi
else
- [ $DEBUGLEVEL -gt 0 ] && echo " * Configuration of virtualbox plugin failed"
+ [ $DEBUGLEVEL -gt 0 ] \
+ && echo " * Configuration of 'virtualbox' plugin failed"
fi
diff --git a/os-plugins/plugins/virtualbox/files/empty-diff-00.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff-00.vdi.gz
new file mode 100644
index 00000000..24697b58
--- /dev/null
+++ b/os-plugins/plugins/virtualbox/files/empty-diff-00.vdi.gz
Binary files differ
diff --git a/os-plugins/plugins/virtualbox/files/empty-diff-01.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff-01.vdi.gz
new file mode 100644
index 00000000..138e51e8
--- /dev/null
+++ b/os-plugins/plugins/virtualbox/files/empty-diff-01.vdi.gz
Binary files differ
diff --git a/os-plugins/plugins/virtualbox/files/empty-diff-02.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff-02.vdi.gz
new file mode 100644
index 00000000..1355f373
--- /dev/null
+++ b/os-plugins/plugins/virtualbox/files/empty-diff-02.vdi.gz
Binary files differ
diff --git a/os-plugins/plugins/virtualbox/files/empty-diff-03.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff-03.vdi.gz
new file mode 100644
index 00000000..6e66af70
--- /dev/null
+++ b/os-plugins/plugins/virtualbox/files/empty-diff-03.vdi.gz
Binary files differ
diff --git a/os-plugins/plugins/virtualbox/files/empty-diff-04.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff-04.vdi.gz
new file mode 100644
index 00000000..ddb8bb5f
--- /dev/null
+++ b/os-plugins/plugins/virtualbox/files/empty-diff-04.vdi.gz
Binary files differ
diff --git a/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz b/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz
new file mode 100644
index 00000000..24697b58
--- /dev/null
+++ b/os-plugins/plugins/virtualbox/files/empty-diff.vdi.gz
Binary files differ
diff --git a/os-plugins/plugins/virtualbox/files/machine.include b/os-plugins/plugins/virtualbox/files/machine.include
new file mode 100644
index 00000000..8d1e23c4
--- /dev/null
+++ b/os-plugins/plugins/virtualbox/files/machine.include
@@ -0,0 +1,134 @@
+# Include file (machine template) for run-virt.include of the virtualbox plugin
+cat << EOF > "${machconfig}"
+<?xml version="1.0"?>
+<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.9-linux">
+ <Machine uuid="{${machineuuid}}" name="${vm_name}" OSType="${vmostype}">
+ <ExtraData>
+ <ExtraDataItem name="GUI/AutoresizeGuest" value="on"/>
+ <ExtraDataItem name="GUI/Fullscreen" value="on"/>
+ <ExtraDataItem name="GUI/LastCloseAction" value="powerOff"/>
+ <ExtraDataItem name="GUI/MiniToolBarAlignment" value="top"/>
+ <ExtraDataItem name="GUI/MiniToolBarAutoHide" value="on"/>
+ <ExtraDataItem name="GUI/SaveMountedAtRuntime" value="yes"/>
+ <ExtraDataItem name="GUI/Seamless" value="off"/>
+ <ExtraDataItem name="GUI/ShowMiniToolBar" value="yes"/>
+ </ExtraData>
+ <Hardware version="2">
+ <CPU count="${cpu_cores}">
+ <HardwareVirtEx enabled="${enablevt}" exclusive="true"/>
+ <HardwareVirtExNestedPaging enabled="${npaging}"/>
+ <HardwareVirtExVPID enabled="false"/>
+ <PAE enabled="true"/>
+ </CPU>
+ <Memory RAMSize="${mem}"/>
+ <Boot>
+ <Order position="1" device="${boot}"/> <!-- HardDisk, DVD, Network, Floppy -->
+ <Order position="2" device="None"/>
+ <Order position="3" device="None"/>
+ <Order position="4" device="None"/>
+ </Boot>
+ <Display VRAMSize="24" monitorCount="1" accelerate3D="false" accelerate2DVideo="false"/>
+ <!-- authType="External", "Guest", "Null" -->
+ <RemoteDisplay enabled="false" port="${vrdpport}" authType="Null" authTimeout="5000"/>
+ <BIOS>
+ <ACPI enabled="true"/>
+ <IOAPIC enabled="true"/>
+ <Logo fadeIn="false" fadeOut="false" displayTime="0"/>
+ <BootMenu mode="MessageAndMenu"/>
+ <TimeOffset value="0"/>
+ <PXEDebug enabled="false"/>
+ </BIOS>
+ <USBController enabled="true" enabledEhci="true"/>
+ <Network>
+ <Adapter slot="0" enabled="true" MACAddress="${macaddr}" cable="true" speed="0" type="${vb_network_card}">
+ <${network_kind}/>
+ </Adapter>
+ <Adapter slot="1" enabled="false" MACAddress="0800279312FB" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="2" enabled="false" MACAddress="080027A3A3CA" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="3" enabled="false" MACAddress="0800277356F6" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="4" enabled="false" MACAddress="080027CEA83A" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="5" enabled="false" MACAddress="0800271B8D7A" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="6" enabled="false" MACAddress="08002771BBD7" cable="true" speed="0" type="Am79C973"/>
+ <Adapter slot="7" enabled="false" MACAddress="080027EB6A12" cable="true" speed="0" type="Am79C973"/>
+ </Network>
+ <UART>
+ <Port slot="0" enabled="false" IOBase="0x3f8" IRQ="4" hostMode="Disconnected"/>
+ <Port slot="1" enabled="false" IOBase="0x3f8" IRQ="4" hostMode="Disconnected"/>
+ </UART>
+ <LPT>
+ <Port slot="0" enabled="false" IOBase="0x378" IRQ="4"/>
+ <Port slot="1" enabled="false" IOBase="0x378" IRQ="4"/>
+ </LPT>
+ <AudioAdapter controller="AC97" driver="Alsa" enabled="${audio}"/> <!-- OSS, Alsa, Pulse (HANGS!) -->
+ <SharedFolders>
+ <SharedFolder name="${sharename}" hostPath="${sharepath}" writable="true"/>
+ </SharedFolders>
+ <Clipboard mode="Bidirectional"/>
+ <Guest memoryBalloonSize="0" statisticsUpdateInterval="0"/>
+ <!--
+ <GuestProperties>
+ <GuestProperty name="/VirtualBox/HostGuest/SysprepExec" value="" timestamp="1268140071072779000" flags="TRANSIENT, RDONLYGUEST"/>
+ <GuestProperty name="/VirtualBox/HostGuest/SysprepArgs" value="" timestamp="1268140071072939000" flags="TRANSIENT, RDONLYGUEST"/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/Product" value="Linux" timestamp="1268140265864540000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/Release" value="2.6.27.21" timestamp="1268140265894019000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/Version" value="#3 SMP Fri Feb 26 16:38:21 CET 2010" timestamp="1268140265898448000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/ServicePack" value="" timestamp="1268140265899571000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Revision" value="57640" timestamp="1268140265900144000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Version" value="3.1.4" timestamp="1268140265899937000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/LoggedInUsers" value="1" timestamp="1268164075148440000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/Count" value="4" timestamp="1268164075148790000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/IP" value="132.230.4.224" timestamp="1268164075149053000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/Broadcast" value="132.230.4.255" timestamp="1268164075149297000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/Netmask" value="255.255.255.0" timestamp="1268164075149596000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/Status" value="Up" timestamp="1268164075149829000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/1/V4/IP" value="192.168.112.1" timestamp="1268164075150037000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/1/V4/Broadcast" value="192.168.112.255" timestamp="1268164075150238000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/1/V4/Netmask" value="255.255.255.0" timestamp="1268164075150439000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/1/Status" value="Up" timestamp="1268164075150635000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/2/V4/IP" value="192.168.54.1" timestamp="1268164075150835000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/2/V4/Broadcast" value="192.168.54.255" timestamp="1268164075151072000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/2/V4/Netmask" value="255.255.255.0" timestamp="1268164075151282000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/2/Status" value="Up" timestamp="1268164075151479000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/NoLoggedInUsers" value="false" timestamp="1268140276063587000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Vbgl/Video/SavedMode" value="1024x768x32" timestamp="1268140287190297000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/HostVerLastChecked" value="3.1.4" timestamp="1268140310962236000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/3/V4/IP" value="192.168.122.1" timestamp="1268164075152293000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/3/V4/Broadcast" value="192.168.122.255" timestamp="1268164075152615000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/3/V4/Netmask" value="255.255.255.0" timestamp="1268164075152828000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/3/Status" value="Up" timestamp="1268164075153029000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/4/V4/IP" value="169.254.4.104" timestamp="1265728007966805000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/4/V4/Broadcast" value="169.254.255.255" timestamp="1265728007967184000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/4/V4/Netmask" value="255.255.0.0" timestamp="1265728007967487000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/4/Status" value="Up" timestamp="1265728007967829000" flags=""/>
+ <GuestProperty name="/VirtualBox/HostInfo/GUI/LanguageID" value="de_DE" timestamp="1268140070610343000" flags=""/>
+ <GuestProperty name="/VirtualBox/HostInfo/VBoxVer" value="3.1.4" timestamp="1268154582522485000" flags="TRANSIENT, RDONLYGUEST"/>
+ <GuestProperty name="/VirtualBox/HostInfo/VBoxRev" value="57640" timestamp="1268154582522507000" flags="TRANSIENT, RDONLYGUEST"/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/LoggedInUsersList" value="vmuser" timestamp="1268164075147867000" flags=""/>
+ </GuestProperties>
+ -->
+ </Hardware>
+ <StorageControllers>
+ <StorageController name="IDE-Controller" type="PIIX4" PortCount="2">
+ <AttachedDevice type="HardDisk" port="0" device="0">
+ <Image uuid="{${imageuuid}}"/>
+ </AttachedDevice> <!-- PLEASE DO NOT REMOVE THIS COMMENT!!! -->
+ <!--
+ <AttachedDevice passthrough="false" type="DVD" port="0" device="0">
+ <Image uuid="{dcd1e32a-729f-4faa-b319-67adca15e4a4}"/>
+ </AttachedDevice>
+ -->
+ </StorageController>
+ <!--
+ <StorageController name="Disketten-Controller" type="I82078" PortCount="1">
+ <AttachedDevice type="Floppy" port="0" device="0"/>
+ </StorageController>
+ <StorageController name="SCSI-Controller" type="LsiLogic" PortCount="16">
+ <AttachedDevice type="HardDisk" port="0" device="0">
+ <Image uuid="{812c82bf-bd1a-4f59-a5b6-b54ae2f6c669}"/>
+ </AttachedDevice>
+ </StorageController>
+ -->
+ </StorageControllers>
+ </Machine>
+</VirtualBox>
+EOF
diff --git a/os-plugins/plugins/virtualbox/files/run-virt.include b/os-plugins/plugins/virtualbox/files/run-virt.include
index e16e2edf..9dbe47ac 100644
--- a/os-plugins/plugins/virtualbox/files/run-virt.include
+++ b/os-plugins/plugins/virtualbox/files/run-virt.include
@@ -1,6 +1,7 @@
-# run-virtualbox.include
-#
-# Copyright (c) 2009 - OpenSLX GmbH
+# run-virt.include
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2009..2010 - OpenSLX GmbH
#
# This program/file is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
@@ -9,53 +10,264 @@
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org
-#
-# Include script for running the Virtual Box on an OpenSLX client via the
-# run-virt.sh. The stuff is copied to /etc/opt/openslx/run-virtualbox.include
-# during stage3.
+# -----------------------------------------------------------------------------
+# run-virt.include
+# - Include script for running the VirtualBox on an OpenSLX client via the
+# run-virt.sh or run-vmgrid.sh
+################################################################################
-# include general configuration from vmchooser
-. /etc/opt/openslx/run-virt.include
+################################################################################
+### Include general configuration
+################################################################################
+if [ -f ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf ]; then
+ . ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf
+else
+ writelog "Problems reading config file of ${self} plugin"
+ exit 1
+fi
-# memory part equal to vmware plugin
-# percentage of memory to use for virtualbox in standard case
-permem=30
-if [ "${totalmem}" -ge "1600" ]; then
- permem=40
+################################################################################
+### Declaration of default variables
+################################################################################
+
+PLUGINCONFVIRTUALBOX="${PLUGINCONFROOT}/${self}"
+PLUGINDIRVIRTUALBOX="${OPENSLX_DEFAULT_DIR}/plugin-repo/${self}"
+# create TMPDIR for all users
+TMPDIR=/tmp/${self}
+mkdir -m 1777 ${TMPDIR} 2>/dev/null
+# dir for configs
+confdir="/tmp/${self}/${USER}/${VM_ID}"
+# use alternate configuration directory instead of $HOME/.VirtualBox
+export VBOX_USER_HOME=${confdir}
+# define dirs and files which can be removed after exit, be carefull!
+RMDIRS="${snapshotdir} ${confdir} /tmp/.vbox-${USER}-ipc"
+rm -rf ${RMDIRS} 2>/dev/null
+machfolder="${confdir}/Machines"
+# use vm_shortname for dir and config names since vm_name can be very long
+machconfig="${machfolder}/${vm_shortname}/${vm_shortname}.xml"
+diskfolder="${confdir}/HardDisks"
+snapshotdir=${machfolder}/${vm_shortname}/Snapshots
+mkdir -p ${diskfolder} ${snapshotdir} 2>/dev/null
+# check if diskless var empty?
+[ -z "${diskless}" ] && diskless=0
+
+# configure our own rwimg, empty image which we support
+if [ "${imgmode}" = "rwimg" ]; then
+ # what is our rwimg called?
+ imgname="${vm_shortname}.vdi"
+ vmpath=${imgpath}/${imgname}
+ if ! [ -e "${vmpath}" ]; then
+ cat ${PLUGINDIRVIRTUALBOX}/rwimg.vdi.gz | gunzip > "${vmpath}"
+ fi
fi
-# check if /tmp is on harddisk
-if grep -qe "/dev/.* /tmp " /proc/mounts ; then
- permem=60
- id44="1"
- # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
- # (40% vmware | 40% confdir(vmem...) | 20% host
- # VMplayer 2+ issue
- if [ "${totalmem}" -ge "2500" ]; then
- permem=40
- mkdir /dev/shm/vbox/${USER}
- snapshotdir=/dev/shm/vbox/$USER
+
+# link to image
+diskfile="${diskfolder}/${imgname}"
+[ ${diskless} -eq 0 ] && ln -sf ${vmpath} ${diskfile}
+
+# check the file type
+if echo ${imgname} | grep -qiE "vdi|vmdk|vhd" && [ ${diskless} -eq 0 ]; then
+ imgfmt=$(echo ${imgname##*.} | tr [a-z] [A-Z])
+elif [ ${diskless} -eq 0 ]; then
+ writelog "${imgname} is not a valid image format (vdi|vmdk|vhd), exiting!"
+ cleanexit 1
+fi
+
+# TODO: maybe rewrite, to reduce checks, merge it with network option,
+# so we can have a "compatibility to vmware config" section
+case "${vmostype}" in
+ winxp*|windowsxp*)
+ vmostype="WindowsXP"
+ ;;
+ winvista*|windowsvista*)
+ vmostype="WindowsVista"
+ ;;
+ windows7*)
+ vmostype="Windows7"
+ ;;
+ linux*|*ubuntu*|*suse*|debian*|*sci*)
+ if echo "${vmostype}" | grep -q "64"; then
+ vmostype="Linux26_64"
+ # check for vtflag
+ if [ ${vtflag} -ne 1 ]; then
+ writelog "You are trying to boot a 64 bit OS without a VT enabled CPU"
+ writelog "This is not supported, exiting!"
+ cleanexit 1
+ fi
+ # check if host is only 32 bit, then use only 1 cpu (only 1 supported)
+ if echo "${host_arch}" | grep -qE "i.86"; then
+ cpu_cores=1
+ fi
+ else
+ vmostype="Linux26"
+ fi
+ ;;
+esac
+
+writelog "Directories:"
+writelog "\tConfig dir:\t\t$confdir"
+writelog "\tMachines dir:\t\t$machfolder"
+writelog "\tMachine config:\t\t$machconfig"
+[ ${diskless} -eq 0 ] && writelog "\tHardDisks dir:\t\t$diskfolder"
+
+################################################################################
+### Hardware checks
+################################################################################
+
+# remove ':' from MAC addr for vbox
+macaddr=$(echo ${macaddr} | sed 's/://g')
+
+# machine UUID, MAC addr part of it
+machineuuid="00000000-0000-0000-0000-${macaddr}"
+# cosmetical, since UUID in lower case
+machineuuid=$(echo ${machineuuid} | tr [A-Z] [a-z])
+# get UUID of VBox image, if not diskless
+[ ${diskless} -eq 0 ] && diskuuid=$(VBoxManage -q showvdiinfo ${diskfile} \
+ | grep UUID | awk '{print $2}')
+# make disk immutable
+imgtype="Immutable"
+# snapshot UUID is static
+snapshotuuid="88bc8b6d-f248-468a-95fe-318084904f8b"
+# imageuuid in machine.include, dafault snapshotuuid
+imageuuid=${snapshotuuid}
+
+# check if rw image
+# remove disk and add rwimg if set
+if echo "${imgmode}" | grep -q rw; then
+ # lock existing?
+ if [ -e "${vmpath}.lock" ]; then
+ writelog "This rw image is already in use."
+ writelog "Found lock: ${vmpath}.lock, exiting!"
+ writelog "Remove lock if you are sure that this is not the case"
+ cleanexit 1
+ # image rw?
+ elif ! [ -w ${vmpath} ]; then
+ writelog "You defined mode rw, but image ${vmpath} is not rw! \c"
+ writelog "Please correct, exiting!"
+ cleanexit 1
fi
+ # add lock
+ touch "${vmpath}.lock"
+ # remove lock after VM stopped
+ RMDIRS="${RMDIRS} ${vmpath}.lock"
+ imgtype="Normal"
+ # replace image uuid in machine config
+ imageuuid=${diskuuid}
+elif [ ${diskless} -eq 0 ]; then
+ # use temp disk as snapshot
+ cat ${PLUGINDIRVIRTUALBOX}/empty-diff.vdi.gz \
+ | gunzip > "${snapshotdir}/{${snapshotuuid}}.vdi"
fi
-mem=$(expr ${totalmem} / 100 \* ${permem})
-if [ "${id44}" = "1" ]; then
- memhost=$(expr ${totalmem} - ${mem})
+
+# TODO: MEM muss noch angepasst werden. Maschine crasht wenn nehr als 50% MEM
+# memory part equal to vmware plugin
+# percentage of memory to use for virtualbox in standard case
+if [ -n "${forcemem}" ]; then
+ mem="${forcemem}"
else
- memhost=$(expr ${totalmem} - ${mem} - ${mem})
+ permem=30
+ if [ "${totalmem}" -ge "1600" ]; then
+ permem=40
+ fi
+ # check if /tmp is on harddisk
+ if grep -qe "/dev/.* /tmp " /proc/mounts ; then
+ permem=60
+ id44="1"
+ # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
+ # (40% vmware | 40% confdir(vmem...) | 20% host
+ # VMplayer 2+ issue
+ # TODO: makes this sense for vbox?
+ #if [ "${totalmem}" -ge "2500" ]; then
+ #permem=40
+ #rmdir ${snapshotdir}
+ #snapshotdirold=${snapshotdir}
+ #snapshotdir=/dev/shm/${self}/${USER}/${VM_ID}
+ #mkdir -p ${snapshotdir}
+ #ln -sf ${snapshotdir} ${snapshotdirold}
+ #fi
+ fi
+ mem=$(expr ${totalmem} / 100 \* ${permem})
+ if [ "${id44}" = "1" ]; then
+ hostmem=$(expr ${totalmem} - ${mem})
+ else
+ hostmem=$(expr ${totalmem} - ${mem} - ${mem})
+ fi
+ #permem=40
+ #mem=$(expr ${totalmem} * ${permem})
+ if [ "${mem}" -lt "256" ] || [ "${hostmem}" -lt "256" ]; then
+ writelog "Memory out of range: ${mem} MB (guest) / ${hostmem} MB (host)!"
+ writelog "Min. 256 MB for host and guest!"
+ cleanexit 1
+ fi
fi
-#permem=40
-#mem=$(expr ${totalmem} * ${permem})
+# translate network cards
+case "${network_card}" in
+ e1000)
+ vb_network_card="82540EM"
+ ;;
+ virtio)
+ vb_network_card="virtio"
+ ;;
+ *)
+ network_card="pcnet"
+ vb_network_card="Am79C973"
+esac
-if [ "${mem}" -lt "256" ] || [ "${memhost}" -lt "256" ]; then
- writelog "\tMemory out of range: ${mem} MB (guest) / ${memhost} MB (host)!"
- writelog "\tMin. 256 MB for host and guest!"
- exit 1
-fi
+# translate network kinds (nat, bridged, host-only)
+case "${network_kind}" in
+ bridge*)
+ network_kind='BridgedInterface name="br0"'
+ ;;
+ host*)
+ network_kind='HostOnlyInterface name="vboxnet0"'
+ ;;
+ *)
+ network_kind="NAT"
+esac
+# translate boot, use if set else set to HardDisk
+# usually support for a,c,d,n, stands for Floppy, HD, CD-ROM, Network
+# support nfs and tftp as well
+case ${boot} in
+ n*|tftp)
+ boot="Network"
+ if [ "${network_kind}" = "NAT" ] && [ -n "${virtualbox_tftpdir}" ]; then
+ # use vm_shortname to avoid Problems /w TFTP in NAT
+ vm_name=${vm_shortname}
+ # link TFTP dir for NAT TFTP boots
+ mkdir -p ${confdir}/TFTP
+ if [ -e ${virtualbox_tftpdir}/pxelinux.0 ]; then
+ cp ${virtualbox_tftpdir}/pxelinux.0 ${confdir}/TFTP/${vm_name}.pxe
+ else
+ writelog "${virtualbox_tftpdir}/pxelinux.0 not found!"
+ writelog "Network boot won't work, exiting!"
+ cleanexit 1
+ fi
+ for i in $(ls ${virtualbox_tftpdir}); do
+ ln -sf ${virtualbox_tftpdir}/${i} ${confdir}/TFTP/${i}
+ done
+ fi
+ ;;
+ # later maybe c|disk|hd*|sd*) for HD and d|cd*) for CD-ROM
+ *)
+ boot="HardDisk"
+ ;;
+esac
+# nested paging
+npaging="false"
+# enable VT
+enablevt="false"
+# check for VT, if not available use only 1 cpu (only 1 supported)
+[ ${vtflag} -eq 0 ] && cpu_cores=1
+[ ${vtflag} -eq 1 ] && enablevt="true"
-# most of the following does not make much sense yet ...
-#
+# external GUI
+vrdpport=${remotedesktopport}
+
+# TODO: nur bei vmchooser
+# TODO: most of the following does not make much sense yet ...
# virtual fd/cd/dvd and drive devices, floppy b: for configuration
# if $floppy_0 from run-virt.include set then fdtest="TRUE"
fdtest=
@@ -78,115 +290,102 @@ cdrom1=${cdtest:-"FALSE"}
# be done while creating the runscripts ...
ide="TRUE"
hddrv="ide"
+audio=${audio:-"true"}
+[ ${diskless} -eq 0 ] && writelog "\tSnapshots dir:\t\t$snapshotdir"
+writelog "Diskimage:"
+[ ${diskless} -eq 0 ] && writelog "\tDisk file:\t\t$diskfile"
+[ ${diskless} -eq 0 ] && writelog "\tDisk format:\t\t$imgfmt"
+[ ${diskless} -eq 0 ] && writelog "\tDisk type:\t\t$imgtype"
+ writelog "\tVMostype:\t\t$vmostype"
+ writelog "\tMachine UUID:\t\t$machineuuid"
+[ ${diskless} -eq 0 ] && writelog "\tDisk UUID:\t\t$diskuuid"
+writelog "Virtual Hardware:"
+writelog "\tCPU cores:\t\t${cpu_cores}\c"
+[ ${vtflag} -eq 0 ] && writelog ""
+[ ${vtflag} -eq 1 ] && writelog " (VT enabled CPU)"
+writelog "\tGuest RAM:\t\t${mem} MB"
+# echo nur wenn hostmem gesetzt
+[ -n "${hostmem}" ] && writelog "\tHost RAM:\t\t${hostmem} MB"
+writelog "\tMAC address:\t\t$macaddr"
+writelog "\tNetwork card:\t\t${vb_network_card}"
+writelog "\tNetwork kind:\t\t${network_kind}"
+writelog "\tBooting from:\t\t${boot}\c"
+[ ${diskless} -eq 0 ] && writelog ""
+[ ${diskless} -eq 1 ] && writelog " 'diskless'"
+# TODO: server start activate via xml, etc...
+#writelog "\tGuest VRDP port:\t${vrdpport}"
+#writelog "\tCD-ROM1:\t${cdrom0}"
+#writelog "\tCD-ROM2:\t${cdrom1}"
+#writelog "\tFloppy_A:\t${floppy0}"
+#writelog "\tFloppy_B:\t${floppy1}"
+# defined in run-virt.sh and run-vmgrid.sh
+writelog "\tShared Folders '${sharename}':\t${sharepath}"
################################################################################
-### Pepare env and and configure Image
+### Pepare and configure virtual machine and disk image
################################################################################
-# Current ID, to make sure it won't run into conflicts if started more
-# as once at the same time, else delete would make the trick...
-ID=$$
-# Don't use $HOME/.VirtualBox!
-export VBOX_USER_HOME="/tmp/vbox-${USER}-${ID}"
-
-# Import Image to VirtualBox, which won't get changed
-VBoxManage -nologo registerimage disk ${diskfile} -type immutable
-
-# Get ID of VBox Image...
-diskuid="$(VBoxManage -nologo showvdiinfo ${diskfile} |grep UUID|awk '{ print $2; }')"
-# Create Image and register it, so we are able to modify and start it
-VBoxManage -nologo createvm -name "${ID}" -register
-
-################################################################################
-###
-### Modify VM
-###
-################################################################################
-
-## Add harddisk
-VBoxManage -nologo modifyvm "${ID}" -hda ${diskuid}
-
-## Configure VM memory
-VBoxManage -nologo modifyvm "${ID}" -memory ${mem}
+# create Virtualbox.xml
+. ${PLUGINCONFVIRTUALBOX}/virtualbox.include
-## Add cddrives
-## TODO: merge to new version, where run-virt.include has our drives
-#VBoxManage -nologo modifyvm "${ID}" -dvd host:${cdrs}
-
-# Enable hardware virtualization
-# TODO: check if CPU supports hw virtualization
-#VBoxManage -nologo modifyvm "${ID}" -hwvirtex on
-
-# HDD as boot device
-VBoxManage -nologo modifyvm "${ID}" -boot1 disk
-
-# enable audio (oss|null|none|alsa|pulse). OSS is backwardcompatible to v2.0
-VBoxManage -nologo modifyvm "${ID}" -audio oss
-
-# supress License and Message
-# TODO: Not clear if we are allowed to do this
-VBoxManage -nologo setextradata global "GUI/LicenseAgreed" "7"
-VBoxManage -nologo setextradata global "GUI/SuppressMessages" ",remindAboutAutoCapture"
-VBoxManage -nologo setextradata global "GUI/RegistrationData" "triesLeft=0"
-
-# if we have enough memory, we can put the snapshots (changes on immutable
-# disk) there
-if [ -n ${snapshotdir} ]; then
- VBoxManage -nologo modifyvm "${ID}" -snapshotfolder "${snapshotdir}"
+# remove snapshot disk when using rw images
+if [ "${imgtype}" != "Immutable" ]; then
+ sed -i "/${snapshotuuid}/d" "${confdir}/VirtualBox.xml"
fi
-# Operating system. Possible: VBoxManage -nologo list ostypes
-# WindowsXP, WindowsVista, Windows7, Linux26 etc.
-# keep compatibility to VMware
-# Todo: maybe rewrite, to reduce checks, merge it with network option,
-# so we can have a "compatibility to vmware config" section. Or include
-# it into vmchooser?
-if [ "${vmostype}" = "winxppro" -o "${vmostype}" = "WindowsXP" ]; then
- VBoxManage -nologo modifyvm "${ID}" -ostype "WindowsXP"
-elif [ "${vmostype}" = "winvista" -o "${vmostype}" = "WindowsVista" ]; then
- VBoxManage -nologo modifyvm "${ID}" -ostype "WindowsVista"
-elif [ "${vmostype}" = "Windows7" ]; then
- VBoxManage -nologo modifyvm "${ID}" -ostype "Windows7"
-elif [ "${vmostype}" = "linux" -o "${vmostype}" = "Linux26" ]; then
- VBoxManage -nologo modifyvm "${ID}" -ostype "Linux26"
-elif [ -n "${vmostype}" ]; then
- VBoxManage -nologo modifyvm "${ID}" -ostype "${vmostype}"
-fi
+# TODO: add rawdisk if requested
+#"raw.vmdk" format="VMDK" type="Writethrough"/>
+# create machine.xml
+. ${PLUGINCONFVIRTUALBOX}/machine.include
-# Network Configuration
-# only bridge differes to vmware. Compatibility option
-if [ "${network_kind}" = "bridge" ]; then
- network_kind="bridged"
-fi
-VBoxManage -nologo modifyvm "${ID}" -nic1 "${network_kind}"
-if [ "${network_kind}" = "bridged" ]; then
- VBoxManage -nologo modifyvm "${ID}" -bridgeadapter1 "eth1"
+# if diskless remove all disks
+if [ ${diskless} -eq 1 ]; then
+ sed -i "/<HardDisk/d;/<\/HardDisk/d" "${confdir}/VirtualBox.xml"
+ sed -i "/${imageuuid}/d" ${machconfig}
+ sed -i '/AttachedDevice type="HardDisk"/d' ${machconfig}
+ sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT!!! -->/d" ${machconfig}
fi
-if [ "${network_kind}" = "hostonly" ]; then
- VBoxManage -nologo modifyvm "${ID}" -hostonlyadapter1 "vboxnet0"
-fi
-
-# modify macaddress
-mac=$(echo ${mac}|sed 's/://') # ${mac/:/}
-VBoxManage -nologo modifyvm "${ID}" -macaddress1 "0050560D${mac}"
-
-
-# usb configuration
-# not available in free -ose version
-#VBoxManage -nologo modifyvm "${ID}" -usb on
-#VBoxManage -nologo modifyvm "${ID}" -usbehci on
+# define redirects
+if [ ${redirects} -ge 1 ]; then
+ (( i=1 ))
+ writelog "\tGuest redirects:\t\c"
+ while [ ${i} -le ${redirects} ]; do
+ extradataitem='<ExtraDataItem name="VBoxInternal/Devices'
+ extradataitem="${extradataitem}/${network_card}/0/LUN#0/Config"
+ extradataitem="${extradataitem}/${redirect_name[$i]}/"
+ extradataprotocol="Protocol\" value=\"${redirect_proto[$i]}\"/>"
+ extradatahostport="HostPort\" value=\"${redirect_hport[$i]}\"/>"
+ extradataguestport="GuestPort\" value=\"${redirect_gport[$i]}\"/>"
+ sed -i "s,</ExtraData>, ${extradataitem}${extradataguestport}\n\
+ ${extradataitem}${extradatahostport}\n\
+ ${extradataitem}${extradataprotocol}\n\
+ </ExtraData>," "${machconfig}"
+ writelog "${tabspace}${redirect_name[$i]} port: ${redirect_hport[$i]}"
+ tabspace='\t\t\t\t'
+ (( i=$i+1 ))
+ done
+fi
-# finally set env for run-virt.sh
################################################################################
+### finally set env for run-virt.sh
+################################################################################
+
+# wait for a certain command to settle
+# get the PID of the right process
+# kill PID, seems to work
+VBMANPID=$(pstree -p | grep VBoxXPCOMIPCD | grep -ivE "VirtualBox|VBoxHeadless"\
+ | sed -e "s/.*VBoxXPCOMIPCD(\(.*\)).*/\1/")
+for i in $(echo ${VBMANPID}); do
+ kill -9 ${VBMANPID} >/dev/null 2>&1
+done
# set the variables appropriately (several interfaces with different names)
-#VIRTCMD=$(which virtualbox 2>/dev/null)
-VIRTCMD=$(which VBoxManage -nologo 2>/dev/null)
-VIRTCMDOPTS="startvm ${ID} -type gui"
+VIRTCMD=$(which VirtualBox 2>/dev/null)
+VIRTCMDOPTS="--startvm ${machineuuid} --start-running"
-# todo: for debugging purpose during development
-echo "\n export VBOX_USER_HOME=\"/tmp/vbox-${USER}-${ID}\""
-echo " VBoxManage -nologo $VIRTCMDOPTS\n\n"
+# set headless mode (-v off to disable vrdp)
+VIRTCMDHL=$(which VBoxHeadless 2>/dev/null)
+VIRTCMDOPTSHL="-s ${machineuuid}"
diff --git a/os-plugins/plugins/virtualbox/files/run-virt.include.bak b/os-plugins/plugins/virtualbox/files/run-virt.include.bak
new file mode 100644
index 00000000..2fd81f6b
--- /dev/null
+++ b/os-plugins/plugins/virtualbox/files/run-virt.include.bak
@@ -0,0 +1,159 @@
+# run-virtualbox.include
+#
+# Copyright (c) 2009, 2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# Include script for running the Virtual Box on an OpenSLX client via the
+# run-virt.sh. The stuff is copied to /etc/opt/openslx/virtualbox/run-
+# virtualbox.include during stage3.
+
+################################################################################
+### General settings
+################################################################################
+
+# include general configuration from vmchooser
+. /etc/opt/openslx/plugins/virtualbox/virtualbox.conf
+
+# Current ID, to make sure it won't run into conflicts if started more
+# as once at the same time, else delete would make the trick...
+ID=$$
+machname="$(basename ${diskfile})"
+machname=${machname%.*}
+# use alternate configuration directory instead of $HOME/.VirtualBox
+export VBOX_USER_HOME="/tmp/vbox-${USER}"
+rm -rf ${VBOX_USER_HOME}/* /tmp/.vbox-${USER}-ipc
+machfolder="${VBOX_USER_HOME}/Machines"
+machconfig="${machfolder}/${machname}/${machname}.xml"
+diskfolder="${VBOX_USER_HOME}/HardDisks"
+mkdir -p ${machfolder}/${machname}/Snapshots ${diskfolder}
+ln -sf ${diskfile} ${diskfolder}/${machname}.vdi
+# Get ID of VBox Image...
+diskuid="$(VBoxManage -nologo showvdiinfo ${diskfile} |grep UUID|awk '{ print $2; }')"
+# produce proper mac address format
+mac="0050560d$(echo ${mac}|sed 's/://;y/ABCDEF/abcdef/')"
+date="$(date +%Y-%m-%dT%H:%M:%SZ)"
+
+# Operating system. Possible: VBoxManage -nologo list ostypes: WindowsXP,
+# WindowsVista, Windows7, Linux26 etc.
+# keeps compatibility to vmware plugin run-virt.include
+# Todo: maybe rewrite, to reduce checks, merge it with network option,
+# so we can have a "compatibility to vmware config" section
+if [ "${vmostype}" = "winxppro" ]; then vmostype="WindowsXP"
+elif [ "${vmostype}" = "winvista" ]; then vmostype="WindowsVista"
+elif [ "${vmostype}" = "Windows7" ]; then vmostype="Windows7"
+elif [ "${vmostype}" = "linux" ]; then vmostype="Linux26"
+elif [ -n "${vmostype}" ]; then vmostype="${vmostype}"
+fi
+# translate network kinds (nat, bridged, host-only)
+if [ "${network_kind}" = "nat" ]; then network_kind="NAT"
+elif [ "${network_kind}" = "bridged" ]; then network_kind=""
+elif [ "${network_kind}" = "host-only" ]; then network_kind=""
+fi
+
+# memory part equal to vmware plugin
+# percentage of memory to use for virtualbox in standard case
+permem=30
+if [ "${totalmem}" -ge "1600" ]; then
+ permem=40
+fi
+# check if /tmp is on harddisk
+if grep -qe "/dev/.* /tmp " /proc/mounts ; then
+ permem=60
+ id44="1"
+ # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
+ # (40% vmware | 40% confdir(vmem...) | 20% host
+ # VMplayer 2+ issue
+ if [ "${totalmem}" -ge "2500" ]; then
+ permem=40
+ #mkdir /dev/shm/vbox/${USER}
+ snapshotdir=/dev/shm/vbox/$USER
+ fi
+fi
+mem=$(expr ${totalmem} / 100 \* ${permem})
+if [ "${id44}" = "1" ]; then
+ memhost=$(expr ${totalmem} - ${mem})
+else
+ memhost=$(expr ${totalmem} - ${mem} - ${mem})
+fi
+
+#permem=40
+#mem=$(expr ${totalmem} * ${permem})
+
+if [ "${mem}" -lt "256" ] || [ "${memhost}" -lt "256" ]; then
+ writelog "\tMemory out of range: ${mem} MB (guest) / ${memhost} MB (host)!"
+ writelog "\tMin. 256 MB for host and guest!"
+ exit 1
+fi
+
+# most of the following does not make much sense yet ...
+#
+# virtual fd/cd/dvd and drive devices, floppy b: for configuration
+# if $floppy_0 from run-virt.include set then fdtest="TRUE"
+fdtest=
+fdtest=${floppy_0:+"TRUE"}
+# if $fdtest not set floppy0="FALSE", else "TRUE"
+floppy0=${fdtest:-"FALSE"}
+floppy1="TRUE"
+floppy1name="/var/lib/virt/vmchooser/loopimg/fd.img"
+# if $cdrom_0 from run-virt.include set then cdtest="TRUE"
+cdtest=
+cdtest=${cdrom_0:+"TRUE"}
+# if $cdtest not set cdrom0="FALSE", else "TRUE"
+cdrom0=${cdtest:-"FALSE"}
+# if $cdrom_1 from run-virt.include set then cdtest="TRUE"
+cdtest=
+cdtest=${cdrom_1:+"TRUE"}
+# if $cdtest not set cdrom1="FALSE", else "TRUE"
+cdrom1=${cdtest:-"FALSE"}
+# ide is expected default, test for the virtual disk image type should
+# be done while creating the runscripts ...
+ide="TRUE"
+hddrv="ide"
+
+
+################################################################################
+### Pepare and configure virtual machine and disk image
+################################################################################
+
+# produce the machine configuration XML
+sed -e "s,MACHINE,${machname},g;s,OSTYPE,${vmostype},;s,MEMSIZE,${mem}," \
+ -e "s,DISKUID,${diskuid},;s,MACADDR,${mac},;s,DATE,${date}," \
+ -e "s,NETTYPE,${network_kind},;s,OPTDEVICE,/dev/sr0," \
+ /etc/opt/openslx/plugins/virtualbox/MachineTemplate.xml \
+ >${machconfig}
+
+# shortened date YYYY-MM-DD
+date=${date%T*}
+# produce the general and containers configuration file
+sed -e "s,DISKUID,${diskuid},;s,FD1NAME,${floppy1name},;s,DATE,${date}," \
+ -e "s,DISKFILE,${diskfolder}/${machname}.vdi,;s,MACHINE,${machname},g;s,MACADDR,${mac}," \
+ -e "s,MACHFOLDER,${machfolder},;s,DISKFOLDER,${diskfolder}," \
+ /etc/opt/openslx/plugins/virtualbox/VirtualBox.xml \
+ >${VBOX_USER_HOME}/VirtualBox.xml
+
+cat /opt/openslx/plugin-repo/virtualbox/empty-diff.vdi.gz | \
+ gunzip >${machfolder}/${machname}/Snapshots/{88bc8b6d-f248-468a-95fe-318084904f8b}.vdi
+
+
+#<DHCPServers>\t<DHCPServer\
+# networkName=\"HostInterfaceNetworking-vboxnet0\" IPAddress=\"192.168.56.100\"\
+# networkMask=\"255.255.255.0\" lowerIP=\"192.168.56.101\"\
+# upperIP=\"192.168.56.254\" enabled=\"1\"/> </DHCPServers>
+
+# finally set env for run-virt.sh
+################################################################################
+
+# wait for a certain command to settle
+while [ TRUE ] ; do
+ ps aux|grep -v grep|grep -q VBoxSVC || break
+done
+# set the variables appropriately (several interfaces with different names)
+VIRTCMD=$(which VirtualBox 2>/dev/null)
+VIRTCMDOPTS="--startvm 00000000-1111-2222-3456-${mac} --start-running"
diff --git a/os-plugins/plugins/virtualbox/files/run-virt2.include b/os-plugins/plugins/virtualbox/files/run-virt2.include
new file mode 100644
index 00000000..4f885abd
--- /dev/null
+++ b/os-plugins/plugins/virtualbox/files/run-virt2.include
@@ -0,0 +1,323 @@
+# run-virt.include
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009..2010 - RZ Uni Freiburg
+# Copyright (c) 2009..2010 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# run-virt.include
+# - Include script for running the Virtual Box on an OpenSLX client via the
+# run-virt.sh or run-vmgrid.sh
+################################################################################
+
+################################################################################
+### Include general configuration
+################################################################################
+if [ -f ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf ]; then
+ . ${OPENSLX_DEFAULT_CONFDIR}/plugins/${self}/${self}.conf
+else
+ writelog "Problems reading config file of ${self} plugin"
+ exit 1
+fi
+
+################################################################################
+### Declaration of default variables
+################################################################################
+
+PLUGINCONFVIRTUALBOX="${PLUGINCONFROOT}/${self}"
+# create TMPDIR for all users
+mkdir -m 1777 /tmp/${self} 2>/dev/null
+# dir for configs
+confdir="/tmp/${self}/${USER}"
+# use alternate configuration directory instead of $HOME/.VirtualBox
+export VBOX_USER_HOME=${confdir}
+
+# imgname is the name of the virtual image file
+imgnamebase=${imgname%.*}
+imgnameending=${imgname#*.}
+# use vm_shortname since vm_name can be very long + VM_ID
+vm_shortname="$(echo ${imgnamebase} | sed -e "s, ,-,g")-${VM_ID}"
+
+# mach folders config
+machfolder="${confdir}/Machines"
+machconfig="${machfolder}/${vm_shortname}/${vm_shortname}.xml"
+diskfolder="${confdir}/HardDisks"
+snapshotdir=${machfolder}/${vm_shortname}/Snapshots
+diskfile="${diskfolder}/${imgname}"
+
+# remove old stuff, RMDIRS can be used in calling script as well
+RMDIRS="${machfolder}/${vm_shortname} ${diskfile}"
+rm -rf ${RMDIRS}
+# create new stuff
+mkdir -p ${diskfolder} ${snapshotdir}
+# check if image already existing
+if [ "$(readlink -f ${diskfile})" = "${vmpath}" ]; then
+ diskuuid=$(grep "${diskfile}" "${confdir}/VirtualBox.xml" | \
+ sed -e "s,.*HardDisk uuid=\"{\(.*\)}\" location=.*,\1,")
+ diskexisting=1
+else
+ ln -sf ${vmpath} ${diskfile}
+fi
+
+# check the file type
+if echo ${imgname} | grep -iE "vdi" >/dev/null 2>&1; then #vmdk|vhd
+ imgtype=$(echo ${imgnameending} | tr [a-z] [A-Z])
+else
+ writelog "${imgname} is not a valid image type (vdi)" #vmdk|vhd
+fi
+
+# TODO: maybe rewrite, to reduce checks, merge it with network option,
+# so we can have a "compatibility to vmware config" section
+case "${vmostype}" in
+ winxp*)
+ vmostype="WindowsXP"
+ ;;
+ winvista*)
+ vmostype="WindowsVista"
+ ;;
+ Windows7*)
+ vmostype="Windows7"
+ ;;
+ linux*)
+ vmostype="Linux26"
+ ;;
+esac
+
+writelog "Directories:"
+writelog "\tConfig dir:\t\t$confdir"
+writelog "\tMachines dir:\t\t$machfolder"
+writelog "\tMachine config:\t\t$machconfig"
+writelog "\tHardDisks dir:\t\t$diskfolder"
+
+################################################################################
+### Hardware checks
+################################################################################
+
+# remove ':' from MAC addr for vbox
+macaddr=$(echo ${macaddr} | sed 's/://g')
+
+# memory part equal to vmware plugin
+# percentage of memory to use for virtualbox in standard case
+if [ -n "${forcemem}" ]; then
+ mem="${forcemem}"
+else
+ permem=30
+ if [ "${totalmem}" -ge "1600" ]; then
+ permem=40
+ fi
+ # check if /tmp is on harddisk
+ if grep -qe "/dev/.* /tmp " /proc/mounts ; then
+ permem=60
+ id44="1"
+ # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
+ # (40% vmware | 40% confdir(vmem...) | 20% host
+ # VMplayer 2+ issue
+ # TODO: makes this sense for vbox?
+ #if [ "${totalmem}" -ge "2500" ]; then
+ #permem=40
+ #rmdir ${snapshotdir}
+ #snapshotdirold=${snapshotdir}
+ #snapshotdir=/dev/shm/${self}/${USER}
+ #mkdir -p ${snapshotdir}
+ #ln -sf ${snapshotdir} ${snapshotdirold}
+ #fi
+ fi
+ mem=$(expr ${totalmem} / 100 \* ${permem})
+ if [ "${id44}" = "1" ]; then
+ memhost=$(expr ${totalmem} - ${mem})
+ else
+ memhost=$(expr ${totalmem} - ${mem} - ${mem})
+ fi
+ #permem=40
+ #mem=$(expr ${totalmem} * ${permem})
+ if [ "${mem}" -lt "256" ] || [ "${memhost}" -lt "256" ]; then
+ writelog "Memory out of range: ${mem} MB (guest) / ${memhost} MB (host)!"
+ writelog "Min. 256 MB for host and guest!"
+ exit 1
+ fi
+fi
+
+# machine UUID, MAC addr part of it
+machineuuid="00000000-0000-0000-0000-${macaddr}"
+# cosmetical, since UUID in lower case
+machineuuid=$(echo ${machineuuid} | tr [A-Z] [a-z])
+# get UUID of VBox image
+[ -z "${diskuuid}" ] && diskuuid=$(VBoxManage -q showvdiinfo ${diskfile} | \
+ grep UUID | awk '{print $2}')
+# snapshot UUIDs (static)
+snapshotuuid[00]="88bc8b6d-f248-468a-95fe-318084904f8b"
+snapshotuuid[01]="42f5033e-9913-41ff-8cba-1c986ba5db8d"
+snapshotuuid[02]="1b66fdcb-8ede-4bb8-aaec-417bc2074633"
+snapshotuuid[03]="563d2c5e-c9a2-4fbb-be51-8d279a558e6c"
+snapshotuuid[04]="efff0c85-c1c8-420d-a25f-6e66f117e1f2"
+snapshotuuid=${snapshotuuid[$VM_ID]}
+
+cat ${OPENSLX_DEFAULT_DIR}/plugin-repo/virtualbox/empty-diff-${VM_ID}.vdi.gz | \
+ gunzip > "${snapshotdir}/{${snapshotuuid}}.vdi"
+
+#snapshotuuid=$(VBoxManage -q showvdiinfo \
+# "${snapshotdir}/${snapshotuuid}.vdi" | grep UUID | awk '{print $2}')
+
+# translate network cards
+if [ "${network_card}" = "e1000" ]; then
+ vb_network_card="82540EM"
+else
+ network_card="pcnet"
+ vb_network_card="Am79C973"
+fi
+
+# translate network kinds (nat, bridged, host-only)
+case "${network_kind}" in
+ bridged)
+ network_kind='BridgedInterface name="br0"'
+ ;;
+ host-only)
+ network_kind='HostOnlyInterface name="vboxnet0"'
+ ;;
+ *)
+ network_kind="NAT"
+ ;;
+esac
+
+vrdpport="590${VM_ID}"
+
+# TODO: most of the following does not make much sense yet ...
+# virtual fd/cd/dvd and drive devices, floppy b: for configuration
+# if $floppy_0 from run-virt.include set then fdtest="TRUE"
+fdtest=
+fdtest=${floppy_0:+"TRUE"}
+# if $fdtest not set floppy0="FALSE", else "TRUE"
+floppy0=${fdtest:-"FALSE"}
+floppy1="TRUE"
+floppy1name="/var/lib/virt/vmchooser/loopimg/fd.img"
+# if $cdrom_0 from run-virt.include set then cdtest="TRUE"
+cdtest=
+cdtest=${cdrom_0:+"TRUE"}
+# if $cdtest not set cdrom0="FALSE", else "TRUE"
+cdrom0=${cdtest:-"FALSE"}
+# if $cdrom_1 from run-virt.include set then cdtest="TRUE"
+cdtest=
+cdtest=${cdrom_1:+"TRUE"}
+# if $cdtest not set cdrom1="FALSE", else "TRUE"
+cdrom1=${cdtest:-"FALSE"}
+# ide is expected default, test for the virtual disk image type should
+# be done while creating the runscripts ...
+ide="TRUE"
+hddrv="ide"
+
+writelog "\tSnapshots dir:\t\t$snapshotdir"
+writelog "Diskimage:"
+writelog "\tDisk type:\t\t$imgtype"
+writelog "\tDisk file:\t\t$diskfile"
+writelog "\tVMostype:\t\t$vmostype"
+writelog "\tMachine UUID:\t\t$machineuuid"
+writelog "\tDisk UUID:\t\t$diskuuid"
+writelog "\tSnapshot UUID:\t\t$snapshotuuid"
+writelog "Virtual Hardware:"
+writelog "\tGuest RAM:\t\t${mem} MB"
+# echo nur wenn memhost gesetzt
+[ -n "${memhost}" ] && writelog "\tHost RAM:\t\t${memhost} MB"
+writelog "\tMAC address:\t\t$macaddr"
+writelog "\tNetwork card:\t\t${vb_network_card}"
+writelog "\tNetwork kind:\t\t${network_kind}"
+#writelog "\tCD-ROM1:\t${cdrom0}"
+#writelog "\tCD-ROM2:\t${cdrom1}"
+#writelog "\tFloppy_A:\t${floppy0}"
+
+################################################################################
+### Pepare and configure virtual machine and disk image
+################################################################################
+
+# TODO: date wichtig?
+#date="$(date +%Y-%m-%dT%H:%M:%SZ)"
+# check if VirtualBox.xml already existing
+# TODO: geht nicht!!!
+if grep -q "<HardDisk uuid=" "${confdir}/VirtualBox.xml"; then
+ # check if our HD and location present
+ extrahd="<HardDisk uuid=\"{${diskuuid}}\" location=\"${diskfile}\"" \
+ extrahd="${extrahd} format=\"${imgtype}\" type=\"Immutable\">"
+ extdiff="<HardDisk uuid=\"{${snapshotuuid}}\" location=\"${snapshotdir}" \
+ extdiff="${extdiff}/{${snapshotuuid}}.vdi\" format=\"VDI\"" \
+ extdiff="${extdiff} autoReset=\"true\"/>"
+ if [ -z "${diskexisting}" ]; then
+ sed -i "s,</HardDisks>, ${extrahd}\n ${extdiff}\n\
+ </HardDisk>\n </HardDisks>," \
+ "${confdir}/VirtualBox.xml"
+ elif [ ${diskexisting} -eq 1 2>/dev/null ]; then
+ sed -i "s,\(<HardDisk uuid="{${diskuuid}}".*\),\1\n ${extdiff}\n,"\
+ "${confdir}/VirtualBox.xml"
+ fi
+ # check if our machine and location present
+ extramach="<MachineEntry uuid=\"{${machineuuid}}\" src=\"Machines" \
+ extramach="${extramach}/${vm_shortname}/${vm_shortname}.xml\"/>"
+ if ! grep -q "${extramach}" "${confdir}/VirtualBox.xml"; then
+ sed -i "s,</MachineRegistry>, ${extramach}\n </MachineRegistry>," \
+ "${confdir}/VirtualBox.xml"
+ fi
+else
+ . ${PLUGINCONFVIRTUALBOX}/virtualbox.include > \
+ "${confdir}/VirtualBox.xml"
+fi
+
+# shortened date YYYY-MM-DD
+#date=${date%T*}
+. ${PLUGINCONFVIRTUALBOX}/machine.include >"${machconfig}"
+
+# add ssh port if linux and NAT
+if [ "${vmostype}" = "Linux26" ] && [ "${network_kind}" = "NAT" ]; then
+ vmsshport="220${VM_ID}"
+ extradataitem='<ExtraDataItem name="VBoxInternal/Devices' \
+ extradataitem="${extradataitem}/${network_card}/0/LUN#0/Config/ssh/"
+ extradataguestport='GuestPort" value="22"/>'
+ extradatahostport="HostPort\" value=\"${vmsshport}\"/>"
+ extradataprotocol='Protocol" value="TCP"/>'
+ sed -ni "s,</ExtraData>, ${extradataitem}${extradataguestport}\n\
+ ${extradataitem}${extradatahostport}\n\
+ ${extradataitem}${extradataprotocol}\n\
+ </ExtraData>," "${machconfig}"
+ writelog "\tGuest SSH port:\t\t${vmsshport}"
+fi
+
+################################################################################
+# finally set env for run-virt.sh
+################################################################################
+
+# wait for a certain command to settle
+# get the PID of the right process
+# TODO: not very good! But seems to work
+# TODO: not needed? KILL!!!
+VBMANPID=$(pstree -p | grep VBoxXPCOMIPCD | grep -ivE "VirtualBox|VBoxHeadless"\
+ | sed -e "s/.*VBoxXPCOMIPCD(\(.*\)).*/\1/")
+for i in $(echo ${VBMANPID}); do
+ kill -9 ${VBMANPID} >/dev/null 2>&1
+done
+# TODO: OLD Version, NOW: KILL process
+#VBMANPID=$(pstree -p | grep VBoxXPCOMIPCD | grep -ivE "VirtualBox|VBoxHeadless"\
+# | sed -e "s/.*VBoxXPCOMIPCD(\(.*\)).*/\1/" | tail -n 1)
+#for i in {0..999}; do
+# ps aux | grep -v grep | grep VBoxXPCOMIPCD | grep -q " ${VBMANPID} " || break
+# if [ $i -eq 999 ]; then
+# kill -9 ${VBMANPID} >/dev/null 2>&1
+# writelog "Process ID ${VBMANPID} did not finish, killing!"
+# fi
+#done
+
+# set the variables appropriately (several interfaces with different names)
+VIRTCMD=$(which VirtualBox 2>/dev/null)
+VIRTCMDOPTS="--startvm ${machineuuid} --start-running"
+
+# SDL tests
+#VIRTCMDSDL=$(which VBoxSDL 2>/dev/null)
+#VIRTCMDOPTSSDL="--startvm ${machineuuid} --fullscreen --hwvirtex --memory 1024 \
+# --fixedmode 1680 1050 24 --hostkey 302 0"
+
+# set headless mode
+VIRTCMDHL=$(which VBoxHeadless 2>/dev/null)
+VIRTCMDOPTSHL="-s ${machineuuid}"
+
diff --git a/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz b/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz
new file mode 100644
index 00000000..e2133d6d
--- /dev/null
+++ b/os-plugins/plugins/virtualbox/files/rwimg.vdi.gz
Binary files differ
diff --git a/os-plugins/plugins/virtualbox/files/virtualbox.include b/os-plugins/plugins/virtualbox/files/virtualbox.include
new file mode 100644
index 00000000..2a7af026
--- /dev/null
+++ b/os-plugins/plugins/virtualbox/files/virtualbox.include
@@ -0,0 +1,47 @@
+# Include file (general template) for run-virt.include of the virtualbox plugin
+cat << EOF > "${confdir}/VirtualBox.xml"
+<?xml version="1.0"?>
+<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.9-linux"> <!-- 1.7-linux -->
+ <Global>
+ <ExtraData>
+ <ExtraDataItem name="GUI/Input/AutoCapture" value="true"/>
+ <ExtraDataItem name="GUI/Input/HostKey" value="65300"/> <!-- scroll lock / Rollen -->
+ <ExtraDataItem name="GUI/LastVMSelected" value="${machineuuid}"/>
+ <ExtraDataItem name="GUI/LicenseAgreed" value="7"/>
+ <ExtraDataItem name="GUI/MaxGuestResolution" value="any"/> <!-- auto, width,height -->
+ <ExtraDataItem name="GUI/SUNOnlineData" value="triesLeft=0"/>
+ <ExtraDataItem name="GUI/SuppressMessages" value=",remindAboutAutoCapture,confirmInputCapture,remindAboutWrongColorDepth,confirmGoingFullscreen,remindAboutMouseIntegrationOn,remindAboutMouseIntegrationOff,showRuntimeError.warning.DevATA_DISKFULL,remindAboutPausedVMInput,confirmVMReset,showRuntimeError.warning.HostAudioNotResponding"/>
+ <ExtraDataItem name="GUI/TrayIcon/Enabled" value="false"/>
+ <ExtraDataItem name="GUI/UpdateCheckCount" value="2"/>
+ <ExtraDataItem name="GUI/UpdateDate" value="never"/>
+ </ExtraData>
+ <MachineRegistry>
+ <MachineEntry uuid="{${machineuuid}}" src="Machines/${vm_shortname}/${vm_shortname}.xml"/>
+ </MachineRegistry>
+ <MediaRegistry>
+ <HardDisks>
+ <HardDisk uuid="{${diskuuid}}" location="${diskfile}" format="${imgfmt}" type="${imgtype}">
+ <HardDisk uuid="{${snapshotuuid}}" location="${snapshotdir}/{${snapshotuuid}}.vdi" format="VDI" autoReset="true"/>
+ </HardDisk>
+ </HardDisks>
+ <!--
+ <DVDImages>
+ <Image uuid="{dcd1e32a-729f-4faa-b319-67adca15e4a4}" location="/.../gpxe-1.0.0+-virtio-net.iso"/>
+ <Image uuid="{b71450c6-b8ff-43c1-a290-2a793b3023d8}" location="/.../gpxe-1.0.0+-e1000.iso"/>
+ </DVDImages>
+ -->
+ <FloppyImages/>
+ </MediaRegistry>
+ <NetserviceRegistry>
+ <DHCPServers>
+ <DHCPServer networkName="HostInterfaceNetworking-vboxnet0" IPAddress="192.168.56.100" networkMask="255.255.255.0" lowerIP="192.168.56.101" upperIP="192.168.56.254" enabled="1"/>
+ <!--
+ <DHCPServer networkName="HostInterfaceNetworking-vboxnet1" IPAddress="0.0.0.0" networkMask="0.0.0.0" lowerIP="0.0.0.0" upperIP="0.0.0.0" enabled="0"/>
+ -->
+ </DHCPServers>
+ </NetserviceRegistry>
+ <SystemProperties defaultMachineFolder="${machfolder}" defaultHardDiskFolder="${diskfolder}" defaultHardDiskFormat="VDI" remoteDisplayAuthLibrary="VRDPAuth" webServiceAuthLibrary="VRDPAuth" LogHistoryCount="3"/>
+ <USBDeviceFilters/>
+ </Global>
+</VirtualBox>
+EOF
diff --git a/os-plugins/plugins/xen/files/xen.examples/README b/os-plugins/plugins/xen/files/xen.examples/README
new file mode 100644
index 00000000..e2e8f434
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/README
@@ -0,0 +1,51 @@
+Xen Control Tools - Examples
+===================================
+
+This directory contains example scripts and configurations for Xen.
+For many operations you will either be able to use these scripts directly, or
+incorporate code from them into your own scripts.
+
+If you write a useful script and would like to share it, please do
+send it (preferably with a little summary to go in this file) to
+<xen-devel@lists.sourceforge.net> so we can add it to this directory.
+
+block - called by xen-backend.agent to bind/unbind dev
+block-common.sh - sourced by block, block-*
+block-enbd - binds/unbinds network block devices
+block-nbd - binds/unbinds network block devices
+external-device-migrate - called by xend for migrating external devices
+locking.sh - locking functions to prevent concurrent access to
+ critical sections inside script files
+logging.sh - logging function to log output using syslog
+network-bridge - xen network start/stop script when using bridging
+network-nat - xen network start/stop script when using NAT
+network-route - xen network start/stop script when using routing
+vif-bridge - virtual network start/stop script in bridged mode
+vif-common.sh - sourced by vif-bridge
+vif-nat - xen virtual network start/stop script in NAT mode
+vif-route - xen virtual network start/stop script in routed mode
+vtpm - called by xen-backend.agent to bind/unbind vTPM devices
+vtpm-common.sh - common code for vTPM handling
+vtpm-delete - remove an entry from the vTPM table given the
+ domain's name
+vtpm-hotplug-common.sh - sourced by vtpm
+vtpm-migration.sh - sourced by external-device-migrate
+xen-backend.agent - calls block, vif-*, vtpm scripts to add, remove, hotplug
+ devices
+xen-backend.rules - hotplug script rules
+xend-config.sxp - default xend configuration file
+xen-hotplug-common.sh - sourced by vif-common.sh
+xen-network-common.sh - sourced by vif-common.sh
+xen-script-common.sh - sourced by network-bridge, xen-hotplug-common.sh
+xmexample1 - example configuration script for 'xm create'
+xmexample2 - a more complex configuration script for 'xm create'
+xmexample3 - an advanced configuration script for 'xm create'
+ that utilizes the vmid
+xmexample.nbd - configuration script that uses NBD filesystems
+xmexample.hvm - a configuration script for creating a hvm domain with
+ 'xm create'
+xmexample.hvm-stubdom - a configuration script for creating a hvm domain with
+ 'xm create' that utilizes a stubdomain for device model
+xmexample.pv-grub - a configuration script for creating a domain with 'xm create'
+ which boots PV-GRUB.
+xmexample.vti - a configuration script for creating a domain on vti
diff --git a/os-plugins/plugins/xen/files/xen.examples/README.incompatibilities b/os-plugins/plugins/xen/files/xen.examples/README.incompatibilities
new file mode 100644
index 00000000..bb067bd4
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/README.incompatibilities
@@ -0,0 +1,38 @@
+Command Incompatibilities
+=========================
+
+Known incompatibilities with various commands on various distributions, and
+the workarounds we use.
+
+
+brctl
+-----
+
+brctl show <bridge> fails on SLES9 SP2. Workaround is to use brctl show
+without arguments, and grep, though this would be difficult were you to need
+to check for a specific bridge-interface pair, since brctl does not show the
+bridge name on every line.
+
+
+ifup / ifdown
+-------------
+
+SuSE requires an extra parameter to ifup, which is created by calling getcfg
+appropriately. See xen-network-common.sh for details.
+
+Gentoo doesn't have ifup/ifdown; appropriate alternatives are defined in
+xen-network-common.sh.
+
+
+ip
+--
+
+Newer ip commands (from iproute2) do not accept the abbreviated syntax "ip r a
+..." etc. "ip route add ..." must be used instead.
+
+
+sed
+---
+
+\s is not supported in regexps on Debian etch (sed 4.1.2), Ubuntu 4.10. We
+hand-craft character classes instead.
diff --git a/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.disks b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.disks
new file mode 100644
index 00000000..7743fc30
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.disks
@@ -0,0 +1,32 @@
+# A VM's disks can be stored in a variety of ways.
+# Here are some examples:
+disk = [
+ # Block device
+ 'phy:/dev/hdb,xvda,w',
+ # Raw format, accessed via loopback
+ 'file:/var/lib/xen/images/disk-example/disk0,xvdb,w',
+ # Raw format, accessed via blocktap
+ 'tap:aio:/var/lib/xen/images/disk-example/disk0,xvdc,w',
+ # QCOW format, accessed via blocktap
+ 'tap:qcow:/var/lib/xen/images/disk-example/disk0.qcow,xvdd,w',
+ # NBD (network block device): IP and port are separated by space
+ 'nbd:192.168.0.1 20004,xvde,w',
+ # iSCSI: The usual colon is replaced with '@'
+ 'iscsi:iqn.2006-09.de.suse@0ac47ee2-216e-452a-a341-a12624cd0225,xvdf,w',
+ # Fibre Channel N_Port ID Virtualization
+ 'npiv:210400e08b80c40f,xvdg,w' ]
+
+
+# Remaining settings for the example VM:
+name="disk-example"
+memory=512
+vcpus=1
+on_crash="destroy"
+on_poweroff="destroy"
+on_reboot="restart"
+localtime=0
+builder="linux"
+bootloader="/usr/lib/xen/boot/domUloader.py"
+bootargs="--entry=xvda2:/boot/vmlinuz-xen,/boot/initrd-xen"
+vif=[ 'mac=00:16:3e:00:01:02,bridge=xenbr0' ]
+vfb=['type=vnc,vncunused=1']
diff --git a/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.domUloader b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.domUloader
new file mode 100644
index 00000000..6edfdbc2
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.domUloader
@@ -0,0 +1,28 @@
+# This is a bootloader used to boot paravirtualized domains. You can optionally
+# plug in a different boot loader here, e.g., pygrub. There is usually no
+# reason to change this. Don't explicitly specify kernel and ramdisk if you use
+# a bootloader.
+bootloader="/usr/lib/xen/boot/domUloader.py"
+
+# The domUloader will pull the specified kernel and initrd out of the domU's
+# disk, and use that to boot. This is easier to manage, compared to manually
+# keeping a copy of the kernel and initrd in sync in dom0's filesystem and
+# pointing to them with the "kernel" and "ramdisk" parameters. Syntax is
+# "VDEV:KERNEL,INITRD", where VDEV is the block device (from domU's point of
+# view) within which KERNEL and INITRD can be found.
+bootentry = "hda1:/boot/vmlinuz-xen,/boot/initrd-xen"
+
+
+# Remaining settings for the example VM:
+name="domUloader-example"
+memory=512
+vcpus=1
+on_crash="destroy"
+on_poweroff="destroy"
+on_reboot="restart"
+localtime=0
+builder="linux"
+bootargs="--entry=xvda2:/boot/vmlinuz-xen,/boot/initrd-xen"
+disk=[ 'file:/var/lib/xen/images/domUloader-example/disk0,xvda,w' ]
+vif=[ 'mac=00:16:3e:00:01:02,bridge=xenbr0' ]
+vfb=['type=vnc,vncunused=1']
diff --git a/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.hvm b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.hvm
new file mode 100644
index 00000000..d0686f5d
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.hvm
@@ -0,0 +1,358 @@
+# -*- mode: python; -*-
+#============================================================================
+# Python configuration setup for 'xm create'.
+# This script sets the parameters used when a domain is created using 'xm create'.
+# You use a separate script for each domain you want to create, or
+# you can set the parameters for the domain on the xm command line.
+#============================================================================
+
+import os, re
+
+arch_libdir = 'lib'
+arch = os.uname()[4]
+if os.uname()[0] == 'Linux' and re.search('64', arch):
+ arch_libdir = 'lib64'
+
+#----------------------------------------------------------------------------
+# Kernel image file.
+kernel = "/usr/lib/xen/boot/hvmloader"
+
+# The domain build function. HVM domain uses 'hvm'.
+builder='hvm'
+
+# Initial memory allocation (in megabytes) for the new domain.
+#
+# WARNING: Creating a domain with insufficient memory may cause out of
+# memory errors. The domain needs enough memory to boot kernel
+# and modules. Allocating less than 32MBs is not recommended.
+memory = 128
+
+# Shadow pagetable memory for the domain, in MB.
+# If not explicictly set, xend will pick an appropriate value.
+# Should be at least 2KB per MB of domain memory, plus a few MB per vcpu.
+# shadow_memory = 8
+
+# A name for your domain. All domains must have different names.
+name = "ExampleHVMDomain"
+
+# 128-bit UUID for the domain. The default behavior is to generate a new UUID
+# on each call to 'xm create'.
+#uuid = "06ed00fe-1162-4fc4-b5d8-11993ee4a8b9"
+
+#-----------------------------------------------------------------------------
+# The number of cpus guest platform has, default=1
+#vcpus=1
+
+# Enable/disable HVM guest PAE, default=1 (enabled)
+#pae=1
+
+# Enable/disable HVM guest ACPI, default=1 (enabled)
+#acpi=1
+
+# Enable/disable HVM APIC mode, default=1 (enabled)
+# Note that this option is ignored if vcpus > 1
+#apic=1
+
+# Enable/disable extended power management support within HVM guest, i.e., beyond
+# S3, S4, S5 within guest like exposing battery meter.
+# 0 (default option, extended power management support disabled)
+# 1 (pass-through mode; uses pass-through as needed; efficient but limited in scope)
+# 2 (non pass-through mode; extended scope, likely to work on all applicable environment
+# but comparitively less efficient than pass-through mode)
+# xen_extended_power_mgmt=0
+
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # all vcpus run on cpus 0,2,3,5
+#cpus = ["2", "3"] # VCPU0 runs on CPU2, VCPU1 runs on CPU3
+
+# Optionally define mac and/or bridge for the network interfaces.
+# Random MACs are assigned if not given.
+#vif = [ 'type=ioemu, mac=00:16:3e:00:00:11, bridge=xenbr0, model=ne2k_pci' ]
+# type=ioemu specify the NIC is an ioemu device not netfront
+vif = [ 'type=ioemu, bridge=xenbr0' ]
+
+#----------------------------------------------------------------------------
+# Define the disk devices you want the domain to have access to, and
+# what you want them accessible as.
+# Each disk entry is of the form phy:UNAME,DEV,MODE
+# where UNAME is the device, DEV is the device name the domain will see,
+# and MODE is r for read-only, w for read-write.
+
+#disk = [ 'phy:hda1,hda1,r' ]
+disk = [ 'file:/var/lib/xen/images/disk.img,ioemu:hda,w', ',hdc:cdrom,r' ]
+
+#----------------------------------------------------------------------------
+# Configure the behaviour when a domain exits. There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash. For each of these you
+# may specify:
+#
+# "destroy", meaning that the domain is cleaned up as normal;
+# "restart", meaning that a new domain is started in place of the old
+# one;
+# "preserve", meaning that no clean-up is done until the domain is
+# manually destroyed (using xm destroy, for example); or
+# "rename-restart", meaning that the old domain is not cleaned up, but is
+# renamed and a new domain started in its place.
+#
+# In the event a domain stops due to a crash, you have the additional options:
+#
+# "coredump-destroy", meaning dump the crashed domain's core and then destroy;
+# "coredump-restart', meaning dump the crashed domain's core and the restart.
+#
+# The default is
+#
+# on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# For backwards compatibility we also support the deprecated option restart
+#
+# restart = 'onreboot' means on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'destroy'
+#
+# restart = 'always' means on_poweroff = 'restart'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# restart = 'never' means on_poweroff = 'destroy'
+# on_reboot = 'destroy'
+# on_crash = 'destroy'
+
+#on_poweroff = 'destroy'
+#on_reboot = 'restart'
+#on_crash = 'restart'
+
+#============================================================================
+
+# Device Model to be used
+device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'
+
+#-----------------------------------------------------------------------------
+# boot on floppy (a), hard disk (c), Network (n) or CD-ROM (d)
+# default: hard disk, cd-rom, floppy
+#boot="cda"
+
+#-----------------------------------------------------------------------------
+# write to temporary files instead of disk image files
+#snapshot=1
+
+#----------------------------------------------------------------------------
+# enable SDL library for graphics, default = 0
+sdl=0
+
+#----------------------------------------------------------------------------
+# enable OpenGL for texture rendering inside the SDL window, default = 1
+# valid only if sdl is enabled.
+opengl=1
+
+#----------------------------------------------------------------------------
+# enable VNC library for graphics, default = 1
+vnc=1
+
+#----------------------------------------------------------------------------
+# address that should be listened on for the VNC server if vnc is set.
+# default is to use 'vnc-listen' setting from /etc/xen/xend-config.sxp
+#vnclisten="127.0.0.1"
+
+#----------------------------------------------------------------------------
+# set VNC display number, default = domid
+#vncdisplay=1
+
+#----------------------------------------------------------------------------
+# try to find an unused port for the VNC server, default = 1
+#vncunused=1
+
+#----------------------------------------------------------------------------
+# set password for domain's VNC console
+# default is depents on vncpasswd in xend-config.sxp
+vncpasswd=''
+
+#----------------------------------------------------------------------------
+# no graphics, use serial port
+#nographic=0
+
+#----------------------------------------------------------------------------
+# enable stdvga, default = 0 (use cirrus logic device model)
+stdvga=0
+
+#-----------------------------------------------------------------------------
+# serial port re-direct to pty deivce, /dev/pts/n
+# then xm console or minicom can connect
+serial='pty'
+
+
+#-----------------------------------------------------------------------------
+# Qemu Monitor, default is disable
+# Use ctrl-alt-2 to connect
+#monitor=1
+
+
+#-----------------------------------------------------------------------------
+# enable sound card support, [sb16|es1370|all|..,..], default none
+#soundhw='sb16'
+
+
+#-----------------------------------------------------------------------------
+# set the real time clock to local time [default=0 i.e. set to utc]
+#localtime=1
+
+
+#-----------------------------------------------------------------------------
+# set the real time clock offset in seconds [default=0 i.e. same as dom0]
+#rtc_timeoffset=3600
+
+#-----------------------------------------------------------------------------
+# start in full screen
+#full-screen=1
+
+
+#-----------------------------------------------------------------------------
+# Enable USB support (specific devices specified at runtime through the
+# monitor window)
+#usb=1
+
+# Enable USB mouse support (only enable one of the following, `mouse' for
+# PS/2 protocol relative mouse, `tablet' for
+# absolute mouse)
+#usbdevice='mouse'
+#usbdevice='tablet'
+
+#-----------------------------------------------------------------------------
+# Set keyboard layout, default is en-us keyboard.
+#keymap='ja'
+
+#-----------------------------------------------------------------------------
+# Enable/disable xen platform PCI device, default=1 (enabled)
+#xen_platform_pci=1
+
+#-----------------------------------------------------------------------------
+# Configure guest CPUID responses:
+#
+#cpuid=[ '1:ecx=xxxxxxxxxxx00xxxxxxxxxxxxxxxxxxx,
+# eax=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ]
+# - Unset the SSE4 features (CPUID.1[ECX][20-19])
+# - Default behaviour for all other bits in ECX And EAX registers.
+#
+# Each successive character represent a lesser-significant bit:
+# '1' -> force the corresponding bit to 1
+# '0' -> force to 0
+# 'x' -> Get a safe value (pass through and mask with the default policy)
+# 'k' -> pass through the host bit value
+# 's' -> as 'k' but preserve across save/restore and migration
+#
+# Expose to the guest multi-core cpu instead of multiple processors
+# Example for intel, expose a 8-core processor :
+#cpuid=['1:edx=xxx1xxxxxxxxxxxxxxxxxxxxxxxxxxxx,
+# ebx=xxxxxxxx00010000xxxxxxxxxxxxxxxx',
+# '4,0:eax=001111xxxxxxxxxxxxxxxxxxxxxxxxxx']
+# - CPUID.1[EDX][HT] : Enable HT
+# - CPUID.1[EBX] : Number of vcpus * 2
+# - CPUID.4,0[EAX] : Number of vcpus * 2 - 1
+#vcpus=8
+#
+# Example for amd, expose a 5-core processor :
+# cpuid = ['1:ebx=xxxxxxxx00001010xxxxxxxxxxxxxxxx,
+# edx=xxx1xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
+# '0x80000001:ecx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1x',
+# '0x80000008:ecx=xxxxxxxxxxxxxxxxxxxxxxxxxx001001']
+# - CPUID.1[EBX] : Threads per Core * Cores per Socket (2 * #vcpus)
+# - CPUID.1[EDX][HT] : Enable HT
+# - CPUID.0x80000001[CmpLegacy] : Use legacy method
+# - CPUID.0x80000008[ECX] : #vcpus * 2 - 1
+#vcpus=5
+#
+# Downgrade the cpuid to make a better compatibility for migration :
+# Look like a generic 686 :
+# cpuid = [ '0:eax=0x3,ebx=0x0,ecx=0x0,edx=0x0',
+# '1:eax=0x06b1,
+# ecx=xxxxxxxxxxx0000xx00xxx0000000xx0,
+# edx=xxx00000xxxxxxx0xxxxxxxxx0xxxxxx',
+# '4:eax=0x3,ebx=0x0,ecx=0x0,edx=0x0',
+# '0x80000000:eax=0x3,ebx=0x0,ecx=0x0,edx=0x0']
+# with the highest leaf
+# - CPUID.0[EAX] : Set the highest leaf
+# - CPUID.1[EAX] : 686
+# - CPUID.1[ECX] : Mask some features
+# - CPUID.1[EDX] : Mask some features
+# - CPUID.4 : Reply like the highest leaf, in our case CPUID.3
+# - CPUID.0x80000000 : No extension we are on a Pentium III, reply like the
+# highest leaf (CPUID.3).
+#
+# Configure host CPUID consistency checks, which must be satisfied for this
+# VM to be allowed to run on this host's processor type:
+#cpuid_check=[ '1:ecx=xxxxxxxxxxxxxxxxxxxxxxxxxx1xxxxx' ]
+# - Host must have VMX feature flag set
+#
+# The format is similar to the above for 'cpuid':
+# '1' -> the bit must be '1'
+# '0' -> the bit must be '0'
+# 'x' -> we don't care (do not check)
+# 's' -> the bit must be the same as on the host that started this VM
+
+#-----------------------------------------------------------------------------
+# Configure passthrough PCI{,-X,e} devices:
+#
+# pci=[ '[SSSS:]BB:DD.F[,option1[,option2[...]]]', ... ]
+#
+# [SSSS]:BB:DD.F "bus segment:bus:device.function"(1) of the device to
+# be assigned, bus segment is optional. All fields are
+# in hexadecimal and no field should be longer than that
+# as shown in the pattern. Successful assignment may need
+# certain hardware support and additional configurations
+# (e.g. VT-d, see docs/misc/vtd.txt for more details).
+#
+# (1) bus segment is sometimes also referred to as the PCI "domain",
+# not to be confused with Xen domain.
+#
+#
+# optionN per-device options in "key=val" format. Current
+# available options are:
+# - msitranslate=0|1
+# per-device overriden of pci_msitranslate, see below
+# - power_mgmt=0|1
+# per-device overriden of pci_power_mgmt, see below
+#
+#pci=[ '07:00.0', '07:00.1' ]
+
+# MSI-INTx translation for MSI capable devices:
+#
+# If it's set, Xen will enable MSI for the device that supports it even
+# if the guest don't use MSI. In the case, an IO-APIC type interrupt will
+# be injected to the guest every time a corresponding MSI message is
+# received.
+# If the guest enables MSI or MSI-X, the translation is automatically
+# turned off.
+#
+#pci_msitranslate=1
+
+# PCI Power Management:
+#
+# If it's set, the guest OS will be able to program D0-D3hot states of the
+# PCI device for the purpose of low power consumption.
+#
+#pci_power_mgmt=0
+
+#-----------------------------------------------------------------------------
+# Configure PVSCSI devices:
+#
+#vscsi=[ 'PDEV, VDEV' ]
+#
+# PDEV gives physical SCSI device to be attached to specified guest
+# domain by one of the following identifier format.
+# - XX:XX:XX:XX (4-tuples with decimal notation which shows
+# "host:channel:target:lun")
+# - /dev/sdxx or sdx
+# - /dev/stxx or stx
+# - /dev/sgxx or sgx
+# - result of 'scsi_id -gu -s'.
+# ex. # scsi_id -gu -s /block/sdb
+# 36000b5d0006a0000006a0257004c0000
+#
+# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as
+# which the specified guest domain recognize.
+#
+
+#vscsi = [ '/dev/sdx, 0:0:0:0' ]
diff --git a/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.hvm-stubdom b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.hvm-stubdom
new file mode 100644
index 00000000..acc250eb
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.hvm-stubdom
@@ -0,0 +1,314 @@
+# -*- mode: python; -*-
+#============================================================================
+# Python configuration setup for 'xm create'.
+# This script sets the parameters used when a domain is created using 'xm create'.
+# You use a separate script for each domain you want to create, or
+# you can set the parameters for the domain on the xm command line.
+#============================================================================
+#
+# This is a version using a stubdomain for device model
+# The differences with xmexample.hvm are marked with "STUBDOM"
+
+#----------------------------------------------------------------------------
+# Kernel image file.
+kernel = "/usr/lib/xen/boot/hvmloader"
+
+# The domain build function. HVM domain uses 'hvm'.
+builder='hvm'
+
+# Initial memory allocation (in megabytes) for the new domain.
+#
+# WARNING: Creating a domain with insufficient memory may cause out of
+# memory errors. The domain needs enough memory to boot kernel
+# and modules. Allocating less than 32MBs is not recommended.
+memory = 128
+
+# Shadow pagetable memory for the domain, in MB.
+# If not explicictly set, xend will pick an appropriate value.
+# Should be at least 2KB per MB of domain memory, plus a few MB per vcpu.
+# shadow_memory = 8
+
+# A name for your domain. All domains must have different names.
+name = "xmexample.hvm"
+
+# 128-bit UUID for the domain. The default behavior is to generate a new UUID
+# on each call to 'xm create'.
+#uuid = "06ed00fe-1162-4fc4-b5d8-11993ee4a8b9"
+
+#-----------------------------------------------------------------------------
+# The number of cpus guest platform has, default=1
+#vcpus=1
+
+# Enable/disable HVM guest PAE, default=1 (enabled)
+#pae=1
+
+# Enable/disable HVM guest ACPI, default=1 (enabled)
+#acpi=1
+
+# Enable/disable HVM APIC mode, default=1 (enabled)
+# Note that this option is ignored if vcpus > 1
+#apic=1
+
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # all vcpus run on cpus 0,2,3,5
+#cpus = ["2", "3"] # VCPU0 runs on CPU2, VCPU1 runs on CPU3
+
+# Optionally define mac and/or bridge for the network interfaces.
+# Random MACs are assigned if not given.
+#vif = [ 'type=ioemu, mac=00:16:3e:00:00:11, bridge=xenbr0, model=ne2k_pci' ]
+# type=ioemu specify the NIC is an ioemu device not netfront
+vif = [ 'type=ioemu, bridge=xenbr0' ]
+
+#----------------------------------------------------------------------------
+# Define the disk devices you want the domain to have access to, and
+# what you want them accessible as.
+# Each disk entry is of the form phy:UNAME,DEV,MODE
+# where UNAME is the device, DEV is the device name the domain will see,
+# and MODE is r for read-only, w for read-write.
+
+disk = [ 'file:/var/images/min-el3-i386.img,hda,w', 'phy:/dev/cdrom,hdc:cdrom,r' ]
+
+#----------------------------------------------------------------------------
+# Configure the behaviour when a domain exits. There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash. For each of these you
+# may specify:
+#
+# "destroy", meaning that the domain is cleaned up as normal;
+# "restart", meaning that a new domain is started in place of the old
+# one;
+# "preserve", meaning that no clean-up is done until the domain is
+# manually destroyed (using xm destroy, for example); or
+# "rename-restart", meaning that the old domain is not cleaned up, but is
+# renamed and a new domain started in its place.
+#
+# In the event a domain stops due to a crash, you have the additional options:
+#
+# "coredump-destroy", meaning dump the crashed domain's core and then destroy;
+# "coredump-restart', meaning dump the crashed domain's core and the restart.
+#
+# The default is
+#
+# on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# For backwards compatibility we also support the deprecated option restart
+#
+# restart = 'onreboot' means on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'destroy'
+#
+# restart = 'always' means on_poweroff = 'restart'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# restart = 'never' means on_poweroff = 'destroy'
+# on_reboot = 'destroy'
+# on_crash = 'destroy'
+
+#on_poweroff = 'destroy'
+#on_reboot = 'restart'
+#on_crash = 'restart'
+
+#============================================================================
+
+# Device Model to be used
+#
+# STUBDOM: this is a script that creates the stub domain running the device
+# model
+device_model = '/usr/lib/xen/bin/stubdom-dm'
+
+#-----------------------------------------------------------------------------
+# boot on floppy (a), hard disk (c), Network (n) or CD-ROM (d)
+# default: hard disk, cd-rom, floppy
+boot="cda"
+
+#-----------------------------------------------------------------------------
+# write to temporary files instead of disk image files
+#snapshot=1
+
+#----------------------------------------------------------------------------
+# enable SDL library for graphics, default = 0
+#
+sdl=0
+
+#----------------------------------------------------------------------------
+# enable OpenGL for texture rendering inside the SDL window, default = 1
+# valid only if sdl is enabled.
+#
+opengl=1
+
+#----------------------------------------------------------------------------
+# enable VNC library for graphics, default = 1
+vnc=1
+
+#----------------------------------------------------------------------------
+# address that should be listened on for the VNC server if vnc is set.
+# default is to use 'vnc-listen' setting from /etc/xen/xend-config.sxp
+#vnclisten="127.0.0.1"
+
+#----------------------------------------------------------------------------
+# set VNC display number, default = domid
+#vncdisplay=1
+
+#----------------------------------------------------------------------------
+# try to find an unused port for the VNC server, default = 1
+#vncunused=1
+
+#----------------------------------------------------------------------------
+# enable spawning vncviewer for domain's console
+# (only valid when vnc=1), default = 0
+#vncconsole=0
+
+#----------------------------------------------------------------------------
+# set password for domain's VNC console
+# default is depents on vncpasswd in xend-config.sxp
+vncpasswd=''
+
+#----------------------------------------------------------------------------
+# no graphics, use serial port
+#nographic=0
+
+#----------------------------------------------------------------------------
+# enable stdvga, default = 0 (use cirrus logic device model)
+stdvga=0
+
+#-----------------------------------------------------------------------------
+# serial port re-direct to pty deivce, /dev/pts/n
+# then xm console or minicom can connect
+#
+# STUBDOM: always disable as the stub domain doesn't have access to dom0's
+# ptys
+#serial='pty'
+
+
+#-----------------------------------------------------------------------------
+# Qemu Monitor, default is disable
+# Use ctrl-alt-2 to connect
+#monitor=1
+
+
+#-----------------------------------------------------------------------------
+# enable sound card support, [sb16|es1370|all|..,..], default none
+#
+# STUBDOM: not supported
+#soundhw='sb16'
+
+
+#-----------------------------------------------------------------------------
+# set the real time clock to local time [default=0 i.e. set to utc]
+#localtime=1
+
+
+#-----------------------------------------------------------------------------
+# set the real time clock offset in seconds [default=0 i.e. same as dom0]
+#rtc_timeoffset=3600
+
+#-----------------------------------------------------------------------------
+# start in full screen
+#full-screen=1
+
+
+#-----------------------------------------------------------------------------
+# Enable USB support (specific devices specified at runtime through the
+# monitor window)
+#usb=1
+
+# Enable USB mouse support (only enable one of the following, `mouse' for
+# PS/2 protocol relative mouse, `tablet' for
+# absolute mouse)
+#usbdevice='mouse'
+#usbdevice='tablet'
+
+#-----------------------------------------------------------------------------
+# Set keyboard layout, default is en-us keyboard.
+#keymap='ja'
+
+#-----------------------------------------------------------------------------
+# Configure guest CPUID responses:
+#
+#cpuid=[ '1:ecx=xxxxxxxxxxx00xxxxxxxxxxxxxxxxxxx,
+# eax=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ]
+# - Unset the SSE4 features (CPUID.1[ECX][20-19])
+# - Default behaviour for all other bits in ECX And EAX registers.
+#
+# Each successive character represent a lesser-significant bit:
+# '1' -> force the corresponding bit to 1
+# '0' -> force to 0
+# 'x' -> Get a safe value (pass through and mask with the default policy)
+# 'k' -> pass through the host bit value
+# 's' -> as 'k' but preserve across save/restore and migration
+#
+# Expose to the guest multi-core cpu instead of multiple processors
+# Example for intel, expose a 8-core processor :
+#cpuid=['1:edx=xxx1xxxxxxxxxxxxxxxxxxxxxxxxxxxx,
+# ebx=xxxxxxxx00010000xxxxxxxxxxxxxxxx',
+# '4,0:eax=001111xxxxxxxxxxxxxxxxxxxxxxxxxx']
+# - CPUID.1[EDX][HT] : Enable HT
+# - CPUID.1[EBX] : Number of vcpus * 2
+# - CPUID.4,0[EAX] : Number of vcpus * 2 - 1
+#vcpus=8
+#
+# Example for amd, expose a 5-core processor :
+# cpuid = ['1:ebx=xxxxxxxx00001010xxxxxxxxxxxxxxxx,
+# edx=xxx1xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
+# '0x80000001:ecx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1x',
+# '0x80000008:ecx=xxxxxxxxxxxxxxxxxxxxxxxxxx001001']
+# - CPUID.1[EBX] : Threads per Core * Cores per Socket (2 * #vcpus)
+# - CPUID.1[EDX][HT] : Enable HT
+# - CPUID.0x80000001[CmpLegacy] : Use legacy method
+# - CPUID.0x80000008[ECX] : #vcpus * 2 - 1
+#vcpus=5
+#
+# Downgrade the cpuid to make a better compatibility for migration :
+# Look like a generic 686 :
+# cpuid = [ '0:eax=0x3,ebx=0x0,ecx=0x0,edx=0x0',
+# '1:eax=0x06b1,
+# ecx=xxxxxxxxxx0000xx00xxx0000000xx0,
+# edx=xx00000xxxxxxx0xxxxxxxxx0xxxxxx',
+# '4:eax=0x3,ebx=0x0,ecx=0x0,edx=0x0',
+# '0x80000000:eax=0x3,ebx=0x0,ecx=0x0,edx=0x0']
+# with the highest leaf
+# - CPUID.0[EAX] : Set the highest leaf
+# - CPUID.1[EAX] : 686
+# - CPUID.1[ECX] : Mask some features
+# - CPUID.1[EDX] : Mask some features
+# - CPUID.4 : Reply like the highest leaf, in our case CPUID.3
+# - CPUID.0x80000000 : No extension we are on a Pentium III, reply like the
+# highest leaf (CPUID.3).
+#
+# Configure host CPUID consistency checks, which must be satisfied for this
+# VM to be allowed to run on this host's processor type:
+#cpuid_check=[ '1:ecx=xxxxxxxxxxxxxxxxxxxxxxxxxx1xxxxx' ]
+# - Host must have VMX feature flag set
+#
+# The format is similar to the above for 'cpuid':
+# '1' -> the bit must be '1'
+# '0' -> the bit must be '0'
+# 'x' -> we don't care (do not check)
+# 's' -> the bit must be the same as on the host that started this VM
+
+
+#-----------------------------------------------------------------------------
+# Configure PVSCSI devices:
+#
+#vscsi=[ 'PDEV, VDEV' ]
+#
+# PDEV gives physical SCSI device to be attached to specified guest
+# domain by one of the following identifier format.
+# - XX:XX:XX:XX (4-tuples with decimal notation which shows
+# "host:channel:target:lun")
+# - /dev/sdxx or sdx
+# - /dev/stxx or stx
+# - /dev/sgxx or sgx
+# - result of 'scsi_id -gu -s'.
+# ex. # scsi_id -gu -s /block/sdb
+# 36000b5d0006a0000006a0257004c0000
+#
+# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as
+# which the specified guest domain recognize.
+#
+
+#vscsi = [ '/dev/sdx, 0:0:0:0' ]
diff --git a/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.pv-grub b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.pv-grub
new file mode 100644
index 00000000..1b687151
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample.pv-grub
@@ -0,0 +1,186 @@
+# -*- mode: python; -*-
+#============================================================================
+# Python configuration setup for 'xm create'.
+# This script sets the parameters used when a domain is created using 'xm create'.
+# You use a separate script for each domain you want to create, or
+# you can set the parameters for the domain on the xm command line.
+#============================================================================
+
+#----------------------------------------------------------------------------
+# PV GRUB image file.
+kernel = "/usr/lib/xen/boot/pv-grub.gz"
+
+# Optional provided menu.lst.
+#ramdisk = "/boot/guests/menu.lst"
+
+# Sets path to menu.lst
+extra = "(hd0,0)/boot/grub/menu.lst"
+# can be a TFTP-served path (DHCP will automatically be run)
+# extra = "(nd)/netboot/menu.lst"
+# can be configured automatically by GRUB's DHCP option 150 (see grub manual)
+# extra = ""
+
+# Initial memory allocation (in megabytes) for the new domain.
+#
+# WARNING: Creating a domain with insufficient memory may cause out of
+# memory errors. The domain needs enough memory to boot kernel
+# and modules. Allocating less than 32MBs is not recommended.
+memory = 128
+
+# A name for your domain. All domains must have different names.
+name = "ExampleDomain"
+
+# 128-bit UUID for the domain. The default behavior is to generate a new UUID
+# on each call to 'xm create'.
+#uuid = "06ed00fe-1162-4fc4-b5d8-11993ee4a8b9"
+
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # all vcpus run on cpus 0,2,3,5
+#cpus = ["2", "3"] # VCPU0 runs on CPU2, VCPU1 runs on CPU3
+
+# Number of Virtual CPUS to use, default is 1
+#vcpus = 1
+
+#----------------------------------------------------------------------------
+# Define network interfaces.
+
+# By default, no network interfaces are configured. You may have one created
+# with sensible defaults using an empty vif clause:
+#
+# vif = [ '' ]
+#
+# or optionally override backend, bridge, ip, mac, script, type, or vifname:
+#
+# vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0' ]
+#
+# or more than one interface may be configured:
+#
+# vif = [ '', 'bridge=xenbr1' ]
+
+vif = [ '' ]
+
+#----------------------------------------------------------------------------
+# Define the disk devices you want the domain to have access to, and
+# what you want them accessible as.
+# Each disk entry is of the form phy:UNAME,DEV,MODE
+# where UNAME is the device, DEV is the device name the domain will see,
+# and MODE is r for read-only, w for read-write.
+
+disk = [ 'phy:hda1,hda1,w' ]
+
+#----------------------------------------------------------------------------
+# Define frame buffer device.
+#
+# By default, no frame buffer device is configured.
+#
+# To create one using the SDL backend and sensible defaults:
+#
+# vfb = [ 'sdl=1' ]
+#
+# This uses environment variables XAUTHORITY and DISPLAY. You
+# can override that:
+#
+# vfb = [ 'sdl=1,xauthority=/home/bozo/.Xauthority,display=:1' ]
+#
+# To create one using the VNC backend and sensible defaults:
+#
+# vfb = [ 'vnc=1' ]
+#
+# The backend listens on 127.0.0.1 port 5900+N by default, where N is
+# the domain ID. You can override both address and N:
+#
+# vfb = [ 'vnc=1,vnclisten=127.0.0.1,vncdisplay=1' ]
+#
+# Or you can bind the first unused port above 5900:
+#
+# vfb = [ 'vnc=1,vnclisten=0.0.0.0,vncunused=1' ]
+#
+# You can override the password:
+#
+# vfb = [ 'vnc=1,vncpasswd=MYPASSWD' ]
+#
+# Empty password disables authentication. Defaults to the vncpasswd
+# configured in xend-config.sxp.
+
+#----------------------------------------------------------------------------
+# Define to which TPM instance the user domain should communicate.
+# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM'
+# where INSTANCE indicates the instance number of the TPM the VM
+# should be talking to and DOM provides the domain where the backend
+# is located.
+# Note that no two virtual machines should try to connect to the same
+# TPM instance. The handling of all TPM instances does require
+# some management effort in so far that VM configration files (and thus
+# a VM) should be associated with a TPM instance throughout the lifetime
+# of the VM / VM configuration file. The instance number must be
+# greater or equal to 1.
+#vtpm = [ 'instance=1,backend=0' ]
+
+#----------------------------------------------------------------------------
+# Configure the behaviour when a domain exits. There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash. For each of these you
+# may specify:
+#
+# "destroy", meaning that the domain is cleaned up as normal;
+# "restart", meaning that a new domain is started in place of the old
+# one;
+# "preserve", meaning that no clean-up is done until the domain is
+# manually destroyed (using xm destroy, for example); or
+# "rename-restart", meaning that the old domain is not cleaned up, but is
+# renamed and a new domain started in its place.
+#
+# In the event a domain stops due to a crash, you have the additional options:
+#
+# "coredump-destroy", meaning dump the crashed domain's core and then destroy;
+# "coredump-restart', meaning dump the crashed domain's core and the restart.
+#
+# The default is
+#
+# on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# For backwards compatibility we also support the deprecated option restart
+#
+# restart = 'onreboot' means on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'destroy'
+#
+# restart = 'always' means on_poweroff = 'restart'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# restart = 'never' means on_poweroff = 'destroy'
+# on_reboot = 'destroy'
+# on_crash = 'destroy'
+
+#on_poweroff = 'destroy'
+#on_reboot = 'restart'
+#on_crash = 'restart'
+
+#-----------------------------------------------------------------------------
+# Configure PVSCSI devices:
+#
+#vscsi=[ 'PDEV, VDEV' ]
+#
+# PDEV gives physical SCSI device to be attached to specified guest
+# domain by one of the following identifier format.
+# - XX:XX:XX:XX (4-tuples with decimal notation which shows
+# "host:channel:target:lun")
+# - /dev/sdxx or sdx
+# - /dev/stxx or stx
+# - /dev/sgxx or sgx
+# - result of 'scsi_id -gu -s'.
+# ex. # scsi_id -gu -s /block/sdb
+# 36000b5d0006a0000006a0257004c0000
+#
+# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as
+# which the specified guest domain recognize.
+#
+
+#vscsi = [ '/dev/sdx, 0:0:0:0' ]
+
+#============================================================================
+
diff --git a/os-plugins/plugins/xen/files/xen.examples/examples/xmexample1 b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample1
new file mode 100644
index 00000000..08167bdb
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample1
@@ -0,0 +1,213 @@
+# -*- mode: python; -*-
+#============================================================================
+# Python configuration setup for 'xm create'.
+# This script sets the parameters used when a domain is created using 'xm create'.
+# You use a separate script for each domain you want to create, or
+# you can set the parameters for the domain on the xm command line.
+#============================================================================
+
+#----------------------------------------------------------------------------
+# Kernel image file and (optional) ramdisk (initrd).
+kernel = "/boot/vmlinuz-xen"
+ramdisk = "/boot/initrd-xen"
+
+# Or use domUloader instead of kernel/ramdisk to get kernel from domU FS
+#bootloader = "/usr/lib/xen/boot/domUloader.py"
+#bootentry = "hda2:/vmlinuz-xen,/initrd-xen"
+
+# The domain build function. Default is 'linux'.
+#builder='linux'
+
+# Initial memory allocation (in megabytes) for the new domain.
+#
+# WARNING: Creating a domain with insufficient memory may cause out of
+# memory errors. The domain needs enough memory to boot kernel
+# and modules. Allocating less than 32MBs is not recommended.
+memory = 64
+
+# A name for your domain. All domains must have different names.
+name = "ExampleDomain"
+
+# 128-bit UUID for the domain. The default behavior is to generate a new UUID
+# on each call to 'xm create'.
+#uuid = "06ed00fe-1162-4fc4-b5d8-11993ee4a8b9"
+
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # all vcpus run on cpus 0,2,3,5
+#cpus = ["2", "3"] # VCPU0 runs on CPU2, VCPU1 runs on CPU3
+
+# Number of Virtual CPUS to use, default is 1
+#vcpus = 1
+
+#----------------------------------------------------------------------------
+# Define network interfaces.
+
+# By default, no network interfaces are configured. You may have one created
+# with sensible defaults using an empty vif clause:
+#
+# vif = [ '' ]
+#
+# or optionally override backend, bridge, ip, mac, script, type, or vifname:
+#
+# vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0' ]
+#
+# or more than one interface may be configured:
+#
+# vif = [ '', 'bridge=xenbr1' ]
+
+vif = [ '' ]
+
+#----------------------------------------------------------------------------
+# Define the disk devices you want the domain to have access to, and
+# what you want them accessible as.
+# Each disk entry is of the form phy:UNAME,DEV,MODE
+# where UNAME is the device, DEV is the device name the domain will see,
+# and MODE is r for read-only, w for read-write.
+
+disk = [ 'phy:hda1,hda1,w' ]
+
+#----------------------------------------------------------------------------
+# Define frame buffer device.
+#
+# By default, no frame buffer device is configured.
+#
+# To create one using the SDL backend and sensible defaults:
+#
+# vfb = [ 'sdl=1' ]
+#
+# This uses environment variables XAUTHORITY and DISPLAY. You
+# can override that:
+#
+# vfb = [ 'sdl=1,xauthority=/home/bozo/.Xauthority,display=:1' ]
+#
+# To create one using the VNC backend and sensible defaults:
+#
+# vfb = [ 'vnc=1' ]
+#
+# The backend listens on 127.0.0.1 port 5900+N by default, where N is
+# the domain ID. You can override both address and N:
+#
+# vfb = [ 'vnc=1,vnclisten=127.0.0.1,vncdisplay=1' ]
+#
+# Or you can bind the first unused port above 5900:
+#
+# vfb = [ 'vnc=1,vnclisten=0.0.0.0,vncunused=1' ]
+#
+# You can override the password:
+#
+# vfb = [ 'vnc=1,vncpasswd=MYPASSWD' ]
+#
+# Empty password disables authentication. Defaults to the vncpasswd
+# configured in xend-config.sxp.
+
+#----------------------------------------------------------------------------
+# Define to which TPM instance the user domain should communicate.
+# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM'
+# where INSTANCE indicates the instance number of the TPM the VM
+# should be talking to and DOM provides the domain where the backend
+# is located.
+# Note that no two virtual machines should try to connect to the same
+# TPM instance. The handling of all TPM instances does require
+# some management effort in so far that VM configration files (and thus
+# a VM) should be associated with a TPM instance throughout the lifetime
+# of the VM / VM configuration file. The instance number must be
+# greater or equal to 1.
+#vtpm = [ 'instance=1,backend=0' ]
+
+#----------------------------------------------------------------------------
+# Set the kernel command line for the new domain.
+# You only need to define the IP parameters and hostname if the domain's
+# IP config doesn't, e.g. in ifcfg-eth0 or via DHCP.
+# You can use 'extra' to set the runlevel and custom environment
+# variables used by custom rc scripts (e.g. VMID=, usr= ).
+
+# Set if you want dhcp to allocate the IP address.
+#dhcp="dhcp"
+# Set netmask.
+#netmask=
+# Set default gateway.
+#gateway=
+# Set the hostname.
+#hostname= "vm%d" % vmid
+
+# Set root device.
+root = "/dev/hda1"
+
+# Root device for nfs.
+#root = "/dev/nfs"
+# The nfs server.
+#nfs_server = '192.0.2.1'
+# Root directory on the nfs server.
+#nfs_root = '/full/path/to/root/directory'
+
+# Extra arguments to pass to the kernel.
+extra = ""
+
+#----------------------------------------------------------------------------
+# Configure the behaviour when a domain exits. There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash. For each of these you
+# may specify:
+#
+# "destroy", meaning that the domain is cleaned up as normal;
+# "restart", meaning that a new domain is started in place of the old
+# one;
+# "preserve", meaning that no clean-up is done until the domain is
+# manually destroyed (using xm destroy, for example); or
+# "rename-restart", meaning that the old domain is not cleaned up, but is
+# renamed and a new domain started in its place.
+#
+# In the event a domain stops due to a crash, you have the additional options:
+#
+# "coredump-destroy", meaning dump the crashed domain's core and then destroy;
+# "coredump-restart', meaning dump the crashed domain's core and the restart.
+#
+# The default is
+#
+# on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# For backwards compatibility we also support the deprecated option restart
+#
+# restart = 'onreboot' means on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'destroy'
+#
+# restart = 'always' means on_poweroff = 'restart'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# restart = 'never' means on_poweroff = 'destroy'
+# on_reboot = 'destroy'
+# on_crash = 'destroy'
+
+#on_poweroff = 'destroy'
+#on_reboot = 'restart'
+#on_crash = 'restart'
+
+#-----------------------------------------------------------------------------
+# Configure PVSCSI devices:
+#
+#vscsi=[ 'PDEV, VDEV' ]
+#
+# PDEV gives physical SCSI device to be attached to specified guest
+# domain by one of the following identifier format.
+# - XX:XX:XX:XX (4-tuples with decimal notation which shows
+# "host:channel:target:lun")
+# - /dev/sdxx or sdx
+# - /dev/stxx or stx
+# - /dev/sgxx or sgx
+# - result of 'scsi_id -gu -s'.
+# ex. # scsi_id -gu -s /block/sdb
+# 36000b5d0006a0000006a0257004c0000
+#
+# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as
+# which the specified guest domain recognize.
+#
+
+#vscsi = [ '/dev/sdx, 0:0:0:0' ]
+
+#============================================================================
+
diff --git a/os-plugins/plugins/xen/files/xen.examples/examples/xmexample2 b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample2
new file mode 100644
index 00000000..189687a8
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample2
@@ -0,0 +1,248 @@
+# -*- mode: python; -*-
+#============================================================================
+# Example Python setup script for 'xm create'.
+# This script sets the parameters used when a domain is created using 'xm create'.
+#
+# This is a relatively advanced script that uses a parameter, vmid, to control
+# the settings. So this script can be used to start a set of domains by
+# setting the vmid parameter on the 'xm create' command line. For example:
+#
+# xm create vmid=1
+# xm create vmid=2
+# xm create vmid=3
+#
+# The vmid is purely a script variable, and has no effect on the the domain
+# id assigned to the new domain.
+#============================================================================
+
+# Define script variables here.
+# xm_vars is defined automatically, use xm_vars.var() to define a variable.
+
+# This function checks that 'vmid' has been given a valid value.
+# It is called automatically by 'xm create'.
+def vmid_check(var, val):
+ val = int(val)
+ if val <= 0:
+ raise ValueError
+ return val
+
+# Define the 'vmid' variable so that 'xm create' knows about it.
+xm_vars.var('vmid',
+ use="Virtual machine id. Integer greater than 0.",
+ check=vmid_check)
+
+# Check the defined variables have valid values..
+xm_vars.check()
+
+#----------------------------------------------------------------------------
+# Kernel image file and (optional) ramdisk (initrd).
+kernel = "/boot/vmlinuz-xen"
+ramdisk = "/boot/initrd-xen"
+
+# Or use domUloader instead of kernel/ramdisk to get kernel from domU FS
+#bootloader = "/usr/lib/xen/boot/domUloader.py"
+#bootentry = "hda2:/vmlinuz-xen,/initrd-xen"
+
+# The domain build function. Default is 'linux'.
+#builder='linux'
+
+# Initial memory allocation (in megabytes) for the new domain.
+#
+# WARNING: Creating a domain with insufficient memory may cause out of
+# memory errors. The domain needs enough memory to boot kernel
+# and modules. Allocating less than 32MBs is not recommended.
+memory = 64
+
+# A name for the new domain. All domains have to have different names,
+# so we use the vmid to create a name.
+name = "VM%d" % vmid
+
+# 128-bit UUID for the domain. The default behavior is to generate a new UUID
+# on each call to 'xm create'.
+#uuid = "06ed00fe-1162-4fc4-b5d8-11993ee4a8b9"
+
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # all vcpus run on cpus 0,2,3,5
+#cpus = ["2", "3"] # VCPU0 runs on CPU2, VCPU1 runs on CPU3
+#cpus = "%s" % vmid # set based on vmid (mod number of CPUs)
+
+# Number of Virtual CPUS to use, default is 1
+#vcpus = 1
+vcpus = 4 # make your domain a 4-way
+
+#----------------------------------------------------------------------------
+# Define network interfaces.
+
+# By default, no network interfaces are configured. You may have one created
+# with sensible defaults using an empty vif clause:
+#
+# vif = [ '' ]
+#
+# or optionally override backend, bridge, ip, mac, script, type, or vifname:
+#
+# vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0' ]
+#
+# or more than one interface may be configured:
+#
+# vif = [ '', 'bridge=xenbr1' ]
+
+vif = [ '' ]
+
+#----------------------------------------------------------------------------
+# Define the disk devices you want the domain to have access to, and
+# what you want them accessible as.
+# Each disk entry is of the form phy:UNAME,DEV,MODE
+# where UNAME is the device, DEV is the device name the domain will see,
+# and MODE is r for read-only, w for read-write.
+
+# This makes the disk device depend on the vmid - assuming
+# that devices sda7, sda8 etc. exist. The device is exported
+# to all domains as sda1.
+# All domains get sda6 read-only (to use for /usr, see below).
+disk = [ 'phy:sda%d,sda1,w' % (7+vmid),
+ 'phy:sda6,sda6,r' ]
+
+#----------------------------------------------------------------------------
+# Define frame buffer device.
+#
+# By default, no frame buffer device is configured.
+#
+# To create one using the SDL backend and sensible defaults:
+#
+# vfb = [ 'sdl=1' ]
+#
+# This uses environment variables XAUTHORITY and DISPLAY. You
+# can override that:
+#
+# vfb = [ 'sdl=1,xauthority=/home/bozo/.Xauthority,display=:1' ]
+#
+# To create one using the VNC backend and sensible defaults:
+#
+# vfb = [ 'vnc=1' ]
+#
+# The backend listens on 127.0.0.1 port 5900+N by default, where N is
+# the domain ID. You can override both address and N:
+#
+# vfb = [ 'vnc=1,vnclisten=127.0.0.1,vncdisplay=%d' % vmid ]
+#
+# Or you can bind the first unused port above 5900:
+#
+# vfb = [ 'vnc=1,vnclisten=0.0.0.0,vncunused=1' ]
+#
+# You can override the password:
+#
+# vfb = [ 'vnc=1,vncpasswd=MYPASSWD' ]
+#
+# Empty password disables authentication. Defaults to the vncpasswd
+# configured in xend-config.sxp.
+
+#----------------------------------------------------------------------------
+# Define to which TPM instance the user domain should communicate.
+# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM'
+# where INSTANCE indicates the instance number of the TPM the VM
+# should be talking to and DOM provides the domain where the backend
+# is located.
+# Note that no two virtual machines should try to connect to the same
+# TPM instance. The handling of all TPM instances does require
+# some management effort in so far that VM configration files (and thus
+# a VM) should be associated with a TPM instance throughout the lifetime
+# of the VM / VM configuration file. The instance number must be
+# greater or equal to 1.
+#vtpm = ['instance=%d,backend=0' % (vmid) ]
+
+#----------------------------------------------------------------------------
+# Set the kernel command line for the new domain.
+# You only need to define the IP parameters and hostname if the domain's
+# IP config doesn't, e.g. in ifcfg-eth0 or via DHCP.
+# You can use 'extra' to set the runlevel and custom environment
+# variables used by custom rc scripts (e.g. VMID=, usr= ).
+
+# Set if you want dhcp to allocate the IP address.
+#dhcp="dhcp"
+# Set netmask.
+#netmask=
+# Set default gateway.
+#gateway=
+# Set the hostname.
+#hostname= "vm%d" % vmid
+
+# Set root device.
+root = "/dev/sda1"
+
+# Root device for nfs.
+#root = "/dev/nfs"
+# The nfs server.
+#nfs_server = '192.0.2.1'
+# Root directory on the nfs server.
+#nfs_root = '/full/path/to/root/directory'
+
+# Sets the device for /usr.
+extra = "VMID=%d usr=/dev/sda6" % vmid
+
+#----------------------------------------------------------------------------
+# Configure the behaviour when a domain exits. There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash. For each of these you
+# may specify:
+#
+# "destroy", meaning that the domain is cleaned up as normal;
+# "restart", meaning that a new domain is started in place of the old
+# one;
+# "preserve", meaning that no clean-up is done until the domain is
+# manually destroyed (using xm destroy, for example); or
+# "rename-restart", meaning that the old domain is not cleaned up, but is
+# renamed and a new domain started in its place.
+#
+# In the event a domain stops due to a crash, you have the additional options:
+#
+# "coredump-destroy", meaning dump the crashed domain's core and then destroy;
+# "coredump-restart', meaning dump the crashed domain's core and the restart.
+#
+# The default is
+#
+# on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# For backwards compatibility we also support the deprecated option restart
+#
+# restart = 'onreboot' means on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'destroy'
+#
+# restart = 'always' means on_poweroff = 'restart'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# restart = 'never' means on_poweroff = 'destroy'
+# on_reboot = 'destroy'
+# on_crash = 'destroy'
+
+#on_poweroff = 'destroy'
+#on_reboot = 'restart'
+#on_crash = 'restart'
+
+#-----------------------------------------------------------------------------
+# Configure PVSCSI devices:
+#
+#vscsi=[ 'PDEV, VDEV' ]
+#
+# PDEV gives physical SCSI device to be attached to specified guest
+# domain by one of the following identifier format.
+# - XX:XX:XX:XX (4-tuples with decimal notation which shows
+# "host:channel:target:lun")
+# - /dev/sdxx or sdx
+# - /dev/stxx or stx
+# - /dev/sgxx or sgx
+# - result of 'scsi_id -gu -s'.
+# ex. # scsi_id -gu -s /block/sdb
+# 36000b5d0006a0000006a0257004c0000
+#
+# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as
+# which the specified guest domain recognize.
+#
+
+#vscsi = [ '/dev/sdx, 0:0:0:0' ]
+
+#============================================================================
diff --git a/os-plugins/plugins/xen/files/xen.examples/examples/xmexample3 b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample3
new file mode 100644
index 00000000..e82424e7
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/examples/xmexample3
@@ -0,0 +1,234 @@
+# -*- mode: python; -*-
+#============================================================================
+# Example Python setup script for 'xm create'.
+# This script sets the parameters used when a domain is created using 'xm create'.
+#
+# This is a relatively advanced script that uses a parameter, vmid, to control
+# the settings. So this script can be used to start a set of domains by
+# setting the vmid parameter on the 'xm create' command line. For example:
+#
+# xm create vmid=1
+# xm create vmid=2
+# xm create vmid=3
+#
+# The vmid is purely a script variable, and has no effect on the the domain
+# id assigned to the new domain.
+#============================================================================
+
+# Define script variables here.
+# xm_vars is defined automatically, use xm_vars.var() to define a variable.
+
+# This function checks that 'vmid' has been given a valid value.
+# It is called automatically by 'xm create'.
+def vmid_check(var, val):
+ val = int(val)
+ if val <= 0:
+ raise ValueError
+ return val
+
+# Define the 'vmid' variable so that 'xm create' knows about it.
+xm_vars.var('vmid',
+ use="Virtual machine id. Integer greater than 0.",
+ check=vmid_check)
+
+# Check the defined variables have valid values..
+xm_vars.check()
+
+#----------------------------------------------------------------------------
+# Kernel image file and (optional) ramdisk (initrd).
+kernel = "/boot/vmlinuz-xen"
+ramdisk = "/boot/initrd-xen"
+
+# Or use domUloader instead of kernel/ramdisk to get kernel from domU FS
+#bootloader = "/usr/lib/xen/boot/domUloader.py"
+#bootentry = "hda2:/vmlinuz-xen,/initrd-xen"
+
+# The domain build function. Default is 'linux'.
+#builder='linux'
+
+# Initial memory allocation (in megabytes) for the new domain.
+#
+# WARNING: Creating a domain with insufficient memory may cause out of
+# memory errors. The domain needs enough memory to boot kernel
+# and modules. Allocating less than 32MBs is not recommended.
+memory = 64
+
+# A name for the new domain. All domains have to have different names,
+# so we use the vmid to create a name.
+name = "VM%d" % vmid
+
+# 128-bit UUID for the domain. The default behavior is to generate a new UUID
+# on each call to 'xm create'.
+#uuid = "06ed00fe-1162-4fc4-b5d8-11993ee4a8b9"
+
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # all vcpus run on cpus 0,2,3,5
+#cpus = ["2", "3"] # VCPU0 runs on CPU2, VCPU1 runs on CPU3
+cpus = "%s" % vmid # set based on vmid (mod number of CPUs)
+
+#----------------------------------------------------------------------------
+# Define network interfaces.
+
+# Optionally define mac and/or bridge for the network interfaces.
+# Random MACs are assigned if not given.
+
+vif = [ 'ip=192.168.%d.1/24' % (vmid)]
+
+#----------------------------------------------------------------------------
+# Define the disk devices you want the domain to have access to, and
+# what you want them accessible as.
+# Each disk entry is of the form phy:UNAME,DEV,MODE
+# where UNAME is the device, DEV is the device name the domain will see,
+# and MODE is r for read-only, w for read-write.
+
+# This makes the disk device depend on the vmid - assuming
+# tHat devices sda7, sda8 etc. exist. The device is exported
+# to all domains as sda1.
+# All domains get sda6 read-only (to use for /usr, see below).
+disk = [ 'phy:hda%d,hda1,w' % (vmid)]
+
+#----------------------------------------------------------------------------
+# Define frame buffer device.
+#
+# By default, no frame buffer device is configured.
+#
+# To create one using the SDL backend and sensible defaults:
+#
+# vfb = [ 'sdl=1' ]
+#
+# This uses environment variables XAUTHORITY and DISPLAY. You
+# can override that:
+#
+# vfb = [ 'sdl=1,xauthority=/home/bozo/.Xauthority,display=:1' ]
+#
+# To create one using the VNC backend and sensible defaults:
+#
+# vfb = [ 'vnc=1' ]
+#
+# The backend listens on 127.0.0.1 port 5900+N by default, where N is
+# the domain ID. You can override both address and N:
+#
+# vfb = [ 'vnc=1,vnclisten=127.0.0.1,vncdisplay=%d' % vmid ]
+#
+# Or you can bind the first unused port above 5900:
+#
+# vfb = [ 'vnc=1,vnclisten=0.0.0.0,vncunused=1' ]
+#
+# You can override the password:
+#
+# vfb = [ 'vnc=1,vncpasswd=MYPASSWD' ]
+#
+# Empty password disables authentication. Defaults to the vncpasswd
+# configured in xend-config.sxp.
+
+#----------------------------------------------------------------------------
+# Define to which TPM instance the user domain should communicate.
+# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM'
+# where INSTANCE indicates the instance number of the TPM the VM
+# should be talking to and DOM provides the domain where the backend
+# is located.
+# Note that no two virtual machines should try to connect to the same
+# TPM instance. The handling of all TPM instances does require
+# some management effort in so far that VM configration files (and thus
+# a VM) should be associated with a TPM instance throughout the lifetime
+# of the VM / VM configuration file. The instance number must be
+# greater or equal to 1.
+#vtpm = ['instance=%d,backend=0' % (vmid) ]
+
+#----------------------------------------------------------------------------
+# Set the kernel command line for the new domain.
+# You only need to define the IP parameters and hostname if the domain's
+# IP config doesn't, e.g. in ifcfg-eth0 or via DHCP.
+# You can use 'extra' to set the runlevel and custom environment
+# variables used by custom rc scripts (e.g. VMID=, usr= ).
+
+# Set if you want dhcp to allocate the IP address.
+dhcp="off"
+ip="192.168.%d.2" % (vmid)
+# Set netmask.
+netmask="255.255.255.0"
+# Set default gateway.
+gateway="192.168.%d.1" % (vmid)
+# Set the hostname.
+hostname= "domain-%d.xeno" % vmid
+
+# Set root device.
+root = "/dev/hda1 ro"
+
+# Root device for nfs.
+#root = "/dev/nfs"
+# The nfs server.
+#nfs_server = "10.212.4.103"
+# Root directory on the nfs server.
+#nfs_root = "/path/to/root/filesystem"
+
+# Sets runlevel 4 and the device for /usr.
+extra = "4 VMID=%d" % vmid
+
+#----------------------------------------------------------------------------
+# Configure the behaviour when a domain exits. There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash. For each of these you
+# may specify:
+#
+# "destroy", meaning that the domain is cleaned up as normal;
+# "restart", meaning that a new domain is started in place of the old
+# one;
+# "preserve", meaning that no clean-up is done until the domain is
+# manually destroyed (using xm destroy, for example); or
+# "rename-restart", meaning that the old domain is not cleaned up, but is
+# renamed and a new domain started in its place.
+#
+# In the event a domain stops due to a crash, you have the additional options:
+#
+# "coredump-destroy", meaning dump the crashed domain's core and then destroy;
+# "coredump-restart', meaning dump the crashed domain's core and the restart.
+#
+# The default is
+#
+# on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# For backwards compatibility we also support the deprecated option restart
+#
+# restart = 'onreboot' means on_poweroff = 'destroy'
+# on_reboot = 'restart'
+# on_crash = 'destroy'
+#
+# restart = 'always' means on_poweroff = 'restart'
+# on_reboot = 'restart'
+# on_crash = 'restart'
+#
+# restart = 'never' means on_poweroff = 'destroy'
+# on_reboot = 'destroy'
+# on_crash = 'destroy'
+
+#on_poweroff = 'destroy'
+#on_reboot = 'restart'
+#on_crash = 'restart'
+
+#-----------------------------------------------------------------------------
+# Configure PVSCSI devices:
+#
+#vscsi=[ 'PDEV, VDEV' ]
+#
+# PDEV gives physical SCSI device to be attached to specified guest
+# domain by one of the following identifier format.
+# - XX:XX:XX:XX (4-tuples with decimal notation which shows
+# "host:channel:target:lun")
+# - /dev/sdxx or sdx
+# - /dev/stxx or stx
+# - /dev/sgxx or sgx
+# - result of 'scsi_id -gu -s'.
+# ex. # scsi_id -gu -s /block/sdb
+# 36000b5d0006a0000006a0257004c0000
+#
+# VDEV gives virtual SCSI device by 4-tuples (XX:XX:XX:XX) as
+# which the specified guest domain recognize.
+#
+
+#vscsi = [ '/dev/sdx, 0:0:0:0' ]
+
+#============================================================================
diff --git a/os-plugins/plugins/xen/files/xen.examples/images b/os-plugins/plugins/xen/files/xen.examples/images
new file mode 120000
index 00000000..0fb07d14
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/images
@@ -0,0 +1 @@
+/var/lib/xen/images \ No newline at end of file
diff --git a/os-plugins/plugins/xen/files/xen.examples/qemu-ifup b/os-plugins/plugins/xen/files/xen.examples/qemu-ifup
new file mode 100755
index 00000000..ad46c9f9
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/qemu-ifup
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+echo 'config qemu network with xen bridge for ' $*
+
+# If bridge is not specified, try device with default route.
+bridge=$2
+if [ -z "$bridge" ]; then
+ bridge=$(ip route list | awk '/^default / { print $NF }')
+fi
+
+# Exit if $bridge is not a bridge. Exit with 0 status
+# so qemu-dm process is not terminated. No networking in
+# vm is bad but not catastrophic. The vm could still run
+# cpu and disk IO workloads.
+# Include an useful error message in qemu-dm log file.
+if [ ! -e "/sys/class/net/${bridge}/bridge" ]
+then
+ echo "WARNING! ${bridge} is not a bridge. qemu-ifup exiting. VM may not have a functioning networking stack."
+ exit 0
+fi
+
+ifconfig $1 0.0.0.0 up
+brctl addif $bridge $1 || true
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/blktap b/os-plugins/plugins/xen/files/xen.examples/scripts/blktap
new file mode 100755
index 00000000..01a0f6c6
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/blktap
@@ -0,0 +1,93 @@
+#!/bin/bash
+
+# Copyright (c) 2005, XenSource Ltd.
+
+dir=$(dirname "$0")
+. "$dir/xen-hotplug-common.sh"
+. "$dir/block-common.sh"
+
+findCommand "$@"
+
+##
+# check_blktap_sharing file mode
+#
+# Perform the sharing check for the given blktap and mode.
+#
+check_blktap_sharing()
+{
+ local file="$1"
+ local mode="$2"
+
+ local base_path="$XENBUS_BASE_PATH/$XENBUS_TYPE"
+ for dom in $(xenstore-list "$base_path")
+ do
+ for dev in $(xenstore-list "$base_path/$dom")
+ do
+ params=$(xenstore_read "$base_path/$dom/$dev/params" | cut -d: -f2)
+ if [ "$file" = "$params" ]
+ then
+
+ if [ "$mode" = 'w' ]
+ then
+ if ! same_vm "$dom"
+ then
+ echo 'guest'
+ return
+ fi
+ else
+ local m=$(xenstore_read "$base_path/$dom/$dev/mode")
+ m=$(canonicalise_mode "$m")
+
+ if [ "$m" = 'w' ]
+ then
+ if ! same_vm "$dom"
+ then
+ echo 'guest'
+ return
+ fi
+ fi
+ fi
+ fi
+ done
+ done
+
+ echo 'ok'
+}
+
+
+t=$(xenstore_read_default "$XENBUS_PATH/type" 'MISSING')
+if [ -n "$t" ]
+then
+ p=$(xenstore_read "$XENBUS_PATH/params")
+ # if we have a ':', chew from head including :
+ if echo $p | grep -q \:
+ then
+ p=${p#*:}
+ fi
+fi
+# some versions of readlink cannot be passed a regular file
+if [ -L "$p" ]; then
+ file=$(readlink -f "$p") || fatal "$p link does not exist."
+else
+ file="$p"
+fi
+
+if [ "$command" = 'add' ]
+then
+ [ -e "$file" ] || { fatal $file does not exist; }
+
+ FRONTEND_ID=$(xenstore_read "$XENBUS_PATH/frontend-id")
+ FRONTEND_UUID=$(xenstore_read "/local/domain/$FRONTEND_ID/vm")
+ mode=$(xenstore_read "$XENBUS_PATH/mode")
+ mode=$(canonicalise_mode "$mode")
+
+ if [ "$mode" != '!' ]
+ then
+ result=$(check_blktap_sharing "$file" "$mode")
+ [ "$result" = 'ok' ] || ebusy "$file already in use by other domain"
+ fi
+
+ success
+fi
+
+exit 0
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/block b/os-plugins/plugins/xen/files/xen.examples/scripts/block
new file mode 100755
index 00000000..cf579ed4
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/block
@@ -0,0 +1,398 @@
+#!/bin/bash
+
+dir=$(dirname "$0")
+. "$dir/block-common.sh"
+
+expand_dev() {
+ local dev
+ case $1 in
+ /*)
+ dev=$1
+ ;;
+ *)
+ dev=/dev/$1
+ ;;
+ esac
+ echo -n $dev
+}
+
+
+##
+# check_sharing device mode
+#
+# Check whether the device requested is already in use. To use the device in
+# read-only mode, it may be in use in read-only mode, but may not be in use in
+# read-write anywhere at all. To use the device in read-write mode, it must
+# not be in use anywhere at all.
+#
+# Prints one of
+#
+# 'local': the device may not be used because it is mounted in the current
+# (i.e. the privileged domain) in a way incompatible with the
+# requested mode;
+# 'guest': the device may not be used because it already mounted by a guest
+# in a way incompatible with the requested mode; or
+# 'ok': the device may be used.
+#
+check_sharing()
+{
+ local dev="$1"
+ local mode="$2"
+
+ local devmm=$(device_major_minor "$dev")
+ local file
+
+ if [ "$mode" = 'w' ]
+ then
+ toskip="^$"
+ else
+ toskip="^[^ ]* [^ ]* [^ ]* ro[, ]"
+ fi
+
+ for file in $(cat /proc/mounts | grep -v "$toskip" | cut -f 1 -d ' ')
+ do
+ if [ -e "$file" ]
+ then
+ local d=$(device_major_minor "$file")
+
+ if [ "$d" = "$devmm" ]
+ then
+ echo 'local'
+ return
+ fi
+ fi
+ done
+
+ local base_path="$XENBUS_BASE_PATH/$XENBUS_TYPE"
+ for dom in $(xenstore-list "$base_path")
+ do
+ for dev in $(xenstore-list "$base_path/$dom")
+ do
+ d=$(xenstore_read_default "$base_path/$dom/$dev/physical-device" "")
+
+ if [ "$d" = "$devmm" ]
+ then
+ if [ "$mode" = 'w' ]
+ then
+ if ! same_vm $dom
+ then
+ echo 'guest'
+ return
+ fi
+ else
+ local m=$(xenstore_read "$base_path/$dom/$dev/mode")
+ m=$(canonicalise_mode "$m")
+
+ if [ "$m" = 'w' ]
+ then
+ if ! same_vm $dom
+ then
+ echo 'guest'
+ return
+ fi
+ fi
+ fi
+ fi
+ done
+ done
+
+ echo 'ok'
+}
+
+
+##
+# check_device_sharing dev mode
+#
+# Perform the sharing check for the given physical device and mode.
+#
+check_device_sharing()
+{
+ local dev="$1"
+ local mode=$(canonicalise_mode "$2")
+ local result
+
+ if [ "x$mode" = 'x!' ]
+ then
+ return 0
+ fi
+
+ result=$(check_sharing "$dev" "$mode")
+
+ if [ "$result" != 'ok' ]
+ then
+ do_ebusy "Device $dev is mounted " "$mode" "$result"
+ fi
+}
+
+
+##
+# check_device_sharing file dev mode
+#
+# Perform the sharing check for the given file mounted through the given
+# loopback interface, in the given mode.
+#
+check_file_sharing()
+{
+ local file="$1"
+ local dev="$2"
+ local mode="$3"
+
+ result=$(check_sharing "$dev" "$mode")
+
+ if [ "$result" != 'ok' ]
+ then
+ do_ebusy "File $file is loopback-mounted through $dev,
+which is mounted " "$mode" "$result"
+ fi
+}
+
+
+##
+# do_ebusy prefix mode result
+#
+# Helper function for check_device_sharing check_file_sharing, calling ebusy
+# with an error message constructed from the given prefix, mode, and result
+# from a call to check_sharing.
+#
+do_ebusy()
+{
+ local prefix="$1"
+ local mode="$2"
+ local result="$3"
+
+ if [ "$result" = 'guest' ]
+ then
+ dom='a guest '
+ when='now'
+ else
+ dom='the privileged '
+ when='by a guest'
+ fi
+
+ if [ "$mode" = 'w' ]
+ then
+ m1=''
+ m2=''
+ else
+ m1='read-write '
+ m2='read-only '
+ fi
+
+ release_lock "block"
+ ebusy \
+"${prefix}${m1}in ${dom}domain,
+and so cannot be mounted ${m2}${when}."
+}
+
+
+t=$(xenstore_read_default "$XENBUS_PATH/type" 'MISSING')
+
+case "$command" in
+ add)
+ phys=$(xenstore_read_default "$XENBUS_PATH/physical-device" 'MISSING')
+ if [ "$phys" != 'MISSING' ]
+ then
+ # Depending upon the hotplug configuration, it is possible for this
+ # script to be called twice, so just bail.
+ exit 0
+ fi
+
+ if [ -n "$t" ]
+ then
+ p=$(xenstore_read "$XENBUS_PATH/params")
+ mode=$(xenstore_read "$XENBUS_PATH/mode")
+ fi
+ FRONTEND_ID=$(xenstore_read "$XENBUS_PATH/frontend-id")
+ FRONTEND_UUID=$(xenstore_read_default \
+ "/local/domain/$FRONTEND_ID/vm" 'unknown')
+
+ case $t in
+ phy)
+ dev=$(expand_dev $p)
+
+ if [ -L "$dev" ]
+ then
+ dev=$(readlink -f "$dev") || fatal "$dev link does not exist."
+ fi
+ test -e "$dev" || fatal "$dev does not exist."
+ test -b "$dev" || fatal "$dev is not a block device."
+
+ claim_lock "block"
+ check_device_sharing "$dev" "$mode"
+ write_dev "$dev"
+ release_lock "block"
+ exit 0
+ ;;
+
+ file)
+ lo_flags=""
+ [ "${mode/S}" = "$mode" ] || lo_flags="-y"
+ # Canonicalise the file, for sharing check comparison, and the mode
+ # for ease of use here.
+ file=$(readlink -f "$p") || fatal "$p does not exist."
+ test -f "$file" || fatal "$file does not exist."
+ mode=$(canonicalise_mode "$mode")
+ [ "$mode" = "r" ] && lo_flags="$lo_flags -r"
+
+ claim_lock "block"
+
+ if [ "$mode" = 'w' ] && ! stat "$file" -c %A | grep -q w
+ then
+ release_lock "block"
+ ebusy \
+"File $file is read-only, and so I will not
+mount it read-write in a guest domain."
+ fi
+
+ losetup_failure=1
+ for do_losetup in 1 2 3
+ do
+ loopdev=''
+ for dev in /dev/loop*
+ do
+ if [ ! -b "$dev" ]
+ then
+ continue
+ fi
+
+ f=$(losetup "$dev" 2>/dev/null) || f=''
+
+ if [ "$f" ]
+ then
+ # $dev is in use. Check sharing.
+ if [ "x$mode" = 'x!' ]
+ then
+ continue
+ fi
+
+ f=$(echo "$f" | sed -e 's/.*(\(.*\)).*/\1/g')
+
+ # $f is the filename, as read from losetup, but the loopback
+ # driver truncates filenames at 64 characters, so we need to go
+ # trawling through the store if it's longer than that. Truncation
+ # is indicated by an asterisk at the end of the filename.
+ if expr index "$f" '*' >/dev/null
+ then
+ found=""
+ for dom in $(xenstore-list "$XENBUS_BASE_PATH")
+ do
+ for domdev in $(xenstore-list "$XENBUS_BASE_PATH/$dom")
+ do
+ d=$(xenstore_read_default \
+ "$XENBUS_BASE_PATH/$dom/$domdev/node" "")
+ if [ "$d" = "$dev" ]
+ then
+ f=$(xenstore_read "$XENBUS_BASE_PATH/$dom/$domdev/params")
+ found=1
+ break 2
+ fi
+ done
+ done
+
+ if [ ! "$found" ]
+ then
+ # This loopback device is in use by someone else, so skip it.
+ log debug "Loopback sharing check skips device $dev."
+ continue
+ fi
+ fi
+
+ # Canonicalise the filename for the comparison.
+
+ # I have seen this readlink fails because the filename given by
+ # losetup is only the basename. This cannot happen when the loop
+ # device is set up through this script, because file is
+ # canonicalised above, but it may happen when loop devices are set
+ # up some other way. This readlink may also conceivably fail if
+ # the file backing this loop device has been removed.
+
+ # For maximum safety, in the case that $f does not resolve, we
+ # assume that $file and $f are in the same directory.
+
+ # If you create a loopback filesystem, remove it and continue to
+ # run on it, and then create another file with the same name, then
+ # this check will block that -- don't do that.
+
+ # If you create loop devices through some other mechanism, use
+ # relative filenames, and then use the same filename through this
+ # script, then this check will block that -- don't do that either.
+
+ f=$(readlink -f "$f" || echo $(dirname "$file")/$(basename "$f"))
+
+
+ if [ "$f" = "$file" ]
+ then
+ check_file_sharing "$file" "$dev" "$mode"
+ fi
+ else
+ # $dev is not in use, so we'll remember it for use later; we want
+ # to finish the sharing check first.
+
+ if [ "$loopdev" = '' ]
+ then
+ loopdev="$dev"
+ fi
+ fi
+ done
+
+ if [ "$loopdev" = '' ]
+ then
+ release_lock "block"
+ fatal 'Failed to find an unused loop device'
+ fi
+
+ losetup $lo_flags "$loopdev" "$file" && losetup_failure="" && break
+ done
+
+ if [ "$losetup_failure" ]
+ then
+ fatal 'losetup $lo_flags $loopdev $file'
+ fi
+
+ xenstore_write "$XENBUS_PATH/node" "$loopdev"
+ write_dev "$loopdev"
+ release_lock "block"
+ exit 0
+ ;;
+
+ "")
+ claim_lock "block"
+ success
+ release_lock "block"
+ ;;
+ esac
+ ;;
+
+ remove)
+ case $t in
+ phy)
+ exit 0
+ ;;
+
+ file)
+ node=$(xenstore_read "$XENBUS_PATH/node")
+
+ #In case the loopback is temporarily blocked, retry the losetup -d.
+ for i in 1 2 3 4 5
+ do
+ if losetup -d "$node"
+ then
+ exit 0
+ fi
+ sleep 1
+ done
+ log err "losetup -d $node failed."
+ exit 1
+ ;;
+
+ "")
+ exit 0
+ ;;
+ esac
+ ;;
+
+esac
+
+# If we've reached here, $t is neither phy nor file, so fire a helper script.
+[ -x /etc/xen/scripts/block-"$t" ] && \
+ /etc/xen/scripts/block-"$t" "$command" $node
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/block-common.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/block-common.sh
new file mode 100644
index 00000000..efedbf50
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/block-common.sh
@@ -0,0 +1,117 @@
+#
+# Copyright (c) 2005 XenSource Ltd.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+
+dir=$(dirname "$0")
+. "$dir/xen-hotplug-common.sh"
+
+findCommand "$@"
+
+if [ "$command" != "add" ] &&
+ [ "$command" != "remove" ]
+then
+ log err "Invalid command: $command"
+ exit 1
+fi
+
+
+XENBUS_PATH="${XENBUS_PATH:?}"
+
+
+ebusy()
+{
+ xenstore_write "$XENBUS_PATH/hotplug-error" "$*" \
+ "$XENBUS_PATH/hotplug-status" busy
+ log err "$@"
+ exit 1
+}
+
+
+##
+# Print the given device's major and minor numbers, written in hex and
+# separated by a colon.
+device_major_minor()
+{
+ stat -L -c %t:%T "$1"
+}
+
+
+##
+# Write physical-device = MM,mm to the store, where MM and mm are the major
+# and minor numbers of device respectively.
+#
+# @param device The device from which major and minor numbers are read, which
+# will be written into the store.
+#
+write_dev() {
+ local mm
+
+ mm=$(device_major_minor "$1")
+
+ if [ -z $mm ]
+ then
+ fatal "Backend device does not exist"
+ fi
+
+ xenstore_write "$XENBUS_PATH/physical-device" "$mm"
+
+ success
+}
+
+
+##
+# canonicalise_mode mode
+#
+# Takes the given mode, which may be r, w, ro, rw, w!, or rw!, or variations
+# thereof, and canonicalises them to one of
+#
+# 'r': perform checks for a new read-only mount;
+# 'w': perform checks for a read-write mount; or
+# '!': perform no checks at all.
+#
+canonicalise_mode()
+{
+ local mode="$1"
+
+ if ! expr index "$mode" 'w' >/dev/null
+ then
+ echo 'r'
+ elif ! expr index "$mode" '!' >/dev/null
+ then
+ echo 'w'
+ else
+ echo '!'
+ fi
+}
+
+
+same_vm()
+{
+ local otherdom="$1"
+ # Note that othervm can be MISSING here, because Xend will be racing with
+ # the hotplug scripts -- the entries in /local/domain can be removed by
+ # Xend before the hotplug scripts have removed the entry in
+ # /local/domain/0/backend/. In this case, we want to pretend that the
+ # VM is the same as FRONTEND_UUID, because that way the 'sharing' will be
+ # allowed.
+ local othervm=$(xenstore_read_default "/local/domain/$otherdom/vm" \
+ "$FRONTEND_UUID")
+ local target=$(xenstore_read_default "/local/domain/$FRONTEND_ID/target" \
+ "-1")
+ [ "$FRONTEND_UUID" = "$othervm" -o "$target" = "$otherdom" ]
+}
+
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/block-iscsi b/os-plugins/plugins/xen/files/xen.examples/scripts/block-iscsi
new file mode 100755
index 00000000..f473a0a9
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/block-iscsi
@@ -0,0 +1,78 @@
+#!/bin/bash
+
+# Usage: block-iscsi [add tgtname | remove dev]
+#
+# This assumes you're running a correctly configured
+# iscsi target (server) at the other end!
+# Note that we assume that the passwords for discovery (if needed)
+# are in /etc/iscsid.conf
+# and the node session passwords (if required) in the
+# open-iscsi database below /var/lib/open-iscsi/node.db
+#
+# (c) Kurt Garloff <kurt@garloff.de>, 2006-09-04, GNU GPL
+# Contributors: Jim Fehlig <jfehlig@novell.com>
+# Stefan de Konink <skinkie@xs4all.nl>
+
+dir=$(dirname "$0")
+. "$dir/block-common.sh"
+
+# echo "DBG:xen/scripts/block-iscsi $1 $2 XENBUS_PATH=$XENBUS_PATH $par $node"
+
+find_sdev()
+{
+ unset dev
+ for session in /sys/class/iscsi_session/session*; do
+ if [ "$1" = "`cat $session/targetname`" ]; then
+ dev=`basename $session/device/target*/*:0:*/block*/*`
+ return
+ fi
+ done
+}
+
+find_sdev_rev()
+{
+ unset tgt
+ for session in /sys/class/iscsi_session/session*; do
+ dev=`basename $session/device/target*/*:0:*/block*/*`
+ if [ "$dev" = "$1" ]; then
+ tgt=`cat $session/targetname`
+ return
+ fi
+ done
+}
+
+case "$command" in
+ add)
+ # load modules and start iscsid
+ /etc/init.d/open-iscsi status >/dev/null 2>&1 ||
+ { /etc/init.d/open-iscsi start >/dev/null 2>&1; sleep 1; }
+ # list of targets on node
+ /sbin/iscsiadm -m discovery | sed "s/ .*//g" | while read line; do /sbin/iscsiadm -m discovery -t sendtargets -p $line; done >/dev/null
+ par=`xenstore-read $XENBUS_PATH/params` || true
+ TGTID=`echo $par | sed "s/\/\///g"`
+ while read rec uuid; do
+ if [ "$uuid" = "$TGTID" ]; then
+ find_sdev $TGTID
+ if [ -z "$dev" ]; then
+ /sbin/iscsiadm -m node -T $uuid -p $rec --login || exit 2
+ sleep 4
+ find_sdev $TGTID
+ fi
+ xenstore-write $XENBUS_PATH/node /dev/$dev
+ write_dev /dev/$dev
+ exit 0
+ fi
+ done < <(/sbin/iscsiadm -m node)
+ exit 1
+ ;;
+
+ remove)
+ node=`xenstore-read $XENBUS_PATH/node` || true
+ dev=$node; dev=${dev#/dev/}
+ find_sdev_rev $dev
+ if [ -x /sbin/blockdev -a -n "$node" ]; then blockdev --flushbufs "$node"; fi
+ test -z "$tgt" && exit 2
+ /sbin/iscsiadm -m node -T $tgt --logout
+ exit 1
+ ;;
+esac
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/block-nbd b/os-plugins/plugins/xen/files/xen.examples/scripts/block-nbd
new file mode 100755
index 00000000..d4571152
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/block-nbd
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+# Usage: block-nbd [bind server ctl_port |unbind node]
+#
+# The node argument to unbind is the name of the device node we are to
+# unbind.
+#
+# This assumes you're running a correctly configured server at the other end!
+
+dir=$(dirname "$0")
+. "$dir/block-common.sh"
+
+#set -x
+par=`xenstore-read $XENBUS_PATH/params` || true
+#echo $par
+
+case "$command" in
+ add)
+ modprobe nbd
+ for dev in /dev/nbd*; do
+ if nbd-client $par $dev; then
+ xenstore-write $XENBUS_PATH/node $dev
+ write_dev $dev
+ exit 0
+ fi
+ done
+ exit 1
+ ;;
+ remove)
+ node=`xenstore-read $XENBUS_PATH/node` || true
+ nbd-client -d $node
+ exit 0
+ ;;
+esac
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/block-npiv b/os-plugins/plugins/xen/files/xen.examples/scripts/block-npiv
new file mode 100755
index 00000000..19719dab
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/block-npiv
@@ -0,0 +1,77 @@
+#!/bin/bash
+
+# Usage: block-npiv [add npiv | remove dev]
+
+dir=$(dirname "$0")
+. "$dir/block-npiv-common.sh"
+. "$dir/block-common.sh"
+
+#set -x
+#command=$1
+
+case "$command" in
+ add)
+ # Params is one big arg, with fields separated by hyphens:
+ # FABRIC-VPWWPN-VPWWNN-TGTWWPN-LUN#
+ # arg 2 - Fabric Name
+ # arg 3 - VPORT's WWPN
+ # arg 4 - VPORT's WWNN
+ # arg 5 - Target's WWPN
+ # arg 6 - LUN # on Target
+ # no wwn contains a leading 0x - it is a 16 character hex value
+ # You may want to optionally pick a specific adapter ?
+ par=`xenstore-read $XENBUS_PATH/params` || true
+ #par=$2
+ NPIVARGS=$par;
+ LUN=${NPIVARGS##*-*-*-*-}; NPIVARGS=${NPIVARGS%-*}
+ if test $LUN = $NPIVARGS ; then exit 1; fi
+ TGTWWPN=${NPIVARGS##*-*-*-}; NPIVARGS=${NPIVARGS%-*}
+ if test $TGTWWPN = $NPIVARGS ; then exit 1; fi
+ VPORTWWNN=${NPIVARGS##*-*-}; NPIVARGS=${NPIVARGS%-*}
+ if test $VPORTWWNN = $NPIVARGS ; then exit 1; fi
+ VPORTWWPN=${NPIVARGS##*-}; NPIVARGS=${NPIVARGS%-*}
+ if test $VPORTWWPN = $NPIVARGS ; then exit 1; fi
+ FABRICNM=$NPIVARGS
+
+ # Ensure we compare everything using lower-case hex characters
+ TGTWWPN=`echo $TGTWWPN | tr A-Z a-z`
+ VPORTWWPN=`echo $VPORTWWPN | tr A-Z a-z`
+ VPORTWWNN=`echo $VPORTWWNN | tr A-Z a-z`
+ FABRICNM=`echo $FABRICNM | tr A-Z a-z`
+
+ find_vhost $VPORTWWPN
+ if test -z "$vhost" ; then
+ create_vport $FABRICNM $VPORTWWPN $VPORTWWNN
+ if [ $? -ne 0 ] ; then exit 2; fi
+ sleep 8
+ find_vhost $VPORTWWPN
+ if test -z "$vhost" ; then exit 3; fi
+ fi
+ find_sdev $vhost $TGTWWPN $LUN
+ if test -z "$dev"; then
+ echo "- - -" > /sys/class/scsi_host/$vhost/scan
+ sleep 2
+ find_sdev $vhost $TGTWWPN $LUN
+ fi
+ if test ! -z "$dev"; then
+ xenstore-write $XENBUS_PATH/node /dev/$dev
+ write_dev /dev/$dev
+ exit 0
+ fi
+
+ exit 4
+ ;;
+
+ remove)
+ node=`xenstore-read $XENBUS_PATH/node` || true
+ #node=$2
+ dev=$node; dev=${dev#/dev/}
+ # this is really screwy. the first delete of a lun will
+ # terminate the entire vport (all luns)
+ find_vhost_from_dev $dev
+ if test -z "$vhost" ; then exit 5; fi
+ flush_nodes_on_vhost $vhost
+ delete_vhost $vhost
+ exit 0
+ ;;
+esac
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/block-npiv-common.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/block-npiv-common.sh
new file mode 100755
index 00000000..dcf71036
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/block-npiv-common.sh
@@ -0,0 +1,238 @@
+
+
+# Look for the NPIV vport with the WWPN
+# $1 contains the WWPN (assumes it does not contain a leading "0x")
+find_vhost()
+{
+ unset vhost
+
+ # look in upstream locations
+ for fchost in /sys/class/fc_vports/* ; do
+ if test -e $fchost/port_name ; then
+ wwpn=`cat $fchost/port_name | sed -e s/^0x//`
+ if test $wwpn = $1 ; then
+ # Note: makes the assumption the vport will always have an scsi_host child
+ vhost=`ls -d $fchost/device/host*`
+ vhost=`basename $vhost`
+ return
+ fi
+ fi
+ done
+
+ # look in vendor-specific locations
+
+ # Emulex - just looks like another scsi_host - so look at fc_hosts...
+ for fchost in /sys/class/fc_host/* ; do
+ if test -e $fchost/port_name ; then
+ wwpn=`cat $fchost/port_name | sed -e s/^0x//`
+ if test $wwpn = $1 ; then
+ # Note: makes the assumption the vport will always have an scsi_host child
+ vhost=`basename $fchost`
+ return
+ fi
+ fi
+ done
+}
+
+
+# Create a NPIV vport on the fabric w/ FABRICNM, with WWPN,WWNN
+# $1 contains FABRICNM
+# $2 contains the VPORT WWPN
+# $3 contains the VPORT WWNN
+# (assumes no name contains a leading "0x")
+create_vport()
+{
+ # find a base adapter with npiv support that is on the right fabric
+
+ # Look via upstream interfaces
+ for fchost in /sys/class/fc_host/* ; do
+ if test -e $fchost/vport_create ; then
+ # is the link up, w/ NPIV support ?
+ pstate=`cat $fchost/port_state`
+ ptype=`cat $fchost/port_type | cut -c 1-5`
+ fname=`cat $fchost/fabric_name | sed -e s/^0x//`
+ if [ $pstate = "Online" -a $ptype = "NPort" -a $fname = $1 ] ; then
+ vmax=`cat $fchost/max_npiv_vports`
+ vinuse=`cat $fchost/npiv_vports_inuse`
+ avail=`expr $vmax - $vinuse`
+ if [ $avail -gt 0 ] ; then
+ # create the vport
+ echo $2":"$3 > $fchost/vport_create
+ if [ $? -eq 0 ] ; then
+ return 0
+ fi
+ # failed - so we'll just look for the next adapter
+ fi
+ fi
+ fi
+ done
+
+ # Look in vendor-specific locations
+
+ # Emulex: interfaces mirror upstream, but are under adapter scsi_host
+ for shost in /sys/class/scsi_host/* ; do
+ if [ -e $shost/vport_create ] ; then
+ fchost=`ls -d $shost/device/fc_host*`
+ # is the link up, w/ NPIV support ?
+ pstate=`cat $fchost/port_state`
+ ptype=`cat $fchost/port_type | cut -c 1-5`
+ fname=`cat $fchost/fabric_name | sed -e s/^0x//`
+ if [ $pstate = "Online" -a $ptype = "NPort" -a $fname = $1 ] ; then
+ vmax=`cat $shost/max_npiv_vports`
+ vinuse=`cat $shost/npiv_vports_inuse`
+ avail=`expr $vmax - $vinuse`
+ if [ $avail -gt 0 ] ; then
+ # create the vport
+ echo $2":"$3 > $shost/vport_create
+ if [ $? -eq 0 ] ; then
+ return 0
+ fi
+ # failed - so we'll just look for the next adapter
+ fi
+ fi
+ fi
+ done
+
+ return 1
+}
+
+
+# Look for the LUN on the indicated scsi_host (which is an NPIV vport)
+# $1 is the scsi_host name (normalized to simply the hostX name)
+# $2 is the WWPN of the tgt port the lun is on
+# Note: this implies we don't support a multipath'd lun, or we
+# are explicitly identifying a "path"
+# $3 is the LUN number of the scsi device
+find_sdev()
+{
+ unset dev
+ hostno=${1/*host/}
+ for sdev in /sys/class/scsi_device/${hostno}:*:$3 ; do
+ if test -e $sdev/device/../fc_trans*/target${hostno}*/port_name ; then
+ tgtwwpn=`cat $sdev/device/../fc_trans*/target${hostno}*/port_name | sed -e s/^0x//`
+ if test $tgtwwpn = $2 ; then
+ if test -e $sdev/device/block* ; then
+ dev=`ls $sdev/device/block*`
+ dev=${dev##*/}
+ return
+ fi
+ fi
+ fi
+ done
+}
+
+
+# Look for the NPIV vhost based on a scsi "sdX" name
+# $1 is the "sdX" name
+find_vhost_from_dev()
+{
+ unset vhost
+ hostno=`readlink /sys/block/$1/device`
+ hostno=${hostno##*/}
+ hostno=${hostno%%:*}
+ if test -z "$hostno" ; then return; fi
+ vhost="host"$hostno
+}
+
+
+# We're about to terminate a vhost based on a scsi device
+# Flush all nodes on that vhost as they are about to go away
+# $1 is the vhost
+flush_nodes_on_vhost()
+{
+ if test ! -x /sbin/blockdev ; then return; fi
+ hostno=${1/*host/}
+ for sdev in /sys/class/scsi_device/${hostno}:* ; do
+ if test -e $sdev/device/block* ; then
+ dev=`ls $sdev/device/block*`
+ dev="/dev/"$dev
+ if test -n "$dev"; then
+ blockdev --flushbufs $dev
+ fi
+ fi
+ done
+}
+
+
+# Terminate a NPIV vhost
+# $1 is vhost
+delete_vhost()
+{
+ # use upstream interface
+ for vport in /sys/class/fc_vports/* ; do
+ if test -e $vport/device/$1 ; then
+ if test -e $vport/vport_delete ; then
+ echo "1" > $vport/vport_delete
+ if test $? -ne 0 ; then exit 6; fi
+ sleep 4
+ return
+ fi
+ fi
+ done
+
+ # use vendor specific interface
+
+ # Emulex
+ if test -e /sys/class/fc_host/$1/device/../scsi_host*/lpfc_drvr_version ; then
+ shost=`ls -1d /sys/class/fc_host/$1/device/../scsi_host* | sed s/.*scsi_host://`
+ vportwwpn=`cat /sys/class/fc_host/$1/port_name | sed s/^0x//`
+ vportwwnn=`cat /sys/class/fc_host/$1/node_name | sed s/^0x//`
+ echo "$vportwwpn:$vportwwnn" > /sys/class/scsi_host/$shost/vport_delete
+ if test $? -ne 0 ; then exit 6; fi
+ sleep 4
+ return
+ fi
+
+ # Qlogic
+ if test -e /sys/class/fc_host/$1/device/../scsi_host*/driver_version ; then
+ shost=`ls -1d /sys/class/fc_host/$1/device/../scsi_host* | sed s/.*scsi_host://`
+ vportwwpn=`cat /sys/class/fc_host/$1/port_name | sed s/^0x//`
+ vportwwnn=`cat /sys/class/fc_host/$1/node_name | sed s/^0x//`
+ echo "$vportwwpn:$vportwwnn" > /sys/class/scsi_host/$shost/vport_delete
+ if test $? -ne 0 ; then exit 6; fi
+ sleep 4
+ return
+ fi
+
+ exit 6
+}
+
+
+vport_status()
+{
+ # Look via upstream interfaces
+ for fchost in /sys/class/fc_host/* ; do
+ if test -e $fchost/vport_create ; then
+ vport_status_display $fchost $fchost
+ fi
+ done
+
+ # Look in vendor-specific locations
+
+ # Emulex: interfaces mirror upstream, but are under adapter scsi_host
+ for shost in /sys/class/scsi_host/* ; do
+ if [ -e $shost/vport_create ] ; then
+ fchost=`ls -d $shost/device/fc_host*`
+ vport_status_display $fchost $shost
+ fi
+ done
+
+ return 0
+}
+
+
+vport_status_display()
+{
+ echo
+ echo "fc_host: " $2
+ echo "port_state: " `cat $1/port_state`
+ echo "port_type: " `cat $1/port_type`
+ echo "fabric_name: " `cat $1/fabric_name`
+ echo "max_npiv_vports: " `cat $2/max_npiv_vports`
+ echo "npiv_vports_inuse: " `cat $2/npiv_vports_inuse`
+ echo "modeldesc: " `cat $2/modeldesc`
+ echo "speed: " `cat $1/speed`
+
+ return 0
+}
+
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/block-npiv-vport b/os-plugins/plugins/xen/files/xen.examples/scripts/block-npiv-vport
new file mode 100755
index 00000000..91185f74
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/block-npiv-vport
@@ -0,0 +1,79 @@
+#!/bin/bash
+
+# Usage: block-npiv-vport [create npivargs | delete vportwwpn | status]
+
+dir=$(dirname "$0")
+. "$dir/block-npiv-common.sh"
+
+#set -x
+command=$1
+params=$2
+
+case "$command" in
+ create)
+ # Params is one big arg, with fields separated by hyphens:
+ # FABRIC-VPWWPN-VPWWNN-TGTWWPN-LUN#
+ # arg 2 - Fabric Name
+ # arg 3 - VPORT's WWPN
+ # arg 4 - VPORT's WWNN
+ # arg 5 - Target's WWPN
+ # arg 6 - LUN # on Target
+ # no wwn contains a leading 0x - it is a 16 character hex value
+ # You may want to optionally pick a specific adapter ?
+ NPIVARGS=$params;
+ LUN=${NPIVARGS##*-*-*-*-}; NPIVARGS=${NPIVARGS%-*}
+ if test $LUN = $NPIVARGS ; then exit 1; fi
+ TGTWWPN=${NPIVARGS##*-*-*-}; NPIVARGS=${NPIVARGS%-*}
+ if test $TGTWWPN = $NPIVARGS ; then exit 1; fi
+ VPORTWWNN=${NPIVARGS##*-*-}; NPIVARGS=${NPIVARGS%-*}
+ if test $VPORTWWNN = $NPIVARGS ; then exit 1; fi
+ VPORTWWPN=${NPIVARGS##*-}; NPIVARGS=${NPIVARGS%-*}
+ if test $VPORTWWPN = $NPIVARGS ; then exit 1; fi
+ FABRICNM=$NPIVARGS
+
+ # Ensure we compare everything using lower-case hex characters
+ TGTWWPN=`echo $TGTWWPN | tr A-Z a-z`
+ VPORTWWPN=`echo $VPORTWWPN | tr A-Z a-z`
+ VPORTWWNN=`echo $VPORTWWNN | tr A-Z a-z`
+ FABRICNM=`echo $FABRICNM | tr A-Z a-z`
+
+ find_vhost $VPORTWWPN
+ if test -z "$vhost" ; then
+ create_vport $FABRICNM $VPORTWWPN $VPORTWWNN
+ if [ $? -ne 0 ] ; then exit 2; fi
+ sleep 8
+ find_vhost $VPORTWWPN
+ if test -z "$vhost" ; then exit 3; fi
+ fi
+
+ exit 0
+ ;;
+
+ delete)
+ # Params is VPORT's WWPN
+ # no wwn contains a leading 0x - it is a 16 character hex value
+ VPORTWWPN=$params
+
+ # Ensure we compare everything using lower-case hex characters
+ VPORTWWPN=`echo $VPORTWWPN | tr A-Z a-z`
+
+ find_vhost $VPORTWWPN
+ if test -z "$vhost" ; then exit 4; fi
+ delete_vhost $vhost
+
+ exit 0
+ ;;
+
+ status)
+ vport_status
+
+ exit 0
+ ;;
+
+ *)
+ echo "Usage: block-npiv-vport [create npivargs | delete vportwwpn | status]"
+
+ exit 1
+ ;;
+esac
+
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/domain-lock b/os-plugins/plugins/xen/files/xen.examples/scripts/domain-lock
new file mode 100755
index 00000000..268d0058
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/domain-lock
@@ -0,0 +1,83 @@
+#!/bin/bash
+
+basedir=$(dirname "$0")
+
+usage() {
+ echo "usage: domain-lock [-l|-u] -n <vm name> -i <vm uuid> -p <physical host> path"
+ echo "usage: domain-lock [-s] path"
+ echo ""
+ echo "-l lock"
+ echo "-u unlock"
+ echo "-s status (default)"
+ echo "-n Virtual Machine name"
+ echo "-i Virtual Machine Id or UUID"
+ echo "-p Virtual Machine Server (physical host) name"
+ echo "path A per-VM, unique location where external lock will be managed"
+ exit 1
+}
+
+remove_lock(){
+ local path=$1/lock
+ local name=$2
+
+ pid=`ps -efwww | grep vm-monitor | grep $name | awk '{print $2}'`
+ if [ -n "$pid" ]; then
+ kill $pid
+ rm -f $path
+ fi
+}
+
+get_status(){
+ local path=$1/lock
+ [ -f $path ] || exit 1
+
+ rc=`flock -xn $path /bin/true`
+ cat $path
+ exit $rc
+}
+
+mode="status"
+
+while getopts ":lusn:i:p:" opt; do
+ case $opt in
+ l )
+ mode="lock"
+ ;;
+ u )
+ mode="unlock"
+ ;;
+ s )
+ mode="status"
+ ;;
+ p )
+ vm_host=$OPTARG
+ ;;
+ n )
+ vm_name=$OPTARG
+ ;;
+ i )
+ vm_uuid=$OPTARG
+ ;;
+ \? )
+ usage
+ ;;
+ esac
+done
+
+shift $(($OPTIND - 1))
+vm_path=$1
+
+case $mode in
+ lock )
+ [ -z "$vm_path" ] || [ -z "$vm_name" ] || [ -z "$vm_uuid" ] || [ -z "$vm_host" ] && usage
+ $basedir/set-lock $vm_path $vm_name $vm_uuid $vm_host
+ ;;
+ unlock )
+ [ -z "$vm_path" ] || [ -z "$vm_name" ] || [ -z "$vm_uuid" ] || [ -z "$vm_host" ] && usage
+ remove_lock $vm_path $vm_name $vm_uuid $vm_host
+ ;;
+ status )
+ [ -z "$vm_path" ] && usage
+ get_status $vm_path
+ ;;
+esac
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/external-device-migrate b/os-plugins/plugins/xen/files/xen.examples/scripts/external-device-migrate
new file mode 100755
index 00000000..a4113483
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/external-device-migrate
@@ -0,0 +1,98 @@
+#!/bin/bash
+
+# Copyright (c) 2005 IBM Corporation
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+set -x
+
+# This script is called by XenD for migration of external devices
+# It does not handle the migration of those devices itself, but
+# passes the requests on to further applications
+# It handles the low-level command line parsing and some of the
+# synchronization
+
+dir=$(dirname "$0")
+. "$dir/logging.sh"
+
+
+function ext_dev_migrate_usage() {
+cat <<EOF
+Pass the following command line parameters to the script:
+
+-step <n> : n-th migration step
+-host <host> : the destination host
+-domname <domain name> : name of the domain that is migrating
+-type <device type> : the type of device that is migrating
+-subtype <dev. subtype>: the subtype of the device
+-recover : indicates recovery request; an error
+ occurred during migration
+-help : display this help screen
+EOF
+}
+
+# Parse the command line paramters. The following parameters must be
+# passed as the first ones in the sequence:
+# -step [required]
+# -host [required]
+# -domname [required]
+# -type [required]
+# -subtype [optional]
+# -recover [optional]
+# The remaining ones will be passed to the called function.
+function evaluate_params()
+{
+ local step host domname typ recover filename func stype
+ stype=""
+ while [ $# -ge 1 ]; do
+ case "$1" in
+ -step) step=$2; shift; shift;;
+ -host) host=$2; shift; shift;;
+ -domname) domname=$2; shift; shift;;
+ -type) typ=$2; shift; shift;;
+ -subtype) stype=$2; shift; shift;;
+ -recover) recover=1; shift;;
+ -help) ext_dev_migrate_usage; exit 0;;
+ *) break;;
+ esac
+ done
+
+ if [ "$step" = "" -o \
+ "$host" = "" -o \
+ "$typ" = "" -o \
+ "$domname" = "" ]; then
+ echo "Error: Parameter(s) missing (-step/-host/-type/-domname)" 1>&2
+ echo "" 1>&2
+ echo "$0 -help for usage." 1>&2
+ exit 1
+ fi
+
+ filename="$dir/$typ$stype-migration.sh"
+ if [ ! -r $filename ]; then
+ echo "Error: Could not find script '$filename'"
+ return
+ fi
+ . "$filename"
+
+ if [ "$recover" = "1" ]; then
+ func="$typ"_recover
+ eval $func $host $domname $step $*
+ else
+ func="$typ"_migration_step
+ eval $func $host $domname $step $*
+ fi
+}
+
+evaluate_params "$@"
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/locking.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/locking.sh
new file mode 100644
index 00000000..6ff58e7e
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/locking.sh
@@ -0,0 +1,98 @@
+#
+# Copyright (c) 2005 XenSource Ltd.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+#
+# Serialisation
+#
+
+LOCK_SLEEPTIME=1
+LOCK_SPINNING_RETRIES=5
+LOCK_RETRIES=100
+LOCK_BASEDIR=/var/run/xen-hotplug
+
+
+claim_lock()
+{
+ local lockdir="$LOCK_BASEDIR/$1"
+ mkdir -p "$LOCK_BASEDIR"
+ _claim_lock "$lockdir"
+}
+
+
+release_lock()
+{
+ _release_lock "$LOCK_BASEDIR/$1"
+}
+
+
+_claim_lock()
+{
+ local lockdir="$1"
+ local owner=$(_lock_owner "$lockdir")
+ local retries=0
+
+ while [ $retries -lt $LOCK_RETRIES ]
+ do
+ mkdir "$lockdir" 2>/dev/null && trap "release_lock $1; sigerr" ERR &&
+ _update_lock_info "$lockdir" && return
+
+ local new_owner=$(_lock_owner "$lockdir")
+ if [ "$new_owner" != "$owner" ]
+ then
+ owner="$new_owner"
+ retries=0
+ fi
+
+ if [ $retries -gt $LOCK_SPINNING_RETRIES ]
+ then
+ sleep $LOCK_SLEEPTIME
+ else
+ sleep 0
+ fi
+ retries=$(($retries + 1))
+ done
+ _steal_lock "$lockdir"
+}
+
+
+_release_lock()
+{
+ trap sigerr ERR
+ rm -rf "$1" 2>/dev/null || true
+}
+
+
+_steal_lock()
+{
+ local lockdir="$1"
+ local owner=$(cat "$lockdir/owner" 2>/dev/null || echo "unknown")
+ log err "Forced to steal lock on $lockdir from $owner!"
+ _release_lock "$lockdir"
+ _claim_lock "$lockdir"
+}
+
+
+_lock_owner()
+{
+ cat "$1/owner" 2>/dev/null || echo "unknown"
+}
+
+
+_update_lock_info()
+{
+ echo "$$: $0" >"$1/owner"
+}
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/logging.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/logging.sh
new file mode 100644
index 00000000..c1bc699c
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/logging.sh
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2005 XenSource Ltd.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+log() {
+ local level="$1"
+ shift
+ logger -p "daemon.$level" -- "$0:" "$@" || echo "$0 $@" >&2
+}
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/network-bridge b/os-plugins/plugins/xen/files/xen.examples/scripts/network-bridge
new file mode 100755
index 00000000..ade0ce33
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/network-bridge
@@ -0,0 +1,380 @@
+#!/bin/bash
+#============================================================================
+# Default Xen network start/stop script.
+# Xend calls a network script when it starts.
+# The script name to use is defined in /etc/xen/xend-config.sxp
+# in the network-script field.
+#
+# This script creates a bridge (default ${netdev}), adds a device
+# (defaults to the device on the default gateway route) to it, copies
+# the IP addresses from the device to the bridge and adjusts the routes
+# accordingly.
+#
+# If all goes well, this should ensure that networking stays up.
+# However, some configurations are upset by this, especially
+# NFS roots. If the bridged setup does not meet your needs,
+# configure a different script, for example using routing instead.
+#
+# Usage:
+#
+# network-bridge (start|stop|status) {VAR=VAL}*
+#
+# Vars:
+#
+# bridge The bridge to use (default ${netdev}).
+# netdev The interface to add to the bridge (default gateway device).
+# antispoof Whether to use iptables to prevent spoofing (default no).
+#
+# Internal Vars:
+# pdev="p${netdev}"
+# tdev=tmpbridge
+#
+# start:
+# Creates the bridge as tdev
+# Copies the IP and MAC addresses from pdev to bridge
+# Renames netdev to be pdev
+# Renames tdev to bridge
+# Enslaves pdev to bridge
+#
+# stop:
+# Removes pdev from the bridge
+# Transfers addresses, routes from bridge to pdev
+# Renames bridge to tdev
+# Renames pdev to netdev
+# Deletes tdev
+#
+# status:
+# Print addresses, interfaces, routes
+#
+#============================================================================
+
+
+dir=$(dirname "$0")
+. "$dir/xen-script-common.sh"
+. "$dir/xen-network-common.sh"
+
+findCommand "$@"
+evalVariables "$@"
+
+is_network_root () {
+ local rootfs=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $3; }}' /etc/mtab)
+ local rootopts=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $4; }}' /etc/mtab)
+
+ [[ "$rootfs" =~ "^nfs" ]] || [[ "$rootopts" =~ "_netdev" ]] && has_nfsroot=1 || has_nfsroot=0
+ if [ $has_nfsroot -eq 1 ]; then
+ local bparms=$(cat /proc/cmdline)
+ for p in $bparms; do
+ local ipaddr=$(echo $p | awk /nfsroot=/'{ print substr($1,9,index($1,":")-9) }')
+ if [ "$ipaddr" != "" ]; then
+ local nfsdev=$(ip route get $ipaddr | awk /$ipaddr/'{ print $3 }')
+ [[ "$nfsdev" == "$netdev" ]] && return 0 || return 1
+ fi
+ done
+ fi
+ return 1
+}
+
+find_alt_device () {
+ local interf=$1
+ local prefix=${interf%[[:digit:]]}
+ local ifs=$(ip link show | grep " $prefix" |\
+ gawk '{ printf ("%s",substr($2,1,length($2)-1)) }' |\
+ sed s/$interf//)
+ echo "$ifs"
+}
+
+netdev=${netdev:-$(ip route list 0.0.0.0/0 | \
+ sed 's/.*dev \([a-z]\+[0-9]\+\).*$/\1/')}
+if is_network_root ; then
+ altdevs=$(find_alt_device $netdev)
+ for netdev in $altdevs; do break; done
+ if [ -z "$netdev" ]; then
+ [ -x /usr/bin/logger ] && /usr/bin/logger "network-bridge: bridging not supported on network root; not starting"
+ exit
+ fi
+fi
+netdev=${netdev:-eth0}
+bridge=${bridge:-${netdev}}
+antispoof=${antispoof:-no}
+
+pdev="p${netdev}"
+tdev=tmpbridge
+
+get_ip_info() {
+ addr_pfx=`ip addr show dev $1 | egrep '^ *inet' | sed -e 's/ *inet //' -e 's/ .*//'`
+ gateway=`ip route show dev $1 | fgrep default | sed 's/default via //'`
+}
+
+do_ifup() {
+ if [ $1 != "${netdev}" ] || ! ifup $1 ; then
+ if [ -n "$addr_pfx" ] ; then
+ # use the info from get_ip_info()
+ ip addr flush $1
+ ip addr add ${addr_pfx} dev $1
+ ip link set dev $1 up
+ [ -n "$gateway" ] && ip route add default via ${gateway}
+ fi
+ fi
+}
+
+# Usage: transfer_addrs src dst
+# Copy all IP addresses (including aliases) from device $src to device $dst.
+transfer_addrs () {
+ local src=$1
+ local dst=$2
+ # Don't bother if $dst already has IP addresses.
+ if ip addr show dev ${dst} | egrep -q '^ *inet ' ; then
+ return
+ fi
+ # Address lines start with 'inet' and have the device in them.
+ # Replace 'inet' with 'ip addr add' and change the device name $src
+ # to 'dev $src'.
+ ip addr show dev ${src} | egrep '^ *inet ' | sed -e "
+s/inet/ip addr add/
+s@\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+/[0-9]\+\)@\1@
+s/${src}/dev ${dst} label ${dst}/
+s/secondary//
+" | sh -e
+ # Remove automatic routes on destination device
+ ip route list | sed -ne "
+/dev ${dst}\( \|$\)/ {
+ s/^/ip route del /
+ p
+}" | sh -e
+}
+
+# Usage: transfer_routes src dst
+# Get all IP routes to device $src, delete them, and
+# add the same routes to device $dst.
+# The original routes have to be deleted, otherwise adding them
+# for $dst fails (duplicate routes).
+transfer_routes () {
+ local src=$1
+ local dst=$2
+ # List all routes and grep the ones with $src in.
+ # Stick 'ip route del' on the front to delete.
+ # Change $src to $dst and use 'ip route add' to add.
+ ip route list | sed -ne "
+/dev ${src}\( \|$\)/ {
+ h
+ s/^/ip route del /
+ P
+ g
+ s/${src}/${dst}/
+ s/^/ip route add /
+ P
+ d
+}" | sh -e
+}
+
+
+##
+# link_exists interface
+#
+# Returns 0 if the interface named exists (whether up or down), 1 otherwise.
+#
+link_exists()
+{
+ if ip link show "$1" >/dev/null 2>/dev/null
+ then
+ return 0
+ else
+ return 1
+ fi
+}
+
+# Set the default forwarding policy for $dev to drop.
+# Allow forwarding to the bridge.
+antispoofing () {
+ iptables -P FORWARD DROP
+ iptables -F FORWARD
+ iptables -A FORWARD -m physdev --physdev-in ${pdev} -j ACCEPT
+}
+
+find_active_vlans() {
+ local netdev=$1
+ local vlan
+ local vlans
+ vlans=""
+ for vifcfg in /etc/sysconfig/network/ifcfg-vlan* ; do
+ vlan=${vifcfg/*\/ifcfg-}
+ if [ "$vlan" = "vlan*" ]; then
+ continue
+ fi
+ . $vifcfg
+ etherdevice="$ETHERDEVICE"
+ if [ -x /sbin/getcfg-interface ]; then
+ etherdevice=$(/sbin/getcfg-interface "$ETHERDEVICE")
+ fi
+ if [ "$ETHERDEVICE" = "$netdev" ] || [ "$etherdevice" = "$netdev" ] ; then
+ link_exists "$vlan" && vlans="$vlans $vlan"
+ fi
+ done
+ echo "$vlans"
+}
+
+# Usage: show_status dev bridge
+# Print ifconfig and routes.
+show_status () {
+ local dev=$1
+ local bridge=$2
+
+ echo '============================================================'
+ ip addr show ${dev}
+ ip addr show ${bridge}
+ echo ' '
+ brctl show ${bridge}
+ echo ' '
+ ip route list
+ echo ' '
+ route -n
+ echo '============================================================'
+}
+
+op_start () {
+ if [ "${bridge}" = "null" ] ; then
+ return
+ fi
+
+ if link_exists "$pdev"; then
+ # The device is already up.
+ return
+ fi
+
+ local bonded=""
+ [ -e /sys/class/net/${netdev}/bonding ] && bonded="yes"
+
+ vlans=$(find_active_vlans "${netdev}")
+ for vlan in $vlans ; do ifdown $vlan ; done
+
+ create_bridge ${tdev}
+
+ # Record creation of bridge in /dev/shm/sysconfig/xenbridges so other
+ # tools, e.g. yast2 lan, know that Xen bridging is active.
+ [ -d /dev/shm/sysconfig/xenbridges ] || mkdir /dev/shm/sysconfig/xenbridges
+ touch /dev/shm/sysconfig/xenbridges/${bridge}
+
+ preiftransfer ${netdev}
+ transfer_addrs ${netdev} ${tdev}
+ # Remember slaves for bonding interface.
+ if [ -e /sys/class/net/${netdev}/bonding/slaves ]; then
+ slaves=`cat /sys/class/net/${netdev}/bonding/slaves`
+ fi
+ # Remember the IP details for do_ifup.
+ get_ip_info ${netdev}
+ if ! ifdown ${netdev}; then
+ ip link set ${netdev} down
+ ip addr flush ${netdev}
+ fi
+
+ if [ "x${bonded}" = "xyes" ]
+ then
+ ip link set ${tdev} name ${bridge}
+ ln -sf /etc/sysconfig/network/ifcfg-${netdev} /etc/sysconfig/network/ifcfg-${pdev}
+ ifup ${pdev}
+ local gw=`ip route show dev ${pdev} | fgrep default | sed 's/default via //'`
+ ip addr flush ${pdev}
+ rm -f /etc/sysconfig/network/ifcfg-${pdev}
+ brctl addif ${bridge} ${pdev}
+ ip link set ${bridge} up
+ [ -n "$gw" ] && ip route add default via ${gw}
+ else
+ ip link set ${netdev} name ${pdev}
+ ip link set ${tdev} name ${bridge}
+
+ setup_bridge_port ${pdev}
+
+ # Restore slaves
+ if [ -n "${slaves}" ]; then
+ ip link set ${pdev} up
+ ifenslave ${pdev} ${slaves}
+ fi
+ add_to_bridge2 ${bridge} ${pdev}
+ do_ifup ${bridge}
+ fi
+
+ for vlan in $vlans ; do ifup $vlan ; done
+
+ if [ ${antispoof} = 'yes' ] ; then
+ antispoofing
+ fi
+}
+
+op_stop () {
+ if [ "${bridge}" = "null" ]; then
+ return
+ fi
+ if ! link_exists "$bridge"; then
+ return
+ fi
+
+ vlans=$(find_active_vlans "${netdev}")
+ for vlan in $vlans ; do ifdown $vlan ; done
+
+ transfer_addrs ${bridge} ${pdev}
+ if ! ifdown ${bridge}; then
+ get_ip_info ${bridge}
+ ip link set ${pdev} down
+ ip addr flush ${bridge}
+
+ brctl delif ${bridge} ${pdev}
+ ip link set ${bridge} down
+
+ ip link set ${bridge} name ${tdev}
+ brctl delbr ${tdev}
+ fi
+ ip link set ${pdev} down
+ ip link set ${pdev} name ${netdev}
+ do_ifup ${netdev}
+
+ # Remove record of bridge from /dev/shm/sysconfig/xenbridges ...
+ rm -f /dev/shm/sysconfig/xenbridges/${bridge}
+ # ... and directory itself if empty
+ if [ -z "$(ls -A /dev/shm/sysconfig/xenbridges 2>/dev/null)" ]; then
+ rmdir /dev/shm/sysconfig/xenbridges
+ fi
+
+ for vlan in $vlans ; do ifup $vlan ; done
+}
+
+# adds $dev to $bridge but waits for $dev to be in running state first
+add_to_bridge2() {
+ local bridge=$1
+ local dev=$2
+ local maxtries=10
+
+ echo -n "Waiting for ${dev} to negotiate link."
+ ip link set ${dev} up
+ for i in `seq ${maxtries}` ; do
+ if ifconfig ${dev} | grep -q RUNNING ; then
+ break
+ else
+ echo -n '.'
+ sleep 1
+ fi
+ done
+
+ if [ ${i} -eq ${maxtries} ] ; then echo -n '(link isnt in running state)' ; fi
+ echo
+
+ add_to_bridge ${bridge} ${dev}
+}
+
+case "$command" in
+ start)
+ op_start
+ ;;
+
+ stop)
+ op_stop
+ ;;
+
+ status)
+ show_status ${netdev} ${bridge}
+ ;;
+
+ *)
+ echo "Unknown command: $command" >&2
+ echo 'Valid commands are: start, stop, status' >&2
+ exit 1
+esac
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/network-nat b/os-plugins/plugins/xen/files/xen.examples/scripts/network-nat
new file mode 100755
index 00000000..e20c0d03
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/network-nat
@@ -0,0 +1,125 @@
+#!/bin/bash
+#============================================================================
+# Default Xen network start/stop script when using NAT.
+# Xend calls a network script when it starts.
+# The script name to use is defined in /etc/xen/xend-config.sxp
+# in the network-script field.
+#
+# Usage:
+#
+# network-nat (start|stop|status) {VAR=VAL}*
+#
+# Vars:
+#
+# netdev The gateway interface (default eth0).
+# antispoof Whether to use iptables to prevent spoofing (default no).
+# dhcp Whether to alter the local DHCP configuration (default no).
+#
+#============================================================================
+
+dir=$(dirname "$0")
+. "$dir/xen-script-common.sh"
+. "$dir/xen-network-common.sh"
+
+findCommand "$@"
+evalVariables "$@"
+
+netdev=${netdev:-eth0}
+# antispoofing not yet implemented
+antispoof=${antispoof:-no}
+
+# turn on dhcp feature by default if dhcpd is installed
+if [ -f /etc/dhcpd.conf ]
+then
+ dhcp=${dhcp:-yes}
+else
+ dhcp=${dhcp:-no}
+fi
+
+
+if [ "$dhcp" != 'no' ]
+then
+ dhcpd_conf_file=$(find_dhcpd_conf_file)
+ dhcpd_init_file=$(find_dhcpd_init_file)
+ if [ -z "$dhcpd_conf_file" ] || [ -z "$dhcpd_init_file" ]
+ then
+ echo 'Failed to find dhcpd configuration or init file.' >&2
+ exit 1
+ fi
+fi
+
+domain_name=`cat /etc/resolv.conf | grep -v "#" | grep -E 'search|domain' -i | tail -n 1 | awk '{ print $2 }'`
+nameserver=`cat /etc/resolv.conf | grep -v "#" | grep "nameserver" -i -m 1 | awk '{ print $2 }'`
+
+function dhcp_start()
+{
+ if ! grep -q "subnet 10.0.0.0" "$dhcpd_conf_file"
+ then
+ echo >>"$dhcpd_conf_file" "subnet 10.0.0.0 netmask 255.255.0.0 {\
+ option domain-name \"$domain_name\";\
+ option domain-name-servers $nameserver; }"
+ fi
+
+ "$dhcpd_init_file" restart
+}
+
+
+function dhcp_stop()
+{
+ local tmpfile=$(mktemp)
+ grep -v "subnet 10.0.0.0" "$dhcpd_conf_file" >"$tmpfile"
+ if diff "$tmpfile" "$dhcpd_conf_file" >&/dev/null
+ then
+ rm "$tmpfile"
+ else
+ mv "$tmpfile" "$dhcpd_conf_file"
+ fi
+
+ "$dhcpd_init_file" restart
+}
+
+
+op_start() {
+ echo 1 >/proc/sys/net/ipv4/ip_forward
+ iptables -t nat -A POSTROUTING -o ${netdev} -j MASQUERADE
+ iptables -P FORWARD ACCEPT
+ [ "$dhcp" != 'no' ] && dhcp_start
+}
+
+
+op_stop() {
+ [ "$dhcp" != 'no' ] && dhcp_stop
+ iptables -t nat -D POSTROUTING -o ${netdev} -j MASQUERADE
+ iptables -P FORWARD DROP
+}
+
+
+show_status() {
+ echo '============================================================'
+ ifconfig
+ echo ' '
+ ip route list
+ echo ' '
+ route -n
+ echo '============================================================'
+
+}
+
+case "$command" in
+ start)
+ op_start
+ ;;
+
+ stop)
+ op_stop
+ ;;
+
+ status)
+ show_status
+ ;;
+
+ *)
+ echo "Unknown command: $command" >&2
+ echo 'Valid commands are: start, stop, status' >&2
+ exit 1
+esac
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/network-route b/os-plugins/plugins/xen/files/xen.examples/scripts/network-route
new file mode 100755
index 00000000..4416316e
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/network-route
@@ -0,0 +1,27 @@
+#!/bin/bash
+#============================================================================
+# Default Xen network start/stop script.
+# Xend calls a network script when it starts.
+# The script name to use is defined in /etc/xen/xend-config.sxp
+# in the network-script field.
+#
+# Usage:
+#
+# network-route (start|stop|status) {VAR=VAL}*
+#
+# Vars:
+#
+# netdev The gateway interface (default eth0).
+# antispoof Whether to use iptables to prevent spoofing (default yes).
+#
+#============================================================================
+
+dir=$(dirname "$0")
+. "$dir/xen-script-common.sh"
+
+evalVariables "$@"
+
+netdev=${netdev:-eth0}
+
+echo 1 >/proc/sys/net/ipv4/ip_forward
+echo 1 >/proc/sys/net/ipv4/conf/${netdev}/proxy_arp
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/set-lock b/os-plugins/plugins/xen/files/xen.examples/scripts/set-lock
new file mode 120000
index 00000000..8bd35731
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/set-lock
@@ -0,0 +1 @@
+vm-monitor \ No newline at end of file
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vif-bridge b/os-plugins/plugins/xen/files/xen.examples/scripts/vif-bridge
new file mode 100755
index 00000000..1b698d70
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vif-bridge
@@ -0,0 +1,100 @@
+#!/bin/bash
+#============================================================================
+# /etc/xen/vif-bridge
+#
+# Script for configuring a vif in bridged mode.
+# The hotplugging system will call this script if it is specified either in
+# the device configuration given to Xend, or the default Xend configuration
+# in /etc/xen/xend-config.sxp. If the script is specified in neither of those
+# places, then this script is the default.
+#
+# Usage:
+# vif-bridge (add|remove|online|offline)
+#
+# Environment vars:
+# vif vif interface name (required).
+# XENBUS_PATH path to this device's details in the XenStore (required).
+#
+# Read from the store:
+# bridge bridge to add the vif to (optional). Defaults to searching for the
+# bridge itself.
+# ip list of IP networks for the vif, space-separated (optional).
+#
+# up:
+# Enslaves the vif interface to the bridge and adds iptables rules
+# for its ip addresses (if any).
+#
+# down:
+# Removes the vif interface from the bridge and removes the iptables
+# rules for its ip addresses (if any).
+#============================================================================
+
+dir=$(dirname "$0")
+. "$dir/vif-common.sh"
+
+bridge=${bridge:-}
+bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")
+
+if [ -z "$bridge" ]
+then
+ bridge=$(brctl show | cut -d "
+" -f 2 | cut -f 1)
+
+ if [ -z "$bridge" ]
+ then
+ fatal "Could not find bridge, and none was specified"
+ fi
+else
+ #
+ # Old style bridge setup with netloop, used to have a bridge name
+ # of xenbrX, enslaving pethX and vif0.X, and then configuring
+ # eth0.
+ #
+ # New style bridge setup does not use netloop, so the bridge name
+ # is ethX and the physical device is enslaved pethX
+ #
+ # So if...
+ #
+ # - User asks for xenbrX
+ # - AND xenbrX doesn't exist
+ # - AND there is a ethX device which is a bridge
+ #
+ # ..then we translate xenbrX to ethX
+ #
+ # This lets old config files work without modification
+ #
+ if [ ! -e "/sys/class/net/$bridge" ] && [ -z "${bridge##xenbr*}" ]
+ then
+ if [ -e "/sys/class/net/eth${bridge#xenbr}/bridge" ]
+ then
+ bridge="eth${bridge#xenbr}"
+ fi
+ fi
+fi
+
+RET=0
+ip link show $bridge 1>/dev/null 2>&1 || RET=1
+if [ "$RET" -eq 1 ]
+then
+ fatal "Could not find bridge device $bridge"
+fi
+
+case "$command" in
+ online)
+ setup_bridge_port "$vif"
+ add_to_bridge "$bridge" "$vif"
+ ;;
+
+ offline)
+ do_without_error brctl delif "$bridge" "$vif"
+ do_without_error ifconfig "$vif" down
+ ;;
+esac
+
+handle_iptable
+
+log debug "Successful vif-bridge $command for $vif, bridge $bridge."
+if [ "$command" == "online" ]
+then
+ success
+fi
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vif-common.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/vif-common.sh
new file mode 100644
index 00000000..fe483f9d
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vif-common.sh
@@ -0,0 +1,158 @@
+#
+# Copyright (c) 2005 XenSource Ltd.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+
+dir=$(dirname "$0")
+. "$dir/xen-hotplug-common.sh"
+. "$dir/xen-network-common.sh"
+
+findCommand "$@"
+
+if [ "$command" != "online" ] &&
+ [ "$command" != "offline" ] &&
+ [ "$command" != "add" ] &&
+ [ "$command" != "remove" ]
+then
+ log err "Invalid command: $command"
+ exit 1
+fi
+
+case "$command" in
+ add | remove)
+ exit 0
+ ;;
+esac
+
+
+# Parameters may be read from the environment, the command line arguments, and
+# the store, with overriding in that order. The environment is given by the
+# driver, the command line is given by the Xend global configuration, and
+# store details are given by the per-domain or per-device configuration.
+
+evalVariables "$@"
+
+ip=${ip:-}
+ip=$(xenstore_read_default "$XENBUS_PATH/ip" "$ip")
+
+# Check presence of compulsory args.
+XENBUS_PATH="${XENBUS_PATH:?}"
+vif="${vif:?}"
+
+
+vifname=$(xenstore_read_default "$XENBUS_PATH/vifname" "")
+if [ "$vifname" ]
+then
+ if [ "$command" == "online" ] && ! ip link show "$vifname" >&/dev/null
+ then
+ do_or_die ip link set "$vif" name "$vifname"
+ fi
+ vif="$vifname"
+fi
+
+
+frob_iptable()
+{
+ if [ "$command" == "online" ]
+ then
+ local c="-I"
+ else
+ local c="-D"
+ fi
+
+ iptables "$c" FORWARD -m physdev --physdev-in "$vif" "$@" -j ACCEPT \
+ 2>/dev/null &&
+ iptables "$c" FORWARD -m state --state RELATED,ESTABLISHED -m physdev \
+ --physdev-out "$vif" -j ACCEPT 2>/dev/null
+
+ if [ "$command" == "online" ] && [ $? ]
+ then
+ log err "iptables setup failed. This may affect guest networking."
+ fi
+}
+
+
+##
+# Add or remove the appropriate entries in the iptables. With antispoofing
+# turned on, we have to explicitly allow packets to the interface, regardless
+# of the ip setting. If ip is set, then we additionally restrict the packets
+# to those coming from the specified networks, though we allow DHCP requests
+# as well.
+#
+handle_iptable()
+{
+ # Check for a working iptables installation. Checking for the iptables
+ # binary is not sufficient, because the user may not have the appropriate
+ # modules installed. If iptables is not working, then there's no need to do
+ # anything with it, so we can just return.
+ if ! iptables -L -n >&/dev/null
+ then
+ return
+ fi
+
+ claim_lock "iptables"
+
+ if [ "$ip" != "" ]
+ then
+ local addr
+ for addr in $ip
+ do
+ frob_iptable -s "$addr"
+ done
+
+ # Always allow the domain to talk to a DHCP server.
+ frob_iptable -p udp --sport 68 --dport 67
+ else
+ # No IP addresses have been specified, so allow anything.
+ frob_iptable
+ fi
+
+ release_lock "iptables"
+}
+
+
+##
+# ip_of interface
+#
+# Print the IP address currently in use at the given interface, or nothing if
+# the interface is not up.
+#
+ip_of()
+{
+ ip addr show "$1" | awk "/^.*inet.*$1\$/{print \$2}" | sed -n '1 s,/.*,,p'
+}
+
+
+##
+# dom0_ip
+#
+# Print the IP address of the interface in dom0 through which we are routing.
+# This is the IP address on the interface specified as "netdev" as a parameter
+# to these scripts, or eth0 by default. This function will call fatal if no
+# such interface could be found.
+#
+dom0_ip()
+{
+ local nd=${netdev:-eth0}
+ local result=$(ip_of "$nd")
+ if [ -z "$result" ]
+ then
+ fatal
+"$netdev is not up. Bring it up or specify another interface with " \
+"netdev=<if> as a parameter to $0."
+ fi
+ echo "$result"
+}
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vif-nat b/os-plugins/plugins/xen/files/xen.examples/scripts/vif-nat
new file mode 100755
index 00000000..75bdf5c4
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vif-nat
@@ -0,0 +1,192 @@
+#!/bin/bash
+#============================================================================
+# /etc/xen/vif-nat
+#
+# Script for configuring a vif in routed-nat mode.
+# The hotplugging system will call this script if it is specified either in
+# the device configuration given to Xend, or the default Xend configuration
+# in /etc/xen/xend-config.sxp. If the script is specified in neither of those
+# places, then vif-bridge is the default.
+#
+# Usage:
+# vif-nat (add|remove|online|offline)
+#
+# Environment vars:
+# vif vif interface name (required).
+# XENBUS_PATH path to this device's details in the XenStore (required).
+#
+# Parameters:
+# dhcp Whether to alter the local DHCP configuration to include this
+# new host (default no).
+#
+# Read from the store:
+# ip list of IP networks for the vif, space-separated (default given in
+# this script).
+#============================================================================
+
+
+dir=$(dirname "$0")
+. "$dir/vif-common.sh"
+
+# turn on dhcp feature by default if dhcpd is installed
+if [ -f /etc/dhcpd.conf ]
+then
+ dhcp=${dhcp:-yes}
+else
+ dhcp=${dhcp:-no}
+fi
+
+if [ "$dhcp" != 'no' ]
+then
+ dhcpd_conf_file=$(find_dhcpd_conf_file)
+ dhcpd_init_file=$(find_dhcpd_init_file)
+ dhcpd_arg_file=$(find_dhcpd_arg_file)
+ if [ -z "$dhcpd_conf_file" ] || [ -z "$dhcpd_init_file" ] || [ -z "$dhcpd_arg_file" ]
+ then
+ echo 'Failed to find dhcpd configuration or init or args file.' >&2
+ exit 1
+ fi
+fi
+
+
+domid=$(xenstore_read "$XENBUS_PATH/frontend-id")
+vifid=$(xenstore_read "$XENBUS_PATH/handle")
+vifid=$(( $vifid + 1 ))
+
+
+ip_from_dom()
+{
+ local domid1=$(( $domid / 256 ))
+ local domid2=$(( $domid % 256 ))
+
+ echo "10.$domid1.$domid2.$vifid/16"
+}
+
+
+routing_ip()
+{
+ echo $(echo $1 | awk -F. '{print $1"."$2"."$3"."$4 + 127}')
+}
+
+
+dotted_quad()
+{
+ echo\
+ $(( ($1 & 0xFF000000) >> 24))\
+.$(( ($1 & 0x00FF0000) >> 16))\
+.$(( ($1 & 0x0000FF00) >> 8 ))\
+.$(( $1 & 0x000000FF ))
+}
+
+
+if [ "$ip" = "" ]
+then
+ ip=$(ip_from_dom)
+fi
+
+router_ip=$(routing_ip "$ip")
+
+# Split the given IP/bits pair.
+vif_ip=`echo ${ip} | awk -F/ '{print $1}'`
+
+hostname=$(xenstore_read "$XENBUS_PATH/domain" | tr -- '_.:/+' '-----')
+if [ "$vifid" != "1" ]
+then
+ hostname="$hostname-$vifid"
+fi
+
+dhcparg_remove_entry()
+{
+ local tmpfile=$(mktemp)
+ sed -e "s/$vif //" "$dhcpd_arg_file" >"$tmpfile"
+ if diff "$tmpfile" "$dhcpd_arg_file" >/dev/null
+ then
+ rm "$tmpfile"
+ else
+ mv "$tmpfile" "$dhcpd_arg_file"
+ fi
+}
+
+dhcparg_add_entry()
+{
+ dhcparg_remove_entry
+ local tmpfile=$(mktemp)
+ # handle Red Hat, SUSE, and Debian styles, with or without quotes
+ sed -e 's/^DHCPDARGS="*\([^"]*\)"*/DHCPDARGS="\1'"$vif "'"/' \
+ "$dhcpd_arg_file" >"$tmpfile" && mv "$tmpfile" "$dhcpd_arg_file"
+ sed -e 's/^DHCPD_INTERFACE="*\([^"]*\)"*/DHCPD_INTERFACE="\1'"$vif "'"/' \
+ "$dhcpd_arg_file" >"$tmpfile" && mv "$tmpfile" "$dhcpd_arg_file"
+ sed -e 's/^INTERFACES="*\([^"]*\)"*/INTERFACES="\1'"$vif "'"/' \
+ "$dhcpd_arg_file" >"$tmpfile" && mv "$tmpfile" "$dhcpd_arg_file"
+ rm -f "$tmpfile"
+}
+
+dhcp_remove_entry()
+{
+ local tmpfile=$(mktemp)
+ grep -v "host $hostname" "$dhcpd_conf_file" >"$tmpfile"
+ if diff "$tmpfile" "$dhcpd_conf_file" >/dev/null
+ then
+ rm "$tmpfile"
+ else
+ mv "$tmpfile" "$dhcpd_conf_file"
+ fi
+ dhcparg_remove_entry
+}
+
+
+dhcp_up()
+{
+ claim_lock "vif-nat-dhcp"
+ dhcp_remove_entry
+ mac=$(xenstore_read "$XENBUS_PATH/mac")
+ echo >>"$dhcpd_conf_file" \
+"host $hostname { hardware ethernet $mac; fixed-address $vif_ip; option routers $router_ip; option host-name \"$hostname\"; }"
+ dhcparg_add_entry
+ release_lock "vif-nat-dhcp"
+ "$dhcpd_init_file" restart || true
+}
+
+
+dhcp_down()
+{
+ claim_lock "vif-nat-dhcp"
+ dhcp_remove_entry
+ release_lock "vif-nat-dhcp"
+ "$dhcpd_init_file" restart || true # We need to ignore failure because
+ # ISC dhcpd 3 borks if there is nothing
+ # for it to do, which is the case if
+ # the outgoing interface is not
+ # configured to offer leases and there
+ # are no vifs.
+}
+
+
+case "$command" in
+ online)
+ if ip route | grep -q "dev $vif"
+ then
+ log debug "$vif already up"
+ exit 0
+ fi
+
+ do_or_die ip link set "$vif" up arp on
+ do_or_die ip addr add "$router_ip" dev "$vif"
+ do_or_die ip route add "$vif_ip" dev "$vif" src "$router_ip"
+ echo 1 >/proc/sys/net/ipv4/conf/${vif}/proxy_arp
+ [ "$dhcp" != 'no' ] && dhcp_up
+ ;;
+ offline)
+ [ "$dhcp" != 'no' ] && dhcp_down
+ do_without_error ifconfig "$vif" down
+ ;;
+esac
+
+
+handle_iptable
+
+log debug "Successful vif-nat $command for $vif."
+if [ "$command" = "online" ]
+then
+ success
+fi
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vif-route b/os-plugins/plugins/xen/files/xen.examples/scripts/vif-route
new file mode 100755
index 00000000..f5fd88ed
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vif-route
@@ -0,0 +1,56 @@
+#!/bin/bash
+#============================================================================
+# /etc/xen/vif-route
+#
+# Script for configuring a vif in routed mode.
+# The hotplugging system will call this script if it is specified either in
+# the device configuration given to Xend, or the default Xend configuration
+# in /etc/xen/xend-config.sxp. If the script is specified in neither of those
+# places, then vif-bridge is the default.
+#
+# Usage:
+# vif-route (add|remove|online|offline)
+#
+# Environment vars:
+# vif vif interface name (required).
+# XENBUS_PATH path to this device's details in the XenStore (required).
+#
+# Read from the store:
+# ip list of IP networks for the vif, space-separated (default given in
+# this script).
+#============================================================================
+
+dir=$(dirname "$0")
+. "$dir/vif-common.sh"
+
+main_ip=$(dom0_ip)
+
+case "$command" in
+ online)
+ ifconfig ${vif} ${main_ip} netmask 255.255.255.255 up
+ echo 1 >/proc/sys/net/ipv4/conf/${vif}/proxy_arp
+ ipcmd='add'
+ cmdprefix=''
+ ;;
+ offline)
+ do_without_error ifdown ${vif}
+ ipcmd='del'
+ cmdprefix='do_without_error'
+ ;;
+esac
+
+if [ "${ip}" ] ; then
+ # If we've been given a list of IP addresses, then add routes from dom0 to
+ # the guest using those addresses.
+ for addr in ${ip} ; do
+ ${cmdprefix} ip route ${ipcmd} ${addr} dev ${vif} src ${main_ip}
+ done
+fi
+
+handle_iptable
+
+log debug "Successful vif-route $command for $vif."
+if [ "$command" = "online" ]
+then
+ success
+fi
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vm-monitor b/os-plugins/plugins/xen/files/xen.examples/scripts/vm-monitor
new file mode 100755
index 00000000..1c9a1791
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vm-monitor
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+basedir=$(dirname "$0")
+HA_TICK=2
+
+monitor() {
+ local path=$1
+ local name=$2
+ local uuid=$3
+ local host=$4
+ local count=0
+ path=$path/lock
+
+ while :
+ do
+ echo "name=$name uuid=$uuid host=$host count=$count" > $path
+ count=$(($count+1))
+ sleep $HA_TICK
+ done&
+}
+
+create_lock() {
+ local path=$1/lock
+ local rc=0
+
+ [ -f $path ] || touch $path
+ flock -x -w $HA_TICK $path $basedir/vm-monitor $*
+ rc=$?
+ if [ $rc -eq 1 ]; then
+ echo `cat $path`
+ exit 1
+ else
+ exit $rc
+ fi
+}
+
+if [ $0 = "$basedir/set-lock" ]; then
+ create_lock $*
+elif [ $0 = "$basedir/vm-monitor" ]; then
+ monitor $*
+fi
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vscsi b/os-plugins/plugins/xen/files/xen.examples/scripts/vscsi
new file mode 100755
index 00000000..5ac26147
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vscsi
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# Copyright (c) 2007, FUJITSU Limited
+# Based on the block scripts code.
+#
+
+dir=$(dirname "$0")
+. "$dir/xen-hotplug-common.sh"
+
+findCommand "$@"
+
+case "$command" in
+ add)
+ success
+ ;;
+ remove)
+ # TODO
+ exit 0
+ ;;
+esac
+
+exit 0
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm
new file mode 100755
index 00000000..38a4532f
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+dir=$(dirname "$0")
+. "$dir/vtpm-hotplug-common.sh"
+
+vtpm_fatal_error=0
+
+case "$command" in
+ add)
+ vtpm_create_instance
+ ;;
+ remove)
+ vtpm_remove_instance
+ ;;
+esac
+
+if [ $vtpm_fatal_error -eq 0 ]; then
+ log debug "Successful vTPM operation '$command'."
+ success
+else
+ fatal "Error while executing vTPM operation '$command'."
+fi
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-common.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-common.sh
new file mode 100644
index 00000000..a45868ee
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-common.sh
@@ -0,0 +1,448 @@
+#
+# Copyright (c) 2005 IBM Corporation
+# Copyright (c) 2005 XenSource Ltd.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+dir=$(dirname "$0")
+. "$dir/logging.sh"
+. "$dir/locking.sh"
+
+VTPMDB="/var/vtpm/vtpm.db"
+
+#In the vtpm-impl file some commands should be defined:
+# vtpm_create, vtpm_setup, vtpm_start, etc. (see below)
+if [ -r "$dir/vtpm-impl.alt" ]; then
+ . "$dir/vtpm-impl.alt"
+elif [ -r "$dir/vtpm-impl" ]; then
+ . "$dir/vtpm-impl"
+else
+ function vtpm_create () {
+ true
+ }
+ function vtpm_setup() {
+ true
+ }
+ function vtpm_start() {
+ true
+ }
+ function vtpm_suspend() {
+ true
+ }
+ function vtpm_resume() {
+ true
+ }
+ function vtpm_delete() {
+ true
+ }
+ function vtpm_migrate() {
+ echo "Error: vTPM migration accross machines not implemented."
+ }
+ function vtpm_migrate_local() {
+ echo "Error: local vTPM migration not supported"
+ }
+ function vtpm_migrate_recover() {
+ true
+ }
+fi
+
+
+#Find the instance number for the vtpm given the name of the domain
+# Parameters
+# - vmname : the name of the vm
+# Return value
+# Returns '0' if instance number could not be found, otherwise
+# it returns the instance number in the variable 'instance'
+function vtpmdb_find_instance () {
+ local vmname ret instance
+ vmname=$1
+ ret=0
+
+ instance=$(cat $VTPMDB | \
+ awk -vvmname=$vmname \
+ '{ \
+ if ( 1 != index($1,"#")) { \
+ if ( $1 == vmname ) { \
+ print $2; \
+ exit; \
+ } \
+ } \
+ }')
+ if [ "$instance" != "" ]; then
+ ret=$instance
+ fi
+ echo "$ret"
+}
+
+
+# Check whether a particular instance number is still available
+# returns "0" if it is not available, "1" otherwise.
+function vtpmdb_is_free_instancenum () {
+ local instance instances avail i
+ instance=$1
+ avail=1
+ #Allowed instance number range: 1-255
+ if [ $instance -eq 0 -o $instance -gt 255 ]; then
+ avail=0
+ else
+ instances=$(cat $VTPMDB | \
+ gawk \
+ '{ \
+ if (1 != index($1,"#")) { \
+ printf("%s ",$2); \
+ } \
+ }')
+ for i in $instances; do
+ if [ $i -eq $instance ]; then
+ avail=0
+ break
+ fi
+ done
+ fi
+ echo "$avail"
+}
+
+
+# Get an available instance number given the database
+# Returns an unused instance number
+function vtpmdb_get_free_instancenum () {
+ local ctr instances don found
+ instances=$(cat $VTPMDB | \
+ gawk \
+ '{ \
+ if (1 != index($1,"#")) { \
+ printf("%s ",$2); \
+ } \
+ }')
+ ctr=1
+ don=0
+ while [ $don -eq 0 ]; do
+ found=0
+ for i in $instances; do
+ if [ $i -eq $ctr ]; then
+ found=1;
+ break;
+ fi
+ done
+
+ if [ $found -eq 0 ]; then
+ don=1
+ break
+ fi
+ let ctr=ctr+1
+ done
+ echo "$ctr"
+}
+
+
+# Add a domain name and instance number to the DB file
+function vtpmdb_add_instance () {
+ local res vmname inst
+ vmname=$1
+ inst=$2
+
+ if [ ! -f $VTPMDB ]; then
+ echo "#Database for VM to vTPM association" > $VTPMDB
+ echo "#1st column: domain name" >> $VTPMDB
+ echo "#2nd column: TPM instance number" >> $VTPMDB
+ fi
+ res=$(vtpmdb_validate_entry $vmname $inst)
+ if [ $res -eq 0 ]; then
+ echo "$vmname $inst" >> $VTPMDB
+ fi
+}
+
+
+#Validate whether an entry is the same as passed to this
+#function
+function vtpmdb_validate_entry () {
+ local res rc vmname inst
+ rc=0
+ vmname=$1
+ inst=$2
+
+ res=$(cat $VTPMDB | \
+ gawk -vvmname=$vmname \
+ -vinst=$inst \
+ '{ \
+ if ( 1 == index($1,"#")) {\
+ } else \
+ if ( $1 == vmname && \
+ $2 == inst) { \
+ printf("1"); \
+ exit; \
+ } else \
+ if ( $1 == vmname || \
+ $2 == inst) { \
+ printf("2"); \
+ exit; \
+ } \
+ }')
+
+ if [ "$res" == "1" ]; then
+ rc=1
+ elif [ "$res" == "2" ]; then
+ rc=2
+ fi
+ echo "$rc"
+}
+
+
+#Remove an entry from the vTPM database given its domain name
+#and instance number
+function vtpmdb_remove_entry () {
+ local vmname instance VTPMDB_TMP
+ vmname=$1
+ instance=$2
+ VTPMDB_TMP="$VTPMDB".tmp
+
+ $(cat $VTPMDB | \
+ gawk -vvmname=$vmname \
+ '{ \
+ if ( $1 != vmname ) { \
+ print $0; \
+ } \
+ '} > $VTPMDB_TMP)
+ if [ -e $VTPMDB_TMP ]; then
+ mv -f $VTPMDB_TMP $VTPMDB
+ vtpm_delete $instance
+ else
+ log err "Error creating temporary file '$VTPMDB_TMP'."
+ fi
+}
+
+
+# Find the reason for the creation of this device:
+# Returns 'resume' or 'create'
+function vtpm_get_create_reason () {
+ local resume
+ resume=$(xenstore_read $XENBUS_PATH/resume)
+ if [ "$resume" == "True" ]; then
+ echo "resume"
+ else
+ echo "create"
+ fi
+}
+
+
+#Create a vTPM instance
+# If no entry in the TPM database is found, the instance is
+# created and an entry added to the database.
+function vtpm_create_instance () {
+ local res instance domname reason uuid
+ uuid=$(xenstore_read "$XENBUS_PATH"/uuid)
+ reason=$(vtpm_get_create_reason)
+
+ claim_lock vtpmdb
+
+ instance="0"
+
+ if [ "$uuid" != "" ]; then
+ instance=$(vtpmdb_find_instance $uuid)
+ fi
+ if [ "$instance" == "0" ]; then
+ domname=$(xenstore_read "$XENBUS_PATH"/domain)
+ instance=$(vtpmdb_find_instance $domname)
+ fi
+
+ if [ "$instance" == "0" -a "$reason" != "create" ]; then
+ release_lock vtpmdb
+ return
+ fi
+
+ if [ "$instance" == "0" ]; then
+ #Try to give the preferred instance to the domain
+ instance=$(xenstore_read "$XENBUS_PATH"/pref_instance)
+ if [ "$instance" != "" ]; then
+ res=$(vtpmdb_is_free_instancenum $instance)
+ if [ $res -eq 0 ]; then
+ instance=$(vtpmdb_get_free_instancenum)
+ fi
+ else
+ instance=$(vtpmdb_get_free_instancenum)
+ fi
+
+ vtpm_create $instance
+
+ if [ $vtpm_fatal_error -eq 0 ]; then
+ if [ "$uuid" != "" ]; then
+ vtpmdb_add_instance $uuid $instance
+ else
+ vtpmdb_add_instance $domname $instance
+ fi
+ fi
+ else
+ if [ "$reason" == "resume" ]; then
+ vtpm_resume $instance
+ else
+ vtpm_start $instance
+ fi
+ fi
+
+ release_lock vtpmdb
+
+ xenstore_write $XENBUS_PATH/instance $instance
+}
+
+
+#Remove an instance when a VM is terminating or suspending.
+#Since it is assumed that the VM will appear again, the
+#entry is kept in the VTPMDB file.
+function vtpm_remove_instance () {
+ local instance reason domname uuid
+ #Stop script execution quietly if path does not exist (anymore)
+ xenstore-exists "$XENBUS_PATH"/domain
+ uuid=$(xenstore_read "$XENBUS_PATH"/uuid)
+
+ claim_lock vtpmdb
+
+ instance="0"
+
+ if [ "$uuid" != "" ]; then
+ instance=$(vtpmdb_find_instance $uuid)
+ fi
+
+ if [ "$instance" == "0" ]; then
+ domname=$(xenstore_read "$XENBUS_PATH"/domain)
+ instance=$(vtpmdb_find_instance $domname)
+ fi
+
+ if [ "$instance" != "0" ]; then
+ vtpm_suspend $instance
+ fi
+
+ release_lock vtpmdb
+}
+
+
+#Remove an entry in the VTPMDB file given the domain's name
+#1st parameter: The name of the domain
+function vtpm_delete_instance () {
+ local instance
+
+ claim_lock vtpmdb
+
+ instance=$(vtpmdb_find_instance $1)
+ if [ "$instance" != "0" ]; then
+ vtpmdb_remove_entry $1 $instance
+ fi
+
+ release_lock vtpmdb
+}
+
+# Determine whether the given address is local to this machine
+# Return values:
+# "-1" : the given machine name is invalid
+# "0" : this is not an address of this machine
+# "1" : this is an address local to this machine
+function vtpm_isLocalAddress() {
+ local addr res
+ addr=$(ping $1 -c 1 | \
+ gawk '{ print substr($3,2,length($3)-2); exit }')
+ if [ "$addr" == "" ]; then
+ echo "-1"
+ return
+ fi
+ res=$(ifconfig | grep "inet addr" | \
+ gawk -vaddr=$addr \
+ '{ \
+ if ( addr == substr($2, 6)) {\
+ print "1"; \
+ } \
+ }' \
+ )
+ if [ "$res" == "" ]; then
+ echo "0"
+ return
+ fi
+ echo "1"
+}
+
+# Perform a migration step. This function differentiates between migration
+# to the local host or to a remote machine.
+# Parameters:
+# 1st: destination host to migrate to
+# 2nd: name of the domain to migrate
+# 3rd: the migration step to perform
+function vtpm_migration_step() {
+ local res=$(vtpm_isLocalAddress $1)
+ if [ "$res" == "0" ]; then
+ vtpm_migrate $1 $2 $3
+ else
+ vtpm_migrate_local
+ fi
+}
+
+# Recover from migration due to an error. This function differentiates
+# between migration to the local host or to a remote machine.
+# Parameters:
+# 1st: destination host the migration was going to
+# 2nd: name of the domain that was to be migrated
+# 3rd: the last successful migration step that was done
+function vtpm_recover() {
+ local res
+ res=$(vtpm_isLocalAddress $1)
+ if [ "$res" == "0" ]; then
+ vtpm_migrate_recover $1 $2 $3
+ fi
+}
+
+
+#Determine the domain id given a domain's name.
+#1st parameter: name of the domain
+#return value: domain id or -1 if domain id could not be determined
+function vtpm_domid_from_name () {
+ local id name ids
+ ids=$(xenstore-list /local/domain)
+ for id in $ids; do
+ name=$(xenstore-read /local/domain/$id/name)
+ if [ "$name" == "$1" ]; then
+ echo "$id"
+ return
+ fi
+ done
+ echo "-1"
+}
+
+#Determine the virtual TPM's instance number using the domain ID.
+#1st parm: domain ID
+function vtpm_uuid_by_domid() {
+ echo $(xenstore-read /local/domain/0/backend/vtpm/$1/0/uuid)
+}
+
+
+# Determine the vTPM's UUID by the name of the VM
+function vtpm_uuid_from_vmname() {
+ local domid=$(vtpm_domid_from_name $1)
+ if [ "$domid" != "-1" ]; then
+ echo $(vtpm_uuid_by_domid $domid)
+ return
+ fi
+ echo ""
+}
+
+#Add a virtual TPM instance number and its associated domain name
+#to the VTPMDB file and activate usage of this virtual TPM instance
+#by writing the instance number into the xenstore
+#1st parm: name of virtual machine
+#2nd parm: instance of associated virtual TPM
+function vtpm_add_and_activate() {
+ local domid=$(vtpm_domid_from_name $1)
+ local vtpm_uuid=$(vtpm_uuid_from_vmname $1)
+ if [ "$vtpm_uuid" != "" -a "$domid" != "-1" ]; then
+ vtpmdb_add_instance $vtpm_uuid $2
+ xenstore-write backend/vtpm/$domid/0/instance $2
+ fi
+}
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-delete b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-delete
new file mode 100755
index 00000000..b75b95bf
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-delete
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+# This scripts must be called the following way:
+# vtpm-delete <vtpm uuid>
+# or
+# vtpm-delete --vmname <vm name>
+
+dir=$(dirname "$0")
+. "$dir/vtpm-common.sh"
+
+if [ "$1" == "--vmname" ]; then
+ vtpm_uuid=$(vtpm_uuid_from_vmname $2)
+ if [ "$vtpm_uuid" != "" ];then
+ vtpm_delete_instance $vtpm_uuid
+ fi
+else
+ vtpm_delete_instance $1
+fi
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-hotplug-common.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-hotplug-common.sh
new file mode 100644
index 00000000..9fd35e74
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-hotplug-common.sh
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2005 IBM Corporation
+# Copyright (c) 2005 XenSource Ltd.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+dir=$(dirname "$0")
+. "$dir/xen-hotplug-common.sh"
+
+findCommand "$@"
+if [ "$command" != "online" ] &&
+ [ "$command" != "offline" ] &&
+ [ "$command" != "add" ] &&
+ [ "$command" != "remove" ]
+then
+ log err "Invalid command: $command"
+ exit 1
+fi
+
+
+XENBUS_PATH="${XENBUS_PATH:?}"
+
+. "$dir/vtpm-common.sh"
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-impl b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-impl
new file mode 100644
index 00000000..4f9a1fd8
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-impl
@@ -0,0 +1,208 @@
+#!/bin/bash
+# ===================================================================
+#
+# Copyright (c) 2005, Intel Corp.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the name of Intel Corporation nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+# ===================================================================
+
+# | SRC | TAG | CMD SIZE | ORD |mtype|strt
+TPM_CMD_OPEN=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x11\\x01\\x00\\x00\\x01\\x01\\x01
+TPM_CMD_RESM=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x11\\x01\\x00\\x00\\x01\\x01\\x02
+TPM_CMD_CLOS=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x0e\\x01\\x00\\x00\\x02
+TPM_CMD_DELE=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x0e\\x01\\x00\\x00\\x03
+
+TPM_TYPE_PVM=\\x01
+TPM_TYPE_HVM=\\x02
+
+TPM_SUCCESS=00000000
+
+TX_VTPM_MANAGER=/var/vtpm/fifos/from_console.fifo
+RX_VTPM_MANAGER=/var/vtpm/fifos/to_console.fifo
+
+VTPM_MIG=/usr/bin/vtpm_migrator
+
+# -------------------- Helpers for binary streams -----------
+
+function str_to_hex32() {
+ printf "%0.8x" $1
+}
+
+function hex32_to_bin() {
+ local inst=$(str_to_hex32 $1);
+
+ local n1=`echo $inst | sed 's/\(..\)....../\\\\x\1/'`
+ local n2=`echo $inst | sed 's/..\(..\)..../\\\\x\1/'`
+ local n3=`echo $inst | sed 's/....\(..\)../\\\\x\1/'`
+ local n4=`echo $inst | sed 's/......\(..\)/\\\\x\1/'`
+
+ echo "$n1$n2$n3$n4"
+}
+
+function vtpm_manager_cmd() {
+ local cmd=$1;
+ local inst=$2;
+ local inst_bin=$(hex32_to_bin $inst);
+
+ claim_lock vtpm_mgr
+
+ #send cmd to vtpm_manager
+ printf "$cmd$inst_bin" > $TX_VTPM_MANAGER
+
+ #recv response
+ set +e
+ local resp_hex=`dd skip=10 bs=1 count=4 if=$RX_VTPM_MANAGER 2> /dev/null | xxd -ps`
+ set -e
+
+ release_lock vtpm_mgr
+
+ #return whether the command was successful
+ if [ $resp_hex -ne $TPM_SUCCESS ]; then
+ vtpm_fatal_error=1
+ false
+ else
+ true
+ fi
+}
+
+# Helper to get vm type to pass to vtpm_manager open/resume
+function vtpm_get_type() {
+ local inst=$(xenstore_read $XENBUS_PATH/frontend-id)
+ local vm=$(xenstore_read /local/domain/$inst/vm)
+ if [ "$vm" != "" ]; then
+ local ostype=$(xenstore-read $vm/image/ostype)
+ if [ "$ostype" == "hvm" ]; then
+ echo $TPM_TYPE_HVM;
+ else
+ echo $TPM_TYPE_PVM;
+ fi
+ fi
+}
+
+# ------------------ Command handlers -----------------
+
+# Create new vtpm instance & set it up for use
+function vtpm_create () {
+ # Creation is handled implicitly by the manager on first setup
+ # so just set it up for use
+ $(vtpm_start $1)
+}
+
+# Setup vtpm instance for use.
+function vtpm_start() {
+ local vmtype=$(vtpm_get_type);
+ $(vtpm_manager_cmd $TPM_CMD_OPEN$vmtype $1)
+}
+
+function vtpm_resume() {
+ local vmtype=$(vtpm_get_type);
+ $(vtpm_manager_cmd $TPM_CMD_RESM$vmtype $1)
+}
+
+# Reset the vtpm AKA clear PCRs
+function vtpm_reset() {
+ #not used by current implemenation
+ true
+}
+
+# Shutdown the vtpm while the vm is down
+# This could be a suspend of shutdown
+# we cannot distinquish, so save the state
+# and decide on startup if we should keep is
+function vtpm_suspend() {
+ $(vtpm_manager_cmd $TPM_CMD_CLOS $1)
+}
+
+
+function vtpm_delete() {
+ local inst=$1
+ if $(vtpm_manager_cmd $TPM_CMD_DELE $inst); then
+ rm -f /var/vtpm/vtpm_dm_$1.data
+ true
+ else
+ vtpm_fatal_error=1
+ false
+ fi
+}
+
+# Perform a migration step. This function differentiates between migration
+# to the local host or to a remote machine.
+# Parameters:
+# 1st: destination host to migrate to
+# 2nd: name of the domain to migrate
+# 3rd: the migration step to perform
+function vtpm_migrate() {
+ local instance res
+
+ instance=$(vtpmdb_find_instance $2)
+ if [ "$instance" == "" ]; then
+ log err "VTPM Migratoin failed. Unable to translation of domain name"
+ echo "Error: VTPM Migration failed while looking up instance number"
+ fi
+
+ case "$3" in
+ 0)
+ #Incicate migration supported
+ echo "0"
+ ;;
+
+ 1)
+ # Get Public Key from Destination
+ # Call vtpm_manager's migration part 1
+ claim_lock vtpm_mgr
+ $VTPM_MIG $1 $2 $instance $3
+ release_lock vtpm_mgr
+ ;;
+
+ 2)
+ # Call manager's migration step 2 and send result to destination
+ # If successful remove from db
+ claim_lock vtpm_mgr
+ $VTPM_MIG $1 $2 $instance $3
+ release_lock vtpm_mgr
+ ;;
+
+ 3)
+ if `ps x | grep "$VTPM_MIG $1"`; then
+ log err "VTPM Migration failed to complete."
+ echo "Error: VTPM Migration failed to complete."
+ fi
+ ;;
+ esac
+
+}
+
+
+function vtpm_migrate_recover() {
+ echo "Error: Recovery not supported yet"
+}
+
+function vtpm_migrate_local() {
+ echo "Error: local vTPM migration not supported"
+}
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-migration.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-migration.sh
new file mode 100644
index 00000000..7e38ae26
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/vtpm-migration.sh
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2005 IBM Corporation
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+dir=$(dirname "$0")
+. "$dir/vtpm-common.sh"
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/xen-hotplug-cleanup b/os-plugins/plugins/xen/files/xen.examples/scripts/xen-hotplug-cleanup
new file mode 100755
index 00000000..706359d0
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/xen-hotplug-cleanup
@@ -0,0 +1,36 @@
+#! /bin/bash
+
+dir=$(dirname "$0")
+. "$dir/xen-hotplug-common.sh"
+
+# Claim the lock protecting /etc/xen/scripts/block. This stops a race whereby
+# paths in the store would disappear underneath that script as it attempted to
+# read from the store checking for device sharing.
+# Any other scripts that do similar things will have to have their lock
+# claimed too.
+# This is pretty horrible, but there's not really a nicer way of solving this.
+claim_lock "block"
+
+# split backend/DEVCLASS/VMID/DEVID on slashes
+path_array=( ${XENBUS_PATH//\// } )
+# get /vm/UUID path
+vm=$(xenstore_read_default "/local/domain/${path_array[2]}/vm" "")
+# construct /vm/UUID/device/DEVCLASS/DEVID
+if [ "$vm" != "" ]; then
+ vm_dev="$vm/device/${path_array[1]}/${path_array[3]}"
+else
+ vm_dev=
+fi
+
+# remove device frontend store entries
+xenstore-rm -t \
+ $(xenstore-read "$XENBUS_PATH/frontend" 2>/dev/null) 2>/dev/null || true
+
+# remove device backend store entries
+xenstore-rm -t "$XENBUS_PATH" 2>/dev/null || true
+xenstore-rm -t "error/$XENBUS_PATH" 2>/dev/null || true
+
+# remove device path from /vm/UUID
+[ "$vm_dev" != "" ] && xenstore-rm -t "$vm_dev" 2>/dev/null || true
+
+release_lock "block"
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/xen-hotplug-common.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/xen-hotplug-common.sh
new file mode 100644
index 00000000..980a6270
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/xen-hotplug-common.sh
@@ -0,0 +1,93 @@
+#
+# Copyright (c) 2005 XenSource Ltd.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+
+dir=$(dirname "$0")
+. "$dir/logging.sh"
+. "$dir/xen-script-common.sh"
+. "$dir/locking.sh"
+
+exec 2>>/var/log/xen/xen-hotplug.log
+
+export PATH="/sbin:/bin:/usr/bin:/usr/sbin:$PATH"
+export LANG="POSIX"
+unset $(set | grep ^LC_ | cut -d= -f1)
+
+fatal() {
+ xenstore_write "$XENBUS_PATH/hotplug-error" "$*" \
+ "$XENBUS_PATH/hotplug-status" error
+ log err "$@"
+ exit 1
+}
+
+success() {
+ # Tell DevController that backend is "connected"
+ xenstore_write "$XENBUS_PATH/hotplug-status" connected
+}
+
+do_or_die() {
+ "$@" || fatal "$@ failed"
+}
+
+do_without_error() {
+ "$@" 2>/dev/null || log debug "$@ failed"
+}
+
+sigerr() {
+ fatal "$0 failed; error detected."
+}
+
+trap sigerr ERR
+
+
+##
+# xenstore_read <path>+
+#
+# Read each of the given paths, returning each result on a separate line, or
+# exit this script if any of the paths is missing.
+#
+xenstore_read() {
+ local v=$(xenstore-read "$@" || true)
+ [ "$v" != "" ] || fatal "xenstore-read $@ failed."
+ echo "$v"
+}
+
+
+##
+# xenstore_read_default <path> <default>
+#
+# Read the given path, returning the value there or the given default if the
+# path is not present.
+#
+xenstore_read_default() {
+ xenstore-read "$1" 2>/dev/null || echo "$2"
+}
+
+
+##
+# xenstore_write (<path> <value>)+
+#
+# Write each of the key/value pairs to the store, and exit this script if any
+# such writing fails.
+#
+xenstore_write() {
+ log debug "Writing $@ to xenstore."
+ xenstore-write "$@" || fatal "Writing $@ to xenstore failed."
+}
+
+
+log debug "$@" "XENBUS_PATH=$XENBUS_PATH"
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/xen-network-common.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/xen-network-common.sh
new file mode 100644
index 00000000..7014333d
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/xen-network-common.sh
@@ -0,0 +1,118 @@
+#
+# Copyright (c) 2005 XenSource Ltd.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+
+# Gentoo doesn't have ifup/ifdown, so we define appropriate alternatives.
+
+# Other platforms just use ifup / ifdown directly.
+
+##
+# preiftransfer
+#
+# @param $1 The current name for the physical device, which is also the name
+# that the virtual device will take once the physical device has
+# been renamed.
+
+if ! which ifup >/dev/null 2>/dev/null
+then
+ preiftransfer()
+ {
+ true
+ }
+ ifup()
+ {
+ false
+ }
+ ifdown()
+ {
+ false
+ }
+else
+ preiftransfer()
+ {
+ true
+ }
+fi
+
+
+first_file()
+{
+ t="$1"
+ shift
+ for file in $@
+ do
+ if [ "$t" "$file" ]
+ then
+ echo "$file"
+ return
+ fi
+ done
+}
+
+find_dhcpd_conf_file()
+{
+ first_file -f /etc/dhcp3/dhcpd.conf /etc/dhcpd.conf
+}
+
+
+find_dhcpd_init_file()
+{
+ first_file -x /etc/init.d/{dhcp3-server,dhcp,dhcpd}
+}
+
+find_dhcpd_arg_file()
+{
+ first_file -f /etc/sysconfig/dhcpd /etc/defaults/dhcp /etc/default/dhcp3-server
+}
+
+# configure interfaces which act as pure bridge ports:
+setup_bridge_port() {
+ local dev="$1"
+
+ # take interface down ...
+ ip link set ${dev} down
+
+ # ... and configure it
+ ip addr flush ${dev}
+}
+
+# Usage: create_bridge bridge
+create_bridge () {
+ local bridge=$1
+
+ # Don't create the bridge if it already exists.
+ if [ ! -e "/sys/class/net/${bridge}/bridge" ]; then
+ brctl addbr ${bridge}
+ brctl stp ${bridge} off
+ brctl setfd ${bridge} 0
+ fi
+}
+
+# Usage: add_to_bridge bridge dev
+add_to_bridge () {
+ local bridge=$1
+ local dev=$2
+
+ # Don't add $dev to $bridge if it's already on a bridge.
+ if [ -e "/sys/class/net/${bridge}/brif/${dev}" ]; then
+ ip link set ${dev} up || true
+ return
+ fi
+ brctl addif ${bridge} ${dev}
+ ip link set ${dev} up
+}
+
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/xen-script-common.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/xen-script-common.sh
new file mode 100644
index 00000000..f6841acf
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/xen-script-common.sh
@@ -0,0 +1,44 @@
+#
+# Copyright (c) 2005 XenSource Ltd.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+
+set -e
+
+
+evalVariables()
+{
+ for arg in "$@"
+ do
+ if expr 'index' "$arg" '=' '>' '1' >/dev/null
+ then
+ eval "$arg"
+ fi
+ done
+}
+
+
+findCommand()
+{
+ for arg in "$@"
+ do
+ if ! expr 'index' "$arg" '=' >/dev/null
+ then
+ command="$arg"
+ return
+ fi
+ done
+}
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/xend-relocation.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/xend-relocation.sh
new file mode 100755
index 00000000..1f1cd061
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/xend-relocation.sh
@@ -0,0 +1,159 @@
+#!/bin/bash
+#============================================================================
+# xend-relocation
+#
+# Version = 1.0.3
+# Date = 2007-09-14
+#
+# Maintainer(s) = Ron Terry - ron (at) pronetworkconsulting (dot) com
+#
+# The latest version can be found at:
+#
+# http://pronetworkconsulting.com/linux/scripts/xend-relocation.html
+#
+# Description:
+#
+# This script is used to enable or disable the VM relocation (migration)
+# feature of xend. It can be used to manage the local instance of xend
+# or both the local instance and instances of xend on the other machines
+# to/from which VMs can be relocated.
+# To manage the instances of xend on other machines this script communicates
+# using ssh so it is recomended that if you use this feature you
+# pre-distribute ssh keys between the servers.
+#
+# Depends on:
+#
+# Can use: /etc/sysconfig/xend
+#
+# Usage: xend-relocation (start|stop|status)
+# or
+# xend-relocation (on|off|status)
+#
+# Vars:
+#
+# XEN_CONFIG_FILE
+#
+# RELOCATION_NODELIST
+#
+# MANAGE_ALL_RELOCATION_NODES
+#
+# XEN_RELOCATION_PORT
+#
+#============================================================================
+
+#### Read config files and set variables ##################################
+
+# If you source the /etc/sysconfig/xend file comment out the variables
+# being set in this script.
+
+. /etc/sysconfig/xend
+
+XEN_CONFIG_FILE="/etc/xen/xend-config.sxp"
+
+#### Script Functions #####################################################
+
+usage(){
+ echo ""
+ echo "Usage: xend-relocation {start|stop|status}"
+ echo " or"
+ echo " xend-relocation {on|off|status}"
+ echo ""
+}
+
+relocate_on() {
+ for NODE in $RELOCATION_NODELIST
+ do
+ case $NODE in
+ any)
+ SSHCMD=""
+ RELOCATION_NODELIST=""
+ ;;
+ *)
+ if [ "$MANAGE_ALL_RELOCATION_NODES" = "true" ]
+ then
+ SSHCMD="ssh root@$NODE "
+ else
+ SSHCMD=""
+ fi
+ ;;
+ esac
+
+ $SSHCMD sed -i "s/^#(xend-relocation-server yes)/(xend-relocation-server yes)/g" $XEN_CONFIG_FILE
+ $SSHCMD sed -i "s/^#(xend-relocation-server no)/(xend-relocation-server yes)/g" $XEN_CONFIG_FILE
+ $SSHCMD sed -i "s/^#(xend-relocation-port [^)]*)/(xend-relocation-port $XEN_RELOCATION_PORT)/g" $XEN_CONFIG_FILE
+ $SSHCMD sed -i "s/^(xend-relocation-hosts-allow \(.*\)/###(xend-relocation-hosts-allow \1/g" $XEN_CONFIG_FILE
+ $SSHCMD sed -i "s/^#(xend-relocation-hosts-allow .*/(xend-relocation-hosts-allow \'$RELOCATION_NODELIST')/g" $XEN_CONFIG_FILE
+ $SSHCMD rcxend restart
+
+ if [ "$NODE" = "any" ] || [ "$MANAGE_ALL_RELOCATION_NODES" = "false" ]
+ then
+ exit 0
+ fi
+ done
+}
+
+relocate_off() {
+ for NODE in $RELOCATION_NODELIST
+ do
+ case $NODE in
+ any)
+ SSHCMD=""
+ RELOCATION_NODELIST=""
+ ;;
+ *)
+ SSHCMD="ssh root@$NODE "
+ ;;
+ esac
+
+ $SSHCMD sed -i "s/^(xend-relocation-server yes)/#(xend-relocation-server yes)/g" $XEN_CONFIG_FILE
+ $SSHCMD sed -i "s/^(xend-relocation-port [^)]*)/#(xend-relocation-port $XEN_RELOCATION_PORT)/g" $XEN_CONFIG_FILE
+ $SSHCMD sed -i "s/^(xend-relocation-hosts-allow .*/#(xend-relocation-hosts-allow \'$RELOCATION_NODELIST')/g" $XEN_CONFIG_FILE
+ $SSHCMD rcxend restart
+
+ if [ "$NODE" = "any" ] || [ "$MANAGE_ALL_RELOCATION_NODES" = "false" ]
+ then
+ exit 0
+ fi
+ done
+}
+
+relocate_status() {
+ if grep -q "^(xend-relocation-server .*yes)" $XEN_CONFIG_FILE
+ then
+ ENABLED="yes"
+ elif egrep -q "(^\(xend-relocation-server .*no\)|^#\(xend-relocation-server .*no\)|^#\(xend-relocation-server .*yes\))" $XEN_CONFIG_FILE
+ then
+ ENABLED="no"
+ fi
+
+ echo ""
+ echo "Xend Relocation Server Enabled: $ENABLED"
+ echo ""
+}
+
+#### Script Body ##########################################################
+
+case $1 in
+ on|ON|On|start)
+ case $ENABLE_RELOCATION in
+ true)
+ relocate_on
+ ;;
+ false)
+ ;;
+ esac
+ exit 0
+ ;;
+ off|OFF|Off|stop)
+ relocate_off
+ exit 0
+ ;;
+ status|STATUS|Status)
+ relocate_status
+ exit 0
+ ;;
+ *)
+ usage
+ exit 1
+ ;;
+esac
diff --git a/os-plugins/plugins/xen/files/xen.examples/scripts/xmclone.sh b/os-plugins/plugins/xen/files/xen.examples/scripts/xmclone.sh
new file mode 100755
index 00000000..fd31249b
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/scripts/xmclone.sh
@@ -0,0 +1,793 @@
+#! /bin/bash
+
+# Script to clone Xen Dom-Us.
+# Based on XenClone by Glen Davis; rewritten by Bob Brandt.
+# Further extended and restructured by Manfred Hollstein.
+# Copyright (C) 2007 Manfred Hollstein, SUSE / Novell Inc.
+#
+# 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
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
+# USA.
+
+#
+# Defaults
+#
+VERSION=0.4.5
+XEN_CONFIGS=/etc/xen/vm/
+XEN_BASE=/var/lib/xen/images/
+SOURCE=
+DESTINATION=
+DUPLICATE=0
+HOSTNAME=
+IP=
+MAC=
+PART=2
+DOMU_IS_FILE_BASED=
+DOMU_ROOTDEV=
+FORCE=no
+
+
+#
+# Subroutines used in this script
+#
+
+# Display the usage information for this script
+function usage ()
+{
+ cat << EOF
+Usage: ${0##*/} [-h|--help] [-v|--version] [--force] [-c dir] [-b dir] [-d]
+ [-n hostname] [-i address] [-m address]
+ [-p number-of-root-partition-within-domU]
+ [-t target-device]
+ SourcedomU NewdomU
+
+Clones a domU, and gives a new Host name, MAC address and possibly IP address.
+Once finished the new domU should boot without any additional configuration.
+Currently works with single NIC, and basic bridge setup. Tested with cloning
+a SLES10 install created from the SLES10 YaST Xen module.
+
+ -h, --help Display this help message.
+ -v, --version Display the version of this program.
+ --force Silently overwrite files when destination already exists.
+ -c Xen configuration directory which defaults to:
+ $XEN_CONFIGS
+ -b Xen image base directory which defaults to:
+ $XEN_BASE
+ -d Duplicate only, do not modify attributes.
+ -n Hostname to be used, if not specified the NewdomU name
+ will be used.
+ -i IP address to be used, if not specified the IP address
+ will not be changed.
+ -m MAC address to be used, if not specified a psuedo-random
+ address will be used based on the ip address with the
+ format: 00:16:3e:BB:CC:DD
+ Where BB,CC,DD are the Hex octals of the IP address.
+ -p This script assumes that the second partition on any
+ writable disk of the domU to be cloned holds the root
+ file system in which attributes have to be changed.
+ If this is not the case for you, you can specify the
+ partition number using this flag.
+ -t If the SourcedomU uses a block device for its root/
+ boot directory, you need to specify the new block
+ device for NewdomU.
+
+From XENSource Networking WIKI (http://wiki.xensource.com/xenwiki/XenNetworking)
+Virtualised network interfaces in domains are given Ethernet MAC addresses. When
+choosing MAC addresses to use, ensure you choose a unicast address. That is, one
+with the low bit of the first octet set to zero. For example, an address
+starting aa: is OK but ab: is not.
+It is best to keep to the range of addresses declared to be "locally assigned"
+(rather than allocated globally to hardware vendors). These have the second
+lowest bit set to one in the first octet. For example, aa: is OK, a8: isn't.
+
+Exit status is 0 if OK, 1 if minor problems, 2 if serious trouble.
+EOF
+}
+
+# Display the version information for this script
+function version ()
+{
+ cat << EOF
+${0##*/} (Xen VM clone utility) $VERSION
+${0##*/} comes with ABSOLUTELY NO WARRANTY.
+This is free software, and you are welcome to redistribute it under the terms
+of the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
+
+Written by Manfred Hollstein, based on work by Glen Davis and Bob Brandt.
+EOF
+}
+
+# Find/Replace text within a file
+function replace ()
+{
+ sed -i -e "s!$1!$2!g" "$3"
+}
+
+#
+# Find the first entry that names a writable image or device, assuming
+# the Dom-U is going to boot from it:
+#
+function get_first_writable_image ()
+{
+ local i
+
+ for i in $@
+ do
+ case $i in
+ # Match the first entry like "'phy:/dev/md0,xvda,w',"
+ *",w'," )
+ # Strip off the leading "'" character:
+ i="${i#*\'}"
+ # Strip off the final trailing "',"
+ echo "${i%*\',}"
+ return
+ ;;
+ esac
+ done
+}
+
+#
+# Extract just the protocol and the file/device name part from a disk entry:
+#
+function extract_proto_and_filename ()
+{
+ echo "$1" | cut -d, -f1
+}
+
+
+#
+# Make sure this script is run by the superuser root
+#
+if [ `id -u` -ne 0 ]
+then
+ echo "You must be root to run this script!" >&2
+ exit 1
+fi
+
+
+#
+# Process the parameters
+#
+# Must look for double -- arguments before calling getopts
+#
+if [ "$1" = "--version" ]
+then
+ version
+ exit 0
+fi
+if [ "$1" = "--help" ]
+then
+ usage
+ exit 0
+fi
+if [ "$1" = "--force" ]
+then
+ FORCE=yes
+ shift
+fi
+while getopts ":b:c:dhi:m:n:p:t:v" opt
+do
+ case $opt in
+ b )
+ XEN_BASE=$OPTARG
+ ;;
+ c )
+ XEN_CONFIGS=$OPTARG
+ ;;
+ d )
+ DUPLICATE=1
+ ;;
+ h )
+ usage
+ exit 1
+ ;;
+ i )
+ IP=$OPTARG
+ ;;
+ m )
+ MAC=$OPTARG
+ ;;
+ n )
+ HOSTNAME=$OPTARG
+ ;;
+ p )
+ PART=$OPTARG
+ ;;
+ t )
+ DOMU_ROOTDEV=$OPTARG
+ ;;
+ v )
+ version
+ exit 0
+ ;;
+ esac
+done
+shift $(($OPTIND-1))
+
+if [ $# -ne 2 ]
+then
+ echo "Illegal number of arguments passed!" >&2
+ echo "" >&2
+ usage
+ exit 1
+fi
+
+SOURCE=$1
+DESTINATION=$2
+
+
+#
+# Verify the Source and Destination parameters
+#
+# The source and destination should be relative directory names without
+# trailing /'s. If the source does have a full path, use that path as the
+# value for XEN_BASE. Otherwise remove all but the last part of the path
+# for both source and destination
+#
+SOURCEDIR=${SOURCE%/*}
+SOURCEBASE=${SOURCE##*/}
+if [ "$SOURCEDIR" != "$SOURCEBASE" ]
+then
+ XEN_BASE=$SOURCEDIR"/"
+ SOURCE=$SOURCEBASE
+fi
+SOURCE=${SOURCE##*/}
+DESTINATION=${DESTINATION##*/}
+
+
+#
+# Verify the Xen Config and Source parameters
+#
+# Verify the validity of each argument, ask the user if there is a problem
+while [ ! -d "$XEN_CONFIGS" ]
+do
+ cat << EOF >&2
+$XEN_CONFIGS either does not exist or is not a directory.
+Please enter a valid directory.
+EOF
+ read -e -p "Xen Configuration Directory? " XEN_CONFIGS
+done
+while [ ! -d "$XEN_BASE" ]
+do
+ cat << EOF >&2
+$XEN_BASE either does not exist or is not a directory.
+Please enter a valid directory.
+EOF
+ read -e -p "Xen Image Base Directory? " XEN_BASE
+done
+
+#
+# Directories should have a / after them
+#
+[ "$XEN_CONFIGS" != "" ] && XEN_CONFIGS="${XEN_CONFIGS%/}/"
+[ "$XEN_BASE" != "" ] && XEN_BASE="${XEN_BASE%/}/"
+
+
+#
+# Verify that actual image and configuration file exist
+#
+while :
+do
+ if [ ! -f "$XEN_CONFIGS$SOURCE" ]
+ then
+ echo "The $XEN_CONFIGS$SOURCE file does not exist." >&2
+ echo "Please select a valid file." >&2
+ FILES=
+ for FILE in `ls $XEN_CONFIGS`
+ do
+ # If the entry is a file
+ [ -f "$XEN_CONFIGS$FILE" ] &&
+ FILES="$FILES $XEN_CONFIGS$FILE"
+ done
+ if [ -z "$FILES" ]
+ then
+ echo "There are no suitable files beneath $XEN_CONFIGS" >&2
+ exit 1
+ fi
+ echo "Files beneath $XEN_CONFIGS"
+ select FILE in $FILES
+ do
+ if [ -f "$FILE" ]
+ then
+ SOURCE=${FILE##*/}
+ break
+ fi
+ echo "Invalid Selection." >&2
+ done
+ else
+ #
+ # Figure out what type of image we're using:
+ #
+ BOOTENTRY=$(get_first_writable_image $(sed -n -e 's,^disk[ ]*=[ ]*\[\(.*\)\],\1,p' "$XEN_CONFIGS$SOURCE"))
+ case "$BOOTENTRY" in
+ phy:* )
+ DOMU_IS_FILE_BASED=no
+ ;;
+ file:* | \
+ tap:aio:* )
+ DOMU_IS_FILE_BASED=yes
+ ;;
+ * )
+ echo "Don't know how to deal with the boot protocol/device you appear to be using: $BOOTENTRY" >&2
+ echo "These are the ones this script supports: \"phy:*\", \"file:*\", \"tap:aio:*\"" >&2
+ exit 1
+ ;;
+ esac
+ fi
+
+
+ if [ ${DOMU_IS_FILE_BASED} = yes ]
+ then
+ if [ ! -d "$XEN_BASE$SOURCE" ]
+ then
+ echo "The directory $XEN_BASE$SOURCE is invalid." >&2
+ echo "Please select another one." >&2
+ FILES=
+ for FILE in `ls $XEN_BASE`
+ do
+ # If the entry is a directory and
+ # it is not empty
+ [ -d "$XEN_BASE$FILE" ] &&
+ [ "`ls $XEN_BASE$FILE`" != "" ] &&
+ FILES="$FILES $XEN_BASE$FILE"
+ done
+ if [ -z "$FILES" ]
+ then
+ echo "There are no suitable directories beneath $XEN_BASE" >&2
+ exit 1
+ fi
+ echo "Directories beneath $XEN_BASE"
+ select FILE in $FILES
+ do
+ if [ -d "$FILE" ]
+ then
+ SOURCE=${FILE##*/}
+ break
+ fi
+ echo "Invalid Selection." >&2
+ done
+ continue
+ fi
+ break
+
+ else # DomU is using some block device
+ while [ ! -b "${DOMU_ROOTDEV}" ] || [ ! -w "${DOMU_ROOTDEV}" ]
+ do
+ read -e -p "You need to specify a valid block device for the new target DomU: " DOMU_ROOTDEV
+ done
+ break
+
+ fi
+done
+BOOTIMAGE="$(echo $BOOTENTRY | awk -F : '{ print $NF }' | sed -e 's:,[^,]*,[^,]*$::')"
+
+
+#
+# Verify that the destination location does not already have an image or
+# config file
+#
+while [ -z "$DESTINATION" ]
+do
+ echo "You have not specified a Destination." >&2
+ read -e -p "New Destination? " DESTINATION
+done
+while :
+do
+ if [ -f "$XEN_CONFIGS$DESTINATION" ] && [ $FORCE = no ]
+ then
+ echo "The target configuration file $XEN_CONFIGS$DESTINATION already exists!" >&2
+ read -e -p "Please select a new Destination? " DESTINATION
+ fi
+ if [ ${DOMU_IS_FILE_BASED} = yes ]
+ then
+ if [ -d "$XEN_BASE$DESTINATION" ] && [ $FORCE = no ]
+ then
+ echo "The target image location $XEN_BASE$DESTINATION already exists!" >&2
+ read -p "Please select a new Destination? " DESTINATION
+ continue
+ fi
+ fi
+ break
+done
+
+
+#
+# Verify the network parameters (if Duplicate Only was not selected)
+#
+if [ $DUPLICATE -eq 0 ]
+then
+ if [ -z "$HOSTNAME" ]
+ then
+ echo "You have not entered a host name. If you wish to, enter one now." >&2
+ read -p "New host name? (Default: $DESTINATION) " HOSTNAME
+ fi
+ [ -z "$HOSTNAME" ] && HOSTNAME=$DESTINATION
+
+ if [ -z "$IP" ]
+ then
+ echo "You have not specified an IP Address. If you wish to change the IP address, enter one now."
+ read -p "New IP Address? " IP
+ fi
+ while [ -n "$IP" ] && [ "${IP/*.*.*.*/ok}" != "ok" ]
+ do
+ echo "The IP Address you specified is invalid. If you wish, enter a new one now."
+ read -p "New IP Address? " IP
+ [ -z "$IP" ] && break
+ done
+
+ if [ -z "$MASK" ]
+ then
+ echo "You have not specified a network mask in bits. Please enter one now. Default is 24 "
+ read -p "Network mask? " MASK
+ fi
+ while [ -n "$MASK" ] && [ "${MASK/**/ok}" != "ok" ]
+ do
+ echo "The Network mask you specified is invalid. If you wish, enter a new one now."
+ read -p "Network mask? " MASK
+ [ -z "$MASK" ] && MASK=24
+ done
+
+ if [ -z "$MAC" ]
+ then
+ newMAC=""
+ newMACtext="(format 01:23:45:67:89:AB)"
+ # If the IP Address is specified and the MAC isn't, generate one.
+ if [ -n "$IP" ]
+ then
+ octal1=${IP%%.*}
+ IP=${IP#*.}
+ octal2=${IP%%.*}
+ IP=${IP#*.}
+ octal3=${IP%%.*}
+ octal4=${IP#*.}
+ IP="$octal1.$octal2.$octal3.$octal4"
+ octal1="00"`echo $octal1 16 o p | dc | tr '[:upper:]' '[:lower:]'`
+ octal2="00"`echo $octal2 16 o p | dc | tr '[:upper:]' '[:lower:]'`
+ octal3="00"`echo $octal3 16 o p | dc | tr '[:upper:]' '[:lower:]'`
+ octal4="00"`echo $octal4 16 o p | dc | tr '[:upper:]' '[:lower:]'`
+ newMAC="00:16:3e:"${octal2:(-2)}":"${octal3:(-2)}":"${octal4:(-2)}
+ newMACtext="(default $newMAC)"
+ fi
+ echo "You have not specified a MAC Address. If you wish to change the MAC address, enter one now."
+ read -p "New MAC Address? $newMACtext " MAC
+ [ -z "$MAC" ] && MAC=$newMAC
+ fi
+
+ while [ "$MAC" != "" ] && [ "${MAC/[[:xdigit:]][[:xdigit:]]:[[:xdigit:]][[:xdigit:]]:[[:xdigit:]][[:xdigit:]]:[[:xdigit:]][[:xdigit:]]:[[:xdigit:]][[:xdigit:]]:[[:xdigit:]][[:xdigit:]]/ok}" != "ok" ]
+ do
+ echo "The MAC Address you specified is invalid. If you wish, enter a new one now."
+ read -p "New MAC Address? (format 01:23:45:67:89:AB) " MAC
+ [ -z "$MAC" ] && break
+ done
+else
+ HOSTNAME=
+ IP=
+ MASK=
+ MAC=
+fi
+
+
+#
+# Make sure that the source VM is not running
+#
+xmid=`xm domid "$SOURCE" 2>/dev/null`
+if [ $? -eq 0 ] && [ -n "$xmid" ] && [ -z "${xmid//[[:digit:]]/}" ]
+then
+ echo "domU $SOURCE is currently running on Xen, please shutdown before cloning." >&2
+ echo "The command \"xm shutdown $xmid -w\" will shutdown the domU" >&2
+ exit 1
+fi
+
+
+#
+# Copy the Xen Config file
+#
+SOURCECONFIG="$XEN_CONFIGS$SOURCE"
+DESTCONFIG="$XEN_CONFIGS$DESTINATION"
+echo "Copying Configuration files"
+if ! cp -fv "$SOURCECONFIG" "$DESTCONFIG"
+then
+ echo "The Config file $SOURCECONFIG could not be copied to $DESTCONFIG" >&2
+ exit 1
+fi
+
+
+#
+# Edit newly copied configuration file
+#
+echo "Editing config file ($DESTCONFIG), correcting the new domU Name."
+if ! replace "$SOURCE" "$DESTINATION" "$DESTCONFIG"
+then
+ echo "Unable to change the domU name in $DESTCONFIG from $SOURCE to $DESTINATION" >&2
+ exit 1
+fi
+
+if [ $DUPLICATE -eq 0 ]
+then
+ oldUUID=`grep "^uuid[ ]*=.*$" $DESTCONFIG`
+ if [ x"${oldUUID}" = x ]
+ then
+ echo 'uuid="'`uuidgen`'"' >> $DESTCONFIG
+ else
+ sed -i -e 's,^uuid[ ]*=.*$,uuid="'`uuidgen`'",' $DESTCONFIG
+ fi
+fi
+
+if [ $DUPLICATE -eq 0 ] && [ -n "$MAC" ]
+then
+ # Get the vif line in the config file
+ oldMAC=`grep "vif[ ]*=[ ]*" $DESTCONFIG`
+ # extract everything between the square brackets
+ oldMAC=${oldMAC#*[}
+ oldMAC=${oldMAC%*]}
+ # using the single quotes as delimiters, get the second field
+ # (this script can only deal with one adapter!)
+ oldMAC=`echo "$oldMAC" | cut -f2 -d\'`
+ # remove the mac= from the beginning
+ oldMAC=${oldMAC#mac=*}
+
+ if ! replace "$oldMAC" "$MAC" "$DESTCONFIG"
+ then
+ echo "Unable to change the MAC address in $DESTCONFIG from ($oldMAC) to ($MAC)" >&2
+ exit 1
+ fi
+fi
+
+
+#
+# Create and Copy image directory
+#
+
+if [ $DOMU_IS_FILE_BASED = yes ]
+then
+ SOURCEXEN="$XEN_BASE$SOURCE/"
+ DESTXEN="$XEN_BASE$DESTINATION/"
+ echo "Creating the new image directory $DESTXEN"
+ if ! mkdir -pv --mode=755 "$DESTXEN"
+ then
+ echo "Unable to create the directory $DESTXEN" >&2
+ exit 1
+ fi
+ echo "Copying complete image. (This may take a few minutes!)"
+
+ tar -C $SOURCEXEN -cSf - --exclude=lost+found `cd $SOURCEXEN; echo *` \
+ | tar -C $DESTXEN -xvBSpf -
+ if [ $? -ne 0 ]
+ then
+ echo "Unable to copy the images from $SOURCEXEN to $DESTXEN" >&2
+ exit 1
+ fi
+else # Deal with block devices
+ if [ $DUPLICATE -eq 0 ]
+ then
+ echo "Editing config file ($DESTCONFIG), correcting the new domU root device name."
+ if ! replace ":$BOOTIMAGE," ":$DOMU_ROOTDEV," "$DESTCONFIG"
+ then
+ echo "Unable to change the domU root device name in $DESTCONFIG from $BOOTIMAGE to $DOMU_ROOTDEV" >&2
+ exit 1
+ fi
+ fi
+ echo "Copying from source block device ($BOOTIMAGE) to the new target device ($DOMU_ROOTDEV)"
+ echo "(This may take a few minutes!)"
+ if ! dd if=$BOOTIMAGE of=$DOMU_ROOTDEV bs=4K
+ then
+ echo "Failed to copy from $BOOTIMAGE to $DOMU_ROOTDEV" >&2
+ exit 1
+ fi
+fi
+
+
+#
+# The rest of the script only applies if we are actually making changes within
+# the image
+#
+if [ $DUPLICATE -eq 0 ]
+then
+ #
+ # Create a temporary directory name
+ #
+ tmpdir=$(mktemp -d)
+ if [ $? -ne 0 ]
+ then
+ echo "Unable to create temporary directory $tmpdir." >&2
+ exit 1
+ fi
+
+ if [ $DOMU_IS_FILE_BASED = yes ]
+ then
+ set -- $(echo $DESTXEN*)
+ else
+ set -- $(echo $DOMU_ROOTDEV)
+ fi
+
+ for DISKIMAGE
+ do
+ # Silently ignore any directories (lost+found comes to mind):
+ [ -d $DISKIMAGE ] && continue
+
+ #
+ # Mount the newly copied image file
+ #
+ loopdev=''
+ for dev in /dev/loop*
+ do
+ if [ ! -b "$dev" ]
+ then
+ continue
+ fi
+
+ status=$(losetup "$dev" 2>/dev/null) || status=''
+
+ if [ ! "$status" ]
+ then
+ status=$(losetup $dev "$DISKIMAGE")
+ if [ ! "$status" ]
+ then
+ kpartx -a $dev
+ loopdev=$dev
+ break
+ fi
+ fi
+ done
+ if [ ! "$loopdev" ]
+ then
+ echo "No loopback devices available." >&2
+ exit 1
+ fi
+
+ echo -n "Trying to mount partition $PART of $DISKIMAGE ... "
+ mapperdev=$(echo "$loopdev" | sed -e 's/dev\//dev\/mapper\//g')p$PART
+ status=$(mount -o rw $mapperdev "$tmpdir")
+ if [ "$status" ]
+ then
+ kpartx -d $loopdev
+ losetup -d $loopdev
+ continue
+ fi
+ echo "succeeded."
+
+ pushd "$tmpdir" > /dev/null
+
+ #
+ # Find out if we are looking at SLE10
+ #
+ SLE10=
+ if [ -f etc/SuSE-release ]
+ then
+ OSVER=`cat etc/SuSE-release | sed -n 1p | awk -F'(' '{ print $1 }' | sed 's/ $//g'`
+ if [ "$OSVER" == "openSUSE 10" -o \
+ "$OSVER" == "SUSE Linux Enterprise Server 10" -o \
+ "$OSVER" == "SUSE Linux Enterprise Desktop 10" ]
+ then
+ SLE10=1
+ fi
+ fi
+
+ #
+ # Change the Network Configuration in the mounted image file
+ #
+ if [ -n "$MAC" ]
+ then
+ if [ -d etc/sysconfig/network/ ]
+ then
+ echo "Changing the Network configuration in the newly copied image."
+ pushd "etc/sysconfig/network/" > /dev/null
+ # Find the ifcfg-ethMACADDRESS file in the
+ # newly copied image
+ ETH0=`ls | grep ifcfg-eth | cut -f1`
+ if [ -z "$ETH0" ]
+ then
+ echo "Unable to find ethernet file in image file" 2>&1
+ cd /tmp; umount "$tmpdir"; rmdir "$tmpdir"
+ kpartx -d $loopdev
+ losetup -d $loopdev
+ exit 1
+ fi
+ if [ "$SLE10" ]
+ then
+ mv -f "$ETH0" ifcfg-eth-id-$MAC
+ else
+ sed -i -e "s,^LLADDR=.*$,LLADDR=\'$MAC\'," \
+ ifcfg-eth0
+ fi
+ popd > /dev/null
+ fi
+
+ if [ -d etc/udev/rules.d/ ]
+ then
+ # The 30-net_persistent_names.rules or 70-persistent-net.rules
+ # file controls which interface to use.
+ # By removing the SUBSYSTEM== lines, we force
+ # the system to recreate it.
+ pushd "etc/udev/rules.d/" > /dev/null
+ if [ "$SLE10" ]
+ then
+ sed -i -e "/SUBSYSTEM==/d" \
+ 30-net_persistent_names.rules
+ else
+ sed -i -e "/SUBSYSTEM==/d" \
+ 70-persistent-net.rules
+ fi
+ popd > /dev/null
+ fi
+ fi
+
+ #
+ # Change the IP Address in the mounted image file
+ #
+ if [ -n "$IP" ]
+ then
+ if [ -d etc/sysconfig/network/ ]
+ then
+ echo "Modify the IP Address of the new domU."
+
+ pushd "etc/sysconfig/network/" > /dev/null
+ if [ "$SLE10" ]
+ then
+ sed -i -e "s,^IPADDR=.*$,IPADDR=$IP," \
+ ifcfg-eth-id-$MAC
+ else
+ sed -i -e "s,^IPADDR=.*$,IPADDR=$IP/$MASK," \
+ ifcfg-eth0
+ fi
+ popd > /dev/null
+ fi
+ fi
+
+ #
+ # Change the HOSTNAME and hosts files in the mounted image file
+ #
+ if [ -n "$HOSTNAME" ]
+ then
+ if [ -d "etc/" ]
+ then
+ echo "Changing HOSTNAME file to $HOSTNAME."
+
+ pushd "etc/" > /dev/null
+ # using the period as a delimiter, select the
+ # first entry for the hostname
+ oldHOSTNAME=`cut -f1 -d\. HOSTNAME`
+ if ! replace "$oldHOSTNAME" "$HOSTNAME" "HOSTNAME"
+ then
+ echo "Unable to change the HOSTNAME from $oldHOSTNAME to $HOSTNAME" >&2
+ cd /tmp; umount "$tmpdir"; rmdir "$tmpdir"
+ kpartx -d $loopdev
+ losetup -d $loopdev
+ exit 1
+ fi
+ FQDN=`cat HOSTNAME`
+
+ # Add entries for the new domU to /etc/hosts,
+ # if it doesn't already include them:
+ if ! egrep -q "[[:space:]]$FQDN[^[:alnum:]]" \
+ hosts
+ then
+ echo "Changing hosts file."
+ echo -e "$IP\t$FQDN $HOSTNAME" >> hosts
+ fi
+ popd > /dev/null
+ fi
+ fi
+
+ popd > /dev/null
+ umount "$tmpdir"
+ kpartx -d $loopdev
+ losetup -d $loopdev
+ done
+
+ rmdir "$tmpdir"
+fi
+
+echo "Clone is complete. domU $DESTCONFIG is ready to start!"
+exit 0
diff --git a/os-plugins/plugins/xen/files/xen.examples/xenapiusers b/os-plugins/plugins/xen/files/xen.examples/xenapiusers
new file mode 100644
index 00000000..d8649da3
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/xenapiusers
@@ -0,0 +1 @@
+root
diff --git a/os-plugins/plugins/xen/files/xen.examples/xend-config-xenapi.sxp b/os-plugins/plugins/xen/files/xen.examples/xend-config-xenapi.sxp
new file mode 100644
index 00000000..d80083ad
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/xend-config-xenapi.sxp
@@ -0,0 +1,193 @@
+# -*- sh -*-
+
+#
+# Xend configuration file.
+#
+
+# This example configuration is appropriate for an installation that
+# utilizes a bridged network configuration. Access to xend via http
+# is disabled.
+
+# Commented out entries show the default for that entry, unless otherwise
+# specified.
+
+#(logfile /var/log/xen/xend.log)
+#(loglevel DEBUG)
+
+
+# The Xen-API server configuration. (Please note that this server is
+# available as an UNSUPPORTED PREVIEW in Xen 3.0.4, and should not be relied
+# upon).
+#
+# This value configures the ports, interfaces, and access controls for the
+# Xen-API server. Each entry in the list starts with either unix, a port
+# number, or an address:port pair. If this is "unix", then a UDP socket is
+# opened, and this entry applies to that. If it is a port, then Xend will
+# listen on all interfaces on that TCP port, and if it is an address:port
+# pair, then Xend will listen on the specified port, using the interface with
+# the specified address.
+#
+# The subsequent string configures the user-based access control for the
+# listener in question. This can be one of "none" or "pam", indicating either
+# that users should be allowed access unconditionally, or that the local
+# Pluggable Authentication Modules configuration should be used. If this
+# string is missing or empty, then "pam" is used.
+#
+# The final string gives the host-based access control for that listener. If
+# this is missing or empty, then all connections are accepted. Otherwise,
+# this should be a space-separated sequence of regular expressions; any host
+# with a fully-qualified domain name or an IP address that matches one of
+# these regular expressions will be accepted.
+#
+# Example: listen on TCP port 9363 on all interfaces, accepting connections
+# only from machines in example.com or localhost, and allow access through
+# the unix domain socket unconditionally:
+#
+ (xen-api-server ((9363 none)))
+# (unix none)))
+#
+# Optionally, the TCP Xen-API server can use SSL by specifying the private
+# key and certificate location:
+#
+# (9367 pam '' /etc/xen/xen-api.key /etc/xen/xen-api.crt)
+#
+# Default:
+# (xen-api-server ((unix)))
+
+
+#(xend-http-server no)
+#(xend-unix-server no)
+#(xend-tcp-xmlrpc-server no)
+#(xend-unix-xmlrpc-server yes)
+#(xend-relocation-server no)
+(xend-relocation-server yes)
+
+#(xend-unix-path /var/lib/xend/xend-socket)
+
+
+# Address and port xend should use for the legacy TCP XMLRPC interface,
+# if xen-tcp-xmlrpc-server is set.
+#(xen-tcp-xmlrpc-server-address 'localhost')
+#(xen-tcp-xmlrpc-server-port 8006)
+
+# SSL key and certificate to use for the legacy TCP XMLRPC interface.
+# Setting these will mean that this port serves only SSL connections as
+# opposed to plaintext ones.
+#(xend-tcp-xmlrpc-server-ssl-key-file /etc/xen/xmlrpc.key)
+#(xend-tcp-xmlrpc-server-ssl-cert-file /etc/xen/xmlrpc.crt)
+
+
+# Port xend should use for the HTTP interface, if xend-http-server is set.
+#(xend-port 8000)
+
+# Port xend should use for the relocation interface, if xend-relocation-server
+# is set.
+#(xend-relocation-port 8002)
+
+# Address xend should listen on for HTTP connections, if xend-http-server is
+# set.
+# Specifying 'localhost' prevents remote connections.
+# Specifying the empty string '' (the default) allows all connections.
+#(xend-address '')
+#(xend-address localhost)
+
+# Address xend should listen on for relocation-socket connections, if
+# xend-relocation-server is set.
+# Meaning and default as for xend-address above.
+#(xend-relocation-address '')
+
+# The hosts allowed to talk to the relocation port. If this is empty (the
+# default), then all connections are allowed (assuming that the connection
+# arrives on a port and interface on which we are listening; see
+# xend-relocation-port and xend-relocation-address above). Otherwise, this
+# should be a space-separated sequence of regular expressions. Any host with
+# a fully-qualified domain name or an IP address that matches one of these
+# regular expressions will be accepted.
+#
+# For example:
+# (xend-relocation-hosts-allow '^localhost$ ^.*\\.example\\.org$')
+#
+#(xend-relocation-hosts-allow '')
+(xend-relocation-hosts-allow '^localhost$ ^localhost\\.localdomain$')
+
+# The limit (in kilobytes) on the size of the console buffer
+#(console-limit 1024)
+
+##
+# To bridge network traffic, like this:
+#
+# dom0: ----------------- bridge -> real eth0 -> the network
+# |
+# domU: fake eth0 -> vifN.0 -+
+#
+# use
+#
+# (network-script network-bridge)
+#
+# Your default ethernet device is used as the outgoing interface, by default.
+# To use a different one (e.g. eth1) use
+#
+# (network-script 'network-bridge netdev=eth1')
+#
+# The bridge is named xenbr0, by default. To rename the bridge, use
+#
+# (network-script 'network-bridge bridge=<name>')
+#
+# It is possible to use the network-bridge script in more complicated
+# scenarios, such as having two outgoing interfaces, with two bridges, and
+# two fake interfaces per guest domain. To do things like this, write
+# yourself a wrapper script, and call network-bridge from it, as appropriate.
+#
+(network-script network-bridge)
+
+# The script used to control virtual interfaces. This can be overridden on a
+# per-vif basis when creating a domain or a configuring a new vif. The
+# vif-bridge script is designed for use with the network-bridge script, or
+# similar configurations.
+#
+# If you have overridden the bridge name using
+# (network-script 'network-bridge bridge=<name>') then you may wish to do the
+# same here. The bridge name can also be set when creating a domain or
+# configuring a new vif, but a value specified here would act as a default.
+#
+# If you are using only one bridge, the vif-bridge script will discover that,
+# so there is no need to specify it explicitly.
+#
+(vif-script vif-bridge)
+
+
+## Use the following if network traffic is routed, as an alternative to the
+# settings for bridged networking given above.
+#(network-script network-route)
+#(vif-script vif-route)
+
+
+## Use the following if network traffic is routed with NAT, as an alternative
+# to the settings for bridged networking given above.
+#(network-script network-nat)
+#(vif-script vif-nat)
+
+
+# Dom0 will balloon out when needed to free memory for domU.
+# dom0-min-mem is the lowest memory level (in MB) dom0 will get down to.
+# If dom0-min-mem=0, dom0 will never balloon out.
+(dom0-min-mem 196)
+
+# In SMP system, dom0 will use dom0-cpus # of CPUS
+# If dom0-cpus = 0, dom0 will take all cpus available
+(dom0-cpus 0)
+
+# Whether to enable core-dumps when domains crash.
+#(enable-dump no)
+
+# The tool used for initiating virtual TPM migration
+#(external-migration-tool '')
+
+# The interface for VNC servers to listen on. Defaults
+# to 127.0.0.1 To restore old 'listen everywhere' behaviour
+# set this to 0.0.0.0
+#(vnc-listen '127.0.0.1')
+
+# The default password for VNC console on HVM domain.
+# Empty string is no authentication.
+(vncpasswd '')
diff --git a/os-plugins/plugins/xen/files/xen.examples/xend-config.sxp b/os-plugins/plugins/xen/files/xen.examples/xend-config.sxp
new file mode 100644
index 00000000..f91f5726
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/xend-config.sxp
@@ -0,0 +1,323 @@
+# -*- sh -*-
+
+#
+# Xend configuration file.
+#
+
+# This example configuration is appropriate for an installation that
+# utilizes a bridged network configuration. Access to xend via http
+# is disabled.
+
+# Commented out entries show the default for that entry, unless otherwise
+# specified.
+
+#(logfile /var/log/xen/xend.log)
+#(loglevel DEBUG)
+
+# Uncomment the line below. Set the value to flask, acm, or dummy to
+# select a security module.
+
+#(xsm_module_name dummy)
+
+# The Xen-API server configuration.
+#
+# This value configures the ports, interfaces, and access controls for the
+# Xen-API server. Each entry in the list starts with either unix, a port
+# number, or an address:port pair. If this is "unix", then a UDP socket is
+# opened, and this entry applies to that. If it is a port, then Xend will
+# listen on all interfaces on that TCP port, and if it is an address:port
+# pair, then Xend will listen on the specified port, using the interface with
+# the specified address.
+#
+# The subsequent string configures the user-based access control for the
+# listener in question. This can be one of "none" or "pam", indicating either
+# that users should be allowed access unconditionally, or that the local
+# Pluggable Authentication Modules configuration should be used. If this
+# string is missing or empty, then "pam" is used.
+#
+# The final string gives the host-based access control for that listener. If
+# this is missing or empty, then all connections are accepted. Otherwise,
+# this should be a space-separated sequence of regular expressions; any host
+# with a fully-qualified domain name or an IP address that matches one of
+# these regular expressions will be accepted.
+#
+# Example: listen on TCP port 9363 on all interfaces, accepting connections
+# only from machines in example.com or localhost, and allow access through
+# the unix domain socket unconditionally:
+#
+# (xen-api-server ((9363 pam '^localhost$ example\\.com$')
+# (unix none)))
+#
+# Optionally, the TCP Xen-API server can use SSL by specifying the private
+# key and certificate location:
+#
+# (9367 pam '' /etc/xen/xen-api.key /etc/xen/xen-api.crt)
+#
+# Default:
+# (xen-api-server ((unix)))
+
+
+#(xend-http-server no)
+(xend-unix-server yes)
+#(xend-tcp-xmlrpc-server no)
+#(xend-unix-xmlrpc-server yes)
+# Only enable xend-relocation-server on trusted networks as it lacks
+# encryption and authentication.
+#(xend-relocation-server no)
+#(xend-relocation-ssl-server no)
+#(xend-udev-event-server no)
+
+#(xend-unix-path /var/lib/xend/xend-socket)
+
+
+# Address and port xend should use for the legacy TCP XMLRPC interface,
+# if xend-tcp-xmlrpc-server is set.
+#(xend-tcp-xmlrpc-server-address 'localhost')
+#(xend-tcp-xmlrpc-server-port 8006)
+
+# SSL key and certificate to use for the legacy TCP XMLRPC interface.
+# Setting these will mean that this port serves only SSL connections as
+# opposed to plaintext ones.
+#(xend-tcp-xmlrpc-server-ssl-key-file /etc/xen/xmlrpc.key)
+#(xend-tcp-xmlrpc-server-ssl-cert-file /etc/xen/xmlrpc.crt)
+
+
+# Port xend should use for the HTTP interface, if xend-http-server is set.
+#(xend-port 8000)
+
+# Port xend should use for the relocation interface, if xend-relocation-server
+# is set.
+#(xend-relocation-port 8002)
+
+# Port xend should use for the ssl relocation interface, if
+# xend-relocation-ssl-server is set.
+#(xend-relocation-ssl-port 8003)
+
+# SSL key and certificate to use for the ssl relocation interface, if
+# xend-relocation-ssl-server is set.
+#(xend-relocation-server-ssl-key-file /etc/xen/xmlrpc.key)
+#(xend-relocation-server-ssl-cert-file /etc/xen/xmlrpc.crt)
+
+# Whether to use ssl as default when relocating.
+#(xend-relocation-ssl no)
+
+# Address xend should listen on for HTTP connections, if xend-http-server is
+# set.
+# Specifying 'localhost' prevents remote connections.
+# Specifying the empty string '' (the default) allows all connections.
+#(xend-address '')
+#(xend-address localhost)
+
+# Address xend should listen on for relocation-socket connections, if
+# xend-relocation-server is set.
+# Meaning and default as for xend-address above.
+#(xend-relocation-address '')
+
+# The hosts allowed to talk to the relocation port. If this is empty (the
+# default), then all connections are allowed (assuming that the connection
+# arrives on a port and interface on which we are listening; see
+# xend-relocation-port and xend-relocation-address above). Otherwise, this
+# should be a space-separated sequence of regular expressions. Any host with
+# a fully-qualified domain name or an IP address that matches one of these
+# regular expressions will be accepted.
+#
+# For example:
+# (xend-relocation-hosts-allow '^localhost$ ^.*\\.example\\.org$')
+#
+#(xend-relocation-hosts-allow '')
+(xend-relocation-hosts-allow '^localhost$ ^localhost\\.localdomain$')
+
+# The limit (in kilobytes) on the size of the console buffer
+#(console-limit 1024)
+
+##
+# To bridge network traffic, like this:
+#
+# dom0: ----------------- bridge -> real eth0 -> the network
+# |
+# domU: fake eth0 -> vifN.0 -+
+#
+# use
+#
+# (network-script network-bridge)
+#
+# Your default ethernet device is used as the outgoing interface, by default.
+# To use a different one (e.g. eth1) use
+#
+# (network-script 'network-bridge netdev=eth1')
+#
+# The bridge takes on the ethernet device name by default. To rename the
+# bridge, use
+#
+# (network-script 'network-bridge bridge=<name>')
+#
+# It is possible to use the network-bridge script in more complicated
+# scenarios, such as having two outgoing interfaces, with two bridges, and
+# two fake interfaces per guest domain. To do things like this, write
+# yourself a wrapper script, and call network-bridge from it, as appropriate.
+#
+# SuSE users note:
+# On openSUSE >= 11.1 and SLES >= 11, networks should be configured using
+# native platform tool - YaST. vif-bridge and qemu-ifup can be used to
+# connect vifs to the YaST-managed networks.
+#(network-script network-bridge)
+(network-script )
+
+# The script used to control virtual interfaces. This can be overridden on a
+# per-vif basis when creating a domain or a configuring a new vif. The
+# vif-bridge script is designed for use with the network-bridge script, or
+# similar configurations.
+#
+# If you have overridden the bridge name using
+# (network-script 'network-bridge bridge=<name>') then you may wish to do the
+# same here. The bridge name can also be set when creating a domain or
+# configuring a new vif, but a value specified here would act as a default.
+#
+# If you are using only one bridge, the vif-bridge script will discover that,
+# so there is no need to specify it explicitly.
+#
+(vif-script vif-bridge)
+
+
+## Use the following if network traffic is routed, as an alternative to the
+# settings for bridged networking given above.
+#(network-script network-route)
+#(vif-script vif-route)
+
+
+## Use the following if network traffic is routed with NAT, as an alternative
+# to the settings for bridged networking given above.
+#(network-script network-nat)
+#(vif-script vif-nat)
+
+# dom0-min-mem is the lowest permissible memory level (in MB) for dom0.
+# This is a minimum both for auto-ballooning (as enabled by
+# enable-dom0-ballooning below) and for xm mem-set when applied to dom0.
+(dom0-min-mem 512)
+
+# Whether to enable auto-ballooning of dom0 to allow domUs to be created.
+# If enable-dom0-ballooning = no, dom0 will never balloon out.
+(enable-dom0-ballooning yes)
+
+# In SMP system, dom0 will use dom0-cpus # of CPUS
+# If dom0-cpus = 0, dom0 will take all cpus available
+(dom0-cpus 0)
+
+# Whether to enable core-dumps when domains crash.
+#(enable-dump no)
+
+# The tool used for initiating virtual TPM migration
+#(external-migration-tool '')
+
+# The interface for VNC servers to listen on. Defaults
+# to 127.0.0.1 To restore old 'listen everywhere' behaviour
+# set this to 0.0.0.0
+#(vnc-listen '127.0.0.1')
+
+# The default password for VNC console on HVM domain.
+# Empty string is no authentication.
+(vncpasswd '')
+
+# The VNC server can be told to negotiate a TLS session
+# to encryption all traffic, and provide x509 cert to
+# clients enalbing them to verify server identity. The
+# GTK-VNC widget, virt-viewer, virt-manager and VeNCrypt
+# all support the VNC extension for TLS used in QEMU. The
+# TightVNC/RealVNC/UltraVNC clients do not.
+#
+# To enable this create x509 certificates / keys in the
+# directory /etc/xen/vnc
+#
+# ca-cert.pem - The CA certificate
+# server-cert.pem - The Server certificate signed by the CA
+# server-key.pem - The server private key
+#
+# and then uncomment this next line
+# (vnc-tls 1)
+
+# The certificate dir can be pointed elsewhere..
+#
+# (vnc-x509-cert-dir /etc/xen/vnc)
+
+# The server can be told to request & validate an x509
+# certificate from the client. Only clients with a cert
+# signed by the trusted CA will be able to connect. This
+# is more secure the password auth alone. Passwd auth can
+# used at the same time if desired. To enable client cert
+# checking uncomment this:
+#
+# (vnc-x509-verify 1)
+
+# The default keymap to use for the VM's virtual keyboard
+# when not specififed in VM's configuration
+#(keymap 'en-us')
+
+# Script to run when the label of a resource has changed.
+#(resource-label-change-script '')
+
+# Rotation count of qemu-dm log file.
+#(qemu-dm-logrotate-count 10)
+
+# Path where persistent domain configuration is stored.
+# Default is /var/lib/xend/domains/
+#
+#(xend-domains-path /var/lib/xend/domains)
+
+# Domain Locking
+# In a multihost environment, domain locking prevents simultaneously
+# running a domain on more than one host.
+#
+# If enabled, xend will execute a external lock utility (defined below)
+# on each domain start and stop event. Disabled by default. Set to yes
+# to enable domain locking.
+#
+#(xend-domain-lock no)
+
+# Path where domain lock is stored if xend-domain-lock is enabled.
+# Note: This path must be accessible to all VM Servers participating
+# in domain locking, e.g. by specifying a shared mount point.
+# Lock is placed in /<xend-domain-lock-path>/<domain-uuid>.
+# Default is /var/lib/xend/domains/
+#
+#(xend-domain-lock-path /var/lib/xend/domains)
+
+# External locking utility called by xend for acquiring/releasing
+# domain lock. By default /etc/xen/scripts/domain-lock will be used
+# if xend-domain-lock is set to yes. Set to path of custom locking
+# utility to override the default.
+#
+# Synopsis of lock-util:
+# lock-util [-l|-u] -n <vm name> -i <vm uuid> -p <physical host> path"
+# -l Acquire (create) lock
+# -u Remove lock
+# -n vm-name Name of domain
+# -i vm-id Id or UUID of domain
+# -p phy-host Name of physical host (dom0)
+# path /<xend-domain-lock-path>/<vm-uuid>
+# Return 0 on success, non-zero on error.
+#
+# lock-util [-s] path"
+# -s Lock status. If lock is acquired, print any contents
+# on stdout and return 0. Return non-zero if lock is
+# available.
+# path /<xend-domain-lock-path>/<vm-uuid>
+# If lock is acquired, print any contents on stdout and return 0.
+# Return non-zero if lock is available.
+#
+# Default lock-util behavior:
+# On domain start event, domain-lock will create and flock(1)
+# /<xend-domain-lock-path>/<vm-uuid>/lock. Every two seconds it
+# will write <vm-name>, <vm-id>, <vm-host>, and <tick> to the lock.
+# <tick> is running counter.
+# On domain stop event, domain-lock will unlock and remove
+# /<xend-domain-lock-path>/<vm-uuid>/lock.
+#
+# Note: If xend-domain-lock-path is a cluster-unaware file system,
+# administrator intervention may be required to remove stale
+# locks. Consider two hosts using NFS for xend-domain-lock-path
+# when HostA, running vm1, crashes. HostB could not acquire a
+# lock for vm1 since the NFS server holds an exclusive lock
+# acquired by HostA. The lock file must be manually removed
+# before starting vm1 on HostA.
+#
+#(xend-domain-lock-utility domain-lock)
diff --git a/os-plugins/plugins/xen/files/xen.examples/xend-pci-permissive.sxp b/os-plugins/plugins/xen/files/xen.examples/xend-pci-permissive.sxp
new file mode 100644
index 00000000..1a3fb90a
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/xend-pci-permissive.sxp
@@ -0,0 +1,27 @@
+###############################################################################
+# Configuration file for granting quiry PCI devices full write access to their
+# configuration space. This file should only be used when you are unable to
+# determine the exact registers required by your device. Even so, it should
+# be used only temporarily.
+#
+# SEND A MESSAGE TO xen-devel@lists.xensource.com IF YOU USE THIS FILE.
+#
+# Using this file should NOT be necessary. If you must use it to make some
+# device work, send a message to the above list with as much information about
+# your device as possible so the developers can make accomodations for it.
+# Once developers make the necessary updates you can remove the corresponding
+# entry for your device.
+###############################################################################
+# Entries are formated as follows: <vendor>:<device>[:<subvendor>:<subdevice>]
+#
+# Example: Appending to an existing list
+#
+# (unconstrained_dev_ids
+# ('XXXX:XXXX:XXXX:XXXX' # existing entry
+# 'YYYY:YYYY:YYYY:YYYY' # new entry 1
+# 'ZZZZ:ZZZZ') # new entry 2
+# )
+###############################################################################
+(unconstrained_dev_ids
+ #('0123:4567:89AB:CDEF')
+)
diff --git a/os-plugins/plugins/xen/files/xen.examples/xend-pci-quirks.sxp b/os-plugins/plugins/xen/files/xen.examples/xend-pci-quirks.sxp
new file mode 100644
index 00000000..6bce4b8a
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/xend-pci-quirks.sxp
@@ -0,0 +1,96 @@
+###############################################################################
+# Configuration file for quirky PCI devices that require write-access to
+# parts of the configuration space. Use this file to specific PCI device
+# IDs and the configuration space fields to which those devices must be
+# able to write.
+#
+# Length is important, so be sure to match new entries with the
+# lengths of comparable existing entries.
+#
+# Additions to this file take effect as soon as a new domain with a
+# matching device is started. However, to remove a field that was
+# previously applied to a device you must unbind the device from
+# pciback.
+###############################################################################
+# This is a bogus entry to show how a new device would be added to the list
+#
+# (new_quirky_dev_name
+# (pci_ids
+# ('0123:4567:890A:BCEF')
+# )
+#
+# (pci_config_space_fields
+# ('12345678:1:00000000')
+# )
+# )
+###############################################################################
+
+(tg3
+ (pci_ids
+ # Entries are formated as follows:
+ # <vendor>:<device>[:<subvendor>:<subdevice>]
+ ('14e4:1644' # Broadcom Tigon3 5700
+ '14e4:1645' # Broadcom Tigon3 5701
+ '14e4:1646' # Broadcom Tigon3 5702
+ '14e4:1647' # Broadcom Tigon3 5703
+ '14e4:1648' # Broadcom Tigon3 5704
+ '14e4:164d' # Broadcom Tigon3 5702FE
+ '14e4:1653' # Broadcom Tigon3 5705
+ '14e4:1654' # Broadcom Tigon3 5705_2
+ '14e4:165d' # Broadcom Tigon3 5705M
+ '14e4:165e' # Broadcom Tigon3 5705M_2
+ '14e4:16a6' # Broadcom Tigon3 5702X
+ '14e4:16a7' # Broadcom Tigon3 5703X
+ '14e4:16a8' # Broadcom Tigon3 5704S
+ '14e4:16c6' # Broadcom Tigon3 5702A3
+ '14e4:16c7' # Broadcom Tigon3 5703A3
+ '14e4:1696' # Broadcom Tigon3 5782
+ '14e4:169c' # Broadcom Tigon3 5788
+ '14e4:169d' # Broadcom Tigon3 5789
+ '14e4:170d' # Broadcom Tigon3 5901
+ '14e4:1649' # Broadcom Tigon3 5704S_2
+ '14e4:166e' # Broadcom Tigon3 5705F
+ '14e4:1658' # Broadcom Tigon3 5720
+ '14e4:1659' # Broadcom Tigon3 5721
+ '14e4:1676' # Broadcom Tigon3 5750
+ '14e4:1677' # Broadcom Tigon3 5751
+ '14e4:167c' # Broadcom Tigon3 5750M
+ '14e4:167d' # Broadcom Tigon3 5751M
+ '14e4:167e' # Broadcom Tigon3 5751F
+ '14e4:1600' # Broadcom Tigon3 5752
+ '14e4:1601' # Broadcom Tigon3 5752M
+ '14e4:16f7' # Broadcom Tigon3 5753
+ '14e4:16fd' # Broadcom Tigon3 5753M
+ '14e4:16fe' # Broadcom Tigon3 5753F
+ '14e4:1668' # Broadcom Tigon3 5714
+ '14e4:1678' # Broadcom Tigon3 5715
+ '14e4:166a' # Broadcom Tigon3 5780
+ '14e4:166b' # Broadcom Tigon3 5780S
+ '14e4:16dd' # Broadcom Tigon3 5781
+ '1148:4400' # Syskonnect 9DXX
+ '1148:4500' # Syskonnect 9MXX
+ '173b:03e8' # Altima AC1000
+ '173b:03e9' # Altima AC1001
+ '173b:03eb' # Altima AC1003
+ '173b:03ea' # Altima AC9100
+ '106b:1645') # Apple Tigon3
+ )
+
+ (pci_config_space_fields
+ # Entries are formated as follows:
+ # <register>:<size>:<mask>
+ # size is measured in bytes (1,2,4 are valid sizes)
+ # mask is currently unused; use all zero's
+ ('00000078:4:00000000' # TG3PCI_REG_BASE_ADDR
+ '0000007c:4:00000000' # TG3PCI_MEM_WIN_BASE_ADDR
+ '00000080:4:00000000' # TG3PCI_REG_DATA
+ '00000084:4:00000000' # TG3PCI_MEM_WIN_DATA
+ '00000090:4:00000000' # TG3PCI_MISC_LOCAL_CTRL
+ '00000068:4:00000000' # TG3PCI_MISC_HOST_CTRL
+ '0000009C:4:00000000' # TG3PCI_STD_RING_PROD_IDX + TG3_64BIT_REG_LOW
+ '00000098:4:00000000' # TG3PCI_STD_RING_PROD_IDX + TG3_64BIT_REG_HIGH
+ '000000a4:4:00000000' # TG3PCI_RCV_RET_RING_CON_IDX + TG3_64BIT_REG_LOW
+ '000000a0:4:00000000' # TG3PCI_RCV_RET_RING_CON_IDX + TG3_64BIT_REG_HIGH
+ '00000070:4:00000000') # TG3PCI_PCISTATE
+ )
+)
diff --git a/os-plugins/plugins/xen/files/xen.examples/xm-config-xenapi.xml b/os-plugins/plugins/xen/files/xen.examples/xm-config-xenapi.xml
new file mode 100644
index 00000000..dbd8778b
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/xm-config-xenapi.xml
@@ -0,0 +1,43 @@
+<!--
+
+Copyright (C) 2006 XenSource Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of version 2.1 of the GNU Lesser General Public
+License as published by the Free Software Foundation.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+-->
+
+<!--
+
+This is a configuration file for xm; it should be placed in
+/etc/xen/xm-config.xml. If this file is missing, then xm will fall back to
+the normal behaviour that's in Xen 3.0.4 and below. The settings here are
+most useful for experimenting with the Xen-API preview in Xen 3.0.4.
+
+-->
+
+<xm>
+ <!-- The server element describes how to talk to Xend. The type may be
+ Xen-API or LegacyXMLRPC (the default). The URI is that of the
+ server; you might try http://server:9363/ or
+ httpu:///var/run/xend/xen-api.sock for the Xen-API, or
+ httpu:///var/run/xend/xmlrpc.sock for the legacy server.
+
+ The username and password attributes will be used to log in if Xen-API
+ is being used.
+ -->
+ <server type='Xen-API'
+ uri='http://localhost:9363/'
+ username='me'
+ password='mypassword' />
+</xm>
diff --git a/os-plugins/plugins/xen/files/xen.examples/xm-config.xml b/os-plugins/plugins/xen/files/xen.examples/xm-config.xml
new file mode 100644
index 00000000..943b74d2
--- /dev/null
+++ b/os-plugins/plugins/xen/files/xen.examples/xm-config.xml
@@ -0,0 +1,45 @@
+<!--
+
+Copyright (C) 2006 XenSource Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of version 2.1 of the GNU Lesser General Public
+License as published by the Free Software Foundation.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+-->
+
+<!--
+
+This is a configuration file for xm; it should be placed in
+/etc/xen/xm-config.xml. If this file is missing, then xm will fall back to
+the normal behaviour that's in Xen 3.0.4 and below. The settings here are
+most useful for experimenting with the Xen-API preview in Xen 3.0.4.
+
+-->
+
+<xm>
+ <!-- The server element describes how to talk to Xend. The type may be
+ Xen-API or LegacyXMLRPC (the default). The URI is that of the
+ server; you might try http://server:9363/ or
+ httpu:///var/run/xend/xen-api.sock for the Xen-API, or
+ httpu:///var/run/xend/xmlrpc.sock for the legacy server.
+
+ The username and password attributes will be used to log in if Xen-API
+ is being used.
+ -->
+ <!--
+ <server type='Xen-API'
+ uri='http://localhost:9363/'
+ username='me'
+ password='mypassword' />
+ -->
+</xm>