source: MondoRescue/trunk/mindi/mindi@ 687

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

merge -r671:686 $SVN_M/branches/stable

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