1
0
mirror of synced 2026-02-19 13:25:04 +00:00

Compare commits

..

3 Commits

Author SHA1 Message Date
Steve Kemp
09bf1cd84d Document state of Debian package 3.9-3 2010-08-31 22:40:01 +02:00
Steve Kemp
7d9b9b9881 Document state of Debian package 3.9-2 2010-08-31 22:28:34 +02:00
Steve Kemp
aba8e1b411 Document state of Debian package 3.9-1 2010-08-31 22:19:29 +02:00
298 changed files with 12144 additions and 8552 deletions

33
.gitignore vendored
View File

@@ -1,33 +0,0 @@
# Note! Please run 'prove t/gitignore.t' after changing
# this file, to check its coherency
# all dotfiles
.*
# but we _wan't_ those dot-files
!.gitignore
!.mailmap
# ChangeLog is generated during make
/ChangeLog
# those are generated during debian package build
/build-stamp
/configure-stamp
/man
/debian/files
/debian/xen-tools
/debian/xen-tools.debhelper.log
/debian/xen-tools.substvars
# git-generated patches
/*.patch
# some backups
*~
*.orig
# backups created by "make update-version"
*.bak
# Devel::Cover cache
cover_db/

View File

@@ -1,6 +0,0 @@
Axel Beckert <abe@deuxchevaux.org>
Dmitry Nedospasov <dmitry@nedos.net>
Nathan O'Sullivan <nathan@mammoth.com.au>
Radu Spineanu <radu@debian.org> radu <none@none>
Steve Kemp <steve@steve.org.uk> steve <none@none>
Stéphane Jourdois <sjourdois@gmail.com> <stephane@jourdois.fr>

34
.release Normal file
View File

@@ -0,0 +1,34 @@
#
# Configuration file for 'release', a utility to make release more
# easily:
#
# http://release.repository.steve.org.uk/
#
# Steve
# --
#
#
# Command to run
#
preupload="make release"
#
#
# Pattern for our release tarball.
#
pattern=xen-tools-[0-9].[0-9].tar.gz*
#
# Pattern for our GPG-signature.
#
signature=xen-tools-[0-9].[0-9].tar.gz.asc
#
# Upload location.
#
upload=steve@www.xen-tools.org:/home/www/www.xen-tools.org/htdocs/software/xen-tools/

57
AUTHORS
View File

@@ -1,9 +1,8 @@
Primary Authors
---------------
Axel Beckert <abe@deuxchevaux.org>
Dmitry Nedospasov <dmitry@nedos.net>
Stéphane Jourdois <sjourdois [at] com.gmail>
Primary Author
--------------
Steve Kemp <steve [at] uk.org.steve>
@@ -12,7 +11,7 @@ Contributions
Listed alphabetically by surname.
C.J. Adams-Collier <cjcollier [at] com.gmail>
C.J. Adams-Collier <cjcollier [at] com.gmail.com
- Added new modular structure to the code.
Nick Anderson <nick [at] net.anders0n>
@@ -24,16 +23,6 @@ Contributions
Justin Azoff <JAzoff [at] edu.albany.uamail>
- Added LVM support to xen-create-image.
Pieter Barrezeele <macbar [at] be.fab4>
- Several small but useful enhancements
- Bugfixes
Brian Bennett <bahamat [at] net.digitalelf>
- Made multiple times given --ip options work
Vagrant Cascadian <vagrant [at] org.debian>
- Less redundant SSH key generation
Edd Dumbill <edd [at] com.usefulinc>
- Contributed APT sources.list file for Ubuntu's Dapper release.
@@ -43,18 +32,12 @@ Contributions
Stefan Fritsch <sf [at] de.sfritsch>
- Contributed the policy-rc.d fixups for common.sh
Raphaël Halimi <raphael.halimi [at] com.gmail>
- Contribute bashism fix
Sven Hertge <sven [at] de.svenhartge>
- Bugfix for Debian/Gentoo package installation.
Joey Hess <joeyh [at] org.debian>
- Provided sample code for module copying and several useful bug reports
John Hughes <john [at] com.fallenbit>
- Physical devices reordering for pygrub
Kirk Ismay <captain [at] com.netidea>
- Added hook for automatic CFEngine installation.
@@ -65,41 +48,21 @@ Contributions
- Improved binary detection and good suggestions.
- Better portability for non-bash shells.
Jorge Armando Medina <jmedina [at] com.e-compugraf>
- Fix for backward compatibility with xvc0 serial consoles
Gordon Messmer <gmessmer [at] edu.washington.u>
- Supplied .spec file for building .rpm packages.
Wilson Neil <neil [at] uk.co.aldur>
- Several suggestions and code for disabling start-stop-daemon
- Compatibility fixups for Ubuntu.
Nathan O'Sullivan <nathan [at] au.com.mammoth>
- New features wrt. options and helper functions
Guillaume Pernot <gpernot [at] org.praksys>
- Fixed Sarge amd64 special case
Walter Reiner <walter [at] at.wreiner>
- Provided --image-dev + --swap-dev patch.
Jameson Rollins <jrollins [at] edu.columbia.phys>
- Provided --output + --extension code.
Michal Safranek (Wejn) <wejn [at] box.cz>
- Inspiration for pygrub in the install-kernel scripts
Felipe Scarel <fbscarel [at] com.gmail>
- Bugfix for --no-swap + LVM
Johan Schurer <johannes.schurer [at] com.alcatel-lucent>
- CentOS 6 support
- CentOS 5 fixes
Radu Spineanu <radu [at] org.debian>
- Supplied many small tweaks, bugfixes, and suggestions.
- Radu is also one of the former Debian package maintainers.
- Radu is also the Debian package maintainer and has CVS commit access.
Henning Sprang <henning_sprang [at] de.gmx>
- Many suggestions and useful Debian bug reports.
@@ -110,11 +73,9 @@ Contributions
Gergely Tamas <dice [at] hu.kfki.mfa>
- Added patch to make initrd setup optional.
Alex Tomlins <alex.tomlins [at] com.unboxedconsulting>
- apt_proxy support
Ward Vandewege <ward [at] be.pong>
- Made several updates for Ubuntu support.
xstasi on Launchpad
- Proper upstart handling in the chroot
Wilson Neil <neil [at] uk.co.aldur>
- Several suggestions and code for disabling start-stop-daemon
- Compatibility fixups for Ubuntu.

27
BUGS Normal file
View File

@@ -0,0 +1,27 @@
Reporting Bugs
--------------
To report a bug please use the xen-tools-discuss mailing list:
http://xen-tools.org/software/xen-tools/lists.html
If you're capable of fixing it yourself a patch is appreciated,
and a test case would be a useful bonus.
Known Bugs
----------
The Debian bug tracker contains a list of all currently
open issues which have been reported by the users of the Debian
package (the primary user-base):
http://bugs.debian.org/xen-tools
If you're running the code on a Debian host system then reporting
bugs against this package is a good thing to do; by doing so you
allow others to view issues, and I check the bug-page regularly.
Steve
--

View File

@@ -1,23 +0,0 @@
Reporting Bugs
==============
To report a bug please use the [xen-tools-discuss* mailing
list](http://xen-tools.org/software/xen-tools/lists.html).
If you're capable of fixing it yourself a patch is appreciated, and a
test case would be a useful bonus.
Known Bugs
==========
The Debian bug tracker contains a [list of all currently open
issues](http://bugs.debian.org/xen-tools) which have been reported by
the users of the Debian package (the primary user-base).
If you're running the code on a Debian host system then reporting bugs
against this package is a good thing to do; by doing so you allow
others to view issues, and I check the bug-page regularly.
--
The Xen-Tools Developer Team

View File

@@ -1,34 +0,0 @@
KNOWN BUGS in xen-tools
=======================
Bugs to fix before next release
-------------------------------
[None so far]
Bugs to fix rather soon
-----------------------
* `xen-delete-image` doesn't remove all logical volumes if `--partitions` is used.
See the link below for details how to reproduce. Reproducable at
least with `--lvm`. Thanks to Antoine Benkemoun for reporting.
[Bug Report](http://xen-tools.org/pipermail/xen-tools-discuss/2010-May/000757.html)
* partitions were mounted in config file order, not in mountpoint order.
That implies that if you specified :
/boot
/
in that order, `/` was mounted _over_ `/boot`, and you would not
_see_ `/boot`. Xen-Tools would then install `boot` on your `/`
partition, and your boot device was just empty and unbootable.
Workaround for 4.2 is to write your partition file such as mounts overlap
correctly when mounted in specified order.
Current (unreleased) fix is to sort by mountpoint length.
Fix would be to reproduce what mount does with mount `-a`.

View File

@@ -2,12 +2,7 @@
xen-tools
---------
Copyright (c) 2005-2009: Steve Kemp. All rights reserved.
Copyright (c) 2010-2013: The Xen-Tools Development Team, currently consisting of:
Axel Beckert <abe@deuxchevaux.org>,
Dmitry Nedospasov <dmitry@nedos.net>, and
Stéphane Jourdois <sjourdois@gmail.com>
Copyright (c) 2005-2007 by Steve Kemp. All rights reserved.
This project is free software. You may redistribute it under the
terms of *either* the Perl Artistic License, or the GNU General

178
Makefile
View File

@@ -12,18 +12,15 @@
#
# Only used to build distribution tarballs.
#
TMP ?= /tmp
DIST_PREFIX = ${TMP}
VERSION = 4.4rc1
DEBVERSION = $(shell echo $(VERSION)|sed 's/\(rc\|pre\|beta\|alpha\)/~\1/')
VERSION = 3.9
BASE = xen-tools
VCS = git
#
# Installation prefix, useful for the Debian package.
#
DESTDIR=
prefix=${DESTDIR}
prefix=
nop:
@@ -45,45 +42,40 @@ nop:
# with those details.
#
changelog:
$(VCS) log -v > ChangeLog
hg log -v > ChangeLog
#
# Delete all temporary files, recursively.
#
clean:
@find . \
-path ./.git -prune -o \
\( \
-name '*~' -o \
-name '.#*' -o \
-name '*.bak' -o \
-name '*.tmp' -o \
-name 'tags' -o \
-name '*.8.gz' -o \
-name '*.tdy' \
\) -exec rm "{}" +
@if [ -d man ]; then rm -rf man ; fi
@find . -name '.*~' -exec rm \{\} \;
@find . -name '.#*' -exec rm \{\} \;
@find . -name '*~' -exec rm \{\} \;
@find . -name '*.bak' -exec rm \{\} \;
@find . -name '*.tmp' -exec rm \{\} \;
@find . -name 'tags' -exec rm \{\} \;
@find . -name '*.8.gz' -exec rm \{\} \;
@find man -name '*.html' -exec rm \{\} \;
@if [ -e build-stamp ]; then rm -f build-stamp ; fi
@if [ -e configure-stamp ]; then rm -f configure-stamp ; fi
@if [ -d debian/xen-tools ]; then rm -rf ./debian/xen-tools; fi
@if [ -e $(BASE)-$(VERSION).tar.gz ]; then rm $(BASE)-$(VERSION).tar.gz ; fi
@if [ -e $(BASE)-$(VERSION).tar.gz.asc ]; then rm $(BASE)-$(VERSION).tar.gz.asc ; fi
cd t; $(MAKE) clean
#
# If the testsuite runs correctly then commit any pending changes.
#
commit: test
$(VCS) commit
hg commit
#
# Show what has been changed in the local copy vs. the remote repository.
#
diff:
$(VCS) diff 2>/dev/null
hg diff 2>/dev/null
#
@@ -95,7 +87,7 @@ fixup-perms:
chmod 644 etc/xen-tools.conf
chmod 644 etc/xm.tmpl
chmod 644 etc/xm-nfs.tmpl
chmod 644 misc/*
chmod 644 misc/xm misc/xen-tools misc/README
#
# Install files to /etc/
@@ -110,10 +102,9 @@ install-etc:
cp etc/xm.tmpl ${prefix}/etc/xen-tools/
cp etc/xm-nfs.tmpl ${prefix}/etc/xen-tools/
cp partitions/*-* ${prefix}/etc/xen-tools/partitions.d/
-mkdir -p ${prefix}/etc/bash_completion.d/
cp misc/xen-tools.bash-completion ${prefix}/etc/bash_completion.d/xen-tools
-mkdir -p ${prefix}/etc/initramfs-tools/conf.d/
cp misc/xen-tools.initramfs-tools ${prefix}/etc/initramfs-tools/conf.d/xen-tools
-mkdir -p ${prefix}/etc/bash_completion.d
cp misc/xen-tools ${prefix}/etc/bash_completion.d/
cp misc/xm ${prefix}/etc/bash_completion.d/
#
@@ -129,7 +120,6 @@ install-bin:
cp bin/xen-delete-image ${prefix}/usr/bin
cp bin/xen-list-images ${prefix}/usr/bin
cp bin/xen-update-image ${prefix}/usr/bin
cp bin/xt-guess-suite-and-mirror ${prefix}/usr/bin
chmod 755 ${prefix}/usr/bin/xen-create-image
chmod 755 ${prefix}/usr/bin/xen-create-nfs
chmod 755 ${prefix}/usr/bin/xt-customize-image
@@ -138,7 +128,6 @@ install-bin:
chmod 755 ${prefix}/usr/bin/xen-delete-image
chmod 755 ${prefix}/usr/bin/xen-list-images
chmod 755 ${prefix}/usr/bin/xen-update-image
chmod 755 ${prefix}/usr/bin/xt-guess-suite-and-mirror
@@ -147,64 +136,35 @@ install-bin:
#
install-hooks:
for i in roles/* ; do if [ -f $$i ]; then cp $$i ${prefix}/etc/xen-tools/role.d; fi ; done
for i in ${prefix}/usr/share/xen-tools/*.d; do if [ -L "$$i" ]; then rm -vf "$$i"; fi; done
mkdir -p ${prefix}/usr/share/xen-tools/centos-4.d/
mkdir -p ${prefix}/usr/share/xen-tools/centos-5.d/
mkdir -p ${prefix}/usr/share/xen-tools/centos-6.d/
mkdir -p ${prefix}/usr/share/xen-tools/fedora-core-6.d/
cp -R hooks/centos-4/*-* ${prefix}/usr/share/xen-tools/centos-4.d
cp -R hooks/centos-5/*-* ${prefix}/usr/share/xen-tools/centos-5.d
cp -R hooks/centos-6/*-* ${prefix}/usr/share/xen-tools/centos-6.d
cp -R hooks/fedora-core-6/*-* ${prefix}/usr/share/xen-tools/fedora-core-6.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-4.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-5.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-7.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-8.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-9.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-10.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-11.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-12.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-13.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-14.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-15.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-16.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s fedora-core-6.d fedora-core-17.d
mkdir -p ${prefix}/usr/share/xen-tools/debian.d/
cp -R hooks/debian/*-* ${prefix}/usr/share/xen-tools/debian.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s debian.d sarge.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s debian.d etch.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s debian.d lenny.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s debian.d squeeze.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s debian.d wheezy.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s debian.d jessie.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s debian.d sid.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s debian.d testing.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s debian.d stable.d
mkdir -p ${prefix}/usr/share/xen-tools/gentoo.d/
cp -R hooks/gentoo/*-* ${prefix}/usr/share/xen-tools/gentoo.d
mkdir -p ${prefix}/usr/share/xen-tools/dapper.d/
cp -R hooks/dapper/*-* ${prefix}/usr/share/xen-tools/dapper.d/
mkdir -p ${prefix}/usr/share/xen-tools/edgy.d/
cp -R hooks/edgy/*-* ${prefix}/usr/share/xen-tools/edgy.d/
-cd ${prefix}/usr/share/xen-tools/ && ln -s edgy.d feisty.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s edgy.d gutsy.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s edgy.d hardy.d
mkdir -p ${prefix}/usr/share/xen-tools/intrepid.d/
cp -R hooks/intrepid/*-* ${prefix}/usr/share/xen-tools/intrepid.d/
-cd ${prefix}/usr/share/xen-tools/ && ln -s intrepid.d jaunty.d
mkdir -p ${prefix}/usr/share/xen-tools/karmic.d/
cp -R hooks/karmic/*-* ${prefix}/usr/share/xen-tools/karmic.d/
-cd ${prefix}/usr/share/xen-tools/ && ln -s karmic.d lucid.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s karmic.d maverick.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s karmic.d natty.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s karmic.d oneiric.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s karmic.d precise.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s karmic.d quantal.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s karmic.d raring.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s karmic.d saucy.d
-cd ${prefix}/usr/share/xen-tools/ && ln -s karmic.d trusty.d
cp hooks/common.sh ${prefix}/usr/share/xen-tools
cp -r hooks/common ${prefix}/usr/share/xen-tools
mkdir -p ${prefix}/usr/lib/xen-tools/centos-4.d/
mkdir -p ${prefix}/usr/lib/xen-tools/centos-5.d/
mkdir -p ${prefix}/usr/lib/xen-tools/fedora-core-6.d/
cp -R hooks/centos-4/*-* ${prefix}/usr/lib/xen-tools/centos-4.d
cp -R hooks/centos-5/*-* ${prefix}/usr/lib/xen-tools/centos-5.d
cp -R hooks/fedora-core-6/*-* ${prefix}/usr/lib/xen-tools/fedora-core-6.d
-cd ${prefix}/usr/lib/xen-tools/ && ln -s fedora-core-6.d fedora-core-4.d
-cd ${prefix}/usr/lib/xen-tools/ && ln -s fedora-core-6.d fedora-core-5.d
-cd ${prefix}/usr/lib/xen-tools/ && ln -s fedora-core-6.d fedora-core-7.d
-cd ${prefix}/usr/lib/xen-tools/ && ln -s fedora-core-6.d fedora-core-8.d
mkdir -p ${prefix}/usr/lib/xen-tools/debian.d/
cp -R hooks/debian/*-* ${prefix}/usr/lib/xen-tools/debian.d
-cd ${prefix}/usr/lib/xen-tools/ && ln -s debian.d sarge.d
-cd ${prefix}/usr/lib/xen-tools/ && ln -s debian.d lenny.d
-cd ${prefix}/usr/lib/xen-tools/ && ln -s debian.d etch.d
-cd ${prefix}/usr/lib/xen-tools/ && ln -s debian.d sid.d
mkdir -p ${prefix}/usr/lib/xen-tools/gentoo.d/
cp -R hooks/gentoo/*-* ${prefix}/usr/lib/xen-tools/gentoo.d
mkdir -p ${prefix}/usr/lib/xen-tools/edgy.d/
cp -R hooks/edgy/*-* ${prefix}/usr/lib/xen-tools/edgy.d/
-cd ${prefix}/usr/lib/xen-tools/ && ln -s edgy.d feisty.d
-cd ${prefix}/usr/lib/xen-tools/ && ln -s edgy.d gutsy.d
mkdir -p ${prefix}/usr/lib/xen-tools/dapper.d/
cp -R hooks/dapper/*-* ${prefix}/usr/lib/xen-tools/dapper.d/
mkdir -p ${prefix}/usr/lib/xen-tools/edgy.d/
cp -R hooks/edgy/*-* ${prefix}/usr/lib/xen-tools/edgy.d/
mkdir -p ${prefix}/usr/lib/xen-tools/dapper.d/
cp -R hooks/dapper/*-* ${prefix}/usr/lib/xen-tools/dapper.d/
cp hooks/common.sh ${prefix}/usr/lib/xen-tools
#
@@ -212,6 +172,7 @@ install-hooks:
#
install-libraries:
-mkdir -p ${prefix}/usr/share/perl5/Xen/Tools
cp ./lib/Xen/*.pm ${prefix}/usr/share/perl5/Xen
cp ./lib/Xen/Tools/*.pm ${prefix}/usr/share/perl5/Xen/Tools
#
@@ -232,38 +193,30 @@ install: fixup-perms install-bin install-etc install-hooks install-libraries ins
# Build our manpages via the `pod2man` command.
#
manpages:
-mkdir -p man
cd bin; for i in *-*[!y]; do pod2man --release=${VERSION} --official --section=8 $$i ../man/$$i.8; done
cd bin; for i in *-*; do pod2man --release=${VERSION} --official --section=8 $$i ../man/$$i.8; done
for i in man/*.8; do gzip --force -9 $$i; done
#
# Make a new release tarball, and make a GPG signature.
#
release: tidy fixup-perms update-version update-modules clean changelog
release: fixup-perms update-version update-modules clean changelog
rm -rf $(DIST_PREFIX)/$(BASE)-$(VERSION)
rm -f $(DIST_PREFIX)/$(BASE)-$(VERSION).tar.gz
cp -R . $(DIST_PREFIX)/$(BASE)-$(VERSION)
rm -rf $(DIST_PREFIX)/$(BASE)-$(VERSION)/debian
rm -rf $(DIST_PREFIX)/$(BASE)-$(VERSION)/.git*
rm -rf $(DIST_PREFIX)/$(BASE)-$(VERSION)/.hg*
cd $(DIST_PREFIX) && tar -cvf $(DIST_PREFIX)/$(BASE)-$(VERSION).tar $(BASE)-$(VERSION)/
gzip $(DIST_PREFIX)/$(BASE)-$(VERSION).tar
mv $(DIST_PREFIX)/$(BASE)-$(VERSION).tar.gz ..
mv $(DIST_PREFIX)/$(BASE)-$(VERSION).tar.gz .
rm -rf $(DIST_PREFIX)/$(BASE)-$(VERSION)
gpg --armour --detach-sign ../$(BASE)-$(VERSION).tar.gz
#
# Make a new orig.tar.gz for the Debian package
#
orig-tar-gz: release
cp -p ../$(BASE)-$(VERSION).tar.gz ../$(BASE)_$(DEBVERSION).orig.tar.gz
cp -p ../$(BASE)-$(VERSION).tar.gz.asc ../$(BASE)_$(DEBVERSION).orig.tar.gz.asc
gpg --armour --detach-sign $(BASE)-$(VERSION).tar.gz
#
# Run the test suite.
#
test: update-modules
test:
prove --shuffle t/
@@ -275,17 +228,6 @@ test-verbose:
#
# Run our main script(s) through perltidy
#
tidy:
if [ -x /usr/bin/perltidy ]; then \
for i in bin/*-*[^~]; do \
echo "tidying $$i"; \
perltidy $$i \
; done \
; fi
#
# Uninstall the software, completely.
#
@@ -298,15 +240,13 @@ uninstall:
rm -f ${prefix}/usr/bin/xt-install-image
rm -f ${prefix}/usr/bin/xt-create-xen-config
rm -f ${prefix}/usr/bin/xen-create-nfs
rm -f ${prefix}/usr/bin/xt-guess-suite-and-mirror
rm -f ${prefix}/etc/xen-tools/xen-tools.conf
rm -f ${prefix}/etc/xen-tools/xm.tmpl
-rm -rf ${prefix}/etc/xen-tools/skel
-rmdir ${prefix}/etc/xen-tools/
-rm -f ${prefix}/etc/bash_completion.d/xen-tools
# Maybe needed to remove older releases of xen-tools
-rm -f ${prefix}/etc/bash_completion.d/xm
rm -rf ${prefix}/usr/lib/xen-tools
rm -rf ${prefix}/usr/share/xen-tools
rm -f ${prefix}/usr/share/man/man8/xen-create-image.8.gz
rm -f ${prefix}/usr/share/man/man8/xen-delete-image.8.gz
rm -f ${prefix}/usr/share/man/man8/xen-list-images.8.gz
@@ -318,8 +258,8 @@ uninstall:
#
# NOTE: Removes empty local directories.
#
update:
$(VCS) pull --update 2>/dev/null
update:
hg pull --update 2>/dev/null
#
@@ -327,7 +267,7 @@ update:
# cases to ensure that all required modules are available.
#
update-modules:
@cd t && make modules
cd t && make modules
#
@@ -335,4 +275,4 @@ update-modules:
# at the top of this file. Steve-Specific?
#
update-version:
perl -pi.bak -e "s/RELEASE = '[0-9]\.[0-9][^']*';/RELEASE = '${VERSION}';/g" bin/*-*[!~]
perl -pi.bak -e "s/RELEASE = '[0-9]\.[0-9]';/RELEASE = '${VERSION}';/g" bin/*-*

View File

@@ -1,75 +0,0 @@
xen-tools 4.3.1 (released 30-Jun-2012)
======================================
Bugfix Release only
xen-tools 4.3 (released 26-Jun-2012)
====================================
Bug Fixes
---------
* Fix several testuite failures depending on the build host's
installation.
Other Changes
-------------
* Remove most Mercurial traces
xen-tools 4.3rc1 (released 08 Jun 2012)
=======================================
New Features and Major Changes
------------------------------
* Massive code deduplication in hooks directory
New Options
-----------
--dontformat (xen-create-image)
--finalrole (xen-create-image)
--apt_proxy (xen-create-image)
Newly Supported Distribution Releases
-------------------------------------
* Ubuntu 11.10 Oneiric
* Ubuntu 12.04 Precise
* Ubuntu 12.10 Quantal
* CentOS 6
xen-tools 4.2.1 (released 17 Mar 2011)
======================================
Bugfix Release only
xen-tools 4.2 (released 05 Oct 2010)
====================================
First final release of the new Xen-Tools Team.
Supports Ubuntu up to 11.04 (Natty) and Debian up to 7.0 (Wheezy).
New Options
-----------
--debootstrap-cmd (xen-create-image and xt-install-image)
New Features and Major Changes
------------------------------
* Uses hvc0 and xvda devices by default
* Also supports cdebootstrap
* Preliminary btrfs support.
* Uses GeoIP for Debian mirrors: Default Debian mirror is now
cdn.debian.net, see http://wiki.debian.org/DebianGeoMirror for
details.
* New helper program xt-guess-suite-and-mirror, used to find the
default mirror and suite.

137
README Normal file
View File

@@ -0,0 +1,137 @@
Homepage:
http://www.xen-tools.org/software/xen-tools
Mercurial Repository:
http://xen-tools.repository.steve.org.uk/
Mailing Lists:
http://xen-tools.org/software/xen-tools/lists.html
xen-tools
---------
The xen-tools package contains a collection of Perl scripts for
working with Xen guest images under Debian GNU/Linux.
Using this software, you can easily create new Xen guests configured
to be accessible over your local network and complete with an installed
copy of OpenSSH.
This software is primarily aimed at users who wish to create virtual
instances of Debian Sarge, Etch, or Sid. Although other distributions
such as Ubuntu Dapper, Edgy, and Feisty are supported if you have the
appropriate packages installed.
Requirements
------------
To use these tools you'll need the following software:
* debootstrap
* Perl
* The Perl module "Text::Template"
* The Perl module "Config::IniFiles"
- Both of these modules are available as Debian packages,
or direct from http://www.cpan.org/ for non-Debian distributions.
In order to install RPM-based distributions such as CentOS, or
Fedora Core you will need a correctly installed and configured
"rinse" package.
To install Ubuntu distributions upon a Debian host system you will
need either:
* The Ubuntu version of debootstrap installed.
* A patched debootstrap package from:
http://steve.org.uk/Software/tmp/debootstrap/
If you wish to create new Xen instances which may be controlled by
users via a login shell you should also install the xen-shell package
which is available from:
http://xen-tools.org/software/xen-shell/
The Scripts
-----------
There now follows a brief description of each included script,
for more thorough documentation please consult the appropriate
manpage.
xen-create-image
----------------
This script is designed to create new images which may be used
with the Xen hypervisor.
The virtual images will have their networking settings created and,
you may optionally cause the new instance to boot once it has
been created.
This script performs the initial setup, then delegates the real
work to a collection of helper scripts:
* xt-install-image
Installs a distribution into a directory.
* xt-customize-image
Run a collection of hook scripts to configure the freshly
installed system.
* xt-create-xen-config
Create a configuration file in /etc/xen such that Xen can
boot the newly created machine.
xen-create-nfs
--------------
This script is similar in spirit to xen-create-image, but much
less complex. It allows the creation of Xen guests which are
diskless, mounting their root filesystem over a remote NFS-share.
There are not many options to tweak, but still a useful addition
to the suite.
xen-delete-image
----------------
This script will allow you to completely remove Xen instances
which have previously been created by xen-create-image, this
includes removing the storage block devices from the system,
and deleting the Xen configuration file.
xen-list-images
---------------
List all the created images beneath a given root directory along
with a brief overview of their setup details.
xen-update-image
----------------
This script runs "apt-get update; apt-get upgrade" for a given
Xen image.
NOTES:
* The image should not be running or corruption will occur!
* The script should only be used for Xen instances of Debian or
a Debian-derived distribution.
Steve
--

View File

@@ -1,191 +0,0 @@
xen-tools
=========
* [Homepage](http://www.xen-tools.org/software/xen-tools)
* Git Repository:
* [at Gitorious](http://gitorious.org/xen-tools)
* [at GitHub](http://github.com/xtaran/xen-tools)
* [Mailing Lists](http://www.xen-tools.org/software/xen-tools/lists.html)
About
-----
xen-tools contains a collection of Perl scripts for working with Xen
guest images under Linux.
Using this software, you can easily create new
[Xen](http://www.xen.org) guests configured to be accessible over the
network via [OpenSSH](http://www.openssh.org/).
xen-tools currently has scripts to install most releases of
[Debian](http://www.debian.org/) (starting with 3.1 "Sarge") and
[Ubuntu](http://www.ubuntu.com/) (starting with 6.06 LTS "Dapper") and
some RPM-based distributions. On the Dom0 side all current Xen
supporting distributions should work.
However, currently only Debian and Ubuntu releases are tested and
known to work reliably, i.e.:
### Debian
* Sarge 3.1 (i386 and DomU only)
* Etch 4.0 (Dom0 no more tested)
* Lenny 5.0
* Squeeze 6.0
* Wheezy 7
* Jessie 8 (under developement)
* Sid (always under developement; works at least at the moment of writing :-)
### Ubuntu
(only DomUs tested)
* Dapper Drake 6.06 (needs editing of `/usr/share/debootstrap/scripts/dapper` since at least debootstrap version 1.0.37, see [#659360][1])
* Edgy Eft 6.10 (needs editing of `/usr/share/debootstrap/scripts/edgy` since at least debootstrap version 1.0.37, see [#659360][1])
* Feisty Fawn 7.04
* Gutsy Gibbon 7.10
* Hardy Heron 8.04 (see [Installing Ubuntu 8.04 as DomU][2])
* Interpid Ibex 8.10
* Jaunty Jackaplope 9.04
* Karmic Koala 9.10
* Lucid Lynx 10.04
* Maverick Meerkat 10.10
* Natty Narwhal 11.04
* Oneiric Ocelot 11.10
* Precise Pangolin 12.04
* Quantal Quetzal 12.10
* Raring Ringtail 13.04
* Saucy Salamander 13.10 (under developement)
[1]: http://bugs.debian.org/659360
"debootstrap in Wheezy can no more build Ubuntu Edgy or earlier"
[2]: http://www.linux-vserver.org/Installing_Ubuntu_8.04_Hardy_as_guest
"There is an issue with debootstrap on hardy not installing ksyslogd."
### CentOS
(only DomUs tested, pygrub support incomplete)
* CentOS 5
* CentOS 6
Packages
--------
xen-tools are available prepackaged in Debian (and derivates) and as
source tar-ball for local installation. Installing from source should
work flawlessly on most Linux systems that meet the installation
requirements.
Requirements
------------
To use these tools you'll need the following software:
* [debootstrap](http://packages.debian.org/debootstrap)
* Perl and the following Perl modules
* [Config::IniFiles](http://metacpan.org/release/Config-IniFiles)
([Debian Package libconfig-inifiles-perl](http://packages.debian.org/libconfig-inifiles-perl))
* [Text::Template](http://metacpan.org/release/Text-Template)
([Debian Package libtext-template-perl](http://packages.debian.org/libtext-template-perl))
* [Data::Validate::Domain](http://metacpan.org/release/Data-Validate-Domain)
([Debian Package libdata-validate-domain-perl](http://packages.debian.org/libdata-validate-domain-perl))
* [Data::Validate::IP](http://metacpan.org/release/Data-Validate-IP)
([Debian Package libdata-validate-ip-perl](http://packages.debian.org/libdata-validate-ip-perl))
* [Data::Validate::URI](http://metacpan.org/release/Data-Validate-URI)
([Debian Package libdata-validate-uri-perl](http://packages.debian.org/libdata-validate-uri-perl))
* [File::Slurp](http://metacpan.org/release/File-Slurp)
([Debian Package libfile-slurp-perl](http://packages.debian.org/libfile-slurp-perl))
* [File::Which](http://metacpan.org/release/File-Which)
([Debian Package libfile-which-perl](http://packages.debian.org/libfile-which-perl))
* and some more modules which are part of the Perl core and hence do not need to be installed separately.
* Make, if you are not installing through a package manager
You can try to install RPM-based distributions such as CentOS, or
Fedora Core, but you will need a correctly installed and configured
[rinse](http://packages.debian.org/rinse) package. This is currently
not fully supported.
If you wish to create new Xen instances which may be controlled by
users via a login shell you can have a look at the (currently
unmaintained) [xen-shell](http://xen-tools.org/software/xen-shell/)
project.
Installation
------------
As root or with sudo, execute `make instal`.
See `debian/README.source` how to build the Debian package from a
checked out copy of the git repository (i.e. without a source tar
ball).
The Scripts
-----------
Here is a brief description of each included script, for more thorough
documentation please consult the appropriate man page.
### xen-create-image
This script is designed to create new images which may be used
with the Xen hypervisor.
This script performs the initial setup, then delegates the real
work to a collection of helper scripts:
* `xt-install-image`: Installs a distribution into a directory.
* `xt-customize-image`: Run a collection of hook scripts to configure
the freshly installed system.
* `xt-create-xen-config`: Create a configuration file in `/etc/xen`
such that Xen can boot the newly created machine.
* `xt-guess-suite-and-mirror`: In case of a Debian or Ubuntu Dom0,
this script tries to guess the most suitable suite and mirror for
DomUs based on the Dom0's `/etc/apt/sources.list`.
### xen-create-nfs
This script is similar in spirit to `xen-create-image`, but much less
complex. It allows the creation of Xen guests which are diskless,
mounting their root filesystem over a remote NFS-share.
There are not many options to tweak, but still a useful addition
to the suite.
### xen-delete-image
This script will allow you to completely remove Xen instances which
have previously been created by `xen-create-image`, this includes
removing the storage block devices from the system, and deleting the
Xen configuration file.
### xen-list-images
List all the created images beneath a given root directory along with
a brief overview of their setup details.
### xen-update-image
This script runs "apt-get update; apt-get upgrade" for a given Xen
image.
#### NOTES
* The image should not be running or corruption will occur!
* The script should only be used for Xen instances of Debian or a
Debian-derived distribution.
--
The Xen-Tools Developer Team

42
SUPPORT Normal file
View File

@@ -0,0 +1,42 @@
Mailing List
------------
For assistance on using, or customising, these scripts please
consult the manpages initially, then the website:
http://xen-tools.org/software/xen-tools/
If these are not sufficient resources please consider posting
any queries you might have to the mailing list:
http://xen-tools.org/software/xen-tools/lists.html
Included with the release you should find the file "BUGS" which
contains some notes on reporting bugs.
Xen Queries
-----------
If your query is mostly related to Xen, rather than these tools,
then please consider joining the xen-users mailing list:
http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-users
The members of that list are very good at diagnosing issues with
networking, block devices, and other Xen oddities.
Contact The Author
------------------
As a last resort feel free to contact the author at <steve@steve.org.uk>.
I say last resort not because I'm unwilling to help, but because
it will take longer for me to respond to you personally and I hate
answering the same question multiple times.
Steve
--

View File

@@ -1,41 +0,0 @@
Mailing List
============
For assistance on using, or customising, these scripts please consult
the manpages initially, then the
[website](http://xen-tools.org/software/xen-tools/).
If these are not sufficient resources please consider posting any
queries you might have to the [mailing
list](http://xen-tools.org/software/xen-tools/lists.html)
Included with the release you should find the file `BUGS.markdown`
which contains some notes on reporting bugs.
Xen Queries
===========
If your query is mostly related to Xen, rather than these tools, then
please consider joining the [xen-users mailing
list](http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-users)
The members of that list are very good at diagnosing issues with
networking, block devices, and other Xen oddities.
There's also the IRC channel `##xen` (the double hashmark is not a
typo) on the [Freenode](http://freenode.net/) IRC network.
Contact The Author
==================
As a last resort you can to contact the current maintainer, Axel
Beckert, at <abe@deuxchevaux.org>.
As the previous xen-tools maintainer and original author, Steve
Kemp, said, I say last resort not because I'm unwilling to help, but
because it may take longer for me to respond to you personally.
--
Axel

16
TODO Normal file
View File

@@ -0,0 +1,16 @@
TODO
----
1. Test and support more file system types. Actually this should be
pretty simple now that the parameters are stored in the configuration
hash. The only issue is that trailing whitespace is missing from the
"make_fs_foo" option.
2. Write more test cases.
3. LVM snapshot support as an install source.
4. xen-delete-image should unallocate any used IP addresses.
Steve
--

View File

@@ -1,245 +0,0 @@
TODO
====
See KNOWN_BUGS.markdown for real bugs.
Bugs to fix and features to add for 5.0
---------------------------------------
* `xen-create-image` man page overhaul:
* ambiguous option list with regards to parameters
* Set Fail in more situations where the script has clearly failed
i.e.: lvm exists
* Test and support more file system types.
Actually this should be pretty simple now that the parameters are
stored in the configuration hash.
* Setup locales in the hooks?
Currently no locales are set and this causes several domU errors
which appear in the domU's logs.
* Documentation overhaul
Better explain what roles /should be/ used for, and that roles
are examples, and shouldn't cover every single scenario. They
are also easy to write.
* Think again about disk_device checks :
Newer Xen provides `xvda`, older provided `sda`. The current check for
valid values of `disk_device` (used for root device in DomU `/etc/fstab`)
does only allow those values.
This forbids any deployment of LVM/RAID _inside_ DomU, which cannot
be created by xen-tools anyway. So the current check is fine with the
current possibilities of xen-tools, but could become a limitation.
* Is it possible/wanted to "query" xend for default device names?
* Is it possible to create `/dev/mapper` devices with xend conf?
* Can we just avoid to ask for this value and not specify the device
in `/etc/fstab` (and use `/dev/root`, `/dev/by-uuid`, or anything?)
* `xen-create-image --dist=…` / sources.list generation should be more fine-grained
xen-tools should offer the possibility to enable/disable
security/volatile/backports as well as
contrib/non-free/universe/restricted/multiverse for each of them not
only based on defaults plus the Dom0's sources.list
One idea is to allow parameters like
--dist="lenny:main,contrib,non-free;security;volatile:main"
and maybe (if the default will be to include security) to also
allow
--dist="lenny;no-security"
The second idea (by Mathieu Parent) is to have an
`/etc/xen-tools/sources.list.d/` which then contains files like
`lenny.list`, `lenny-server.list`, `karmic.list`, etc. which
defaults to `$dist.list`, but can be also select with
`--sources-list=lenny-server` (which looks for
`./lenny-server.list`, `./lenny-server`,
`/etc/xen-tools/sources.list.d/lenny-server.list` and
`/etc/xen-tools/sources.list.d/lenny-server` in that order).
Third variant is to use `/etc/xen-tools/sources.lists/` instead of
`/etc/xen-tools/sources.list.d/` because that directory is no
runparts-like directory.
* LVM snapshot support as an install source.
* Generic grub support
This will generate a much nicer `menu.lst` as a side effect, as its
currently generated once at install, and is never updated. Installing
a full grub into the domU should update the `menu.lst` every time a
new kernel is installed and will also use the domU distro's `menu.lst`
conform.
* pv-grub support
This is a ways away and will probably start with a `xen-pv-grub`
package.
* Move the hooks directory to `/etc/xen-tools/` to officially allow
added and modified hooks.
* Clean up the hooks directory
We still have a link farm for hooks and a meta link farm for distro
releases created on `make install`. It probably would be better if
we would just have one directory per distro (like with debian) but
without the need to created symlinks on `make install`.
Currently CentOS's `25-setup-kernel` creates an fstab and
`90-make-fstab` does again. It works, but that cries for debugging
hell.
`centos-5/25-setup-kernel` and `centos-6/25-setup-kernel` still
differ and I'm not sure if that's necessary respectively what's the
common denominator.
`80-install-kernel` is not yet merged into one hook script.
Common oneliners for code deduplication in the hooks/ directory:
$ find -L . -not -xtype l -not -type d -not -path '*/common/*' | sort -t / -k3
$ fdupes -r1 . | sort -t / -k3
$ find . -type f | sim_text -ipTt 50 | tac | column -t
* Create users, add ssh pubkeys to `.ssh/authorized_keys`
Still have to think of a good way of doing this. It would be nice
To specify a directory of public keys, parsing the hostnames
parsing the usernames from the ssh comment line.
Potential ideas are to add options to add a given file as
`authorized_keys` (e.g. a users public key) or to just add the Dom0's
`/root/.ssh/authorized_keys` as the DomU's one.
* Generate ECDSA host keys where possible. (Likely depends on the
to-be-installed SSH version.)
* More generic roles
Deploy a web server or setup ssmtp directly via flag when setting up
the machine. Open to suggestions, should just be some general use-cases
that are fairly common.
* Sections for the xen-tools.conf file
Currently it's really annoying when you are trying to create VMs
on multiple subnets. It would be nice to specify with a flag what
"type" of configuration you want, and a set of options specific to
that flag could be parsed from xen-tools.conf
* Refactor the code for less variants of calling `cp`, `rm`, `mv`, etc.
E.g. always use either `cp()` from `File::Copy` or `/bin/cp`, but
not both. To allow verbose copying, I (Axel) would prefer `/bin/cp`
over `cp();`.
* Parse numerical parameters transparently for the user
The user shouldn't have to know whether he should specify size as
`<size>G` or `<size>Gb` or `<size>`. This should be parsed without
user interaction and rely on a common format.
* `xen-update-image` should mount `/dev/pts` before running apt-get
* `xen-update-image` should have options for using …
* aptitude instead of apt-get
* dist-upgrade instead of upgrade
* Support `cpu_weight` and other features from
http://wiki.xensource.com/xenwiki/CreditScheduler
* Make used Xen toolstack configurable, i.e. via --xen-toolstack=xl
* Unify --debug and --dumpconfig. Likely make --debug exit
gracefully. Document --debug if --dumpconfig is removed.
* Use `Perl::Critic`
* Refactor the different Ubuntu hooks directories so that only one
ubuntu hooks directory is left.
Then also refactor TLS disabling so that it works on all
distributions the same. Currently Debian is a special case and
Ubuntu half a special case.
* Remove from the (unused) Xen::Tools what's already in the used
Xen::Tools::Common.
* Add test for `--size` constraints (upper- and lowercase letters,
with and without `B`, etc.)
* Needs a `--dry-run` or `--check-constraints` option in
`xen-create-image` first. Which probably both would be a good
idea.
* Replace several occurences of backticks with runCommand. (Mostly
mount commands in `xen-update-image`. The calls to uname or
lsb_release should be fine.)
Stuff from Steve's TODO list / Generic TODOs
--------------------------------------------
* Write more test cases.
* `xen-delete-image` should unallocate any used IP addresses.
* `installGentooPackage` in `hooks/common.sh` is a stub and does
nothing yet.
Axel's Break-Backwards-Compatibility Wishlist
---------------------------------------------
* Make empty extension the default
This would ease tab completion and CLI parameter reusage with "xm
create" and friends.
* Check if we can reduce `MAKEDEV` invocations in
`hooks/common/55-create-dev`
`MAKEDEV std` is called in any case. First comment says "Early
termination if we have a couple of common devices present should
speed up installs which use `--copy`/`--tar`" and then "We still
need to make sure the basic devices are present" and calls `MAKEDEV`
more often than otherwise.
Additionally the `55-create-dev` for CentOS/Fedora just created
`console`, `zero` and `null`. `zero` and `null` are part of `MAKEDEV
std`, perhaps can we reduce it to that. `console` is part of
`MAKEDEV generic`.
Additionally the devices `hda`, `sda` and `tty1` may not necessary
in any case, but instead `hvc0` should be created for sure in many
cases. Nothing cares about `$serial_device` there either.
Current `MAKEDEV` implementation support more than one device as
parameter. That could reduce the `MAKEDEV` calls from currently six
to two.
* Uncouple generating auto start symlinks from `--boot`.
Maybe add some `--autostart` or such.
* MAC addresses should no more depend on the distribution.
* Let the admin switch between MAC addresses based on XenSource's OUI,
its organisation's own OUI or locally administrated MAC addresses.
See also http://wiki.xen.org/wiki/Xen_Networking#MAC_addresses
* More radical Code Deduplication
`bin/x*` currently still contain similar code like e.g. in the
function parseCommandLineArguments. This should be cleaned up, too,
but may need a bigger redesign.

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,5 @@
#!/usr/bin/perl -w
=encoding utf8
=head1 NAME
xen-create-nfs - Create a Xen configuration file for an NFS-root guest.
@@ -21,9 +19,8 @@ xen-create-nfs - Create a Xen configuration file for an NFS-root guest.
--dhcp Configure the guest to use DHCP for IP allocation.
--gateway The gateway address to use when configured with a static IP.
--hostname The hostname to configure for the guest.
--ip The IP address to use when configured with a static IP.
--netmask The netmask to use when configured with a static IP.
--nameserver The nameserver to use when configured with a static IP.
--ip The IP address to use when configured with a static IP.
General options:
--admins Specify which users should be setup as xen-shell admins.
@@ -38,6 +35,8 @@ xen-create-nfs - Create a Xen configuration file for an NFS-root guest.
--nfs_server Specify the NFS server to mount the root partition from.
--nfs_root Specify the path, upon the NFS server, to mount.
=cut
=head1 OPTIONS
@@ -55,8 +54,11 @@ Read the manual for this script.
=item B<--version>
Show the version number and exit.
=back
=cut
=head1 DESCRIPTION
@@ -68,6 +70,8 @@ Show the version number and exit.
support more than the minimal number of options to completement the
existing xen-create-image script, however it is hopefully useful.
=cut
=head1 REFERENCE
@@ -76,23 +80,28 @@ Show the version number and exit.
http://www.debian-administration.org/articles/505
=cut
=head1 AUTHORS
Steve Kemp, http://www.steve.org.uk/
Stéphane Jourdois
=head1 AUTHOR
Steve
--
http://www.steve.org.uk/
=cut
=head1 LICENSE
Copyright (c) 2005-2009 by Steve Kemp, (c) 2010 by The Xen-Tools
Development Team. All rights reserved.
Copyright (c) 2005-2007 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
@@ -102,7 +111,7 @@ use Env;
use Getopt::Long;
use Pod::Usage;
use Text::Template;
use Xen::Tools::Common;
#
@@ -115,23 +124,23 @@ my %CONFIG;
#
# Default options
#
$CONFIG{ 'template' } = '/etc/xen-tools/xm-nfs.tmpl';
$CONFIG{'template'} = '/etc/xen-tools/xm-nfs.tmpl';
#
# Release number.
#
my $RELEASE = '4.4rc1';
my $RELEASE = '3.9';
# store version number away.
$CONFIG{ 'xen_tools_version' } = $RELEASE;
$CONFIG{'xen_tools_version'} = $RELEASE;
#
# Read the global configuration file.
#
readConfigurationFile("/etc/xen-tools/xen-tools.conf", \%CONFIG);
readConfigurationFile( "/etc/xen-tools/xen-tools.conf" );
#
@@ -152,15 +161,15 @@ testArguments();
if ( -e "/etc/xen/$CONFIG{'hostname'}.cfg" )
{
die "Configuration file for $CONFIG{'hostname'} already exists"
unless ( $CONFIG{ 'force' } );
unless( $CONFIG{'force'} );
}
#
# If we've been given any administrators then set them up.
#
if ( $CONFIG{ 'admins' } )
if ( $CONFIG{'admins'} )
{
setupAdminUsers(\%CONFIG);
setupAdminUsers();
}
#
@@ -176,6 +185,87 @@ createNewConfigurationFile();
exit;
=begin doc
Read the specified configuration file, and update our global configuration
hash with the values found in it.
=end doc
=cut
sub readConfigurationFile
{
my ($file) = ( @_ );
# Don't read the file if it doesn't exist.
return if ( ! -e $file );
my $line = "";
open( FILE, "<", $file ) or die "Cannot read file '$file' - $!";
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+$//;
# command expansion?
if ( $val =~ /(.*)`([^`]+)`(.*)/ )
{
# store
my $pre = $1;
my $cmd = $2;
my $post = $3;
# get output
my $output = `$cmd`;
chomp( $output );
# build up replacement.
$val = $pre . $output . $post;
}
# Store value.
$CONFIG{ $key } = $val;
}
}
close( FILE );
}
=begin doc
Parse the command line arguments this script was given.
@@ -196,43 +286,48 @@ sub parseCommandLineArguments
#
GetOptions(
# Networking options
"dhcp", \$CONFIG{ 'dhcp' },
"gateway=s", \$CONFIG{ 'gateway' },
"broadcast=s", \$CONFIG{ 'broadcast' },
"ip=s", \$CONFIG{ 'ip' },
"netmask=s", \$CONFIG{ 'netmask' },
"nameserver=s", \$CONFIG{ 'nameserver' },
"hostname=s", \$CONFIG{ 'hostname' },
"memory=s", \$CONFIG{ 'memory' },
"mac=s", \$CONFIG{ 'mac' },
# Networking options
"dhcp", \$CONFIG{'dhcp'},
"gateway=s", \$CONFIG{'gateway'},
"broadcast=s", \$CONFIG{'broadcast'},
"ip=s", \$CONFIG{'ip'},
"netmask=s", \$CONFIG{'netmask'},
"hostname=s", \$CONFIG{'hostname'},
"memory=s", \$CONFIG{'memory'},
"mac=s", \$CONFIG{'mac'},
# NFS options.
"nfs_server=s", \$CONFIG{ 'nfs_server' },
"nfs_root=s", \$CONFIG{ 'nfs_root' },
# NFS options.
"nfs_server=s", \$CONFIG{'nfs_server'},
"nfs_root=s", \$CONFIG{'nfs_root'},
# Misc. options
"admins=s", \$CONFIG{ 'admins' },
"kernel=s", \$CONFIG{ 'kernel' },
"initrd=s", \$CONFIG{ 'initrd' },
"force", \$CONFIG{ 'force' },
"template=s", \$CONFIG{ 'template' },
# Misc. options
"admins=s", \$CONFIG{'admins'},
"kernel=s", \$CONFIG{'kernel'},
"initrd=s", \$CONFIG{'initrd'},
"force", \$CONFIG{'force'},
"template=s", \$CONFIG{'template'},
# Help options
"help", \$HELP,
"manual", \$MANUAL,
"verbose", \$CONFIG{ 'verbose' },
"version", \$VERSION
# Help options
"help", \$HELP,
"manual", \$MANUAL,
"verbose", \$CONFIG{'verbose'},
"version", \$VERSION
);
);
pod2usage(1) if $HELP;
pod2usage( -verbose => 2 ) if $MANUAL;
pod2usage(-verbose => 2 ) if $MANUAL;
if ($VERSION)
if ( $VERSION )
{
logprint("xen-create-nfs release $RELEASE\n");
my $REVISION = '$Revision: 1.13 $';
if ( $REVISION =~ /1.([0-9.]+) / )
{
$REVISION = $1;
}
logprint( "xen-create-nfs release $RELEASE - CVS: $REVISION\n" );
exit;
}
}
@@ -249,68 +344,113 @@ sub parseCommandLineArguments
sub testArguments
{
#
# Hostname is mandatory
#
die "No hostname" unless ( $CONFIG{ 'hostname' } );
die "No hostname" unless( $CONFIG{'hostname'} );
my @network = qw/ ip gateway netmask /;
#
# If DHCP then all the other options aren't needed
#
if ( $CONFIG{ 'dhcp' } )
if ( $CONFIG{'dhcp'} )
{
foreach my $f (@network)
foreach my $f ( @network )
{
delete( $CONFIG{ $f } );
}
}
else
{
foreach my $f (@network)
foreach my $f ( @network )
{
die "Missing --$f" unless ( $CONFIG{ $f } );
die "Missing --$f" unless( $CONFIG{$f} );
}
}
#
# We need an NFS server + root
#
die "Missing NFS server." unless ( $CONFIG{ 'nfs_server' } );
die "Missing NFS root." unless ( $CONFIG{ 'nfs_root' } );
die "Missing NFS server." unless( $CONFIG{'nfs_server'} );
die "Missing NFS root." unless( $CONFIG{'nfs_root'} );
# Shorthack to fix http://bugs.debian.org/648814 -- xen-create-nfs
# should better use xt-create-xen-config instead. Guess from where
# this code is borrowed for now...
if ( exists($CONFIG{ 'memory' }) and
defined($CONFIG{ 'memory' }) ) {
#
# The memory size: Convert Gb -> Mb.
#
if ( $CONFIG{ 'memory' } =~ /^(\d+)Gb.*$/i )
{
$CONFIG{ 'memory' } = $1 * 1024;
}
#
# Remove any trailing Mb.
#
if ( $CONFIG{ 'memory' } =~ /^(\d+)Mb.*$/i )
{
$CONFIG{ 'memory' } = $1;
}
}
# All OK.
}
=begin doc
This routine is designed to ensure that any users specified with
the --admins flag are setup as administrators of the new instance.
=end doc
=cut
sub setupAdminUsers
{
#
# If we're not root we can't modify users.
#
return if ( $EFFECTIVE_USER_ID != 0 );
#
# If we don't have a sudoers file then we'll also ignore this.
#
return if ( ! -e "/etc/sudoers" );
#
# Find the path to the xen-login-shell
#
my $shell = undef;
$shell = "/usr/bin/xen-login-shell" if ( -x "/usr/bin/xen-login-shell" );
$shell = "/usr/local/bin/xen-login-shell" if ( -x "/usr/bin/local/xen-login-shell" );
return if ( !defined( $shell ) );
#
# For each user make sure they exist, and setup the
# login shell for them.
#
foreach my $user ( split( /,/, $ENV{'admins'} ) )
{
# Strip leading and trailing whitespace.
$user =~ s/^\s+//;
$user =~ s/\s+$//;
# Ignore root
next if ( $user =~ /^root$/i );
# Does the user exist?
if ( getpwnam($user) )
{
# Change shell.
$CONFIG{'verbose'} && print "Changing shell for $user: $shell\n";
system( "chsh", "-s", $shell, $user );
}
else
{
# Add a new user.
$CONFIG{'verbose'} && print "Adding new user: $user\n";
system( "useradd", "-s", $shell, $user );
}
#
# Add the entry to /etc/sudoers.
#
open( SUDOERS, ">>", "/etc/sudoers" ) or warn "Failed to add user to sudoers file : $user - $!";
print SUDOERS "$user ALL = NOPASSWD: /usr/sbin/xm, /usr/bin/xen-create-image\n";
close( SUDOERS );
}
}
=begin doc
Create the Xen configuration file for our new Xen guest.
@@ -321,16 +461,15 @@ sub testArguments
sub createNewConfigurationFile
{
die "Template file missing: $CONFIG{'template'}"
unless ( -e $CONFIG{ 'template' } );
die "Template file missing: $CONFIG{'template'}" unless( -e $CONFIG{'template'} );
#
# Load the template.
#
my $template = new Text::Template( TYPE => 'FILE',
SOURCE => $CONFIG{ 'template' } );
SOURCE => $CONFIG{'template'} );
my $result = $template->fill_in( HASH => \%CONFIG );
my $result = $template->fill_in( HASH => \%CONFIG );
#
# The file we'll write to.
@@ -342,5 +481,5 @@ sub createNewConfigurationFile
#
open( FILE, ">", $file ) or die "Failed to write to $file - $!";
print FILE $result;
close(FILE);
close( FILE );
}

View File

@@ -1,7 +1,5 @@
#!/usr/bin/perl -w
=encoding utf8
=head1 NAME
xen-delete-image - Delete previously created Xen instances.
@@ -10,10 +8,6 @@ xen-delete-image - Delete previously created Xen instances.
xen-delete-image [options] [--hostname=]imageName1 [--hostname=]imageName2
Filename Options:
--extension Specify the file extension to use. An empty extension is equal
to any extension.
Help Options:
--help Show help information.
--manual Read the manual for this script.
@@ -22,15 +16,16 @@ xen-delete-image - Delete previously created Xen instances.
General options:
--dir Specify the output directory where images were previously saved.
--evms Specify the EVMS container to use.
--lvm Specify the LVM volume to use.
--evms Specify the EVMS container to use.
Specifying hosts:
--hostname Specify the image name to delete.
Testing options:
--test Don't complain if we're not invoked by root.
--no-xen-ok Don't complain if xen seems not installed or xend is not running
--test Don't complain if we're not invoked by root.
=cut
=head1 OPTIONS
@@ -56,14 +51,16 @@ Specify the LVM volume group where images were previously saved.
Read the manual for this script.
=item B<--test>
Do not complain, or exit, if the script is not executed by the root
user. (Only works in conjunction with --dir.)
Don not complain, or exit, if the script is not executed by the root user.
=item B<--version>
Show the version number and exit.
=back
=cut
=head1 DESCRIPTION
@@ -77,6 +74,8 @@ Show the version number and exit.
but will fail to remove anything which the user does not have permission
to delete.)
=cut
=head1 LOOPBACK EXAMPLE
@@ -92,6 +91,8 @@ Show the version number and exit.
(The matching Xen configuration files beneath /etc/xen will also be
removed.)
=cut
=head1 LVM EXAMPLE
@@ -108,6 +109,8 @@ Show the version number and exit.
The Xen configuration files will also be removed from beneath /etc/xen.
=cut
=head1 EVMS EXAMPLE
@@ -124,24 +127,28 @@ Show the version number and exit.
The Xen configuration files will also be removed.
=cut
=head1 AUTHORS
Steve Kemp, http://www.steve.org.uk/
Axel Beckert, http://noone.org/abe/
Stéphane Jourdois
=head1 AUTHOR
Steve
--
http://www.steve.org.uk/
=cut
=head1 LICENSE
Copyright (c) 2005-2009 by Steve Kemp, (c) 2010-2013 by The Xen-Tools
Development Team. All rights reserved.
Copyright (c) 2005-2007 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
@@ -149,8 +156,6 @@ use strict;
use English;
use Getopt::Long;
use Pod::Usage;
use File::Path;
use Xen::Tools::Common;
#
@@ -164,18 +169,9 @@ my %CONFIG;
#
# Release number.
#
my $RELEASE = '4.4rc1';
my $RELEASE = '3.9';
#
# Find xen toolstack command
#
$CONFIG{ 'xm' } = findXenToolstack();
#
# Default values
#
$CONFIG{ 'extension' } = '.cfg';
#
@@ -183,7 +179,7 @@ $CONFIG{ 'extension' } = '.cfg';
#
if ( -e "/etc/xen-tools/xen-tools.conf" )
{
readConfigurationFile("/etc/xen-tools/xen-tools.conf", \%CONFIG);
readConfigurationFile( "/etc/xen-tools/xen-tools.conf" );
}
@@ -203,7 +199,7 @@ checkArguments();
#
# Abort if non-root user.
#
if ( ( !$CONFIG{ 'test' } ) && ( $EFFECTIVE_USER_ID != 0 ) )
if ( (!$CONFIG{'test'}) && ( $EFFECTIVE_USER_ID != 0 ) )
{
print <<E_O_ROOT;
@@ -219,23 +215,29 @@ E_O_ROOT
#
# Loop over the supplied arguments, and attempt to delete each
# image. Check both, bare parameters as well as --hostname options.
# image.
#
my @hosts = ();
if (exists($CONFIG{ 'hostname' }) and defined($CONFIG{ 'hostname' })) {
my $hostname_option = $CONFIG{ 'hostname' };
@hosts = 'ARRAY' eq ref($hostname_option) ?
@$hostname_option : $hostname_option;
while( my $name = shift )
{
if ( !xenRunning( $name ) )
{
deleteXenImage( $name );
}
else
{
print "Skipping xen guest '$name' - it appears to be running.\n";
}
}
foreach my $name (@ARGV, @hosts)
#
# Also delete any which were specified using the --hostname flag
#
my $hosts = $CONFIG{'hostname'};
foreach my $name ( @$hosts )
{
my %PER_HOST_CONFIG = %CONFIG;
$PER_HOST_CONFIG{ 'hostname' } = $name;
if ( $CONFIG{ 'no_xen_ok' } or !xenRunning($name, \%PER_HOST_CONFIG) )
if ( !xenRunning( $name ) )
{
deleteXenImage($name);
deleteXenImage( $name );
}
else
{
@@ -251,6 +253,82 @@ exit 0;
=begin doc
Read the configuration file specified.
=end doc
=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+$//;
# command expansion?
if ( $val =~ /(.*)`([^`]+)`(.*)/ )
{
# store
my $pre = $1;
my $cmd = $2;
my $post = $3;
# get output
my $output = `$cmd`;
chomp( $output );
# build up replacement.
$val = $pre . $output . $post;
}
# Store value.
$CONFIG{ $key } = $val;
}
}
close( FILE );
}
=begin doc
Parse the arguments specified upon the command line.
@@ -264,32 +342,36 @@ sub parseCommandLineArguments
my $HELP = 0;
my $MANUAL = 0;
my $VERSION = 0;
$CONFIG{ 'dry-run' } = 0;
# Parse options.
#
GetOptions( "dir=s", \$CONFIG{ 'dir' },
"dry-run", \$CONFIG{ 'dry-run' },
"lvm=s", \$CONFIG{ 'lvm' },
"evms=s", \$CONFIG{ 'evms' },
"extension:s", \$CONFIG{ 'extension' },
"hostname=s@", \$CONFIG{ 'hostname' },
"test", \$CONFIG{ 'test' },
"verbose", \$CONFIG{ 'verbose' },
"no-xen-ok", \$CONFIG{ 'no_xen_ok' },
"help", \$HELP,
"manual", \$MANUAL,
"version", \$VERSION
);
GetOptions(
"dir=s", \$CONFIG{'dir'},
"lvm=s", \$CONFIG{'lvm'},
"evms=s", \$CONFIG{'evms'},
"hostname=s@", \$CONFIG{'hostname'},
"test", \$CONFIG{'test'},
"verbose", \$CONFIG{'verbose'},
"help", \$HELP,
"manual", \$MANUAL,
"version", \$VERSION
);
pod2usage(1) if $HELP;
pod2usage( -verbose => 2 ) if $MANUAL;
pod2usage(-verbose => 2 ) if $MANUAL;
if ($VERSION)
if ( $VERSION )
{
print "xen-delete-image release $RELEASE\n";
exit;
my $REVISION = '$Revision: 1.41 $';
if ( $REVISION =~ /1.([0-9.]+) / )
{
$REVISION = $1;
}
print "xen-delete-image release $RELEASE - CVS: $REVISION\n";
exit;
}
}
@@ -306,23 +388,22 @@ sub parseCommandLineArguments
sub checkArguments
{
#
# When testing we only care about loopback images, not disk images.
#
if ( $CONFIG{ 'test' } and ( $CONFIG{ 'lvm' } or $CONFIG{ 'evms' } ))
if ( $CONFIG{'test'} )
{
print "Error: --test only works with --dir.\n";
exit 1;
$CONFIG{'lvm'} = undef;
$CONFIG{'evms'} = undef;
}
#
# Make sure we got one and only one installation method.
#
my $count = 0;
foreach my $type (qw/dir lvm evms/)
foreach my $type ( qw/dir lvm evms/ )
{
$count += 1 if defined( $CONFIG{ $type } );
$count += 1 if defined( $CONFIG{$type} );
}
#
@@ -331,16 +412,44 @@ sub checkArguments
#
if ( $count != 1 )
{
print "Please select one and only one of the installation methods to delete the DomU:\n";
print " --dir\n";
print " --evms\n";
print " --lvm\n";
exit 2;
print "Please select one and only one of the installation methods:\n";
print " --dir\n";
print " --evms\n";
print " --lvm\n";
exit;
}
}
=begin doc
Test to see if the given instance is running.
=end doc
=cut
sub xenRunning
{
my( $hostname ) = (@_ );
my $running = 0;
open( CMD, "xm list $hostname 2>/dev/null |")
or die "Failed to run 'xm list $hostname'";
while( <CMD> )
{
my $line = $_;
$running = 1 if ( $line =~ /\Q$hostname\E/ )
}
close( CMD );
return( $running );
}
=begin doc
Delete the named image, and the corresponding configuration file
@@ -352,7 +461,7 @@ sub checkArguments
sub deleteXenImage
{
my ($hostname) = (@_);
my ($hostname) = ( @_ );
#
# Collect the names of files to delete.
@@ -362,32 +471,28 @@ sub deleteXenImage
#
# Delete the Xen auto-start file if it exists.
#
if ( -e "/etc/xen/auto/$hostname".$CONFIG{ 'extension' } )
if ( -e "/etc/xen/auto/$hostname.cfg" )
{
push( @delete, "/etc/xen/auto/$hostname".$CONFIG{ 'extension' } );
push( @delete, "/etc/xen/auto/$hostname.cfg" );
}
#
# Delete the Xen configuration file if it exists.
#
if ( -e "/etc/xen/$hostname".$CONFIG{ 'extension' } )
if ( -e "/etc/xen/$hostname.cfg" )
{
push( @delete, "/etc/xen/$hostname".$CONFIG{ 'extension' } );
push( @delete, "/etc/xen/$hostname.cfg" );
}
#
# If we're working on disk images remove them.
#
foreach my $file (@delete)
foreach my $file ( @delete )
{
if ( -e $file )
{
if ($CONFIG{ 'dry-run' }) {
print "Would delete: $file\n";
} else {
print "Deleting: $file\n";
unlink($file);
}
print "Deleting: $file\n";
unlink( $file );
}
else
{
@@ -395,96 +500,133 @@ sub deleteXenImage
}
}
my %PER_HOST_CONFIG = %CONFIG;
$PER_HOST_CONFIG{ 'hostname' } = $hostname;
if ( defined( $CONFIG{ 'dir' } ) )
{
my $prefix = $CONFIG{ 'dir' } . "/domains/";
#
# Now remove the directory.
#
if ( -d $prefix . $hostname )
{
if ($CONFIG{ 'dry-run' }) {
print "Would delete: $prefix$hostname\n";
} else {
print "Removing: " . $prefix . $hostname . "\n";
rmtree( $prefix . $hostname );
}
}
if ( defined( $CONFIG{'dir'} ) )
{
my $prefix = $CONFIG{'dir'} . "/domains/";
#
# Now remove the directory.
#
if ( -d $prefix . $hostname )
{
print "Removing: " . $prefix . $hostname . "\n";
rmdir ( $prefix . $hostname );
}
}
elsif ( defined( $CONFIG{ 'lvm' } ) )
elsif ( defined( $CONFIG{'lvm'} ) )
{
#
# LVM volumes
#
#
# TODO: Check we're not mounted.
#
#
# LVM volumes
#
#
# TODO: Check we're not mounted.
#
if ( -e "/dev/$CONFIG{'lvm'}/$hostname-swap" )
{
print "Removing swap volume\n";
runCommand( "lvremove /dev/$CONFIG{'lvm'}/$hostname-swap --force" );
}
if ( -e "/dev/$CONFIG{'lvm'}/$hostname-swap" )
{
if ($CONFIG{ 'dry-run' }) {
print "Would remove LVM swap volume /dev/$CONFIG{'lvm'}/$hostname-swap\n";
} else {
print "Removing swap volume\n";
runCommand("lvremove /dev/$CONFIG{'lvm'}/$hostname-swap --force", \%PER_HOST_CONFIG);
}
}
if ( -e "/dev/$CONFIG{'lvm'}/$hostname-disk" )
{
if ($CONFIG{ 'dry-run' }) {
print "Would remove LVM disk volume /dev/$CONFIG{'lvm'}/$hostname-disk\n";
} else {
print "Removing LVM disk volume\n";
runCommand("lvremove /dev/$CONFIG{'lvm'}/$hostname-disk --force", \%PER_HOST_CONFIG);
}
}
if ( -e "/dev/$CONFIG{'lvm'}/$hostname-disk" )
{
print "Removing LVM disk volume\n";
runCommand( "lvremove /dev/$CONFIG{'lvm'}/$hostname-disk --force" );
}
}
elsif ( defined( $CONFIG{ 'evms' } ) )
elsif ( defined( $CONFIG{'evms'} ) )
{
#
# EVMS volumes
#
#
# TODO: Check we're not mounted.
#
#
# EVMS volumes
#
#
# TODO: Check we're not mounted.
#
if ( -e "/dev/evms/$hostname-swap" )
{
print "Removing EVMS swap volume\n";
runCommand( "echo Delete : /dev/evms/$hostname-swap | evms" );
runCommand( "echo Delete : $CONFIG{'evms'}/$hostname-swap | evms" );
}
if ( -e "/dev/evms/$hostname-swap" )
{
if ($CONFIG{ 'dry-run' }) {
print "Would remove EVMS swap volume: /dev/evms/$hostname-swap\n";
print "Would remove EVMS swap volume: $CONFIG{'evms'}/$hostname-swap\n";
} else {
print "Removing EVMS swap volume\n";
runCommand("echo Delete : /dev/evms/$hostname-swap | evms", \%PER_HOST_CONFIG);
runCommand("echo Delete : $CONFIG{'evms'}/$hostname-swap | evms", \%PER_HOST_CONFIG);
}
}
if ( -e "/dev/evms/$hostname-disk" )
{
if ($CONFIG{ 'dry-run' }) {
print "Would remove EVMS disk volume: /dev/evms/$hostname-swap\n";
print "Would remove EVMS disk volume: $CONFIG{'evms'}/$hostname-swap\n";
} else {
print "Removing EVMS disk volume\n";
runCommand("echo Delete : /dev/evms/$hostname-disk | evms", \%PER_HOST_CONFIG);
runCommand("echo Delete : $CONFIG{'evms'}/$hostname-disk | evms", \%PER_HOST_CONFIG);
}
}
if ( -e "/dev/evms/$hostname-disk" )
{
print "Removing EVMS disk volume\n";
runCommand( "echo Delete : /dev/evms/$hostname-disk | evms" );
runCommand( "echo Delete : $CONFIG{'evms'}/$hostname-disk | evms" );
}
}
else
{
print "Error: No installation type specified\n";
print "Can't happen!\n";
print "Hostname : $hostname\n";
exit 127;
print "Error: No installation type specified\n";
print "Can't happen!\n";
print "Hostname : $hostname\n";
exit 127;
}
}
=begin doc
A utility method to run a system command. We will capture the return
value and exit if the command files.
When running verbosely we will also display any command output.
=end doc
=cut
sub runCommand
{
my ( $cmd ) = (@_ );
#
# Header.
#
$CONFIG{'verbose'} && print "Executing : $cmd\n";
#
# Hide output unless running with --debug.
#
if ( $CONFIG{'verbose'} )
{
#
# Copy stderr to stdout, so we can see it.
#
$cmd .= " 2>&1";
}
else
{
$cmd .= " >/dev/null 2>/dev/null" ;
}
#
# Run it.
#
my $output = `$cmd`;
if ( $? != 0 )
{
print "Running command '$cmd' failed.\n";
print "Aborting\n";
exit;
}
#
# All done.
#
$CONFIG{'verbose'} && print "Output\n";
$CONFIG{'verbose'} && print "======\n";
$CONFIG{'verbose'} && print $output . "\n";
$CONFIG{'verbose'} && print "Finished : $cmd\n";
return( $output );
}

View File

@@ -1,7 +1,5 @@
#!/usr/bin/perl -w
=encoding utf8
=head1 NAME
xen-list-images - List all the created and configured Xen images.
@@ -10,10 +8,6 @@ xen-list-images - List all the created and configured Xen images.
xen-list-image [options]
Filename Options:
--extension Specify the file extension to use. An empty extension is equal
to any extension.
Help Options:
--help Show this scripts help information.
--manual Read this scripts manual.
@@ -22,7 +16,6 @@ xen-list-images - List all the created and configured Xen images.
Testing options:
--test Specify an alternate Xen configuration directory.
=head1 OPTIONS
=over 8
@@ -55,23 +48,28 @@ Show the version number and exit.
and then either the IP address configured, or "DHCP" to denote
a dynamic host.
=cut
=head1 TODO
It should be possible to determine the disk(s) used by the images,
and then display their sizes.
=cut
=head1 AUTHORS
Steve Kemp, http://www.steve.org.uk/
Stéphane Jourdois
=head1 AUTHOR
Steve
--
http://www.steve.org.uk/
=cut
=head1 LICENSE
Copyright (c) 2005-2009 by Steve Kemp, (c) 2010-2013 by The Xen-Tools
Development Team. All rights reserved.
Copyright (c) 2005-2007 by Steve Kemp. All rights reserved.
This module is free software;
you can redistribute it and/or modify it under
@@ -86,7 +84,6 @@ use English;
use File::Temp qw/ tempdir /;
use Getopt::Long;
use Pod::Usage;
use Xen::Tools::Common;
#
@@ -98,22 +95,21 @@ use Xen::Tools::Common;
my %CONFIG;
#
# Default values
# Default prefix
#
$CONFIG{ 'prefix' } = "/etc/xen";
$CONFIG{ 'extension' } = '.cfg';
$CONFIG{'prefix'} = "/etc/xen";
#
# Release number.
#
my $RELEASE = '4.4rc1';
my $RELEASE = '3.9';
#
# Read the global configuration file if it exists.
#
readConfigurationFile("/etc/xen-tools/xen-tools.conf", \%CONFIG);
readConfigurationFile( "/etc/xen-tools/xen-tools.conf" );
#
@@ -133,11 +129,11 @@ my @instances = findXenInstances();
# Now process each instance.
#
my $count = 0;
foreach my $instance (@instances)
foreach my $instance ( @instances )
{
if ($count) {print "\n";}
if ( $count ) { print "\n"; }
displayInstance($instance);
displayInstance( $instance );
$count += 1;
}
@@ -149,6 +145,83 @@ exit;
=begin doc
Read the configuration file specified.
=end doc
=cut
sub readConfigurationFile
{
my ($file) = ( @_ );
# Don't read the file if it doesn't exist.
return if ( ! -e $file );
open( FILE, "<", $file ) or die "Cannot read file '$file' - $!";
while (defined(my $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+$//;
# command expansion?
if ( $val =~ /(.*)`([^`]+)`(.*)/ )
{
# store
my $pre = $1;
my $cmd = $2;
my $post = $3;
# get output
my $output = `$cmd`;
chomp( $output );
# build up replacement.
$val = $pre . $output . $post;
}
# Store value.
$CONFIG{ $key } = $val;
}
}
close( FILE );
}
=begin doc
Parse the arguments specified upon the command line.
@@ -161,23 +234,30 @@ sub parseCommandLineArguments
{
my $HELP = 0;
my $MANUAL = 0;
my $VERSION = 0;
my $VERSION = 0;
# Parse options.
#
GetOptions( "test=s", \$CONFIG{ 'prefix' },
"extension:s", \$CONFIG{ 'extension' },
"help", \$HELP,
"manual", \$MANUAL,
"version", \$VERSION );
GetOptions(
"test=s", \$CONFIG{'prefix'},
"help", \$HELP,
"manual", \$MANUAL,
"version", \$VERSION
);
pod2usage(1) if $HELP;
pod2usage( -verbose => 2 ) if $MANUAL;
pod2usage(-verbose => 2 ) if $MANUAL;
if ($VERSION)
if ( $VERSION )
{
print "xen-list-images release $RELEASE\n";
my $REVISION = '$Revision: 1.30 $';
if ( $REVISION =~ /1.([0-9.]+) / )
{
$REVISION = $1;
}
print "xen-list-images release $RELEASE - CVS: $REVISION\n";
exit;
}
}
@@ -197,15 +277,12 @@ sub findXenInstances
{
my @found;
foreach my $file ( sort( glob( $CONFIG{ 'prefix' } . "/*" . $CONFIG{ 'extension' } ) ) )
foreach my $file ( sort( glob( $CONFIG{'prefix'} . "/*.cfg" ) ) )
{
push @found, $file if (
-f $file and
$file !~ m(~$|\.dpkg-[a-z]+$|\.sxp$|/xl\.conf$)
);
push @found, $file if ( -e $file );
}
return (@found);
return( @found );
}
@@ -221,14 +298,14 @@ sub findXenInstances
sub displayInstance
{
my ($file) = (@_);
my ( $file ) = ( @_ );
#
# Read each line.
#
open( FILY, "<", $file );
my @LINES = <FILY>;
close(FILY);
close( FILY );
#
# Is it dynamic?
@@ -239,7 +316,7 @@ sub displayInstance
my $name = '';
my $mem = 0;
foreach my $line (@LINES)
foreach my $line ( @LINES )
{
if ( $line =~ /^\s*dhcp\s*=\s*"dhcp\"/i )
{
@@ -249,7 +326,7 @@ sub displayInstance
{
$name = $1;
}
if ( $line =~ /^\s*memory[^0-9]*([0-9]+)/i )
if ( $line =~ /.*memory[^0-9]*([0-9]+)/i )
{
$mem = $1;
}
@@ -264,10 +341,9 @@ sub displayInstance
}
print "Name: $name\n";
print "Memory: $mem MB\n";
print "IP: " . $ip . $mac . "\n" if length($ip);
print "Memory: $mem\n";
print "IP: " . $ip . $mac . "\n" if length( $ip );
print "DHCP" . $mac . "\n" if $dhcp;
print "Config: $file\n";
}

View File

@@ -1,7 +1,5 @@
#!/usr/bin/perl -w
=encoding utf8
=head1 NAME
xen-resize-guest - Resize a loopback or LVM based xen guest.
@@ -22,6 +20,8 @@ xen-resize-guest - Resize a loopback or LVM based xen guest.
--force Force the resize to happen without a last-chance delay.
--hostname Specify the hostname of the guest to resize.
=cut
=head1 OPTIONS
@@ -53,6 +53,8 @@ Show the version number and exit.
=back
=cut
=head1 DESCRIPTION
@@ -72,23 +74,27 @@ Show the version number and exit.
More than once I've heard of users making mistakes and breaking their
filesystems; hence this tool.
=cut
=head1 AUTHORS
=head1 AUTHOR
Steve Kemp, http://www.steve.org.uk/
Axel Beckert, http://noone.org/abe/
Steve
--
http://www.steve.org.uk/
=cut
=head1 LICENSE
Copyright (c) 2005-2009 by Steve Kemp, (c) 2010 by The Xen-Tools
Development Team. All rights reserved.
Copyright (c) 2005-2007 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
@@ -98,7 +104,8 @@ use Env;
use Getopt::Long;
use Pod::Usage;
use Text::Template;
use Xen::Tools::Common;
@@ -111,19 +118,14 @@ my %CONFIG;
#
# Release number.
#
my $RELEASE = '4.4rc1';
my $RELEASE = '3.9';
#
# Find xen toolstack command
#
$CONFIG{ 'xm' } = findXenToolstack();
#
# Read the global configuration file.
#
readConfigurationFile("/etc/xen-tools/xen-tools.conf", \%CONFIG);
readConfigurationFile( "/etc/xen-tools/xen-tools.conf" );
#
@@ -143,15 +145,13 @@ testArguments();
#
my $path = undef;
if ( $CONFIG{ 'dir' } )
if ( $CONFIG{'dir'} )
{
#
# Make sure we can find the disk
#
$path =
$CONFIG{ 'dir' } . "/domains/" . $CONFIG{ 'hostname' } . "/disk.img";
if ( !-e $path )
$path = $CONFIG{'dir'} . "/domains/" . $CONFIG{'hostname'} . "/disk.img";
if ( ! -e $path )
{
print <<EOF;
@@ -188,7 +188,7 @@ EOF
#
# Allow panic
#
if ( !$CONFIG{ 'force' } )
if ( !$CONFIG{'force'} )
{
foreach my $i ( 1 .. 10 )
{
@@ -201,16 +201,15 @@ EOF
print "DO NOT INTERRUPT\n";
my $cmd = "dd if=/dev/zero bs=1M count=$CONFIG{'add'}k >> $path";
system($cmd );
system( $cmd );
}
elsif ( $CONFIG{ 'lvm' } )
elsif ( $CONFIG{'lvm'} )
{
#
# Make sure we can find the disk
#
$path = "/dev/" . $CONFIG{ 'lvm' } . "/" . $CONFIG{ 'hostname' } . "-disk";
if ( !-e $path )
$path = "/dev/" . $CONFIG{'lvm'} . "/" . $CONFIG{'hostname'} . "-disk";
if ( ! -e $path )
{
print <<EOF;
@@ -247,7 +246,7 @@ EOF
#
# Allow panic
#
if ( !$CONFIG{ 'force' } )
if ( !$CONFIG{'force'} )
{
foreach my $i ( 1 .. 10 )
{
@@ -259,7 +258,7 @@ EOF
print "DO NOT INTERRUPT\n";
my $cmd = "lvextend -L+$CONFIG{'add'}M $path";
system($cmd );
system( $cmd );
}
else
{
@@ -272,13 +271,13 @@ else
# Check filesystem.
#
print "Checking filesystem\n";
system("fsck.ext3 -f $path");
system( "fsck.ext3 -f $path" );
#
# Run ext3resize.
#
print "Resizing in place\n";
system("resize2fs $path");
system( "resize2fs $path" );
#
@@ -289,6 +288,80 @@ exit 0;
=begin doc
Read the configuration file specified.
=end doc
=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+$//;
# command expansion?
if ( $val =~ /(.*)`([^`]+)`(.*)/ )
{
# store
my $pre = $1;
my $cmd = $2;
my $post = $3;
# get output
my $output = `$cmd`;
chomp( $output );
# build up replacement.
$val = $pre . $output . $post;
}
# Store value.
$CONFIG{ $key } = $val;
}
}
close( FILE );
}
=begin doc
Parse the command line arguments this script was given.
@@ -314,27 +387,27 @@ sub parseCommandLineArguments
#
GetOptions(
# Misc. options
"add=s", \$CONFIG{ 'add' },
"dir=s", \$install{ 'dir' },
"lvm=s", \$install{ 'lvm' },
"hostname=s", \$CONFIG{ 'hostname' },
"force", \$CONFIG{ 'force' },
# Misc. options
"add=s", \$CONFIG{'add'},
"dir=s", \$install{'dir'},
"lvm=s", \$install{'lvm'},
"hostname=s", \$CONFIG{'hostname'},
"force", \$CONFIG{'force'},
# Help options
"help", \$HELP,
"manual", \$MANUAL,
"verbose", \$CONFIG{ 'verbose' },
"version", \$VERSION
);
# Help options
"help", \$HELP,
"manual", \$MANUAL,
"verbose", \$CONFIG{'verbose'},
"version", \$VERSION
);
pod2usage(1) if $HELP;
pod2usage( -verbose => 2 ) if $MANUAL;
pod2usage(-verbose => 2 ) if $MANUAL;
if ($VERSION)
if ( $VERSION )
{
print("xen-resize-guest release $RELEASE\n");
print( "xen-resize-guest release $RELEASE\n" );
exit 1;
}
@@ -343,17 +416,17 @@ sub parseCommandLineArguments
# they will allow the configuration values to be overriden by
# the command line.
#
if ( $install{ 'lvm' } )
if ( $install{'lvm'} )
{
$CONFIG{ 'lvm' } = $install{ 'lvm' };
$CONFIG{ 'dir' } = undef;
delete $CONFIG{ 'dir' };
$CONFIG{'lvm'} = $install{'lvm'};
$CONFIG{'dir'} = undef;
delete $CONFIG{'dir'};
}
if ( $install{ 'dir' } )
if ( $install{'dir'} )
{
$CONFIG{ 'dir' } = $install{ 'dir' };
$CONFIG{ 'lvm' } = undef;
delete $CONFIG{ 'lvm' };
$CONFIG{'dir'} = $install{'dir'};
$CONFIG{'lvm'} = undef;
delete $CONFIG{'lvm'};
}
}
@@ -369,11 +442,10 @@ sub parseCommandLineArguments
sub testArguments
{
#
# Make sure we received a hostname.
#
if ( !$CONFIG{ 'hostname' } )
if ( !$CONFIG{'hostname'} )
{
print <<EOF;
@@ -388,7 +460,7 @@ EOF
#
# Make sure we received a size.
#
if ( !$CONFIG{ 'add' } )
if ( !$CONFIG{'add'} )
{
print <<EOF;
@@ -404,7 +476,7 @@ EOF
#
# Make sure the guest isn't running
#
if ( xenRunning( $CONFIG{ 'hostname' }, \%CONFIG ) )
if ( xenRunning( $CONFIG{'hostname'} ) )
{
print "The guest $CONFIG{'hostname'} appears to be running!\n";
exit 1;
@@ -414,10 +486,8 @@ EOF
# We should either have LVM *or* directory - not neither or both.
#
my $options = 0;
$options += 1
if ( defined( $CONFIG{ 'lvm' } ) && length( $CONFIG{ 'lvm' } ) );
$options += 1
if ( defined( $CONFIG{ 'dir' } ) && length( $CONFIG{ 'dir' } ) );
$options += 1if ( defined($CONFIG{'lvm'}) && length( $CONFIG{'lvm'} ) );
$options += 1if ( defined($CONFIG{'dir'}) && length( $CONFIG{'dir'} ) );
#
# Report
@@ -436,12 +506,40 @@ EOF
#
# Convert from Gb -> Mb;
#
if ( $CONFIG{ 'add' } =~ /^([0-9.]+)Gb*$/i )
if ( $CONFIG{'add'} =~ /^([0-9.]+)Gb*$/i )
{
$CONFIG{ 'add' } = $1 * 1024;
$CONFIG{'add'} = $1 * 1024;
}
if ( $CONFIG{ 'add' } =~ /^([0-9.]+)Mb*$/i )
if ( $CONFIG{'add'} =~ /^([0-9.]+)Mb*$/i )
{
$CONFIG{ 'add' } = $1;
$CONFIG{'add'} = $1;
}
}
=begin doc
Test to see if the given instance is running.
=end doc
=cut
sub xenRunning
{
my( $hostname ) = (@_ );
my $running = 0;
open( CMD, "xm list $hostname 2>/dev/null |")
or die "Failed to run 'xm list $hostname'";
while( <CMD> )
{
my $line = $_;
$running = 1 if ( $line =~ /\Q$hostname\E/ )
}
close( CMD );
return( $running );
}

View File

@@ -1,7 +1,5 @@
#!/usr/bin/perl -w
=encoding utf8
=head1 NAME
xen-update-image - Update the software installed upon offline Xen images.
@@ -20,6 +18,9 @@ xen-update-image - Update the software installed upon offline Xen images.
--lvm Specify the LVM volume group which contains the image(s).
--evms Specify the EVMS container which contains the image(s).
=cut
=head1 OPTIONS
@@ -45,6 +46,8 @@ Show the version number and exit.
=back
=cut
=head1 DESCRIPTION
@@ -62,6 +65,8 @@ Show the version number and exit.
corruption otherwise it will allow you to update your image without
booting it.
=cut
=head1 EXAMPLES
@@ -72,18 +77,22 @@ Show the version number and exit.
xen-update-images --dir=/home/xen test.my.flat x11.my.flat
=cut
=head1 AUTHORS
Steve Kemp, http://www.steve.org.uk/
Axel Beckert, http://noone.org/abe/
Stéphane Jourdois
=head1 AUTHOR
Steve
--
http://www.steve.org.uk/
=cut
=head1 LICENSE
Copyright (c) 2005-2009 by Steve Kemp, (c) 2010 by The Xen-Tools
Development Team. All rights reserved.
Copyright (c) 2005-2007 by Steve Kemp. All rights reserved.
This module is free software;
you can redistribute it and/or modify it under
@@ -96,10 +105,8 @@ The LICENSE file contains the full text of the license.
use strict;
use English;
use File::Temp qw/ tempdir /;
use File::Copy qw/ mv cp /;
use Getopt::Long;
use Pod::Usage;
use Xen::Tools::Common;
#
@@ -113,13 +120,7 @@ my %CONFIG;
#
# Release number.
#
my $RELEASE = '4.4rc1';
#
# Find xen toolstack command
#
$CONFIG{ 'xm' } = findXenToolstack();
my $RELEASE = '3.9';
#
@@ -127,7 +128,7 @@ $CONFIG{ 'xm' } = findXenToolstack();
#
if ( -e "/etc/xen-tools/xen-tools.conf" )
{
readConfigurationFile("/etc/xen-tools/xen-tools.conf", \%CONFIG);
readConfigurationFile( "/etc/xen-tools/xen-tools.conf" );
}
@@ -165,11 +166,11 @@ E_O_ROOT
#
# Loop over the supplied arguments, and attempt to update each image.
#
while ( my $name = shift )
while( my $name = shift )
{
if ( !xenRunning($name, \%CONFIG) )
if ( !xenRunning( $name ) )
{
updateXenImage($name);
updateXenImage( $name );
}
else
{
@@ -195,7 +196,7 @@ exit;
sub updateXenImage
{
my ($name) = (@_);
my ( $name ) = ( @_ );
#
# Create a temporary directory, and prepare to mount the
@@ -209,13 +210,12 @@ sub updateXenImage
# If we're dealing with loopback images find the main one,
# and mount it.
#
if ( $CONFIG{ 'dir' } )
if ( $CONFIG{'dir'} )
{
# The loopback image.
$img = $CONFIG{ 'dir' } . "/domains/" . $name . "/disk.img";
$img = $CONFIG{'dir'} . "/domains/" . $name . "/disk.img";
if ( !-e $img )
if ( ! -e $img )
{
print "Disk image '$img' for host '$name' not found\n";
return;
@@ -223,14 +223,13 @@ sub updateXenImage
$mount_cmd = "mount -t auto -o loop $img $tmp";
}
elsif ( $CONFIG{ 'lvm' } )
elsif ( $CONFIG{'lvm'} )
{
# The LVM volume
$img = "/dev/" . $CONFIG{ 'lvm' } . "/$name-disk";
$img = "/dev/" . $CONFIG{'lvm'} . "/$name-disk";
# make sure it exists.
if ( !-e $img )
if ( ! -e $img )
{
print "Logical volume '$img' for host '$name' not found\n";
return;
@@ -238,31 +237,25 @@ sub updateXenImage
$mount_cmd = "mount -t auto $img $tmp";
}
elsif ( $CONFIG{ 'evms' } )
elsif ( $CONFIG{'evms'} )
{
# The EVMS volume -- note, unlike LVM, you don't need the $CONFIG{'evms'}
# to see it and mount the volume. $CONFIG{'evms'} is only used for manipulating
# the underlying object. Still, I don't want to mess with the parse code and
# make it confusing - otherwise --evms takes an argument everywhere but here,
# which will confuse users. The better solution is to make it so that --evms can
# take a following container, but doesn't require it. For the moment, it is
# better to leave it as it is, take a container, and then ignore it.
# The EVMS volume -- note, unlike LVM, you don't need the
# $CONFIG{'evms'} to see it and mount the
# volume. $CONFIG{'evms'} is only used for manipulating the
# underlying object. Still, I don't want to mess with the
# parse code and make it confusing - otherwise --evms takes an
# argument everywhere but here, which will confuse users. The
# better solution is to make it so that --evms can take a
# following container, but doesn't require it. For the
# moment, it is better to leave it as it is, take a container,
# and then ignore it.
# The best way to do it is to just read it out of the
# configuration file, tell the user what you got and where you
# got it from, and not bother the user with picking --dir or
# --lvm or --evms at all, but infer it from the config file's
# disk = parameter. xen-delete-image might work the same way,
# but it could be *slightly* more dangerous in the context of
# deleting.
# The best way to do it is to just read it out of the configuration file,
# tell the user what you got and where you got it from, and not bother the user
# with picking --dir or --lvm or --evms at all, but infer it from the config
# file's disk = parameter. xen-delete-image might work the same way, but
# it could be *slightly* more dangerous in the context of deleting.
$img = "/dev/evms/$name-disk";
# make sure it exists.
if ( !-e $img )
if ( ! -e $img )
{
print "EVMS volume '$img' for host '$name' not found\n";
return;
@@ -286,37 +279,20 @@ sub updateXenImage
if ( ( -e $tmp . "/usr/bin/apt-get" ) &&
( -x $tmp . "/usr/bin/apt-get" ) )
{
#
# Copy dom0's resolv.conf to domU
#
mv("$tmp/etc/resolv.conf", "$tmp/etc/resolv.conf.old") if -f "$tmp/etc/resolv.conf";
cp("/etc/resolv.conf", "$tmp/etc/resolv.conf");
#
# Now run the update command.
#
system("chroot $tmp /usr/bin/apt-get update");
#
# 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"
);
#
# Restore domU's resolv.conf if needed
#
if (-f "$tmp/etc/resolv.conf") {
mv("$tmp/etc/resolv.conf.old", "$tmp/etc/resolv.conf");
} else {
unlink "$tmp/etc/resolv.conf";
}
#
# Now upgrade
#
system( "DEBIAN_FRONTEND=noninteractive chroot $tmp /usr/bin/apt-get upgrade --yes --force-yes" );
}
else
{
print "Xen image $name is not a Debian GNU/Linux image. Skipping\n";
print "Xen image $name is not a Debian GNU/Linux image. Skipping\n";
}
@@ -330,6 +306,113 @@ sub updateXenImage
=begin doc
Test to see if the given instance is running.
=end doc
=cut
sub xenRunning
{
my( $hostname ) = (@_ );
my $running = 0;
open( CMD, "xm list 2>/dev/null |")
or die "Failed to run 'xm list $hostname'";
while( <CMD> )
{
my $line = $_;
$running = 1 if ( $line =~ /\Q$hostname\E/ )
}
close( CMD );
return( $running );
}
=begin doc
Read the configuration file specified.
=end doc
=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+$//;
# command expansion?
if ( $val =~ /(.*)`([^`]+)`(.*)/ )
{
# store
my $pre = $1;
my $cmd = $2;
my $post = $3;
# get output
my $output = `$cmd`;
chomp( $output );
# build up replacement.
$val = $pre . $output . $post;
}
# Store value.
$CONFIG{ $key } = $val;
}
}
close( FILE );
}
=begin doc
Parse the arguments specified upon the command line.
@@ -346,19 +429,27 @@ sub parseCommandLineArguments
# Parse options.
#
GetOptions( "dir=s", \$CONFIG{ 'dir' },
"lvm=s", \$CONFIG{ 'lvm' },
"evms=s", \$CONFIG{ 'evms' },
"help", \$HELP,
"manual", \$MANUAL,
"version", \$VERSION );
GetOptions(
"dir=s", \$CONFIG{'dir'},
"lvm=s", \$CONFIG{'lvm'},
"evms=s", \$CONFIG{'evms'},
"help", \$HELP,
"manual", \$MANUAL,
"version", \$VERSION
);
pod2usage(1) if $HELP;
pod2usage( -verbose => 2 ) if $MANUAL;
pod2usage(-verbose => 2 ) if $MANUAL;
if ($VERSION)
if ( $VERSION )
{
print "xen-update-image release $RELEASE\n";
my $REVISION = '$Revision: 1.29 $';
if ( $REVISION =~ /1.([0-9.]+) / )
{
$REVISION = $1;
}
print "xen-update-image release $RELEASE - CVS: $REVISION\n";
exit;
}
@@ -377,14 +468,13 @@ sub parseCommandLineArguments
sub checkArguments
{
#
# Make sure we got one and only one installation method.
#
my $count = 0;
foreach my $type (qw/dir lvm evms/)
foreach my $type ( qw/dir lvm evms/ )
{
$count += 1 if defined( $CONFIG{ $type } );
$count += 1 if defined( $CONFIG{$type} );
}
#
@@ -393,10 +483,10 @@ sub checkArguments
#
if ( $count != 1 )
{
print "Please select one and only one of the installation methods:\n";
print " --dir\n";
print " --evms\n";
print " --lvm\n";
exit;
print "Please select one and only one of the installation methods:\n";
print " --dir\n";
print " --evms\n";
print " --lvm\n";
exit;
}
}

View File

@@ -1,11 +1,11 @@
#!/usr/bin/perl -w
=encoding utf8
=head1 NAME
xt-create-config - Create a Xen configuration file for a new guest
=cut
=head1 SYNOPSIS
xt-create-config [options]
@@ -39,6 +39,7 @@ xt-create-config - Create a Xen configuration file for a new guest
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
@@ -52,6 +53,8 @@ xt-create-config - Create a Xen configuration file for a new guest
By default the script will use /etc/xen-tools/xm.tmpl as its input.
=cut
=head1 INVOCATION
@@ -72,6 +75,9 @@ xt-create-config - Create a Xen configuration file for a new guest
=for example end
=cut
=head1 ARGUMENT PASSING
This script will be invoked with a full copy of the arguments from
@@ -96,18 +102,21 @@ xt-create-config - Create a Xen configuration file for a new guest
for the "Text::Template" perl module. (If you have the perldoc
package installed you can read this with "perldoc Text::Template".)
=cut
=head1 AUTHORS
Steve Kemp, http://www.steve.org.uk/
Axel Beckert, http://noone.org/abe/
Stéphane Jourdois
=head1 AUTHOR
Steve
--
http://www.steve.org.uk/
=cut
=head1 LICENSE
Copyright (c) 2005-2009 by Steve Kemp, (c) 2010-2012 by The Xen-Tools
Development Team. All rights reserved.
Copyright (c) 2005-2007 by Steve Kemp. All rights reserved.
This module is free software;
you can redistribute it and/or modify it under
@@ -141,14 +150,14 @@ my @PARTITIONS = undef;
#
# Default options
#
$CONFIG{ 'template' } = '/etc/xen-tools/xm.tmpl';
$CONFIG{ 'extension' } = '.cfg';
$CONFIG{'template'} = '/etc/xen-tools/xm.tmpl';
#
# Release number.
#
my $RELEASE = '4.4rc1';
my $RELEASE = '3.9';
@@ -167,9 +176,9 @@ checkArguments();
#
# If we've been given any administrators then set them up.
#
if ( $ENV{ 'admins' } )
if ( $ENV{'admins'} )
{
setupAdminUsers(\%CONFIG);
setupAdminUsers();
}
@@ -180,6 +189,9 @@ createXenConfig();
#
# Exit cleanly - any errors which have already occurred will result
# in "exit 1".
@@ -188,6 +200,9 @@ exit 0;
=begin doc
Parse the command line arguments this script was given.
@@ -205,23 +220,30 @@ sub parseCommandLineArguments
#
# Parse options.
#
GetOptions( "admins=s", \$ENV{ 'admins' },
"output=s", \$CONFIG{ 'output' },
"extension:s", \$CONFIG{ 'extension' },
"template=s", \$CONFIG{ 'template' },
"verbose", \$CONFIG{ 'verbose' },
"help", \$HELP,
"manual", \$MANUAL,
"version", \$VERSION
GetOptions(
"admins=s", \$ENV{'admins'},
"output=s", \$CONFIG{'output'},
"extension=s",\$CONFIG{'extension'},
"template=s", \$CONFIG{'template'},
"verbose", \$CONFIG{'verbose'},
"help", \$HELP,
"manual", \$MANUAL,
"version", \$VERSION
);
pod2usage(1) if $HELP;
pod2usage( -verbose => 2 ) if $MANUAL;
pod2usage(-verbose => 2 ) if $MANUAL;
if ($VERSION)
if ( $VERSION )
{
print "xt-create-xen-config release $RELEASE\n";
my $REVISION = '$Revision: 1.47 $';
if ( $REVISION =~ /1.([0-9.]+) / )
{
$REVISION = $1;
}
print "xt-create-xen-config release $RELEASE - CVS: $REVISION\n";
exit;
}
}
@@ -238,11 +260,10 @@ sub parseCommandLineArguments
sub checkArguments
{
#
# We require an output location.
#
if ( !defined( $CONFIG{ 'output' } ) )
if ( ! defined( $CONFIG{'output'} ) )
{
print "The '--output' argument is mandatory\n";
exit 1;
@@ -251,10 +272,9 @@ sub checkArguments
#
# The output location should be a directory which exists.
#
if ( !-d $CONFIG{ 'output' } )
if ( ! -d $CONFIG{'output'} )
{
print
"The output directory we've been given, $CONFIG{'output'}, doesnt exist\n";
print "The output directory we've been given, $CONFIG{'output'}, doesnt exist\n";
print "Aborting\n";
exit 1;
}
@@ -262,12 +282,11 @@ sub checkArguments
#
# Make sure that any specified template file exists.
#
if ( defined( $CONFIG{ 'template' } ) )
if ( defined( $CONFIG{'template'} ) )
{
if ( !-e $CONFIG{ 'template' } )
if ( ! -e $CONFIG{'template'} )
{
print
"The specified template file, $CONFIG{'template'} does not exist.\n";
print "The specified template file, $CONFIG{'template'} does not exist.\n";
exit 1;
}
}
@@ -291,18 +310,20 @@ sub importPartitionsFromEnvironment
{
@PARTITIONS = ();
return unless exists $ENV{ 'NUMPARTITIONS' };
for ( my $i = 1 ; $i <= $ENV{ 'NUMPARTITIONS' } ; $i++ )
for (my $i=1; $i <= $ENV{'NUMPARTITIONS'}; $i++)
{
my @parts = split( /:/, $ENV{ 'PARTITION' . $i }, 7 );
my @parts = split(/:/, $ENV{'PARTITION' . $i}, 7);
push( @PARTITIONS,
{ 'name' => $parts[0],
'size' => $parts[1],
'type' => $parts[2],
'mountpoint' => $parts[3],
'options' => $parts[4],
'imagetype' => $parts[5],
'image' => $parts[6] } );
{
'name' => $parts[0],
'size' => $parts[1],
'type' => $parts[2],
'mountpoint' => $parts[3],
'options' => $parts[4],
'imagetype' => $parts[5],
'image' => $parts[6]
}
);
}
}
@@ -323,31 +344,26 @@ sub createXenConfig
#
# The output file we're going to process.
#
my $file =
$CONFIG{ 'output' } . '/' . $ENV{ 'hostname' } . $CONFIG{ 'extension' };
my $file = $CONFIG{'output'} . '/' . $ENV{'hostname'} . $ENV{'extension'};
#
# The template we're going to read from.
#
my $template = new Text::Template( TYPE => 'FILE',
SOURCE => $CONFIG{ 'template' } );
SOURCE => $CONFIG{'template'} );
#
# The device we're using.
#
my $device = 'xvda';
if ( defined( $ENV{ 'ide' } ) )
my $device = 'sda';
if ( defined( $ENV{'ide'} ) )
{
$device = 'hda';
}
elsif ( defined( $ENV{ 'scsi' } ) )
elsif ( defined( $ENV{'disk_device'} ) )
{
$device = 'sda';
}
elsif ( defined( $ENV{ 'disk_device' } ) )
{
$device = $ENV{ 'disk_device' };
$device = $ENV{'disk_device'};
# strip /dev/, if present.
if ( $device =~ /^(.*)\/(.*)$/ )
@@ -355,77 +371,65 @@ sub createXenConfig
$device = $2;
}
}
$ENV{ 'device' } = $device;
$ENV{'device'} = $device;
#
# The memory size: Convert Gb -> Mb.
#
if ( $ENV{ 'memory' } =~ /^(\d+)Gb?.*$/i )
if ( $ENV{'memory'} =~ /^(\d+)Gb*$/i )
{
$ENV{ 'memory' } = $1 * 1024;
$ENV{'memory'} = $1 * 1024;
}
#
# Remove any trailing Mb.
#
$ENV{ 'memory' } =~ s/^(\d+)Mb?.*$/$1/i;
#
# The maxmem size: Convert Gb -> Mb.
#
if ( exists($ENV{ 'maxmem' }) and defined($ENV{ 'maxmem' })) {
if ($ENV{ 'maxmem' } =~ /^(\d+)Gb?.*$/i )
{
$ENV{ 'maxmem' } = $1 * 1024;
}
#
# Remove any trailing Mb.
#
$ENV{ 'maxmem' } =~ s/^(\d+)Mb?.*$/$1/i;
if ( $ENV{'memory'} =~ /^(\d+)Mb*$/i )
{
$ENV{'memory'} = $1;
}
#
# Images as presented to Xen - either loopback images, or LVM partitions.
#
if ( $ENV{ 'lvm' } )
if ( $ENV{'lvm'} )
{
$ENV{ 'image_prefix' } = "phy:$ENV{'lvm'}/$ENV{'hostname'}-";
$ENV{ 'image_suffix' } = '';
$ENV{'image_prefix'} = "phy:$ENV{'lvm'}/$ENV{'hostname'}-";
$ENV{'image_suffix'} = '';
importPartitionsFromEnvironment();
}
elsif ( $ENV{ 'evms' } )
elsif ( $ENV{'evms'} )
{
$ENV{ 'image_prefix' } = "phy:/dev/evms/$ENV{'hostname'}-";
$ENV{ 'image_suffix' } = '';
$ENV{'image_prefix'} = "phy:/dev/evms/$ENV{'hostname'}-";
$ENV{'image_suffix'} = '';
importPartitionsFromEnvironment();
}
elsif ( $ENV{ 'image_dev' } )
elsif ( $ENV{'image-dev'} )
{
$ENV{ 'image_vbd' } = "phy:$ENV{'image_dev'}";
$ENV{'image_vbd'} = "phy:$ENV{'image-dev'}";
if ( $ENV{ 'swap_dev' } )
if ( $ENV{'swap-dev'} )
{
$ENV{ 'swap_vbd' } = "phy:$ENV{'swap_dev'}";
$ENV{'swap_vbd'} = "phy:$ENV{'swap-dev'}";
}
else
{
$ENV{ 'swap_vbd' } = undef;
$ENV{'swap_vbd'} = undef;
}
}
else
{
$ENV{ 'image_prefix' } = "file:$ENV{'dir'}/domains/$ENV{'hostname'}/";
$ENV{ 'image_suffix' } = '.img';
$ENV{'image_prefix'} = "file:$ENV{'dir'}/domains/$ENV{'hostname'}/";
$ENV{'image_suffix'} = '.img';
importPartitionsFromEnvironment();
}
#
# The xen-tools version.
#
$ENV{ 'xen_tools_version' } = $RELEASE;
$ENV{'xen_tools_version'} = $RELEASE;
#
@@ -434,11 +438,11 @@ sub createXenConfig
# made available to our template file.
#
my %vars;
foreach my $key ( sort keys %ENV )
foreach my $key (sort keys %ENV )
{
$vars{ $key } = $ENV{ $key };
$vars{$key} = $ENV{$key};
}
$vars{ 'PARTITIONS' } = \@PARTITIONS;
$vars{'PARTITIONS'} = \@PARTITIONS;
#
# Now output the data.
@@ -453,9 +457,9 @@ sub createXenConfig
#
# Write the output of processing the template file, if it succeeds.
#
if ( defined $result )
if (defined $result)
{
print FILE $result;
print FILE $result ;
}
else
{
@@ -465,6 +469,77 @@ sub createXenConfig
#
# Close the output file.
#
close(FILE);
close( FILE );
}
=begin doc
This routine is designed to ensure that any users specified with
the --admins flag are setup as administrators of the new instance.
=end doc
=cut
sub setupAdminUsers
{
#
# If we're not root we can't modify users.
#
return if ( $EFFECTIVE_USER_ID != 0 );
#
# If we don't have a sudoers file then we'll also ignore this.
#
return if ( ! -e "/etc/sudoers" );
#
# Find the path to the xen-login-shell
#
my $shell = undef;
$shell = "/usr/bin/xen-login-shell" if ( -x "/usr/bin/xen-login-shell" );
$shell = "/usr/local/bin/xen-login-shell" if ( -x "/usr/bin/local/xen-login-shell" );
return if ( !defined( $shell ) );
#
# For each user make sure they exist, and setup the
# login shell for them.
#
foreach my $user ( split( /,/, $ENV{'admins'} ) )
{
# Strip leading and trailing whitespace.
$user =~ s/^\s+//;
$user =~ s/\s+$//;
# Ignore root
next if ( $user =~ /^root$/i );
# Does the user exist?
if ( getpwnam($user) )
{
# Change shell.
$CONFIG{'verbose'} && print "Changing shell for $user: $shell\n";
system( "chsh", "-s", $shell, $user );
}
else
{
# Add a new user.
$CONFIG{'verbose'} && print "Adding new user: $user\n";
system( "useradd", "-s", $shell, $user );
}
#
# Add the entry to /etc/sudoers.
#
open( SUDOERS, ">>", "/etc/sudoers" ) or warn "Failed to add user to sudoers file : $user - $!";
print SUDOERS "$user ALL = NOPASSWD: /usr/sbin/xm, /usr/bin/xen-create-image\n";
close( SUDOERS );
}
}

View File

@@ -1,11 +1,11 @@
#!/usr/bin/perl -w
=encoding utf8
=head1 NAME
xt-customize-image - Customize a freshly installed copy of GNU/Linux
=cut
=head1 SYNOPSIS
xt-customize-image [options]
@@ -25,6 +25,7 @@ xt-customize-image - Customize a freshly installed copy of GNU/Linux
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 NOTES
@@ -40,6 +41,8 @@ xt-customize-image - Customize a freshly installed copy of GNU/Linux
--location - The temporary installation root of the new install
--dist - The distribution which has been installed.
=cut
=head1 HOOK SCRIPTS
@@ -51,21 +54,24 @@ xt-customize-image - Customize a freshly installed copy of GNU/Linux
the --location option.
For the distribution named 'foo' the scripts will be loaded and
executed from '/usr/share/xen-tools/foo.d'. Each executable will
executed from '/usr/lib/xen-tools/foo.d'. Each executable will
be loaded and executed in sorted order.
=cut
=head1 AUTHORS
Steve Kemp, http://www.steve.org.uk/
Axel Beckert, http://noone.org/abe/
Stéphane Jourdois
=head1 AUTHOR
Steve
--
http://www.steve.org.uk/
=cut
=head1 LICENSE
Copyright (c) 2005-2009 by Steve Kemp, (c) 2010 by The Xen-Tools
Development Team. All rights reserved.
Copyright (c) 2005-2007 by Steve Kemp. All rights reserved.
This module is free software;
you can redistribute it and/or modify it under
@@ -91,7 +97,8 @@ my %CONFIG;
#
# Release number.
#
my $RELEASE = '4.4rc1';
my $RELEASE = '3.9';
@@ -121,6 +128,9 @@ exit 0;
=begin doc
Parse the command line arguments this script was given.
@@ -138,22 +148,29 @@ sub parseCommandLineArguments
#
# Parse options.
#
GetOptions( "location=s", \$CONFIG{ 'location' },
"dist=s", \$CONFIG{ 'dist' },
"verbose", \$CONFIG{ 'verbose' },
"help", \$HELP,
"manual", \$MANUAL,
"version", \$VERSION
);
GetOptions(
"location=s", \$CONFIG{'location'},
"dist=s", \$CONFIG{'dist'},
"verbose", \$CONFIG{'verbose'},
"help", \$HELP,
"manual", \$MANUAL,
"version", \$VERSION
);
pod2usage(1) if $HELP;
pod2usage( -verbose => 2 ) if $MANUAL;
pod2usage(-verbose => 2 ) if $MANUAL;
if ($VERSION)
if ( $VERSION )
{
print "xt-customize-image release $RELEASE\n";
exit;
my $REVISION = '$Revision: 1.33 $';
if ( $REVISION =~ /1.([0-9.]+) / )
{
$REVISION = $1;
}
print "xt-customize-image release $RELEASE - CVS: $REVISION\n";
exit;
}
}
@@ -169,11 +186,10 @@ sub parseCommandLineArguments
sub checkArguments
{
#
# We require a location.
#
if ( !defined( $CONFIG{ 'location' } ) )
if ( ! defined( $CONFIG{'location'} ) )
{
print "The '--location' argument is mandatory\n";
exit 1;
@@ -183,7 +199,7 @@ sub checkArguments
#
# Test that the location we've been given exists
#
if ( !-d $CONFIG{ 'location' } )
if ( ! -d $CONFIG{'location'} )
{
print "The installation directory we've been given doesn't exist\n";
print "We tried to use : $CONFIG{'location'}\n";
@@ -194,7 +210,7 @@ sub checkArguments
#
# We require a distribution name.
#
if ( !defined( $CONFIG{ 'dist' } ) )
if ( ! defined( $CONFIG{'dist'} ) )
{
print "The '--dist' argument is mandatory\n";
exit 1;
@@ -208,18 +224,18 @@ sub checkArguments
# If there are no scripts then we clearly cannot
# customise it!
#
my $dir = "/usr/share/xen-tools/" . $CONFIG{ 'dist' } . ".d";
my $dir = "/usr/lib/xen-tools/" . $CONFIG{'dist'} . ".d";
if ( !-d $dir )
if ( ! -d $dir )
{
print <<E_OR;
We\'re trying to configure an installation of $CONFIG{'dist'} in
We're trying to configure an installation of $CONFIG{'dist'} in
$CONFIG{'location'} - but there is no hook directory for us to use.
This means we don\'t know how to configure this installation.
This means we don't know how to configure this installation.
We\'d expect the hook directory to be : $dir
We'd expect the hook directory to be : $dir
Aborting.
E_OR
@@ -246,16 +262,15 @@ E_OR
sub runDistributionHooks
{
#
# Hook directory.
#
my $hooks = "/usr/share/xen-tools/" . $CONFIG{ 'dist' } . ".d/";
my $hooks = "/usr/lib/xen-tools/" . $CONFIG{'dist'} . ".d/";
#
# Installation prefix
#
my $prefix = $CONFIG{ 'location' };
my $prefix = $CONFIG{'location'};
#
# If we're running verbosely then setup the client environment
@@ -264,9 +279,9 @@ sub runDistributionHooks
# This is useful in case this script is called outwith the usual
# xen-create-image framework.
#
if ( $CONFIG{ 'verbose' } )
if ( $CONFIG{'verbose'} )
{
$ENV{ 'verbose' } = 1;
$ENV{'verbose'} = 1;
}
#
@@ -275,7 +290,6 @@ sub runDistributionHooks
#
foreach my $file ( sort( glob( $hooks . "*" ) ) )
{
# skip files that end with .dpkg-new, .dpkg-old or '~'
next if ( $file =~ /\.dpkg-(new|old)/ );
next if ( $file =~ /~$/ );
@@ -285,7 +299,6 @@ sub runDistributionHooks
#
if ( ( -x $file ) && ( -f $file ) )
{
#
# Just display the name - no need to see the full path.
#
@@ -304,26 +317,18 @@ sub runDistributionHooks
# Run the command. This has different prolog and epilog
# depending on whether we're running verbosely or not.
#
if ( $CONFIG{ 'verbose' } )
if ( $CONFIG{'verbose'} )
{
print "Running hook $name ['$cmd']\n";
print "--\n";
my $rc = system($cmd);
if ($rc != 0) {
print "hook $name failed: $?\n";
exit 1;
}
system( $cmd );
print "--\n";
print "Done\n\n";
}
else
{
print "Running hook $name\n";
my $rc = system($cmd);
if ($rc != 0) {
print "hook $name failed: $?\n";
exit 1;
}
system( $cmd );
print "hook $name: done.\n";
}
}

View File

@@ -1,188 +0,0 @@
#!/usr/bin/perl -w
=encoding utf8
=head1 NAME
xt-guess-suite-and-mirror - Tries to guess the most suitable suite and
mirror for DomUs on Debian and Ubuntu Dom0s.
=head1 SYNOPSIS
--suite Show suite
--mirror Show mirror
Shows both if no parameter is given.
Help Options:
--help Show the help information for this script.
--manual Show the manual for this script.
--version Show the version number and exit.
=head1 DESCRIPTION
xt-guess-suite-and-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.
=head1 AUTHORS
Axel Beckert, http://noone.org/abe/
Stéphane Jourdois
=head1 LICENSE
Copyright (C) 2010-2012 by The Xen-Tools Development Team. 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 (http.debian.net
# redirects to a working mirror nearby)
my %fallback_mirror = ( Debian => 'http://http.debian.net/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_files = ( '/etc/apt/sources.list',
glob('/etc/apt/sources.list.d/*.list'));
use File::Slurp;
use Getopt::Long;
use Pod::Usage;
use File::Which;
use strict;
#
# Release number.
#
my $RELEASE = '4.4rc1';
# 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_manual = 0;
my $result = GetOptions( 'mirror|m' => \$want_mirror,
'suite|s' => \$want_suite,
'version' => \$want_version,
'manual' => \$want_manual,
'help' => \$want_help );
if ($want_help) {
pod2usage(0);
}
if ($want_manual) {
pod2usage( -verbose => 2 );
}
all_sources_list_files: foreach my $sources_list_file (@sources_list_files) {
if (-r $sources_list_file) {
# sources.list file 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 all_sources_list_files;
}
}
}
}
die "Couldn't find a useful entry in the sources.list files of the Dom0. Tried:\n ".
join("\n ", @sources_list_files)."\n" unless $found;
my $lsb_release = which('lsb_release');
if (!$found and defined($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};
}

File diff suppressed because it is too large Load Diff

42
debian/NEWS vendored
View File

@@ -1,42 +0,0 @@
xen-tools (4.4~beta1-1) unstable; urgency=low
* Exported environment variables no more contain dashes ("-"). Dashes in
environment variable names are from now on converted to underscores
("_") before being exported. May affect some hook or role scripts.
* /usr/lib/xen-tools/ has been moved to /usr/share/xen-tools/ to
properly adhere to FHS. In case you had local scripts added to
/usr/lib/xen-tools/, please move them to /usr/share/xen-tools/, too
and then remove /usr/lib/xen-tools/ and its left-over subdirectories
which all should be empty at that point, i.e. "rmdir -p
/usr/lib/xen-tools/*" should do the trick.
-- Axel Beckert <abe@debian.org> Fri, 23 Aug 2013 19:01:16 +0200
xen-tools (4.2~rc1-1) unstable; urgency=low
By default, xen-create-image now generates a random root password and
displays it as plain text at the end of the DomU generation process.
Use --genpass=0 and --passwd=1 to interactively set a root password
without the password being displayed.
-- Axel Beckert <abe@debian.org> Tue, 03 Aug 2010 16:14:42 +0200
xen-tools (4.2~beta1-1) unstable; urgency=low
If the DomU hangs with "Waiting for root file system" despite
/dev/xvd* is used as disk device, adding "xen-blkfront" to
/etc/initramfs-tools/modules and runing "update-initramfs -u"
afterwards may help.
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 <abe@debian.org> Sun, 30 May 2010 22:36:16 +0200

22
debian/README.source vendored
View File

@@ -1,22 +0,0 @@
How to build xen-tools directly from the Git repository?
========================================================
Clone the git repository and change to the directory of your local
working copy.
$ git clone git://gitorious.org/xen-tools/xen-tools.git
$ cd xen-tools
If you just want to build the binary package, run
$ make changelog
$ dpkg-buildpackage -uc -us -b
If you want to build source and binary packages, e.g. for an upload to
Debian or Ubuntu:
$ make orig-tar-gz
$ dpkg-buildpackage
-- Axel Beckert <abe@debian.org>, Mon, 13 Sep 2010 14:30:05 +0200

376
debian/changelog vendored
View File

@@ -1,379 +1,3 @@
xen-tools (4.4~rc1-1) unstable; urgency=low
* New upstream release candidate
- Also switch from cdn.debian.net to http.debian.net in xen-tools.conf
- Do not run "passwd" via runCommand as that one captures STDOUT for
logging. Makes --passwd usable again. Thanks to Christian Herzog for
the bug report.
- Loop around calling "passwd" to get a second chance to change the
password. (Closes: #703159) Thanks to Joan <aseques@gmail.com> for a
bug fix in this new code.
+ Add dependency on "libterm-ui-perl | perl (<< 5.17.0)"
- Declares one more POD encoding and recode Xen::Tools::Common to
UTF-8. Fixes FTBFS with Perl 5.18. (Finally closes: #720519)
- Apply patch by Philipp Erbelding to fix overzealous line matching in
xen-list-images. (Gitorious merge request #5)
- xen-list-images now displays a unit after the memory size
- Drop support for memory size in kilobytes in xen-create-image,
neither xt-create-xen-config nor xm support it.
- Refactoring: Replace all occurrences of "! -z" by "-n" in hooks and
bash completion.
- Handle potentially empty gateway setting properly in
hooks/common/40-setup-networking-deb. Thanks Simone Caruso!
- Reformat hooks/common/40-setup-networking-deb so that the result
neither has trailing whitespace nor broken indentation.
- Also display MAC address after the DomU has been created.
- Preliminary support for Ubuntu 14.04 Trusty Tahr.
- Added --maxmem flag to set a maximum value for dynamic memory
ballooning. Thanks to Joan <aseques@gmail.com> for the patch!
- Added fix by Patryk Ściborek againsat disableStartStopDaemon()
aborting under some circumstances. (Closes: #725192)
- Abort early and with proper error message if "xen-delete-image
--test" is not used with "--dir". (Closes: #704878)
- xen-delete-image: Exit with return code != 0 in all error cases.
- Refactoring: xt-create-xen-config: Use s/// to strip trailing MB
size suffixes.
* Bump Standards-Version to 3.9.5 (no changes).
-- Axel Beckert <abe@debian.org> Mon, 28 Oct 2013 22:31:03 +0100
xen-tools (4.4~beta1-1) unstable; urgency=low
* New upstream beta release
- Code deduplication to unify the xen-*-image scripts
- Moves /usr/lib/xen-tools/ to /usr/share/xen-tools/
- Use http.debian.net as default Debian mirror if no mirror is given
and xt-guess-suite-and-mirror is not used.
- Fix symbolic link hooks/centos-6/15-setup-arch (Closes: #690299)
- Execute END block not on --version/--help/--manual (Closes: #684346)
- Move code for --boot feature to END block. Fixes missing SSH
fingerprint display if --boot was used. (Closes: #679183)
- Correctly handle aborts in END block. (Closes: #704882)
- Use local parameter instead of global variable in unMountImage.
- Also recognize "M" and "G" instead of "MB" and "GB" as size unit for
--memory. (Closes: #691320) Document the recognized units.
- Default DomUs to use the noop scheduler (Closes: #693131)
- Overwork TLS disabling on Debian and Ubuntu
- xen-list-images now also outputs the file name of the config file.
- xen-list-images and xen-delete-image now understand --extension.
- Fixes "--extension=" with empty parameter.
- Sarge amd64 case handle properly
- Remove CVS revisions from --version output
- Support for Debian Jessie, Ubuntu Raring and preliminary support for
Ubuntu Saucy (debootstrap doesn't have support for Saucy at the time
of writing)
- Preliminary support for xl toolstack
- xen-create-image: Consistently use runCommand() instead of system()
- xt-install-image: Don't bail out if only cdebootstrap is installed
but not debootstrap (Thanks Elmar Heeb!)
- Makefile accepts DESTDIR=…
- Move examples from debian/examples to examples.
- Uses File::Which exclusively (no more findBinary, no more `which`),
added (build-) dependency on libfile-which-perl
- Knows about module-init-tools → kmod transition in wheezy/raring.
- Adds default mount options for ext4, identical to ext2/ext3.
- Ships /etc/initramfs-tools/conf.d/xen-tools for generating Dom0
initrds also suitable for DomU usage. Trigger update-initramfs.
- By default install linux-image-virtual instead of linux-image-server
on Ubuntu Intrepid and newer (Hopefully closes: #640099, LP #839492)
- Installs a legacy grub in all pygrub based Debian/Ubuntu DomUs to be
able to update the menu.list automatically.
- hooks/common.sh: installDebianPackage no more installs recommends.
- hooks/common.sh: Rename installCentOS4Package to installRPMPackage.
Add installCentOS4Package wrapper for backward compatibility.
- Fix filesystem tools installation in 91-install-fs-tools (which was
broken since 4.3~rc1-1) by merging 91-install-fs-tools back into
90-make-fstab. (Closes: #715340) Also supports RPM-based
distributions now.
- Fixes export of environment variables. Previously they could contain
dashes and then were only accessible from within Perl, but not from
within Bash.
- Fixes creation of "ARRAY(0x…).log" named log files.
- Makes some options (like --pygrub) negatable.
- Uses Test::NoTabs; add according build-dependency.
- Removes unused Perl modules Xen::Tools and Xen::Tools::Log from
source code. Also removes the according tests from the test suite.
→ Remove no more needed build-dependency on Moose.
- Better documents and checks requirements for the --apt_proxy
value. (See #623443 for the corresponding apt issue.) Add (build-)
dependency on libdata-validate-uri-perl.
- Use Data::Validate::{Domain,IP} for IP addresses and hostname checks.
Add corresponding (build-) dependencies on
libdata-validate-{domain,ip}-perl.
- Fixes broken quoting in list of required binaries
- Declares POD encoding. Fixes FTBFS with Perl 5.18. (Closes: #720519)
* Add debian/gbp.conf to be able to to build xen-tools with
git-buildpackage.
* Clean up debian/rules:
- Don't mention (generated) upstream changelog explicitly,
dh_installchangelogs finds it by itself if it exist. That way
building out of a freshly clone git repository does not fail due to
a missing upstream changelog.
- Use dh_auto_{install,clean}; use "$(MAKE)" instead of "make" where
dh_auto_* can't help. No more explicitly call "make manpages", it's
a depedency of "make install" in the next line anyway.
- Finally switch to a minimal dh style debian/rules.
* Bump debhelper compatibility to 9
- Update versioned debhelper build-dependency
* Bump Standards-Version to 3.9.4 (no changes)
* Add dependency on ${perl:Depends} to fix dpkg-gencontrol warning.
* Bump copyright years in debian/copyright.
* Apply wrap-and-sort.
-- Axel Beckert <abe@debian.org> Fri, 23 Aug 2013 19:00:03 +0200
xen-tools (4.3.1-1) unstable; urgency=low
* Remove t/modules.t in upstream's t/Makefile instead of debian/rules'
clean target.
* Run t/hook-tls.t only if distribution actually has
10-disable-tls. Fixes test suite failure on 32 bit architectures.
-- Axel Beckert <abe@debian.org> Sat, 30 Jun 2012 16:44:50 +0200
xen-tools (4.3-1) unstable; urgency=low
* New upstream release
- Remove most Mercurial traces
* Fixes FTBFS due to testsuite failures (Closes: #676681)
- Disable tests of not yet used Xen::Tools. Fixes FTBFS in test suite
due to not satisifed Moose dependency in Xen::Tools::Log.
- Added build-dependencies on libmoose-perl, git, and
libtest-pod-coverage-perl for t/perl-syntax.t, t/gitignore.t, and
t/pod-coverage.t.
- Skip t/hook-inittab.t if /etc/inittab is not present on the build
host. Fixes FTBFS on Ubuntu.
* Switch to source format to "3.0 (quilt)"
* Don't remove stamp files manually, dh_clean does that already
* Remove generated file t/modules.t in clean target to be able to build
twice in a row.
-- Axel Beckert <abe@debian.org> Tue, 26 Jun 2012 22:23:59 +0200
xen-tools (4.3~rc1-1) unstable; urgency=low
* New upstream release candidate
- Correctly checks and documents valid values for
disk_device. (Closes: #621499)
- Supports creating Ubuntu 11.10 Oneiric DomUs (LP: #848654)
- Supports creating Ubuntu 12.04 Precise and 12.10 Quantal DomUs
- Supports creating CentOS 6 DomUs (Closes: #578399; Thanks Johan
Schurer)
+ Recommend rinse >= 1.9.1-1
- Supports rinse 2.0
- Updated mirror list for discontinued releases of Debian and Ubuntu
- Workaround for missing unit parsing in xen-create-nfs (Closes:
#648814)
- Fix wildcard vs regexp in memory configuration parsing.
- Fix misbehaviour if --ip option is passed multiple times (Closes:
#652110; Thanks Brian Bennett and Alexander Mette!)
- Supports /etc/apt/sources.list.d/ (Closes: #650300)
- xt-guess-suite-and-mirror exits with non-zero if no proper mirror
could be extracted from /etc/apt/sources.list or
/etc/apt/sources.list.d/*.list (Thanks Phil Frost!)
- Only attempts to generate the ssh host keys if not already present
(Closes: #607236; Thanks Vagrant Cascadian!)
- New option --apt_proxy (Closes: #610457; Thanks Alex Tomlins!)
- Always write down root partition as first physical device, otherwise
pygrub fails (Closes: #609673)
- No more expect at least one option to mkfs.* calls. Fixes btrfs
creation. (Closes: #609982)
- Fixes call to non-existent function logPrint (Closes: #673335)
- Also disable initctl in the chroot, not only start-stop-daemon
(LP: #997063; Thanks xstasi!)
- Massive code deduplication in hooks directory
- Use release blacklist for libc6-xen instead of whitelist in
hooks/debian.d/20-setup-apt
- Enforces umask 022 in 50-setup-hostname* (Hopefully closes: #619630)
* Add dependency on openssh-client for ssh-keygen (Closes: #649108)
* Use dh_auto_test for build time tests and add according
build-dependencies on devscripts and libfile-slurp-perl.
* No more suggest evms-cli -- it's no more available on any supported
Dom0 distribution. Thanks to Markus Waldeck for the hint.
* Add NEWS to debian/docs.
* Bump Standards-Version to 3.9.3 (no changes)
* Fix the following Lintian warnings:
- copyright-refers-to-symlink-license
- debian-rules-missing-recommended-target
* debian/copyright: Update copyright years
* Move xen-utils (for pygrub) from Suggests to Recommends as pygrub
becomes the necessary way to boot more and more often.
* Remove xen-shell from Recommends, nobody picked it up. (Closes:
#603708)
-- Axel Beckert <abe@debian.org> Fri, 08 Jun 2012 14:18:38 +0200
xen-tools (4.2.1-1) unstable; urgency=low
* New upstream release
- Fixes bashism in "editor" roles script. Thanks Raphaël Halimi for
the patch! (Closes: #605203)
- Fixes missing architecture check in Sarge amd64 special case. Thanks
to Guillaume Pernot! (Closes: #611397) Also changes default Sarge
amd64 mirror to http://archive.debian.org/debian-amd64/.
- Allows --ip=auto again (Closes: #611407)
- Unmounts /proc and /dev/pts of the freshly installed DomU just
before unmounting the disk image. (Closes: #588783)
-- Axel Beckert <abe@debian.org> Thu, 17 Mar 2011 01:00:47 +0100
xen-tools (4.2-1) unstable; urgency=low
* New upstream release
- Fixes several cases of broken or incomplete config files with
unexpected or seldom parameter combinations. (Closes: #484652)
- Updates examples in /etc/xen-tools.conf to better reflect current
state
- Allows usage of xvc* as serial console as used as default by older
Xen versions.
- Preliminary support for Ubuntu 11.04 (Natty) and Debian 7.0 (Wheezy)
(Closes: #597521)
- Switches default mirror for EoL'ed Ubuntu 8.10 (Intrepid) and Debian
4.0 (Etch) to the distributions' archives for old releases.
* Does no more try extract the upstream changelog during debian package
build. The commit which introduced this problem has been reverted.
Document more clearly in debian/README.source how to build the package
from a checked out copy of the git repository, especially that the
upstream changelog has to be generated first out of the VCS log.
(Closes: #595883)
* Update debian/copyright: Add Stéphane Jourdois to list of authors.
-- Axel Beckert <abe@debian.org> Tue, 05 Oct 2010 19:01:49 +0200
xen-tools (4.2~rc1-1) unstable; urgency=low
[Axel Beckert]
* New upstream release candidate
- Uses GeoIP for Debian mirrors: Default Debian mirror is now
cdn.debian.net, see http://wiki.debian.org/DebianGeoMirror for
details.
- Uses the same 15-disable-hwclock hook for Debian as for Ubuntu DomUs
(Closes: #588880)
- Mounts not only /proc but also /dev/pts automatically before running
any customisation hooks (Closes: #588783)
- Uses apt-config to parse Dom0's apt.conf. (Closes: #560011)
- Fixes wrong loop module parameter syntax in warning. Thanks to
Daniel Baumann for spotting this. (Closes: #516902)
- With --verbose, the output of commands called by xen-tools
(e.g. debootstrap) is not only logged, but also printed to
STDOUT. (Closes: #513126)
- Adds btrfs support.
* Bump Standards-Version to 3.9.1 (no changes)
[Stéphane Jourdois]
* [debian/control] Suggest btrfs-tools
-- Axel Beckert <abe@debian.org> Sun, 15 Aug 2010 19:34:38 +0200
xen-tools (4.2~beta1-1) unstable; urgency=low
* New maintainer and upstream authors
* Reintroduction into Debian Unstable (Closes: #566714)
* New upstream beta version
- Needs dependency on libfile-slurp-perl
- Supports for more recent versions of Fedora, Ubuntu and Debian
(Closes: #499477)
- Supports pygrub. (Added "Suggests: xen-utils" to debian/control)
- Uses hvc0 and xvda devices by default
- Sets umask to 0077 before creating disk images (Closes: #548909)
- Makes sure, MAKEDEV is found in either /dev/ or /sbin/
(Closes: #502798, #515228)
- Changed rinse path to /usr/sbin/. (Closes: #511211)
- Doesn't delete configuration file if it already exists when
xen-create-image is run. (Closes: #520177)
- Doesn't write the FQDN into /etc/hostname (Closes: #492583)
- Dereferences pointers before hashing them to generate a MAC
address. (Closes: #547265)
- Calls pwconv and grpconv inside chroot when installing Fedora
(Closes: #499476)
- Fixed typo in /usr/lib/xen-tools/*.d/75-fixup-securetty
(Closes: #503339)
- Makes better decisions about when to enable Debian security updates
in the created DomU (LP: #309750)
- Installs dhclient for CentOS and Fedora if DHCP networking is
requested (LP: #241446)
- Fixes some bashisms (Closes: #530226)
* [^y] → [!y] (Thanks to Mathieu Parent!)
* kill -HUP → kill -s HUP (found by checkbashism)
* ${parm/?/pat[/str]} → echo | sed
* echo -e → printf
* read → read dummy
- xt-install-image now exits with return value 127 instead of 0 to
indicate errors on running the command given in --install-method.
(Closes: #534290)
- The debootstrap command now also can be configured on the
commandline with --debootstrap-cmd in xen-create-image and
xt-install-image (Enhances fix for #436480 which added the
debootstrap-cmd config file option)
- Checks for debootstrap and cdebootstrap, uses debootstrap if both
are installed (Changed "Depends: debootstrap" to "Depends:
debootstrap | cdebootstrap" in debian/control)
- Added new files TODO and KNOWN_BUGS to debian/docs.
* Removal of /etc/bash_completion.d/xm from the package since
bash-completion ships a more elaborate version of that file. (Closes:
#566683, #550590, LP: #538917, #484098)
* Downgrade reiserfsprogs and xfsprogs to Suggests. (Closes: #561618,
LP: #80233)
* Added evms-cli to Suggests. It has been removed from Debian before
Lenny, but it is necessary for some optional functionality of
xen-tools. And since some Debian derived distributions (e.g. Ubuntu
LTS and grml) still support it, it's included for the sake of
completeness and correctness.
* Added cfengine2 to Suggests. It is helpful to have it installed when
using the cfengine2 role.
* Bump Standards-Version to 3.8.4 (no changes necessary)
* Bump Debhelper Compatibility to 7
- Replace "dh_clean -k" by "dh_prep"
* Add Vcs-* headers pointing to new upstream and packaging repository
* Fix some Lintian warnings:
- [debian/control]: debhelper-but-no-misc-depends
- [debian/copyright]: copyright-without-copyright-notice
- [debian/source/format]: missing-debian-source-format
* Added a README.source explaining how to build xen-tools directly from
the Git repository.
* Overhauled package description
-- Axel Beckert <abe@debian.org> Sun, 30 May 2010 22:32:30 +0200
xen-tools (4.1-1) unstable; urgency=low
- New command line argument '--no-hosts' to avoid touching /etc/hosts
on dom0
- New command line argument '--pygrub' to setup a guest for pygrub use.
- Generated configuration file should work for --image-dev + --swap-dev
again.
- Always use /dev/pts for new images.
-- Steve Kemp <skx@debian.org> Sun, 23 Nov 2008 13:06:01 +0000
xen-tools (3.9-6) unstable; urgency=low
- Allow command line flags to be unset.
Thanks to Ruud Koolen for the patch.
(Closes: #484338)
-- Steve Kemp <skx@debian.org> Tue, 14 Oct 2008 22:00:22 +0000
xen-tools (3.9-5) unstable; urgency=medium
- Record the ARCH for RPM-based distros.
(Closes: #475125)
- Abort if the generated configuration file already exists.
(Closes: #499475)
-- Steve Kemp <skx@debian.org> Mon, 13 Oct 2008 19:20:21 +0000
xen-tools (3.9-4) unstable; urgency=high
* Changed two defaults in xen-tools.conf to conform
to the defaults used by the xen packages:
+ serial_device: tty1 -> hvc0
+ disk_device: sda -> xvda
* Priority High because of RC bug. (closes: #499282)
-- Radu Spineanu <radu@debian.org> Tue, 30 Sep 2008 02:02:21 +0300
xen-tools (3.9-3) unstable; urgency=medium
- Ensure that Fedora guests get /dev/pts mounted.

2
debian/compat vendored
View File

@@ -1 +1 @@
9
4

77
debian/control vendored
View File

@@ -1,77 +1,18 @@
Source: xen-tools
Section: utils
Priority: extra
Maintainer: Axel Beckert <abe@debian.org>
Build-Depends: debhelper (>= 9~),
devscripts,
git,
libdata-validate-domain-perl,
libdata-validate-ip-perl,
libdata-validate-uri-perl,
libfile-slurp-perl,
libfile-which-perl,
libtest-notabs-perl,
libtest-pod-coverage-perl,
libtest-pod-perl,
libtext-template-perl
Standards-Version: 3.9.5
Maintainer: Roland Stigge <stigge@antcom.de>
Uploaders: Radu Spineanu <radu@debian.org>, Steve Kemp <skx@debian.org>
Build-Depends: debhelper (>= 4.0.0), libtest-pod-perl, libtext-template-perl
Standards-Version: 3.7.3
Homepage: http://xen-tools.org/software/xen-tools
Vcs-Browser: http://gitorious.org/xen-tools/xen-tools
Vcs-Git: git://gitorious.org/xen-tools/xen-tools.git
Package: xen-tools
Architecture: all
Depends: debootstrap | cdebootstrap,
libconfig-inifiles-perl,
libdata-validate-domain-perl,
libdata-validate-ip-perl,
libdata-validate-uri-perl,
libfile-slurp-perl,
libfile-which-perl,
libterm-ui-perl | perl (<< 5.17.0),
libtext-template-perl,
openssh-client,
perl-modules,
${misc:Depends},
${perl:Depends}
Recommends: libexpect-perl,
rinse (>= 1.9.1-1),
xen-hypervisor-amd64 | xen-hypervisor-i386 | xen-hypervisor-i386-pae,
xen-utils
Suggests: btrfs-tools,
cfengine2,
reiserfsprogs,
xfsprogs
Description: Tools to manage Xen virtual servers
This package contains tools to manage Debian based Xen virtual servers.
Depends: debootstrap, perl-modules, libtext-template-perl, libconfig-inifiles-perl
Recommends: xen-hypervisor-amd64 | xen-hypervisor-i386 | xen-hypervisor-i386-pae, reiserfsprogs, xfsprogs, rinse, xen-shell, libexpect-perl
Description: Tools to manage Debian XEN virtual servers
This package contains tools to manage Debian based XEN virtual servers.
.
Using the scripts you can easily create fully configured Xen guest
domains (DomU) which can be listed, updated, or copied easily.
.
xen-tools currently can install:
.
* Debian 3.1 Sarge (i386 only)
* Debian 4.0 Etch
* Debian 5.0 Lenny
* Debian 6.0 Squeeze
* Debian 7 Wheezy
* Debian 8 Jessie (under development)
* Debian Sid (Unstable)
* Ubuntu 6.06 Dapper Drake (LTS)
* Ubuntu 6.10 Edgy Eft
* Ubuntu 7.04 Feisty Fawn
* Ubuntu 7.10 Gutsy Gibbon
* Ubuntu 8.04 Hardy Heron (LTS)
* Ubuntu 8.10 Intrepid Ibex
* Ubuntu 9.04 Jaunty Jackaplope
* Ubuntu 9.10 Karmic Koala
* Ubuntu 10.04 Lucid Lynx (LTS)
* Ubuntu 10.10 Maverick Meerkat
* Ubuntu 11.04 Natty Narwhal
* Ubuntu 11.10 Oneiric Ocelot
* Ubuntu 12.04 Precise Pangolin (LTS)
* Ubuntu 12.10 Quantal Quetzal
* Ubuntu 13.04 Raring Ringtail
* Ubuntu 13.10 Saucy Salamander (under development)
* CentOS 5
* CentOS 6
domains (domU) which can be listed, updated, or copied easily.

9
debian/copyright vendored
View File

@@ -3,11 +3,7 @@ Tue, 20 Dec 2005 02:21:05 +0200.
It was downloaded from http://xen-tools.org/software/xen-tools/
Copyright 2005-2009: Steve Kemp <steve@steve.org.uk>
Copyright 2010-2013: The Xen-Tools Development Team, currently consisting of:
Axel Beckert <abe@deuxchevaux.org>,
Dmitry Nedospasov <dmitry@nedos.net>, and
Stéphane Jourdois <sjourdois@gmail.com>
Copyright Holder: Steve Kemp <steve@steve.org.uk>
License:
@@ -23,5 +19,6 @@ Perl is distributed under licenses:
b) the "Artistic License" which comes with Perl.
On Debian GNU/Linux systems, the complete text of the GNU General
Public License can be found in /usr/share/common-licenses/GPL-1' and
Public License can be found in /usr/share/common-licenses/GPL' and
the Artistic Licence in /usr/share/common-licenses/Artistic'.

2
debian/dirs vendored
View File

@@ -1,4 +1,4 @@
/etc/xen-tools
/etc/xen-tools/role.d
/etc/xen-tools/skel
/usr/share/xen-tools
/usr/lib/xen-tools

10
debian/docs vendored
View File

@@ -1,7 +1,5 @@
AUTHORS
README.markdown
SUPPORT.markdown
BUGS.markdown
TODO.markdown
KNOWN_BUGS.markdown
NEWS.markdown
README
SUPPORT
BUGS
TODO

1
debian/examples vendored
View File

@@ -1 +0,0 @@
examples/*

View File

@@ -53,7 +53,7 @@ cat <<EOF
Press enter to continue, or Ctrl-c to abort.
EOF
read __dummy
read

0
examples/update-modules → debian/examples/update-modules vendored Executable file → Normal file
View File

3
debian/gbp.conf vendored
View File

@@ -1,3 +0,0 @@
[DEFAULT]
upstream-tag=release-%(version)s
debian-tag=debian-%(version)s

11
debian/preinst vendored Executable file → Normal file
View File

@@ -23,16 +23,5 @@ if [ -d "/usr/lib/xen-tools/ubuntu.d" ]; then
rm -r /usr/lib/xen-tools/ubuntu.d
fi
#
# 4.1 -> 4.2
#
if [ -L "/usr/lib/xen-tools/intrepid.d" ]; then
rm /usr/lib/xen-tools/intrepid.d
fi
if [ -L "/usr/lib/xen-tools/karmic.d" ]; then
rm /usr/lib/xen-tools/karmic.d
fi
#DEBHELPER#
exit 0

53
debian/rules vendored
View File

@@ -2,7 +2,54 @@
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
%:
dh $@
override_dh_auto_build:
configure: configure-stamp
configure-stamp:
dh_testdir
touch configure-stamp
build: build-stamp
build-stamp: configure-stamp
dh_testdir
touch build-stamp
clean:
dh_testdir
dh_testroot
make clean
rm -f build-stamp configure-stamp
dh_clean
install: build
dh_testdir
dh_testroot
dh_clean -k
make manpages
make install prefix=`pwd`/debian/xen-tools
dh_installdirs
# Build architecture-independent files here.
binary-indep: build install
# We have nothing to do by default.
# Build architecture-dependent files here.
binary-indep: build install
dh_testdir
dh_testroot
dh_install
dh_installexamples debian/examples/setup-kernel-initrd debian/examples/update-modules
dh_installchangelogs ChangeLog
dh_installdocs
dh_compress
dh_fixperms
dh_installdeb
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure

View File

@@ -1 +0,0 @@
3.0 (quilt)

1
debian/triggers vendored
View File

@@ -1 +0,0 @@
activate update-initramfs

View File

@@ -52,7 +52,7 @@
# LVM volume group here instead
#
##
# lvm = vg0
# lvm = skx-vg
#
@@ -107,13 +107,13 @@ install-method = debootstrap
# (This allows you to install from a .tar.bz file, rather than a plain
# tar file, use cdebootstrap, etc.)
#
# install-method = copy:
# install-method=copy:
# copy-cmd = /bin/cp -a $src/* $dest
#
# install-method = debootstrap:
# debootstrap-cmd = /usr/sbin/debootstrap
# install-method=debootstrap:
# debootstrap-cmd=/usr/sbin/debootstrap
#
# install-method = tar:
# install-method=tar:
# tar-cmd = /bin/tar --numeric-owner -xvf $src
#
#
@@ -125,20 +125,29 @@ install-method = debootstrap
# Disk and Sizing options.
##
#
size = 4G # Root disk, suffix (G, M, k) required
memory = 128M # Suffix (G, M, k) required
#maxmem = 256M # Suffix (G, M, k) optional
swap = 128M # Suffix (G, M, k) required
# noswap = 1 # Don't use swap at all for new systems.
fs = ext3 # Default file system for any disk
dist = `xt-guess-suite-and-mirror --suite`
# Default distribution is determined by Dom0's distribution
image = sparse # Specify sparse vs. full disk images (file based images only)
size = 4Gb # Disk image size.
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.
image = sparse # Specify sparse vs. full disk images.
#
# See the README for currently supported and tested distributions. You can
# either find it in the root directory of the unpacked source or, on Debian
# and Ubuntu based systems, in /usr/share/doc/xen-tools/README.gz
# Currently supported and tested distributions include:
#
# via Debootstrap:
#
# Debian:
# sid, sarge, etch, lenny.
#
# Ubuntu:
# edgy, feisty, dapper.
#
# via Rinse:
# centos-4, centos-5.
# fedora-core-4, fedora-core-5, fedora-core-6, fedora-core-7
#
#
@@ -151,30 +160,14 @@ image = sparse # Specify sparse vs. full disk images (file based images only)
# Uncomment and adjust these network settings if you wish to give your
# new instances static IP addresses.
#
# gateway = 192.168.1.1
# netmask = 255.255.255.0
# broadcast = 192.168.1.255
# gateway = 192.168.1.1
# netmask = 255.255.255.0
# broadcast = 192.168.1.255
#
# Uncomment this if you wish the images to use DHCP
#
# dhcp = 1
#
# Uncomment and adjust this setting if you wish to give your new
# instances a specific nameserver.
#
# By default, nameserver is not set, and Dom0's /etc/resolv.conf will
# be copied to guest.
#
# nameserver = 192.168.1.1
#
#
# Setup bridge name for host vif. Usefull if you use bridged networking
# for guests.
#
# bridge = xendmz
#
##
# Misc options
@@ -188,41 +181,10 @@ image = sparse # Specify sparse vs. full disk images (file based images only)
#
#
# The default cachedir is, /var/cache/apt/archives/, however if it
# does not exist it will default to /var/cache/xen-tools/archives/
# Uncomment the line below to set it to something else.
#
# cachedir = /var/cache/xen-tools/archives/
#
#
# Uncomment the following line if you wish not to generate a new root
# password for the new guest.
#
# genpass = 0
#
#
# You can also change the password length by uncommenting and
# changing the line below
#
# genpass_len = 8
#
#
# You can yet change the hashing method to encrypt the generated
# password by changing the line below.
# Valid values : md5, sha256 and sha512.
#
# hash_method = sha256
#
#
# Uncomment the following line if you wish to interactively setup a
# new root password for images.
# Uncomment the following line if you wish to interactively setup
# a new root password for images.
#
# passwd = 1
#
#
# If you'd like all accounts on your host system which are not present
@@ -234,15 +196,8 @@ image = sparse # Specify sparse vs. full disk images (file based images only)
#
# Default kernel and ramdisk to use for the virtual servers
#
kernel = /boot/vmlinuz-`uname -r`
initrd = /boot/initrd.img-`uname -r`
#
# Uncomment the following line if you wish to use pygrub by default
# for all distributions.
#
# pygrub = 1
#
kernel = /boot/vmlinuz-`uname -r`
initrd = /boot/initrd.img-`uname -r`
#
# The architecture to use when using debootstrap, rinse, or rpmstrap.
@@ -250,13 +205,13 @@ initrd = /boot/initrd.img-`uname -r`
# This is most useful on 64 bit host machines, for other systems it
# doesn't need to be used.
#
# arch = [i386|amd64]
# arch=[i386|amd64]
#
#
# The default mirror for debootstrap to install Debian-derived distributions
#
mirror = `xt-guess-suite-and-mirror --mirror`
mirror = http://ftp.us.debian.org/debian/
#
# A mirror suitable for use when installing the Dapper release of Ubuntu.
@@ -266,49 +221,24 @@ mirror = `xt-guess-suite-and-mirror --mirror`
#
# If you like you could use per-distribution mirrors, which will
# be more useful if you're working in an environment where you want
# to regularly use multiple distributions. The following are the
# default values used (for Debian the GeoIP feature is used, see
# http://wiki.debian.org/DebianGeoMirror):
# to regularly use multiple distributions:
#
# mirror_sarge = http://archive.debian.org/debian
# mirror_etch = http://archive.debian.org/debian
# mirror_lenny = http://archive.debian.org/debian
# mirror_squeeze = http://http.debian.net/debian
# mirror_wheezy = http://http.debian.net/debian
# mirror_jessie = http://http.debian.net/debian
# mirror_sid = http://http.debian.net/debian
# mirror_dapper = http://old-releases.ubuntu.com/ubuntu
# mirror_edgy = http://old-releases.ubuntu.com/ubuntu
# mirror_feisty = http://old-releases.ubuntu.com/ubuntu
# mirror_gutsy = http://old-releases.ubuntu.com/ubuntu
# mirror_hardy = http://old-releases.ubuntu.com/ubuntu
# mirror_intrepid = http://old-releases.ubuntu.com/ubuntu
# mirror_jaunty = http://old-releases.ubuntu.com/ubuntu
# mirror_karmic = http://old-releases.ubuntu.com/ubuntu
# mirror_lucid = http://archive.ubuntu.com/ubuntu
# mirror_maverick = http://old-releases.ubuntu.com/ubuntu
# mirror_natty = http://old-releases.ubuntu.com/ubuntu
# mirror_oneiric = http://archive.ubuntu.com/ubuntu
# mirror_precise = http://archive.ubuntu.com/ubuntu
# mirror_quantal = http://archive.ubuntu.com/ubuntu
# mirror_raring = http://archive.ubuntu.com/ubuntu
# mirror_saucy = http://archive.ubuntu.com/ubuntu
# mirror_trusty = http://archive.ubuntu.com/ubuntu
# mirror_sid=http://ftp.us.debian.org/debian
# mirror_sarge=http://ftp.us.debian.org/debian
# mirror_etch=http://ftp.us.debian.org/debian
# mirror_dapper=http://archive.ubuntu.com/ubuntu
# mirror_edgy=http://archive.ubuntu.com/ubuntu
# mirror_feisty=http://archive.ubuntu.com/ubuntu
# mirror_gutsy=http://archive.ubuntu.com/ubuntu
# If this is defined it will be used by debootstrap, and configured as the
# proxy for the guest
#
# apt_proxy =
#
# Filesystem options for the different filesystems we support.
#
ext4_options = noatime,nodiratime,errors=remount-ro
ext3_options = noatime,nodiratime,errors=remount-ro
ext2_options = noatime,nodiratime,errors=remount-ro
xfs_options = defaults
reiserfs_options = defaults
btrfs_options = defaults
ext3_options = noatime,nodiratime,errors=remount-ro
ext2_options = noatime,nodiratime,errors=remount-ro
xfs_options = defaults
reiser_options = defaults
#
# Uncomment if you wish newly created images to boot once they've been
@@ -318,17 +248,17 @@ btrfs_options = defaults
#
# If you're using the lenny or later version of the Xen guest kernel you will
# need to make sure that you use 'hvc0' for the guest serial device,
# and 'xvdX' instead of 'sdX' for disk devices.
# If you're using a newer version of the Xen guest kernel you will
# need to make sure that you use 'xvc0' for the guest serial device,
# and 'xvdX' instead of 'sdX' for serial devices.
#
# You may specify the things to use here:
#
# serial_device = hvc0 #default
# serial_device = tty1
# serial_device = tty1 #default
# serial_device = xvc0
#
# disk_device = xvda #default
# disk_device = sda
# disk_device = sda #default
# disk_device = xvda
#
@@ -344,20 +274,3 @@ btrfs_options = defaults
# output = /etc/xen
# extension = .cfg
#
#
# Here you can control weather your dom0's /etc/hosts file should be
# appended with the new guest, and also if your dom0's /etc/hosts file
# should be copied to the new guest.
#
# Change the following options to 1 to set them
# nohosts - don't touch the dom0's /etc/hosts file
# copyhosts - copy the dom0's /etc/hosts to the guest
#
# by default new guests ARE added to the dom0's /etc/hosts file
# nohosts = 0 # default
#
# by default the dom0's /etc/hosts IS NOT copied
# copyhosts = 0 # default
#

View File

@@ -17,11 +17,6 @@
}
}
memory = '{$memory}'
{ if ( $maxmem )
{
$OUT .= "maxmem = '$maxmem'\n";
}
}
# Name

View File

@@ -6,91 +6,35 @@
#
# Kernel + memory size
#
{ if ( ( $kernel ) && ( !defined($pygrub)) )
{ if ( $kernel )
{
$OUT .= "kernel = '$kernel'\n";
$OUT .= "extra = 'elevator=noop'";
$OUT.= "kernel = '$kernel'";
}
}
{ if ( ( $initrd ) && ( !defined($pygrub)) )
{ if ( $initrd )
{
$OUT.= "ramdisk = '$initrd'";
}
}
{
if ( $pygrub )
{
my $pygrub_bin = '';
foreach my $pygrub_path (reverse glob('/usr/lib/xen-*/bin/pygrub
/usr/lib/xen-default/bin/pygrub
/usr/*bin/pygrub')) {
if (-x $pygrub_path) {
$pygrub_bin = $pygrub_path;
last;
}
}
die "pygrub not found" unless $pygrub_bin;
$OUT .= "bootloader = '$pygrub_bin'\n";
}
}
vcpus = '{$vcpus}'
memory = '{$memory}'
{ if ( $maxmem )
{
$OUT .= "maxmem = '$maxmem'\n";
}
}
#
# Disk device(s).
#
{
if ( !defined($image_vbd ) )
{
for ( my $i = 0; $i <= $#PARTITIONS; $i++ )
{
for ( my $i = $#PARTITIONS; $i >= 0 ; $i-- )
{
if ( $PARTITIONS[$i]{'mountpoint'} eq '/' )
{
$OUT .= "root = '/dev/$device" . ($i + 1) . " ro'\n";
}
}
$OUT .= "disk = [\n";
for ( my $i = $#PARTITIONS; $i >= 0 ; $i-- )
{
if ( $PARTITIONS[$i]{'mountpoint'} eq '/' )
{
$OUT .= " '$PARTITIONS[$i]{'imagetype'}$PARTITIONS[$i]{'image'},$device" . ( $i + 1 ) .",w',\n";
}
}
for ( my $i = $#PARTITIONS; $i >= 0 ; $i-- )
{
if ( $PARTITIONS[$i]{'mountpoint'} ne '/' )
{
$OUT .= " '$PARTITIONS[$i]{'imagetype'}$PARTITIONS[$i]{'image'},$device" . ( $i + 1 ) .",w',\n";
}
}
$OUT .= " ]\n";
}
}
#
# Physical volumes
#
{
if ( $image_vbd )
{
$OUT .= "root = '/dev/$device" . "2 ro'\n";
$OUT .= "disk = [\n";
$OUT .= " '$image_vbd," . $device . "2,w',\n";
if ( $swap_vbd )
{
$OUT .= " '$swap_vbd," . $device . "1,w',\n";
}
$OUT .= " ]\n";
}
$OUT .= "disk = [\n";
for ( my $i = 0; $i <= $#PARTITIONS; $i++ )
{
$OUT .= " '$PARTITIONS[$i]{'imagetype'}$PARTITIONS[$i]{'image'},$device" . ( $i + 1 ) .",w',\n";
}
$OUT .= " ]\n";
}
#
@@ -108,26 +52,12 @@ name = '{$hostname}'
# Setup the mac address, if present.
my $m = '';
if ( $mac )
{
{
$m = "mac=$mac"
}
my $br = '';
if ( $bridge )
{
if ( $mac )
{
$br = ",bridge=$bridge"
}
else
{
$br = "bridge=$bridge"
}
}
$OUT .= "vif = [ '";
$OUT .= "$m";
$OUT .= "$br";
$OUT .= "' ]";
}
$OUT .= "vif = [ '$m' ]";
}
else
{
#
@@ -135,27 +65,12 @@ name = '{$hostname}'
#
my $m = '';
if ( $mac )
{
{
$m = ",mac=$mac"
}
my $vn = '';
if ( $vifname )
{
$vn = ",vifname=$vifname";
}
my $br = '';
if ( $bridge )
{
$br = ",bridge=$bridge"
}
$OUT .= "vif = [ 'ip=$ips";
$OUT .= "$m";
$OUT .= "$vn";
$OUT .= "$br";
$OUT .= "' ]";
$OUT .= "vif = [ 'ip=$ip1";
$OUT .= "$m' ]";
}
}

View File

@@ -19,7 +19,7 @@ hooks/
* The installation will have a running installation of OpenSSH
The subdirectories in this hooks/ directory will be installed
to the directory /usr/share/xen-tools/
to the directory /usr/lib/xen-tools/
Steve
--

View File

@@ -1 +0,0 @@
../common/10-disable-tls

49
hooks/centos-4/10-disable-tls Executable file
View File

@@ -0,0 +1,49 @@
#!/bin/sh
#
# This script disables TLS on the new image.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Don't touch TLS on 64 bit platforms.
#
if [ "`uname -m`" = "x86_64" ]; then
logMessage "Ignoring TLS since we're a 64 bit host."
exit
fi
#
# Disable TLS and create an empty directory in its place
#
mv ${prefix}/lib/tls ${prefix}/lib/tls.disabled
mkdir ${prefix}/lib/tls
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/15-disable-hwclock

View File

@@ -1 +0,0 @@
../common/20-setup-yum

51
hooks/centos-4/20-setup-yum Executable file
View File

@@ -0,0 +1,51 @@
#!/bin/sh
#
# This script sets up the Yum for CentOS4.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# DNS is probably required to run "yum update".
#
cp /etc/resolv.conf ${prefix}/etc
#
# Update yum
#
if [ ! -d ${prefix}/proc ]; then
mkdir -p ${prefix}/proc
fi
mount -o bind /proc ${prefix}/proc
chroot ${prefix} /usr/bin/yum update
umount ${prefix}/proc
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/30-disable-gettys

View File

@@ -0,0 +1,58 @@
#!/bin/sh
#
# This script comments out all virtual terminals which aren't on the
# first console - that must remain so that 'xm console ...' works
# correctly.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Do the transformation.
#
sed -i -e 's/^\([2-6].*:respawn*\)/#\1/' -e 's/^T/#\t/' ${prefix}/etc/inittab
#
# Are we using an alternative serial device?
#
if [ ! -z "${serial_device}" ]; then
serial_device=`basename ${serial_device}`
# Let the user know.
logMessage "Replacing default serial device (tty1) with ${serial_device}"
# replace existing device.
sed -i -e s/tty1/${serial_device}/ ${prefix}/etc/inittab
# make sure that it is allowed to login.
echo $serial_device >> ${prefix}/etc/securetty
fi
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/35-setup-users

181
hooks/centos-4/35-setup-users Executable file
View File

@@ -0,0 +1,181 @@
#!/usr/bin/perl -w
#
# This script attempts to copy all user accounts from the host to
# the guest. It does this by copying all user accounts which are not
# already present.
#
# NOTE: Unless '--accounts' was specified upon the 'xen-create-image'
# command line we don't do this.
#
# Steve
# --
# http://www.steve.org.uk/
use strict;
use Env;
my $prefix = shift;
die "Prefix must be given" unless defined( $prefix );
die "Prefix must be a directory" unless ( -d $prefix );
#
# Exit unless the 'accounts' variable is set.
#
exit unless ( $ENV{'accounts'} );
#
# Make sure we have $prefix/etc
#
die "Prefix is missing /etc : $prefix" unless ( -d $prefix . "/etc" );
#
# Read all accounts from the installed /etc/passwd on the guest.
#
my %present;
if ( -e $prefix . "/etc/passwd" )
{
%present = readAccounts( $prefix . "/etc/passwd" );
}
#
# Now read the accounts on the host.
#
my %host = readAccounts( "/etc/passwd" );
#
# For each account not present on new installation then add it
#
foreach my $account ( sort keys( %host ) )
{
if ( ! $present{ $account } )
{
print "Adding: $account\n";
addAccount( $account );
#
# Find any groups the user is member of on the host
# and add them on the guest system
#
addGroups( $account );
}
}
#
# Read the accounts which are already present on the guest image.
#
sub readAccounts
{
my ( $file ) = ( @_ );
my %found;
open( EXISTING, "<", $file );
foreach my $line ( <EXISTING> )
{
#
# Record the userid + username
#
if ( $line =~ /^([^:]+):([^:]+):([^:]+)/ )
{
my $user = $1;
my $pass = $2;
my $uid = $3;
$found{$user} = 1;
}
}
close( EXISTING );
return( %found );
}
#
# Add the passwd + shadow accounts for the given user.
#
sub addAccount
{
my ( $user ) = ( @_ );
#
# passwd file.
#
open( PASSWD, "<", "/etc/passwd" );
foreach my $line ( <PASSWD> )
{
chomp( $line );
if ( $line =~ /^\Q$user\E:/ )
{
#
# Add the line
#
open( OUTY, ">>", $prefix . "/etc/passwd" );
print OUTY $line . "\n";
close( OUTY );
}
}
close( PASSWD );
#
# shadow file.
#
open( SHADOW, "<", "/etc/shadow" ) or die "Failed to open : $!";
foreach my $line ( <SHADOW> )
{
chomp( $line );
if ( $line =~ /^\Q$user\E:/ )
{
#
# Add the line
#
open( OUTY, ">>", $prefix . "/etc/shadow" );
print OUTY $line . "\n";
close( OUTY );
}
}
close( SHADOW );
}
#
# Find the groups a user is member of on the host, and add them to
# those groups on the new guest.
#
sub addGroups
{
my( $username ) = ( @_ );
#
# Get the groups.
#
my $groups = `groups $username`;
# split off the usernmame.
if ( $groups =~ /^([^:]+):(.*)/ )
{
$groups = $2;
print "User: $username is member of the groups: $groups\n";
}
foreach my $g ( split( / /, $groups ) )
{
# Make sure the group exists.
system( "chroot $prefix /usr/sbin/addgroup $g" );
# add the user to it.
system( "chroot $prefix /usr/sbin/adduser $username $g" );
}
}

View File

@@ -1 +0,0 @@
../common/40-setup-networking-rpm

View File

@@ -0,0 +1,98 @@
#!/bin/sh
#
# This script sets up the networking files for the new image.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Make sure we have an /etc/sysconfig/network-scripts directory.
#
mkdir -p ${prefix}/etc/sysconfig/network-scripts/
#
# Test for static vs. DHCP
#
if [ -z "${dhcp}" ]; then
#
# Setup the initial interface
#
cat <<E_O_STATIC >${prefix}/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=${ip1}
NETMASK=${netmask}
GATEWAY=${gateway}
E_O_STATIC
#
# Now setup any other ones.
#
interface=1
count=2
while [ "${count}" -le "${ip_count}" ]; do
value=\$ip${count}
value=`eval echo $value`
logMessage Adding etho:${interface}
cat <<E_O_STATIC >${prefix}/etc/sysconfig/network-scripts/ifcfg-eth0:${interface}
DEVICE=eth0:${interface}
ONBOOT=yes
BOOTPROTO=static
IPADDR=${value}
NETMASK=${netmask}
E_O_STATIC
count=`expr $count + 1`
interface=`expr $interface + 1`
done
else
cat <<E_O_DHCP >${prefix}/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
E_O_DHCP
fi
#
# Don't forget to setup the default route.
#
cat <<EOF >${prefix}/etc/sysconfig/network
NETWORKING=yes
GATEWAY=${gateway}
HOSTNAME=${hostname}
EOF
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/50-setup-hostname-rpm

118
hooks/centos-4/50-setup-hostname Executable file
View File

@@ -0,0 +1,118 @@
#!/bin/sh
#
# This script places the new systems hostname into a couple of files within
# the new image.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Setup the mailname + hostname files.
#
echo ${hostname} > ${prefix}/etc/hostname
echo ${hostname} > ${prefix}/etc/mailname
#
# Fixup the /etc/hosts file upon the new image for
# machines with static IPs
#
if [ -z "${dhcp}" ]; then
# Non-IPv6 stuff.
grep -v '\(::\|IPv6\)' /etc/hosts > ${prefix}/etc/hosts
# New entry.
echo "${ip1} ${hostname}" >> ${prefix}/etc/hosts
echo " " >> ${prefix}/etc/hosts
# IPv6 stuff.
grep '\(::\|IPv6\)' /etc/hosts >> ${prefix}/etc/hosts
else
#
# Stub /etc/hosts for DHCP clients.
#
cat >> ${prefix}/etc/hosts <<EOF
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
EOF
fi
#
# Allow the host system to know the IP address of our new guest.
#
if [ -z "${dhcp}" ]; then
if ( grep ${hostname} /etc/hosts > /dev/null ) ; then
logMessage Host already has IP address for the host ${hostname}.
else
#
# Short host name.
#
name=`echo ${hostname} | awk -F. '{print $1}'`
logMessage Adding ${hostname} and ${name} to /etc/hosts on the host
echo "${ip1} ${hostname} ${name}" >> /etc/hosts
#
# If we've updated the /etc/hosts file on the host machine
# and there is an installation of dnsmasq installed then
# reload it.
#
# This will let the local LAN clients lookup the new address.
#
if [ -x /usr/sbin/dnsmasq ] ; then
if [ -e /var/run/dnsmasq.pid ]; then
logMessage Allowing DNSMasq to restart.
kill -HUP `cat /var/run/dnsmasq.pid`
fi
fi
fi
fi
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/55-create-dev

53
hooks/centos-4/55-create-dev Executable file
View File

@@ -0,0 +1,53 @@
#!/bin/sh
#
# This script ensures that the new guest images have a nicely
# populated /dev directory.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Early termination if we have a couple of common devices present
# should speed up installs which use --copy/--tar
#
if ( test `ls -1 ${prefix}/dev | wc -l` -gt 10 ); then
logMessage "Terminating because there appear to be files in /dev already"
exit
fi
#
# Make the device nodes.
#
chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV console'
chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV null'
chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV zero'
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -0,0 +1,58 @@
#!/bin/sh
#
# Copy files from a 'skel' directory, if present, into the
# new images
#
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Copy "required" files from our host.
#
# NONE DONE
#
# If the host has sudo then copy the configuration file, and install
# the package
#
if [ -e /etc/sudoers ]; then
logMessage Installing SUDO too.
#
# Copy file and fixup permissions.
#
cp /etc/sudoers ${prefix}/etc
chown root:root ${prefix}/etc/sudoers
chmod 440 ${prefix}/etc/sudoers
#
# Install sudo
#
installCentOS4Package ${prefix} sudo
fi
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/65-copy-user-files

View File

@@ -0,0 +1,49 @@
#!/bin/sh
#
# Copy files from a 'skel' directory, if present, into the
# new images
#
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Copy everything from the skel directory into the new instance
# if that directory exists.
#
if [ -d /etc/xen-tools/skel ]; then
logMessage Copying files from /etc/xen-tools/skel
(cd /etc/xen-tools/skel; tar -cf - . ) | (cd ${prefix}/; tar -xpf -)
logMessage Finished
else
logMessage skel directory, /etc/xen-tools/skell, not present ignoring.
fi
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/70-install-ssh-rpm

42
hooks/centos-4/70-install-ssh Executable file
View File

@@ -0,0 +1,42 @@
#!/bin/sh
#
# This script installs OpenSSH upon the new system.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Install the OpenSSH server.
#
if [ ! -d ${prefix}/proc ]; then
mkdir -p ${prefix}/proc
fi
mount -o bind /proc ${prefix}/proc
chroot ${prefix} /usr/bin/yum -y install openssh-server passwd
umount ${prefix}/proc
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/75-fixup-securetty

View File

@@ -0,0 +1,62 @@
#!/bin/sh
#
# This script ensures /etc/securetty upon the new guests has the new
# Xen console devices in it
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# If the file doesn't exist exit early.
#
if [ ! -e ${prefix}/etc/securetty ]; then
logMesage /etc/securetty not found.
exit
fi
#
# Do both the devices.
#
for i in xvc0 hvc0 ; do
#
# Only append if not presnt.
#
if ( grep $i ${prefix}/etc/securetty > /dev/null ) ; then
logMessage Host already has $i entry
else
echo $i >> ${prefix}/etc/securetty
fi
done
#
# Log our finish
#
logMessage Script $0 finished.

View File

@@ -1 +0,0 @@
../common/80-install-modules-rpm

View File

@@ -0,0 +1,41 @@
#!/bin/sh
#
# Install modules from the host system into the new image.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Copy the modules from the host to the new system - we should only
# really copy the *correct* modules, but we don't know what they are.
#
mkdir -p ${prefix}/lib/modules
cp -au /lib/modules/*/ ${prefix}/lib/modules
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/90-make-fstab

