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

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

Try again to fix the ReadAllLink issue (libs do not go in the archive now as reported by Andree)

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