Index: trunk/packages/sipb-xen-autoinstaller/guest/etc/init.d/rcS
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/etc/init.d/rcS	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/etc/init.d/rcS	(revision 744)
@@ -0,0 +1,16 @@
+#!/bin/sh
+for x in $(cat /proc/cmdline); do
+    case $x in
+    ip=*)
+      /usr/lib/klibc/bin/ipconfig -d ${x#ip=}
+      ;;
+    noinstall)
+      exit 0
+      ;;
+    esac
+done
+mount -t tmpfs none /var/log
+mount -t tmpfs none /tmp
+sipb-xen-install
+busybox poweroff
+exit 0
Index: trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/91-make-fstab
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/91-make-fstab	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/91-make-fstab	(revision 744)
@@ -0,0 +1,99 @@
+#!/bin/sh
+
+# This is a copy of 90-make-fstab, with a bug fixed.
+# It should be removed once the bug is fixed upstream.
+
+#
+#  This script is responsible for setting up /etc/fstab upon the
+# new instance.
+#
+#  This should be a simple job, but it is complicated by some of the
+# differences between filesystems - some root filesystems will require
+# the installation of new packages, and we have to handle that here.
+#
+# Steve
+# --
+# http://www.steve.org.uk/
+
+
+prefix=$1
+
+#
+#  Source our common functions
+#
+if [ -e /usr/lib/xen-tools/common.sh ]; then
+    . /usr/lib/xen-tools/common.sh
+else
+    . ./hooks/common.sh
+fi
+
+
+#
+# Log our start
+#
+logMessage Script $0 starting
+
+
+#
+# Make sure we use ide style device names if required
+#
+device=sda
+if [ "${ide}" ]; then
+    device=hda
+fi
+
+#
+#  Now we have the options we can create the fstab.
+#
+has_xfs=0
+has_reiserfs=0
+cat <<E_O_FSTAB > ${prefix}/etc/fstab
+# /etc/fstab: static file system information.
+#
+# <file system> <mount point>   <type>  <options>       <dump>  <pass>
+proc            /proc           proc    defaults        0       0
+E_O_FSTAB
+for part in `seq 1 ${NUMPARTITIONS}`; do
+    eval "PARTITION=\"\${PARTITION${part}}\""
+    OLDIFS="${IFS}"
+    IFS=:
+    x=0
+    for partdata in ${PARTITION}; do
+        eval "partdata${x}=\"${partdata}\""
+        x=$(( $x+1 ))
+    done
+    IFS="${OLDIFS}"
+    
+    case "${partdata2}" in
+        xfs)
+            has_xfs=1
+            ;;
+        reiserfs)
+            has_reiserfs=1
+            ;;
+    esac
+    
+    if [ "${partdata2}" = "swap" ]; then
+        echo "${partdata7} none swap sw 0 0" >> ${prefix}/etc/fstab
+    else
+        echo "${partdata7} ${partdata3} ${partdata2} ${partdata4} 0 1" >> ${prefix}/etc/fstab
+    fi
+done
+
+
+#
+#  Finally we can install any required packages for the given root
+# filesystem
+#
+if [ $has_xfs -eq 1 ]; then
+    installDebianPackage ${prefix} xfsprogs
+fi
+if [ $has_reiserfs -eq 1 ]; then
+    installDebianPackage ${prefix} reiserfsprogs
+fi
+
+
+#
+#  Log our finish
+#
+logMessage Script $0 finished
Index: trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/97-setup-grub
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/97-setup-grub	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/97-setup-grub	(revision 744)
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+#  This script sets up the ParaVM to use pygrub
+#
+
+prefix=$1
+
+#
+#  Source our common functions
+#
+if [ -e /usr/lib/xen-tools/common.sh ]; then
+    . /usr/lib/xen-tools/common.sh
+else
+    . ./hooks/common.sh
+fi
+
+echo SCRIPT = $0
+dir=`dirname "$0"`
+
+
+logMessage Script $0 starting
+
+# To avoid UDP checksum problems.
+
+installDebianPackage ${prefix} ethtool
+
+#
+# Install the xen kernel.  linux-image-xen is in ubuntu,
+# linux-image-xen-amd64 in debian.
+installDebianPackage ${prefix} linux-image-xen
+installDebianPackage ${prefix} linux-image-xen-amd64
+
+installDebianPackage ${prefix} grub
+
+#
+# Make the /boot/grub directory
+#
+mkdir -p ${prefix}/boot/grub
+
+#
+# Create stock menu.lst
+#
+chroot ${prefix} /usr/sbin/update-grub -y
+
+#
+# Patches to add xen kernels, use serial console, etc.
+#
+for patch in $dir/patches/*; do
+    patch -l -d ${prefix} -p1 < $patch
+done
+
+#
+# Regenerate automagic kernels list
+#
+chroot ${prefix} /usr/sbin/update-grub -y
+
+#
+# Log our finish
+#
+logMessage Script $0 finished
+
Index: trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/patches/common.diff
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/patches/common.diff	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/patches/common.diff	(revision 744)
@@ -0,0 +1,1 @@
+link ../../patches/common.diff
Index: trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/patches/inittab.diff
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/patches/inittab.diff	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/debian.d/patches/inittab.diff	(revision 744)
@@ -0,0 +1,1 @@
+link ../../patches/inittab.diff
Index: trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/91-make-fstab
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/91-make-fstab	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/91-make-fstab	(revision 744)
@@ -0,0 +1,1 @@
+link ../debian.d/91-make-fstab
Index: trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/97-setup-grub
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/97-setup-grub	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/97-setup-grub	(revision 744)
@@ -0,0 +1,1 @@
+link ../debian.d/97-setup-grub
Index: trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/patches/common.diff
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/patches/common.diff	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/patches/common.diff	(revision 744)
@@ -0,0 +1,1 @@
+link ../../patches/common.diff
Index: trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/patches/event.d.diff
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/patches/event.d.diff	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/edgy.d/patches/event.d.diff	(revision 744)
@@ -0,0 +1,1 @@
+link ../../patches/event.d.diff
Index: trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/patches/common.diff
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/patches/common.diff	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/patches/common.diff	(revision 744)
@@ -0,0 +1,27 @@
+--- /usr/sbin/update-grub.orig	2008-05-03 23:30:37.000000000 -0400
++++ /usr/sbin/update-grub	2008-05-03 23:30:55.000000000 -0400
+@@ -911,13 +911,6 @@
+ 		is_xen=
+ 	fi
+ 
+-	if [ ! "$in_domU" ] && [ "$is_xen" ]; then
+-	  # skip xen kernels
+-          continue
+-        elif [ "$in_domU" ] && ! [ "$is_xen" ]; then
+-	  # skip non-xen kernels
+-	  continue
+-        fi
+         kern="/boot/$kern"
+ 	newerKernels=""
+ 	for i in $sortedKernels ; do
+--- /boot/grub/menu.lst.orig	2008-05-04 03:17:31.000000000 -0400
++++ /boot/grub/menu.lst	2008-05-04 03:19:09.000000000 -0400
+@@ -59,7 +59,7 @@
+ ## e.g. kopt=root=/dev/hda1 ro
+ ##      kopt_2_6_8=root=/dev/hdc1 ro
+ ##      kopt_2_6_8_2_686=root=/dev/hdc2 ro
+-# kopt=root=/dev/hda1 ro
++# kopt=root=/dev/hda1 ro console=ttyS0,9600,8n1
+ 
+ ## default grub root device
+ ## e.g. groot=(hd0,0)
Index: trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/patches/event.d.diff
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/patches/event.d.diff	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/usr/lib/xen-tools/patches/event.d.diff	(revision 744)
@@ -0,0 +1,14 @@
+--- /etc/event.d/ttyS0.orig   2008-06-22 01:57:29.000000000 -0400
++++ /etc/event.d/ttyS0  2008-06-22 03:12:01.000000000 -0400
+@@ -0,0 +1,11 @@
++start on runlevel 2
++start on runlevel 3
++start on runlevel 4
++start on runlevel 5
++
++stop on runlevel 0
++stop on runlevel 1
++stop on runlevel 6
++
++respawn
++exec /sbin/getty 115300 ttyS0
Index: trunk/packages/sipb-xen-autoinstaller/guest/usr/sbin/sipb-xen-install
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/guest/usr/sbin/sipb-xen-install	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/guest/usr/sbin/sipb-xen-install	(revision 744)
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+TARGET=/dev/hda
+
+# Read in the environment variables
+# For some strange reason, . $TARGET doesn't work reliably.
+eval `grep -a -m1 -B 100 ^return$ $TARGET | grep -v return`
+
+ARCH=amd64
+
+echo ,${IMAGESIZE}$',L,*\n,,S\n;\n;' | sfdisk -uM -H 255 -S 63 $TARGET
+
+xen-create-image --image-dev ${TARGET}1 --swap-dev ${TARGET}2 --fs ext3 --ide --arch $ARCH --dist $DIST --hostname $HOSTNAME --mirror $MIRROR --ip=$IP --netmask=255.255.0.0 --gateway=18.181.0.1 --cache=yes
Index: trunk/packages/sipb-xen-autoinstaller/host/etc/xen/autoinstall.cfg
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/host/etc/xen/autoinstall.cfg	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/host/etc/xen/autoinstall.cfg	(revision 744)
@@ -0,0 +1,45 @@
+#
+# Configuration file for the Xen instance foobar, created
+# by xen-tools 3.7 on Sat Jun 21 16:24:54 2008.
+#
+
+#
+#  Kernel + memory size
+#
+#bootloader = '/usr/lib/xen-default/bin/pygrub'
+kernel      = '/boot/vmlinuz-2.6.24-19-xen'
+ramdisk     = '/boot/initrd.img-2.6.24-19-xen'
+memory      = '256'
+
+
+#
+#  Hostname
+#
+name        = 'd_foobar2'
+
+
+#
+#  Disk device(s).
+#
+disk        = [
+                  'phy:/dev/xenvg/%s_hda,hdb,r' % name,
+                  'phy:/dev/xenvg/d_%s_hda,hda,w' % target,
+              ]
+
+root = '/dev/hdb1'
+extra = 'ro noresume ip=18.181.0.216::18.181.0.1:255.255.0.0:foobar2:eth0:off'
+
+#
+#  Networking
+#
+vif         = [ 'ip=18.181.0.216,mac=00:16:3e:00:2c:ee,script=vif-bridge' ]
+
+#
+#  Behaviour
+#
+on_poweroff = 'destroy'
+on_reboot   = 'restart'
+on_crash    = 'destroy'
+
+
+
Index: trunk/packages/sipb-xen-autoinstaller/host/usr/sbin/sipb-xen-install
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/host/usr/sbin/sipb-xen-install	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/host/usr/sbin/sipb-xen-install	(revision 744)
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+export PATH
+
+HOSTNAME="$2"
+DIST="$3"
+MIRROR="$4"
+IMAGESIZE="$5"
+IP="$6"
+
+VOLUME=/dev/mapper/xenvg-d_${HOSTNAME}_hda
+
+cat > $VOLUME <<EOF
+HOSTNAME=$HOSTNAME
+DIST=$DIST
+MIRROR=$MIRROR
+IMAGESIZE=$IMAGESIZE
+IP=$IP
+return
+EOF
+
+xm create autoinstall.cfg target=$HOSTNAME guestip=$IP
Index: trunk/packages/sipb-xen-autoinstaller/host/usr/sbin/sipb-xen-lvcopy
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/host/usr/sbin/sipb-xen-lvcopy	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/host/usr/sbin/sipb-xen-lvcopy	(revision 744)
@@ -0,0 +1,90 @@
+#!/usr/bin/env python2.5
+
+import sys
+import os
+import shutil
+import tempfile
+import time
+from subprocess import call, check_call, Popen, PIPE
+
+# Make sure to use up fd 0 to avoid a bug in subprocess in Python <= 2.5.1
+# NB we need to do this on every Python remctl script.
+# See r53624 in Python svn.
+sys.stdin = open('/dev/null')
+
+def losetup(source, offset=0):
+  p = Popen(['sipb-xen-losetup', source, str(offset)], stdout=PIPE)
+  return p.communicate()[0].strip()
+
+def frob_copy_in_vm(target, *args):
+  '''UNUSED: maybe we'll use this someday; it does isolate the frobber.'''
+  # 1. prepare arguments volume
+  args_volume = prefix+target+'_args'
+  args_device = '/dev/xenvg/' + args_volume
+  check_call(['/sbin/lvcreate', 'xenvg', '--name', args_volume, '--size', '4K'])
+  file(args_device, 'w').write('\n'.join(args) + '\n')
+
+  # 2. invoke frobber vm
+  copier_device = '/dev/xenvg/d_wert_hda'
+  check_call(['/usr/sbin/xm', 'create', 'sipb-database',
+              'machine_name='+target,
+              'disks=' + ' '.join(['phy:'+copier_device+',hda,w',
+                                   'phy:'+target_device+',hdc,w',
+                                   'phy:'+args_device+',hdd,w'])])
+
+  # XXX should check_call(['/sbin/lvremove', '-f', 'xenvg/'+args_volume])
+
+def frob_copy(target, hostname, rootpw):
+  """target should be an LV device filename"""
+  # 1: mount filesystem
+  fs = losetup(target, 32256)
+  mntdir = tempfile.mkdtemp('', 'auto-install.frob.', '/tmp')
+  call(['mount', '-t', 'ext3', fs, mntdir])
+  # 2: do frobbing
+  call(['/usr/sbin/chroot', mntdir, '/post-copy', hostname, rootpw])
+  # 3: clean up
+  call(['umount', mntdir])
+  os.rmdir(mntdir)
+  call(['losetup', '-d', fs])
+
+def duplicate_by_vm(source, target, rootpw, nodd=False, nofrob=False):
+  if source != "ice3":
+     print "Error: can't clone that VM"
+     sys.exit(1)
+  # source, target should be machine names
+  prefix = 'd_'
+  # 1. copy (by dd) source to target
+  source_device = '/dev/xenvg/' + prefix + source + '_hda'
+  target_device = '/dev/xenvg/' + prefix + target + '_hda'
+  if not nodd:
+    check_call(['/bin/dd', 'bs=1M', 'conv=nocreat',
+                'if='+source_device, 'of='+target_device])
+  # 2. frob target
+  if not nofrob:
+    frob_copy(target_device, target, rootpw)
+
+def main(*argv):
+  subcommand = argv[1]
+  args = argv[2:]
+  os.environ['PATH'] = '/usr/sbin:/usr/bin:/sbin:/bin'
+  if subcommand == 'lvcopy':
+    kwargs = {}
+    while True:
+      if args[0].startswith('--'):
+        kwargs[args[0][2:]] = True
+        args = args[1:]
+        continue
+      if len(args) != 3:
+        print >>sys.stderr, argv[0]+': bad argument list'
+        return 2
+      break
+    duplicate_by_vm(*args, **kwargs)
+  elif subcommand == 'test':
+    pass
+  else:
+    print >>sys.stderr, argv[0]+": unknown subcommand: "+subcommand
+    return 2
+  return 0
+
+if __name__ == '__main__':
+  sys.exit(main(*sys.argv))
Index: trunk/packages/sipb-xen-autoinstaller/host/usr/sbin/sipb-xen-make-iso
===================================================================
--- trunk/packages/sipb-xen-autoinstaller/host/usr/sbin/sipb-xen-make-iso	(revision 744)
+++ trunk/packages/sipb-xen-autoinstaller/host/usr/sbin/sipb-xen-make-iso	(revision 744)
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+
+import sys
+import os
+import shutil
+import tempfile
+from subprocess import call
+
+data_dir = '/srv/guest-installer'
+
+def make_debian_cd(name, tmptree, passhashfile):
+  basetree = os.path.join(data_dir, name)
+  cdtree = os.path.join(tmptree, 'cdrom')
+  shutil.copytree(os.path.join(basetree, 'cdrom'), cdtree, symlinks=True)
+  new_preseed = file(os.path.join(cdtree, 'preseed.cfg'), 'w')
+  old_preseed = file(os.path.join(basetree, 'preseed.cfg'))
+  new_preseed.write(old_preseed.read())
+  passhash = file(passhashfile).read()
+  new_preseed.write('d-i passwd/root-password-crypted password '+passhash+'\n')
+  new_preseed.close()
+  output_iso = os.path.join(tmptree, 'install.iso')
+  call('''mkisofs -r -V "SIPB-Xen_Custom_Install_CD" -cache-inodes -J -l
+           -b isolinux/isolinux.bin -c isolinux/boot.cat
+           -no-emul-boot -boot-load-size 4 -boot-info-table'''.split()
+       + ['-o', output_iso, cdtree])
+  return output_iso
+
+if __name__ == '__main__':
+  print make_debian_cd(*sys.argv[1:])