111
hooks/centos-4/90-make-fstab Executable file
View File

@@ -0,0 +1,111 @@
#!/bin/sh
#
# This script is responsible for setting up /etc/fstab upon the
# new instance.
#
# This should be a simple job, but it is complicated by some of the
# differences between filesystems - some root filesystems will require
# the installation of new packages, and we have to handle that here.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
logMessage Filesystem options are ${options}
#
# Find the root device.
#
# 1. default to sda.
#
# 2. If --ide is specified use hda.
#
# 3. Otherwise use a named $disk_device
#
device=sda
if [ "${ide}" ]; then
device=hda
else
if [ ! -z "${disk_device}" ]; then
device=`basename $disk_device`
fi
fi
logMessage "Root device is /dev/$device"
#
# Now we have the options we can create the fstab.
#
has_xfs=0
has_reiserfs=0
cat <<E_O_FSTAB > ${prefix}/etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
E_O_FSTAB
for part in `seq 1 ${NUMPARTITIONS}`; do
eval "PARTITION=\"\${PARTITION${part}}\""
OLDIFS="${IFS}"
IFS=:
x=0
for partdata in ${PARTITION}; do
eval "partdata${x}=\"${partdata}\""
x=$(( $x+1 ))
done
IFS="${OLDIFS}"
case "${partdata2}" in
xfs)
has_xfs=1
;;
reiserfs)
has_reiserfs=1
;;
esac
if [ "${partdata2}" = "swap" ]; then
echo "/dev/${device}${part} none swap sw 0 0" >> ${prefix}/etc/fstab
else
echo "/dev/${device}${part} ${partdata3} ${partdata2} ${partdata4} 0 1" >> ${prefix}/etc/fstab
fi
done
#
# Finally we can install any required packages for the given root
# filesystem
#
#if [ $has_xfs -eq 1 ]; then
# installDebianPackage ${prefix} xfsprogs
#fi
#if [ $has_reiserfs -eq 1 ]; then
# installDebianPackage ${prefix} reiserfsprogs
#fi
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/99-clean-image-rpm

