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

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

remove a partial patch for x86_64: ldconfig is not needed. What is missing are the library files (symlinks). So rewrite of ProcessLDD.
deplost.txt updated accordingly.
LocateFile in mindi has been replaced by readlink for all the usages linked to symlinks.

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