source: MondoRescue/branches/2.0.9/mindi/mindi

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

merge -r754:755 $SVN_M/branches/stable

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