49
hooks/centos-4/99-clean-image Executable file
View File

@@ -0,0 +1,49 @@
#!/bin/sh
#
# This script cleans the yum database on the new system.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Clean up RPM files.
#
logMessage Cleaning .rpm* files.
find ${prefix}/ -name '*.rpmorig' -exec rm -f \{\} \;
find ${prefix}/ -name '*.rpmnew' -exec rm -f \{\} \;
#
# Clean yum
#
logMessage Cleaning Yum Repository
if [ ! -d ${prefix}/proc ]; then
mkdir -p ${prefix}/proc
fi
mount -o bind /proc ${prefix}/proc
chroot ${prefix} /usr/bin/yum clean all
umount ${prefix}/proc
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/10-disable-tls

49
hooks/centos-5/10-disable-tls Executable file
View File

@@ -0,0 +1,49 @@
#!/bin/sh
#
# This script disables TLS on the new image.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Don't touch TLS on 64 bit platforms.
#
if [ "`uname -m`" = "x86_64" ]; then
logMessage "Ignoring TLS since we're a 64 bit host."
exit
fi
#
# Disable TLS and create an empty directory in its place
#
mv ${prefix}/lib/tls ${prefix}/lib/tls.disabled
mkdir ${prefix}/lib/tls
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/15-disable-hwclock

