source: MondoRescue/branches/2.0.8/mindi/mindi@ 582

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

Add missing modules for small bootfloppies (cdrom, isocd, isofs)

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