#!/usr/bin/perl -w =head1 NAME xt-install-image - Install a fresh copy of GNU/Linux into a directory =cut =head1 SYNOPSIS xt-install-image [options] Help Options: --help Show this scripts help information. --manual Read this scripts manual. --version Show the version number and exit. Debugging Options: --verbose Be verbose in our execution. Mandatory Options: --location The location to use for the new installation --dist The name of the distribution which has been installed. Exclusive Options: --untar --debootstrap + --mirror --rpmstrap --copy All other options from B will be passed as environmental variables. =cut =head1 NOTES This script is invoked by B after to create a new distribution of Linux. There are several available methods of installation, depending upon the users choice: The command line arguments which are mandatory are: --location - The installation root to use. --dist - The distribution which is to be installed. Once those mandatory arguments are parsed the installation method will be selected. This could be one of : * tar Untar the given file. Assume this contains a complete installation. * copy Copy from the given directory. Assume this contains a complete installation. * rpmstrap Install using rpmstrap the named dist * debootstrap Install using debootstrap the named dist. =cut =head1 AUTHOR Steve -- http://www.steve.org.uk/ $Id: xt-install-image,v 1.6 2006-06-09 17:29:05 steve Exp $ =cut =head1 LICENSE Copyright (c) 2005-2006 by Steve Kemp. All rights reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The LICENSE file contains the full text of the license. =cut use strict; use Env; use Getopt::Long; use Pod::Usage; # # Configuration values read from the command line. # # We do not need to read any configuration file. # my %CONFIG; # # Release number. # my $RELEASE = '2.0'; # # Parse the command line arguments. # parseCommandLineArguments(); # # Check our arguments # checkArguments(); # # Work out how to install: # # # Simplest cases first. # if ( $CONFIG{'copy'} ) { # # Run a command to copy an installed system into the new root. # runCommand( "/bin/cp -a $CONFIG{'copy'}/* $CONFIG{'location'}" ); } elsif ( $CONFIG{'untar'} ) { # # Run a command to copy an installed system into the new root. # runCommand( "cd $CONFIG{'location'} && tar -xvf $CONFIG{'untar'}" ); } elsif ( $CONFIG{'debootstrap'} ) { print "TODO: rpmstrap\n"; } elsif ( $CONFIG{'rpmstrap'} ) { print "TODO: rpmstrap\n"; } else { # # error # # return a code so that xen-create-image can abort. } # # Exit cleanly - any errors which have already occurred will result # in "exit 1". # exit 0; =head2 parseArguments Parse the command line arguments this script was given. =cut sub parseCommandLineArguments { my $HELP = 0; my $MANUAL = 0; my $VERSION = 0; # # Parse options. # GetOptions( # Mandatory "location=s", \$CONFIG{'location'}, "dist=s", \$CONFIG{'dist'}, # Exclusive. "tar=s", \$CONFIG{'tar'}, "copy=s", \$CONFIG{'copy'}, "rpmstrap", \$CONFIG{'rpmstrap'}, "debootstrap", \$CONFIG{'debootstrap'}, # Misc "mirror=s", \$CONFIG{'mirror'}, # Help. "verbose", \$CONFIG{'verbose'}, "help", \$HELP, "manual", \$MANUAL, "version", \$VERSION ); pod2usage(1) if $HELP; pod2usage(-verbose => 2 ) if $MANUAL; if ( $VERSION ) { my $REVISION = '$Revision: 1.6 $'; if ( $REVISION =~ /1.([0-9.]+) / ) { $REVISION = $1; } print "xt-install-image release $RELEASE - CVS: $REVISION\n"; exit; } } =head2 checkArguments Test that the command line arguments we were given make sense. =cut sub checkArguments { # # We require a location. # if ( ! defined( $CONFIG{'location'} ) ) { print "The '--location' argument is mandatory\n"; exit 1; } # # Test that the location we've been told contains # a fresh installation of Linux exists # if ( ! -d $CONFIG{'location'} ) { print "The installation directory we've been given doesn't exist\n"; print "We tried to use : $CONFIG{'location'}\n"; exit 1; } # # We require a distribution name. # if ( ! defined( $CONFIG{'dist'} ) ) { print "The '--dist' argument is mandatory\n"; exit 1; } # # Test that the distribution name we've been given # to configure has a collection of hook scripts. # # If there are no scripts then we clearly cannot # customise it! # my $dir = "/usr/lib/xen-tools/" . $CONFIG{'dist'} . ".d"; if ( ! -d $dir ) { print < 1 ) { print <