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

Last change on this file since 2907 was 2907, checked in by Bruno Cornec, 12 years ago
  • Should fix #512 by clearing old scratchdir before changing to a new
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 115.8 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 2907 2011-11-29 01:58:39Z 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_amd pata_marvell pata_serverworks pata_sis pata_sil680 pata_jmicron 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_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"
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 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# Last function called before exiting
120# Parameter is exit code value
121# Should be declared here as used immediately below potentialy
122MindiExit() {
123 echo "Mindi $MINDI_VERSION is exiting" >> $LOGFILE
124 echo "End date : `date`" >> $LOGFILE
125 if [ _"$MONDO_SHARE" != _"" ] ; then
126 echo "------------- mindi logfile included -------------------------" >> /var/log/mondoarchive.log
127 cat $LOGFILE >> /var/log/mondoarchive.log
128 echo "--------------------------------------------------------------">> /var/log/mondoarchive.log
129 fi
130
131 cd /
132 sync&
133
134 # Clean temporary files only when standalone mindi
135 if [ _"$MINDI_TMP" != _"$MONDO_TMP" ]; then
136 rm -Rf $MINDI_TMP
137 fi
138 exit $1
139}
140
141LogOnly() {
142 echo -e "$1" >> $LOGFILE
143 if [ _"$2" != _"" ]; then
144 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
145 fi
146 rm -f "$2"
147}
148
149# Function to log on screen only
150LogScreen() {
151 if [ -e /dev/stderr ] ; then
152 echo -e "$1" >> /dev/stderr
153 elif [ -e /usr/bin/logger ] ; then
154 /usr/bin/logger -s $1
155 fi
156}
157
158# Function to log in log file only
159LogFile() {
160
161 echo -e "$1" >> $LOGFILE
162 if [ _"$2" != _"" ]; then
163 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
164 fi
165 rm -f "$2"
166}
167
168# Function to log in both screen and logfile
169LogAll() {
170 LogScreen "$1"
171 LogFile "$1" "$2"
172}
173
174# Preserved for compatibility
175LogIt() {
176 LogAll "$1" "$2"
177}
178
179
180Die() {
181 local i
182 if [ "$1" = "" ] ; then
183 LogIt "FATAL ERROR"
184 else
185 LogIt "FATAL ERROR. $1"
186 fi
187 if [ _"$2" != _"" ]; then
188 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
189 fi
190 rm -f "$2"
191
192 LogIt "Please e-mail a copy of $LOGFILE to the mailing list."
193 LogIt "See http://www.mondorescue.org for more information."
194 LogIt "WE CANNOT HELP unless you enclose that file.\n"
195 MindiExit -1
196}
197
198# Now we can create what we need
199MINDI_TMP=`mktemp -d $TMPDIR/mindi.XXXXXXXXXX`
200if [ $? -ne 0 ]; then
201 df $TMPDIR
202 Die "Unable to create a temporary directory ! Check space on $TMPDIR"
203fi
204if [ _"$MINDI_TMP" = _"" ]; then
205 Die "MINDI_TMP is empty, aborting"
206fi
207if [ _"$MINDI_TMP" = _"/" ]; then
208 Die "MINDI_TMP is /, aborting"
209fi
210export MINDI_TMP
211
212# ----------------------------------------------------------------------------
213
214
215AbortHere() {
216 [ "$mountpoint" ] && umount $mountpoint 2>> $LOGFILE
217 Die "Program is terminating in response to signal received from OS/user"
218}
219
220
221Aborted() {
222 trap SIGHUP SIGTERM SIGTRAP SIGINT
223 [ "$MINDI_CACHE" != "" ] && rm -f $MINDI_CACHE/mindi*img $MINDI_CACHE/*gz $MINDI_CACHE/mindi.iso
224 [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
225 Die "User abort."
226}
227
228
229AddFileToCfgIfExists() {
230 [ -e "$1" ] && echo -en "$2 `cat $1`\n" >> $3
231}
232
233
234AddKeyboardMappingFile() {
235 local mappath r included_list included_item i res ii sss
236 mappath=$1
237 KBDEPTH=$(($KBDEPTH+1))
238 [ "$KBDEPTH" -gt "128" ] && Die "Edit $MINDI_SBIN/mindi and disable FindAndAddUserKeyboardMappingFile (line 2160, approx.)"
239 if [ -e "$bigdir/$mappath" ] ; then
240 echo "$mappath already added" >> $LOGFILE
241 return
242 elif [ -d "$bigdir/$mappath" ] ; then
243 echo "Cannot add $mappath: it's a directory. Sorry."
244 return
245 fi
246 echo "Added kbd map $mappath" >> $LOGFILE
247 if [ ! -e "$mappath" ] ; then
248 mappath=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
249 if [ ! -e "$mappath" ] ; then
250 LogIt "Cannot add $mappath: kbd map file not found"
251 return
252 fi
253 else
254 echo -en "`basename $mappath | tr '.' '#' | sed s/#kmap#gz// | sed s/#inc#gz//` " | tr '#' '.'
255 fi
256
257 mkdir -p $bigdir/etc
258 tar cf - -C / $mappath 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "AKMF -- Could not copy $mappath to $bigdir" $MINDI_TMP/$$.log
259 if [ "`echo $mappath | grep -F ".gz"`" ] ; then
260 included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
261 else
262 included_list=`grep -Fi include $mappath | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
263 fi
264 for included_item in $included_list ; do
265 if [ ! -e "$included_item" ] ; then
266 sss=`grep -F "${included_item}.inc" $MINDI_TMP/keymaps.find`
267 [ "$sss" = "" ] && sss=`grep -F "$included_item" $MINDI_TMP/keymaps.find`
268 for ii in $sss ; do
269 [ -e "$ii" ] && AddKeyboardMappingFile $ii
270 done
271 else
272 AddKeyboardMappingFile $included_item
273 fi
274 done
275}
276
277
278CopyDependenciesToDirectory() {
279 local outdir incoming fname counter d found
280 outdir=$1
281 mkdir -p $outdir
282 incoming=`ReadLine`
283 counter=0
284 while [ "$incoming" != "" ] ; do
285 # Non absolute file names should not arrive till here => skipped
286 if [ `echo "$incoming" | cut -c1` != '/' ]; then
287 LogIt "Unable to handle $incoming"
288 incoming=`ReadLine`
289 continue
290 fi
291 # no parent directory of incoming should be a link, copy is not possible in that case
292 d=`dirname "$incoming"`
293 found="false"
294 while [ $d != "/" -a $found = "false" ]; do
295 [ -h "$d" ] && found="true"
296 d=`dirname "$d"`
297 done
298 if [ -d "$incoming" ] && [ ! -h "$incoming" ]; then
299 find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir
300 elif [ -e "$incoming" ] && [ $found = "false" ]; then
301 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
302
303 # Only uncompress modules if not using udevd
304 if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] && [ "`ps auxww | grep -v grep | grep -qw udevd`" != "" ]; then
305 gunzip -f $outdir/$incoming || LogIt "Cannot gunzip $outdir/$incoming"
306 fi
307 [ -x "$outdir" ] && StripExecutable $outdir "-$filename-"
308 counter=$(($counter+1))
309 if [ "$counter" -ge "5" ] ; then
310 counter=0
311 echo -en "."
312 fi
313 fi
314 incoming=`ReadLine`
315 done
316}
317
318
319CountItemsIn() {
320 local r
321 r=0
322 for q in $1 ; do
323 r=$(($r+1))
324 done
325 echo $r
326}
327
328
329DropOptimizedLibraries() {
330 local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
331 filelist=$1
332 outdir=$2
333
334 list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
335 if [ "$list_of_optimized_libraries" = "" ] ; then
336 return 0
337 fi
338 echo -en "Dropping i686-optimized libraries if appropriate"
339 for optimized_lib_name in $list_of_optimized_libraries ; do
340 echo -en "."
341 reason=""
342 vanilla_lib_name=`echo "$optimized_lib_name" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
343 echo "$vanilla_lib_name" >> $filelist
344 echo "Adding $vanilla_lib_name to filelist" >> $LOGFILE
345 mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
346 rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
347
348 # This may return multiple files
349 for resolved in `ReadAllLink $vanilla_lib_name`; do
350 echo "Adding as deps $resolved to filelist" >> $LOGFILE
351 vanilla_resolved_name=`echo "$resolved" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
352 mkdir -p $outdir$resolved> /dev/null 2> /dev/null
353 rmdir $outdir$resolved > /dev/null 2> /dev/null
354 ln -sf $vanilla_resolved_name $outdir$resolved
355 echo "Excluding deps $resolved" >> $LOGFILE
356 grep -Fvx "$resolved" "$filelist" > $filelist.tmp
357 echo "Replacing it with $vanilla_resolved_name" >> $LOGFILE
358 echo "$vanilla_resolved_name" >> $filelist.tmp
359 mv -f $filelist.tmp $filelist
360 done
361 done
362 $AWK '{ print $1; }' $filelist | sort -u > $filelist.tmp
363 mv -f $filelist.tmp $filelist
364 echo -e "$DONE"
365}
366
367
368FindAndAddUserKeyboardMappingFile() {
369 local r res mapfile mappath included_item included_list keyfile mp locale
370 LogIt "Analyzing your keyboard's configuration."
371 KEYDIR=/lib/kbd
372 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share/kbd # Slackware
373 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/lib/kbd
374 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share
375 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole
376 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole-setup
377 if [ ! -e "$KEYDIR" ] ; then
378 LogIt "Keyboard mapping directory not found. I shall use default map at boot-time."
379 return 0
380 fi
381 if [ -e "/etc/sysconfig/keyboard" ] ; then
382 echo "Red Hat-style config detected." >> $LOGFILE
383 keyfile=/etc/sysconfig/keyboard
384 elif [ -e "/etc/rc.d/rc.keymap" ] ; then
385 echo "Slackware-style config detected." >> $LOGFILE
386 keyfile=/etc/rc.d/rc.keymap
387 elif [ -e "/etc/rc.config" ] ; then
388 echo "Debian-style config detected." >> $LOGFILE
389 keyfile=/etc/rc.config
390 elif [ -e "/etc/console/boottime.kmap.gz" ] ; then
391 echo "Debian-style config detected." >> $LOGFILE
392 echo -en "Adding the following keyboard mapping tables: "
393 mkdir -p $bigdir/tmp
394 echo "/etc/console/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
395 KBDEPTH=0
396 mkdir -p $bigdir/etc/console
397 cp /etc/console/boottime.kmap.gz $bigdir/etc/console 2>> $LOGFILE
398 echo ""
399 echo -e "$DONE"
400 return 0
401 elif [ -e "/etc/console-setup/boottime.kmap.gz" ] || [ -e "/etc/console-setup/cached.kmap.gz" ] ; then
402 echo "Ubuntu-style config detected." >> $LOGFILE
403 echo -en "Adding the following keyboard mapping tables: "
404 mkdir -p $bigdir/tmp
405 if [ -e "/etc/console-setup/boottime.kmap.gz" ] ; then
406 kbdfile="/etc/console-setup/boottime.kmap.gz"
407 else
408 kbdfile="/etc/console-setup/cached.kmap.gz"
409 fi
410 echo $kbdfile > $bigdir/tmp/KEYMAP-LIVES-HERE
411 KBDEPTH=0
412 mkdir -p $bigdir/etc/console-setup
413 cp $kbdfile $bigdir/etc/console-setup 2>> $LOGFILE
414 echo ""
415 echo -e "$DONE"
416 return 0
417 elif [ -e "/etc/rc.conf" ] ; then
418 echo "ArchLinux config detected." >> $LOGFILE
419 keyfile=/etc/rc.conf
420 elif [ -e "/etc/conf.d/keymaps" ] ; then
421 echo "Gentoo-style config detected." >> $LOGFILE
422 keyfile=/etc/conf.d/keymaps
423 else
424 echo -en "Searching for rc.config ..."
425 keyfile=`find /etc -name rc.config | head -n1`
426 if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
427 LogIt "Unknown config detected. Default keyboard map will be used."
428 return
429 else
430 echo "Found $keyfile" >> $LOGFILE
431 fi
432 fi
433 if [ ! -e "$KEYDIR/keymaps" ] ; then
434 LogIt "Keyboard mapping directory not found. Default keyboard map will be used."
435 return
436 fi
437 echo "keyfile=$keyfile" >> $LOGFILE
438 locale=`grep -F KEYTABLE "$keyfile" | tr -d '"' |cut -d'=' -f2`
439 [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'` # Slackware
440 [ ! "$locale" ] && locale=`grep -E '^KEYMAP=' "$keyfile" | tr -d '"' |cut -d'=' -f2` # Gentoo & ArchLinux
441 echo "locale=$locale" >> $LOGFILE
442 #
443 # Process the keymaps dir once for all
444 # AddKeyboardMappingFile will use it recursively
445 #
446 find $KEYDIR/keymaps > $MINDI_TMP/keymaps.find
447 mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep -F "/${locale}." | grep -vx " *#.*"`
448 [ ! "$mp" ] && mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
449 # If we have multiple keymaps then log it !!
450 echo "$mp" | grep -q " "
451 if [ $? -eq 0 ]; then
452 echo "WARNING: Multiple keymaps found: $mp" | tee -a $LOGFILE
453 echo "The following one will be used" >> $LOGFILE
454 fi
455 for i in $mp ; do
456 mappath=$i
457 [ -e "$i" ] && [ ! -d "$i" ] && break
458 done
459 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
460 mappath=$(find / -name "*/kbd/keymaps/*/$locale")
461 fi
462 echo "mappath = $mappath" >> $LOGFILE
463 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
464 LogIt "Keyboard mapping file not found. Default keyboard map will be used."
465 return
466 fi
467 echo -en "Adding the following keyboard mapping tables: "
468 mkdir -p $bigdir/tmp
469 echo "$mappath" > $bigdir/tmp/KEYMAP-LIVES-HERE
470 KBDEPTH=0
471 AddKeyboardMappingFile $mappath
472 echo ""
473 echo -e "$DONE"
474 rm -f $MINDI_TMP/keymaps.find
475 return 0
476}
477
478
479FindMboot32Binary() {
480 MBOOTC32=/usr/lib/syslinux/mboot.c32
481 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/lib/syslinux/mboot.c32
482 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/lib64/syslinux/mboot.c32
483 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/syslinux/mboot.c32
484 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/lib/syslinux/mboot.c32
485 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/lib64/syslinux/mboot.c32
486 [ ! -e "$MBOOTC32" ] && MBOOTC32=`find / -name mboot.c32 | grep -x "/.*/mboot.c32"`
487 [ ! -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.com and click on 'Download'"
488 LogFile "Found mboot.c32 at $MBOOTC32"
489}
490
491FindIsolinuxBinary() {
492 ISOLINUX=/usr/lib/isolinux.bin
493 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
494 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib64/syslinux/isolinux.bin
495 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
496 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
497 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib64/syslinux/isolinux.bin
498 [ ! -e "$ISOLINUX" ] && ISOLINUX=`find / -name isolinux.bin | grep -x "/.*/isolinux.bin"`
499 [ ! -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.com and click on 'Download'"
500 echo "Found isolinux.bin at $ISOLINUX" >> $LOGFILE
501}
502
503
504FindSpecificModuleInPath() {
505 local modpaths pwd line
506 pwd=`pwd`
507 if [ "$YOUR_KERNEL_SUCKS" ] ; then
508 cd "$MINDI_TMP"
509 else
510 cd /
511 fi
512 if [ ! -e "$1" ] ; then
513 LogIt "WARNING - cannot search specific path '$1'"
514 return 1
515 fi
516 # Find all files and links (required for some VMWare VMs)
517 modpaths=`find $1 -name $2.*o -o -name $2.o.gz -o -name $2.ko.gz -o -name $2 -type f -o -type l`
518 echo "$modpaths"
519 cd "$pwd"
520}
521
522
523GenerateGiantDependencyList() {
524 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
525
526 echo -en "Analyzing dependency requirements"
527 outfile=$1
528 tempfile=$MINDI_TMP/$$.txt
529 incoming=`ReadLine`
530
531 > $tempfile
532 progress=0
533 res=0
534 noof_lines=$2
535 while [ "$incoming" != "" ] ; do
536 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
537 incoming=`ReadLine`
538 continue
539 fi
540 if [ "$incoming" = "LVMFILES:" ] ; then
541 break
542 fi
543 filelist=`GenerateListForFile "$incoming"`
544 r=$?
545 [ "$r" -ne "0" ] && LogIt "$incoming not found"
546 res=$(($res+$r))
547# echo "'$incoming' generates filelist '$filelist'" >> $LOGFILE
548 for fname in $filelist ; do
549 [ "$fname" != "" ] && echo "$fname" >> $tempfile
550 done
551 progress=$(($progress+1))
552 echo -en "\r\t\t\t\t\t\t\t\t"
553 i=$(($progress*100))
554 i=$(($i/$noof_lines))
555 echo -en "$i"
556 echo -en "%"
557 modres=$(($progress%4))
558 [ "$modres" -eq "0" ] && echo -en "\t/"
559 [ "$modres" -eq "1" ] && echo -en "\t-"
560 [ "$modres" -eq "2" ] && echo -en "\t\\"
561 [ "$modres" -eq "3" ] && echo -en "\t|"
562 incoming=`ReadLine`
563 done
564 if [ "$incoming" = "LVMFILES:" ] ; then
565 incoming=`ReadLine`
566 lvmversion=""
567 while [ "$incoming" != "" ] ; do
568 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
569 incoming=`ReadLine`
570 continue
571 fi
572 filelist=`GenerateListForFile "$incoming"`
573 for tool in $filelist ; do
574 lvmresolved=`readlink -f $tool`
575 if [ "$tool" = "$lvmresolved" ]; then
576 echo "$tool" >> $tempfile
577 elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
578 if [ "$lvmversion" = "" ] ; then
579 lvmversion=`$lvmresolved`
580 echo "$lvmresolved" >> $tempfile
581 fi
582 toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
583 if [ "$lvmversion" = "200" ]; then
584 # pvdata and lvmcreate_initrd don't exist in LVM2
585 case "$toolstripped" in
586 "pvdata")
587 continue
588 ;;
589 "lvmcreate_initrd")
590 continue
591 ;;
592 esac
593 fi
594 toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
595 if [ -e "$toolpath" ] ; then
596 echo "$toolpath" >> $tempfile
597 echo "$tool" >> $tempfile
598 else
599 toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
600 fi
601 if [ -e "$toolpath" ] ; then
602 echo "$toolpath" >> $tempfile
603 echo "$tool" >> $tempfile
604 else
605 echo "Where are your LVM-Tools? Couldn't find $tool"
606 fi
607 else
608 echo "$tool" >> $tempfile
609 fi
610 done
611 progress=$(($progress+1))
612 echo -en "\r\t\t\t\t\t\t\t\t"
613 i=$(($progress*100))
614 i=$(($i/$noof_lines))
615 echo -en "$i"
616 echo -en "%"
617 modres=$(($progress%4))
618 [ "$modres" -eq "0" ] && echo -en "\t/"
619 [ "$modres" -eq "1" ] && echo -en "\t-"
620 [ "$modres" -eq "2" ] && echo -en "\t\\"
621 [ "$modres" -eq "3" ] && echo -en "\t|"
622 incoming=`ReadLine`
623 done
624 fi
625 echo -en "$DONE\nMaking complete dependency list"
626
627 tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
628 mv -f $tempfile.new $tempfile
629 > $outfile.pre
630 progress=0
631 noof_lines=`cat $tempfile | wc -l`
632 echo "---------------------------------" >> $LOGFILE
633 echo "List of dependencies: " >> $LOGFILE
634 echo "---------------------------------" >> $LOGFILE
635 for fname in `cat $tempfile` ; do
636 echo "$fname" | tee -a $LOGFILE >> $outfile.pre
637 LocateDeps $fname | tee -a $LOGFILE >> $outfile.pre
638 progress=$(($progress+1))
639 echo -en "\r\t\t\t\t\t\t\t\t"
640 i=$(($progress*100))
641 i=$(($i/$noof_lines))
642 echo -en "$i"
643 echo -en "%"
644 modres=$(($progress%4))
645 [ "$modres" -eq "0" ] && echo -en "\t/"
646 [ "$modres" -eq "1" ] && echo -en "\t-"
647 [ "$modres" -eq "2" ] && echo -en "\t\\"
648 [ "$modres" -eq "3" ] && echo -en "\t|"
649 done
650 if [ _"$MONDO_SHARE" != _"" ]; then
651 mkdir -p $bigdir/tmp
652 mkdir -p $bigdir/sbin
653 mkdir -p $bigdir/bin
654 if [ -e "$MINDI_TMP/post-nuke.tgz" ] ; then
655 LogIt "\nIncorporating post-nuke tarball"
656 old_pwd=`pwd`
657 cd "$bigdir"
658 tar -zxf $MINDI_TMP/post-nuke.tgz 2>> $MINDI_TMP/$$.log || LogIt "Error occurred when untarring post-nuke tarball" $MINDI_TMP/$$.log
659 cd "$old_pwd"
660 fi
661 if cp -f $MINDI_TMP/mondo*restore $bigdir/usr/bin 2>> $LOGFILE ; then
662 LocateDeps $bigdir/usr/bin/mondo*restore >> $outfile.pre
663 else
664 LogIt "Cannot find mondo*restore in mondo's tempdir, $MINDI_TMP"
665 LogIt "I bet you've got a spare copy of Mondo or Mindi floating around on your system."
666 LogIt "If Mindi was called by Mondo then send me a bug report.\n It not, type 'ps ax' to see which Mondo-related process is still running;\n then kill it. :-)\n Finally, run Mindi again."
667 Die "Odd."
668 fi
669 cp -f $MINDI_TMP/BOOTLOADER.* $bigdir 2>> $LOGFILE || LogIt "\nMondo v1.2x defaults to LILO as the bootloader, BTW."
670 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
671 LogIt "\nIncorporating Network-related settings"
672 for r in NETFS-* ISO-PREFIX ; do
673 cp -f $MINDI_TMP/$r $bigdir/tmp 2>> $LOGFILE || Die "Cannot copy $r - did you run out of disk space?"
674 echo "Copying $r to ramdisk" >> $LOGFILE
675 done
676 fi
677 fi
678 tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
679 rm -f $tempfile $outfile.pre
680 [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
681 return $res
682}
683
684
685GenerateListForFile() {
686 local files_found loc fname incoming i res
687 incoming="$1"
688 files_found=""
689 res=0
690
691 for fname in $incoming ; do
692 files_found="$files_found `LocateFile $fname`"
693 done
694
695 echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
696}
697
698
699# Returns all disk devices which are part of a raid array
700GetAllRaidMembers() {
701 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
702}
703
704
705GetFileSizeList() {
706 local i
707 for i in `find $1 -type d -o -print` ; do
708 du -sk $i
709 done
710}
711
712
713GetHomeDir() {
714 local res loc
715 loc=`which $1 2>/dev/null`
716 res=`file $loc | $AWK '{print $NF;}'`
717 dirname $res
718}
719
720
721# Check kernel filesystem capabilites for accessing initrd image
722# Could be ext2 FS (old mode) or initramfs (new mode)
723#
724# Interface definition:
725# param #1: absolute path to kernel image
726GetInitrdFilesystemToUse() {
727
728 # interface test: make sure we have one parameter
729 if [ $# -ne 1 ]; then
730 Die "GetInitrdFilesystemToUse(): Expected 1 parameter, got $#."
731 fi
732
733 # interface parameters
734 local lvKernelImage=$1
735
736 # local constants (filesystem magic strings)
737 local lcMagicCramfs="<3>cramfs: wrong magic"
738 local lcMagicExt2fs="EXT2-fs: blocksize too small for device."
739 local lcMagicExt3fs="<3>EXT3-fs: blocksize too small for journal device."
740 local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs...|<6>Trying to unpack rootfs image as
741initramfs"
742
743 # local variables
744 local lvOffset
745 local lvScanRes
746 local lvUseFilesystem
747
748 # say where we are.
749 echo " GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage" >> $LOGFILE
750
751 # verify that file exists
752 [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
753
754 # Kernel may be gzip compressed
755 file $lvKernelImage 2>&1 | grep -q gzip
756 if [ $? -eq 0 ]; then
757 lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs"`
758
759 # determine which filesystem to use for initrd image: ext2|3fs, gzip'ed cpio (initramfs) or cramfs
760 if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
761 lvUseFilesystem="ext2fs"
762 elif [ `echo $lvScanRes | grep -Ec "$lcMagicExt3fs"` -eq 1 ]; then
763 lvUseFilesystem="ext3fs"
764 elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
765 lvUseFilesystem="initramfs"
766 elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
767 lvUseFilesystem="cramfs"
768 else
769 lvUseFilesystem="UNSUPPORTED"
770 fi
771
772 else
773 # In that case, we are after 2.6.30 and use the supported initramfs
774 lvUseFilesystem="initramfs"
775 fi
776 # say what we are using
777 echo " GetInitrdFilesystemToUse(): Filesytem to use for initial ram disk is $lvUseFilesystem.\n" >> $LOGFILE
778
779 # return file system to use
780 echo "$lvUseFilesystem"
781
782}
783
784# Searches parent raid device of given disk device
785# $1: disk device (i.e. /dev/hda1)
786GetParentRaidDev() {
787 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
788}
789
790
791# Searches members of raid device
792# $1: raid device (/dev/md...)
793GetRaidDevMembers() {
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 echo "module $module --> $r" >> $LOGFILE
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 echo "WARNING - $fname does not exist; cannot be LDD'd." >> $LOGFILE
888 if echo $fname | grep lvm &> /dev/null ; then
889 echo "This warning only affects you if you are using LVM." >> $LOGFILE
890 if echo "$MODULES" | grep lvm &> /dev/null ; then
891 echo "I think you are, so please take heed!" >> $LOGFILE
892 else
893 echo "I don't think you are, so don't worry about it." >> $LOGFILE
894 fi
895 fi
896 elif [ -h "$fname" ] && [ -x "$fname" ] ; then
897 echo "$fname is softlink" >> $LOGFILE
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 echo "Your raw fstab file looks like this:" >> $LOGFILE
1034 echo "------------------------------------" >> $LOGFILE
1035 cat $MY_FSTAB >> $LOGFILE
1036 echo "Your mountlist will look like this:" | tee -a $LOGFILE
1037 echo "-----------------------------------" >> $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 %-15s %-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"
1067 for c_p in $all_partitions ; do
1068 # Skip evices, network FS, cisf
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 # Debian 5 does that
1080 [ "$c_p" = "proc" ] && continue
1081 redhat_label=""
1082 label=""
1083 uuid=""
1084 absolute_partition=`readlink -f $c_p`
1085 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1086
1087 # Detects noauto partitions not mounted and exclude them
1088 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1089 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
1090 continue
1091 fi
1092
1093 # set default in case we dont't find it
1094 str_to_find_fmt_with=$current_partition
1095
1096 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1097 # current_partition contains only first column of /etc/fstab
1098 if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
1099 redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1100 actual_dev=""
1101
1102 # 1st try, findfs - the RHEL way of finding labels and their partitions
1103 if [ -x "/sbin/findfs" ]; then
1104 actual_dev=`/sbin/findfs LABEL="${redhat_label}" 2> /dev/null`
1105 fi
1106
1107 # 2nd try : blkid, the good way for all LABEL except swap
1108 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1109 actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1110 # For LVM FS it will give a /dev/dm-# which should then be converted
1111 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1112 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1113 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1114 for dev in `ls /dev/mapper/*`; do
1115 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1116 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1117 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1118 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1119 break
1120 fi
1121 done
1122 fi
1123 fi
1124
1125 # 3rd try, which works on a standard partition (ext2/3), but not on swap
1126 # For LVM gives a /dev/mapper entry
1127 if [ "x$actual_dev" = "x" ]; then
1128 actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | cut -d' ' -f1`
1129 fi
1130
1131 # 4th try, with vol_id
1132 # SWAP only
1133 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1134 list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | $AWK '{ print $1 }' `
1135 for dev_swap in $list_swaps ; do
1136 dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1137 if [ "x$dev_exists" != "x" ]; then
1138 actual_dev=$dev_swap
1139 break;
1140 fi
1141 done
1142 fi
1143
1144 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1145 # LABEL=SW-cciss/c0d0p3 (RDP)
1146 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1147 # SWAP only
1148 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1149 skip=""
1150 uname=$KERVERRUN
1151 [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1152 # 2.6.12 needs 16 (FC3)
1153 [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1154 # 2.6.19 and upper needs 1052
1155 [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1156 [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1157 [ "`echo $uname | grep "3.[0-9]*.[0-9]*"`" != "" ] && skip=1052
1158 if [ $skip = "" ]; then
1159 Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1160 fi
1161 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1162 do
1163 # Location of the swap label for kernel 2.6
1164 try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
1165 if [ "x$try_dev_label" = "x$redhat_label" ]; then
1166 actual_dev=$try_dev
1167 fi
1168 done
1169 fi
1170
1171 # Check if one of all those tries has known success
1172 if [ "x$actual_dev" != "x" ]; then
1173 current_partition=$actual_dev
1174 else
1175 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"
1176 fi
1177 # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1178 # current_partition contains only first column of /etc/fstab
1179 elif [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
1180 uuid=`echo "$current_partition" | cut -d'=' -f2`
1181 actual_dev=""
1182
1183 # 1st try, findfs - the RHEL way of finding labels and their partitions
1184 if [ -x "/sbin/findfs" ]; then
1185 actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1186 fi
1187
1188 # 2nd try : blkid, the good way for all UUID except swap
1189 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1190 actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | cut -d':' -f1`
1191 # For LVM FS it will give a /dev/dm-# which should then be converted
1192 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1193 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1194 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1195 for dev in `ls /dev/mapper/*`; do
1196 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1197 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1198 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1199 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1200 break
1201 fi
1202 done
1203 fi
1204 fi
1205
1206 # 3th try, with vol_id
1207 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1208 list_dev=`mount | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1209 for dev in $list_dev ; do
1210 dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1211 if [ "x$dev_exists" != "x" ]; then
1212 actual_dev=$dev
1213 break;
1214 fi
1215 done
1216 fi
1217
1218 # 4th try, with dumpuuid (VMWare only ?) for swap
1219 if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1220 list_dev=`cat /proc/swaps | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1221 for dev in $list_dev ; do
1222 dev_exists=`/sbin/dumpuuid $dev | /bin/grep "$uuid"`
1223 if [ "x$dev_exists" != "x" ]; then
1224 actual_dev=$dev
1225 break;
1226 fi
1227 done
1228 fi
1229
1230 # Check if one of all those tries has known success
1231 if [ "x$actual_dev" != "x" ]; then
1232 current_partition=$actual_dev
1233 else
1234 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."
1235 fi
1236 else
1237 # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1238 # they use symlinks in fstab unrelated to what is shown in mount !
1239 if [ _"$partition_mountpt" = _"" ]; then
1240 # set default in case we dont't find it
1241 for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -Ev "^#" | $AWK '{print $1}'`; do
1242 if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
1243 str_to_find_fmt_with=$tmpp
1244 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$tmpp" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1245 break;
1246 fi
1247 done
1248 fi
1249 fi
1250
1251 # Look for devices which have to be excluded
1252 skip=0
1253 if [ "$MINDI_EXCLUDE_DEVS" ] ; then
1254 l=""
1255 list_of_devices="`ReadAllLink $current_partition`"
1256 for d in $list_of_devices; do
1257 l="$l `$MINDI_LIB/analyze-my-lvm --givemapperofdm $d`"
1258 done
1259
1260 # Remove PVs from LVs excluded
1261 l="$l `GetPVsForLV $current_partition`"
1262
1263 # We want a single unique list
1264 list_of_devices="`echo $l | sort -u`"
1265
1266 for d in `echo $MINDI_EXCLUDE_DEVS | sed 's/|/ /g'`; do
1267 if [ "`echo " $list_of_devices " | grep " $d"`" != "" ]; then
1268 echo "Excluding $current_partition from mountlist (due to excluded device $d)" >> $LOGFILE
1269 skip=1
1270 continue
1271 fi
1272 done
1273 fi
1274 if [ $skip -eq 1 ]; then
1275 continue
1276 fi
1277
1278 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1279 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1280 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1281 # the former is then a link to the latter, so we test whether
1282 # $current_partition is actually such a link or not and set
1283 # $current_lvolume accordingly. On Debian you may find more than one answer
1284 # so we remove the one corresponding to /dev/.static
1285 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1286 # principle is the same and we need to find the link to it as well.
1287 # Note that $current_lvolume may well be an
1288 # ordinary device. It is just to make sure that we feed the right value
1289 # into any of the LVM tools if possible.
1290
1291 current_lvolume="$current_partition"
1292 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1293 # .static dir are a Debian specificity
1294 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1295 echo $current_lvolume | grep -q ' '
1296 if [ $? -eq 0 ]; then
1297 echo "WARNING: Multiple Logical Volumes found. Report to dev team" >> $LOGFILE
1298 fi
1299 # if it's not found, it may well be a real device such as a multipath one
1300 # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1301 if [ _"$current_lvolume" = _"" ]; then
1302 current_lvolume="$current_partition"
1303 fi
1304 fi
1305 #
1306 # End of LVM device style variation code (other than $current_lvolume).
1307
1308 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1309 # Size computed via LVM not directly
1310 partition_size="lvm"
1311 else
1312 partition_size=`SizeOfPartition $current_partition`
1313 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1314 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1315 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1316 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1317 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1318 [ "$partition_format" != "swap" ] && partition_format="swap"
1319 if [ "$partition_size" = "" ] ; then
1320 totalsize=0
1321 items=0
1322 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1323 totalsize=$(($totalsize+$i))
1324 items=$(($items+1))
1325 done
1326 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1327 [ "$partition_size" -lt "125000" ] && partition_size=125000
1328 echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1329 fi
1330 fi
1331 fi
1332 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1333 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1334 if [ "$partition_mountpt" = "" ] ; then
1335 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1336 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1337 partition_mountpt="raid"
1338 partition_format="raid"
1339 else
1340 partition_mountpt="lvm"
1341 partition_format="lvm"
1342 fi
1343 fi
1344 fi
1345 psz=$partition_size
1346 echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1347 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1348 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1349 partition_mountpt="image"
1350 old_partition_fmt=$partition_format
1351 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1352 partition_size=$(($partition_size+1)); # just in case
1353 if [ "$partition_format" = "Linux" ] ; then
1354 echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1355 echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1356 partition_format=$old_partition_fmt
1357 fi
1358 fi
1359
1360 if [ ! "$partition_mountpt" ] ; then
1361 echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1362 for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1363 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1364 [ "$partition_format" ] && break
1365 done
1366 echo "------- $FDISK log end ------------" >> $LOGFILE
1367 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1368 partition_format="compaq"
1369 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1370 LogIt "Unable to find mountpoint of $current_partition - ignoring"
1371 continue
1372 fi
1373 fi
1374 if [ "$redhat_label" ]; then
1375 label="$redhat_label"
1376 elif [ "$uuid" ]; then
1377 label="$uuid"
1378 fi
1379 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1380 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1381 unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1382 if [ "$current_partition" = "" ] ; then
1383 echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1384 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1385 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1386 partition_mountpt=raid
1387 partition_format=raid
1388 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1389 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1390 else
1391 echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1392 fi
1393 elif [ "$partition_format" = "" ] ; then
1394 echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1395 elif [ "$partition_size" = "" ] ; then
1396 echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1397 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1398 continue
1399 else
1400 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1401 echo "vfat should be used instead of dos/msdos as a partition format" >> $LOGFILE
1402 partition_format="vfat"
1403 fi
1404 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1405 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1406 fi
1407 done
1408}
1409
1410CheckMountlist() {
1411 local file=$1
1412 # Coherency verification
1413 ML01=`cat $file | wc -l`
1414 ML02=`grep -v ' lvm ' $file | wc -l`
1415 ML1=`$AWK '{print $1}' $file | sort -u | wc -l`
1416 ML2=`grep -v ' lvm ' $file | $AWK '{print $2}' | sort -u | wc -l`
1417 if [ "$ML01" -ne "$ML1" ]; then
1418 echo "--------------------------------------------" >> $LOGFILE
1419 echo "WARNING: Duplicate device entry in mountlist" | tee -a $LOGFILE
1420 echo "--------------------------------------------" >> $LOGFILE
1421 fi
1422 if [ "$ML02" -ne "$ML2" ]; then
1423 echo "--------------------------------------------" >> $LOGFILE
1424 echo "WARNING: Duplicate mountpoint entry in mountlist" | tee -a $LOGFILE
1425 echo "------------------------------------------------" >> $LOGFILE
1426 fi
1427}
1428
1429MakeSureNumberIsInteger() {
1430 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1431 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1432 echo "result = '$res'"
1433 Die "$1 should be an integer"
1434 fi
1435}
1436
1437
1438OfferToMakeBootableISO() {
1439 local i old_pwd
1440 if [ -z "$ISO_CMD" ]; then
1441 LogIt "Neither mkisofs nor genisoimage found, unable to make CD image"
1442 return
1443 fi
1444 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1445 echo -en "Shall I make a bootable CD image? (y/[n]) "
1446 read i
1447 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1448 fi
1449 rm -Rf $MINDI_TMP/iso
1450 mkdir -p $MINDI_TMP/iso/{images,archives}
1451 cp -f $MINDI_CACHE/{*.gz,*.img} $MINDI_TMP/iso/images 2>> $LOGFILE || LogIt "OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1452 echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1453 for i in memdisk memtest.bin memtest.img ; do
1454 j=$MINDI_LIB/$i
1455 k=$MINDI_TMP/iso
1456 if [ -e "$j" ] ; then
1457 LogIt "Copying $j to $k"
1458 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1459 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1460 if [ _"$MONDO_SHARE" != _"" ]; then
1461 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1462 fi
1463 fi
1464 done
1465 MakeMessageFile > $MINDI_TMP/iso/message.txt
1466 if [ $KERNEL_IS_XEN = "yes" ]; then
1467 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?"
1468 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?"
1469 fi
1470 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?"
1471 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?"
1472
1473 if [ _"$MONDO_SHARE" != _"" ]; then
1474 if [ $KERNEL_IS_XEN = "yes" ]; then
1475 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?"
1476 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?"
1477 fi
1478 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?"
1479 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?"
1480 fi
1481 MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1482 if [ "$ARCH" != "ia64" ] ; then
1483 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?"
1484 fi
1485 old_pwd=`pwd`
1486 cd "$MINDI_TMP/iso"
1487 if [ "$ARCH" != "ia64" ] ; then
1488 if [ _"$MONDO_SHARE" != _"" ]; then
1489 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?"
1490 if [ $KERNEL_IS_XEN = "yes" ]; then
1491 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?"
1492 fi
1493 cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1494 fi
1495 $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
1496 else
1497 $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
1498 fi
1499 if [ "$?" -ne "0" ] ; then
1500 echo "----------- $ISO_CMD's errors --------------" >> $LOGFILE
1501 cat $MINDI_TMP/mkisofs.log >> $LOGFILE
1502 echo "$ISO_CMD returned the following errors:-"
1503 cat $MINDI_TMP/mkisofs.log
1504 LogIt "Failed to create ISO image."
1505 else
1506 echo "Created bootable ISO image at $MINDI_CACHE/mindi.iso" | tee -a $LOGFILE
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 echo "Transforming $USBDEVICE in a Bootable device" >> $LOGFILE
1536 echo "Checking $USBDEVICE" >> $LOGFILE
1537 $FDISK -l $USBDEVICE 2>> $LOGFILE 1> $MINDI_TMP/fdisk.log
1538 cat $MINDI_TMP/fdisk.log >> $LOGFILE
1539 if [ $? -ne 0 ]; then
1540 echo "Unable to access $USBDEVICE" | tee -a $LOGFILE
1541 echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1542 exit -1
1543 fi
1544 echo -en "."
1545 echo "Unmounting $USBPART just in case" >> $LOGFILE
1546 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1547 # If your key has no MBR it may cause an issue
1548 # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1549 if [ -r $MBRFILE ]; then
1550 echo "Installing an MBR ($MBRFILE) on $USBDEVICE" | tee -a $LOGFILE
1551 dd if=$MBRFILE of=$USBDEVICE
1552 else
1553 echo "You may need to install an MBR (usually in $MBRFILE, but not found on your system) " | tee -a $LOGFILE
1554 echo "on $USBDEVICE with dd if=$MBRFILE of=$USBDEVICE" | tee -a $LOGFILE
1555 fi
1556 echo "Preparing $USBDEVICE" >> $LOGFILE
1557 cat > $MINDI_TMP/fdisk.txt << EOF
1558d
1559d
1560d
1561d
1562n
1563p
15641
1565
1566
1567t
1568b
1569w
1570EOF
1571 # Search for bootable flag
1572 grep '* ' $MINDI_TMP/fdisk.log | grep $USBDEVICE
1573 if [ $? -ne 0 ]; then
1574 cat >> $MINDI_TMP/fdisk.txt << EOF
1575a
15761
1577w
1578EOF
1579 fi
1580 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE < $MINDI_TMP/fdisk.txt
1581 if [ $? -ne 0 ]; then
1582 echo "Unable to create a vfat Filesystem on $USBDEVICE" | tee -a $LOGFILE
1583 echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1584 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1585 MindiExit -1
1586 fi
1587 echo "fdisk build file" >> $LOGFILE
1588 echo "----------------" >> $LOGFILE
1589 cat $MINDI_TMP/fdisk.txt >> $LOGFILE
1590 echo "----------------" >> $LOGFILE
1591 rm -f $MINDI_TMP/fdisk.log $MINDI_TMP/fdisk.txt
1592 echo "The USB device $USBDEVICE now looks like this:" >> $LOGFILE
1593 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1594 echo -en "."
1595 # Some distro do auto mount at that point (Ubuntu)
1596 echo "Unmounting $USBPART just in case again" >> $LOGFILE
1597 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1598 echo -en "."
1599 echo "Creating a vfat filesystem on $USBPART" >> $LOGFILE
1600 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1601 if [ $? -ne 0 ]; then
1602 echo "Unable to create a vfat filesystem on $USBPART" | tee -a $LOGFILE
1603 echo "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)" | tee -a $LOGFILE
1604 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1605 MindiExit -1
1606 fi
1607 echo -en "."
1608 echo "Mounting $USBPART on $MINDI_TMP/usb" >> $LOGFILE
1609 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1610 if [ $? -ne 0 ]; then
1611 echo "Unable to mount $USBPART on $MINDI_TMP/usb" | tee -a $LOGFILE
1612 echo "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)" | tee -a $LOGFILE
1613 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1614 MindiExit -1
1615 fi
1616 echo -en "."
1617 mkdir -p $MINDI_TMP/usb/images
1618 cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogIt "OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1619 echo -en "."
1620 echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1621 for i in memdisk memtest.bin memtest.img ; do
1622 j=$MINDI_LIB/$i
1623 k=$MINDI_TMP/usb
1624 if [ -e "$j" ] ; then
1625 LogIt "Copying $j to $k"
1626 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1627 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1628 fi
1629 done
1630 echo -en "."
1631 MakeMessageFile > $MINDI_TMP/usb/message.txt
1632 echo -en "."
1633 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?"
1634 echo -en "."
1635 cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1636 echo -en "."
1637 MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1638 echo -en "."
1639 echo "----------- syslinux's conf --------------" |tee -a $LOGFILE
1640 cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
1641 echo "------------------------------------------" |tee -a $LOGFILE
1642 umount $MINDI_TMP/usb
1643 if [ "$ARCH" != "ia64" ] ; then
1644 syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1645 if [ "$?" -ne "0" ] ; then
1646 echo "----------- syslinux's errors --------------" |tee -a $LOGFILE
1647 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1648 echo "------------------------------------------" |tee -a $LOGFILE
1649 LogIt "Failed to create USB image."
1650 else
1651 echo -e "$DONE"
1652 echo "Created bootable USB image on $USBDEVICE" >> $LOGFILE
1653 fi
1654 rm -f $MINDI_TMP/syslinux.log
1655 else
1656 echo "No USB boot support for ia64" | tee -a $LOGFILE
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 "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 echo "Copying $MINDI_TMP/initrd.img to $mountpoint..." >> $LOGFILE
1833 cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1834 if [ "$?" -ne "0" ] ; then
1835 LogIt "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 "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1840 retval=$(($retval+1))
1841 fi
1842 MakeMessageFile > $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 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1856 du -sk $mountpoint/* >> $LOGFILE
1857 echo "--- end of list of files ---" >> $LOGFILE
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 "Cannot rmdir (PBDI)"
1863 # losetup /dev/loop0 -d
1864 [ "$imagefile" != "" ] && rm -f $imagefile
1865 LogIt "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 echo "Free space left on image = $free_space KB" >> $LOGFILE
1871 echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
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 echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
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 "Cannot rmdir (PBDI)"
1883 if [ "$retval" -eq "0" ] ; then
1884 echo -en "...$DONE\n"
1885 if [ "$KERN_DISK_MADE" ] ; then
1886 LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1887 fi
1888 else
1889 echo -en "...failed\n"
1890 LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1891 [ "$imagefile" != "" ] && rm -f $imagefile
1892 fi
1893 [ "$retval" -ne "0" ] && LogIt "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 echo "Creating vfat filesystem on $imagefile" >> $LOGFILE
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 "Cannot mount (PBDI)"
1924
1925 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1926 MakeMessageFile > $mountpoint/message.txt
1927 MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1928 echo "Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..." >> $LOGFILE
1929 cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1930 if [ "$?" -ne "0" ] ; then
1931 LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1932 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1933 LogIt "Please unload some of your modules and try again."
1934 rm -f $MINDI_TMP/mtpt.$$
1935 LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?). Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1936 retval=$(($retval+1))
1937 fi
1938
1939 mkdir -p $mountpoint/tmp
1940 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1941 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1942 fi
1943
1944 # copy the kernel across
1945 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1946 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1947 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1948
1949 retval=0
1950 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1951 retval=$?
1952 if [ $KERNEL_IS_XEN = "yes" ]; then
1953 cp -f $xenkernelpath $mountpoint/xenkernel &> /dev/null
1954 let retval+=$?
1955 fi
1956
1957 if [ "$retval" -ne "0" ] ; then
1958 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1959 du -sk $mountpoint/* >> $LOGFILE
1960 echo "--- end of list of files ---" >> $LOGFILE
1961 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
1962 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1963 cd "$old_pwd"
1964 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1965 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1966
1967 LogIt "Sorry, your kernel is too big for your image"
1968 Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1969 fi
1970 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1971 echo "Free space left on image = $free_space KB" >> $LOGFILE
1972 echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
1973
1974 # make it bootable
1975 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1976 mkdir -p $mountpoint/etc
1977 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1978 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1979 echo -en "..."
1980 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1981
1982 if [ "$retval" -eq "0" ] ; then
1983 echo -en "...$DONE\n"
1984 if [ "$KERN_DISK_MADE" ] ; then
1985 [ "$imagefile" != "" ] && rm -f $imagefile
1986 LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1987 fi
1988 else
1989 echo -en "...failed\n"
1990 LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1991 [ "$imagefile" != "" ] && rm -f $imagefile
1992 fi
1993 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1994 return $retval
1995}
1996
1997
1998ParseModprobeForIncludes() {
1999local MODPROBE_CONF mpincfile includes include
2000
2001MODPROBE_CONF=/etc/modprobe.conf
2002mpincfile=$1
2003touch $mpincfile
2004if [ -a $MODPROBE_CONF ]; then
2005 includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
2006 if [ -n "$includes" ]; then
2007 for include in $includes
2008 do
2009 if [ -a "$include" ]; then
2010 echo $include >> $mpincfile
2011 fi
2012 done
2013 fi
2014fi
2015}
2016
2017
2018PrepareDataDiskImages() {
2019 local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
2020
2021 imagesdir=$MINDI_CACHE
2022 rm -f $imagesdir/mindi.iso
2023 needlist=$MINDI_TMP/what-we-need.txt
2024 bigdir=$MINDI_TMP/bigdir
2025 mkdir -p $bigdir/usr/bin
2026 mkdir -p $bigdir/usr/sbin
2027 includefile=$MINDI_TMP/$$.includefile.txt
2028
2029 if [ -e "$DEPLIST_FILE" ]; then
2030 lfiles="$DEPLIST_FILE $DEPLIST_DIR/*"
2031 else
2032 lfiles="$DEPLIST_DIR/*"
2033 fi
2034 lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
2035 ParseModprobeForIncludes $includefile
2036 lines=$(($lines+`cat $includefile | wc -l`))
2037 cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
2038 res=$?
2039 rm -f $includefile
2040 if [ "$YOUR_KERNEL_SUCKS" ]; then
2041 pwd=`pwd`
2042 cd "$MINDI_TMP"
2043 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2044 tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
2045 done
2046 for i in $EXTRA_MODS ; do
2047 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
2048 [ ! "$j" ] && echo "WARNING - cannot find failsafe module $i.o.gz" >> $LOGFILE
2049 for k in $j ; do
2050 tar cf - $k 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "ERROR on module $k" $MINDI_TMP/$$.log
2051 echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2052 done
2053 done
2054 cd "$pwd"
2055 else
2056 ListKernelModulePaths >> $needlist
2057 fi
2058 if [ "$res" -ne "0" ] ; then
2059 Die "You have $res files present in dependency list\nbut absent from filesystem."
2060 fi
2061 FindAndAddUserKeyboardMappingFile
2062 mkdir -p $bigdir/tmp
2063 if [ _"$MONDO_SHARE" != _"" ]; then
2064 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2065 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
2066 fi
2067 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2068 DropOptimizedLibraries $needlist $bigdir
2069 echo -en "Assembling dependency files"
2070 CopyDependenciesToDirectory < $needlist $bigdir
2071
2072 # also copy io.sys and msdos.sys, if we can find them
2073 for i in `mount | cut -d' ' -f3` ; do
2074 for j in io.sys msdos.sys ; do
2075 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
2076 done
2077 done
2078
2079 # master boot record, too
2080 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2081 if [ "$i" ] ; then
2082 LogIt "Backing up $i's MBR"
2083 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2084 sleep 1
2085 sync
2086 j=$i
2087 [ -h "$j" ] && j=`readlink -f $j`
2088 LogIt "Creating /dev/boot_device ($j)"
2089 mkdir -p $bigdir/dev
2090 cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
2091 fi
2092
2093 old_pwd=`pwd`
2094 cd "$bigdir"
2095
2096 # Get terminfo content
2097 ti="usr/share/terminfo/l"
2098 if [ -d /$ti ]; then
2099 mkdir -p $ti
2100 cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogIt "WARNING - error occurred while copying terminfo"
2101 fi
2102 if [ -e "$MONDO_SHARE/restore-scripts" ]; then
2103 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2104 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2105 fi
2106 if [ -d "/lib/dev-state" ]; then
2107 tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
2108 fi
2109 cd "$old_pwd"
2110 echo -e "$DONE"
2111 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2112 MakeMountlist $MINDI_TMP/mountlist.txt
2113 CheckMountlist $MINDI_TMP/mountlist.txt
2114 mkdir -p $bigdir/tmp
2115 cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
2116 if [ _"$MONDO_SHARE" != _"" ]; then
2117 cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
2118 fi
2119 if [ $LVM != "false" ]; then
2120 $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
2121 if [ "$?" -ne "0" ]; then
2122 LVM="false"
2123 rm -f $bigdir/tmp/i-want-my-lvm
2124 else
2125 echo "Your i-want-my-lvm file content is:" >> $LOGFILE
2126 echo "-----------------------------------" >> $LOGFILE
2127 cat $bigdir/tmp/i-want-my-lvm >> $LOGFILE
2128 echo "-----------------------------------" >> $LOGFILE
2129 fi
2130 fi
2131 echo "Your mountlist.txt file content is:" >> $LOGFILE
2132 echo "-----------------------------------" >> $LOGFILE
2133 cat $bigdir/tmp/mountlist.txt >> $LOGFILE
2134 echo "-----------------------------------" >> $LOGFILE
2135
2136 echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
2137 echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
2138 if [ _"$MONDO_SHARE" != _"" ]; then
2139 for q in filelist.full.gz biggielist.txt ; do
2140 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2141 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
2142 done
2143 fi
2144
2145 echo -en "Tarring and zipping the data content..."
2146 size_of_all_tools=`du -sk $bigdir | cut -f1`
2147 (cd "$bigdir" ; tar -b 4096 -cf - . 2>> $MINDI_TMP/$$.log | gzip -9 > $imagesdir/all.tar.gz || LogIt "Problem creating all.tar.gz" $MINDI_TMP/$$.log)
2148 du -sk $imagesdir/*gz >> $LOGFILE
2149 echo -e "$DONE"
2150
2151 FRIENDLY_OUTSTRING="Boot and data disk images were created."
2152 rm -rf $bigdir
2153 rm -f $needlist
2154}
2155
2156
2157ProcessLDD() {
2158 local incoming f d nd bd bnd
2159 read incoming
2160 while [ "$incoming" != "" ]; do
2161 # We take the full path name of the dyn. lib. we want
2162 incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
2163 for f in $incoming ; do
2164 # echo modified file name if one of the parent dir is a link
2165 # by replacing the original dirname by the destination of the link
2166 d="`dirname $f`"
2167 found="false"
2168 while [ "$d" != "/" ]; do
2169 if [ -h "$d" ]; then
2170 nd=`readlink -f $d`
2171 bd=`basename $d`
2172 bnd=`basename $nd`
2173 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2174 echo $d
2175 fi
2176 d="`dirname $d`"
2177 done
2178
2179 echo "$f"
2180 echo "`ReadAllLink $f`"
2181 done
2182 read incoming
2183 done
2184}
2185
2186
2187Prompt() {
2188 echo -en "$1"
2189 read line
2190}
2191
2192
2193ReadLine() {
2194 local i incoming
2195 read incoming
2196 i=0
2197 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2198 i=$(($i+1))
2199 read incoming
2200 done
2201 echo "$incoming"
2202}
2203
2204
2205SizeOfPartition() {
2206 local devpath drive res stub
2207 device=$1
2208 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2209 res=`SizeOfRaidPartition $device`
2210 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2211 echo "$res"
2212 return 0
2213 fi
2214 # patch from Bill <bill@iwizard.biz> - 2003/08/25
2215 res=`$FDISK -s $device 2>> $LOGFILE`
2216 # end patch
2217 # take only the first in case of multiple mount (cifs, nfs, ...)
2218 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
2219 [ "$res" = "" ] && res="-1"
2220 echo $res
2221 return 0
2222}
2223
2224
2225SizeOfRaidPartition() {
2226 local real_dev smallest_size silly tmp
2227
2228 silly=999999999
2229 smallest_size=$silly
2230
2231 for real_dev in `GetRaidDevMembers $1` ; do
2232 tmp=`SizeOfPartition $real_dev`
2233 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2234 done
2235
2236 if [ "$smallest_size" = "$silly" ] ; then
2237 echo "-1"
2238 return 1
2239 else
2240 echo "$smallest_size"
2241 return 0
2242 fi
2243}
2244
2245
2246StripComments()
2247{
2248 local tempfile
2249
2250 tempfile=$MINDI_TMP/$$.strip.txt
2251 cp -f $1 $tempfile 2>> $LOGFILE
2252 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2253 rm -f $tempfile
2254 echo "Stripped comments from $2" >> $LOGFILE
2255}
2256
2257
2258
2259StripExecutable()
2260{
2261 local tmpfile
2262
2263 tmpfile=$MINDI_TMP/stripped.$$.dat
2264 [ -d "$1" ] || [ -h "$1" ] && return
2265 cp -f $1 $tmpfile 2>> $LOGFILE
2266 strip $tmpfile 2> /dev/null
2267 if [ "$?" -eq "0" ] ; then
2268 cp -f $tmpfile $1 2>> $LOGFILE
2269 echo "Stripped binary $2" >> $LOGFILE
2270 fi
2271 rm -f $tmpfile
2272}
2273
2274KernelVer() {
2275 local fkern_ver fname
2276
2277 fname=$1
2278 file $fname | grep -q gzip
2279 if [ "$?" -eq "0" ] ; then
2280 # Used by ia64
2281 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2282 else
2283 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2284 fi
2285 echo "$fkern_ver"
2286}
2287
2288
2289# WARNING: This function should just echo the final result !!!
2290#
2291TryToFindKernelPath() {
2292 local fname fkern_ver we_want_version possible_kernels noof_kernels possible_xenkernels noof_xenkernels kp kdate duff_kernels output root
2293
2294 we_want_version=$KERVERRUN
2295 possible_kernels=""
2296 duff_kernels=""
2297 output=""
2298
2299 if [ "$ARCH" = "ia64" ] ; then
2300 root="/boot/efi/efi"
2301 else
2302 root="/"
2303 fi
2304 # See if we're booted from a Xen kernel
2305 # From http://wiki.xensource.com/xenwiki/XenCommonProblems#head-26434581604cc8357d9762aaaf040e8d87b37752
2306 if [ -f /proc/xen/capabilities ]; then
2307 # It's a Xen kernel
2308 KERNEL_IS_XEN="yes"
2309 LogFile "It's a Xen kernel..."
2310 fi
2311
2312 for fname in `find $root -maxdepth 2 -type f | grep -Ei 'lin|kern|xen' | grep -Ev '^/proc/|^/net/'` ; do
2313 [ ! -e "$fname" ] && continue
2314 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2315 fkern_ver=`KernelVer $fname`
2316 [ "$fkern_ver" = "" ] && continue
2317 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2318 [ -f "$fname" ] || continue
2319 [ -h "$fname" ] && continue
2320 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2321 file $fname | grep -q gzip
2322 if [ "$?" -eq "0" ] ; then
2323 # Used by ia64
2324 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2325 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2326 duff_kernels="$fname $duff_kernels"
2327 else
2328 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2329 possible_kernels="$fname $possible_kernels"
2330 fi
2331 else
2332 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2333 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2334 duff_kernels="$fname $duff_kernels"
2335 else
2336 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2337 possible_kernels="$fname $possible_kernels"
2338 fi
2339 fi
2340 done
2341 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2342 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2343 fi
2344 if [ ! "$possible_kernels" ] ; then
2345 LogFile "No kernel matches exactly. Are there any duff kernels?"
2346 possible_kernels="$duff_kernels"
2347 if [ ! "$possible_kernels" ] ; then
2348 LogFile "Sorry, no duff kernels either"
2349 else
2350 LogFile "I bet you're running Debian or Gentoo, aren't you?"
2351 LogFile "Your kernel doesn't have a sane builddate. Oh well..."
2352 fi
2353 fi
2354 if [ $KERNEL_IS_XEN = "yes" ]; then
2355 possible_xenkernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -i "xen" | sort -u | tr '\n' ' '`
2356 noof_xenkernels=`CountItemsIn "$possible_xenkernels"`
2357 FindMboot32Binary
2358 fi
2359 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -vi "xen" | sort -u | tr '\n' ' '`
2360 noof_kernels=`CountItemsIn "$possible_kernels"`
2361 if [ "$noof_kernels" -eq "0" ] ; then
2362 LogFile "Could not find your kernel."
2363 if [ -e "/boot/vmlinuz" ] ; then
2364 LogFile "Using /boot/vmlinuz as a last resort."
2365 output=/boot/vmlinuz
2366 else
2367 output=""
2368 fi
2369 elif [ "$noof_kernels" -eq "1" ] ; then
2370 kp=`echo "$possible_kernels" | sed s/' '//`
2371 LogFile "Your kernel is $kp (v$KERVERRUN)"
2372 output="$kp"
2373 else
2374 for i in $possible_kernels ; do
2375 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2376 LogFile "OK, I used my initiative and found that "
2377 LogFile "$i is probably your kernel. "
2378 output="$i"
2379 break
2380 fi
2381 done
2382 if [ ! -n "$output" ]; then
2383 if [ "`echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null`" ]; then
2384 output=/boot/vmlinuz
2385 LogFile "Schlomo, this one's for you."
2386 else
2387 LogFile "Two or more possible kernels found. You may specify any one of them and the "
2388 LogFile "boot disks will still work, probably. If one does not work, try another."
2389 LogFile "$possible_kernels"
2390 output=""
2391 fi
2392 fi
2393 fi
2394 if [ $KERNEL_IS_XEN = "yes" ]; then
2395 if [ "$noof_xenkernels" -eq "0" ]; then
2396 xenkernelpath=""
2397 elif [ "$noof_xenkernels" -eq "1" ]; then
2398 xenkernelpath=`echo "$possible_xenkernels" | sed s/' '//`
2399 LogFile "Your Xen kernel is $xenkernelpath (v$KERVERRUN)"
2400 else
2401 for i in $possible_xenkernels ; do
2402 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2403 LogFile "OK, I used my initiative and found that "
2404 LogFile "$i is probably your Xen kernel. "
2405 xenkernelpath="$i"
2406 break
2407 fi
2408 done
2409 if [ ! -n "$xenkernelpath" ]; then
2410 new_possible_xenkernels=`echo "$possible_xenkernels" | tr -s ' ' '\n' | grep -E "^/boot" | sort -u | tr '\n' ' '`
2411 if [ ! -n "$new_possible_xenkernels" ]; then
2412 xenkernelpath=`echo $new_possible_xenkernels | tr -s ' ' '\n' | head -1`
2413 LogFile "Using $xenkernelpath"
2414 else
2415 LogFile "Two or more possible Xen kernels found. You may specify any one of them and the "
2416 LogFile "boot disks will still work, probably. If one does not work, try another."
2417 LogFile "$possible_xenkernels"
2418 output=""
2419 xenkernelpath=`echo $possible_xenkernels | tr -s ' ' '\n' | head -1`
2420 LogFile "Using $xenkernelpath"
2421 fi
2422 fi
2423 fi
2424 if [[ -z "$xenkernelpath" || ! -f "$xenkernelpath" ]]; then
2425 Die "Cannot find Xen kernel $xenkernelpath, aborting"
2426 fi
2427 fi
2428 LogAll "TryToFindKernelPath found $output"
2429 echo "$output"
2430}
2431
2432
2433TurnTgzIntoRdz() {
2434 local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2435
2436 tgz_dir_fname=$1
2437 rdz_fname=$2
2438 kernelsize=$3
2439 maxsize=$(($BOOT_SIZE-$kernelsize))
2440 maxsize=$(($maxsize*2)); # to allow for compression of 50%
2441 tempfile=$MINDI_TMP/temp.rd
2442 mountpoint=$MINDI_TMP/mnt1
2443 res=0
2444 echo -en "..."
2445 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2446 echo -en "..."
2447 echo "Creating ext2 filesystem on $tempfile" >> $LOGFILE
2448 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2449 echo -en "..."
2450 mkdir -p $mountpoint
2451 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."
2452 echo -en "..."
2453 old_pwd=`pwd`
2454 cd "$mountpoint"
2455
2456 # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
2457 if [ -h "/lib64" ]; then
2458 mkdir -p lib || LogIt "Unable to create lib in $mountpoint."
2459 ln -s lib lib64 || LogIt "/lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2460 fi
2461
2462 cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
2463 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2464
2465 cd dev || Die "Can't cd to dev"
2466 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2467 rm -f dev-entries.tgz
2468 cd ..
2469
2470 for w in insmod.static insmod.static.old ; do
2471 s=`which $w 2> /dev/null`
2472 if [ -e "$s" ] ; then
2473 tar cf - -C / $s 2> /dev/null | tar xf -
2474 fi
2475 done
2476
2477 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2478
2479 # Handle the case where busybox and mount are dynamically linked
2480 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2481 if [ $? -eq 0 ]; then
2482 # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2483 rm -f bin/mount $MINDI_TMP/busy.lis
2484 mountlis=`grep -E "mount|fuse|ssh" $DEPLIST_FILE $DEPLIST_DIR/* | grep -v " *#.*" | cut -d: -f2 | sort -u`
2485 LocateDeps $MINDI_LIB/rootfs/bin/busybox $mountlis >> $MINDI_TMP/busy.lis
2486 # Special for libs
2487 for f in `grep -E "libnss" $DEPLIST_FILE $DEPLIST_DIR/* | grep -v " *#.*" | cut -d: -f2`; do
2488 echo "`ReadAllLink $f`" >> $MINDI_TMP/busy.lis
2489 done
2490 # Initial / are trucated by tar
2491 tar cf - $mountlis `sort -u $MINDI_TMP/busy.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in mount analysis" $MINDI_TMP/$$.log
2492 rm -f $MINDI_TMP/busy.lis
2493 fi
2494
2495 # Copy of files mandatory for ssh to automate mount if sshfs is used
2496 mkdir $mountpoint/.ssh
2497 cp -rp ~root/.ssh/* $mountpoint/.ssh 2> /dev/null
2498 echo > $mountpoint/tmp/myssh << EOF
2499ssh -o StrictHostKeyChecking=no $*
2500EOF
2501 chmod 755 $mountpoint/tmp/myssh
2502
2503 # Copy of files mandatory for ld.so
2504 cp -rp /etc/ld.so.c* $mountpoint/etc
2505
2506 # Avoid an issue on some distro (RHEL5)
2507 rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2508
2509 mkdir -p $mountpoint/tmp
2510 # Management of udev (which includes modprobe in rules)
2511 ps auxww | grep -v grep | grep -qw udevd
2512 if [ $? -eq 0 ]; then
2513 echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2514 LogIt "udev device manager found"
2515 tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2516 # This avoids NIC remapping if on another machine at restore time on Debian at least
2517 rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2518 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2519 rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2520 # Do not do it if it's a link (Ubuntu 64 bits #503)
2521 if [ -e "/lib64/udev" ] && [ ! -h "/lib64" ] && [ ! -h "/lib64/udev" ]; then
2522 tar cf - -C / /lib64/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in /lib64/udev analysis" $MINDI_TMP/$$.log
2523 fi
2524 if [ -e "/lib32/udev" ] && [ ! -h "/lib32" ] && [ ! -h "/lib32/udev" ]; then
2525 tar cf - -C / /lib32/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in /lib32/udev analysis" $MINDI_TMP/$$.log
2526 fi
2527 if [ -e "/lib/udev" ] && [ ! -h "/lib" ] && [ ! -h "/lib/udev" ]; then
2528 tar cf - -C / /lib/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2529 fi
2530 if [ -x /sbin/udevd ]; then
2531 lis2=`grep -Ev '^#' $MINDI_CONF/udev.files`
2532 lis=""
2533 # Get only the files which exist in that list
2534 # and potentially their symlink structure
2535 for i in $lis2; do
2536 if [ -h $i ]; then
2537 j=$i
2538 while [ -h $j ]; do
2539 lis="$lis $j"
2540 j=`readlink $j`
2541 done
2542 lis="$lis $j"
2543 elif [ -f $i ]; then
2544 lis="$lis $i"
2545 fi
2546 done
2547 # And their deps
2548 LocateDeps $lis > $MINDI_TMP/udev.lis
2549 for i in $lis; do
2550 if [ "`echo $i | cut -c1`" = "/" ]; then
2551 j=`echo $i | cut -c2-`
2552 [ "$j" != "" ] && rm -f $j
2553 fi
2554 done
2555 tar cf - -C / $lis `sort -u $MINDI_TMP/udev.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in udev.lis analysis" $MINDI_TMP/$$.log
2556 rm -f $MINDI_TMP/udev.lis
2557 else
2558 echo "udevd daemon not in standard place (/sbin)" 2>&1 | tee -a $LOGFILE
2559 echo "mindi will use static devices which may cause problems" 2>&1 | tee -a $LOGFILE
2560 rm -f $mountpoint/tmp/USE-UDEV
2561 fi
2562 fi
2563
2564 # Management of potential HW info (ProLiant only at the moment)
2565 rm -rf $MINDI_CACHE/bkphw
2566 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2567 if [ -d $MINDI_CACHE/bkphw ]; then
2568 LogIt "Hardware Information found and saved ..."
2569 cp -rp $MINDI_CACHE/bkphw .
2570 if [ -f $MINDI_CACHE/tools.files ]; then
2571 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
2572 LocateDeps $lis > $MINDI_TMP/tools.lis
2573 tar cf - $lis `sort -u $MINDI_TMP/tools.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in tools.lis analysis" $MINDI_TMP/$$.log
2574 fi
2575 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2576 mv -f $MINDI_CACHE/mindi-rsthw .
2577 chmod 755 ./mindi-rsthw
2578 fi
2579 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2580 fi
2581
2582 # Management of perl scripts delivered needed at restore time
2583 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2584 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in perl scripts analysis" $MINDI_TMP/$$.log
2585
2586 for w in cdrom groovy-stuff ; do
2587 mkdir -p mnt/$w
2588 done
2589
2590 tar cf - -C / /dev/fd0*[1,2][4,7,8]* 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in fd dev analysis" $MINDI_TMP/$$.log
2591
2592 cd "$old_pwd"
2593 echo -en "..."
2594 old_pwd=`pwd`
2595 if [ "$YOUR_KERNEL_SUCKS" ] ; then
2596 cd "$MINDI_TMP"
2597 needed_modules_path=lib/modules/$FAILSAFE_KVER
2598 else
2599 cd /
2600 if [ "${kernelname}" != "" ]
2601 then
2602 needed_modules_path=lib/modules/${kernelname}
2603 else
2604 needed_modules_path=lib/modules/$KERVERRUN
2605 fi
2606 fi
2607
2608 needed_modules=""
2609 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2610
2611 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
2612 # For PXE boot
2613 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2614 fi
2615 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2616 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2617 fi
2618 for i in $DENY_MODS; do
2619 echo "Removing $i from the list of modules to load" >> $LOGFILE
2620 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2621 done
2622
2623 [ -e "$needed_modules_path" ] || LogIt "path $needed_modules_path does not exist.\n If you're not using a modular kernel then you're NUTS."
2624 for i in $list_of_groovy_mods ; do
2625 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2626 done
2627
2628 for i in `echo $needed_modules | tr ' ' '\n' | sort -u`; do
2629 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2630 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2631 echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2632 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd "$mountpoint" ; tar xf -) || LogIt "Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
2633 # Uncompress modules if not using udev and native modprobe
2634 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2635 if [ "`echo "$i" | grep -F ".gz"`" ]; then
2636 echo "Uncompressing $i" >> $LOGFILE
2637 gunzip -f $mountpoint/$i
2638 fi
2639 fi
2640 done
2641
2642 # Also copy modules.dep in case of udev so that normal modprobe works
2643 tar cf - -C / /$needed_modules_path/modules.dep 2>> $MINDI_TMP/$$.log | (cd "$mountpoint" ; tar xf -) || LogIt "Unable to copy modules.dep to $mountpoint" $MINDI_TMP/$$.log
2644
2645 # Copy FW in case some drivers needs it
2646 if [ -d "/lib/firmware" ]; then
2647 cp -rp /lib/firmware $mountpoint/lib
2648 fi
2649
2650 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2651 echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2652 [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2653 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2654 rm -f $mountpoint/sbin/devfsd
2655 fi
2656 cd "$old_pwd"
2657 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2658 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2659 rm -f $mountpoint/zero
2660 if [ _"$MONDO_SHARE" != _"" ]; then
2661 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2662 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2663 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2664 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2665 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2666 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2667 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2668 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2669 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2670 fi
2671 mkdir -p $mountpoint/proc
2672 echo "---------------------------" >> $LOGFILE
2673 echo "Content of initial ramdisk:" >> $LOGFILE
2674 echo "---------------------------" >> $LOGFILE
2675 (cd "$mountpoint" ; ls -Rla ) >> $LOGFILE
2676 echo "---------------------------" >> $LOGFILE
2677
2678 # Determine what filesystem to use for initrd image
2679 echo "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd." >> $LOGFILE
2680 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2681 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2682 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ]; then
2683 # say what will be used
2684 echo "Creating an $gvFileSystem initrd image..." >> $LOGFILE
2685 # kernel expects linuxrc in ext2 filesystem
2686 ( cd "$mountpoint" && ln -sf sbin/init linuxrc )
2687 # unmount loop filesystem and create image file using the standard approach
2688 umount $mountpoint || Die "Cannot unmount $tempfile"
2689 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2690 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2691 MINDI_ADDITIONAL_BOOT_PARAMS="$MINDI_ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2692 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2693 rm -f ${rdz_fname}.tmp
2694 # log that we are done
2695 echo "...done." >> $LOGFILE
2696 elif [ "$gvFileSystem" = "initramfs" ]; then
2697 # say what will be used
2698 echo "Creating a gzip'ed cpio (AKA initramfs) initrd image..." >> $LOGFILE
2699 # make sure that cpio is there
2700 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2701 # go into filesystem
2702 cd "$mountpoint"
2703 # kernel expects init in cpio filesystem
2704 ln -sf sbin/init init
2705 # create cpio image file and unmount loop filesystem
2706 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2707 cd "$old_pwd"
2708 umount $mountpoint || Die "Cannot unmount $tempfile"
2709 # log that we are done
2710 echo "...done." >> $LOGFILE
2711 else
2712 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2713 fi
2714
2715 if [ "$res" -eq "0" ] ; then
2716 echo -en "..."
2717 else
2718 echo -en "\rMade an rdz WITH ERRORS. \n"
2719 fi
2720 return 0
2721}
2722
2723
2724##############################################################################
2725#----------------------------------- Main -----------------------------------#
2726##############################################################################
2727
2728# Now we can create what we need
2729mkdir -p $MINDI_TMP
2730
2731# Purge from potential old run
2732if [ _"$MINDI_CACHE" = _"" ]; then
2733 Die "MINDI_CACHE undefined"
2734fi
2735
2736if [ "$1" = "--printvar" ] ; then
2737 shift
2738 if [ _"$1" != _"" ] ; then
2739 set | grep -Ew "^$1" | cut -d= -f2
2740 fi
2741 exit 0
2742fi
2743
2744> $LOGFILE
2745echo "mindi v$MINDI_VERSION" >> $LOGFILE
2746echo "$ARCH architecture detected" >> $LOGFILE
2747echo "mindi called with the following arguments:" >> $LOGFILE
2748echo "$@" >> $LOGFILE
2749echo "Start date : `date`" >> $LOGFILE
2750echo "-----------------------------" >> $LOGFILE
2751
2752[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2753
2754# Log some capital variables
2755[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2756echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
2757echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
2758echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
2759[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2760echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
2761if [ -f $MINDI_CONFIG ]; then
2762 echo "-----------------------------" >> $LOGFILE
2763 echo " Mindi configuration file " >> $LOGFILE
2764 echo "-----------------------------" >> $LOGFILE
2765 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2766 echo "-----------------------------" >> $LOGFILE
2767fi
2768
2769
2770trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2771
2772# Sanity checks
2773which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2774which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2775which 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."
2776which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2777if which awk &> /dev/null ; then
2778 if ! which gawk &> /dev/null ; then
2779 LogIt "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"
2780 fi
2781fi
2782which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2783[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
2784
2785[ "`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"
2786
2787# Update the PATH variable if incomplete
2788if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2789 PATH=$PATH:/sbin:/usr/sbin
2790 export PATH
2791 echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
2792 echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
2793 echo " Or you might like to call 'su -' instead of 'su', for example." >> $LOGFILE
2794fi
2795
2796# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2797if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2798 source $MINDI_LIB/FindDistroFailsafe
2799 # Log kernel image
2800 LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2801else
2802 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2803fi
2804
2805if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2806 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2807fi
2808
2809### BERLIOS
2810### Fix as it's not mandatory on ia64
2811if [ "$ARCH" = "ia64" ] ; then
2812 if which elilo &> /dev/null ; then
2813 LILO_EXE=elilo
2814 else
2815 LILO_EXE=`which false 2> /dev/null`
2816 fi
2817else
2818 FindIsolinuxBinary
2819fi
2820trap "Aborted" SIGTERM
2821DONE="\r\t\t\t\t\t\t\t\tDone. "
2822kernelpath=""
2823MONDO_ROOT=/var/cache/mondo
2824mkdir -p $MONDO_ROOT
2825
2826if [ -d "/proc/lvm" ]; then
2827 # LVM v1
2828 LVMCMD=""
2829 LVM="v1"
2830elif [ -d "/dev/mapper" ]; then
2831 # LVM v2
2832 LVMCMD="lvm"
2833 LVM="v2"
2834else
2835 LVM="false"
2836fi
2837echo "LVM set to $LVM" >> $LOGFILE
2838echo "----------" >> $LOGFILE
2839echo "mount result:" >> $LOGFILE
2840echo "-------------" >> $LOGFILE
2841mount >> $LOGFILE
2842echo "-------------" >> $LOGFILE
2843if [ -e /etc/raidtab ]; then
2844 echo "-------------" >> $LOGFILE
2845 echo "/etc/raidtab content:" >> $LOGFILE
2846 echo "-------------" >> $LOGFILE
2847 cat /etc/raidtab >> $LOGFILE
2848fi
2849echo "-------------" >> $LOGFILE
2850echo "cat /proc/cmdline:" >> $LOGFILE
2851echo "-------------" >> $LOGFILE
2852cat /proc/cmdline >> $LOGFILE
2853echo "-------------" >> $LOGFILE
2854echo "cat /proc/swaps:" >> $LOGFILE
2855echo "-------------" >> $LOGFILE
2856cat /proc/swaps >> $LOGFILE
2857echo "-------------" >> $LOGFILE
2858echo "cat /proc/partitions:" >> $LOGFILE
2859echo "-------------" >> $LOGFILE
2860cat /proc/partitions >> $LOGFILE
2861echo "-------------" >> $LOGFILE
2862echo "cat /proc/filesystems:" >> $LOGFILE
2863echo "-------------" >> $LOGFILE
2864cat /proc/filesystems >> $LOGFILE
2865echo "-------------" >> $LOGFILE
2866echo "lsmod result:" >> $LOGFILE
2867echo "-------------" >> $LOGFILE
2868lsmod >> $LOGFILE
2869MODULES="`cat /proc/modules | $AWK '{print $1}'`"
2870if [ -x /usr/sbin/esxcfg-module ]; then
2871 echo "-------------" >> $LOGFILE
2872 echo "VMWare ESX server detected - Enabling dedicated support" >> $LOGFILE
2873 echo "-------------" >> $LOGFILE
2874 echo "VMWare modules" >> $LOGFILE
2875 echo "-------------" >> $LOGFILE
2876 /usr/sbin/esxcfg-module -l >> $LOGFILE
2877 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
2878fi
2879echo "FORCE_MODS:" >> $LOGFILE
2880echo "-------------" >> $LOGFILE
2881echo $FORCE_MODS >> $LOGFILE
2882echo "-------------" >> $LOGFILE
2883echo "DENY_MODS:" >> $LOGFILE
2884echo "-------------" >> $LOGFILE
2885echo $DENY_MODS >> $LOGFILE
2886echo "-------------" >> $LOGFILE
2887echo "df result:" >> $LOGFILE
2888echo "----------" >> $LOGFILE
2889df -T >> $LOGFILE
2890echo "-------------" >> $LOGFILE
2891echo "Liste of extra modules is:" >> $LOGFILE
2892echo "$EXTRA_MODS" >> $LOGFILE
2893echo "-------------" >> $LOGFILE
2894
2895# Compute libata version
2896laver=`modinfo libata 2> /dev/null | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
2897# If libata v2 is used then remove ide-generic as it will perturbate boot
2898if [ "`echo $MODULES | grep libata`" ]; then
2899 if [ "$laver" = "2" ]; then
2900 DENY_MODS="$DENY_MODS ide-generic"
2901 echo "ide-generic removed from module list as your system uses libata v2+" >> $LOGFILE
2902 echo "-------------" >> $LOGFILE
2903 fi
2904fi
2905
2906# Check for ISO_CMD command
2907if [ ! -x $ISO_CMD ]; then
2908 echo "NOTE: No CD image (ISO file) utility found" >> $LOGFILE
2909fi
2910
2911FLOPPY_WAS_MOUNTED=""
2912for mtpt in /media/floppy /mnt/floppy /floppy ; do
2913 if mount | grep -w $mtpt &> /dev/null ; then
2914 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2915 umount $mtpt
2916 fi
2917done
2918
2919#
2920# If we have a USB device we need to store info
2921# and remove it from the parameters line
2922#
2923if [ "$#" -ne "0" ] ; then
2924 if [ "$1" = "--usb" ] ; then
2925 shift
2926 USBDEVICE=$1
2927 if [ _"$USBDEVICE" = _"" ]; then
2928 Die "No USB device specified"
2929 fi
2930 shift
2931 fi
2932fi
2933
2934if [ "$#" -ne "0" ] ; then
2935 if [ "$1" = "--findkernel" ] ; then
2936 resk=`TryToFindKernelPath`
2937 # Avoids logfile content for mondo
2938 export MONDO_SHARE=""
2939 if [ "$resk" = "" ] ; then
2940 if [ $KERNEL_IS_XEN = "yes" ]; then
2941 echo "$xenkernelpath"
2942 LogOnly "xenkernelpath = $xenkernelpath"
2943 MindiExit 0
2944 else
2945 MindiExit -1
2946 fi
2947 else
2948 echo "$resk"
2949 LogOnly "kernelpath = $resk"
2950 MindiExit 0
2951 fi
2952 elif [ "$1" = "--locatedeps" ] ; then
2953 [ ! "$2" ] && Die "Please specify the binary to look at"
2954 LocateDeps $*
2955 # Avoids logfile content for mondo
2956 export MONDO_SHARE=""
2957 MindiExit $?
2958 elif [ "$1" = "--readalllink" ] ; then
2959 [ ! "$2" ] && Die "Please specify the binary to look at"
2960 ReadAllLink $2
2961 # Avoids logfile content for mondo
2962 export MONDO_SHARE=""
2963 MindiExit $?
2964 elif [ "$1" = "--makemessage" ] ; then
2965 MakeMessageFile
2966 MindiExit 0
2967 elif [ "$1" = "--makemountlist" ] ; then
2968 [ ! "$2" ] && Die "Please specify the output file"
2969 MakeMountlist $2
2970 CheckMountlist $2
2971 # Avoids logfile content for mondo
2972 export MONDO_SHARE=""
2973 MindiExit $?
2974 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2975 echo "Mindi v$MINDI_VERSION"
2976 # Avoids logfile content for mondo
2977 export MONDO_SHARE=""
2978 MindiExit 0
2979 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
2980 MONDO_TMP=$2
2981 # Change MINDI_TMP for the one provided by mondo
2982 # So that it can get back the built files
2983 if [ _"$MONDO_TMP" = _"" ]; then
2984 Die "MONDO_TMP is empty, aborting"
2985 fi
2986 if [ _"$MONDO_TMP" = _"/" ]; then
2987 Die "MONDO_TMP is /, aborting"
2988 fi
2989 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
2990 rmdir $MINDI_TMP
2991 export MINDI_TMP=$MONDO_TMP
2992 mkdir -p $MINDI_TMP
2993
2994 # This is the scratch dir in mondo - subdir images
2995 MINDI_CACHE=$3
2996
2997 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
2998 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2999
3000###
3001### Sq-Modification...
3002### Attempt to locate kernel specific module path
3003### if module path is found then use it other wise use uname -r to set it...
3004###
3005 if [ $KERNEL_IS_XEN = "yes" ]; then
3006 LogIt "xenkernelpath = $xenkernelpath"
3007 fi
3008 kernelname=`echo $kernelpath | cut -d'-' -f2- | sed 's/.[bg]z[2]*$//'`
3009 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3010 then
3011 LogIt "Module path for ${kernelpath} not found..."
3012 LogIt "using running kernel\'s modules."
3013 kernelname=$KERVERRUN
3014 fi
3015 LogIt "kernelname = $kernelname"
3016 LogIt "kernelpath = $kernelpath"
3017###
3018### end of Sq-Modification
3019###
3020 TAPEDEV=$5
3021 TAPESIZE=$6
3022 FILES_IN_FILELIST=$7
3023 USE_LZO=$8
3024 CDRECOVERY=$9
3025 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3026 IMAGE_DEVS=""
3027 else
3028 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3029 fi
3030 if [ "${11}" ] ; then
3031 LILO_OPTIONS=""
3032 # LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
3033 fi
3034 LAST_FILELIST_NUMBER=${12}
3035 ESTIMATED_TOTAL_NOOF_SLICES=${13}
3036 export MINDI_EXCLUDE_DEVS="${14}"
3037 USE_COMP="${15}"
3038 USE_LILO="${16}"
3039 USE_STAR="${17}"
3040 INTERNAL_TAPE_BLOCK_SIZE="${18}"
3041 DIFFERENTIAL="${19}"
3042 USE_GZIP="${20}"
3043 NOT_BOOT="${21}"
3044 [ "$USE_COMP" = "" ] && USE_COMP=yes
3045 [ "$USE_GZIP" = "" ] && USE_GZIP=no
3046 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3047 [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
3048 # MONDO_ROOT is the real scratchdir
3049 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
3050 if [ _"$MONDO_ROOT" != _"" ]; then
3051 mkdir -p $MONDO_ROOT
3052 else
3053 Die "MONDO_ROOT is undefined"
3054 fi
3055 else
3056 echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3057 MindiExit -1
3058 fi
3059fi
3060
3061if [ _"$MINDI_CACHE" != _"" ]; then
3062 rm -rf $MINDI_CACHE/* 2> /dev/null
3063 mkdir -p $MINDI_CACHE
3064fi
3065
3066[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3067
3068if [ _"$MONDO_SHARE" = _"" ]; then
3069 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3070 LogIt "Latest Mindi is available from http://www.mondorescue.org"
3071 LogIt "BusyBox sources are available from http://www.busybox.net"
3072 LogIt "------------------------------------------------------------------------------"
3073else
3074 echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> $LOGFILE
3075fi
3076if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3077 LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3078else
3079 LogIt "Unable to find mindi-busybox, please install it"
3080 MindiExit -1
3081fi
3082
3083for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3084 modprobe $i >> $LOGFILE 2>> $LOGFILE
3085done
3086
3087KERN_DISK_MADE=""
3088
3089echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
3090echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
3091echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
3092if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3093 LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
3094 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3095 MakeMountlist $MINDI_TMP/mountlist.txt
3096 CheckMountlist $MINDI_TMP/mountlist.txt
3097 mkdir -p $MINDI_TMP/small-all/tmp
3098 cd "$MINDI_TMP/small-all"
3099 cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
3100 tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
3101 sleep 2
3102 LogIt "Done. Exiting."
3103 MindiExit 0
3104fi
3105
3106if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3107 LogIt "Including the generation of a Bootable USB device on $USBDEVICE"
3108fi
3109
3110if [ "$kernelpath" = "" ] ; then
3111 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
3112 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3113 read ch
3114 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3115 USE_OWN_KERNEL="yes"
3116 else
3117 USE_OWN_KERNEL="no"
3118 fi
3119 if [ "$USE_OWN_KERNEL" = "yes" ]; then
3120 YOUR_KERNEL_SUCKS=""
3121 kernelpath=`TryToFindKernelPath`
3122 if [ "$kernelpath" = "" ] ; then
3123 echo -n "Please enter kernel path : "
3124 read kernelpath
3125 fi
3126 else
3127 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3128 fi
3129fi
3130if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3131 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
3132 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
3133 source $MINDI_LIB/FindDistroFailsafe
3134 # Log kernel image
3135 LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
3136 kernelpath="$FAILSAFE_KBIN"
3137 LogIt "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
3138 LogIt "The failsafe kernel is $kernelpath.\n"
3139 LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
3140 LogIt "disks then it may still be a result of a problem with your kernel.\n"
3141 pwd=`pwd`
3142 cd "$MINDI_TMP"
3143 mkdir -p lib/modules
3144 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
3145 cd "$pwd"
3146 else
3147 kernelpath=$MINDI_LIB/vmlinuz
3148 LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3149 LogIt "However, you are still running your kernel. If Mindi fails to create your"
3150 LogIt "disks then it may still be a result of a problem with your kernel."
3151 pwd=`pwd`
3152 cd "$MINDI_TMP"
3153 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3154 cd "$pwd"
3155 fi
3156 YOUR_KERNEL_SUCKS="Your kernel sucks"
3157fi
3158echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
3159[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
3160
3161[ "$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."
3162
3163PrepareDataDiskImages
3164
3165ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3166rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3167export ramdisk_size=$rds
3168
3169echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
3170if [ "$ARCH" = "ia64" ] ; then
3171 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
3172else
3173 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
3174fi
3175
3176[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3177...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3178
3179if [ _"$MONDO_SHARE" = _"" ]; then
3180 ListImagesForUser
3181 OfferToMakeBootableISO
3182 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
3183 OfferToMakeBootableUSB
3184 fi
3185 LogIt "Finished."
3186elif [ "$TAPEDEV" ] ; then
3187 if [ "$ARCH" != "ia64" ] ; then
3188 # We need to keep the img file as boot file for ia64 platform
3189 rm -f $MINDI_CACHE/{*img,*iso}
3190 else
3191 rm -f $MINDI_CACHE/*iso
3192 fi
3193 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3194 OfferToMakeBootableUSB
3195 fi
3196 OfferToMakeBootableISO
3197 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
3198 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
3199 else
3200 Die "Cannot find all.tar.gz, to be written to tape"
3201 fi
3202elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3203 OfferToMakeBootableUSB
3204else
3205 OfferToMakeBootableISO
3206fi
3207# cleanup
3208LogIt "$FRIENDLY_OUTSTRING"
3209for mtpt in $FLOPPY_WAS_MOUNTED ; do
3210 mount $mtpt
3211done
3212MindiExit 0
Note: See TracBrowser for help on using the repository browser.