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

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