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

Last change on this file since 674 was 674, checked in by andree, 18 years ago

Handle the following format used by some distributions, e.g. Debian, for
LVM devices:

/dev/mapper/<VG>-<LV>

in addition to /dev/<VG>/<LV> where the latter is a link to the former.

This is a fix for Debian bug #362926.

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