source: MondoRescue/branches/2.0.7/mindi/mindi@ 491

Last change on this file since 491 was 491, checked in by bcornec, 18 years ago

merge -r 489:490 $SVN_M/branches/stable

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