View File

@@ -1 +0,0 @@
../common/20-setup-yum

53
hooks/centos-5/20-setup-yum Executable file
View File

@@ -0,0 +1,53 @@
#!/bin/sh
#
# This script sets up the Yum for CentOS4.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# DNS is probably required to run "yum update".
#
cp /etc/resolv.conf ${prefix}/etc
#
# Update yum
#
if [ ! -d ${prefix}/proc ]; then
mkdir -p ${prefix}/proc
fi
mount -o bind /proc ${prefix}/proc
chroot ${prefix} /usr/bin/yum update
umount ${prefix}/proc
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1,76 +0,0 @@
#!/bin/sh
#
# This script sets up the kernel and fstab for CentOS 5.
#
prefix=$1
#
# Source our common functions
#
if [ -e /usr/share/xen-tools/common.sh ]; then
. /usr/share/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
# Make the console work
sed -i "/Cancelled/ {G;s/$/co:2345:respawn:\/sbin\/mingetty console/;}" ${prefix}/etc/inittab
sed -i "s/^1:2345/#1:2345/" ${prefix}/etc/inittab
# MAKEDEV is needed at this point
chroot ${prefix} ln -s /sbin/MAKEDEV /dev/MAKEDEV
chroot ${prefix} /sbin/MAKEDEV sda sdb sdc sdd
# Create fstab
logMessage Create /etc/fstab
cat > ${prefix}/etc/fstab << EOF
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
none /dev/pts devpts mode=0620 0 0
EOF
for i in `seq 1 $NUMPARTITIONS`; do
echo -n "/dev/xvde$i " >> ${prefix}/etc/fstab
eval part=\$PARTITION$i
if [ -n "`echo $part | grep swap`" ]; then
echo "none swap ws 0 0" >> ${prefix}/etc/fstab
else
echo $part | awk -F: '{print $4,$3,$5,0,1}' >> ${prefix}/etc/fstab
fi
done
# Install the kernel, grub and perl
chroot ${prefix} yum clean expire-cache
chroot ${prefix} yum -y install kernel-xen grub.x86_64 perl.x86_64
KERNELVERSION=`ls ${prefix}/boot/vmlinuz-* | sed "s#$prefix/boot/vmlinuz-##"`
logMessage "Kernel $KERNELVERSION found"
# Create grub's menu.list
logMessage "Creating /boot/grub/menu.lst"
mkdir -p ${prefix}/boot/grub
cat > ${prefix}/boot/grub/menu.lst << EOF
# WARNING : Don't forget to update this when you upgrade kernel !
# You can also exclude kernel-xen from updates by putting
# exclude=kernel-xen in in [main] in yum.conf
default=0
timeout=5
title CentOS ($KERNELVERSION)
kernel /boot/vmlinuz-$KERNELVERSION xen_pv_hvm=enable elevator=noop
initrd /boot/initrd-$KERNELVERSION.img
EOF
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/30-disable-gettys

