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

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

deplist.d introduced
deplist.txt split in multiple config files under it
delivery process adapted

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