summaryrefslogtreecommitdiffstats
path: root/deploy/adapters/cobbler/snippets/keep_files
blob: 65214377bb1ef642df3b3098ea8bf13fbbca22ca (plain)
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