View File

@@ -0,0 +1,58 @@
#!/bin/sh
#
# This script comments out all virtual terminals which aren't on the
# first console - that must remain so that 'xm console ...' works
# correctly.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Do the transformation.
#
sed -i -e 's/^\([2-6].*:respawn*\)/#\1/' -e 's/^T/#\t/' ${prefix}/etc/inittab
#
# Are we using an alternative serial device?
#
if [ ! -z "${serial_device}" ]; then
serial_device=`basename ${serial_device}`
# Let the user know.
logMessage "Replacing default serial device (tty1) with ${serial_device}"
# replace existing device.
sed -i -e s/tty1/${serial_device}/ ${prefix}/etc/inittab
# make sure that it is allowed to login.
echo $serial_device >> ${prefix}/etc/securetty
fi
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/35-setup-users

181
hooks/centos-5/35-setup-users Executable file
View File

@@ -0,0 +1,181 @@
#!/usr/bin/perl -w
#
# This script attempts to copy all user accounts from the host to
# the guest. It does this by copying all user accounts which are not
# already present.
#
# NOTE: Unless '--accounts' was specified upon the 'xen-create-image'
# command line we don't do this.
#
# Steve
# --
# http://www.steve.org.uk/
use strict;
use Env;
my $prefix = shift;
die "Prefix must be given" unless defined( $prefix );
die "Prefix must be a directory" unless ( -d $prefix );
#
# Exit unless the 'accounts' variable is set.
#
exit unless ( $ENV{'accounts'} );
#
# Make sure we have $prefix/etc
#
die "Prefix is missing /etc : $prefix" unless ( -d $prefix . "/etc" );
#
# Read all accounts from the installed /etc/passwd on the guest.
#
my %present;
if ( -e $prefix . "/etc/passwd" )
{
%present = readAccounts( $prefix . "/etc/passwd" );
}
#
# Now read the accounts on the host.
#
my %host = readAccounts( "/etc/passwd" );
#
# For each account not present on new installation then add it
#
foreach my $account ( sort keys( %host ) )
{
if ( ! $present{ $account } )
{
print "Adding: $account\n";
addAccount( $account );
#
# Find any groups the user is member of on the host
# and add them on the guest system
#
addGroups( $account );
}
}
#
# Read the accounts which are already present on the guest image.
#
sub readAccounts
{
my ( $file ) = ( @_ );
my %found;
open( EXISTING, "<", $file );
foreach my $line ( <EXISTING> )
{
#
# Record the userid + username
#
if ( $line =~ /^([^:]+):([^:]+):([^:]+)/ )
{
my $user = $1;
my $pass = $2;
my $uid = $3;
$found{$user} = 1;
}
}
close( EXISTING );
return( %found );
}
#
# Add the passwd + shadow accounts for the given user.
#
sub addAccount
{
my ( $user ) = ( @_ );
#
# passwd file.
#
open( PASSWD, "<", "/etc/passwd" );
foreach my $line ( <PASSWD> )
{
chomp( $line );
if ( $line =~ /^\Q$user\E:/ )
{
#
# Add the line
#
open( OUTY, ">>", $prefix . "/etc/passwd" );
print OUTY $line . "\n";
close( OUTY );
}
}
close( PASSWD );
#
# shadow file.
#
open( SHADOW, "<", "/etc/shadow" ) or die "Failed to open : $!";
foreach my $line ( <SHADOW> )
{
chomp( $line );
if ( $line =~ /^\Q$user\E:/ )
{
#
# Add the line
#
open( OUTY, ">>", $prefix . "/etc/shadow" );
print OUTY $line . "\n";
close( OUTY );
}
}
close( SHADOW );
}
#
# Find the groups a user is member of on the host, and add them to
# those groups on the new guest.
#
sub addGroups
{
my( $username ) = ( @_ );
#
# Get the groups.
#
my $groups = `groups $username`;
# split off the usernmame.
if ( $groups =~ /^([^:]+):(.*)/ )
{
$groups = $2;
print "User: $username is member of the groups: $groups\n";
}
foreach my $g ( split( / /, $groups ) )
{
# Make sure the group exists.
system( "chroot $prefix /usr/sbin/addgroup $g" );
# add the user to it.
system( "chroot $prefix /usr/sbin/adduser $username $g" );
}
}

