1
0
mirror of synced 2026-01-20 17:38:02 +00:00
xen-tools.xen-tools/xen-update-image
steve d5ff89f547 2005-12-18 23:57:46 by steve
Added to repository: run apt-get update && apt-get upgrade
2005-12-18 23:57:46 +00:00

253 lines
3.9 KiB
Perl
Executable File

#!/usr/bin/perl -w
=head1 NAME
xen-update-image - Update the software installed upon the given image.
=head1 SYNOPSIS
xen-update-image [options]
--dir Specify where the output image was saved.
--hostname Set the images hostname.
=cut
=head1 OPTIONS
=over 8
=item B<--dir>
Specify the output directory image was saved.
=item B<--help>
Show the script help
=item B<--hostname>
Specify the name of the image to remove.
=item B<--manual>
Read the manual
=back
=cut
=head1 DESCRIPTION
xen-update-image is a simple script which allows you to update
a Xen instances of Debian Sarge which has been created with
xen-create-image.
It does this by mounting the image inside a temporary directory
then running:
apt-get update
apt-get upgrade
=cut
=head1 AUTHOR
Steve
--
http://www.steve.org.uk/
$Id: xen-update-image,v 1.1 2005-12-18 23:57:46 steve Exp $
=cut
=head1 LICENSE
Copyright (c) 2005 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 File::Temp qw/ tempdir /;
use Getopt::Long;
use Pod::Usage;
#
# Configuration options, initially read from the configuration files
# but may be overridden by the command line.
#
# Command line flags *always* take precedence over the configuration files(s).
#
my %CONFIG;
#
# Read configuration file(s) if they exist.
#
if ( -e "etc/xen-tools.conf" )
{
readConfigurationFile( "etc/xen-tools.conf" );
}
if ( -e "/etc/xen-tools/xen-tools.conf" )
{
readConfigurationFile( "/etc/xen-tools/xen-tools.conf" );
}
if ( -e $ENV{'HOME'} . ".xen-tools.conf" )
{
readConfigurationFile( $ENV{'HOME'} . ".xen-tools.conf" );
}
#
# Parse command line arguments, these override the values from the
# configuration file.
#
parseCommandLineArguments();
#
# Find the disk image.
#
my $image = $CONFIG{'dir'} . "/domains/" . $CONFIG{'hostname'} . "/disk.img";
if ( ! -e $image )
{
print "Disk image '$image' for host '$CONFIG{'hostname'}' not found\n";
exit;
}
#
# Create a temporary directory to mount the image upon securely.
#
my $tmp = tempdir( CLEANUP => 1 );
my $mount_cmd = "mount -t auto -o loop $image $tmp";
`$mount_cmd`;
#
# Now run the update command.
#
system( "chroot $tmp /usr/bin/apt-get update" );
#
# Now upgrade
#
system( "DEBIAN_FRONTEND=noninteractive chroot $tmp /usr/bin/apt-get upgrade --yes --force-yes" );
#
# Unmount
#
`umount $tmp`;
#
# All done.
#
exit;
=head2 readConfigurationFile
Read the configuration file specified.
=cut
sub readConfigurationFile
{
my ($file) = ( @_ );
open( FILE, "<", $file ) or die "Cannot read file '$file' - $!";
my $line = "";
while (defined($line = <FILE>) )
{
chomp $line;
if ($line =~ s/\\$//)
{
$line .= <FILE>;
redo unless eof(FILE);
}
# Skip lines beginning with comments
next if ( $line =~ /^([ \t]*)\#/ );
# Skip blank lines
next if ( length( $line ) < 1 );
# Strip trailing comments.
if ( $line =~ /(.*)\#(.*)/ )
{
$line = $1;
}
# Find variable settings
if ( $line =~ /([^=]+)=([^\n]+)/ )
{
my $key = $1;
my $val = $2;
# Strip leading and trailing whitespace.
$key =~ s/^\s+//;
$key =~ s/\s+$//;
$val =~ s/^\s+//;
$val =~ s/\s+$//;
# Store value.
$CONFIG{ $key } = $val;
}
}
close( FILE );
}
=head2 parseCommandLineArguments
Parse the arguments specified upon the command line.
=cut
sub parseCommandLineArguments
{
my $HELP = 0;
my $MANUAL = 0;
# Parse options.
#
GetOptions(
"hostname=s", \$CONFIG{'hostname'},
"dir=s", \$CONFIG{'dir'},
"help", \$HELP,
"manual", \$MANUAL
);
pod2usage(1) if $HELP;
pod2usage(-verbose => 2 ) if $MANUAL;
}