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

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

Attempt to fix for Bug #8

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