summaryrefslogtreecommitdiffstats
path: root/clone/virt-sysprep.in
diff options
context:
space:
mode:
Diffstat (limited to 'clone/virt-sysprep.in')
-rw-r--r--clone/virt-sysprep.in408
1 files changed, 0 insertions, 408 deletions
diff --git a/clone/virt-sysprep.in b/clone/virt-sysprep.in
deleted file mode 100644
index d5055327..00000000
--- a/clone/virt-sysprep.in
+++ /dev/null
@@ -1,408 +0,0 @@
-#!/bin/bash -
-# @configure_input@
-# libguestfs virt-sysprep tool
-# Copyright (C) 2011 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-unset CDPATH
-program="virt-sysprep"
-version="@PACKAGE_VERSION@"
-
-# Uncomment this to see every shell command that is executed.
-#set -x
-
-TEMP=`getopt \
- -o a:c:d:vVx \
- --long help,add:,connect:,domain:,enable:,format::,hostname:,list-operations,selinux-relabel,no-selinux-relabel,verbose,version \
- -n $program -- "$@"`
-if [ $? != 0 ]; then
- echo "$program: problem parsing the command line arguments"
- exit 1
-fi
-eval set -- "$TEMP"
-
-# This array accumulates the arguments we pass through to guestmount.
-declare -a params
-i=0
-
-verbose=
-add_params=0
-enable=
-hostname_param=localhost.localdomain
-selinux_relabel=auto
-
-usage ()
-{
- echo "Usage:"
- echo " $program [--options] -d domname"
- echo " $program [--options] -a disk.img [-a disk.img ...]"
- echo
- echo "Read $program(1) man page for more information."
- echo
- echo "NOTE: $program modifies the guest or disk image *in place*."
- exit $1
-}
-
-while true; do
- case "$1" in
- -a|--add)
- params[i++]="-a"
- params[i++]="$2"
- ((add_params++))
- shift 2;;
- -c|--connect)
- params[i++]="-c"
- params[i++]="$2"
- shift 2;;
- -d|--domain)
- params[i++]="-d"
- params[i++]="$2"
- ((add_params++))
- shift 2;;
- --enable)
- if [ -n "$enable" ]; then
- echo "error: --enable option can only be given once"
- exit 1
- fi
- enable="$2"
- shift 2;;
- --format)
- if [ -n "$2" ]; then
- params[i++]="--format=$2"
- else
- params[i++]="--format"
- fi
- shift 2;;
- --help)
- usage 0;;
- --hostname)
- hostname_param="$2"
- shift 2;;
- --list-operations)
- enable=list
- shift;;
- --selinux-relabel)
- selinux_relabel=yes
- shift;;
- --no-selinux-relabel)
- selinux_relabel=no
- shift;;
- -v|--verbose)
- params[i++]="-v"
- verbose=yes
- shift;;
- -V|--version)
- echo "$program $version"
- exit 0;;
- -x)
- # Can't pass the -x option directly to guestmount because
- # that stops guestmount from forking, which means we can't
- # coordinate with guestmount when it has finished
- # initializing. So instead set just the underlying option
- # in libguestfs by exporting LIBGUESTFS_TRACE.
- # Unfortunately (a) this omits FUSE calls, but don't worry
- # about that for now, and more importantly (b) trace
- # messages disappear into never-never land after the fork.
- export LIBGUESTFS_TRACE=1
- shift;;
- --)
- shift
- break;;
- *)
- echo "Internal error!"
- exit 1;;
- esac
-done
-
-# Different sysprep operations that can be enabled. Default is to
-# enable all of these, although some of them are only done on certain
-# guest types (see details below).
-if [ -z "$enable" ]; then
- cron_spool=yes
- dhcp_client_state=yes
- dhcp_server_state=yes
- hostname=yes
- logfiles=yes
- mail_spool=yes
- net_hwaddr=yes
- random_seed=yes
- rhn_systemid=yes
- smolt_uuid=yes
- ssh_hostkeys=yes
- udev_persistent_net=yes
- utmp=yes
- yum_uuid=yes
-elif [ "$enable" = "list" ]; then
- echo "cron-spool"
- echo "dhcp-client-state"
- echo "dhcp-server-state"
- echo "hostname"
- echo "logfiles"
- echo "mail-spool"
- echo "net-hwaddr"
- echo "random-seed"
- echo "rhn-systemid"
- echo "smolt-uuid"
- echo "ssh-hostkeys"
- echo "udev-persistent-net"
- echo "utmp"
- echo "yum-uuid"
- exit 0
-else
- for opt in $(echo "$enable" | sed 's/,/ /g'); do
- case "$opt" in
- cron-spool) cron_spool=yes ;;
- dhcp-client-state) dhcp_client_state=yes ;;
- dhcp-server-state) dhcp_server_state=yes ;;
- hostname) hostname=yes ;;
- logfiles) logfiles=yes ;;
- mail-spool) mail_spool=yes ;;
- net-hwaddr) net_hwaddr=yes ;;
- random-seed) random_seed=yes ;;
- rhn-systemid) rhn_systemid=yes ;;
- smolt-uuid) smolt_uuid=yes ;;
- ssh-hostkeys) ssh_hostkeys=yes ;;
- udev-persistent-net) udev_persistent_net=yes ;;
- utmp) utmp=yes ;;
- yum-uuid) yum_uuid=yes ;;
- *)
- echo "error: unknown --enable feature: $opt"
- exit 1
- esac
- done
-fi
-
-# Make sure there were no extra parameters on the command line.
-if [ $# -gt 0 ]; then
- echo "error: $program: extra parameters on the command line"
- echo
- usage 1
-fi
-
-# Did the user specify at least one -a or -d option?
-if [ $add_params -eq 0 ]; then
- echo "error: $program: you need at least one -a or -d option"
- echo
- usage 1
-fi
-
-# end of command line parsing
-#----------------------------------------------------------------------
-
-set -e
-
-if [ "$verbose" = "yes" ]; then
- echo params: "${params[@]}"
-fi
-
-# Create a temporary directory for general purpose use during operations.
-tmpdir="$(mktemp -d)"
-
-cleanup ()
-{
- if [ -d $tmpdir/mnt ]; then
- fusermount -u $tmpdir/mnt >/dev/null 2>&1 ||:
- fi
- rm -rf $tmpdir ||:
-}
-trap cleanup EXIT ERR
-
-# Run virt-inspector and grab inspection information about this guest.
-virt-inspector "${params[@]}" > $tmpdir/xml
-virt-inspector --xpath \
- "string(/operatingsystems/operatingsystem[position()=1]/name)" \
- < $tmpdir/xml > $tmpdir/type
-virt-inspector --xpath \
- "string(/operatingsystems/operatingsystem[position()=1]/distro)" \
- < $tmpdir/xml > $tmpdir/distro ||:
-virt-inspector --xpath \
- "string(/operatingsystems/operatingsystem[position()=1]/package_format)" \
- < $tmpdir/xml > $tmpdir/package_format ||:
-virt-inspector --xpath \
- "string(/operatingsystems/operatingsystem[position()=1]/package_management)" \
- < $tmpdir/xml > $tmpdir/package_management ||:
-
-type="$(cat $tmpdir/type)"
-distro="$(cat $tmpdir/distro)"
-package_format="$(cat $tmpdir/package_format)"
-package_management="$(cat $tmpdir/package_management)"
-
-# Mount the disk.
-mkdir $tmpdir/mnt
-guestmount --rw -i "${params[@]}" $tmpdir/mnt
-
-mnt="$tmpdir/mnt"
-
-#----------------------------------------------------------------------
-# The sysprep operations.
-
-if [ "$cron_spool" = "yes" ]; then
- rm -rf $mnt/var/spool/cron/*
-fi
-
-if [ "$dhcp_client_state" = "yes" ]; then
- case "$type" in
- linux)
- rm -rf $mnt/var/lib/dhclient/*
- # RHEL 3:
- rm -rf $mnt/var/lib/dhcp/*
- ;;
- esac
-fi
-
-if [ "$dhcp_server_state" = "yes" ]; then
- case "$type" in
- linux)
- rm -rf $mnt/var/lib/dhcpd/*
- ;;
- esac
-fi
-
-if [ "$hostname" = "yes" ]; then
- case "$type/$distro" in
- linux/fedora|linux/rhel)
- echo "HOSTNAME=$hostname_param" > $mnt/etc/sysconfig/network.new
- sed '/^HOSTNAME=/d' < $mnt/etc/sysconfig/network >> $mnt/etc/sysconfig/network.new
- mv -f $mnt/etc/sysconfig/network.new $mnt/etc/sysconfig/network
- created_files=yes
- ;;
- linux/debian|linux/ubuntu)
- echo "$hostname_param" > $mnt/etc/hostname
- created_files=yes
- ;;
- esac
-fi
-
-if [ "$logfiles" = "yes" ]; then
- case "$type" in
- linux)
- rm -rf $mnt/var/log/*.log*
- rm -rf $mnt/var/log/audit/*
- rm -rf $mnt/var/log/btmp*
- rm -rf $mnt/var/log/cron*
- rm -rf $mnt/var/log/dmesg*
- rm -rf $mnt/var/log/lastlog*
- rm -rf $mnt/var/log/maillog*
- rm -rf $mnt/var/log/mail/*
- rm -rf $mnt/var/log/messages*
- rm -rf $mnt/var/log/secure*
- rm -rf $mnt/var/log/spooler*
- rm -rf $mnt/var/log/tallylog*
- rm -rf $mnt/var/log/wtmp*
- ;;
- esac
-fi
-
-if [ "$mail_spool" = "yes" ]; then
- rm -rf $mnt/var/spool/mail/*
- rm -rf $mnt/var/mail/*
-fi
-
-if [ "$net_hwaddr" = "yes" ]; then
- case "$type/$distro" in
- linux/fedora|linux/rhel)
- if [ -d $mnt/etc/sysconfig/network-scripts ]; then
- rm_hwaddr ()
- {
- sed '/^HWADDR=/d' < "$1" > "$1.new"
- mv -f "$1.new" "$1"
- }
- export -f rm_hwaddr
- find $mnt/etc/sysconfig/network-scripts \
- -name 'ifcfg-*' -type f \
- -exec bash -c 'rm_hwaddr "$0"' {} \;
- created_files=yes
- fi
- ;;
- esac
-fi
-
-if [ "$random_seed" = "yes" -a "$type" = "linux" ]; then
- f=
- if [ -f $mnt/var/lib/random-seed ]; then
- # Fedora
- f=$mnt/var/lib/random-seed
- elif [ -f $mnt/var/lib/urandom/random-seed ]; then
- # Debian
- f=$mnt/var/lib/urandom/random-seed
- fi
- if [ -n "$f" ]; then
- dd if=/dev/urandom of="$f" bs=8 count=1 conv=nocreat,notrunc 2>/dev/null
- fi
-fi
-
-if [ "$rhn_systemid" = "yes" -a "$type/$distro" = "linux/rhel" ]; then
- rm -f $mnt/etc/sysconfig/rhn/systemid
-fi
-
-if [ "$smolt_uuid" = "yes" -a "$type" = "linux" ]; then
- rm -f $mnt/etc/sysconfig/hw-uuid
- rm -f $mnt/etc/smolt/uuid
- rm -f $mnt/etc/smolt/hw-uuid
-fi
-
-if [ "$ssh_hostkeys" = "yes" -a "$type" != "windows" ]; then
- rm -rf $mnt/etc/ssh/*_host_*
-fi
-
-if [ "$udev_persistent_net" = "yes" -a "$type" = "linux" ]; then
- rm -f $mnt/etc/udev/rules.d/70-persistent-net.rules
-fi
-
-if [ "$utmp" = "yes" -a "$type" != "windows" ]; then
- rm -f $mnt/var/run/utmp
-fi
-
-if [ "$yum_uuid" = "yes" -a "$package_management" = "yum" ]; then
- rm -f $mnt/var/lib/yum/uuid
-fi
-
-#----------------------------------------------------------------------
-# Clean up and close down.
-
-# If we created any new files and the guest uses SELinux, then we have
-# to relabel the filesystem on boot. Could do with a better way to
-# test "guest uses SELinux" (XXX).
-case "$selinux_relabel/$created_files" in
- yes/*)
- touch $mnt/.autorelabel;;
- auto/yes)
- case "$type/$distro" in
- linux/fedora|linux/rhel|linux/centos|linux/scientificlinux|linux/redhat-based)
- touch $mnt/.autorelabel
- ;;
- esac
- ;;
-esac
-
-sync
-
-# Unfortunately various unwanted processes jump into mountpoints.
-# tracker-miner-fs is the latest, previously it was something called
-# gvfs-gdu-volume-monitor. Therefore if the mountpoint is busy, try
-# to unmount it a few times. XXX
-count=10
-while ! fusermount -u $tmpdir/mnt && [ $count -gt 0 ]; do
- sleep 1
- ((count--))
-done
-if [ $count -eq 0 ]; then exit 1; fi
-
-rm -rf $tmpdir
-
-trap - EXIT ERR
-
-exit 0