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

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

Seems I got it for LVM and LABEL

  • Property svn:keywords set to Rev Id
File size: 111.1 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 748 2006-08-05 13:06:07Z 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
1376 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
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
1434 # $current_lvolume accordingly. Note that $current_lvolume may well be an
1435 # ordinary device. It is just to make sure that we feed the right value
1436 # into any of the LVM tools if possible.
1437
1438 current_lvolume="$current_partition"
1439 if [ $LVM = "v2" ] && [ "`$LVMCMD lvdisplay $current_partition 2> /dev/null`" ]; then
1440 partition_stub="`echo "$current_partition" | sed "s|^/dev/mapper/|/dev/|" | cut -d"-" -f1`"
1441 current_lvolume="`find /dev -lname "$current_partition" | grep "^$partition_stub"`"
1442 fi
1443 #
1444 # For ReHat lvmdisplay doesn't work on /dev/mapper entries
1445 #
1446 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep '/dev/mapper/'`" ]; then
1447 current_lvolume="`find /dev -lname "$current_partition"`"
1448 fi
1449 #
1450 # End of LVM device style variation code (other than $current_lvolume).
1451
1452 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1453 # Size computed via LVM not directly
1454 partition_size="lvm"
1455 else
1456 partition_size=`SizeOfPartition $current_partition`
1457 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1458 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1459 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1460 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1461 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1462 [ "$partition_format" != "swap" ] && partition_format="swap"
1463 if [ "$partition_size" = "" ] ; then
1464 totalsize=0
1465 items=0
1466 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1467 totalsize=$(($totalsize+$i))
1468 items=$(($items+1))
1469 done
1470 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1471 [ "$partition_size" -lt "125000" ] && partition_size=125000
1472 echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1473 fi
1474 fi
1475 fi
1476 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1477 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1478 if [ "$partition_mountpt" = "" ] ; then
1479 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1480 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1481 partition_mountpt="raid"
1482 partition_format="raid"
1483 else
1484 partition_mountpt="lvm"
1485 partition_format="lvm"
1486 fi
1487 fi
1488 fi
1489 psz=$partition_size
1490 echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1491 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1492 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1493 partition_mountpt="image"
1494 old_partition_fmt=$partition_format
1495# partition_format="`$FDISK -l 2>> $LOGFILE | tr -s '\t' ' ' | grep -w "$absolute_partition" | $AWK 'x=$(NF-1}'`"
1496 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1497 echo "------- $FDISK -l log ------------" >> $LOGFILE
1498 cat $FDISKLOG >> $LOGFILE
1499 echo "------- $FDISK log end ------------" >> $LOGFILE
1500 partition_size=$(($partition_size+1)); # just in case
1501 if [ "$partition_format" = "Linux" ] ; then
1502 echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1503 echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1504 partition_format=$old_partition_fmt
1505 fi
1506 fi
1507 if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1508 echo "Excluding $current_partition from mountlist" >> $LOGFILE
1509 continue
1510 fi
1511 if [ ! "$partition_mountpt" ] ; then
1512 for qq in "" `find /dev/ida/c*d* ! -name '*p*'` ; do
1513 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1514 echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1515 cat $FDISKLOG >> $LOGFILE
1516 echo "------- $FDISK log end ------------" >> $LOGFILE
1517 [ "$partition_format" ] && break
1518 done
1519 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1520 partition_format="compaq"
1521 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1522 LogIt "Unable to find mountpoint of $current_partition - ignoring\n"
1523 continue
1524 fi
1525 fi
1526 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1527 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | awk '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1528 unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s\n" $current_partition $partition_mountpt $partition_format $psz`
1529 if [ "$current_partition" = "" ] ; then
1530 echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1531 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1532 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1533 partition_mountpt=raid
1534 partition_format=raid
1535 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1536 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1537 else
1538 echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1539 fi
1540 elif [ "$partition_format" = "" ] ; then
1541 echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1542 elif [ "$partition_size" = "" ] ; then
1543 echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1544 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1545 continue
1546 else
1547 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1548 echo "Stupid bastard..." >> $LOGFILE
1549 partition_format="vfat"
1550 fi
1551 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1552 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1553 fi
1554 done
1555}
1556
1557
1558
1559
1560
1561
1562MakeSureNumberIsInteger() {
1563 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1564 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1565 echo "result = '$res'"
1566 Die "$1 should be an integer"
1567 fi
1568}
1569
1570
1571
1572
1573
1574MakeSyslinuxMessageFile() {
1575 mkdir -p $1
1576 rmdir $1
1577 echo -en " " > $1
1578 if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1579 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
1580 else
1581 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
1582 fi
1583 sed s/%r/"`uname -r`"/ $1.tmp | sed s/%t/"`hostname`"/ > $1
1584 rm -f $1.tmp
1585 if [ "$CDRECOVERY" != "yes" ] ; then
1586 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1587 echo -en "Press <enter> to continue.\n" >> $1
1588 elif [ ! "$MONDO_TMP" ] ; then
1589 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n" >> $1
1590 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1591 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n" >> $1
1592 fi
1593 else
1594 echo -en "$BOOT_MEDIA_MESSAGE" >> $1
1595 fi
1596 else
1597 echo -en " \
1598To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1599CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n" >> $1
1600 fi
1601}
1602
1603
1604
1605
1606MoveHyperlinkSensibly() {
1607 local filename minidir_root resides_on_diskno noof_disks old_diskno d old_pwd
1608 filename=$1
1609 minidir_root=$2
1610 resides_on_diskno=$3
1611 noof_disks=$4
1612
1613 [ -h "$minidir_root/$resides_on_diskno/$filename" ] || Die "$filename isn't a softlink (or doesn't exist): how can I move it sensibly?"
1614
1615 old_diskno=$resides_on_diskno
1616 d=1
1617 while [ "$d" -le "$noof_disks" ] ; do
1618 if [ "$d" -ne "$old_diskno" ] ; then
1619 old_pwd=`pwd`
1620 cd $minidir_root/$old_diskno
1621 cp --parents -Rdf $filename $minidir_root/$d/ || Die "Can't move $filename (sensibly) from $old_diskno to $d"
1622 rm -f $filename
1623 cd $old_pwd
1624 fi
1625# when the softlink is resolvable, our work here is done
1626 [ -e "$minidir_root/$d/$filename" ] && return 0
1627 old_diskno=$d
1628 d=$(($d+1))
1629 done
1630 return 1
1631}
1632
1633
1634
1635OfferToCopyImagesToDisks() {
1636 local imagesdir i imagename dev count boot_dev data_dev
1637 imagesdir=$1
1638 boot_dev=$2
1639 data_dev=$3
1640 echo -en "Would you like to create boot+data floppy disks now (y/n) ?"
1641 read i
1642 [ "$i" != "y" ] && [ "$i" != "Y" ] && return
1643 mount | grep -F /dev/fd > /dev/null && Die "Please unmount your floppies first."
1644 echo "WARNING! THIS WILL ERASE YOUR FLOPPY DISKS."
1645 [ ! -e "$boot_dev" ] && Die "Cannot find $boot_dev - is your Linux distro broken?"
1646 [ ! -e "$data_dev" ] && Die "Cannot find $data_dev - is your Linux distro broken?"
1647 i=`find $imagesdir -type f | grep -F "/mindi-root.1" 2> /dev/null`
1648 j=`find $imagesdir -type f | grep -F "/mindi-boot" | grep -Ev '2880|5760'`
1649# echo "i=$i"
1650# echo "j=$j"
1651 if [ "$i" ] ; then
1652 CopyImageToDisk $j $data_dev "boot disk"
1653 CopyImageToDisk $i $data_dev "root disk"
1654 else
1655 CopyImageToDisk $j $boot_dev "boot/root disk"
1656 fi
1657 count=1
1658 for i in `find $imagesdir | grep -F mindi-data` ; do
1659 CopyImageToDisk $i $data_dev "data disk #$count"
1660 count=$(($count+1))
1661 done
1662}
1663
1664
1665
1666OfferToMakeBootableISO() {
1667 local i old_pwd
1668 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ ! "`DidMondoCallMe`" ] ; then
1669 echo -en "Shall I make a bootable CD image? (y/n) "
1670 read i
1671 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1672 fi
1673 if [ ! "$MONDO_TMP" ] ; then
1674 LogIt "NB: Mindi's bootable CD always uses isolinux.\n"
1675 LogIt "For a bootable CD w/LILO, please use Mondo.\n"
1676 fi
1677 rm -Rf $TMP_ROOT/iso
1678 mkdir -p $TMP_ROOT/iso/{images,archives,isolinux}
1679 cp -f $1/*.img $1/*.gz $TMP_ROOT/iso/images || LogIt "OfferToMakeBootableISO: Cannot copy $i to $TMP_ROOT/iso/images\n"
1680 old_pwd=`pwd`
1681 cd $TMP_ROOT/iso
1682 mkdir -p $MONDO_ROOT/iso/isolinux
1683 echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1684 cp $MINDI_LIB/mem{test,disk}* $MONDO_ROOT 2>> $LOGFILE
1685 for i in memdisk memtest.bin memtest.img ; do
1686 j=$MINDI_LIB/$i
1687 k=$TMP_ROOT/iso/isolinux
1688 if [ -e "$j" ] ; then
1689 LogIt "Copying $j to $k\n"
1690 cp -f $j $k || Die "Failed to copy $j to $k"
1691 cp -f $j $TMP_ROOT || Die "Failed to copy $j to $k"
1692 fi
1693 done
1694 MakeSyslinuxMessageFile $TMP_ROOT/iso/isolinux/message.txt
1695 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?"
1696 cp $TMP_ROOT/mindi.rdz $TMP_ROOT/iso/isolinux/initrd.img
1697 cp $TMP_ROOT/mindi.rdz $imagesdir/initrd.img
1698 [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
1699 cd $TMP_ROOT/iso/isolinux
1700 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?"
1701 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1702 mv isolinux.cfg isolinux.cfg.old
1703 sed s/interactive/iso/ isolinux.cfg.old > isolinux.cfg
1704 fi
1705 if [ "$ARCH" != "ia64" ] ; then
1706 cp $ISOLINUX isolinux.bin || Die "Cannot copy isolinux.bin ($ISOLINUX) to tmp_root - did you run out of disk space?"
1707 cp $ISOLINUX ../
1708 fi
1709 cd $TMP_ROOT/iso
1710 if [ "$ARCH" != "ia64" ] ; then
1711 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?"
1712 fi
1713 [ "$MONDO_SHARE" ] && cp -f $MONDO_SHARE/autorun .
1714 if [ -d "/home/MondoCD" ] ; then
1715 cp -pRdu /home/MondoCD/* .
1716 fi
1717 if [ "$ARCH" != "ia64" ] ; then
1718 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
1719 else
1720 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
1721 fi
1722 if [ "$?" -ne "0" ] ; then
1723 echo "----------- mkisofs's errors --------------" >> $LOGFILE
1724 cat /tmp/$$.mk >> $LOGFILE
1725 echo "mkisofs returned the following errors:-"
1726 cat /tmp/$$.mk
1727 LogIt "Failed to create ISO image.\n"
1728 else
1729 echo "Created bootable ISO image at $imagesdir/mindi.iso" >> $LOGFILE
1730 fi
1731 rm -f /tmp/$$.mk
1732 cd $old_pwd
1733}
1734
1735
1736
1737PluralOrNot() {
1738 [ "$1" -gt "1" ] && echo -en "s"
1739}
1740
1741
1742
1743
1744MakeMessageFile() {
1745 local disksize
1746 disksize=$1
1747 if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1748 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`"/
1749 else
1750 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`/
1751 fi
1752 if [ "$disksize" -gt "2880" ] ; then
1753 if [ "`DidMondoCallMe`" ] ; then
1754 if [ "$CDRECOVERY" != "yes" ] ; then
1755 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1756 echo -en "Press <enter> to continue.\n"
1757 elif [ ! "$MONDO_TMP" ] ; then
1758 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1759 else
1760 echo -en "$BOOT_MEDIA_MESSAGE"
1761 fi
1762 fi
1763 fi
1764 fi
1765 if [ "$CDRECOVERY" = "yes" ] ; then
1766 echo -en "\
1767To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1768CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1769 fi
1770 echo -en "\n\n\n"
1771}
1772
1773
1774
1775
1776write_full_floppy_of_kernel() {
1777 local mtpt image old_pwd res disksize
1778
1779 res=0
1780 old_pwd=`pwd`
1781 KERN_DISK_MADE=1
1782 disksize=$3
1783 rand1=$RANDOM
1784 rand2=$RANDOM
1785 image=/tmp/$rand1.$rand2.img
1786 mtpt=/tmp/$rand1.$rand2.mtpt
1787 dd if=/dev/zero of=$image bs=1k count=$disksize
1788 mke2fs -N 26 -F $image > /dev/null
1789 mkdir -p $mtpt
1790 mount -o loop $image $mtpt
1791 cd $mtpt
1792 mkdir -p {dev,tmp,boot}
1793 cp -f $1 vmlinuz
1794 if [ "$?" -ne "0" ] ; then
1795 LogIt "Failed to copy $1 to ramdisk\n"
1796 cd $old_pwd
1797 umount $mtpt
1798 rmdir $mtpt
1799 rm $image
1800 return 1
1801 fi
1802
1803 rdev vmlinuz 2,0
1804 rdev -R vmlinuz 0
1805 rdev -r vmlinuz 49152
1806
1807 tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1808 losetup /dev/loop0 > /dev/null 2> /dev/null
1809 [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1810 CopyBootBFile $mtpt/boot.b
1811
1812# echo "root=/dev/loop0" > bdlilo.conf
1813 MakeLiloConfFile $disksize >> bdlilo.conf
1814
1815# cat bdlilo.conf > /tmp/bdlilo.conf
1816
1817# cat /home/mondostuff/bdlc > bdlilo.conf
1818
1819 chmod 644 bdlilo.conf
1820 MakeMessageFile $disksize > message
1821 lilo -v -C bdlilo.conf -r $mtpt
1822 res=$?
1823
1824#echo "lilo -v -C bdlilo.conf -r $mtpt"
1825#echo -en "Press enter"; read line
1826
1827 cd $old_pwd
1828 umount $mtpt
1829 mv -f $image $2
1830 rmdir $mtpt
1831
1832 return $res
1833
1834# --- the kernel-only method NO LONGER WORKS. Not since Apr 2002.
1835# It should work, according to the Boot Disk HOWTO, but it doesn't.
1836# It works for my failsafe kernel & for RH7.2 but not RH7.3, 8.0, etc.
1837# -Hugo, Apr 19th 2004
1838# dd if=$1 of=$2 bs=1k &> /dev/null || Die "Cannot dd blank file"
1839# dd if=/dev/zero bs=1k count=$3 >> $2 2> /dev/null || Die "Cannot dd blank file"
1840# mv -f $2 $2.old
1841# dd if=$2.old bs=1k count=$3 of=$2 &> /dev/null || Die "Cannot dd blank file"
1842# rm -f $2.old
1843# if [ "$3" = "1440" ] ; then
1844# rdev $2 "/dev/fd0H"$3
1845# else
1846# rdev $2 "/dev/fd0u"$3
1847# fi
1848# rdev -R $2 0
1849# rdev -r $2 49152
1850}
1851
1852
1853
1854
1855
1856
1857MakeLiloConfFile() {
1858 local disksize options i ooo
1859 disksize=$1
1860 options=""
1861 if [ "$ARCH" != "ia64" ] ; then
1862 echo -en "boot=/dev/loop0\ndisk=/dev/loop0\n"
1863 fi
1864 if [ "$disksize" -eq "2880" ] ; then
1865 echo -en "bios=0x00\nsectors=36\nheads=2\ncylinders=80\n"
1866 elif [ "$disksize" -eq "1722" ] ; then
1867 echo -en "bios=0x00\nsectors=21\nheads=2\ncylinders=82\n"
1868 elif [ "$disksize" -gt "2880" ] ; then
1869 /bin/true
1870 else
1871 echo -en "bios=0x00\nsectors=18\nheads=2\ncylinders=80\n"
1872 fi
1873 if [ "$ARCH" != "ia64" ] ; then
1874 echo -en "install=/boot.b\nmap=/boot.map\n"
1875 fi
1876 if [ "$CDRECOVERY" = "yes" ] ; then
1877 echo -en "default=RESTORE\n"
1878 elif [ "$disksize" -gt "2880" ] && [ "`DidMondoCallMe`" ] ; then
1879 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1880 echo -en "default=iso\n"
1881 else
1882 echo -en "default=interactive\n"
1883 fi
1884 else
1885 echo -en "default=expert\n"
1886 fi
1887
1888 echo -en "prompt\n"
1889 if [ "$ARCH" != "ia64" ] ; then
1890 echo -en "vga=normal\nbackup=/dev/null\nmessage=/message\n"
1891 fi
1892 if [ "$CDRECOVERY" != "yes" ] ; then
1893 echo -en "timeout=300\n"
1894 fi
1895 echo -en "\n"
1896 if [ "$CDRECOVERY" = "yes" ] ; then
1897 options="RESTORE expert"
1898 elif [ "$disksize" -gt "2880" ] ; then
1899 if [ "`DidMondoCallMe`" ] ; then
1900 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1901 options="iso"
1902 else
1903 options="interactive expert compare iso nuke isonuke"
1904# hda hdb hdc hdd"
1905 fi
1906 else
1907 options="expert"
1908 fi
1909 else
1910 options="expert"
1911 fi
1912 for i in $options ; do
1913 ooo=$i
1914 [ "$ooo" = "RESTORE" ] && ooo="nuke"
1915 if [ "$ARCH" = "ia64" ] ; then
1916 rootpart="root=/dev/ram0\n\t"
1917 else
1918 rootpart=""
1919 fi
1920 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"
1921
1922 outstr=$outstr" $ooo_mode"
1923 outstr=$outstr"\"\n"
1924 if [ "$disksize" = "1440" ] ; then
1925 echo -en "$outstr" | sed s/initrd=.*// | grep -v root=
1926 else
1927 echo -en "$outstr"
1928 fi
1929 done
1930}
1931
1932
1933
1934
1935PrepareBootDiskImage_LILO() {
1936 local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1937 imagesdir=$1
1938 disksize=$2
1939 kernelpath=$3
1940 ramdisksize=$4
1941
1942 retval=0
1943 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1944 echo -en "Making "$disksize"KB boot disk..."
1945 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?"
1946 if [ "$ARCH" != "ia64" ] ; then
1947 [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
1948 fi
1949 echo -en "..."
1950 imagefile=$imagesdir/mindi-bootroot.$disksize.img
1951 mountpoint=$TMP_ROOT/mountpoint.$$
1952 mkdir -p $mountpoint
1953 dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
1954 if [ "$ARCH" = "ia64" ] ; then
1955 mkdosfs $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1956 t=vfat
1957 else
1958 mke2fs -N 26 -m 0 -F $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1959 t=ext2
1960 fi
1961 [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
1962 rm -f /tmp/mke2fs.$$
1963 mount -t $t -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
1964# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1965 mkdir -p $mountpoint/etc
1966 if [ "$ARCH" != "ia64" ] ; then
1967 liloconf=$mountpoint/etc/lilo.conf
1968 else
1969 liloconf=$mountpoint/elilo.conf
1970 fi
1971 old_pwd=`pwd`
1972 cd $mountpoint
1973 if [ "$ARCH" != "ia64" ] ; then
1974 tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1975 fi
1976 cd $old_pwd
1977 losetup /dev/loop0 > /dev/null 2> /dev/null
1978 [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1979 CopyBootBFile $mountpoint/boot.b
1980
1981 MakeLiloConfFile $disksize > $liloconf
1982
1983 echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint..." >> $LOGFILE
1984 cp -f $TMP_ROOT/mindi.rdz $mountpoint 2>> $LOGFILE
1985 if [ "$?" -ne "0" ] ; then
1986 LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
1987 cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
1988 LogIt "Please unload some of your modules and try again.\n"
1989 rm -f $TMP_ROOT/mtpt.$$
1990 LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
1991 retval=$(($retval+1))
1992 fi
1993 MakeMessageFile $disksize > $mountpoint/message
1994
1995 mkdir -p $mountpoint/tmp
1996 cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
1997 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1998 echo -en "image=/memtest.bin\nlabel=memtest\nn" >> $liloconf
1999 echo -en "image=/memdisk\nlabel=memtest\nappend=\"initrd=memtest.img\"\n" >> $liloconf
2000# echo "Yep, this is a multi-function CD" > $mountpoint/MULTIFUNC
2001 fi
2002 if [ -d "/home/MondoCD" ] ; then
2003 cp -pRdu /home/MondoCD/* . || Die "Cannot do kung pow"
2004 fi
2005
2006# copy the kernel across
2007 rm -Rf $mountpoint/lost+found
2008 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2009 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2010 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2> /dev/null
2011 if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2012 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2013 du -sk $mountpoint/* >> $LOGFILE
2014 echo "--- end of list of files ---" >> $LOGFILE
2015 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2016Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2017 rm -f $mountpoint/vmlinuz
2018 cd $old_pwd
2019 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2020 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2021# losetup /dev/loop0 -d
2022 res=0
2023 write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2024 res=$(($res+$?))
2025 cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
2026 res=$(($res+$?))
2027 rm -f $imagefile
2028 if [ "$res" -ne "0" ]; then
2029 LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2030 rm -f $imagesdir/mindi-*.1440.img
2031 fi
2032 return $res
2033 fi
2034 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2035 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2036 echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2037 echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2038# make it bootable
2039 rm -f $mountpoint/zero
2040 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2041 if [ "$disksize" -gt "2880" ] && [ ! "$KERN_DISK_MADE" ] ; then
2042 if [ "$ARCH" != "ia64" ] ; then
2043 $LILO_EXE $LILO_OPTIONS -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2044 else
2045 /bin/true
2046 fi
2047 elif [ ! "$KERN_DISK_MADE" ] ; then
2048# 12/28/2001 - if 1.72MB floppy then don't use LILO's optimizations at all
2049 $LILO_EXE -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2050 else
2051 echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
2052 fi
2053 if [ $? -ne "0" ] ; then
2054 if [ "`grep -F "/tmp/dev.0" $LOGFILE`" ] ; then
2055 LogIt "The '/tmp/dev.0' error is NOT Mindi's fault. It is LILO's.\n"
2056 LogIt "Please reboot your PC as a workaround.\n"
2057 Die "LILO sneezed and Mindi caught a cold. Please read the README / FAQ.\n"
2058 fi
2059 echo "$LILO_EXE -r $mountpoint ...failed."
2060 echo -en "Press ENTER to continue."; read line
2061 LogIt "Cannot run lilo on $mountpoint\nPlease upgrade/downgrade your version of LILO. It has a bug.\n"
2062 retval=$(($retval+1))
2063 fi
2064 cp -f $liloconf /tmp/lilo.conf
2065 if [ "$ARCH" = "ia64" ] ; then
2066 cp `dirname $kernelpath`/*.efi $mountpoint
2067 fi
2068 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2069 echo -en "..."
2070 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2071 if [ "$retval" -eq "0" ] ; then
2072 echo -en "...$DONE\r"
2073 if [ "$KERN_DISK_MADE" ] ; then
2074 LogIt "... $disksize KB boot disks were created OK\r"
2075 fi
2076 else
2077 echo -en "...failed\r"
2078 LogIt $disksize"KB boot disk was NOT created\r"
2079 rm -f $imagefile
2080 fi
2081 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2082 return $retval
2083}
2084
2085
2086
2087
2088PrepareBootDiskImage_SYSLINUX() {
2089 local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
2090 imagesdir=$1
2091 disksize=$2
2092 kernelpath=$3
2093 ramdisksize=$4
2094 do_boot_root_thingy=""
2095 local retval old_pwd
2096 retval=0
2097 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
2098 echo -en "Making "$disksize"KB boot disk..."
2099 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?"
2100 [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
2101 echo -en "..."
2102 imagefile=$imagesdir/mindi-bootroot.$disksize.img
2103 mountpoint=$TMP_ROOT/mountpoint.$$
2104 mkdir -p $mountpoint
2105# If I format a 1722KB data file & run syslinux on it, the resultant image
2106# won't boot. So, I have formatted a floppy, called syslinux on/to it, and
2107# used 'dd' to copy it to sys-disk.raw (zipped to sys-disk.raw.gz).
2108# If I extract it, mount it, copy my files to it, etc. then the resultant
2109# image _is_ bootable. I don't know why syslinux and/or mkfs.vfat won't
2110# play nicely and I don't care. :) I have worked around the problem. -Hugo, 06/27/2002
2111 if [ "$disksize" = "1722" ] ; then
2112 gzip -dc $MINDI_LIB/sys-disk.raw.gz > $imagefile || Die "Cannot dd blank file"
2113 else
2114 dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
2115 mkfs.vfat $imagefile
2116 syslinux $imagefile
2117 fi
2118 mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
2119# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
2120 old_pwd=`pwd`
2121 MakeSyslinuxMessageFile $mountpoint/message.txt
2122 cd $mountpoint
2123 [ -e "$sys_cfg_file" ] || Die "Obi Wan, word up?"
2124# tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n" <--- present for LILO; is it nec. for SYSLINUX too?
2125 cat $sys_cfg_file | HackSyslinuxFile $ramdisk_size $mountpoint > syslinux.cfg || Die "Cannot copy syslinux.cfg from mindi_home to tmp_root"
2126 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
2127 mv syslinux.cfg syslinux.cfg.orig
2128 sed s/interactive/iso/ syslinux.cfg.orig > syslinux.cfg
2129 fi
2130 cd $old_pwd
2131 echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint/initrd.img..." >> $LOGFILE
2132 cp -f $TMP_ROOT/mindi.rdz $mountpoint/initrd.img 2>> $LOGFILE
2133 if [ "$?" -ne "0" ] ; then
2134 LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
2135 cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
2136 LogIt "Please unload some of your modules and try again.\n"
2137 rm -f $TMP_ROOT/mtpt.$$
2138 LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
2139 retval=$(($retval+1))
2140 fi
2141
2142 mkdir -p $mountpoint/tmp
2143 cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
2144
2145# copy the kernel across
2146 rm -Rf $mountpoint/lost+found
2147 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2148 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2149 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
2150 if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2151 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2152 du -sk $mountpoint/* >> $LOGFILE
2153 echo "--- end of list of files ---" >> $LOGFILE
2154 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2155Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2156 rm -f $mountpoint/vmlinuz
2157 cd $old_pwd
2158 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2159 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2160# losetup /dev/loop0 -d
2161
2162 res=0
2163 write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2164 res=$(($res+$?))
2165 cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
2166 res=$(($res+$?))
2167 rm -f $imagefile
2168 if [ "$res" -ne "0" ]; then
2169 LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2170 rm -f $imagesdir/mindi-*.1440.img
2171 fi
2172 return $res
2173 fi
2174 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2175 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2176 echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2177 echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2178# make it bootable
2179 rm -f $mountpoint/zero
2180 mkdir -p $mountpoint/etc
2181 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2182 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2183 echo -en "..."
2184 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2185
2186 if [ "$retval" -eq "0" ] ; then
2187 echo -en "...$DONE\r"
2188 if [ "$KERN_DISK_MADE" ] ; then
2189 rm -f $imagefile
2190 LogIt "... $disksize KB boot disks were created OK\r"
2191 fi
2192 else
2193 echo -en "...failed\r"
2194 LogIt $disksize"KB boot disk was NOT created\r"
2195 rm -f $imagefile
2196 fi
2197 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2198 return $retval
2199}
2200
2201
2202
2203
2204PrepareDataDiskImages() {
2205 local needlist bigdir minidir_root tardir diskdir imagesdir res i j k old_pwd lines
2206
2207 imagesdir=$1
2208 rm -f $imagesdir/mindi-*.img $imagesdir/[0-9]*.tar.gz $imagesdir/mindi.iso
2209 needlist=$TMP_ROOT/what-we-need.txt
2210 bigdir=$TMP_ROOT/bigdir
2211 minidir_root=$TMP_ROOT/minidir
2212 mkdir -p $minidir_root
2213 mkdir -p $bigdir/usr/bin
2214 tardir=$TMP_ROOT/tardir
2215
2216 lines=`grep -vx " *#.*" $MINDI_CONF/deplist.txt | grep -vx "" | wc -l`
2217 cat $MINDI_CONF/deplist.txt | GenerateGiantDependencyList $needlist $lines
2218 res=$?
2219 if [ "$YOUR_KERNEL_SUCKS" ]; then
2220 pwd=`pwd`
2221 cd $TMP_ROOT
2222 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2223 cp --parents -pRdf ./$i $bigdir || Die "PDDI can't cp $i->$bigdir"
2224 if [ "`du -sk $i | cut -f1`" -lt "$(($CHOPSIZE*2))" ] ; then
2225 cp --parents -pRdf $i $bigdir
2226 else
2227 ChopUpAndCopyFile $i $bigdir $CHOPSIZE $BIGNO
2228 BIGNO=$(($BIGNO+1))
2229 fi
2230 done
2231 for i in $EXTRA_MODS ; do
2232 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o 2> /dev/null`
2233 [ ! "$j" ] && echo "Warning - cannot find failsafe module $i.o" >> $LOGFILE
2234 for k in $j ; do
2235 if [ "`du -sk $k | cut -f1`" -lt "$CHOPSIZE" ] ; then
2236 cp --parents -pRdf $k $bigdir
2237 else
2238 ChopUpAndCopyFile $k $bigdir $CHOPSIZE $BIGNO
2239 BIGNO=$(($BIGNO+1))
2240 fi
2241 echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2242 done
2243 done
2244 cd $pwd
2245 else
2246 ListKernelModulePaths >> $needlist
2247 fi
2248 if [ "$res" -ne "0" ] ; then
2249 Die "You have $res file`PluralOrNot $res` present in dependency list\nbut absent from filesystem."
2250 fi
2251 FindAndAddUserKeyboardMappingFile
2252 mkdir -p $bigdir/tmp
2253 if [ "`DidMondoCallMe`" ] ; then
2254 MakeMondoConfigFile $TMP_ROOT/mondo-restore.cfg
2255 cp -f $TMP_ROOT/mondo-restore.cfg $bigdir/tmp &> /dev/null
2256 cp -f $TMP_ROOT/mondo-restore.cfg $CACHE_LOC &> /dev/null
2257 fi
2258 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2259 DropOptimizedLibraries $needlist $bigdir
2260 echo -en "Assembling dependency files"
2261 CopyDependenciesToDirectory < $needlist $bigdir
2262
2263# also copy io.sys and msdos.sys, if we can find them
2264 for i in `mount | cut -d' ' -f3` ; do
2265 for j in io.sys msdos.sys ; do
2266 [ -e "$i/$j" ] && cp -f $i/$j $bigdir
2267 done
2268 done
2269
2270# master boot record, too
2271 i=`cat $MONDO_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2272 if [ "$i" ] ; then
2273 LogIt "Backing up $i's MBR\n"
2274 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2275# < < E O F
2276 sleep 1
2277 sync
2278# [ "$?" -ne "0" ] && echo "Failed to save $i's MBR to bigdir" >> $LOGFILE
2279 j=$i
2280 [ -h "$j" ] && j=`ResolveSoftlink $j`
2281 LogIt "Creating /dev/boot_device ($j)\n"
2282 mkdir -p $bigdir/dev
2283 cp -pRdf $j $bigdir/dev/boot_device || Die "Unable to create /dev/boot_device on ramdisk"
2284 fi
2285
2286# more stuff
2287# cp -f $MINDI_LIB/embleer* $bigdir
2288 old_pwd=`pwd`
2289 cd $bigdir
2290
2291 [ -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'."
2292 cp -Rdf $MINDI_LIB/aux-tools/* . 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping aux-tools\n"
2293 if [ -e "$MINDI_LIB/x11-tools.tgz" ] ; then
2294 tar -zxf $MINDI_LIB/x11-tools.tgz 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping x11-tools.tgz\n"
2295 fi
2296 if [ -e "$MONDO_SHARE/restore-scripts" ] ; then
2297 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2298 [ "$?" -ne "0" ] && [ "`DidMondoCallMe`" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2299 fi
2300 [ -d "/lib/dev-state" ] && cp --parents -pRdf /lib/dev-state .
2301 cd $old_pwd
2302 echo -e "$DONE"
2303 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2304 SplitDirectoryIntoMinidirs $bigdir $minidir_root
2305 noof_disks=$?
2306 [ "$noof_disks" -eq "0" ] && Die "Too much stuff!"
2307# if [ "$noof_disks" -ge "8" ] ; then
2308# LogIt "You are putting a ludicrously large amount of data on these disks."
2309# LogIt "I shall therefore double EXTRA_SPACE, just in case your ramdisk is too small."
2310# EXTRA_SPACE=$(($EXTRA_SPACE*2))
2311# fi
2312 MakeMountlist $TMP_ROOT/mountlist.txt
2313 mkdir -p $minidir_root/$noof_disks/tmp
2314 cp -f $TMP_ROOT/mountlist.txt $minidir_root/$noof_disks/tmp/mountlist.txt || Die "Cannot copy mountlist.txt from $TMP_ROOT to data disk"
2315 cp -f $TMP_ROOT/mountlist.txt $CACHE_LOC
2316 [ "`DidMondoCallMe`" ] && cp -f $minidir_root/$noof_disks/tmp/mountlist.txt $MONDO_TMP/.
2317 [ $LVM != "false" ] && $MINDI_LIB/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
2318 cat $minidir_root/$noof_disks/tmp/mountlist.txt >> $LOGFILE
2319 ZipMinidirsIntoTarballs $minidir_root $tardir $noof_disks
2320 CreateDataDiskImagesFromTarballs $tardir $imagesdir $noof_disks
2321 FRIENDLY_OUTSTRING="Boot and data disk images were created."
2322# One 1.72MB boot disk, one 2.88MB boot disk and $noof_disks data disk images
2323 rmdir $tardir $bigdir
2324 rm -f $needlist
2325 return $noof_disks
2326}
2327
2328
2329ProcessLDD() {
2330 local main_fname incoming j i fname f newf
2331 main_fname=$1
2332 read incoming
2333 while [ "$incoming" != "" ] ; do
2334 incoming=`echo "$incoming" | sed '/[[:blank:]]*.*[[:blank:]]*=>[[:blank:]]*(.*/d ; s/[[:blank:]]*\(.*\)[[:blank:]]*=>[[:blank:]]*\/.*/\1/ ; s/[[:blank:]]*\(\/.*\)[[:blank:]]*(.*/\1/'`
2335 for fname in `echo "$incoming"` ; do
2336 fname=`LocateFile $fname`
2337 for f in $fname ; do
2338 [ -e "$f" ] && echo $f
2339 done
2340 done
2341 read incoming
2342 done
2343}
2344
2345
2346
2347Prompt() {
2348 echo -en "$1"
2349 read line
2350}
2351
2352
2353
2354ReadLine() {
2355 local i incoming
2356 read incoming
2357 i=0
2358 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2359 i=$(($i+1))
2360 read incoming
2361 done
2362 echo "$incoming"
2363}
2364
2365
2366
2367RejigHyperlinks() {
2368 local minidir_root noof_disks fname path diskno old_pwd awk_loc gawk_loc dir i
2369 minidir_root=$1
2370 noof_disks=$2
2371
2372 old_pwd=`pwd`
2373 diskno=1
2374 while [ "$diskno" -le "$noof_disks" ] ; do
2375 mkdir -p $minidir_root/$diskno
2376 cd $minidir_root/$diskno
2377 for fname in `find -type d -o -print` ; do
2378 [ -h "$minidir_root/$diskno/$fname" ] && MoveHyperlinkSensibly $fname $minidir_root $diskno $noof_disks
2379 done
2380 diskno=$(($diskno+1))
2381 done
2382
2383
2384 cd $old_pwd
2385 return
2386
2387
2388
2389# do some awk/gawk stuff
2390 cd $minidir_root
2391 awk_loc=`find -name awk`
2392 gawk_loc=`find -name gawk`
2393 if [ "$awk_loc" = "" ] && [ "$gawk_loc" != "" ] ; then
2394 for i in $gawk_loc ; do HackAwk $i gawk ; done
2395 elif [ "$gawk_loc" = "" ] && [ "$awk_loc" != "" ] ; then
2396 for i in $awk_loc ; do HackAwk $i awk ; done
2397 elif [ "$gawk_loc" != "" ] && [ "$awk_loc" != "" ] ; then
2398 echo -en "Gawk/awk found. Good.\r"
2399 else
2400 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? :-)"
2401 fi
2402 cd $old_pwd
2403}
2404
2405
2406
2407EliminateRelatives() {
2408# eliminate /../../..... from path string
2409 local orig i old_i newo
2410 newo=$1
2411 while [ "`echo "$newo" | grep "\.\."`" ] ; do
2412 orig="`echo "$newo" | tr -s '/' '/'`"
2413# echo "orig=$orig"
2414 newo="/"
2415 old_i=""
2416 for i in `echo "$orig" | tr '/' ' '` ; do
2417 if [ ! "$old_i" ] ; then
2418 old_i=$i
2419 continue
2420 fi
2421 if [ "$old_i" ] && [ "$i" = ".." ] ; then
2422 if [ "$old_i" = ".." ] ; then
2423 newo="$newo"$old_i/
2424# echo "two --- $old_i $i"
2425 old_i="$i"
2426 continue
2427# else
2428# echo "swallowing ($old_i $i)"
2429 fi
2430 elif [ "$old_i" != ".." ] ; then
2431 newo="$newo"$old_i/
2432 fi
2433 old_i=$i
2434 done
2435 newo="$newo"$i
2436 done
2437 echo "$newo"
2438}
2439
2440
2441WhatSoftlinkPointsTo() {
2442 local orig new resolved
2443 orig=$1
2444 new=`ls -l $orig | tr -s ' ' '\t' | $AWK '{printf $NF;}'`
2445 if [ "`echo "$new" | cut -d'/' -f1`" ] ; then
2446 resolved=`dirname $orig`/$new
2447 else
2448 resolved=$new
2449 fi
2450 EliminateRelatives $resolved
2451}
2452
2453
2454
2455
2456
2457ReplaceIndividualLine() {
2458 local orig_file new_file lino newstring lines_total lines_remaining
2459 orig_file=$1.orig
2460 mv -f $1 $orig_file || Die "Cannot move $1 to $orig_file"
2461 new_file=$1
2462 lino=$2
2463 newstring="$3"
2464 if [ "$lino" = "" ] || [ "$lino" -lt "1" ] ; then
2465 echo "Can't find string" >> $LOGFILE
2466 return 1
2467 fi
2468 lines_total=`wc -l $orig_file | gawk '{print $1;}'`
2469 lines_remaining=$(($lines_total-$lino))
2470 head -n$(($lino-1)) $orig_file > $new_file
2471 echo "$newstring" >> $new_file
2472 echo "# The above line was added by Mindi, at the user's instruction" >> $new_file
2473 tail -n$lines_remaining $orig_file >> $new_file
2474 echo "Replace line $lino of $new_file with user-specified line, '$newstring'" >> $LOGFILE
2475# cp -f $new_file /tmp/init.new
2476 [ -x "$orig_file" ] && chmod +x $new_file
2477 rm -f $orig_file
2478 return 0
2479}
2480
2481
2482
2483
2484ResolveSoftlink() {
2485 local resolved new
2486 resolved=$1
2487 while [ -h "$resolved" ] ; do
2488 resolved=`WhatSoftlinkPointsTo $resolved`
2489 done
2490 echo "$resolved"
2491}
2492
2493
2494
2495
2496ScanCDandTape() {
2497 local i
2498
2499 for i in /dev/st0 /dev/ht0 /dev/cdrom /dev/cdrom0 /dev/cdrom 1 ; do
2500 dd if=$i of=/dev/null bs=64k count=1 &> /dev/null
2501 done
2502}
2503
2504
2505
2506SizeOfPartition() {
2507 local devpath drive res stub
2508 device=$1
2509 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2510 res=`SizeOfRaidPartition $device`
2511 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2512 echo "$res"
2513 return 0
2514 fi
2515# 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/-//`
2516# patch from Bill <bill@iwizard.biz> - 2003/08/25
2517 res=`$FDISK -s $device`
2518 echo "------- $FDISK -l $device log ------------" >> $LOGFILE
2519 cat $FDISKLOG >> $LOGFILE
2520 echo "------- $FDISK log end ------------" >> $LOGFILE
2521# end patch
2522 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2523 [ "$res" = "" ] && res="-1"
2524 echo $res
2525 return 0
2526}
2527
2528
2529SizeOfRaidPartition() {
2530 local real_dev smallest_size silly tmp
2531
2532 silly=999999999
2533 smallest_size=$silly
2534
2535 for real_dev in `GetRaidDevMembers $1` ; do
2536 tmp=`SizeOfPartition $real_dev`
2537 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2538 done
2539
2540 if [ "$smallest_size" = "$silly" ] ; then
2541 echo "-1"
2542 return 1
2543 else
2544 echo "$smallest_size"
2545 return 0
2546 fi
2547}
2548
2549
2550
2551
2552
2553
2554StripComments()
2555{
2556 local tempfile
2557 tempfile=$TMP_ROOT/$$.strip.txt
2558 cp -f $1 $tempfile
2559 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2560 rm -f $tempfile
2561 echo "Stripped comments from $2" >> $LOGFILE
2562}
2563
2564
2565
2566
2567
2568
2569SplitDirectoryIntoMinidirs() {
2570 local bigdir minidir_root i noof_disks old_pwd res
2571 bigdir=$1
2572 minidir_root=$2
2573 rm -Rf $minidir_root/*
2574
2575 TryToFitDataIntoSeveralDirs $bigdir $minidir_root
2576 noof_disks=$?
2577 if [ "$noof_disks" -eq "0" ] ; then
2578 echo "Failed to fit data into several dirs."
2579 return 0
2580 fi
2581 RejigHyperlinks $minidir_root $noof_disks
2582 rm -Rf $bigdir/*
2583 return $noof_disks
2584}
2585
2586
2587
2588StripExecutable()
2589{
2590 local tmpfile
2591 tmpfile=$TMP_ROOT/stripped.$$.dat
2592 [ -d "$1" ] || [ -h "$1" ] && return
2593 cp -f $1 $tmpfile
2594 strip $tmpfile 2> /dev/null
2595 if [ "$?" -eq "0" ] ; then
2596 cp -f $tmpfile $1
2597 echo "Stripped binary $2" >> $LOGFILE
2598 fi
2599 rm -f $tmpfile
2600}
2601
2602
2603TemporarilyCompressAllFiles() {
2604 local i orig_fname out_fname out_list
2605
2606 i=0
2607 out_list=$2/compressed/compressed.txt
2608 mkdir -p $2/compressed
2609 > $out_list
2610 for orig_fname in $1 ; do
2611 out_fname=$2/compressed/$orig_fname.gz
2612 mkdir -p $out_fname 2> /dev/null
2613 rmdir $out_fname 2> /dev/null
2614 gzip -c6 $orig_fname > $out_fname 2> /dev/null
2615 i=$(((($i+1))%15))
2616 [ "$i" -eq "0" ] && echo -en "."
2617 du -sk $out_fname >> $out_list
2618 done
2619}
2620
2621
2622
2623TryToFindKernelPath() {
2624 local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2625 we_want_version=`uname -r`
2626 possible_kernels=""
2627 duff_kernels=""
2628
2629 if [ "$ARCH" = "ia64" ] ; then
2630 root="/boot/efi/efi"
2631 else
2632 root="/"
2633 fi
2634 for fname in `find $root -maxdepth 2 -type f | grep -F lin | grep -Ev '^/proc/|^/net/'` ; do
2635 [ ! -e "$fname" ] && continue
2636 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2637 file $fname | grep -q gzip
2638 if [ "$?" -eq "0" ] ; then
2639 # Used by ia64
2640 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2641 else
2642 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2643 fi
2644 [ "$fkern_ver" = "" ] && continue
2645# echo "$fname --> $fkern_ver (but we want $we_want_version)" >> /dev/stderr
2646 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2647 [ -f "$fname" ] || continue
2648 [ -h "$fname" ] && continue
2649 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2650 file $fname | grep -q gzip
2651 if [ "$?" -eq "0" ] ; then
2652 # Used by ia64
2653 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2654 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it...\n"
2655 duff_kernels="$fname $duff_kernels"
2656 else
2657 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2658 possible_kernels="$fname $possible_kernels"
2659 fi
2660 else
2661 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2662 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it...\n"
2663 duff_kernels="$fname $duff_kernels"
2664 else
2665 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2666 possible_kernels="$fname $possible_kernels"
2667 fi
2668 fi
2669 done
2670 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2671 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2672 fi
2673 if [ ! "$possible_kernels" ] ; then
2674 LogIt "No kernel matches exactly. Are there any duff kernels?\n"
2675 possible_kernels="$duff_kernels"
2676 if [ ! "$possible_kernels" ] ; then
2677 LogIt "Sorry, no duff kernels either\n"
2678 else
2679 LogIt "I bet you're running Debian or Gentoo, aren't you?\n"
2680 LogIt "Your kernel doesn't have a sane builddate. Oh well...\n"
2681 fi
2682 fi
2683 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2684 noof_kernels=`CountItemsIn "$possible_kernels"`
2685 if [ "$noof_kernels" -eq "0" ] ; then
2686 LogIt "Could not find your kernel.\n"
2687 if [ -e "/boot/vmlinuz" ] ; then
2688 LogIt "Using /boot/vmlinuz as a last resort.\n"
2689 output=/boot/vmlinuz
2690 else
2691 output=""
2692 fi
2693 elif [ "$noof_kernels" -eq "1" ] ; then
2694 kernelpath=`echo "$possible_kernels" | sed s/' '//`
2695 echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2696 output="$kernelpath"
2697 else
2698 for i in $possible_kernels ; do
2699 if echo $i | grep "`uname -r`" ; then
2700 LogIt "OK, I used my initiative and found that "
2701 LogIt "$i is probably your kernel.\n "
2702 output="$i"
2703 return
2704 fi
2705 done
2706 if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2707 output=/boot/vmlinuz
2708 echo "Schlomo, this one's for you." >> $LOGFILE
2709 else
2710 LogIt "Two or more possible kernels found. You may specify any one of them and the \n"
2711 LogIt "boot disks will still work, probably. If one does not work, try another.\n"
2712 LogIt "$possible_kernels\n"
2713 echo ""
2714 fi
2715 fi
2716 echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2717}
2718
2719
2720
2721
2722
2723TryToFitDataIntoSeveralDirs() {
2724 local bigdir minidir_root noof_disks diskno list_of_files filename old_pwd progress
2725 local i retval noof_disks total_files list_of_devs
2726 bigdir=$1
2727 minidir_root=$2
2728 BIG_CLUNKY_SIZE_COUNTER=0
2729 retval=0
2730 noof_disks=1
2731
2732 echo -en "\r \rDividing data into several groups..."
2733 old_pwd=`pwd`
2734 cd $bigdir
2735 list_of_files=`GetFileSizeList . | sort -nr | cut -f2 | grep -Fv "/dev/"`
2736 progress=0
2737 total_files=`CountItemsIn "$list_of_files"`
2738 if [ "`echo "$filename" | grep -x "/dev/.*"`" ] ; then
2739 filesize=1
2740 fi
2741 mkdir -p $minidir_root/$noof_disks
2742 if [ -e "dev" ] ; then
2743 echo "Copying dev/* to $minidir_root/$noof_disks" >> $LOGFILE
2744 cp --parents -pRdf dev $minidir_root/$noof_disks
2745 fi
2746 TemporarilyCompressAllFiles "$list_of_files" $minidir_root
2747 for filename in $list_of_files ; do
2748 AddFileToDir $filename $minidir_root $noof_disks
2749 i=$?
2750 if [ "$i" -gt "$noof_disks" ] ; then
2751 noof_disks=$i
2752 echo -en "\r\t\t\t\t\t\t($noof_disks disks)"
2753 fi
2754 if [ "$i" -eq "0" ] ; then
2755 LogIt "Cannot add file $filename to minidir $minidir_root\n"
2756 retval=$(($retval+1))
2757 fi
2758 progress=$(($progress+1))
2759 echo -en "\r\t\t\t\t\t\t\t\t$(($progress*100/$total_files))% complete\r"
2760 done
2761 cd $old_pwd
2762 echo -en "\rThe files have been subdivided into $noof_disks directories. \r"
2763 rm -Rf $minidir_root/compressed
2764 if [ "$retval" -gt "0" ] ; then
2765 return 0
2766 else
2767 return $noof_disks
2768 fi
2769}
2770
2771
2772
2773TurnTgzIntoRdz() {
2774 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
2775 tgz_dir_fname=$1
2776 rdz_fname=$2
2777 ramdisksize=$3
2778 disksize=$4
2779 kernelsize=$5
2780 maxsize=$(($disksize-$kernelsize))
2781 maxsize=$(($maxsize*2)); # to allow for compression of 50%
2782 tempfile=$TMP_ROOT/temp.rd
2783 mountpoint=$TMP_ROOT/mnt1
2784 res=0
2785 echo -en "..."
2786 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2787 echo -en "..."
2788 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE
2789
2790 [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
2791 rm -f /tmp/mke2fs.$$
2792 echo -en "..."
2793 mkdir -p $mountpoint
2794 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."
2795 echo -en "..."
2796 old_pwd=`pwd`
2797 cd $mountpoint
2798# [ -e "$MINDI_LIB/memtest.img" ] && echo "Yep, this is a multi-function CD" > MULTIFUNC
2799 cp -Rdf $tgz_dir_fname/* . 2>> $LOGFILE >> $LOGFILE
2800 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2801 cd dev || Die "Can't cd to dev"
2802 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2803 rm -f dev-entries.tgz
2804 cd ..
2805
2806# add insmod.static and insmod.static.old if (a) they exist and (b) this is a 64-bit distro
2807# if [ "`uname -a | grep x86`" ] || [ "`uname -a | grep amd64`" ] ; then
2808
2809 for w in insmod.static insmod.static.old ; do
2810 s=`which $w 2> /dev/null`
2811 if [ -e "$s" ] ; then
2812 cp --parents -af $s .
2813# LogIt "Copying $s to initrd"
2814 fi
2815 done
2816
2817# fi
2818
2819 mkdir -p tmp
2820 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2821 for w in cdrom floppy groovy-stuff ; do
2822 mkdir -p mnt/$w
2823 done
2824 if [ "$RUN_AFTER_INITIAL_BOOT_PHASE" ] ; then
2825 ReplaceIndividualLine sbin/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" sbin/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
2826 fi
2827 if [ "$RUN_AFTER_BOOT_PHASE_COMPLETE" ] ; then
2828 ReplaceIndividualLine sbin/init `grep -n "#ABSORBENTANDYELLOWANDPOROUSISHE#" sbin/init | cut -d':' -f1` "$RUN_AFTER_BOOT_PHASE_COMPLETE"
2829 fi
2830
2831 lsmod > tmp/original-lsmod.txt
2832
2833 cp --parents -Rdf /dev/fd0*[1,2][4,7,8]* . 2> /dev/null
2834 cd $old_pwd
2835 echo -en "..."
2836 MakeModuleLoadingScript $TMPMODPROBE_FLAG $mountpoint/sbin/insert-all-my-modules
2837 echo -en "..."
2838 old_pwd=`pwd`
2839 if [ "$YOUR_KERNEL_SUCKS" ] ; then
2840 cd $TMP_ROOT
2841 floppy_modules_path=lib/modules/$FAILSAFE_KVER
2842 else
2843 cd /
2844###
2845### Sq-Modification... Use kernel name in module path if specified.
2846###
2847 #floppy_modules_path=lib/modules/`uname -r`
2848 if [ "${kernelname}" != "" ]
2849 then
2850 floppy_modules_path=lib/modules/${kernelname}
2851 else
2852 floppy_modules_path=lib/modules/`uname -r`
2853 fi
2854###
2855### Sq-Modification end
2856###
2857 fi
2858 floppy_modules=""
2859 if [ "$disksize" -lt "2880" ] ; then
2860 list_of_groovy_mods="$FLOPPY_MODS $IDE_MODS ide-scsi sr_mod cdrom isocd isofs `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2861 else
2862 list_of_groovy_mods="$CDROM_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2863 fi
2864 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
2865 # For PXE boot
2866 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2867 # Here we need the net busybox
2868 mv $mountpoint/bin/busybox.net $mountpoint/bin/busybox
2869 else
2870 rm -f $mountpoint/bin/busybox.net
2871 fi
2872 [ -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"
2873 for i in $list_of_groovy_mods ; do
2874 floppy_modules="$floppy_modules `FindSpecificModuleInPath $floppy_modules_path $i`"
2875 done
2876 for i in $floppy_modules ; do
2877 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2878 [ "$YOUR_KERNEL_SUCKS" ] && i=$TMP_ROOT/$i
2879 echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2880 cp -df $i $mountpoint/ || LogIt "Unable to copy $i to $mountpoint\n"
2881 [ "`echo "$i" | grep -F ".gz"`" ] && gunzip -f $mountpoint/`basename $i`
2882 done
2883# if [ -e "/dev/.devfsd" ] ; then
2884# echo "Copying devfs stuff to ramdisk" >> $LOGFILE
2885# for i in /dev /etc/devfsd.conf /etc/modules.devfs /lib/dev-state ; do
2886# cp --parents -pRdf $i $mountpoint/ 2>> $LOGFILE
2887# done
2888# fi
2889 if [ ! -e "/sbin/devfsd" ] || [ "$disksize" -lt "2880" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2890 echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2891 [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2892 [ "$disksize" -lt "2880" ] && echo "...because disksize = $disksize" >> $LOGFILE
2893 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2894# ls -l $mountpoint/sbin/devfsd &> /dev/null || Die "Can't find devfsd daemon on ramdisk"
2895 rm -f $mountpoint/sbin/devfsd
2896 fi
2897 cd $old_pwd
2898 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2899 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2900 rm -f $mountpoint/zero
2901 if [ "`DidMondoCallMe`" ] ; then
2902 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2903 cp -f $mountpoint/tmp/mondo-restore.cfg $MONDO_TMP &> /dev/null
2904 cp -f $TMP_ROOT/mountlist.txt $mountpoint/tmp/ || Die "Cannot copy mountlist to ramdisk"
2905 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2906 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2907 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2908 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2909 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2910 fi
2911 mkdir -p $mountpoint/tmp
2912 mkdir -p $mountpoint/proc
2913 echo "$disksize" > $mountpoint/tmp/$disksize.siz
2914 find $mountpoint -name CVS -exec rm -rf '{}' \;
2915 umount $mountpoint || Die "Cannot unmount $tempfile"
2916 dd if=$tempfile bs=1k 2> /dev/null | gzip -v9 > $rdz_fname 2> /dev/null
2917# gzip -9 $tempfile
2918# mv $tempfile.gz $rdz_fname
2919 if [ "$res" -eq "0" ] ; then
2920 echo -en "..."
2921 else
2922 echo -en "\rMade an rdz WITH ERRORS. \n"
2923 fi
2924 return 0
2925}
2926
2927
2928
2929WhichOfTheseModulesAreLoaded() {
2930 local modname loaded_modules
2931 loaded_modules=" `lsmod | tr -s ' ' '\t' | cut -f1 | grep -Fvx "Modules" | tr '\n' ' '` "
2932 for modname in $1 ; do
2933 [ "`echo "$loaded_modules" | grep -F " $modname "`" ] && echo "$modname"
2934 done
2935}
2936
2937
2938
2939
2940ZipMinidirsIntoTarballs() {
2941 local minidir_root tardir noof_disks diskno old_pwd i
2942 minidir_root=$1
2943 tardir=$2
2944 noof_disks=$3
2945
2946 echo -en "Tarring and zipping the group`PluralOrNot $noof_disks`..."
2947 mkdir -p $tardir
2948 mkdir -p $minidir_root/all
2949 old_pwd=`pwd`
2950 diskno=1
2951 while [ "$diskno" -le "$noof_disks" ] ; do
2952 cd $minidir_root/$diskno || LogIt "Warning - cannot cd to $minidir_root/$diskno\n"
2953 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."
2954 diskno=$(($diskno+1))
2955 echo -n "..."
2956 cp -pRdf * $minidir_root/all
2957 done
2958 mkdir -p $minidir_root/all/tmp
2959 cd $minidir_root/all
2960 size_of_all_tools=`du -sk . | cut -f1`
2961 if [ "`DidMondoCallMe`" ] ; then
2962 for q in filelist.full.gz biggielist.txt ; do
2963 [ ! -e "$MONDO_TMP/$q" ] && Die "Cannot find $MONDO_TMP/$q"
2964 cp -pRdf $MONDO_TMP/$q tmp/
2965 done
2966 mkdir -p $minidir_root/all/tmp
2967 echo -en "$FILES_IN_FILELIST" > $minidir_root/all/tmp/FILES-IN-FILELIST 2> /dev/null
2968 echo -en "$LAST_FILELIST_NUMBER" > $minidir_root/all/tmp/LAST-FILELIST-NUMBER 2> /dev/null
2969 fi
2970 tar -b 4096 -cf - * 2> /dev/null | gzip -9 > $tardir/all.tar.gz
2971 dd if=/dev/zero bs=1k count=64 >> $imagesdir/all.tar.gz 2> /dev/null
2972 [ "`du -sm $imagesdir/all.tar.gz | cut -f1`" -ge "30" ] && Die "You have too many tools in your shed"
2973 cd $old_pwd
2974 rm -Rf $minidir_root
2975 echo -e "$DONE"
2976}
2977
2978
2979
2980# BERLIOS: This function is wrong
2981# Should be recoded. Desactivated in between
2982
2983#ListUnsavedKernelModules() {
2984 #local fname modules
2985 #fname=/tmp/$RANDOM.$$.$RANDOM
2986 #lsmod | sed -n '2,$s/ .*//p' > $fname
2987 #modules=`sort $fname | uniq -d2 | tr '\n' ' '`
2988 #rm -f $fname
2989 #[ "$modules" ] && echo "Unsaved kernel modules: $modules" >> $LOGFILE
2990#}
2991
2992
2993
2994
2995
2996##############################################################################
2997#----------------------------------- main -----------------------------------#
2998##############################################################################
2999
3000
3001#AWK=`which gawk`
3002#LocateDeps $1
3003#MakeModuleLoadingScript /tmp/load-modules.sh
3004#exit 0
3005
3006
3007#cat /etc/mindi/deplist.txt | GenerateGiantDependencyList /tmp/deplist.old 200
3008#exit 0
3009
3010
3011
3012if [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
3013 echo "mindi v$MINDI_VERSION"
3014 exit 0
3015fi
3016
3017> $LOGFILE
3018echo "mindi v$MINDI_VERSION" >> $LOGFILE
3019echo "$ARCH architecture detected" >> $LOGFILE
3020echo "mindi called with the following arguments:" >> $LOGFILE
3021echo "$@" >> $LOGFILE
3022
3023if [ -e "/etc/conf.modules" ] && [ ! -e "/etc/modules.conf" ] ; then
3024 LogIt "Warning - Ancient distro detected.\n" 1
3025 ln -sf /etc/conf.modules /etc/modules.conf
3026fi
3027[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
3028
3029FindHomeOfMindiAndMondo
3030trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
3031AbortIfYourDistroIsAPieceOfStercus
3032[ "`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"
3033# If we have a 2.6 kernel, the system uses module-init-tools which means that we
3034# may have the modprobe configuration spread out across multiple files in
3035# directory /etc/modprobe.d. If this is the case we concatenate these files into
3036# a temporary file for further processing. Otherwise we continue in the standard
3037# way. Note further that in case /etc/modprobe.d exists, we use it and ignore
3038# /etc/modprobe.conf which is exactly what module-init-tools does. The temporary
3039# modprobe.conf file is created in MakeModuleLoadingScript. AL041128.
3040if [ -d "/etc/modprobe.d" ] && [ `uname -r | cut -c1-3` == "2.6" ] ; then
3041 TMPMODPROBE_FLAG="Y"
3042else
3043 TMPMODPROBE_FLAG="N"
3044 [ -e "/etc/modprobe.conf" ] && [ ! -e "/etc/modules.conf" ] && ln -sf /etc/modprobe.conf /etc/modules.conf
3045 [ ! -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..."
3046fi
3047FixPathIfBroken
3048[ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
3049AbortIfMkfsVfatMissing
3050### BCO
3051### Fix as it's not mandatory on ia64
3052if [ "$ARCH" = "ia64" ] ; then
3053 FindELiloBinary
3054else
3055 FindIsolinuxBinary
3056 FindLiloBinary
3057fi
3058grep -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
3059rm -f /tmp/mindi_lo
3060trap "Aborted" SIGTERM
3061DONE="\r\t\t\t\t\t\t\t\tDone. "
3062CHOPSIZE=240
3063BIGNO=0
3064MAX_COMPRESSED_SIZE=1300
3065imagesdir=/root/images/mindi
3066mkdir -p $imagesdir
3067kernelpath=""
3068MONDO_ROOT=/tmp/mindilinux/mondo-root
3069mkdir -p $MONDO_ROOT
3070
3071if [ -d "/proc/lvm" ]; then
3072 # LVM v1
3073 LVMCMD=""
3074 LVM="v1"
3075elif [ -d "/dev/mapper" ]; then
3076 # LVM v2
3077 LVMCMD="lvm"
3078 LVM="v2"
3079else
3080 LVM="false"
3081fi
3082
3083if [ "$#" -ge "2" ] ; then
3084 if [ "$1" = "--max-compressed-size" ] ; then
3085 MAX_COMPRESSED_SIZE=$2
3086 shift; shift
3087 fi
3088fi
3089
3090FLOPPY_WAS_MOUNTED=""
3091for mtpt in /media/floppy /mnt/floppy /floppy ; do
3092 if mount | grep -w $mtpt &> /dev/null ; then
3093 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3094 umount $mtpt
3095 fi
3096done
3097
3098if [ "$#" -ne "0" ] ; then
3099 if [ "$1" = "--findkernel" ] ; then
3100 res=`TryToFindKernelPath`
3101# 2> /dev/null`
3102 if [ "$res" = "" ] ; then
3103 exit 1
3104 else
3105 echo "$res"
3106 exit 0
3107 fi
3108 elif [ "$1" = "--makemountlist" ] ; then
3109 [ ! "$2" ] && Die "Please specify the output file"
3110 MakeMountlist $2
3111 exit $?
3112 elif [ "$1" = " --version" ] || [ "$1" = "-v" ] ; then
3113 echo "Mindi v$MINDI_VERSION"
3114 exit 0
3115 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3116 TMP_ROOT=$2
3117 MONDO_TMP=$2
3118 imagesdir=$3
3119 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3120###
3121### Sq-Modification...
3122### Attempt to locate kernel specific module path
3123### if module path is found then use it other wise use uname -r to set it...
3124###
3125 kernelname=`echo $kernelpath | cut -d'-' -f2-`
3126 LogIt "kernelname = $kernelname\n"
3127 LogIt "kernelpath = $kernelpath\n"
3128 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3129 then
3130 LogIt "Module path for ${kernelpath} not found...\n"
3131 LogIt "using running kernel\'s modules.\n"
3132 kernelname=`uname -r`
3133 else
3134 LogIt "Using modules for kernel: ${kernelname}\n"
3135 fi
3136###
3137### end of Sq-Modification
3138###
3139 TAPEDEV=$5
3140 TAPESIZE=$6
3141 FILES_IN_FILELIST=$7
3142 USE_LZO=$8
3143 CDRECOVERY=$9
3144 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3145 IMAGE_DEVS=""
3146 else
3147 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3148 fi
3149 if [ "${11}" ] ; then
3150 LILO_OPTIONS=""
3151# LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
3152 fi
3153 LAST_FILELIST_NUMBER=${12}
3154 ESTIMATED_TOTAL_NOOF_SLICES=${13}
3155 EXCLUDE_DEVS="${14}"
3156 USE_COMP="${15}"
3157 USE_LILO="${16}"
3158 USE_STAR="${17}"
3159 INTERNAL_TAPE_BLOCK_SIZE="${18}"
3160 DIFFERENTIAL="${19}"
3161 NOT_BOOT="${20}"
3162 [ "$USE_COMP" = "" ] && USE_COMP=yes
3163 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3164 [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine.\n"
3165 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3166 kernelname=`echo $kernelpath | cut -d'-' -f2-`
3167 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3168 then
3169 LogIt "Module path for ${kernelpath} not found...\n"
3170 LogIt "using running kernel\'s modules.\n"
3171 kernelname=`uname -r`
3172 else
3173 LogIt "Using modules for kernel: ${kernelname}\n"
3174 fi
3175 [ "$CDRECOVERY" = "yes" ] && [ "$TAPEDEV" != "" ] && Die "Sorry, you can't use --cd-recovery and --write-tapes at the same time"
3176 MONDO_ROOT=`echo $imagesdir | sed 's/\(.*\)\/.*/\1/'`
3177 [ "$MONDO_ROOT" = "" ] && Die "MONDO_ROOT is undefined"
3178 else
3179 echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3180 exit 1
3181 fi
3182fi
3183#ScanCDandTape
3184[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3185if [ "$CDRECOVERY" = "yes" ] ; then
3186 iso_cfg_file=$MINDI_LIB/isolinux-H.cfg
3187 sys_cfg_file=$MINDI_LIB/syslinux-H.cfg
3188else
3189 iso_cfg_file=$MINDI_LIB/isolinux.cfg
3190 sys_cfg_file=$MINDI_LIB/syslinux.cfg
3191fi
3192
3193
3194
3195
3196#ReplaceIndividualLine /tmp/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" /tmp/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
3197#exit 0
3198
3199
3200#ListKernelModules
3201#exit 0
3202
3203
3204
3205
3206[ -e "$iso_cfg_file" ] || Die "Cannot find $iso_cfg_file"
3207rm -Rf $TMP_ROOT/mindilinux/*
3208TMP_ROOT=$TMP_ROOT/mindilinux/$$
3209mkdir -p $TMP_ROOT
3210mkdir -p $imagesdir
3211if [ ! "`DidMondoCallMe`" ] ; then
3212 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION\n"
3213 LogIt "Latest Mindi is available from http://mondorescue.berlios.de\n"
3214 LogIt "BusyBox sources are available from http://www.busybox.net\n"
3215 LogIt "------------------------------------------------------------------------------"
3216else
3217 echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> /var/log/mondo-archive.log
3218fi
3219
3220# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
3221insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
3222for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3223 insmod $i >> $LOGFILE 2>> $LOGFILE
3224done
3225
3226FILE_CACHE=$TMP_ROOT/mindi-file-loc-cache
3227KERN_DISK_MADE=""
3228
3229echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
3230echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
3231echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
3232if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3233 LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else.\n"
3234 MakeMondoConfigFile $MONDO_TMP/mondo-restore.cfg
3235 MakeMountlist $MONDO_TMP/mountlist.txt
3236 mkdir -p $MONDO_TMP/small-all/tmp
3237 cd $MONDO_TMP/small-all
3238 cp -f $MONDO_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp || Die "Cannot copy small all.tar.gz"
3239 tar -cv tmp | gzip -9 > $MONDO_TMP/all.tar.gz || Die "Cannot make small all.tar.gz"
3240 sleep 2
3241 LogIt "Done. Exiting.\n"
3242 exit 0
3243fi
3244
3245if [ "$kernelpath" = "" ] ; then
3246 [ "`DidMondoCallMe`" ] && Die "Please use -k <path> to specify kernel."
3247 if [ $USE_OWN_KERNEL != "yes" ]; then
3248 echo -en "Do you want to use your own kernel to build the boot disk (y/n) ?"
3249 read ch
3250 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3251 USE_OWN_KERNEL="yes"
3252 fi
3253 fi
3254 if [ "$USE_OWN_KERNEL" = "yes" ]; then
3255 YOUR_KERNEL_SUCKS=""
3256 kernelpath=`TryToFindKernelPath`
3257 if [ "$kernelpath" = "" ] ; then
3258 echo -n "Please enter kernel path : "
3259 read kernelpath
3260 fi
3261 else
3262 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3263 fi
3264fi
3265if [ ! "`DidMondoCallMe`" ] ; then
3266 echo -en "Would you like to use LILO (instead of syslinux)\nfor your boot CD/floppies (y/n) ?"
3267 read ch
3268 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3269 USE_LILO=yes
3270 else
3271 USE_LILO=no
3272 fi
3273fi
3274if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3275 kernelpath=$MINDI_LIB/vmlinuz
3276 LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks.\n"
3277 LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
3278 LogIt "disks then it may still be a result of a problem with your kernel.\n"
3279 pwd=`pwd`
3280 cd $TMP_ROOT
3281 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3282 cd $pwd
3283 YOUR_KERNEL_SUCKS="Your kernel sucks"
3284fi
3285echo -e "Mindi's temp dir = $TMP_ROOT \nMindi's output dir=$imagesdir" >> $LOGFILE
3286[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty...\n"
3287rm -f /tmp/mindi.err.*.tgz
3288
3289[ "$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."
3290
3291rm -f /root/images/mindi/{*img,*gz,*iso}
3292
3293PrepareDataDiskImages $imagesdir
3294noof_disks=$?
3295ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3296rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3297ramdisk_size=$rds
3298
3299echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
3300if [ "$USE_LILO" = "yes" ] ; then
3301 if [ "$ARCH" = "ia64" ] ; then
3302 PrepareBootDiskImage_LILO $imagesdir $IA64_BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create ia64 floppy disk image."
3303 else
3304 if ! PrepareBootDiskImage_LILO $imagesdir 1722 $kernelpath $ramdisk_size ; then
3305 LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3306 LogIt "if you want to make a 1.72MB floppy disk.\n"
3307 fi
3308 if ! PrepareBootDiskImage_LILO $imagesdir 2880 $kernelpath $ramdisk_size ; then
3309 LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3310 LogIt "Please reduce your kernel's size\n"
3311 LogIt "if you want to make a 2.88MB floppy disk.\n"
3312 PrepareBootDiskImage_LILO $imagesdir 5760 $kernelpath $ramdisk_size || Die "Failed to create 2.88MB floppy disk image."
3313 fi
3314 fi
3315else
3316 if ! PrepareBootDiskImage_SYSLINUX $imagesdir 1722 $kernelpath $ramdisk_size ; then
3317 LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3318 LogIt "if you want to make a 1.72MB floppy disk.\n"
3319 if ! PrepareBootDiskImage_SYSLINUX $imagesdir 2880 $kernelpath $ramdisk_size ; then
3320 LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3321 LogIt "Please reduce your kernel's size\n"
3322 LogIt "if you want to make a 2.88MB floppy disk.\n"
3323 PrepareBootDiskImage_SYSLINUX $imagesdir 5760 $kernelpath $ramdisk_size || Die "Failed to create 5.76MB floppy disk image."
3324 fi
3325 fi
3326fi
3327
3328
3329
3330[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3331...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3332
3333
3334if [ ! "`DidMondoCallMe`" ] ; then
3335 ListImagesForUser $imagesdir
3336 boot_dev=/dev/fd0u1722
3337 [ ! -e "$boot_dev" ] && mknod $boot_dev b 2 60
3338 [ ! -e "$boot_dev" ] && boot_dev=/dev/fd0H1722
3339 [ ! -e "$boot_dev" ] && Die "Oh Lord, will you PLEASE tell the vendor to create the 1.72MB devices in /dev?"
3340 if [ "$PROMPT_WRITE_BOOT_FLOPPIES" = "yes" ]; then
3341 OfferToCopyImagesToDisks $imagesdir $boot_dev $FDDEVICE
3342 fi
3343 OfferToMakeBootableISO $imagesdir
3344 LogIt "Finished.\n"
3345elif [ "$TAPEDEV" ] ; then
3346 mkdir -p /root/images/mindi
3347 rm -f /root/images/mindi/{*img,*gz,*iso}
3348 OfferToMakeBootableISO $imagesdir
3349 if [ -e "$imagesdir/all.tar.gz" ] ; then
3350 cp -f $imagesdir/all.tar.gz $MONDO_TMP/
3351 else
3352 Die "Cannot find all.tar.gz, to be written to tape"
3353 fi
3354else
3355 OfferToMakeBootableISO $imagesdir
3356fi
3357if [ "$imagesdir" != "/root/images/mindi" ] ; then
3358 for i in `find $imagesdir -maxdepth 1 -name "*.iso" -o -name "*.img"` ; do
3359 cp -f $i /root/images/mindi || LogIt "[line 3260] Cannot copy $i to /root/images/mindi\n"
3360 done
3361fi
3362[ "$TMP_ROOT" != "/tmp" ] && rm -Rf $TMP_ROOT
3363# cleanup
3364rm -fR /tmp/mountlist.txt.$$ $FDISKLOG /tmp/mindilinux
3365LogIt "$FRIENDLY_OUTSTRING\n"
3366#ListUnsavedKernelModules
3367for mtpt in $FLOPPY_WAS_MOUNTED ; do
3368 mount $mtpt
3369done
3370echo "Mindi is exiting" >> $LOGFILE
3371exit 0
Note: See TracBrowser for help on using the repository browser.