source: MondoRescue/trunk/mindi/mindi@ 794

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

merge -r781:793 $SVN_M/branches/stable

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