source: MondoRescue/branches/2.05/mindi/mindi@ 124

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

add MINDI_CONF to the mindi LOGFILE (The warning that we use /etc/mindi/deplist.txt should be bigger, but that is a first step)
In that case mindi loops fdisk'ing -l /dev/ida/c*d*, including the
/dev/ida/c*d*p*, which is useless, but consumes an enormous amount of time.
The patch also includes some debugging enhancement
(Philippe De Muyter)

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