source: MondoRescue/branches/stable/mindi/mindi@ 965

Last change on this file since 965 was 965, checked in by Bruno Cornec, 17 years ago

mindi log file should now look nicer

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