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

Last change on this file since 853 was 853, checked in by Bruno Cornec, 18 years ago

Patches from Brendan Bouffler <brendan.bouffler_at_hp.com> to allow x86_64 to work.

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