From 967f926ed2272ff759cb0223a76b3727de4ec425 Mon Sep 17 00:00:00 2001 From: Axel Beckert Date: Wed, 10 Mar 2010 19:46:42 +0100 Subject: [PATCH] Debian/Ubuntu: Use Dom0's distribution by default for DomUs Includes new tool xen-guess-debian-mirror. --- bin/xen-guess-debian-mirror | 183 ++++++++++++++++++++++++++++++++++++ debian/NEWS | 12 +++ debian/changelog | 3 +- debian/control | 2 +- etc/xen-tools.conf | 4 +- 5 files changed, 200 insertions(+), 4 deletions(-) create mode 100755 bin/xen-guess-debian-mirror create mode 100644 debian/NEWS diff --git a/bin/xen-guess-debian-mirror b/bin/xen-guess-debian-mirror new file mode 100755 index 0000000..692c03e --- /dev/null +++ b/bin/xen-guess-debian-mirror @@ -0,0 +1,183 @@ +#!/usr/bin/perl -w + +=head1 NAME + +xen-guess-debian-mirror - Tries to guess the most suitable mirror and +suite for DomUs on Debian and Ubuntu Dom0s. + +=cut + +=head1 SYNOPSIS + + xen-guess-debian-mirror [-s] [-m] + + -s show suite + -m show mirror + + Shows both if no parameter is given. + +=cut + +=head1 DESCRIPTION + +xen-guess-debian-mirror tries to find the mirror and suite the Xen +Dom0 is currently using and returns them in a way suitable for +xen-create-image(1) or the backticks feature in xen-tools.conf. + +=cut + +=head1 AUTHOR + + Axel Beckert , http://noone.org/abe/ + +=cut + +=head1 LICENSE + +Copyright (C) 2010 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 + +### +### Configuration +### + +# Fallback to Debian or Ubuntu in case we can't find anything +my $fallback = 'Debian'; + +# Which mirrors to use if everything else fails +my %fallback_mirror = ( Debian => 'http://ftp.debian.org/debian/', + Ubuntu => 'http://archive.ubuntu.com/ubuntu/' ); + +# Which suite to use if everything else fails. For Debian "stable" +# should be the best choice independent of the time. Ubuntu does not +# have aliases like stable or testing, so we take the nearest LTS +# release which is 10.04 at the time of writing. +my %fallback_suite = ( Debian => 'stable', + Ubuntu => 'lucid' ); + +# Where to look for the sources.list to parse +my $sources_list_file = '/etc/apt/sources.list'; + +use File::Slurp; +use Getopt::Long; +use Pod::Usage + +use strict; + + +# +# Release number. +# +my $RELEASE = '4.2~rc1'; + +# Init +my $mirror = ''; +my $suite = ''; +my $found = 0; + +# Parsing command line options +my $want_mirror = 0; +my $want_suite = 0; +my $want_version = 0; +my $want_help = 0; +my $want_usage = 0; + +my $result = GetOptions ('mirror' => \$want_mirror, + 'suite' => \$want_suite, + 'version' => \$want_version, + 'usage' => \$want_usage, + 'help' => \$want_help); + +if ($want_help) { + print "Usage: $0 [-m] [-s]\n"; + exit 0; +} + +if ($want_usage) { + pod2usage(0); +} + +if (-r $sources_list_file) { + # sources.list exists, so it's something debianoid. + + # read sources.list and split it into lines + my @sources_list = read_file($sources_list_file); + + # Find the first line which is a Debian or Ubuntu mirror but not + # an updates, backports, volatile or security mirror. + foreach my $sources_list_entry (@sources_list) { + # Normalize line + chomp($sources_list_entry); + $sources_list_entry =~ s/^\s*(.*?)\s*$/$1/; + + # Skip definite non-entries + next if $sources_list_entry =~ /^\s*($|#)/; + + # Split up into fields + my @source_components = split(/\s+/, $sources_list_entry); + + # Minimum number of components is 4 + next if $#source_components < 3; + + # Don't use deb-src entries. + next if $source_components[0] eq 'deb-src'; + + # Skip updates, backports, volatile or security mirror. + next if $source_components[2] !~ /^[a-z]+$/; + + if ($source_components[1] =~ m(/debian/?$|/ubuntu/?$)) { + # Seems a typical mirror. Let's use that one + + $mirror = $source_components[1]; + $suite = $source_components[2]; + + $found = 1; + last; + } + } + + warn "Couldn't parse $sources_list_file of the Dom0.\n" unless $found; +} + +my $lsb_release = `which lsb_release`; +chomp($lsb_release); + +if (!$found and $lsb_release and -x $lsb_release) { + my $vendor = `$lsb_release -s -i`; + + if ($vendor eq 'Debian' or $vendor eq 'Ubuntu') { + $suite = `$lsb_release -s -c`; + chomp($suite); + + unless ($suite) { + $suite = $fallback_suite{$vendor}; + warn "Dom0 seems to be $vendor, but couldn't determine suite. Falling back to $suite.\n"; + } + + $mirror = $fallback_mirror{$vendor}; + + $found = 1; + } +} + +if ($found) { + unless ($want_help || $want_version || $want_suite || $want_mirror) { + print "$mirror $suite\n"; + } else { + if ($want_mirror) { + print "$mirror"; + } + if ($want_suite) { + print "$suite"; + } + print "\n"; + } +} else { + $suite = $fallback_suite{$fallback}; + $mirror = $fallback_mirror{$fallback}; +} diff --git a/debian/NEWS b/debian/NEWS new file mode 100644 index 0000000..655ad0c --- /dev/null +++ b/debian/NEWS @@ -0,0 +1,12 @@ +xen-tools (4.2~rc1-1) + + * If the Dom0 is a Debian or Ubuntu, the distribution and suite for + DomUs defaults to the distribution and suite the Dom0 is + running. Otherwise Debian DomUs get "stable" and Ubuntu "lucid" by + default. + + * Default Debian/Ubuntu mirror is now determined by looking into + /etc/apt/sources.list (if it exists) and taking the first entry with + path ending in /debian/ there. + + -- Axel Beckert Wed, 10 Mar 2010 19:35:42 +0100 diff --git a/debian/changelog b/debian/changelog index 78bc930..4390736 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,7 @@ xen-tools (4.2~rc1-1) UNRELEASED; urgency=low * New maintainer and upstream author * New upstream release candidate + - Add dependency on libfile-slurp-perl * Reintroduction into Debian Unstable (Closes: #566714) * Removal of /etc/bash_completion.d/xm from the package since bash-completion ships a more elaborate version of that file. (Closes: @@ -24,7 +25,7 @@ xen-tools (4.2~rc1-1) UNRELEASED; urgency=low - [debian/control]: debhelper-but-no-misc-depends - [debian/copyright]: copyright-without-copyright-notice - -- Axel Beckert Thu, 18 Feb 2010 16:54:04 +0100 + -- Axel Beckert Wed, 10 Mar 2010 16:08:23 +0100 xen-tools (4.1-1) unstable; urgency=low diff --git a/debian/control b/debian/control index fe32bfc..1faa960 100644 --- a/debian/control +++ b/debian/control @@ -10,7 +10,7 @@ Vcs-Hg: http://noone.org/hg/xen-tools/debian Package: xen-tools Architecture: all -Depends: debootstrap, perl-modules, libtext-template-perl, libconfig-inifiles-perl, ${misc:Depends} +Depends: debootstrap, perl-modules, libtext-template-perl, libconfig-inifiles-perl, libfile-slurp-perl, ${misc:Depends} Recommends: xen-hypervisor-amd64 | xen-hypervisor-i386 | xen-hypervisor-i386-pae, xen-shell, libexpect-perl Suggests: reiserfsprogs, xfsprogs, rinse Description: Tools to manage Xen virtual servers diff --git a/etc/xen-tools.conf b/etc/xen-tools.conf index 7d6873c..2997b39 100644 --- a/etc/xen-tools.conf +++ b/etc/xen-tools.conf @@ -130,7 +130,7 @@ memory = 128Mb # Memory size swap = 128Mb # Swap size # noswap = 1 # Don't use swap at all for the new system. fs = ext3 # use the EXT3 filesystem for the disk image. -dist = etch # Default distribution to install. +dist = `xen-guess-debian-mirror -s` # Default distribution to install. image = sparse # Specify sparse vs. full disk images. # @@ -211,7 +211,7 @@ initrd = /boot/initrd.img-`uname -r` # # The default mirror for debootstrap to install Debian-derived distributions # -mirror = http://ftp.us.debian.org/debian/ +mirror = `xen-guess-debian-mirror -m` # # A mirror suitable for use when installing the Dapper release of Ubuntu.