diff --git a/xen-update-image b/xen-update-image new file mode 100755 index 0000000..86afb54 --- /dev/null +++ b/xen-update-image @@ -0,0 +1,252 @@ +#!/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 = ) ) + { + chomp $line; + if ($line =~ s/\\$//) + { + $line .= ; + 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; +} + +