View File

@@ -1 +0,0 @@
../common/40-setup-networking-rpm

View File

@@ -0,0 +1,98 @@
#!/bin/sh
#
# This script sets up the networking files for the new image.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Make sure we have an /etc/sysconfig/network-scripts directory.
#
mkdir -p ${prefix}/etc/sysconfig/network-scripts/
#
# Test for static vs. DHCP
#
if [ -z "${dhcp}" ]; then
#
# Setup the initial interface
#
cat <<E_O_STATIC >${prefix}/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=${ip1}
NETMASK=${netmask}
GATEWAY=${gateway}
E_O_STATIC
#
# Now setup any other ones.
#
interface=1
count=2
while [ "${count}" -le "${ip_count}" ]; do
value=\$ip${count}
value=`eval echo $value`
logMessage Adding etho:${interface}
cat <<E_O_STATIC >${prefix}/etc/sysconfig/network-scripts/ifcfg-eth0:${interface}
DEVICE=eth0:${interface}
ONBOOT=yes
BOOTPROTO=static
IPADDR=${value}
NETMASK=${netmask}
E_O_STATIC
count=`expr $count + 1`
interface=`expr $interface + 1`
done
else
cat <<E_O_DHCP >${prefix}/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
E_O_DHCP
fi
#
# Don't forget to setup the default route.
#
cat <<EOF >${prefix}/etc/sysconfig/network
NETWORKING=yes
GATEWAY=${gateway}
HOSTNAME=${hostname}
EOF
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/50-setup-hostname-rpm

