source: MondoRescue/branches/3.0/mindi/mindi@ 2978

Last change on this file since 2978 was 2978, checked in by Bruno Cornec, 12 years ago

r4599@localhost: bruno | 2012-03-28 18:38:02 +0200

  • Fix an error on excessive LogFile usage (with the params passed)
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 116.9 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 2978 2012-03-30 00:41:18Z bruno $
4#
5#-----------------------------------------------------------------------------
6# mindi - mini-Linux distro based on the user's filesystem & distribution
7#
8# Mindi can create a multi-image boot/root kit. The first image is the boot
9# disk: it contains a kernel, a ramdisk etc. The second disk is data disk #1;
10# the third disk is data disk #2; and so it goes.
11#
12# See http://www.mondorescue.org for details.
13#-----------------------------------------------------------------------------
14
15### Which arch are we on (useful for ia64 port)
16ARCH=`/bin/uname -m`
17KERVERRUN=`/bin/uname -r`
18# By default we use the running kernel as a reference
19KERVER=$KERVERRUN
20
21# In case of problem with udev you can try to add udevdebug
22MINDI_ADDITIONAL_BOOT_PARAMS="devfs=nomount noresume selinux=0 barrier=off udevtimeout=10"
23
24MINDI_REV=PBREV
25MINDI_VER=PBVER
26
27MINDI_VERSION=${MINDI_VER}-r$MINDI_REV
28MINDI_PREFIX=XXX
29MINDI_CONF=YYY
30MINDI_SBIN=${MINDI_PREFIX}/sbin
31MINDI_LIB=LLL
32
33# Temporary directory for mindi
34TMPDIR=/tmp
35
36EXTRA_SPACE=80152 # increase if you run out of ramdisk space
37BOOT_SIZE=36864 # size of the boot disk
38
39PROMPT_MAKE_CD_IMAGE="yes"
40 # Ask if you want to make a CD Image to be written?
41 # if this is set to 'no', then the image will be created automatically
42
43PROMPT_MAKE_USB_IMAGE="yes"
44 # Ask if you want to make a USB Image to be written?
45 # if this is set to 'no', then the image will be created automatically
46
47USE_OWN_KERNEL="yes"
48 # If set to "no", you will be prompted for whether or not
49 # you want to use your own kernel, or the supplied default.
50 # If "yes" mindi will automatically use your own kernel.
51
52KERNEL_IS_XEN="no"
53 # If set to "no", the kernel is not a Xen kernel
54 # If "yes", mindi will modify isolinux.cfg for the Xen kernel.
55xenkernelpath=""
56
57MY_FSTAB=/etc/fstab
58TAPE_MODS="ht st osst ide-tape ide_tape"
59SCSI_MODS="3w-xxxx 3w_xxxx 3w_9xxx 3w-9xxx 53c7,8xx a100u2w a320raid aacraid adpahci advansys aha152x aha1542 aha1740 aic79xx aic79xx_mod aic7xxx aic7xxx_mod aic7xxx_old AM53C974 atp870u BusLogic cciss cpqfc hpsa dmx3191d dpt_i2o dtc eata eata_dma eata_pio fdomain gdth g_NCR5380 i2o_block i2o_core ide-scsi ieee1394 imm in2000 initio ips iscsi iscsi_tcp libiscsi scsi_transport_iscsi libiscsi_tcp isp megaraid megaraid_mm megaraid_mbox megaraid_sas mega_sr mptbase mptscsih mptsas mptspi mptfc mptscsi mptctl NCR53c406a ncr53c8xx nsp32 pas16 pci2000 pci2220i pcmcia ppa psi240i qla1280 qla2200 qla2300 qla2400 qla2xxx qla2xxx_conf qlogicfas qlogicfc qlogicisp qlogicfas qlogicfas408 raw1394 scsi_mod scsi_transport_sas scsi_transport_spi scsi_transport_fc sd_mod crc_t10dif crc-t10dif seagate sg sim710 sr_mod sym53c416 sym53c8xx sym53c8xx_2 t128 tmscsim u14-34f ultrastor wd7000 vmhgfs intermodule scsi_dh scsi_tgt emcpdm emcpgpx emcpmpx emcp dc395x diskdumplib scsi_dump_register arcmsr"
60
61# ide-probe-mod
62IDE_MODS="ide ide-floppy floppy ide-generic ide-detect ide-mod ide-disk ide_disk ide-cd ide_cd ide_cd_mod ide-cd_mod ide-cs ide-core ide_core ide-gd_mod ide_gd_mod edd paride ata_generic ide_pci_generic ata_piix libata dock via82cxxx generic nvidia ahci libahci sata_nv cmd64x pata_via pata_amd pata_marvell pata_serverworks pata_sis pata_sil680 pata_jmicron pata_atiixp amd74xx sis5513 jmicron sata_promise sata_via serverworks sata_svw blkbk virtio virtio_ring virtio_pci virtio_blk virtio_balloon"
63PCMCIA_MODS="pcmcia_core ds yenta_socket"
64USB_MODS="usb-storage usb-ohci usb-uhci usbcore usb_common usb-common usb_storage input hid uhci_hcd ehci_hcd uhci-hcd ehci-hcd ohci-hcd ohci_hcd xhci usbkbd usbhid keybdev mousedev libusual scsi_mod ff-memless ums_cypress ums-cypress cp210x usbserial"
65NET_MODS="auth_rpcgss sunrpc nfs nfs_acl lockd fscache loop mii 3c59x e100 bcm5700 bnx2 bnx2x bnx2i mdio e1000 e1000e igb dca eepro100 ne2k-pci tg3 libphy pcnet32 8139cp 8139too 8390 forcedeth vmxnet vmxnet3 vmnet exportfs fuse libcrc32c netbk xenblktap r8169 virtio_net via_rhine"
66CDROM_MODS="$TAPE_MODS $IDE_MODS $USB_MODS $PCMCIA_MODS $SCSI_MODS $NET_MODS af_packet cdrom isocd isofs inflate_fs nls_iso8859-1 nls_base nls_cp437 nls_utf8 sg sr_mod zlib_inflate iso9660 vfat fat"
67# Those modules will only go on the backup media, not the boot media.
68EXTRA_MODS="$CDROM_MODS loop md-mod linear raid0 raid1 xor raid10 raid5 raid456 raid6_pq async_pq xor async_tx async_memcpy async_xor lvm-mod dm-mod dm_mod dm-snapshot dm_snapshot dm-zero dm_zero dm-mirror dm_mirror dm-multipath dm-round-robin dm-emc dm-hp-sw dm-rdac dm-region-hash dm-snapshot dm-log multipath jfs xfs btrfs zlib_deflate libcrc32c xfs_support pagebuf reiserfs ext2 ext3 minix nfs nfs_acl nfsd lockd sunrpc jbd mbcache ext4 jbd2 crc16 ocfs2 ocfs2_dlm ocfs2_nodemanager configfs"
69# Replace with that line for HP OCMP e.g.
70#DENY_MODS="MPS_Driver_Mapper mps octtldrv tscttl streams kqemu fdomain"
71DENY_MODS="kqemu"
72# Force some modules to be included
73FORCE_MODS=""
74
75# Find MBR in case of bootable USB device to build
76MBRFILE=/usr/lib/syslinux/mbr.bin
77[ ! -r "$MBRFILE" ] && MBRFILE=/usr/lib64/syslinux/mbr.bin
78[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/syslinux/mbr.bin
79[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/lib/syslinux/mbr.bin
80[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/lib64/syslinux/mbr.bin
81
82LOGFILE=/var/log/mindi.log
83MINDI_CACHE=/var/cache/mindi
84BOOT_MEDIA_MESSAGE="\
85To format and restore all files automatically, type 'nuke' <enter>.\n\
86To restore some/all files interactively, type 'interactive' <enter>.\n\
87To compare the archives with your filesystem, type 'compare' <enter>.\n\
88To boot to a command-line prompt (expert mode), type 'expert' <enter>.\n\
89You may add one or more of the following parameters as well:-\n\n\
90 donteject - mondorestore will not eject the CD; this is useful if, for\n\
91 instance, your PC's case has a concealed CD-ROM drive\n\
92 noresize - your mountlist will not be adjusted to use your unallocated\n\
93 hard disk space\n\
94 textonly - do not call any Newt library routines; this is unattractive\n\
95 but valuable if you find your Newt library has bugs in it\n\n\
96e.g. Type 'nuke donteject textonly' if you have an unstable Newt library and \n\
97a PC whose CD-ROM drive tray would be damaged if it unexpectedly ejected.\n\
98"
99FDISK=$MINDI_SBIN/parted2fdisk
100
101# Using a config file allow to overwrite some values
102MINDI_CONFIG="$MINDI_CONF/mindi.conf"
103if [ -f $MINDI_CONFIG ]; then
104 . $MINDI_CONFIG
105fi
106DEPLIST_FILE="$MINDI_CONF/deplist.txt"
107DEPLIST_DIR="$MINDI_CONF/deplist.d"
108
109ISO_CMD="/usr/bin/mkisofs"
110ISO_OPT="-J -r -v -p Mindi -publisher http://www.mondorescue.org -A Mindi"
111
112# Mandriva system e.g. use cdrkit, which uses genisoimage instead of mkisofs.
113# However, they use exactly the same command line parameters, so just
114# use genisoimage if it's available.
115if [ ! -x $ISO_CMD ]; then
116 ISO_CMD=/usr/bin/genisoimage
117fi
118
119
120# Function to log on screen only
121LogScreen() {
122 if [ -e /dev/stderr ] ; then
123 echo -e "$1" >> /dev/stderr
124 elif [ -e /usr/bin/logger ] ; then
125 /usr/bin/logger -s $1
126 fi
127}
128
129# Function to log in log file only
130LogFile() {
131
132 echo -e "$1" >> $LOGFILE
133 if [ _"$2" != _"" ]; then
134 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
135 fi
136 rm -f "$2"
137}
138
139# Function to log in both screen and logfile
140LogAll() {
141 LogScreen "$1"
142 LogFile "$1" "$2"
143}
144
145# Preserved for compatibility
146LogIt() {
147 LogAll "$1" "$2"
148}
149
150# Last function called before exiting
151# Parameter is exit code value
152# Should be declared here as used immediately below potentialy
153MindiExit() {
154 echo "Mindi $MINDI_VERSION is exiting" >> $LOGFILE
155 echo "End date : `date`" >> $LOGFILE
156 if [ _"$MONDO_SHARE" != _"" ] ; then
157 echo "------------- mindi logfile included -------------------------" >> /var/log/mondoarchive.log
158 cat $LOGFILE >> /var/log/mondoarchive.log
159 echo "--------------------------------------------------------------">> /var/log/mondoarchive.log
160 fi
161
162 cd /
163 sync&
164
165 # Clean temporary files only when standalone mindi
166 if [ _"$MINDI_TMP" != _"$MONDO_TMP" ]; then
167 rm -Rf $MINDI_TMP
168 fi
169 exit $1
170}
171
172Die() {
173 local i
174 if [ "$1" = "" ] ; then
175 LogIt "FATAL ERROR"
176 else
177 LogIt "FATAL ERROR. $1"
178 fi
179 if [ _"$2" != _"" ]; then
180 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
181 fi
182 rm -f "$2"
183
184 LogIt "Please e-mail a copy of $LOGFILE to the mailing list."
185 LogIt "See http://www.mondorescue.org for more information."
186 LogIt "WE CANNOT HELP unless you enclose that file.\n"
187 MindiExit -1
188}
189
190# Now we can create what we need
191MINDI_TMP=`mktemp -d $TMPDIR/mindi.XXXXXXXXXX`
192if [ $? -ne 0 ]; then
193 df $TMPDIR
194 Die "Unable to create a temporary directory ! Check space on $TMPDIR"
195fi
196if [ _"$MINDI_TMP" = _"" ]; then
197 Die "MINDI_TMP is empty, aborting"
198fi
199if [ _"$MINDI_TMP" = _"/" ]; then
200 Die "MINDI_TMP is /, aborting"
201fi
202export MINDI_TMP
203
204# ----------------------------------------------------------------------------
205
206
207AbortHere() {
208 [ "$mountpoint" ] && umount $mountpoint 2>> $LOGFILE
209 Die "Program is terminating in response to signal received from OS/user"
210}
211
212
213Aborted() {
214 trap SIGHUP SIGTERM SIGTRAP SIGINT
215 [ "$MINDI_CACHE" != "" ] && rm -f $MINDI_CACHE/mindi*img $MINDI_CACHE/*gz $MINDI_CACHE/mindi.iso
216 [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
217 Die "User abort."
218}
219
220
221AddFileToCfgIfExists() {
222 [ -e "$1" ] && echo -en "$2 `cat $1`\n" >> $3
223}
224
225
226AddKeyboardMappingFile() {
227 local mappath r included_list included_item i res ii sss
228 mappath=$1
229 KBDEPTH=$(($KBDEPTH+1))
230 [ "$KBDEPTH" -gt "128" ] && Die "Edit $MINDI_SBIN/mindi and disable FindAndAddUserKeyboardMappingFile (line 2160, approx.)"
231 if [ -e "$bigdir/$mappath" ] ; then
232 LogFile "$mappath already added" >> $LOGFILE
233 return
234 elif [ -d "$bigdir/$mappath" ] ; then
235 echo "Cannot add $mappath: it's a directory. Sorry."
236 return
237 fi
238 LogFile "Added kbd map $mappath" >> $LOGFILE
239 if [ ! -e "$mappath" ] ; then
240 mappath=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
241 if [ ! -e "$mappath" ] ; then
242 LogIt "WARNING: Cannot add $mappath: kbd map file not found"
243 return
244 fi
245 else
246 echo -en "`basename $mappath | tr '.' '#' | sed s/#kmap#gz// | sed s/#inc#gz//` " | tr '#' '.'
247 fi
248
249 mkdir -p $bigdir/etc
250 tar cf - -C / $mappath 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "WARNING: AKMF -- Could not copy $mappath to $bigdir" $MINDI_TMP/$$.log
251 if [ "`echo $mappath | grep -F ".gz"`" ] ; then
252 included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
253 else
254 included_list=`grep -Fi include $mappath | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
255 fi
256 for included_item in $included_list ; do
257 if [ ! -e "$included_item" ] ; then
258 sss=`grep -F "${included_item}.inc" $MINDI_TMP/keymaps.find`
259 [ "$sss" = "" ] && sss=`grep -F "$included_item" $MINDI_TMP/keymaps.find`
260 for ii in $sss ; do
261 [ -e "$ii" ] && AddKeyboardMappingFile $ii
262 done
263 else
264 AddKeyboardMappingFile $included_item
265 fi
266 done
267}
268
269
270CopyDependenciesToDirectory() {
271 local outdir incoming fname counter d found
272 outdir=$1
273 mkdir -p $outdir
274 incoming=`ReadLine`
275 counter=0
276 while [ "$incoming" != "" ] ; do
277 # Non absolute file names should not arrive till here => skipped
278 if [ `echo "$incoming" | cut -c1` != '/' ]; then
279 LogIt "WARNING: Unable to handle $incoming"
280 incoming=`ReadLine`
281 continue
282 fi
283 # no parent directory of incoming should be a link, copy is not possible in that case
284 d=`dirname "$incoming"`
285 found="false"
286 while [ $d != "/" -a $found = "false" ]; do
287 [ -h "$d" ] && found="true"
288 d=`dirname "$d"`
289 done
290 if [ -d "$incoming" ] && [ ! -h "$incoming" ]; then
291 find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir
292 elif [ -e "$incoming" ] && [ $found = "false" ]; then
293 tar cf - -C / $incoming 2>> $MINDI_TMP/$$.log | (cd "$outdir" ; tar xf -) || Die "Cannot copy $incoming to $outdir - did you run out of disk space?" $MINDI_TMP/$$.log
294
295 # Only uncompress modules if not using udevd
296 if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] && [ "`ps auxww | grep -v grep | grep -qw udevd`" != "" ]; then
297 gunzip -f $outdir/$incoming || LogIt "WARNING: Cannot gunzip $outdir/$incoming"
298 fi
299 [ -x "$outdir" ] && StripExecutable $outdir "-$filename-"
300 counter=$(($counter+1))
301 if [ "$counter" -ge "5" ] ; then
302 counter=0
303 echo -en "."
304 fi
305 fi
306 incoming=`ReadLine`
307 done
308}
309
310
311CountItemsIn() {
312 local r
313 r=0
314 for q in $1 ; do
315 r=$(($r+1))
316 done
317 echo $r
318}
319
320
321DropOptimizedLibraries() {
322 local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
323 filelist=$1
324 outdir=$2
325
326 list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
327 if [ "$list_of_optimized_libraries" = "" ] ; then
328 return 0
329 fi
330 echo -en "Dropping i686-optimized libraries if appropriate"
331 for optimized_lib_name in $list_of_optimized_libraries ; do
332 echo -en "."
333 reason=""
334 vanilla_lib_name=`echo "$optimized_lib_name" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
335 echo "$vanilla_lib_name" >> $filelist
336 LogFile "INFO: Adding $vanilla_lib_name to filelist"
337 mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
338 rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
339
340 # This may return multiple files
341 for resolved in `ReadAllLink $vanilla_lib_name`; do
342 LogFile "INFO: Adding as deps $resolved to filelist"
343 vanilla_resolved_name=`echo "$resolved" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
344 mkdir -p $outdir$resolved> /dev/null 2> /dev/null
345 rmdir $outdir$resolved > /dev/null 2> /dev/null
346 ln -sf $vanilla_resolved_name $outdir$resolved
347 LogFile "INFO: Excluding deps $resolved"
348 grep -Fvx "$resolved" "$filelist" > $filelist.tmp
349 LogFile "INFO: Replacing it with $vanilla_resolved_name"
350 echo "$vanilla_resolved_name" >> $filelist.tmp
351 mv -f $filelist.tmp $filelist
352 done
353 done
354 $AWK '{ print $1; }' $filelist | sort -u > $filelist.tmp
355 mv -f $filelist.tmp $filelist
356 echo -e "$DONE"
357}
358
359
360FindAndAddUserKeyboardMappingFile() {
361 local r res mapfile mappath included_item included_list keyfile mp locale
362 LogIt "INFO: Analyzing your keyboard's configuration."
363 KEYDIR=/lib/kbd
364 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share/kbd # Slackware
365 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/lib/kbd
366 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share
367 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole
368 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole-setup
369 if [ ! -e "$KEYDIR" ] ; then
370 LogIt "WARNING: Keyboard mapping directory not found. I shall use default map at boot-time."
371 return 0
372 fi
373 if [ -e "/etc/sysconfig/keyboard" ] ; then
374 LogFile "INFO: Red Hat-style config detected."
375 keyfile=/etc/sysconfig/keyboard
376 elif [ -e "/etc/rc.d/rc.keymap" ] ; then
377 LogFile "INFO: Slackware-style config detected."
378 keyfile=/etc/rc.d/rc.keymap
379 elif [ -e "/etc/rc.config" ] ; then
380 LogFile "INFO: Debian-style config detected."
381 keyfile=/etc/rc.config
382 elif [ -e "/etc/console/boottime.kmap.gz" ] ; then
383 LogFile "INFO: Debian-style config detected."
384 echo -en "Adding the following keyboard mapping tables: "
385 mkdir -p $bigdir/tmp
386 echo "/etc/console/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
387 KBDEPTH=0
388 mkdir -p $bigdir/etc/console
389 cp /etc/console/boottime.kmap.gz $bigdir/etc/console 2>> $LOGFILE
390 echo ""
391 echo -e "$DONE"
392 return 0
393 elif [ -e "/etc/console-setup/boottime.kmap.gz" ] || [ -e "/etc/console-setup/cached.kmap.gz" ] ; then
394 LogFile "INFO: Ubuntu-style config detected."
395 echo -en "Adding the following keyboard mapping tables: "
396 mkdir -p $bigdir/tmp
397 if [ -e "/etc/console-setup/boottime.kmap.gz" ] ; then
398 kbdfile="/etc/console-setup/boottime.kmap.gz"
399 else
400 kbdfile="/etc/console-setup/cached.kmap.gz"
401 fi
402 echo $kbdfile > $bigdir/tmp/KEYMAP-LIVES-HERE
403 KBDEPTH=0
404 mkdir -p $bigdir/etc/console-setup
405 cp $kbdfile $bigdir/etc/console-setup 2>> $LOGFILE
406 echo ""
407 echo -e "$DONE"
408 return 0
409 elif [ -e "/etc/rc.conf" ] ; then
410 LogFile "INFO: ArchLinux config detected."
411 keyfile=/etc/rc.conf
412 elif [ -e "/etc/conf.d/keymaps" ] ; then
413 LogFile "INFO: Gentoo-style config detected."
414 keyfile=/etc/conf.d/keymaps
415 else
416 echo -en "Searching for rc.config ..."
417 keyfile=`find /etc -name rc.config | head -n1`
418 if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
419 LogIt "WARNING: Unknown config detected. Default keyboard map will be used."
420 return
421 else
422 LogFile "INFO: Found $keyfile"
423 fi
424 fi
425 if [ ! -e "$KEYDIR/keymaps" ] ; then
426 LogIt "WARNING: Keyboard mapping directory not found. Default keyboard map will be used."
427 return
428 fi
429 LogFile "INFO: keyfile=$keyfile"
430 locale=`grep -F KEYTABLE "$keyfile" | tr -d '"' |cut -d'=' -f2`
431 [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'` # Slackware
432 [ ! "$locale" ] && locale=`grep -E '^KEYMAP=' "$keyfile" | tr -d '"' |cut -d'=' -f2` # Gentoo & ArchLinux
433 LogFile "INFO: locale=$locale"
434 #
435 # Process the keymaps dir once for all
436 # AddKeyboardMappingFile will use it recursively
437 #
438 find $KEYDIR/keymaps > $MINDI_TMP/keymaps.find
439 mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep -F "/${locale}." | grep -vx " *#.*"`
440 [ ! "$mp" ] && mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
441 # If we have multiple keymaps then log it !!
442 echo "$mp" | grep -q " "
443 if [ $? -eq 0 ]; then
444 LogAll "WARNING: Multiple keymaps found: $mp"
445 LogFile "INFO: The following one will be used"
446 fi
447 for i in $mp ; do
448 mappath=$i
449 [ -e "$i" ] && [ ! -d "$i" ] && break
450 done
451 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
452 mappath=$(find / -wholename "*/kbd/keymaps/*/$locale | head -1")
453 fi
454 LogFile "INFO: mappath = $mappath"
455 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
456 LogIt "WARNING: Keyboard mapping file not found. Default keyboard map will be used."
457 return
458 fi
459 echo -en "Adding the following keyboard mapping tables: "
460 mkdir -p $bigdir/tmp
461 echo "$mappath" > $bigdir/tmp/KEYMAP-LIVES-HERE
462 KBDEPTH=0
463 AddKeyboardMappingFile $mappath
464 echo ""
465 echo -e "$DONE"
466 rm -f $MINDI_TMP/keymaps.find
467 return 0
468}
469
470
471FindMboot32Binary() {
472 MBOOTC32=/usr/lib/syslinux/mboot.c32
473 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/lib/syslinux/mboot.c32
474 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/lib64/syslinux/mboot.c32
475 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/syslinux/mboot.c32
476 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/lib/syslinux/mboot.c32
477 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/lib64/syslinux/mboot.c32
478 [ ! -e "$MBOOTC32" ] && MBOOTC32=`find / -name mboot.c32 | grep -x "/.*/mboot.c32"`
479 [ ! -e "$MBOOTC32" ] && Die "Please install mboot.c32 first. If your syslinux RPM doesn't include mboot.c32, you may download an isolinux RPM from Mondo's website - go to http://www.mondorescue.org/downloads.shtml"
480 LogFile "INFO: Found mboot.c32 at $MBOOTC32"
481}
482
483FindIsolinuxBinary() {
484 ISOLINUX=/usr/lib/isolinux.bin
485 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
486 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib64/syslinux/isolinux.bin
487 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
488 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
489 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib64/syslinux/isolinux.bin
490 [ ! -e "$ISOLINUX" ] && ISOLINUX=`find / -name isolinux.bin | grep -x "/.*/isolinux.bin"`
491 [ ! -e "$ISOLINUX" ] && Die "Please install isolinux first. If your syslinux RPM doesn't include isolinux, you may download an isolinux RPM from Mondo's website - go to http://www.mondorescue.org/downloads.shtml"
492 LogFile "INFO: Found isolinux.bin at $ISOLINUX"
493}
494
495
496FindSpecificModuleInPath() {
497 local modpaths pwd line
498 pwd=`pwd`
499 if [ "$YOUR_KERNEL_SUCKS" ] ; then
500 cd "$MINDI_TMP"
501 else
502 cd /
503 fi
504 if [ ! -e "$1" ] ; then
505 LogIt "WARNING - cannot search specific path '$1'"
506 return 1
507 fi
508 # Find all files and links (required for some VMWare VMs)
509 modpaths=`find $1 -name $2.*o -o -name $2.o.gz -o -name $2.ko.gz -o -name $2 -type f -o -type l`
510 echo "$modpaths"
511 cd "$pwd"
512}
513
514
515GenerateGiantDependencyList() {
516 local incoming loc fname list_of_files i tempfile outfile progress filelist res r mapfile mappath included_list included_item old_pwd tempdepfile modres noof_lines lvmversion lvmresolved
517
518 echo -en "Analyzing dependency requirements"
519 outfile=$1
520 tempfile=$MINDI_TMP/$$.txt
521 incoming=`ReadLine`
522
523 > $tempfile
524 progress=0
525 res=0
526 noof_lines=$2
527 while [ "$incoming" != "" ] ; do
528 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
529 incoming=`ReadLine`
530 continue
531 fi
532 if [ "$incoming" = "LVMFILES:" ] ; then
533 break
534 fi
535 filelist=`GenerateListForFile "$incoming"`
536 r=$?
537 [ "$r" -ne "0" ] && LogIt "WARNING: $incoming not found"
538 res=$(($res+$r))
539# LogFile "INFO: '$incoming' generates filelist '$filelist'"
540 for fname in $filelist ; do
541 [ "$fname" != "" ] && echo "$fname" >> $tempfile
542 done
543 progress=$(($progress+1))
544 echo -en "\r\t\t\t\t\t\t\t\t"
545 i=$(($progress*100))
546 i=$(($i/$noof_lines))
547 echo -en "$i"
548 echo -en "%"
549 modres=$(($progress%4))
550 [ "$modres" -eq "0" ] && echo -en "\t/"
551 [ "$modres" -eq "1" ] && echo -en "\t-"
552 [ "$modres" -eq "2" ] && echo -en "\t\\"
553 [ "$modres" -eq "3" ] && echo -en "\t|"
554 incoming=`ReadLine`
555 done
556 if [ "$incoming" = "LVMFILES:" ] ; then
557 incoming=`ReadLine`
558 lvmversion=""
559 while [ "$incoming" != "" ] ; do
560 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
561 incoming=`ReadLine`
562 continue
563 fi
564 filelist=`GenerateListForFile "$incoming"`
565 for tool in $filelist ; do
566 lvmresolved=`readlink -f $tool`
567 if [ "$tool" = "$lvmresolved" ]; then
568 echo "$tool" >> $tempfile
569 elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
570 if [ "$lvmversion" = "" ] ; then
571 lvmversion=`$lvmresolved`
572 echo "$lvmresolved" >> $tempfile
573 fi
574 toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
575 if [ "$lvmversion" = "200" ]; then
576 # pvdata and lvmcreate_initrd don't exist in LVM2
577 case "$toolstripped" in
578 "pvdata")
579 continue
580 ;;
581 "lvmcreate_initrd")
582 continue
583 ;;
584 esac
585 fi
586 toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
587 if [ -e "$toolpath" ] ; then
588 echo "$toolpath" >> $tempfile
589 echo "$tool" >> $tempfile
590 else
591 toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
592 fi
593 if [ -e "$toolpath" ] ; then
594 echo "$toolpath" >> $tempfile
595 echo "$tool" >> $tempfile
596 else
597 echo "Where are your LVM-Tools? Couldn't find $tool"
598 fi
599 else
600 echo "$tool" >> $tempfile
601 fi
602 done
603 progress=$(($progress+1))
604 echo -en "\r\t\t\t\t\t\t\t\t"
605 i=$(($progress*100))
606 i=$(($i/$noof_lines))
607 echo -en "$i"
608 echo -en "%"
609 modres=$(($progress%4))
610 [ "$modres" -eq "0" ] && echo -en "\t/"
611 [ "$modres" -eq "1" ] && echo -en "\t-"
612 [ "$modres" -eq "2" ] && echo -en "\t\\"
613 [ "$modres" -eq "3" ] && echo -en "\t|"
614 incoming=`ReadLine`
615 done
616 fi
617 echo -en "$DONE\nMaking complete dependency list"
618
619 tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
620 mv -f $tempfile.new $tempfile
621 > $outfile.pre
622 progress=0
623 noof_lines=`cat $tempfile | wc -l`
624 LogFile "---------------------------------"
625 LogFile "List of dependencies: "
626 LogFile "---------------------------------"
627 for fname in `cat $tempfile` ; do
628 echo "$fname" | tee -a $LOGFILE >> $outfile.pre
629 LocateDeps $fname | tee -a $LOGFILE >> $outfile.pre
630 progress=$(($progress+1))
631 echo -en "\r\t\t\t\t\t\t\t\t"
632 i=$(($progress*100))
633 i=$(($i/$noof_lines))
634 echo -en "$i"
635 echo -en "%"
636 modres=$(($progress%4))
637 [ "$modres" -eq "0" ] && echo -en "\t/"
638 [ "$modres" -eq "1" ] && echo -en "\t-"
639 [ "$modres" -eq "2" ] && echo -en "\t\\"
640 [ "$modres" -eq "3" ] && echo -en "\t|"
641 done
642 if [ _"$MONDO_SHARE" != _"" ]; then
643 mkdir -p $bigdir/tmp
644 mkdir -p $bigdir/sbin
645 mkdir -p $bigdir/bin
646 if [ -e "$MINDI_TMP/post-nuke.tgz" ] ; then
647 LogIt "\nINFO: Incorporating post-nuke tarball"
648 old_pwd=`pwd`
649 cd "$bigdir"
650 tar -zxf $MINDI_TMP/post-nuke.tgz 2>> $MINDI_TMP/$$.log || LogIt "ERROR: when untarring post-nuke tarball" $MINDI_TMP/$$.log
651 cd "$old_pwd"
652 fi
653 if cp -f $MINDI_TMP/mondo*restore $bigdir/usr/bin 2>> $LOGFILE ; then
654 LocateDeps $bigdir/usr/bin/mondo*restore >> $outfile.pre
655 else
656 LogIt "ERROR: Cannot find mondo*restore in mondo's tempdir, $MINDI_TMP"
657 LogIt " I bet you've got a spare copy of Mondo or Mindi floating around on your system."
658 LogIt " If Mindi was called by Mondo then send me a bug report."
659 LogIt " It not, type 'ps ax' to see which Mondo-related process is still running then kill it. :-)"
660 LogIt " Finally, run Mindi again."
661 Die "Odd."
662 fi
663 cp -f $MINDI_TMP/BOOTLOADER.* $bigdir 2>> $LOGFILE || LogIt "\nINFO: Mondo v1.2x defaults to LILO as the bootloader, BTW."
664 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
665 LogIt "\nINFO: Incorporating Network-related settings"
666 for r in NETFS-* ISO-PREFIX ; do
667 cp -f $MINDI_TMP/$r $bigdir/tmp 2>> $LOGFILE || Die "Cannot copy $r - did you run out of disk space?"
668 LogFile "INFO: Copying $r to ramdisk"
669 done
670 fi
671 fi
672 tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
673 rm -f $tempfile $outfile.pre
674 [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
675 return $res
676}
677
678
679GenerateListForFile() {
680 local files_found loc fname incoming i res
681 incoming="$1"
682 files_found=""
683 res=0
684
685 for fname in $incoming ; do
686 files_found="$files_found `LocateFile $fname`"
687 done
688
689 echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
690}
691
692
693# Returns all disk devices which are part of a raid array
694GetAllRaidMembers() {
695 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
696}
697
698
699GetFileSizeList() {
700 local i
701 for i in `find $1 -type d -o -print` ; do
702 du -sk $i
703 done
704}
705
706
707GetHomeDir() {
708 local res loc
709 loc=`which $1 2>/dev/null`
710 res=`file $loc | $AWK '{print $NF;}'`
711 dirname $res
712}
713
714
715# Check kernel filesystem capabilites for accessing initrd image
716# Could be ext2 FS (old mode) or initramfs (new mode)
717#
718# Interface definition:
719# param #1: absolute path to kernel image
720GetInitrdFilesystemToUse() {
721
722 # interface test: make sure we have one parameter
723 if [ $# -ne 1 ]; then
724 Die "GetInitrdFilesystemToUse(): Expected 1 parameter, got $#."
725 fi
726
727 # interface parameters
728 local lvKernelImage=$1
729
730 # local constants (filesystem magic strings)
731 local lcMagicCramfs="<3>cramfs: wrong magic"
732 local lcMagicExt2fs="EXT2-fs: blocksize too small for device."
733 local lcMagicExt3fs="<3>EXT3-fs: blocksize too small for journal device."
734 local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs...|<6>Trying to unpack rootfs image as
735initramfs"
736
737 # local variables
738 local lvOffset
739 local lvScanRes
740 local lvUseFilesystem
741
742 # say where we are.
743 LogFile "INFO: GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage"
744
745 # verify that file exists
746 [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
747
748 # Kernel may be gzip compressed
749 file $lvKernelImage 2>&1 | grep -q gzip
750 if [ $? -eq 0 ]; then
751 lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs"`
752
753 # determine which filesystem to use for initrd image: ext2|3fs, gzip'ed cpio (initramfs) or cramfs
754 if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
755 lvUseFilesystem="ext2fs"
756 elif [ `echo $lvScanRes | grep -Ec "$lcMagicExt3fs"` -eq 1 ]; then
757 lvUseFilesystem="ext3fs"
758 elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
759 lvUseFilesystem="initramfs"
760 elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
761 lvUseFilesystem="cramfs"
762 else
763 lvUseFilesystem="UNSUPPORTED"
764 fi
765
766 else
767 # In that case, we are after 2.6.30 and use the supported initramfs
768 lvUseFilesystem="initramfs"
769 fi
770 # say what we are using
771 LogFile "INFO: GetInitrdFilesystemToUse(): Filesytem to use for initial ram disk is $lvUseFilesystem."
772
773 # return file system to use
774 echo "$lvUseFilesystem"
775
776}
777
778# Searches parent raid device of given disk device
779# $1: disk device (i.e. /dev/hda1)
780GetParentRaidDev() {
781 if [ ! -f /etc/raidtab ]; then
782 return
783 fi
784 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
785}
786
787
788# Searches members of raid device
789# $1: raid device (/dev/md...)
790GetRaidDevMembers() {
791 if [ ! -f /etc/raidtab ]; then
792 return
793 fi
794 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
795}
796
797
798HackPathsToFailsafe() {
799 local incoming newpath stub i pwd
800 incoming=`ReadLine`
801 pwd=`pwd`
802 cd "$MINDI_TMP"
803 while [ "$incoming" != "" ] ; do
804 stub=`basename $incoming`
805 newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
806 for i in $newpath ; do
807 echo "$i"
808 done
809 read incoming
810 done
811 cd "$pwd"
812}
813
814
815ListAllPartitions() {
816 local res currline partition all_partitions ap_orig remaining i j
817
818 grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
819 [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
820 if [ -e "/vmfs/volumes" ]; then
821 # For VMWare ESX 3 get the device names of these volumes
822 vdf -P | grep -E '/vmfs/volumes' | $AWK '{print $1}'
823 fi
824 return
825}
826
827
828ListImagesForUser() {
829 local path fname
830 path=$MINDI_CACHE
831 echo -en "In the directory '$path' you will find the images:-\n"
832 for fname in `ls $path | grep -F mindi-` ; do
833 printf "%19s " $fname
834 done
835 echo " "
836}
837
838
839ListKernelModulePaths() {
840 local module_list module fname r kern
841 module_list="$MODULES"
842 # Remove unwanted modules from list
843 for i in $DENY_MODS; do
844 module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
845 EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
846 done
847###
848### Sq-Modification ... Use kernelname for module search path if specified
849###
850 if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
851 then
852 kern=${kernelname}
853 else
854 kern="$KERVERRUN"
855 fi
856 export KERVER=$kern
857###
858### Sq-Mod End
859###
860 # Get rid of duplicates, so that if a live kernel module also appears
861 # in $EXTRA_MODS that it won't get reported as "live module file not found" twice.
862 for module in `echo $module_list $EXTRA_MODS | tr ' ' '\n' | sort -u` ; do
863 r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
864 if [ -z "$r" ]; then
865 if [ "`echo "$MODULES" | grep -w $module`" ]; then
866 r="[live module file not found]"
867 else
868 r="[extra module file not found]"
869 fi
870 else
871 [ -f "$r" ] && echo "$r"
872 fi
873 LogFile "INFO: module $module --> $r"
874 done
875 find /lib/modules/$kern/modules.* -type f 2> /dev/null
876}
877
878#
879# Critical function which computes all dependencies (dyn. lib.)
880# for a list of binaries
881#
882LocateDeps() {
883 local incoming fname deps
884 incoming="$*"
885 for fname in $incoming ; do
886 if [ ! -e "$fname" ] ; then
887 LogFile "WARNING - $fname does not exist; cannot be LDD'd."
888 if echo $fname | grep lvm &> /dev/null ; then
889 LogFile " This warning only affects you if you are using LVM."
890 if echo "$MODULES" | grep lvm &> /dev/null ; then
891 LogFile " I think you are, so please take heed!"
892 else
893 LogFile " I don't think you are, so don't worry about it."
894 fi
895 fi
896 elif [ -h "$fname" ] && [ -x "$fname" ] ; then
897 LogFile "INFO: $fname is softlink"
898 else
899 ldd $fname 2> /dev/null | ProcessLDD
900 fi
901 done
902}
903
904
905# Give all symlinks recursively of a full path name
906ReadAllLink() {
907 file="$1"
908
909 echo $file | grep -q '\.\./'
910 if [ $? -eq 0 ]; then
911 # We need to normalise the path with .. in it
912 file=`echo $file | perl -pi -e 's|([^/]+)/([^/]+)/\.\./([^/]+)|$1/$3|'`
913 fi
914 echo "$file"
915 if [ ! -h $file ]; then
916 return 0
917 fi
918
919 link=`readlink $file`
920 d=`dirname $file`
921 fchar=`echo $link | cut -c1`
922 # If mother dir is a link print it
923 if [ -h "$d" ]; then
924 echo "$d"
925 d=`readlink $d`
926 fi
927 if [ "$fchar" != "/" ]; then
928 # Relative or local link
929 ReadAllLink "$d/$link"
930 else
931 # Absolute path
932 ReadAllLink $link
933 fi
934}
935
936
937LocateFile() {
938 local i path fname_to_find location output resolved tmp stub cache_id loclist
939 fname_to_find="$1"
940 # It's an absolute path
941 if echo "$fname_to_find" | grep -x "/.*" ; then
942 output="$fname_to_find"
943 if [ -h "$output" ] ; then
944 output="`ReadAllLink $output` $output"
945 fi
946 echo "$output"
947 return 0
948 fi
949 # It's not an absolute path
950 output=""
951 for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin `find /usr/lib /lib /usr/local/lib /usr/X11R6/lib /usr/lib64 /lib64 /usr/local/lib64 /usr/X11R6/lib64 -type d -maxdepth 1 2> /dev/null` ; do
952 #for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin /usr/lib /usr/lib64 /usr/lib64/* /lib /lib64 /lib64/* /usr/local/lib /usr/local/lib64 /usr/local/lib64/* /usr/X11R6/lib /usr/X11R6/lib64 /usr/X11R6/lib64/* ; do
953 [ -h "$path" ] && continue
954 [ ! -e "$path/$fname_to_find" ] && continue
955 output="$path/$fname_to_find $output"
956 if [ -h "$path/$fname_to_find" ] ; then
957 output="`ReadAllLink $path/$fname_to_find` $output"
958 fi
959 done
960 if [ "$output" = "" ] ; then
961 return 1
962 fi
963 echo "$output"
964 return 0
965}
966
967
968# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
969MakeMondoConfigFile() {
970 local outfile use_lzo use_comp use_star
971 outfile=$1
972 > $outfile
973 [ "$TAPESIZE" ] && echo "media-size $TAPESIZE" >> $outfile
974 [ "$TAPEDEV" ] && echo "media-dev $TAPEDEV" >> $outfile
975 [ "$USBDEVICE" ] && echo "usb-dev $USBDEVICE" >> $outfile
976 [ "$FILES_IN_FILELIST" ] && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
977 [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
978 [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
979 use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
980 use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
981 use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
982 use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
983 echo "use-lzo $use_lzo" >> $outfile
984 echo "use-gzip $use_gzip" >> $outfile
985 echo "use-star $use_star" >> $outfile
986 echo "use-comp $use_comp" >> $outfile
987 echo "datestamp `date`" >> $outfile
988 [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
989 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
990 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
991 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
992 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-HWADDR netfs-client-hwaddr $outfile
993 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-DEFGW netfs-client-defgw $outfile
994 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT netfs-server-mount $outfile
995 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-USER netfs-server-user $outfile
996 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH netfs-server-path $outfile
997 AddFileToCfgIfExists $MINDI_TMP/NETFS-DEV netfs-dev $outfile
998 AddFileToCfgIfExists $MINDI_TMP/NETFS-PROTO netfs-proto $outfile
999 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-IPADDR netfs-server-ipaddr $outfile
1000 AddFileToCfgIfExists $MINDI_TMP/ISO-DEV iso-dev $outfile
1001 AddFileToCfgIfExists $MINDI_TMP/ISO-MNT iso-mnt $outfile
1002 AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX iso-prefix $outfile
1003 AddFileToCfgIfExists $MINDI_TMP/ISODIR isodir $outfile
1004 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
1005 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME bootloader.name $outfile
1006 AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
1007 AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
1008 AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
1009 AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL differential $outfile
1010 AddFileToCfgIfExists $MINDI_TMP/ACL acl $outfile
1011 AddFileToCfgIfExists $MINDI_TMP/XATTR xattr $outfile
1012 AddFileToCfgIfExists $MINDI_TMP/OBDR obdr $outfile
1013}
1014
1015# Get PV's for an LV
1016GetPVsForLV() {
1017 if [ -n "$1" ]; then
1018 vg=`$LVMCMD lvdisplay $1 2>/dev/null |awk '/VG Name/{print $NF;exit}'`
1019 if [ -z "$vg" ]; then
1020 return
1021 fi
1022 $LVMCMD vgdisplay -v $vg 2>/dev/null | awk '/PV Name/{print $NF}'
1023 fi
1024}
1025
1026
1027MakeMountlist() {
1028 local mountlist all_partitions current_partition \
1029partition_size partition_format outstring partition_number \
1030partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
1031absolute_partition old_partition_fmt current_lvolume uname skip
1032
1033 LogFile "Your raw fstab file looks like this:"
1034 LogFile "------------------------------------"
1035 cat $MY_FSTAB >> $LOGFILE
1036 LogAll "Your mountlist will look like this:"
1037 LogFile "-----------------------------------"
1038
1039# mountlist(OUT)
1040 mountlist=$1
1041
1042# NB: partition = device
1043# NB: mountpt = where the device is mounted
1044
1045 [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
1046
1047 [ "$mountlist" != "" ] && rm -Rf $mountlist
1048 > $mountlist
1049 all_partitions=""
1050
1051 if [ $LVM != "false" ]; then
1052 echo -en "Analyzing LVM...\n"
1053 $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
1054 if [ $? -ne 0 ]; then
1055 LVM="false"
1056 fi
1057 # Excluded LVs and GVs are not reported here
1058 all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-`
1059 fi
1060 all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1061 for i in $IMAGE_DEVS ; do
1062 mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1063 done
1064 [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1065 printf " %-15s %-15s %-15s %-13s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL/UUID | tee -a $LOGFILE
1066 useless_dev="/dev/floppy /dev/fd0h1440 /dev/fd0H1440 /dev/cdrom /dev/cdrom/cdrom /dev/cdrom/cdrom1 /dev/cdrom/cdrom2 /dev/cdrom0 /dev/cdrom1 /dev/cdrom2 /dev/cdrom3 /dev/cdrw /dev/scd /dev/ram :/ /dev/sr0 /dev/sr1 /dev/cdrom1 tmpfs devpts sysfs proc debugfs"
1067 for c_p in $all_partitions ; do
1068 # Skip fd/cd devices, network FS, cifs
1069 [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] || [ "`echo "$c_p" | grep -E "^//"`" != "" ]&& continue
1070 [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1071 if [ -h "$c_p" ] && [ "`echo "$c_p" | grep -F "/dev/hd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/sd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/md"`" = "" ] ; then
1072 current_partition=`readlink -f $c_p`
1073 [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
1074 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1075 else
1076 current_partition="$c_p"
1077 fi
1078 [ "$c_p" = "none" ] && continue
1079 redhat_label=""
1080 label=""
1081 uuid=""
1082 absolute_partition=`readlink -f $c_p`
1083 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$current_partition" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1084
1085 # Detects noauto partitions not mounted and exclude them
1086 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$current_partition" | grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1087 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
1088 continue
1089 fi
1090
1091 # set default in case we dont't find it
1092 str_to_find_fmt_with=$current_partition
1093
1094 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1095 # current_partition contains only first column of /etc/fstab
1096 if [ "`echo "$current_partition" | grep -i "LABEL="`" != "" ]; then
1097 redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1098 actual_dev=""
1099
1100 # 1st try, findfs - the RHEL way of finding labels and their partitions
1101 if [ -x "/sbin/findfs" ]; then
1102 actual_dev=`/sbin/findfs LABEL="${redhat_label}" 2> /dev/null`
1103 fi
1104
1105 # 2nd try : blkid, the good way for all LABEL except swap
1106 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1107 actual_dev=`/sbin/blkid | grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1108 # For LVM FS it will give a /dev/dm-# which should then be converted
1109 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1110 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1111 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1112 for dev in `ls /dev/mapper/*`; do
1113 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1114 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1115 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1116 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1117 break
1118 fi
1119 done
1120 fi
1121 fi
1122
1123 # 3rd try, which works on a standard partition (ext2/3), but not on swap
1124 # For LVM gives a /dev/mapper entry
1125 if [ "x$actual_dev" = "x" ]; then
1126 actual_dev=`/bin/mount -l | grep "\[$redhat_label\]" | cut -d' ' -f1`
1127 fi
1128
1129 # 4th try, with vol_id
1130 # SWAP only
1131 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1132 list_swaps=`cat /proc/swaps | grep "/dev/" | $AWK '{ print $1 }' `
1133 for dev_swap in $list_swaps ; do
1134 dev_exists=`/sbin/vol_id $dev_swap | grep "$redhat_label"`
1135 if [ "x$dev_exists" != "x" ]; then
1136 actual_dev=$dev_swap
1137 break;
1138 fi
1139 done
1140 fi
1141
1142 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1143 # LABEL=SW-cciss/c0d0p3 (RDP)
1144 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1145 # SWAP only
1146 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1147 skip=""
1148 uname=$KERVERRUN
1149 [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1150 # 2.6.12 needs 16 (FC3)
1151 [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1152 # 2.6.19 and upper needs 1052
1153 [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1154 [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1155 [ "`echo $uname | grep "3.[0-9]*.[0-9]*"`" != "" ] && skip=1052
1156 if [ $skip = "" ]; then
1157 Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1158 fi
1159 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1160 do
1161 # Location of the swap label for kernel 2.6
1162 try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
1163 if [ "x$try_dev_label" = "x$redhat_label" ]; then
1164 actual_dev=$try_dev
1165 fi
1166 done
1167 fi
1168
1169 # Check if one of all those tries has known success
1170 if [ "x$actual_dev" != "x" ]; then
1171 current_partition=$actual_dev
1172 else
1173 Die "Your system uses a LABEL partition ($current_partition), but you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or install findfs|blkid|vol_id"
1174 fi
1175 # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1176 # current_partition contains only first column of /etc/fstab
1177 elif [ "`echo "$current_partition" | grep -i "UUID="`" != "" ]; then
1178 uuid=`echo "$current_partition" | cut -d'=' -f2`
1179 actual_dev=""
1180
1181 # 1st try, findfs - the RHEL way of finding labels and their partitions
1182 if [ -x "/sbin/findfs" ]; then
1183 actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1184 fi
1185
1186 # 2nd try : blkid, the good way for all UUID except swap
1187 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1188 actual_dev=`/sbin/blkid | grep "$uuid" | grep UUID= | cut -d':' -f1`
1189 # For LVM FS it will give a /dev/dm-# which should then be converted
1190 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1191 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1192 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1193 for dev in `ls /dev/mapper/*`; do
1194 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1195 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1196 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1197 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1198 break
1199 fi
1200 done
1201 fi
1202 fi
1203
1204 # 3th try, with vol_id
1205 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1206 list_dev=`mount | grep -E '^/' | $AWK '{ print $1 }' `
1207 for dev in $list_dev ; do
1208 dev_exists=`/sbin/vol_id $dev | grep "$uuid"`
1209 if [ "x$dev_exists" != "x" ]; then
1210 actual_dev=$dev
1211 break;
1212 fi
1213 done
1214 fi
1215
1216 # 4th try, with dumpuuid (VMWare only ?) for swap
1217 if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1218 list_dev=`cat /proc/swaps | grep -E '^/' | $AWK '{ print $1 }' `
1219 for dev in $list_dev ; do
1220 dev_exists=`/sbin/dumpuuid $dev | grep "$uuid"`
1221 if [ "x$dev_exists" != "x" ]; then
1222 actual_dev=$dev
1223 break;
1224 fi
1225 done
1226 fi
1227
1228 # Check if one of all those tries has known success
1229 if [ "x$actual_dev" != "x" ]; then
1230 current_partition=$actual_dev
1231 else
1232 Die "Your system uses a UUID partition ($current_partition),\nbut you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or\ninstall findfs|blkid|vol_id or\nrelabel the partition with the correct UUID if it's a swap partition."
1233 fi
1234 else
1235 # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1236 # they use symlinks in fstab unrelated to what is shown in mount !
1237 if [ _"$partition_mountpt" = _"" ]; then
1238 # set default in case we dont't find it
1239 for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | grep -Ev "^#" | $AWK '{print $1}'`; do
1240 if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
1241 str_to_find_fmt_with=$tmpp
1242 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$tmpp" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1243 break;
1244 fi
1245 done
1246 fi
1247 fi
1248
1249 # Look for devices which have to be excluded
1250 skip=0
1251 if [ "$MINDI_EXCLUDE_DEVS" ] ; then
1252 l=""
1253 list_of_devices="`ReadAllLink $current_partition`"
1254 for d in $list_of_devices; do
1255 l="$l `$MINDI_LIB/analyze-my-lvm --givemapperofdm $d`"
1256 done
1257
1258 # Remove PVs from LVs excluded
1259 l="$l `GetPVsForLV $current_partition`"
1260
1261 # We want a single unique list
1262 list_of_devices="`echo $l | sort -u`"
1263
1264 for d in `echo $MINDI_EXCLUDE_DEVS | sed 's/|/ /g'`; do
1265 if [ "`echo " $list_of_devices " | grep " $d"`" != "" ]; then
1266 LogFile "INFO: Excluding $current_partition from mountlist (due to excluded device $d)"
1267 skip=1
1268 continue
1269 fi
1270 done
1271 fi
1272 if [ $skip -eq 1 ]; then
1273 continue
1274 fi
1275
1276 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1277 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1278 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1279 # the former is then a link to the latter, so we test whether
1280 # $current_partition is actually such a link or not and set
1281 # $current_lvolume accordingly. On Debian you may find more than one answer
1282 # so we remove the one corresponding to /dev/.static
1283 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1284 # principle is the same and we need to find the link to it as well.
1285 # Note that $current_lvolume may well be an
1286 # ordinary device. It is just to make sure that we feed the right value
1287 # into any of the LVM tools if possible.
1288
1289 current_lvolume="$current_partition"
1290 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1291 # .static dir are a Debian specificity
1292 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1293 echo $current_lvolume | grep -q ' '
1294 if [ $? -eq 0 ]; then
1295 LogFile "WARNING: Multiple Logical Volumes found. Report to dev team"
1296 fi
1297 # if it's not found, it may well be a real device such as a multipath one
1298 # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1299 if [ _"$current_lvolume" = _"" ]; then
1300 current_lvolume="$current_partition"
1301 fi
1302 fi
1303 #
1304 # End of LVM device style variation code (other than $current_lvolume).
1305
1306 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1307 # Size computed via LVM not directly
1308 partition_size="lvm"
1309 else
1310 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1311 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1312 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1313 # Skip swap files
1314 [ "`echo "$current_partition" | grep -E "^/dev"`" = "" ] && continue
1315 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition " | $AWK '{print $3}'`
1316 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1317 [ "$partition_format" != "swap" ] && partition_format="swap"
1318 if [ "$partition_size" = "" ] ; then
1319 totalsize=0
1320 items=0
1321 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1322 totalsize=$(($totalsize+$i))
1323 items=$(($items+1))
1324 done
1325 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1326 [ "$partition_size" -lt "125000" ] && partition_size=125000
1327 LogFile "INFO: I'm guessing $c_p is $(($partition_size/1024))MB"
1328 fi
1329 else
1330 partition_size=`SizeOfPartition $current_partition`
1331 fi
1332 fi
1333 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1334 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1335 if [ "$partition_mountpt" = "" ] ; then
1336 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1337 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1338 partition_mountpt="raid"
1339 partition_format="raid"
1340 else
1341 partition_mountpt="lvm"
1342 partition_format="lvm"
1343 fi
1344 fi
1345 fi
1346 psz=$partition_size
1347 LogFile "INFO: Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)"
1348 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1349 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1350 partition_mountpt="image"
1351 old_partition_fmt=$partition_format
1352 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1353 partition_size=$(($partition_size+1)); # just in case
1354 if [ "$partition_format" = "Linux" ] ; then
1355 LogFile "WARNING: Are you imaging a mounted swap partition? Silly..."
1356 LogFile "WARNING: Reverting format from $old_partition_fmt to $partition_format"
1357 partition_format=$old_partition_fmt
1358 fi
1359 fi
1360
1361 if [ ! "$partition_mountpt" ] ; then
1362 LogFile "------- $FDISK -l $qq log ------------"
1363 for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1364 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1365 [ "$partition_format" ] && break
1366 done
1367 LogFile "------- $FDISK log end ------------"
1368 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1369 partition_format="compaq"
1370 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1371 LogIt "WARNING: Unable to find mountpoint of $current_partition - ignoring"
1372 continue
1373 fi
1374 fi
1375 if [ "$redhat_label" ]; then
1376 label="$redhat_label"
1377 elif [ "$uuid" ]; then
1378 label="$uuid"
1379 fi
1380 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1381 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1382 unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1383 if [ "$current_partition" = "" ] ; then
1384 LogFile "WARNING: Unknown partition (outstring = $unofficial_outstring)"
1385 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1386 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1387 partition_mountpt=raid
1388 partition_format=raid
1389 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1390 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1391 else
1392 LogFile "WARNING: Unknown mountpoint (outstring = $unofficial_outstring)"
1393 fi
1394 elif [ "$partition_format" = "" ] ; then
1395 LogFile "WARNING: Unknown format (outstring = $unofficial_outstring)"
1396 elif [ "$partition_size" = "" ] ; then
1397 LogFile "WARNING: Unknown partition size (outstring = $unofficial_outstring)"
1398 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1399 continue
1400 else
1401 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1402 LogFile "WARNING: vfat should be used instead of dos/msdos as a partition format"
1403 partition_format="vfat"
1404 fi
1405 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1406 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1407 fi
1408 done
1409}
1410
1411CheckMountlist() {
1412 local file=$1
1413 # Coherency verification
1414 ML01=`cat $file | wc -l`
1415 ML02=`grep -v ' lvm ' $file | wc -l`
1416 ML1=`$AWK '{print $1}' $file | sort -u | wc -l`
1417 ML2=`grep -v ' lvm ' $file | $AWK '{print $2}' | sort -u | wc -l`
1418 if [ "$ML01" -ne "$ML1" ]; then
1419 LogFile "--------------------------------------------"
1420 LagAll "WARNING: Duplicate device entry in mountlist"
1421 LogFile "--------------------------------------------"
1422 fi
1423 if [ "$ML02" -ne "$ML2" ]; then
1424 LogFile "--------------------------------------------"
1425 LogAll "WARNING: Duplicate mountpoint entry in mountlist"
1426 LogFile "------------------------------------------------"
1427 fi
1428}
1429
1430MakeSureNumberIsInteger() {
1431 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1432 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1433 echo "result = '$res'"
1434 Die "$1 should be an integer"
1435 fi
1436}
1437
1438
1439OfferToMakeBootableISO() {
1440 local i old_pwd
1441 if [ -z "$ISO_CMD" ]; then
1442 LogIt "ERROR: Neither mkisofs nor genisoimage found, unable to make CD image"
1443 return
1444 fi
1445 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1446 echo -en "Shall I make a bootable CD image? (y/[n]) "
1447 read i
1448 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1449 fi
1450 rm -Rf $MINDI_TMP/iso
1451 mkdir -p $MINDI_TMP/iso/{images,archives}
1452 cp -f $MINDI_CACHE/{*.gz,*.img} $MINDI_TMP/iso/images 2>> $LOGFILE || LogIt "WARNING: OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1453 LogFile "INFO: mindi_lib = $MINDI_LIB"
1454 for i in memdisk memtest.bin memtest.img ; do
1455 j=$MINDI_LIB/$i
1456 k=$MINDI_TMP/iso
1457 if [ -e "$j" ] ; then
1458 LogIt "INFO: Copying $j to $k"
1459 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1460 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1461 if [ _"$MONDO_SHARE" != _"" ]; then
1462 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1463 fi
1464 fi
1465 done
1466 MakeMessageFile | cut -c1-80 > $MINDI_TMP/iso/message.txt
1467 if [ $KERNEL_IS_XEN = "yes" ]; then
1468 cp $xenkernelpath $MINDI_TMP/iso/xen.gz 2>> $LOGFILE || Die "Cannot copy xen.gz ($xenkernelpath) to mindi tmp ($MINDI_TMP/iso/xen.gz). Did you run out of disk space?"
1469 cp $MBOOTC32 $MINDI_TMP/iso/mboot.c32 2>> $LOGFILE || Die "Cannot copy mboot.c32 ($MBOOTC32) to mindi tmp ($MINDI_TMP/iso/mboot.c32). Did you run out of disk space?"
1470 fi
1471 cp $kernelpath $MINDI_TMP/iso/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/iso/vmlinuz). Did you run out of disk space?"
1472 cp $MINDI_TMP/initrd.img $MINDI_TMP/iso/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MINDI_TMP/iso/initrd.img. Did you run out of disk space?"
1473
1474 if [ _"$MONDO_SHARE" != _"" ]; then
1475 if [ $KERNEL_IS_XEN = "yes" ]; then
1476 cp $xenkernelpath $MONDO_ROOT/xen.gz 2>> $LOGFILE || Die "Cannot copy xen.gz ($xenkernelpath) to mindi tmp ($MINDI_TMP/iso/xen.gz). Did you run out of disk space?"
1477 cp $MBOOTC32 $MONDO_ROOT/mboot.c32 2>> $LOGFILE || Die "Cannot copy mboot.c32 ($MBOOTC32) to mindi tmp ($MINDI_TMP/iso/mboot.c32). Did you run out of disk space?"
1478 fi
1479 cp $kernelpath $MONDO_ROOT/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mondo root ($MONDO_ROOT/vmlinuz). Did you run out of disk space?"
1480 cp $MINDI_TMP/initrd.img $MONDO_ROOT/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MONDO_ROOT/initrd.img. Did you run out of disk space?"
1481 fi
1482 MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1483 if [ "$ARCH" != "ia64" ] ; then
1484 cp $ISOLINUX $MINDI_TMP/iso/isolinux.bin 2>> $LOGFILE || Die "Cannot copy isolinux.bin ($ISOLINUX) to $MINDI_TMP/iso - did you run out of disk space?"
1485 fi
1486 old_pwd=`pwd`
1487 cd "$MINDI_TMP/iso"
1488 if [ "$ARCH" != "ia64" ] ; then
1489 if [ _"$MONDO_SHARE" != _"" ]; then
1490 cp -f $MINDI_TMP/iso/{isolinux.cfg,initrd.img,vmlinuz,isolinux.bin,message.txt} $MONDO_ROOT 2>> $LOGFILE || Die "Cannot copy core files to ramdisk for boot disk (under $MONDO_ROOT). Did you run out of disk space?"
1491 if [ $KERNEL_IS_XEN = "yes" ]; then
1492 cp -f $MINDI_TMP/iso/{mboot.c32,xen.gz} $MONDO_ROOT 2>> $LOGFILE || Die "Cannot copy Xen core files to ramdisk for boot disk (under $MONDO_ROOT). Did you run out of disk space?"
1493 fi
1494 cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1495 fi
1496 $ISO_CMD -U $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table . > /dev/null 2> $MINDI_TMP/mkisofs.log
1497 else
1498 $ISO_CMD $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b images/mindi-bootroot.$BOOT_SIZE.img -c images/boot.cat -no-emul-boot . > /dev/null 2> $MINDI_TMP/mkisofs.log
1499 fi
1500 if [ "$?" -ne "0" ] ; then
1501 LogFile "----------- $ISO_CMD's errors --------------"
1502 LogAll "$ISO_CMD returned the following errors:"
1503 cat $MINDI_TMP/mkisofs.log | tee -a $LOGFILE
1504 LogIt "ERROR: Failed to create ISO image."
1505 else
1506 LogAll "INFO: Created bootable ISO image at $MINDI_CACHE/mindi.iso"
1507 fi
1508 rm -f $MINDI_TMP/mkisofs.log
1509 cd "$old_pwd"
1510}
1511
1512
1513OfferToMakeBootableUSB() {
1514 local i
1515 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1516 echo -n "Shall I make a bootable USB device ? (y/[n]) "
1517 read i
1518 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1519 if [ "$USBDEVICE" = "" ]; then
1520 echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1521 read dev
1522 USBDEVICE=$dev
1523 fi
1524 echo "WARNING: This will erase all content on $USBDEVICE"
1525 echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1526 read i
1527 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1528 fi
1529 rm -Rf $MINDI_TMP/usb
1530 mkdir -p $MINDI_TMP/usb
1531 USBPART="${USBDEVICE}1"
1532
1533 echo -en "Transforming $USBDEVICE in a Bootable device "
1534 echo -en "."
1535 LogFile "INFO: Transforming $USBDEVICE in a Bootable device"
1536 LogFile "INFO: Checking $USBDEVICE"
1537 $FDISK -l $USBDEVICE 2>&1 >> $LOGFILE
1538 if [ $? -ne 0 ]; then
1539 LogAll "ERROR: Unable to access $USBDEVICE"
1540 LogAll " Make sure your USB device is pluged in"
1541 MindiExit -1
1542 fi
1543 echo -en "."
1544 LogFile "INFO: Unmounting $USBPART just in case"
1545 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1546 # If your key has no MBR it may cause an issue
1547 # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1548 if [ -r $MBRFILE ]; then
1549 LogAll "INFO: Installing an MBR ($MBRFILE) on $USBDEVICE"
1550 dd if=$MBRFILE of=$USBDEVICE
1551 else
1552 LogAll "WARNING: You may need to install an MBR (usually in $MBRFILE, but not found on your system)"
1553 LogAll " on $USBDEVICE with dd if=$MBRFILE of=$USBDEVICE"
1554 fi
1555 LogFile "INFO: Preparing $USBDEVICE"
1556 cat > $MINDI_TMP/fdisk.txt << EOF
1557d
1558d
1559d
1560d
1561n
1562p
15631
1564
1565
1566t
1567b
1568a
15691
1570w
1571EOF
1572 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE < $MINDI_TMP/fdisk.txt
1573 if [ $? -ne 0 ]; then
1574 LogAll "ERROR: Unable to create a vfat Filesystem on $USBDEVICE"
1575 LogAll " Make sure your USB device is pluged in"
1576 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1577 MindiExit -1
1578 fi
1579 LogFile "fdisk build file"
1580 LogFile "----------------"
1581 cat $MINDI_TMP/fdisk.txt >> $LOGFILE
1582 LogFile "----------------"
1583 rm -f $MINDI_TMP/fdisk.txt
1584 LogFile "INFO: The USB device $USBDEVICE now looks like this:"
1585 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1586 echo -en "."
1587 # Some distro do auto mount at that point (Ubuntu)
1588 LogFile "INFO: Unmounting $USBPART just in case again"
1589 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1590 echo -en "."
1591 LogFile "INFO: Creating a vfat filesystem on $USBPART"
1592 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1593 if [ $? -ne 0 ]; then
1594 LogAll "ERROR: Unable to create a vfat filesystem on $USBPART"
1595 LogAll " Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)"
1596 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1597 MindiExit -1
1598 fi
1599 echo -en "."
1600 LogFile "INFO: Mounting $USBPART on $MINDI_TMP/usb"
1601 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1602 if [ $? -ne 0 ]; then
1603 LogAll "ERROR: Unable to mount $USBPART on $MINDI_TMP/usb"
1604 LogAll " Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)"
1605 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1606 MindiExit -1
1607 fi
1608 echo -en "."
1609 mkdir -p $MINDI_TMP/usb/images
1610 cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogIt "ERROR: OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1611 echo -en "."
1612 LogFile "INFO: mindi_lib = $MINDI_LIB"
1613 for i in memdisk memtest.bin memtest.img ; do
1614 j=$MINDI_LIB/$i
1615 k=$MINDI_TMP/usb
1616 if [ -e "$j" ] ; then
1617 LogIt "INFO: Copying $j to $k"
1618 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1619 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1620 fi
1621 done
1622 echo -en "."
1623 MakeMessageFile | cut -c1-80 > $MINDI_TMP/usb/message.txt
1624 echo -en "."
1625 cp $kernelpath $MINDI_TMP/usb/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/usb/vmlinuz). Did you run out of disk space?"
1626 echo -en "."
1627 cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1628 echo -en "."
1629 MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1630 echo -en "."
1631 LogAll "----------- syslinux's conf --------------"
1632 cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
1633 LogAll "------------------------------------------"
1634 umount $MINDI_TMP/usb
1635 if [ "$ARCH" != "ia64" ] ; then
1636 syslinux -v 2>&1 | grep -q 4.02
1637 if [ $? -eq 0 ]; then
1638 # This buggy version of syslinux requires a call to --stupid and not -s
1639 syslinux --stupid $USBPART 2>> $MINDI_TMP/syslinux.log
1640 res=$?
1641 else
1642 syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1643 res=$?
1644 fi
1645 if [ $res -ne 0 ] ; then
1646 LogAll "----------- syslinux's errors --------------"
1647 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1648 LogAll "------------------------------------------"
1649 LogIt "ERROR: Failed to create USB image."
1650 else
1651 echo -e "$DONE"
1652 LogFile "INFO: Created bootable USB image on $USBDEVICE"
1653 fi
1654 rm -f $MINDI_TMP/syslinux.log
1655 else
1656 LogAll "ERROR: No USB boot support for ia64"
1657 MindiExit -1
1658 fi
1659}
1660
1661
1662MakeMessageFile() {
1663
1664 if [ -x "/bin/lsb_release" ]; then
1665 DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
1666 elif [ -r /etc/arch-release ]; then # this code must be written before /etc/issue test to avoid errors
1667 DESC="Arch Linux"
1668 if [ -r /var/log/pacman.log ]; then
1669 # there are no releases but we can get the last system upgrade
1670 # Output example: Arch Linux [2011-03-03 01:39]
1671 DESC="$DESC $(tac /var/log/pacman.log | grep -m1 'full system upgrade' | cut -d']' -f1)]"
1672 fi
1673 elif [ -r /etc/issue.net ]; then
1674 DESC=`head -1 /etc/issue.net`
1675 elif [ -r /etc/issue ]; then
1676 DESC=`head -1 /etc/issue`
1677 elif [ -x "/usr/bin/pbdistrocheck" ]; then
1678 # For pb >= 0.9.8
1679 DESC=`/usr/bin/pbdistrocheck -s | cut -d, -f1-4`
1680 else
1681 DESC="Unknown desc"
1682 fi
1683 sed "s/ZZZZZ/$MINDI_VERSION/" $MINDI_LIB/msg-txt | sed "s/KKKKK/Kernel $KERVER/" | sed "s/AAAAA/on a $ARCH architecture/" | sed "s/TTTTT/`LC_TIME=C date`/" | sed "s/MMMMM/`hostname`/" | sed "s/DDDDD/$DESC/"
1684 if [ _"$MONDO_SHARE" != _"" ]; then
1685 if [ "$CDRECOVERY" != "yes" ] ; then
1686 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1687 echo -en "Press <enter> to continue.\n"
1688 elif [ ! "$MINDI_TMP" ] ; then
1689 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1690 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1691 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1692 fi
1693 else
1694 echo -en "$BOOT_MEDIA_MESSAGE"
1695 fi
1696 else
1697 echo -en "\
1698To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1699CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1700 fi
1701 fi
1702 echo -en "\n\n\n"
1703}
1704
1705
1706MakeBootConfFile() {
1707 local options i ooo
1708 options=""
1709 # Type of boot file (elilo or syslinux/isolinux)
1710 type=$1
1711 if [ "$type" = "elilo" ]; then
1712 sep="="
1713 else
1714 sep=" "
1715 fi
1716
1717 # Generic header for conf file
1718 if [ "$type" != "elilo" ] ; then
1719 echo -en "prompt 1\ndisplay message.txt\n"
1720 else
1721 echo -en "prompt\n"
1722 fi
1723
1724 # Compute which default option to boot from
1725 if [ "$CDRECOVERY" = "yes" ] ; then
1726 echo -en "default${sep}RESTORE\n"
1727 # In case it's mondoarchive
1728 elif [ _"$MONDO_SHARE" != _"" ]; then
1729 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1730 echo -en "default${sep}iso\n"
1731 else
1732 echo -en "default${sep}interactive\n"
1733 fi
1734 else
1735 echo -en "default${sep}expert\n"
1736 fi
1737
1738 # Handle timeout
1739 if [ "$CDRECOVERY" != "yes" ] ; then
1740 echo -en "timeout${sep}300\n"
1741 else
1742 echo -en "timeout${sep}10000\n"
1743 fi
1744 echo -en "\n"
1745
1746 # prepare which labels will be generated
1747 if [ "$CDRECOVERY" = "yes" ] ; then
1748 options="RESTORE expert"
1749 else
1750 if [ _"$MONDO_SHARE" != _"" ]; then
1751 options="interactive expert compare iso nuke isonuke"
1752 else
1753 options="expert"
1754 fi
1755 fi
1756
1757 # Generate rest of conf file
1758 for i in $options ; do
1759 ooo=$i
1760 [ "$ooo" = "RESTORE" ] && ooo="nuke"
1761 if [ "$type" = "elilo" ]; then
1762 outstr="image=/vmlinuz\n\tlabel=$i\n\tinitrd=/initrd.img\n\troot=/dev/ram0 append=\" rw ramdisk_size=$ramdisk_size $ooo $MINDI_ADDITIONAL_BOOT_PARAMS \"\n"
1763 else
1764 ps="/"
1765 if [ "$type" = "syslinux" ]; then
1766 ps=""
1767 fi
1768 if [ $KERNEL_IS_XEN = "no" ]; then
1769 outstr="label $i\n\tkernel ${ps}vmlinuz\n\tappend initrd=${ps}initrd.img root=/dev/ram0 rw ramdisk_size=$ramdisk_size ${ooo} $MINDI_ADDITIONAL_BOOT_PARAMS\n"
1770 else
1771 outstr="label $i\n\tkernel ${ps}mboot.c32\n\tappend ${ps}xen.gz --- ${ps}vmlinuz root=/dev/ram0 rw ramdisk_size=$ramdisk_size ${ooo} $MINDI_ADDITIONAL_BOOT_PARAMS --- ${ps}initrd.img\n"
1772 fi
1773 fi
1774 echo -en "$outstr"
1775 done
1776 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1777 if [ "$type" = "elilo" ]; then
1778 echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1779 echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
1780 else
1781 ps="/"
1782 if [ "$type" = "syslinux" ]; then
1783 ps=""
1784 fi
1785 echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1786 echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
1787 fi
1788 fi
1789}
1790
1791
1792PrepareBootDiskImage_LILO() {
1793 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1794 imagesdir=$MINDI_CACHE
1795 kernelpath=$1
1796
1797 retval=0
1798 [ ! -e "$kernelpath" ] && Die "PBDI lilo - cannot find $kernelpath kernel"
1799 echo -en "Making "$BOOT_SIZE"KB boot disk..."
1800 TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
1801 echo -en "..."
1802 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1803 mountpoint=$MINDI_TMP/mountpoint.$$
1804 mkdir -p $mountpoint
1805 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1806 mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1807 mount -t vfat -o loop $imagefile $mountpoint || LogIt "ERROR: Cannot mount (PBDI)"
1808 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1809 mkdir -p $mountpoint/etc
1810 liloconf=$mountpoint/elilo.conf
1811
1812 MakeBootConfFile elilo > $liloconf
1813
1814 # Copy it so that CD-ROM menu entry is satisfied
1815 mountefi=0
1816 df -T | grep /boot/efi | grep -q vfat
1817 if [ $? -ne 0 ]; then
1818 mount /boot/efi
1819 if [ $? -ne 0 ]; then
1820 echo "You have to mount your EFI partition when using mindi"
1821 MindiExit -1
1822 fi
1823 mountefi=1
1824 fi
1825 el=`find /boot/efi -name elilo.efi`
1826 cp $el $mountpoint
1827 cp $liloconf $mountpoint
1828 if [ $mountefi -eq 1 ]; then
1829 umount /boot/efi 2>&1 > /dev/null
1830 fi
1831
1832 LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint..."
1833 cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1834 if [ "$?" -ne "0" ] ; then
1835 LogIt "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1836 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1837 LogIt " Please unload some of your modules and try again. Or increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1838 rm -f $MINDI_TMP/mtpt.$$
1839 LogIt "ERROR: Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1840 retval=$(($retval+1))
1841 fi
1842 MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
1843
1844 mkdir -p $mountpoint/tmp
1845 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1846 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1847 fi
1848
1849 # copy the kernel across
1850 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1851 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1852 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1853 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
1854 if [ "$?" -ne "0" ] ; then
1855 LogFile "INFO: Files at mountpoint ($mountpoint) :"
1856 du -sk $mountpoint/* >> $LOGFILE
1857 LogFile "--- end of list of files ---"
1858 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
1859 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1860 cd "$old_pwd"
1861 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1862 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1863 # losetup /dev/loop0 -d
1864 [ "$imagefile" != "" ] && rm -f $imagefile
1865 LogIt "ERROR: Sorry, your kernel is too big for your image"
1866 Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1867 return 0
1868 fi
1869 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1870 LogFile "INFO: Free space left on image = $free_space KB"
1871 LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
1872 # make it bootable
1873 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1874 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1875 if [ "$KERN_DISK_MADE" ] ; then
1876 LogFile "INFO: Not running LILO. It's not that kind of disk."
1877 fi
1878
1879 cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1880 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1881 echo -en "..."
1882 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1883 if [ "$retval" -eq "0" ] ; then
1884 echo -en "...$DONE\n"
1885 if [ "$KERN_DISK_MADE" ] ; then
1886 LogIt "INFO: $BOOT_SIZE KB boot disks were created OK\n"
1887 fi
1888 else
1889 echo -en "...failed\n"
1890 LogIt "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
1891 [ "$imagefile" != "" ] && rm -f $imagefile
1892 fi
1893 [ "$retval" -ne "0" ] && LogIt "WARNING: PrepareBootDiskImage() is returning nonzero"
1894 return $retval
1895}
1896
1897
1898PrepareBootDiskImage_ISOLINUX() {
1899 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1900 imagesdir=$MINDI_CACHE
1901 kernelpath=$1
1902 do_boot_root_thingy=""
1903 local retval old_pwd
1904 retval=0
1905
1906 [ ! -e "$kernelpath" ] && Die "PBDI isolinux - cannot find $kernelpath kernel"
1907 echo -en "Making "$BOOT_SIZE"KB boot disk..."
1908 TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
1909 echo -en "..."
1910 imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
1911 mountpoint=$MINDI_TMP/mountpoint.$$
1912 mkdir -p $mountpoint
1913 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1914 LogFile "INFO: Creating vfat filesystem on $imagefile"
1915 mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1916 # syslinux should be run on a local file (doen't work through NFS Cf: #297)
1917 syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1918
1919 # Only move it now to its final destination and use it now
1920 mv $imagefile $imagesdir
1921 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1922
1923 mount -t vfat -o loop $imagefile $mountpoint || LogIt "ERROR: Cannot mount (PBDI)"
1924
1925 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1926 MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
1927 MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1928 LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..."
1929 cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1930 if [ "$?" -ne "0" ] ; then
1931 LogAll "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1932 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1933 LogAll " Please unload some of your modules and try again."
1934 rm -f $MINDI_TMP/mtpt.$$
1935 LogAll " Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)."
1936 LogAll " Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1937 retval=$(($retval+1))
1938 fi
1939
1940 mkdir -p $mountpoint/tmp
1941 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1942 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1943 fi
1944
1945 # copy the kernel across
1946 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1947 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1948 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1949
1950 retval=0
1951 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1952 retval=$?
1953 if [ $KERNEL_IS_XEN = "yes" ]; then
1954 cp -f $xenkernelpath $mountpoint/xenkernel &> /dev/null
1955 let retval+=$?
1956 fi
1957
1958 if [ "$retval" -ne "0" ] ; then
1959 LogFile "INFO: Files at mountpoint ($mountpoint) :"
1960 du -sk $mountpoint/* >> $LOGFILE
1961 LogFile "--- end of list of files ---"
1962 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
1963 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1964 cd "$old_pwd"
1965 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1966 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1967
1968 LogIt "ERROR: Sorry, your kernel is too big for your image"
1969 Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1970 fi
1971 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1972 LogFile "INFO: Free space left on image = $free_space KB"
1973 LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
1974
1975 # make it bootable
1976 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1977 mkdir -p $mountpoint/etc
1978 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1979 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1980 echo -en "..."
1981 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1982
1983 if [ "$retval" -eq "0" ] ; then
1984 echo -en "...$DONE\n"
1985 if [ "$KERN_DISK_MADE" ] ; then
1986 [ "$imagefile" != "" ] && rm -f $imagefile
1987 LogIt "INFO: $BOOT_SIZE KB boot disks were created OK\n"
1988 fi
1989 else
1990 echo -en "...failed\n"
1991 LogIt "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
1992 [ "$imagefile" != "" ] && rm -f $imagefile
1993 fi
1994 [ "$retval" -ne "0" ] && LogIt "ERROR: PrepareBootDiskImage() is returning nonzero"
1995 return $retval
1996}
1997
1998
1999ParseModprobeForIncludes() {
2000local MODPROBE_CONF mpincfile includes include
2001
2002MODPROBE_CONF=/etc/modprobe.conf
2003mpincfile=$1
2004touch $mpincfile
2005if [ -a $MODPROBE_CONF ]; then
2006 includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
2007 if [ -n "$includes" ]; then
2008 for include in $includes
2009 do
2010 if [ -a "$include" ]; then
2011 echo $include >> $mpincfile
2012 fi
2013 done
2014 fi
2015fi
2016}
2017
2018
2019PrepareDataDiskImages() {
2020 local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
2021
2022 imagesdir=$MINDI_CACHE
2023 rm -f $imagesdir/mindi.iso
2024 needlist=$MINDI_TMP/what-we-need.txt
2025 bigdir=$MINDI_TMP/bigdir
2026 mkdir -p $bigdir/usr/bin
2027 mkdir -p $bigdir/usr/sbin
2028 includefile=$MINDI_TMP/$$.includefile.txt
2029
2030 if [ -e "$DEPLIST_FILE" ]; then
2031 lfiles="$DEPLIST_FILE $DEPLIST_DIR/*"
2032 else
2033 lfiles="$DEPLIST_DIR/*"
2034 fi
2035 lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
2036 ParseModprobeForIncludes $includefile
2037 lines=$(($lines+`cat $includefile | wc -l`))
2038 cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
2039 res=$?
2040 rm -f $includefile
2041 if [ "$YOUR_KERNEL_SUCKS" ]; then
2042 pwd=`pwd`
2043 cd "$MINDI_TMP"
2044 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2045 tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
2046 done
2047 for i in $EXTRA_MODS ; do
2048 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
2049 [ ! "$j" ] && LogFile "WARNING - cannot find failsafe module $i.o.gz"
2050 for k in $j ; do
2051 tar cf - $k 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "ERROR: module $k extraction issue" $MINDI_TMP/$$.log
2052 LogFile "INFO: Added failsafe module $k to ramdisk"
2053 done
2054 done
2055 cd "$pwd"
2056 else
2057 ListKernelModulePaths >> $needlist
2058 fi
2059 if [ "$res" -ne "0" ] ; then
2060 Die "You have $res files present in dependency list\nbut absent from filesystem."
2061 fi
2062 FindAndAddUserKeyboardMappingFile
2063 mkdir -p $bigdir/tmp
2064 if [ _"$MONDO_SHARE" != _"" ]; then
2065 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2066 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
2067 fi
2068 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2069 DropOptimizedLibraries $needlist $bigdir
2070 echo -en "Assembling dependency files"
2071 CopyDependenciesToDirectory < $needlist $bigdir
2072
2073 # also copy io.sys and msdos.sys, if we can find them
2074 for i in `mount | cut -d' ' -f3` ; do
2075 for j in io.sys msdos.sys ; do
2076 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
2077 done
2078 done
2079
2080 # master boot record, too
2081 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2082 if [ "$i" ] ; then
2083 LogIt "INFO: Backing up $i's MBR"
2084 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2085 sleep 1
2086 sync
2087 j=$i
2088 [ -h "$j" ] && j=`readlink -f $j`
2089 LogIt "INFO: Creating /dev/boot_device ($j)"
2090 mkdir -p $bigdir/dev
2091 cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
2092 fi
2093
2094 old_pwd=`pwd`
2095 cd "$bigdir"
2096
2097 # Get terminfo content
2098 ti="usr/share/terminfo/l"
2099 if [ -d /$ti ]; then
2100 mkdir -p $ti
2101 cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogIt "ERROR: issue copying terminfo"
2102 fi
2103 if [ -e "$MONDO_SHARE/restore-scripts" ]; then
2104 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2105 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2106 fi
2107 if [ -d "/lib/dev-state" ]; then
2108 tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
2109 fi
2110 cd "$old_pwd"
2111 echo -e "$DONE"
2112 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2113 MakeMountlist $MINDI_TMP/mountlist.txt
2114 CheckMountlist $MINDI_TMP/mountlist.txt
2115 mkdir -p $bigdir/tmp
2116 cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
2117 if [ _"$MONDO_SHARE" != _"" ]; then
2118 cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
2119 fi
2120 if [ $LVM != "false" ]; then
2121 $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
2122 if [ "$?" -ne "0" ]; then
2123 LVM="false"
2124 rm -f $bigdir/tmp/i-want-my-lvm
2125 else
2126 LogFile "Your i-want-my-lvm file content is:"
2127 LogFile "-----------------------------------"
2128 cat $bigdir/tmp/i-want-my-lvm >> $LOGFILE
2129 LogFile "-----------------------------------"
2130 fi
2131 fi
2132 LogFile "Your mountlist.txt file content is:"
2133 LogFile "-----------------------------------"
2134 cat $bigdir/tmp/mountlist.txt >> $LOGFILE
2135 LogFile "-----------------------------------"
2136
2137 echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
2138 echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
2139 if [ _"$MONDO_SHARE" != _"" ]; then
2140 for q in filelist.full.gz biggielist.txt ; do
2141 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2142 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
2143 done
2144 fi
2145
2146 echo -en "Tarring and zipping the data content..."
2147 size_of_all_tools=`du -sk $bigdir | cut -f1`
2148 (cd "$bigdir" ; tar -b 4096 -cf - . 2>> $MINDI_TMP/$$.log | gzip -9 > $imagesdir/all.tar.gz || LogIt "ERROR: Problem creating all.tar.gz" $MINDI_TMP/$$.log)
2149 du -sk $imagesdir/*gz >> $LOGFILE
2150 echo -e "$DONE"
2151
2152 FRIENDLY_OUTSTRING="Boot and data disk images were created."
2153 rm -rf $bigdir
2154 rm -f $needlist
2155}
2156
2157
2158ProcessLDD() {
2159 local incoming f d nd bd bnd
2160 read incoming
2161 while [ "$incoming" != "" ]; do
2162 # We take the full path name of the dyn. lib. we want
2163 incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
2164 for f in $incoming ; do
2165 # echo modified file name if one of the parent dir is a link
2166 # by replacing the original dirname by the destination of the link
2167 d="`dirname $f`"
2168 found="false"
2169 while [ "$d" != "/" ]; do
2170 if [ -h "$d" ]; then
2171 nd=`readlink -f $d`
2172 bd=`basename $d`
2173 bnd=`basename $nd`
2174 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2175 echo $d
2176 fi
2177 d="`dirname $d`"
2178 done
2179
2180 echo "$f"
2181 echo "`ReadAllLink $f`"
2182 done
2183 read incoming
2184 done
2185}
2186
2187
2188Prompt() {
2189 echo -en "$1"
2190 read line
2191}
2192
2193
2194ReadLine() {
2195 local i incoming
2196 read incoming
2197 i=0
2198 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2199 i=$(($i+1))
2200 read incoming
2201 done
2202 echo "$incoming"
2203}
2204
2205
2206SizeOfPartition() {
2207 local devpath drive res stub
2208 device=$1
2209 if [ "`echo "$device" | grep -E "^/dev/"`" = "" ] ; then
2210 Die "Cannot find $device's size - is your /etc/fstab sane?"
2211 fi
2212 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2213 res=`SizeOfRaidPartition $device`
2214 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2215 echo "$res"
2216 return 0
2217 fi
2218 # patch from Bill <bill@iwizard.biz> - 2003/08/25
2219 res=`$FDISK -s $device 2>> $LOGFILE`
2220 # end patch
2221 # take only the first in case of multiple mount (cifs, nfs, ...)
2222 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
2223 [ "$res" = "" ] && res="-1"
2224 echo $res
2225 return 0
2226}
2227
2228
2229SizeOfRaidPartition() {
2230 local real_dev smallest_size silly tmp
2231
2232 silly=999999999
2233 smallest_size=$silly
2234
2235 for real_dev in `GetRaidDevMembers $1` ; do
2236 tmp=`SizeOfPartition $real_dev`
2237 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2238 done
2239
2240 if [ "$smallest_size" = "$silly" ] ; then
2241 echo "-1"
2242 return 1
2243 else
2244 echo "$smallest_size"
2245 return 0
2246 fi
2247}
2248
2249
2250StripComments()
2251{
2252 local tempfile
2253
2254 tempfile=$MINDI_TMP/$$.strip.txt
2255 cp -f $1 $tempfile 2>> $LOGFILE
2256 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2257 rm -f $tempfile
2258 LogFile "INFO: Stripped comments from $2"
2259}
2260
2261
2262
2263StripExecutable()
2264{
2265 local tmpfile
2266
2267 tmpfile=$MINDI_TMP/stripped.$$.dat
2268 [ -d "$1" ] || [ -h "$1" ] && return
2269 cp -f $1 $tmpfile 2>> $LOGFILE
2270 strip $tmpfile 2> /dev/null
2271 if [ "$?" -eq "0" ] ; then
2272 cp -f $tmpfile $1 2>> $LOGFILE
2273 LogFile "INFO: Stripped binary $2"
2274 fi
2275 rm -f $tmpfile
2276}
2277
2278KernelVer() {
2279 local fkern_ver fname
2280
2281 fname=$1
2282 file $fname | grep -q gzip
2283 if [ "$?" -eq "0" ] ; then
2284 # Used by ia64
2285 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2286 else
2287 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2288 fi
2289 echo "$fkern_ver"
2290}
2291
2292
2293# WARNING: This function should just echo the final result !!!
2294#
2295TryToFindKernelPath() {
2296 local fname fkern_ver we_want_version possible_kernels noof_kernels possible_xenkernels noof_xenkernels kp kdate duff_kernels output root
2297
2298 we_want_version=$KERVERRUN
2299 possible_kernels=""
2300 duff_kernels=""
2301 output=""
2302
2303 if [ "$ARCH" = "ia64" ] ; then
2304 root="/boot/efi/efi"
2305 else
2306 root="/"
2307 fi
2308 # See if we're booted from a Xen kernel
2309 # From http://wiki.xensource.com/xenwiki/XenCommonProblems#head-26434581604cc8357d9762aaaf040e8d87b37752
2310 if [ -f /proc/xen/capabilities ]; then
2311 # It's a Xen kernel
2312 KERNEL_IS_XEN="yes"
2313 LogFile "INFO: It's a Xen kernel..."
2314 fi
2315
2316 for fname in `find $root -maxdepth 2 -type f | grep -Ei 'lin|kern|xen' | grep -Ev '^/proc/|^/net/'` ; do
2317 [ ! -e "$fname" ] && continue
2318 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2319 fkern_ver=`KernelVer $fname`
2320 [ "$fkern_ver" = "" ] && continue
2321 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2322 [ -f "$fname" ] || continue
2323 [ -h "$fname" ] && continue
2324 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2325 file $fname | grep -q gzip
2326 if [ "$?" -eq "0" ] ; then
2327 # Used by ia64
2328 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2329 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2330 duff_kernels="$fname $duff_kernels"
2331 else
2332 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2333 possible_kernels="$fname $possible_kernels"
2334 fi
2335 else
2336 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2337 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2338 duff_kernels="$fname $duff_kernels"
2339 else
2340 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2341 possible_kernels="$fname $possible_kernels"
2342 fi
2343 fi
2344 done
2345 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2346 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2347 fi
2348 if [ ! "$possible_kernels" ] ; then
2349 LogFile "INFO: No kernel matches exactly. Are there any duff kernels?"
2350 possible_kernels="$duff_kernels"
2351 if [ ! "$possible_kernels" ] ; then
2352 LogFile "INFO: Sorry, no duff kernels either"
2353 else
2354 LogFile "INFO: I bet you're running Debian or Gentoo, aren't you?"
2355 LogFile "INFO: Your kernel doesn't have a sane builddate. Oh well..."
2356 fi
2357 fi
2358 if [ $KERNEL_IS_XEN = "yes" ]; then
2359 possible_xenkernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -i "xen" | sort -u | tr '\n' ' '`
2360 noof_xenkernels=`CountItemsIn "$possible_xenkernels"`
2361 FindMboot32Binary
2362 fi
2363 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -vi "xen" | sort -u | tr '\n' ' '`
2364 noof_kernels=`CountItemsIn "$possible_kernels"`
2365 if [ "$noof_kernels" -eq "0" ] ; then
2366 LogFile "Could not find your kernel."
2367 if [ -e "/boot/vmlinuz" ] ; then
2368 LogFile "INFO: Using /boot/vmlinuz as a last resort."
2369 output=/boot/vmlinuz
2370 else
2371 output=""
2372 fi
2373 elif [ "$noof_kernels" -eq "1" ] ; then
2374 kp=`echo "$possible_kernels" | sed s/' '//`
2375 LogFile "INFO: Your kernel is $kp (v$KERVERRUN)"
2376 output="$kp"
2377 else
2378 for i in $possible_kernels ; do
2379 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2380 LogFile "INFO: OK, I used my initiative and found that "
2381 LogFile "INFO: $i is probably your kernel. "
2382 output="$i"
2383 break
2384 fi
2385 done
2386 if [ ! -n "$output" ]; then
2387 if [ "`echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null`" ]; then
2388 output=/boot/vmlinuz
2389 LogFile "INFO: Schlomo, this one's for you."
2390 else
2391 LogFile "INFO: Two or more possible kernels found. You may specify any one of them and the "
2392 LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2393 LogFile "INFO: $possible_kernels"
2394 output=""
2395 fi
2396 fi
2397 fi
2398 if [ $KERNEL_IS_XEN = "yes" ]; then
2399 if [ "$noof_xenkernels" -eq "0" ]; then
2400 xenkernelpath=""
2401 elif [ "$noof_xenkernels" -eq "1" ]; then
2402 xenkernelpath=`echo "$possible_xenkernels" | sed s/' '//`
2403 LogFile "INFO: Your Xen kernel is $xenkernelpath (v$KERVERRUN)"
2404 else
2405 for i in $possible_xenkernels ; do
2406 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2407 LogFile "INFO: OK, I used my initiative and found that "
2408 LogFile "INFO: $i is probably your Xen kernel. "
2409 xenkernelpath="$i"
2410 break
2411 fi
2412 done
2413 if [ ! -n "$xenkernelpath" ]; then
2414 new_possible_xenkernels=`echo "$possible_xenkernels" | tr -s ' ' '\n' | grep -E "^/boot" | sort -u | tr '\n' ' '`
2415 if [ ! -n "$new_possible_xenkernels" ]; then
2416 xenkernelpath=`echo $new_possible_xenkernels | tr -s ' ' '\n' | head -1`
2417 LogFile "INFO: Using $xenkernelpath"
2418 else
2419 LogFile "INFO: Two or more possible Xen kernels found. You may specify any one of them and the "
2420 LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2421 LogFile "INFO: $possible_xenkernels"
2422 output=""
2423 xenkernelpath=`echo $possible_xenkernels | tr -s ' ' '\n' | head -1`
2424 LogFile "INFO: Using $xenkernelpath"
2425 fi
2426 fi
2427 fi
2428 if [[ -z "$xenkernelpath" || ! -f "$xenkernelpath" ]]; then
2429 Die "Cannot find Xen kernel $xenkernelpath, aborting"
2430 fi
2431 fi
2432 LogAll "TryToFindKernelPath found $output"
2433 echo "$output"
2434}
2435
2436
2437TurnTgzIntoRdz() {
2438 local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2439
2440 tgz_dir_fname=$1
2441 rdz_fname=$2
2442 kernelsize=$3
2443 maxsize=$(($BOOT_SIZE-$kernelsize))
2444 maxsize=$(($maxsize*2)); # to allow for compression of 50%
2445 tempfile=$MINDI_TMP/temp.rd
2446 mountpoint=$MINDI_TMP/mnt1
2447 res=0
2448 echo -en "..."
2449 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2450 echo -en "..."
2451 LogFile "INFO: Creating ext2 filesystem on $tempfile"
2452 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2453 echo -en "..."
2454 mkdir -p $mountpoint
2455 mount -t ext2 -o loop $tempfile $mountpoint || Die "Cannot loopmount $tempfile to $mountpoint! The reason may be missing support for loopfs or ext2 (or both) in the running kernel."
2456 echo -en "..."
2457 old_pwd=`pwd`
2458 cd "$mountpoint"
2459
2460 # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
2461 if [ -h "/lib64" ]; then
2462 mkdir -p lib || LogIt "ERROR: Unable to create lib in $mountpoint."
2463 ln -s lib lib64 || LogIt "ERROR: /lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2464 fi
2465
2466 # Check files before copying to discover configuration issues or McAfee preventing mindi reading these files
2467 for f in $tgz_dir_fname/*; do
2468 if [ ! -r $f ]; then
2469 Die "ERROR: Unable to copy $f to the target dir. Check your installation or McAfee presence"
2470 else
2471 cp -Rdf $f . 2>&1 >> $LOGFILE
2472 fi
2473 done
2474 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2475
2476 cd dev || Die "Can't cd to dev"
2477 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2478 rm -f dev-entries.tgz
2479 cd ..
2480
2481 for w in insmod.static insmod.static.old ; do
2482 s=`which $w 2> /dev/null`
2483 if [ -e "$s" ] ; then
2484 tar cf - -C / $s 2> /dev/null | tar xf -
2485 fi
2486 done
2487
2488 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2489
2490 # Copy of files mandatory for ssh to automate mount if sshfs is used
2491 mkdir $mountpoint/.ssh
2492 cp -rp ~root/.ssh/* $mountpoint/.ssh 2> /dev/null
2493 echo > $mountpoint/tmp/myssh << EOF
2494ssh -o StrictHostKeyChecking=no $*
2495EOF
2496 chmod 755 $mountpoint/tmp/myssh
2497
2498 # Copy of files mandatory for ld.so
2499 cp -rp /etc/ld.so.c* $mountpoint/etc
2500
2501 # Handle the case where busybox and mount are dynamically linked
2502 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2503 if [ $? -eq 0 ]; then
2504 # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2505 rm -f bin/mount
2506 fi
2507
2508 # Copy of files from the minimal env needed as per the deplist.d/minimal.conf file (which includes all busybox deps)
2509 minimallis=`grep -Ev '^#' $DEPLIST_DIR/minimal.conf`
2510 rm -f $MINDI_TMP/minimal.lis
2511 for f in $MINDI_LIB/rootfs/bin/busybox $minimallis; do
2512 echo $f >> $MINDI_TMP/minimal.lis
2513 done
2514 LocateDeps $MINDI_LIB/rootfs/bin/busybox $minimallis >> $MINDI_TMP/minimal.lis
2515 for f in `cat $MINDI_TMP/minimal.lis`; do
2516 echo "`ReadAllLink $f`" >> $MINDI_TMP/minimal.lis
2517 done
2518 # Initial / are trucated by tar
2519 tar cf - `sort -u $MINDI_TMP/minimal.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in minimal analysis" $MINDI_TMP/$$.log
2520 rm -f $MINDI_TMP/minimal.lis
2521
2522 # Avoids an issue on some distro (RHEL5)
2523 rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2524
2525 mkdir -p $mountpoint/tmp
2526 # Management of udev (which includes modprobe in rules)
2527 ps auxww | grep -v grep | grep -qw udevd
2528 if [ $? -eq 0 ]; then
2529 echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2530 LogIt "INFO: udev device manager found"
2531 tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2532 # This avoids NIC remapping if on another machine at restore time on Debian at least
2533 rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2534 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2535 rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2536 # Do not do it if it's a link (Ubuntu 64 bits #503)
2537 if [ -e "/lib64/udev" ] && [ ! -h "/lib64" ] && [ ! -h "/lib64/udev" ]; then
2538 tar cf - -C / /lib64/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib64/udev analysis" $MINDI_TMP/$$.log
2539 fi
2540 if [ -e "/lib32/udev" ] && [ ! -h "/lib32" ] && [ ! -h "/lib32/udev" ]; then
2541 tar cf - -C / /lib32/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib32/udev analysis" $MINDI_TMP/$$.log
2542 fi
2543 if [ -e "/lib/udev" ] && [ ! -h "/lib" ] && [ ! -h "/lib/udev" ]; then
2544 tar cf - -C / /lib/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2545 fi
2546 if [ -x /sbin/udevd ] || [ -x /usr/bin/udevd ]; then
2547 lis2=`grep -Ev '^#' $DEPLIST_DIR/udev.conf`
2548 lis=""
2549 # Get only the files which exist in that list
2550 # and potentially their symlink structure
2551 for i in $lis2; do
2552 if [ -h $i ]; then
2553 j=$i
2554 while [ -h $j ]; do
2555 lis="$lis $j"
2556 j=`readlink $j`
2557 done
2558 lis="$lis $j"
2559 elif [ -f $i ]; then
2560 lis="$lis $i"
2561 fi
2562 done
2563 # And their deps
2564 LocateDeps $lis > $MINDI_TMP/udev.lis
2565 for i in $lis; do
2566 if [ "`echo $i | cut -c1`" = "/" ]; then
2567 j=`echo $i | cut -c2-`
2568 [ "$j" != "" ] && rm -f $j
2569 fi
2570 done
2571 tar cf - -C / $lis `sort -u $MINDI_TMP/udev.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in udev.lis analysis" $MINDI_TMP/$$.log
2572 rm -f $MINDI_TMP/udev.lis
2573 else
2574 LogAll "WARNING: udevd daemon not in standard place (/sbin or /usr/bin)"
2575 LogAll " mindi will use static devices which may cause problems"
2576 rm -f $mountpoint/tmp/USE-UDEV
2577 fi
2578 fi
2579
2580 # Management of potential HW info (ProLiant only at the moment)
2581 rm -rf $MINDI_CACHE/bkphw
2582 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2583 if [ -d $MINDI_CACHE/bkphw ]; then
2584 LogIt "INFO: Hardware Information found and saved ..."
2585 cp -rp $MINDI_CACHE/bkphw .
2586 if [ -f $MINDI_CACHE/tools.files ]; then
2587 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
2588 LocateDeps $lis > $MINDI_TMP/tools.lis
2589 tar cf - $lis `sort -u $MINDI_TMP/tools.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in tools.lis analysis" $MINDI_TMP/$$.log
2590 fi
2591 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2592 mv -f $MINDI_CACHE/mindi-rsthw .
2593 chmod 755 ./mindi-rsthw
2594 fi
2595 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2596 fi
2597
2598 # Management of perl scripts delivered needed at restore time
2599 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2600 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in perl scripts analysis" $MINDI_TMP/$$.log
2601
2602 for w in cdrom groovy-stuff ; do
2603 mkdir -p mnt/$w
2604 done
2605
2606 tar cf - -C / /dev/fd0*[1,2][4,7,8]* 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in fd dev analysis" $MINDI_TMP/$$.log
2607
2608 cd "$old_pwd"
2609 echo -en "..."
2610 old_pwd=`pwd`
2611 if [ "$YOUR_KERNEL_SUCKS" ] ; then
2612 cd "$MINDI_TMP"
2613 needed_modules_path=lib/modules/$FAILSAFE_KVER
2614 else
2615 cd /
2616 if [ "${kernelname}" != "" ]
2617 then
2618 needed_modules_path=lib/modules/${kernelname}
2619 else
2620 needed_modules_path=lib/modules/$KERVERRUN
2621 fi
2622 fi
2623
2624 needed_modules=""
2625 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2626
2627 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
2628 # For PXE boot
2629 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2630 fi
2631 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2632 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2633 fi
2634 for i in $DENY_MODS; do
2635 LogFile "INFO: Removing $i from the list of modules to load"
2636 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2637 done
2638
2639 [ -e "$needed_modules_path" ] || LogIt "WARNING: path $needed_modules_path does not exist.\n If you're not using a modular kernel then you're NUTS."
2640 for i in $list_of_groovy_mods ; do
2641 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2642 done
2643
2644 for i in `echo $needed_modules | tr ' ' '\n' | sort -u`; do
2645 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2646 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2647 LogFile "INFO: Adding $i ($s KB) to the rootfs"
2648 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd "$mountpoint" ; tar xf -) || LogIt "ERROR: Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
2649 # Uncompress modules if not using udev and native modprobe
2650 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2651 if [ "`echo "$i" | grep -F ".gz"`" ]; then
2652 LogFile "INFO: Uncompressing $i"
2653 gunzip -f $mountpoint/$i
2654 fi
2655 fi
2656 done
2657
2658 # Also copy modules.* in case of udev so that normal modprobe works
2659 tar cf - -C / /$needed_modules_path/modules.* 2>> $MINDI_TMP/$$.log | (cd "$mountpoint" ; tar xf -) || LogIt "ERROR: Unable to copy modules.* to $mountpoint" $MINDI_TMP/$$.log
2660
2661 # Copy FW in case some drivers needs it
2662 if [ -d "/lib/firmware" ]; then
2663 cp -rp /lib/firmware $mountpoint/lib
2664 fi
2665
2666 # Copy an additional ProLiant tool for OBDR support
2667 if [ -f $MINDI_TMP/OBDR ]; then
2668 if [ -x /usr/bin/hpsa_obdr_mode ]; then
2669 mkdir -p $mountpoint/usr/bin
2670 cp -a /usr/bin/hpsa_obdr_mode $mountpoint/usr/bin
2671 LogIt "INFO: Copying /usr/bin/hpsa_obdr_mode to ramdisk for improved OBDR support"
2672 else
2673 LogAll "WARNING: You're using OBDR mode without having the /usr/bin/hpsa_obdr_mode tool"
2674 LogAll " This may lead to a tape not going back to sequential mode after OBDR boot"
2675 fi
2676 fi
2677
2678 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2679 LogFile "INFO: Deleting devfsd daemon from ramdisk"
2680 [ ! -e "/sbin/devfsd" ] && LogFile "...because /sbin/devfsd not found"
2681 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && LogFile "...because kernel is failsafe"
2682 rm -f $mountpoint/sbin/devfsd
2683 fi
2684 cd "$old_pwd"
2685 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2686 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2687 rm -f $mountpoint/zero
2688 if [ _"$MONDO_SHARE" != _"" ]; then
2689 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2690 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2691 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2692 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2693 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2694 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2695 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2696 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2697 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2698 fi
2699 mkdir -p $mountpoint/proc
2700 LogFile "---------------------------"
2701 LogFile "Content of initial ramdisk:"
2702 LogFile "---------------------------"
2703 (cd "$mountpoint" ; ls -Rla ) >> $LOGFILE
2704 LogFile "---------------------------"
2705
2706 # Determine what filesystem to use for initrd image
2707 LogFile "INFO: Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd."
2708 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2709 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2710 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ]; then
2711 # say what will be used
2712 LogFile "INFO: Creating an $gvFileSystem initrd image..."
2713 # kernel expects linuxrc in ext2 filesystem
2714 ( cd "$mountpoint" && ln -sf sbin/init linuxrc )
2715 # unmount loop filesystem and create image file using the standard approach
2716 umount $mountpoint || Die "Cannot unmount $tempfile"
2717 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2718 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2719 MINDI_ADDITIONAL_BOOT_PARAMS="$MINDI_ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2720 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2721 rm -f ${rdz_fname}.tmp
2722 # log that we are done
2723 LogFile "...done."
2724 elif [ "$gvFileSystem" = "initramfs" ]; then
2725 # say what will be used
2726 LogFile "INFO: Creating a gzip'ed cpio (AKA initramfs) initrd image..."
2727 # make sure that cpio is there
2728 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2729 # go into filesystem
2730 cd "$mountpoint"
2731 # kernel expects init in cpio filesystem
2732 ln -sf sbin/init init
2733 # create cpio image file and unmount loop filesystem
2734 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2735 cd "$old_pwd"
2736 umount $mountpoint || Die "Cannot unmount $tempfile"
2737 # log that we are done
2738 LogFile "...done."
2739 else
2740 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2741 fi
2742
2743 if [ "$res" -eq "0" ] ; then
2744 echo -en "..."
2745 else
2746 echo -en "\rMade an rdz WITH ERRORS. \n"
2747 fi
2748 return 0
2749}
2750
2751
2752##############################################################################
2753#----------------------------------- Main -----------------------------------#
2754##############################################################################
2755
2756# Now we can create what we need
2757mkdir -p $MINDI_TMP
2758
2759# Purge from potential old run
2760if [ _"$MINDI_CACHE" = _"" ]; then
2761 Die "MINDI_CACHE undefined"
2762fi
2763
2764if [ "$1" = "--printvar" ] ; then
2765 shift
2766 if [ _"$1" != _"" ] ; then
2767 set | grep -Ew "^$1" | cut -d= -f2
2768 fi
2769 exit 0
2770fi
2771
2772> $LOGFILE
2773LogFile "mindi v$MINDI_VERSION"
2774LogFile "$ARCH architecture detected"
2775LogFile "mindi called with the following arguments:"
2776echo "$@">> $LOGFILE
2777LogFile "Start date : `date`"
2778LogFile "-----------------------------"
2779
2780[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2781
2782# Log some capital variables
2783[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2784LogFile "MONDO_SHARE = $MONDO_SHARE"
2785LogFile "MINDI_LIB = $MINDI_LIB"
2786LogFile "MINDI_SBIN = $MINDI_SBIN"
2787[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2788LogFile "MINDI_CONF = $MINDI_CONF"
2789if [ -f $MINDI_CONFIG ]; then
2790 LogFile "-----------------------------"
2791 LogFile " Mindi configuration file "
2792 LogFile "-----------------------------"
2793 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2794 LogFile "-----------------------------"
2795fi
2796
2797
2798trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2799
2800# Sanity checks
2801which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2802which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2803which gawk > /dev/null 2> /dev/null || Die "Gawk is missing from your computer. Please install gawk. You may find the package on Debian's website. How did I know you're running Debian? Because only Debian would be stupid enough not to include gawk in your distribution."
2804which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2805if which awk &> /dev/null ; then
2806 if ! which gawk &> /dev/null ; then
2807 LogIt "INFO: You have awk but not gawk.\nPlease note that mindi works fine with a _sane_ awk binary.\nIf your awk binary misbehaves then please contact your vendor\nor distribution's mailing list for technical support.\n"
2808 fi
2809fi
2810which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2811[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
2812
2813[ "`echo $KERVERRUN | grep "2.4.[0-6]" | grep -v "2.4.[0-9][0-9]"`" != "" ] && echo "WARNING! Your kernel may have buggy loopfs code. Consider upgrading to 2.4.7"
2814
2815# Update the PATH variable if incomplete
2816if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2817 PATH=$PATH:/sbin:/usr/sbin
2818 export PATH
2819 LogFile "INFO: Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily."
2820 LogFile "INFO: However, you may wish to ask your vendor to provide a permanent fix..."
2821 LogFile "INFO: Or you might like to call 'su -' instead of 'su', for example."
2822fi
2823
2824# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2825if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2826 source $MINDI_LIB/FindDistroFailsafe
2827 # Log kernel image
2828 LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2829else
2830 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2831fi
2832
2833if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2834 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2835fi
2836
2837### BERLIOS
2838### Fix as it's not mandatory on ia64
2839if [ "$ARCH" = "ia64" ] ; then
2840 if which elilo &> /dev/null ; then
2841 LILO_EXE=elilo
2842 else
2843 LILO_EXE=`which false 2> /dev/null`
2844 fi
2845else
2846 FindIsolinuxBinary
2847fi
2848trap "Aborted" SIGTERM
2849DONE="\r\t\t\t\t\t\t\t\tDone. "
2850kernelpath=""
2851MONDO_ROOT=/var/cache/mondo
2852mkdir -p $MONDO_ROOT
2853
2854if [ -d "/proc/lvm" ]; then
2855 # LVM v1
2856 LVMCMD=""
2857 LVM="v1"
2858elif [ -d "/dev/mapper" ]; then
2859 # LVM v2
2860 LVMCMD="lvm"
2861 LVM="v2"
2862else
2863 LVM="false"
2864fi
2865LogFile "INFO: LVM set to $LVM"
2866LogFile "----------"
2867LogFile "mount result:"
2868LogFile "-------------"
2869mount >> $LOGFILE
2870LogFile "-------------"
2871if [ -e /etc/raidtab ]; then
2872 LogFile "-------------"
2873 LogFile "/etc/raidtab content:"
2874 LogFile "-------------"
2875 cat /etc/raidtab >> $LOGFILE
2876fi
2877LogFile "-------------"
2878LogFile "cat /proc/cmdline:"
2879LogFile "-------------"
2880cat /proc/cmdline >> $LOGFILE
2881LogFile "-------------"
2882LogFile "cat /proc/swaps:"
2883LogFile "-------------"
2884cat /proc/swaps >> $LOGFILE
2885LogFile "-------------"
2886LogFile "cat /proc/partitions:"
2887LogFile "-------------"
2888cat /proc/partitions >> $LOGFILE
2889LogFile "-------------"
2890LogFile "cat /proc/filesystems:"
2891LogFile "-------------"
2892cat /proc/filesystems >> $LOGFILE
2893LogFile "-------------"
2894LogFile "lsmod result:"
2895LogFile "-------------"
2896lsmod >> $LOGFILE
2897MODULES="`cat /proc/modules | $AWK '{print $1}'`"
2898if [ -x /usr/sbin/esxcfg-module ]; then
2899 LogFile "-------------"
2900 LogFile "INFO: VMWare ESX server detected - Enabling dedicated support"
2901 LogFile "-------------"
2902 LogFile "VMWare modules"
2903 LogFile "-------------"
2904 /usr/sbin/esxcfg-module -l >> $LOGFILE
2905 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
2906fi
2907LogFile "FORCE_MODS:"
2908LogFile "-------------"
2909LogFile $FORCE_MODS
2910LogFile "-------------"
2911LogFile "DENY_MODS:"
2912LogFile "-------------"
2913LogFile $DENY_MODS
2914LogFile "-------------"
2915LogFile "df result:"
2916LogFile "----------"
2917df -T >> $LOGFILE
2918LogFile "-------------"
2919LogFile "Liste of extra modules is:"
2920LogFile "$EXTRA_MODS"
2921LogFile "-------------"
2922
2923# Compute libata version
2924laver=`modinfo libata 2> /dev/null | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
2925# If libata v2 is used then remove ide-generic as it will perturbate boot
2926if [ "`echo $MODULES | grep libata`" ]; then
2927 if [ "$laver" = "2" ]; then
2928 DENY_MODS="$DENY_MODS ide-generic"
2929 LogFile "INFO: ide-generic removed from module list as your system uses libata v2+"
2930 LogFile "-------------"
2931 fi
2932fi
2933
2934# Check for McAfee which disturbs the access to some files (tgz in articular)
2935if [ "x`cat /proc/linuxshield/enabled 2>/dev/null`" = "x1" ]; then
2936 LogFile "WARNING: McAfee LinuxShield is enabled. McAfee might block access to certain special files."
2937 LogFile "WARNING: Check in /var/opt/NAI/LinuxShield/etc/nailsd.cfg for 'nailsd.profile.OAS.action.error: Block'"
2938 LogFile "WARNING: You have two options:"
2939 LogFile "WARNING: - Exclude all directories with special files (check McAfee System Events Log)"
2940 LogFile "WARNING: - Disable the scanner during the backup"
2941fi
2942
2943# Check for ISO_CMD command
2944if [ ! -x $ISO_CMD ]; then
2945 LogFile "NOTE: No CD image (ISO file) utility found"
2946fi
2947
2948FLOPPY_WAS_MOUNTED=""
2949for mtpt in /media/floppy /mnt/floppy /floppy ; do
2950 if mount | grep -w $mtpt &> /dev/null ; then
2951 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2952 umount $mtpt
2953 fi
2954done
2955
2956#
2957# If we have a USB device we need to store info
2958# and remove it from the parameters line
2959#
2960if [ "$#" -ne "0" ] ; then
2961 if [ "$1" = "--usb" ] ; then
2962 shift
2963 USBDEVICE=$1
2964 if [ _"$USBDEVICE" = _"" ]; then
2965 Die "No USB device specified"
2966 fi
2967 shift
2968 fi
2969fi
2970
2971if [ "$#" -ne "0" ] ; then
2972 if [ "$1" = "--findkernel" ] ; then
2973 resk=`TryToFindKernelPath`
2974 # Avoids logfile content for mondo
2975 export MONDO_SHARE=""
2976 if [ "$resk" = "" ] ; then
2977 if [ $KERNEL_IS_XEN = "yes" ]; then
2978 echo "$xenkernelpath"
2979 LogFile "INFO: xenkernelpath = $xenkernelpath"
2980 MindiExit 0
2981 else
2982 MindiExit -1
2983 fi
2984 else
2985 echo "$resk"
2986 LogFile "INFO: kernelpath = $resk"
2987 MindiExit 0
2988 fi
2989 elif [ "$1" = "--locatedeps" ] ; then
2990 [ ! "$2" ] && Die "Please specify the binary to look at"
2991 LocateDeps $*
2992 # Avoids logfile content for mondo
2993 export MONDO_SHARE=""
2994 MindiExit $?
2995 elif [ "$1" = "--readalllink" ] ; then
2996 [ ! "$2" ] && Die "Please specify the binary to look at"
2997 # Avoids logfile content for mondo
2998 export MONDO_SHARE=""
2999 ReadAllLink $2
3000 MindiExit $?
3001 elif [ "$1" = "--makemessage" ] ; then
3002 MakeMessageFile | cut -c1-80
3003 MindiExit 0
3004 elif [ "$1" = "--makemountlist" ] ; then
3005 [ ! "$2" ] && Die "Please specify the output file"
3006 MakeMountlist $2
3007 CheckMountlist $2
3008 # Avoids logfile content for mondo
3009 export MONDO_SHARE=""
3010 MindiExit $?
3011 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
3012 echo "Mindi v$MINDI_VERSION"
3013 # Avoids logfile content for mondo
3014 export MONDO_SHARE=""
3015 MindiExit 0
3016 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3017 MONDO_TMP=$2
3018 # Change MINDI_TMP for the one provided by mondo
3019 # So that it can get back the built files
3020 if [ _"$MONDO_TMP" = _"" ]; then
3021 Die "MONDO_TMP is empty, aborting"
3022 fi
3023 if [ _"$MONDO_TMP" = _"/" ]; then
3024 Die "MONDO_TMP is /, aborting"
3025 fi
3026 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
3027 rmdir $MINDI_TMP
3028 export MINDI_TMP=$MONDO_TMP
3029 mkdir -p $MINDI_TMP
3030
3031 # This is the scratch dir in mondo - subdir images
3032 MINDI_CACHE=$3
3033
3034 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3035 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3036
3037###
3038### Sq-Modification...
3039### Attempt to locate kernel specific module path
3040### if module path is found then use it other wise use uname -r to set it...
3041###
3042 if [ $KERNEL_IS_XEN = "yes" ]; then
3043 LogIt "INFO: xenkernelpath = $xenkernelpath"
3044 fi
3045 kernelname=`echo $kernelpath | cut -d'-' -f2- | sed 's/.[bg]z[2]*$//'`
3046 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3047 then
3048 LogIt "WARNING: Module path for ${kernelpath} not found..."
3049 LogIt " using running kernel\'s modules."
3050 kernelname=$KERVERRUN
3051 fi
3052 LogIt "INFO: kernelname = $kernelname"
3053 LogIt "INFO: kernelpath = $kernelpath"
3054###
3055### end of Sq-Modification
3056###
3057 TAPEDEV=$5
3058 TAPESIZE=$6
3059 FILES_IN_FILELIST=$7
3060 USE_LZO=$8
3061 CDRECOVERY=$9
3062 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3063 IMAGE_DEVS=""
3064 else
3065 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3066 fi
3067 if [ "${11}" ] ; then
3068 LILO_OPTIONS=""
3069 # LogIt "INFO: LILO will use conservative settings, to be compatible with older BIOSes."
3070 fi
3071 LAST_FILELIST_NUMBER=${12}
3072 ESTIMATED_TOTAL_NOOF_SLICES=${13}
3073 export MINDI_EXCLUDE_DEVS="${14}"
3074 USE_COMP="${15}"
3075 USE_LILO="${16}"
3076 USE_STAR="${17}"
3077 INTERNAL_TAPE_BLOCK_SIZE="${18}"
3078 DIFFERENTIAL="${19}"
3079 USE_GZIP="${20}"
3080 NOT_BOOT="${21}"
3081 [ "$USE_COMP" = "" ] && USE_COMP=yes
3082 [ "$USE_GZIP" = "" ] && USE_GZIP=no
3083 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3084 [ "$TAPEDEV" ] && LogIt "INFO: This is a tape-based backup. Fine."
3085 # MONDO_ROOT is the real scratchdir
3086 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
3087 if [ _"$MONDO_ROOT" != _"" ]; then
3088 mkdir -p $MONDO_ROOT
3089 else
3090 Die "MONDO_ROOT is undefined"
3091 fi
3092 else
3093 echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3094 MindiExit -1
3095 fi
3096fi
3097
3098if [ _"$MINDI_CACHE" != _"" ]; then
3099 rm -rf $MINDI_CACHE/* 2> /dev/null
3100 mkdir -p $MINDI_CACHE
3101fi
3102
3103[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3104
3105if [ _"$MONDO_SHARE" = _"" ]; then
3106 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3107 LogIt "Latest Mindi is available from http://www.mondorescue.org"
3108 LogIt "BusyBox sources are available from http://www.busybox.net"
3109 LogIt "------------------------------------------------------------------------------"
3110else
3111 LogFile "INFO: You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks"
3112fi
3113if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3114 LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3115else
3116 LogIt "ERROR: Unable to find mindi-busybox, please install it"
3117 MindiExit -1
3118fi
3119
3120for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3121 modprobe $i >> $LOGFILE 2>> $LOGFILE
3122done
3123
3124KERN_DISK_MADE=""
3125
3126LogFile "DIFFERENTIAL = $DIFFERENTIAL"
3127LogFile "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE"
3128LogFile "NOT_BOOT = '$NOT_BOOT'"
3129if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3130 LogIt "INFO: Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
3131 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3132 MakeMountlist $MINDI_TMP/mountlist.txt
3133 CheckMountlist $MINDI_TMP/mountlist.txt
3134 mkdir -p $MINDI_TMP/small-all/tmp
3135 cd "$MINDI_TMP/small-all"
3136 cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
3137 tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
3138 sleep 2
3139 LogIt "Done. Exiting."
3140 MindiExit 0
3141fi
3142
3143if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3144 LogIt "INFO: Including the generation of a Bootable USB device on $USBDEVICE"
3145fi
3146
3147if [ "$kernelpath" = "" ] ; then
3148 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
3149 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3150 read ch
3151 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3152 USE_OWN_KERNEL="yes"
3153 else
3154 USE_OWN_KERNEL="no"
3155 fi
3156 if [ "$USE_OWN_KERNEL" = "yes" ]; then
3157 YOUR_KERNEL_SUCKS=""
3158 kernelpath=`TryToFindKernelPath`
3159 if [ "$kernelpath" = "" ] ; then
3160 echo -n "Please enter kernel path : "
3161 read kernelpath
3162 fi
3163 else
3164 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3165 fi
3166fi
3167if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3168 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
3169 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
3170 source $MINDI_LIB/FindDistroFailsafe
3171 # Log kernel image
3172 LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
3173 kernelpath="$FAILSAFE_KBIN"
3174 LogIt "INFO: I shall include a failsafe kernel, not your kernel, in the boot disks."
3175 LogIt " The failsafe kernel is $kernelpath."
3176 LogIt " However, you are still running your kernel. If Mindi fails to create your"
3177 LogIt " disks then it may still be a result of a problem with your kernel."
3178 pwd=`pwd`
3179 cd "$MINDI_TMP"
3180 mkdir -p lib/modules
3181 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
3182 cd "$pwd"
3183 else
3184 kernelpath=$MINDI_LIB/vmlinuz
3185 LogIt "INFO: I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3186 LogIt " However, you are still running your kernel. If Mindi fails to create your"
3187 LogIt " disks then it may still be a result of a problem with your kernel."
3188 pwd=`pwd`
3189 cd "$MINDI_TMP"
3190 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3191 cd "$pwd"
3192 fi
3193 YOUR_KERNEL_SUCKS="Your kernel sucks"
3194fi
3195echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
3196[ "$(($RANDOM%64))" -eq "0" ] && LogIt "INFO: Dude, I've looked inside your computer and it's really dusty..."
3197
3198[ "$YOUR_KERNEL_SUCKS" ] && [ ! "$FAILSAFE_KVER" ] && Die "Please install mindi-kernel package. You need it.\nGo to http://www.mondorescue.org and download it, then install it."
3199
3200PrepareDataDiskImages
3201
3202ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3203rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3204export ramdisk_size=$rds
3205
3206LogFile "INFO: Ramdisk will be $ramdisk_size KB"
3207if [ "$ARCH" = "ia64" ] ; then
3208 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
3209else
3210 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
3211fi
3212
3213[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3214...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3215
3216if [ _"$MONDO_SHARE" = _"" ]; then
3217 ListImagesForUser
3218 OfferToMakeBootableISO
3219 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
3220 OfferToMakeBootableUSB
3221 fi
3222 LogIt "Finished."
3223elif [ "$TAPEDEV" ] ; then
3224 if [ "$ARCH" != "ia64" ] ; then
3225 # We need to keep the img file as boot file for ia64 platform
3226 rm -f $MINDI_CACHE/{*img,*iso}
3227 else
3228 rm -f $MINDI_CACHE/*iso
3229 fi
3230 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3231 OfferToMakeBootableUSB
3232 fi
3233 OfferToMakeBootableISO
3234 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
3235 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
3236 else
3237 Die "Cannot find all.tar.gz, to be written to tape"
3238 fi
3239elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3240 OfferToMakeBootableUSB
3241else
3242 OfferToMakeBootableISO
3243fi
3244# cleanup
3245LogIt "$FRIENDLY_OUTSTRING"
3246for mtpt in $FLOPPY_WAS_MOUNTED ; do
3247 mount $mtpt
3248done
3249MindiExit 0
Note: See TracBrowser for help on using the repository browser.