source: MondoRescue/branches/2.2.5/mindi/mindi@ 1863

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