118
hooks/centos-5/50-setup-hostname Executable file
View File

@@ -0,0 +1,118 @@
#!/bin/sh
#
# This script places the new systems hostname into a couple of files within
# the new image.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Setup the mailname + hostname files.
#
echo ${hostname} > ${prefix}/etc/hostname
echo ${hostname} > ${prefix}/etc/mailname
#
# Fixup the /etc/hosts file upon the new image for
# machines with static IPs
#
if [ -z "${dhcp}" ]; then
# Non-IPv6 stuff.
grep -v '\(::\|IPv6\)' /etc/hosts > ${prefix}/etc/hosts
# New entry.
echo "${ip1} ${hostname}" >> ${prefix}/etc/hosts
echo " " >> ${prefix}/etc/hosts
# IPv6 stuff.
grep '\(::\|IPv6\)' /etc/hosts >> ${prefix}/etc/hosts
else
#
# Stub /etc/hosts for DHCP clients.
#
cat >> ${prefix}/etc/hosts <<EOF
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
EOF
fi
#
# Allow the host system to know the IP address of our new guest.
#
if [ -z "${dhcp}" ]; then
if ( grep ${hostname} /etc/hosts > /dev/null ) ; then
logMessage Host already has IP address for the host ${hostname}.
else
#
# Short host name.
#
name=`echo ${hostname} | awk -F. '{print $1}'`
logMessage Adding ${hostname} and ${name} to /etc/hosts on the host
echo "${ip1} ${hostname} ${name}" >> /etc/hosts
#
# If we've updated the /etc/hosts file on the host machine
# and there is an installation of dnsmasq installed then
# reload it.
#
# This will let the local LAN clients lookup the new address.
#
if [ -x /usr/sbin/dnsmasq ] ; then
if [ -e /var/run/dnsmasq.pid ]; then
logMessage Allowing DNSMasq to restart.
kill -HUP `cat /var/run/dnsmasq.pid`
fi
fi
fi
fi
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/55-create-dev

