377 lines
7.4 KiB
Perl
Executable File
377 lines
7.4 KiB
Perl
Executable File
#!/usr/bin/perl -w
|
|
|
|
=head1 NAME
|
|
|
|
xt-create-config - Create a Xen configuration file for a new guest
|
|
|
|
=cut
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
xt-create-config [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:
|
|
--output The directory to save our configuration file to.
|
|
|
|
All other options from xen-create-image, such as the new IP address(es)
|
|
to give to the new instance, will be passed as environmental variables.
|
|
|
|
=cut
|
|
|
|
=head1 ABOUT
|
|
|
|
This script is invoked by xen-create-image after it has created and
|
|
customised a new Xen guest. It is responsible for creating the
|
|
configuration file which Xen will use to start the instance.
|
|
|
|
The configuration file will be created in the directory /etc/xen using
|
|
a template file to determine how the configuration file should be
|
|
created.
|
|
|
|
By default the script will use /etc/xen-tools/xm.tmpl as its input.
|
|
|
|
=cut
|
|
|
|
|
|
=head1 INVOCATION
|
|
|
|
This script will be invoked by the xen-create-image script, rather than
|
|
directly.
|
|
|
|
This is because it will expect to receive the values to insert into the
|
|
output template in as environmental variables.
|
|
|
|
You could execute it manually via a long command line, but that is
|
|
error-prone and probably not useful:
|
|
|
|
=for example begin
|
|
|
|
hostname=foo.my.flat ip=192.168.1.2 ... xm-create-xen-config \
|
|
--output=/etc/xen --template=/etc/xen-tools/xm.tmpl
|
|
|
|
=for example end
|
|
|
|
|
|
=cut
|
|
|
|
|
|
=head1 ARGUMENT PASSING
|
|
|
|
This script will be invoked with a full copy of the arguments from
|
|
xen-create-image in its environment, along with several command line
|
|
arguments.
|
|
|
|
This has several implications for customization. If you wish to
|
|
setup a new variable in the output template such as "foo=bar" you
|
|
could update the script to include "${foo}", then invoke
|
|
xen-create-image with this environmental variable set.
|
|
|
|
=for example begin
|
|
|
|
$ foo=bar xen-create-image --hostname=test.my.flat ...
|
|
|
|
=for example end
|
|
|
|
The environment will be duplicated/inheritted by this script when
|
|
it is executed, and your variable will be included in the output file.
|
|
|
|
For details on the template file syntax please see the documentation
|
|
for the "Text::Template" perl module. (If you have the perldoc
|
|
package installed you can read this with "perldoc Text::Template".)
|
|
|
|
=cut
|
|
|
|
|
|
=head1 AUTHOR
|
|
|
|
Steve
|
|
--
|
|
http://www.steve.org.uk/
|
|
|
|
$Id: xt-create-xen-config,v 1.22 2006-10-12 23:08:21 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;
|
|
use Text::Template;
|
|
|
|
|
|
|
|
#
|
|
# Configuration values read from the command line.
|
|
#
|
|
# We do not need to read any configuration file.
|
|
#
|
|
my %CONFIG;
|
|
|
|
#
|
|
# Default options
|
|
#
|
|
$CONFIG{'template'} = '/etc/xen-tools/xm.tmpl';
|
|
|
|
|
|
#
|
|
# Release number.
|
|
#
|
|
my $RELEASE = '2.7';
|
|
|
|
|
|
|
|
|
|
#
|
|
# Parse the command line arguments.
|
|
#
|
|
parseCommandLineArguments();
|
|
|
|
|
|
#
|
|
# Check our arguments.
|
|
#
|
|
checkArguments();
|
|
|
|
|
|
#
|
|
# Create the Xen configuration file.
|
|
#
|
|
createXenConfig();
|
|
|
|
|
|
#
|
|
# Exit cleanly - any errors which have already occurred will result
|
|
# in "exit 1".
|
|
#
|
|
exit 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
=begin doc
|
|
|
|
Parse the command line arguments this script was given.
|
|
|
|
=end doc
|
|
|
|
=cut
|
|
|
|
sub parseCommandLineArguments
|
|
{
|
|
my $HELP = 0;
|
|
my $MANUAL = 0;
|
|
my $VERSION = 0;
|
|
|
|
#
|
|
# Parse options.
|
|
#
|
|
GetOptions(
|
|
"output=s", \$CONFIG{'output'},
|
|
"template=s", \$CONFIG{'template'},
|
|
"verbose", \$CONFIG{'verbose'},
|
|
"help", \$HELP,
|
|
"manual", \$MANUAL,
|
|
"version", \$VERSION
|
|
);
|
|
|
|
pod2usage(1) if $HELP;
|
|
pod2usage(-verbose => 2 ) if $MANUAL;
|
|
|
|
|
|
if ( $VERSION )
|
|
{
|
|
my $REVISION = '$Revision: 1.22 $';
|
|
if ( $REVISION =~ /1.([0-9.]+) / )
|
|
{
|
|
$REVISION = $1;
|
|
}
|
|
|
|
print "xt-create-xen-config release $RELEASE - CVS: $REVISION\n";
|
|
exit;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
=begin doc
|
|
|
|
Test that the command line arguments we were given make sense.
|
|
|
|
=end doc
|
|
|
|
=cut
|
|
|
|
sub checkArguments
|
|
{
|
|
#
|
|
# We require an output location.
|
|
#
|
|
if ( ! defined( $CONFIG{'output'} ) )
|
|
{
|
|
print "The '--output' argument is mandatory\n";
|
|
exit 1;
|
|
}
|
|
|
|
#
|
|
# The output location should be a directory which exists.
|
|
#
|
|
if ( ! -d $CONFIG{'output'} )
|
|
{
|
|
print "The output directory we've been given, $CONFIG{'output'}, doesnt exist\n";
|
|
print "Aborting\n";
|
|
exit 1;
|
|
}
|
|
|
|
|
|
#
|
|
# Make sure that any specified template file exists.
|
|
#
|
|
if ( defined( $CONFIG{'template'} ) )
|
|
{
|
|
if ( ! -e $CONFIG{'template'} )
|
|
{
|
|
print "The specified template file, $CONFIG{'template'} does not exist.\n";
|
|
exit 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
print "A template file was not specified. Aborting\n";
|
|
exit 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
=begin doc
|
|
|
|
This function does the real work of creating the Xen configuration
|
|
file. We modify some of the variables contained in our environment
|
|
and then process the template file with B<Text::Template>.
|
|
|
|
=end doc
|
|
|
|
=cut
|
|
|
|
sub createXenConfig
|
|
{
|
|
#
|
|
# The output file we're going to process.
|
|
#
|
|
my $file = $CONFIG{'output'} . '/' . $ENV{'hostname'} . '.cfg';
|
|
|
|
#
|
|
# The template we're going to read from.
|
|
#
|
|
my $template = new Text::Template( TYPE => 'FILE',
|
|
SOURCE => $CONFIG{'template'} );
|
|
|
|
|
|
#
|
|
# The device we're using.
|
|
#
|
|
my $device = 'sda';
|
|
if ( defined( $ENV{'ide'} ) )
|
|
{
|
|
$device = 'hda';
|
|
}
|
|
$ENV{'device'} = $device;
|
|
|
|
|
|
#
|
|
# The memory size: Strip any trailing size characters "M", "G", etc.
|
|
#
|
|
if ( $ENV{'memory'} =~ /([0-9]+)/ )
|
|
{
|
|
$ENV{'memory'} = $1;
|
|
}
|
|
|
|
|
|
#
|
|
# Images as presented to Xen - either loopback images, or LVM partitions.
|
|
#
|
|
my $image_vbd;
|
|
my $swap_vbd;
|
|
|
|
if ( $ENV{'lvm'} )
|
|
{
|
|
$image_vbd = "phy:$ENV{'lvm'}/$ENV{'hostname'}-disk";
|
|
$swap_vbd = "phy:$ENV{'lvm'}/$ENV{'hostname'}-swap";
|
|
}
|
|
elsif ( $ENV{'evms'} )
|
|
{
|
|
$image_vbd = "phy:/dev/evms/$ENV{'hostname'}-disk";
|
|
$swap_vbd = "phy:/dev/evms/$ENV{'hostname'}-swap";
|
|
}
|
|
else
|
|
{
|
|
$image_vbd = "file:$ENV{'dir'}/domains/$ENV{'hostname'}/disk.img";
|
|
$swap_vbd = "file:$ENV{'dir'}/domains/$ENV{'hostname'}/swap.img";
|
|
}
|
|
$ENV{'image_vbd'} = $image_vbd;
|
|
$ENV{'swap_vbd'} = $swap_vbd;
|
|
|
|
|
|
#
|
|
# Now we should have a suitable environment. What we want to
|
|
# do now is to make sure that these environmental variables are
|
|
# made available to our template file.
|
|
#
|
|
my %vars;
|
|
foreach my $key (sort keys %ENV )
|
|
{
|
|
$vars{$key} = $ENV{$key};
|
|
}
|
|
|
|
#
|
|
# Now output the data.
|
|
#
|
|
open( FILE, ">", $file );
|
|
|
|
#
|
|
# The template file gets a complete copy of our configuration values.
|
|
#
|
|
my $result = $template->fill_in(HASH => \%vars);
|
|
|
|
#
|
|
# Write the output of processing the template file, if it succeeds.
|
|
#
|
|
if (defined $result)
|
|
{
|
|
print FILE $result ;
|
|
}
|
|
else
|
|
{
|
|
print FILE "Error creating configuration file\n";
|
|
}
|
|
|
|
#
|
|
# Close the output file.
|
|
#
|
|
close( FILE );
|
|
|
|
}
|