source: MondoRescue/branches/2.04_berlios/mindi/mindi@ 844

Last change on this file since 844 was 100, checked in by bcornec, 18 years ago

svn merge -r77:78 of trunk (andree) :
The output of ldd coming with libc6 2.3.4 and higher has changed and
breaks mindi's library inclusion code.

The change makes it so that the code in ProcessLDD() wroks for both
libc6 < 2.3.4 and >= 2.3.4.

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