53
hooks/centos-5/55-create-dev Executable file
View File

@@ -0,0 +1,53 @@
#!/bin/sh
#
# This script ensures that the new guest images have a nicely
# populated /dev directory.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Early termination if we have a couple of common devices present
# should speed up installs which use --copy/--tar
#
if ( test `ls -1 ${prefix}/dev | wc -l` -gt 10 ); then
logMessage "Terminating because there appear to be files in /dev already"
exit
fi
#
# Make the device nodes.
#
chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV console'
chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV null'
chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV zero'
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -0,0 +1,58 @@
#!/bin/sh
#
# Copy files from a 'skel' directory, if present, into the
# new images
#
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Copy "required" files from our host.
#
# NONE DONE
#
# If the host has sudo then copy the configuration file, and install
# the package
#
if [ -e /etc/sudoers ]; then
logMessage Installing SUDO too.
#
# Copy file and fixup permissions.
#
cp /etc/sudoers ${prefix}/etc
chown root:root ${prefix}/etc/sudoers
chmod 440 ${prefix}/etc/sudoers
#
# Install sudo
#
installCentOS4Package ${prefix} sudo
fi
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/65-copy-user-files

View File

@@ -0,0 +1,49 @@
#!/bin/sh
#
# Copy files from a 'skel' directory, if present, into the
# new images
#
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Copy everything from the skel directory into the new instance
# if that directory exists.
#
if [ -d /etc/xen-tools/skel ]; then
logMessage Copying files from /etc/xen-tools/skel
(cd /etc/xen-tools/skel; tar -cf - . ) | (cd ${prefix}/; tar -xpf -)
logMessage Finished
else
logMessage skel directory, /etc/xen-tools/skell, not present ignoring.
fi
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/70-install-ssh-rpm

42
hooks/centos-5/70-install-ssh Executable file
View File

@@ -0,0 +1,42 @@
#!/bin/sh
#
# This script installs OpenSSH upon the new system.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Install the OpenSSH server.
#
if [ ! -d ${prefix}/proc ]; then
mkdir -p ${prefix}/proc
fi
mount -o bind /proc ${prefix}/proc
chroot ${prefix} /usr/bin/yum -y install openssh-server passwd
umount ${prefix}/proc
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/75-fixup-securetty

View File

@@ -0,0 +1,62 @@
#!/bin/sh
#
# This script ensures /etc/securetty upon the new guests has the new
# Xen console devices in it
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# If the file doesn't exist exit early.
#
if [ ! -e ${prefix}/etc/securetty ]; then
logMesage /etc/securetty not found.
exit
fi
#
# Do both the devices.
#
for i in xvc0 hvc0 ; do
#
# Only append if not presnt.
#
if ( grep $i ${prefix}/etc/securetty > /dev/null ) ; then
logMessage Host already has $i entry
else
echo $i >> ${prefix}/etc/securetty
fi
done
#
# Log our finish
#
logMessage Script $0 finished.

View File

@@ -1 +0,0 @@
../common/80-install-modules-rpm

View File

@@ -0,0 +1,41 @@
#!/bin/sh
#
# Install modules from the host system into the new image.
#
# Steve
# --
# http://www.steve.org.uk/
prefix=$1
#
# Source our common functions
#
if [ -e /usr/lib/xen-tools/common.sh ]; then
. /usr/lib/xen-tools/common.sh
else
. ./hooks/common.sh
fi
#
# Log our start
#
logMessage Script $0 starting
#
# Copy the modules from the host to the new system - we should only
# really copy the *correct* modules, but we don't know what they are.
#
mkdir -p ${prefix}/lib/modules
cp -au /lib/modules/*/ ${prefix}/lib/modules
#
# Log our finish
#
logMessage Script $0 finished

View File

@@ -1 +0,0 @@
../common/90-make-fstab

Some files were not shown because too many files have changed in this diff Show More