/var/lib/cobbler/snippets/keep_files is in cobbler-common 2.4.1-0ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | ## This snippet preserves files during re-build.
## It supersedes other similar snippets - keep_*_keys.
## Put it in %pre section of the kickstart template file
## It uses preserve_files field which should contain a list of items to preserve
## This field for now could contain any of the following:
## 'ssh', 'cfengine', 'rhn' in any order
## 'rhn' part of this snippet should NOT be used with systems subscribed
## to Red Hat Satellite Server or Spacewalk as these
## have a concept of "reactivation keys" to keep the systems
## appearing to be the same. Also do not use if changing
## base channels, i.e. RHEL4 -> RHEL5 upgrades.
##
#if $getVar('$preserve_files','') != ''
#set $preserve_files = $getVar('$preserve_files','')
preserve_files = $preserve_files
#raw
# Nifty trick to restore keys without using a nochroot %post
echo "Saving keys..." > /dev/ttyS0
insmod /lib/jbd.o
insmod /lib/ext3.o
function findkeys
{
for disk in $DISKS; do
name=$(basename $disk)
tmpdir=$(mktemp -d $name.XXXXXX)
mkdir -p /tmp/$tmpdir
mount $disk /tmp/$tmpdir
if [ $? -ne 0 ]; then # Skip to the next partition if the mount fails
rm -rf /tmp/$tmpdir
continue
fi
# Copy current host keys out to be reused
if [ -d /tmp/$tmpdir$SEARCHDIR ] && cp -a /tmp/$tmpdir$SEARCHDIR/${PATTERN}* /tmp/$TEMPDIR; then
keys_found="yes"
umount /tmp/$tmpdir
rm -r /tmp/$tmpdir
break
elif [ -n "$SHORTDIR" ] && [ -d /tmp/$tmpdir$SHORTDIR ] && cp -a /tmp/$tmpdir$SHORTDIR/${PATTERN}* /tmp/$TEMPDIR; then
keys_found="yes"
umount /tmp/$tmpdir
rm -r /tmp/$tmpdir
break
fi
umount /tmp/$tmpdir
rm -r /tmp/$tmpdir
done
}
function search_for_keys
{
SEARCHDIR=$1
TEMPDIR=$2
PATTERN=$3
keys_found=no
# /var could be a separate partition
SHORTDIR=${SEARCHDIR#/var}
if [ $SHORTDIR = $SEARCHDIR ]; then
SHORTDIR=''
fi
mkdir -p /tmp/$TEMPDIR
DISKS=$(awk '{if ($NF ~ "^[a-zA-Z].*[0-9]$" && $NF !~ "c[0-9]+d[0-9]+$" && $NF !~ "^loop.*") print "/dev/"$NF}' /proc/partitions)
# In the awk line above we want to make list of partitions, but not devices/controllers
# cciss raid controllers have partitions like /dev/cciss/cNdMpL, where N,M,L - some digits, we want to make sure 'pL' is there
# No need to scan loopback niether.
# Try to find the keys on ordinary partitions
findkeys
# Try software RAID
if [ "$keys_found" = "no" ]; then
if mdadm -As; then
DISKS=$(awk '/md/{print "/dev/"$1}' /proc/mdstat)
findkeys
fi
fi
# Try LVM if that didn't work
if [ "$keys_found" = "no" ]; then
lvm lvmdiskscan
vgs=$(lvm vgs | tail -n +2 | awk '{ print $1 }')
for vg in $vgs; do
# Activate any VG we found
lvm vgchange -ay $vg
done
DISKS=$(lvm lvs | tail -n +2 | awk '{ print "/dev/" $2 "/" $1 }')
findkeys
# And clean up..
for vg in $vgs; do
lvm vgchange -an $vg
done
fi
}
function restore_keys
{
SEARCHDIR=$1
TEMPDIR=$2
PATTERN=$3
# Loop until the corresponding rpm is installed if the keys are saved
if [ "$keys_found" = "yes" ] && [ -f /tmp/$TEMPDIR/${PATTERN}* ]; then
while : ; do
sleep 10
if [ -d /mnt/sysimage$SEARCHDIR ] ; then
cp -af /tmp/$TEMPDIR/${PATTERN}* /mnt/sysimage$SEARCHDIR
logger "$TEMPDIR keys copied to newly installed system"
break
fi
done &
fi
}
for key in $preserve_files
do
if [ $key = 'ssh' ]; then
search_for_keys '/etc/ssh' 'ssh' 'ssh_host_'
elif [ $key = 'cfengine' ]; then
search_for_keys '/var/cfengine/ppkeys' 'cfengine' 'localhost'
elif [ $key = 'rhn' ]; then
search_for_keys '/etc/sysconfig/rhn', 'rhn', '*'
else
echo "No keys to save!" > /dev/ttyS0
fi
done
# now restore keys if found
for key in $preserve_files
do
if [ $key = 'ssh' ]; then
restore_keys '/etc/ssh' 'ssh' 'ssh_host_'
elif [ $key = 'cfengine' ]; then
restore_keys '/var/cfengine/ppkeys' 'cfengine' 'localhost'
elif [ $key = 'rhn' ]; then
restore_keys '/etc/sysconfig/rhn', 'rhn', '*'
else
echo "Nothing to restore!" > /dev/ttyS0
fi
done
#end raw
#end if
|