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

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

Create function ReadAllLink in mindi used by LocateFile now to try to optimize it. Hope mindi will now get all libraries correctly

  • Property svn:keywords set to Rev Id
File size: 110.2 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 860 2006-09-29 22:53:33Z 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 usbhid"
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 bnx2 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 echo "End date : `date`" >> $LOGFILE
483 if [ "$1" = "" ] ; then
484 LogIt "Fatal error\n"
485 else
486 LogIt "Fatal error. $1\n"
487 fi
488 sync
489 cd /
490
491 my_partitions=`mount | grep -F $$ | cut -f1 -d' '`
492 [ "$my_partitions" != "" ] && umount $my_partitions
493 [ "$TMP_ROOT" != "/tmp" ] && rm -Rf $TMP_ROOT
494 cd /tmp
495 mkdir -p mindi.err
496 for i in /etc/fstab /etc/lilo.conf /etc/raidtab $LOGFILE /var/log/mondo-archive.log /tmp/mountlist.txt.$$ $FDISKLOG ; do
497 [ -e "$i" ] && cp -f $i mindi.err/
498 done
499 rm -f mindi.err.*.tgz
500 tar -cf - mindi.err | gzip -9 > mindi.err.$$.tgz
501 rm -Rf mindi.err /tmp/mountlist.txt.$$ mindilinux $FDISKLOG
502 LogIt "Please e-mail a copy of /tmp/mindi.err.$$.tgz to the mailing list.\n"
503 LogIt "See http://www.mondorescue.org for more information.\n"
504 LogIt "WE CANNOT HELP unless you enclose that file.\n"
505 exit 1
506}
507
508
509
510
511DropOptimizedLibraries() {
512 local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
513 filelist=$1
514 outdir=$2
515
516 list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
517 if [ "$list_of_optimized_libraries" = "" ] ; then
518 return 0
519 fi
520 echo -en "Dropping i686-optimized libraries if appropriate"
521 for optimized_lib_name in $list_of_optimized_libraries ; do
522 echo -en "."
523 reason=""
524 vanilla_lib_name=`echo "$optimized_lib_name" | sed s/i[5-7]86// | tr -s '/' '/'`
525 echo "$vanilla_lib_name" >> $filelist
526 resolved=$vanilla_lib_name
527 echo "Adding $resolved to filelist" >> $LOGFILE
528 while [ -h "$resolved" ] ; do
529 resolved=`readlink $resolved`
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 else
1106 ldd $fname 2> /dev/null | ProcessLDD $fname
1107 fi
1108 done
1109}
1110
1111# Give all symlinks recursively of a full path name
1112ReadAllLink() {
1113 file="$1"
1114
1115 if [ ! -h $file ]; then
1116 echo "$file"
1117 return 0
1118 fi
1119
1120 link=`readlink $file`
1121 if [ "`dirname $link | cut -c1`" = "/" ]; then
1122 echo "$link `ReadAllLink $link`"
1123 else
1124 echo "$link `dirname $file`/`ReadAllLink $link`"
1125 fi
1126}
1127
1128
1129LocateFile() {
1130 local i path fname_to_find location output resolved tmp stub cache_id loclist
1131 fname_to_find="$1"
1132 if echo "$fname_to_find" | grep -x "/.*" ; then
1133 output="$fname_to_find"
1134 if [ -h "$output" ] ; then
1135 output="`ReadAllLink $output` $output"
1136 fi
1137 echo "$output"
1138 return 0
1139 fi
1140 output=""
1141 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
1142 [ ! -d "$path" ] && continue
1143 for location in "$path/$fname_to_find" ; do
1144 [ ! -e "$location" ] && continue
1145 output="$location $output"
1146 if [ -h "$location" ] ; then
1147 output="`ReadAllLink $location` $location $output"
1148 fi
1149 done
1150 done
1151 if [ "$output" = "" ] ; then
1152 return 1
1153 fi
1154 echo "$output"
1155 return 0
1156}
1157
1158
1159
1160LogIt() {
1161 if [ -e /dev/stderr ] ; then
1162 echo -e "$1" >> /dev/stderr
1163 elif [ -e /usr/bin/logger ] ; then
1164 /usr/bin/logger -s $1
1165 fi
1166 echo -en "$1" >> $LOGFILE
1167}
1168
1169
1170
1171
1172
1173
1174
1175# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
1176
1177MakeMondoConfigFile() {
1178 local outfile use_lzo use_comp use_star
1179 outfile=$1
1180 > $outfile
1181 [ "$TAPESIZE" ] && echo "media-size $TAPESIZE" >> $outfile
1182 [ "$TAPEDEV" ] && echo "media-dev $TAPEDEV" >> $outfile
1183 [ "$FILES_IN_FILELIST" ] && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
1184 [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
1185 [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
1186 use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
1187 use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
1188 use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
1189 echo "use-lzo $use_lzo" >> $outfile
1190 echo "use-star $use_star" >> $outfile
1191 echo "use-comp $use_comp" >> $outfile
1192 echo "datestamp `date`" >> $outfile
1193 [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
1194 AddFileToCfgIfExists $MONDO_TMP/NFS-CLIENT-IPADDR nfs-client-ipaddr $outfile
1195 AddFileToCfgIfExists $MONDO_TMP/NFS-CLIENT-NETMASK nfs-client-netmask $outfile
1196 AddFileToCfgIfExists $MONDO_TMP/NFS-CLIENT-BROADCAST nfs-client-broadcast $outfile
1197 AddFileToCfgIfExists $MONDO_TMP/NFS-CLIENT-DEFGW nfs-client-defgw $outfile
1198 AddFileToCfgIfExists $MONDO_TMP/NFS-SERVER-MOUNT nfs-server-mount $outfile
1199 AddFileToCfgIfExists $MONDO_TMP/NFS-SERVER-PATH nfs-server-path $outfile
1200 AddFileToCfgIfExists $MONDO_TMP/NFS-DEV nfs-dev $outfile
1201 AddFileToCfgIfExists $MONDO_TMP/NFS-SERVER-IPADDR nfs-server-ipaddr $outfile
1202 AddFileToCfgIfExists $MONDO_TMP/ISO-DEV iso-dev $outfile
1203 AddFileToCfgIfExists $MONDO_TMP/ISO-MNT iso-mnt $outfile
1204 AddFileToCfgIfExists $MONDO_TMP/ISO-PREFIX iso-prefix $outfile
1205 AddFileToCfgIfExists $MONDO_TMP/ISODIR isodir $outfile
1206 AddFileToCfgIfExists $MONDO_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
1207 AddFileToCfgIfExists $MONDO_TMP/BOOTLOADER.NAME bootloader.name $outfile
1208 AddFileToCfgIfExists $MONDO_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
1209 AddFileToCfgIfExists $MONDO_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
1210 AddFileToCfgIfExists $MONDO_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
1211 AddFileToCfgIfExists $MONDO_TMP/DIFFERENTIAL differential $outfile
1212}
1213
1214
1215
1216
1217MakeModuleLoadingScript() {
1218 local module fname params modpath kver outerloop i modpaths kver searchpath list_to_echo j
1219 tmpmodprobe_flag=$1
1220 outfile=$2
1221 > $outfile || Die "Cannot create empty $outfile"
1222 echo -en "#\041/bin/sh\n\n" >> $outfile
1223 echo "echo -en \"Loading your modules...\"" >> $outfile
1224 if [ "$YOUR_KERNEL_SUCKS" ] ; then
1225 kver=$FAILSAFE_KVER
1226 cd $TMP_ROOT
1227 searchpath=lib/modules/$kver
1228 else
1229###
1230### Sq-Modification ... Use kernelname for module search path if specified
1231###
1232 #kver=`uname -r`
1233 if [ "${kernelname}" != "" ]
1234 then
1235 kver=${kernelname}
1236 else
1237 kver=`uname -r`
1238 fi
1239###
1240### Sq-Modification end
1241###
1242 searchpath=/lib/modules/$kver
1243 fi
1244
1245 echo -en "for outerloop in 1 2 3 4 5 ; do\necho -en \".\"\n" >> $outfile
1246 list_to_echo="`lsmod | sed -n '2,$s/ .*//p'`"
1247# LTE=`echo "$list_to_echo" | tr ' ' '\n' | grep -n "" | cut -d':' -f2,3,4 | tr '\n' ' '`
1248# lte_old="$LTE"
1249# LTE=""
1250# for q in $lte_old ; do
1251# LTE="$q $LTE"
1252# done
1253#echo "LTE = '$LTE'" >> $LOGFILE
1254 # Make temporary modprobe.conf file if we are told so
1255 if [ $tmpmodprobe_flag == "Y" ] ; then
1256 infile="/tmp/modprobe.conf.mindi.$$"
1257 find /etc/modprobe.d -maxdepth 1 -name "*" -xtype f -print0 | xargs -0 cat > $infile
1258 else
1259 infile="/etc/modules.conf"
1260 fi
1261 for module in $list_to_echo $EXTRA_MODS ; do
1262 params=`sed -n "s/^options \\+$module \\+//p" $infile`
1263 modpaths=`FindSpecificModuleInPath $searchpath $module`
1264 for i in $modpaths ; do
1265 echo "MyInsmod $i $params > /dev/null 2> /dev/null" \
1266 | tr '.' '#' \
1267 | sed s/#o#gz/#o/ \
1268 | sed s/#o#gz/#o/ \
1269 | sed s/#ko#gz/#ko/ \
1270 | sed s/#ko#gz/#ko/ \
1271 | tr '#' '.' >> $outfile
1272 echo -en "$i added to module list.\n" >> $LOGFILE
1273 done
1274 done
1275 echo -en "done\n" >> $outfile
1276 echo "echo \"Done.\"" >> $outfile
1277 chmod +x $outfile
1278# cp $outfile /tmp/out.txt
1279 cd /
1280 # Remove temporary modprobe.conf file if we have created one
1281 if [ $tmpmodprobe_flag == "Y" ] ; then
1282 rm -f $infile
1283 fi
1284}
1285
1286
1287
1288
1289
1290MakeMountlist() {
1291 local scratchdir mountlist all_partitions current_partition \
1292partition_size partition_format outstring partition_number \
1293partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
1294absolute_partition old_partition_fmt current_lvolume
1295
1296 echo "Your raw fstab file looks like this:-" >> $LOGFILE
1297 cat $MY_FSTAB >> $LOGFILE
1298 echo "Your mountlist will look like this:-"
1299
1300# scratchdir, mountlist(OUT)
1301 scratchdir=$TMP_ROOT
1302 mountlist=$1
1303
1304# NB: partition = device
1305# NB: mountpt = where the device is mounted
1306
1307 [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
1308
1309 rm -f $mountlist
1310 mkdir -p $mountlist
1311 rm -Rf $mountlist
1312 > $mountlist
1313 echo -en "\rHang on...\r"
1314 all_partitions=""
1315
1316 if [ $LVM != "false" ]; then
1317 echo -en "\rAnalyzing LVM...\r"
1318 all_partitions=`$MINDI_LIB/analyze-my-lvm | grep -F ">>>" | cut -d' ' -f2-32`
1319 fi
1320 all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1321# echo "all partitions = $all_partitions" > /dev/stderr
1322 for i in $IMAGE_DEVS ; do
1323 mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1324 done
1325 [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1326 printf " %-15s %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL
1327 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"
1328 for c_p in $all_partitions ; do
1329# echo "c_p = $c_p" > /dev/stderr
1330 [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] && continue
1331 [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1332 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
1333 current_partition=`ResolveSoftlink $c_p`
1334 [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
1335 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1336 else
1337 current_partition="$c_p"
1338 fi
1339 [ "$c_p" = "none" ] && continue
1340 redhat_label=""
1341 absolute_partition=`ResolveSoftlink $c_p`
1342 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1343
1344 # Detects noauto partitions not mounted and exclude them
1345 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1346 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
1347 continue
1348 fi
1349
1350 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1351 # current_partition contains only first column of /etc/fstab
1352 if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
1353 str_to_find_fmt_with=$current_partition
1354 redhat_label=`echo "$current_partition" | /bin/cut -d'=' -f2`
1355 actual_dev=""
1356
1357 # 1st try, findfs - the RHEL way of finding labels and their partitions
1358 if [ -x "/sbin/findfs" ]; then
1359 actual_dev=`/sbin/findfs LABEL=${redhat_label} 2> /dev/null`
1360 fi
1361
1362 # 2nd try : blkid, the good way for all LABEL except swap
1363 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1364 actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | /bin/cut -d':' -f1`
1365 # For LVM FS it will give a /dev/dm-# which should then be converted
1366 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1367 major=`/bin/ls -l $actual_dev | awk '{print $5}'`
1368 minor=`/bin/ls -l $actual_dev | awk '{print $6}'`
1369 for dev in `ls /dev/mapper/*`; do
1370 major1=`/bin/ls -l $dev | awk '{print $5}'`
1371 minor1=`/bin/ls -l $dev | awk '{print $6}'`
1372 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1373 actual_dev=`/bin/ls -l $dev | awk '{print $10}'`
1374 break
1375 fi
1376 done
1377 fi
1378 fi
1379
1380 # 3rd try, which works on a standard partition (ext2/3), but not on swap
1381 # For LVM gives a /dev/mapper entry
1382 if [ "x$actual_dev" = "x" ]; then
1383 actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | /bin/cut -d' ' -f1`
1384 fi
1385
1386 # 4th try, with vol_id
1387 # SWAP only
1388 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1389 list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | /bin/awk '{ print $1 }' `
1390 for dev_swap in $list_swaps ; do
1391 dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1392 if [ "x$dev_exists" != "x" ]; then
1393 actual_dev=$dev_swap
1394 break;
1395 fi
1396 done
1397 fi
1398
1399 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1400 # LABEL=SW-cciss/c0d0p3 (RDP)
1401 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1402 # SWAP only
1403 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1404 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1405 do
1406 # Location of the swap label for kernel 2.6
1407 try_dev_label=`dd bs=1 count=16 skip=1052 if=$try_dev 2> /dev/null`
1408 if [ "x$try_dev_label" = "x$redhat_label" ]; then
1409 actual_dev=$try_dev
1410 fi
1411 done
1412 fi
1413
1414 # Check if one of all those tries has known success
1415 if [ "x$actual_dev" != "x" ]; then
1416 current_partition=$actual_dev
1417 else
1418 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 findfs|blkid|vol_id\n"
1419 fi
1420 else
1421 str_to_find_fmt_with=$current_partition
1422 fi
1423
1424 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1425 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1426 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1427 # the former is then a link to the latter, so we test whether
1428 # $current_partition is actually such a link or not and set
1429 # $current_lvolume accordingly. On Debian you may find more than one answer
1430 # so we remove the one corresponding to /dev/.static
1431 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1432 # principle is the same and we need to find the link to it as well.
1433 # Note that $current_lvolume may well be an
1434 # ordinary device. It is just to make sure that we feed the right value
1435 # into any of the LVM tools if possible.
1436
1437 current_lvolume="$current_partition"
1438 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1439 # .static dir are a Debian specificity
1440 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1441 echo $current_lvolume | grep -q ' '
1442 if [ $? -eq 0 ]; then
1443 echo "WARNING: Multiple Logical Volumes found. Report to dev team" >> $LOGFILE
1444 fi
1445 fi
1446 #
1447 # End of LVM device style variation code (other than $current_lvolume).
1448
1449 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1450 # Size computed via LVM not directly
1451 partition_size="lvm"
1452 else
1453 partition_size=`SizeOfPartition $current_partition`
1454 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1455 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1456 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1457 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1458 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1459 [ "$partition_format" != "swap" ] && partition_format="swap"
1460 if [ "$partition_size" = "" ] ; then
1461 totalsize=0
1462 items=0
1463 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1464 totalsize=$(($totalsize+$i))
1465 items=$(($items+1))
1466 done
1467 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1468 [ "$partition_size" -lt "125000" ] && partition_size=125000
1469 echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1470 fi
1471 fi
1472 fi
1473 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1474 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1475 if [ "$partition_mountpt" = "" ] ; then
1476 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1477 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1478 partition_mountpt="raid"
1479 partition_format="raid"
1480 else
1481 partition_mountpt="lvm"
1482 partition_format="lvm"
1483 fi
1484 fi
1485 fi
1486 psz=$partition_size
1487 echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1488 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1489 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1490 partition_mountpt="image"
1491 old_partition_fmt=$partition_format
1492# partition_format="`$FDISK -l 2>> $LOGFILE | tr -s '\t' ' ' | grep -w "$absolute_partition" | $AWK 'x=$(NF-1}'`"
1493 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1494 echo "------- $FDISK -l log ------------" >> $LOGFILE
1495 cat $FDISKLOG >> $LOGFILE
1496 echo "------- $FDISK log end ------------" >> $LOGFILE
1497 partition_size=$(($partition_size+1)); # just in case
1498 if [ "$partition_format" = "Linux" ] ; then
1499 echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1500 echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1501 partition_format=$old_partition_fmt
1502 fi
1503 fi
1504 if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1505 echo "Excluding $current_partition from mountlist" >> $LOGFILE
1506 continue
1507 fi
1508 if [ ! "$partition_mountpt" ] ; then
1509 for qq in "" `find /dev/ida/c*d* ! -name '*p*'` ; do
1510 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1511 echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1512 cat $FDISKLOG >> $LOGFILE
1513 echo "------- $FDISK log end ------------" >> $LOGFILE
1514 [ "$partition_format" ] && break
1515 done
1516 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1517 partition_format="compaq"
1518 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1519 LogIt "Unable to find mountpoint of $current_partition - ignoring\n"
1520 continue
1521 fi
1522 fi
1523 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1524 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | awk '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1525 unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s\n" $current_partition $partition_mountpt $partition_format $psz`
1526 if [ "$current_partition" = "" ] ; then
1527 echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1528 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1529 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1530 partition_mountpt=raid
1531 partition_format=raid
1532 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1533 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1534 else
1535 echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1536 fi
1537 elif [ "$partition_format" = "" ] ; then
1538 echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1539 elif [ "$partition_size" = "" ] ; then
1540 echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1541 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1542 continue
1543 else
1544 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1545 echo "Stupid bastard..." >> $LOGFILE
1546 partition_format="vfat"
1547 fi
1548 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1549 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1550 fi
1551 done
1552}
1553
1554
1555
1556
1557
1558
1559MakeSureNumberIsInteger() {
1560 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1561 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1562 echo "result = '$res'"
1563 Die "$1 should be an integer"
1564 fi
1565}
1566
1567
1568
1569
1570
1571MakeSyslinuxMessageFile() {
1572 mkdir -p $1
1573 rmdir $1
1574 echo -en " " > $1
1575 if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1576 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
1577 else
1578 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
1579 fi
1580 sed s/%r/"`uname -r`"/ $1.tmp | sed s/%t/"`hostname`"/ > $1
1581 rm -f $1.tmp
1582 if [ "$CDRECOVERY" != "yes" ] ; then
1583 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1584 echo -en "Press <enter> to continue.\n" >> $1
1585 elif [ ! "$MONDO_TMP" ] ; then
1586 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n" >> $1
1587 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1588 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n" >> $1
1589 fi
1590 else
1591 echo -en "$BOOT_MEDIA_MESSAGE" >> $1
1592 fi
1593 else
1594 echo -en " \
1595To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1596CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n" >> $1
1597 fi
1598}
1599
1600
1601
1602
1603MoveHyperlinkSensibly() {
1604 local filename minidir_root resides_on_diskno noof_disks old_diskno d old_pwd
1605 filename=$1
1606 minidir_root=$2
1607 resides_on_diskno=$3
1608 noof_disks=$4
1609
1610 [ -h "$minidir_root/$resides_on_diskno/$filename" ] || Die "$filename isn't a softlink (or doesn't exist): how can I move it sensibly?"
1611
1612 old_diskno=$resides_on_diskno
1613 d=1
1614 while [ "$d" -le "$noof_disks" ] ; do
1615 if [ "$d" -ne "$old_diskno" ] ; then
1616 old_pwd=`pwd`
1617 cd $minidir_root/$old_diskno
1618 cp --parents -Rdf $filename $minidir_root/$d/ || Die "Can't move $filename (sensibly) from $old_diskno to $d"
1619 rm -f $filename
1620 cd $old_pwd
1621 fi
1622# when the softlink is resolvable, our work here is done
1623 [ -e "$minidir_root/$d/$filename" ] && return 0
1624 old_diskno=$d
1625 d=$(($d+1))
1626 done
1627 return 1
1628}
1629
1630
1631
1632OfferToCopyImagesToDisks() {
1633 local imagesdir i imagename dev count boot_dev data_dev
1634 imagesdir=$1
1635 boot_dev=$2
1636 data_dev=$3
1637 echo -en "Would you like to create boot+data floppy disks now (y/n) ?"
1638 read i
1639 [ "$i" != "y" ] && [ "$i" != "Y" ] && return
1640 mount | grep -F /dev/fd > /dev/null && Die "Please unmount your floppies first."
1641 echo "WARNING! THIS WILL ERASE YOUR FLOPPY DISKS."
1642 [ ! -e "$boot_dev" ] && Die "Cannot find $boot_dev - is your Linux distro broken?"
1643 [ ! -e "$data_dev" ] && Die "Cannot find $data_dev - is your Linux distro broken?"
1644 i=`find $imagesdir -type f | grep -F "/mindi-root.1" 2> /dev/null`
1645 j=`find $imagesdir -type f | grep -F "/mindi-boot" | grep -Ev '2880|5760'`
1646# echo "i=$i"
1647# echo "j=$j"
1648 if [ "$i" ] ; then
1649 CopyImageToDisk $j $data_dev "boot disk"
1650 CopyImageToDisk $i $data_dev "root disk"
1651 else
1652 CopyImageToDisk $j $boot_dev "boot/root disk"
1653 fi
1654 count=1
1655 for i in `find $imagesdir | grep -F mindi-data` ; do
1656 CopyImageToDisk $i $data_dev "data disk #$count"
1657 count=$(($count+1))
1658 done
1659}
1660
1661
1662
1663OfferToMakeBootableISO() {
1664 local i old_pwd
1665 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ ! "`DidMondoCallMe`" ] ; then
1666 echo -en "Shall I make a bootable CD image? (y/n) "
1667 read i
1668 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1669 fi
1670 if [ ! "$MONDO_TMP" ] ; then
1671 LogIt "NB: Mindi's bootable CD always uses isolinux.\n"
1672 LogIt "For a bootable CD w/LILO, please use Mondo.\n"
1673 fi
1674 rm -Rf $TMP_ROOT/iso
1675 mkdir -p $TMP_ROOT/iso/{images,archives,isolinux}
1676 cp -f $1/*.img $1/*.gz $TMP_ROOT/iso/images || LogIt "OfferToMakeBootableISO: Cannot copy $i to $TMP_ROOT/iso/images\n"
1677 old_pwd=`pwd`
1678 cd $TMP_ROOT/iso
1679 mkdir -p $MONDO_ROOT/iso/isolinux
1680 echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1681 cp $MINDI_LIB/mem{test,disk}* $MONDO_ROOT 2>> $LOGFILE
1682 for i in memdisk memtest.bin memtest.img ; do
1683 j=$MINDI_LIB/$i
1684 k=$TMP_ROOT/iso/isolinux
1685 if [ -e "$j" ] ; then
1686 LogIt "Copying $j to $k\n"
1687 cp -f $j $k || Die "Failed to copy $j to $k"
1688 cp -f $j $TMP_ROOT || Die "Failed to copy $j to $k"
1689 fi
1690 done
1691 MakeSyslinuxMessageFile $TMP_ROOT/iso/isolinux/message.txt
1692 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?"
1693 cp $TMP_ROOT/mindi.rdz $TMP_ROOT/iso/isolinux/initrd.img
1694 cp $TMP_ROOT/mindi.rdz $imagesdir/initrd.img
1695 [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
1696 cd $TMP_ROOT/iso/isolinux
1697 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?"
1698 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1699 mv isolinux.cfg isolinux.cfg.old
1700 sed s/interactive/iso/ isolinux.cfg.old > isolinux.cfg
1701 fi
1702 if [ "$ARCH" != "ia64" ] ; then
1703 cp $ISOLINUX isolinux.bin || Die "Cannot copy isolinux.bin ($ISOLINUX) to tmp_root - did you run out of disk space?"
1704 cp $ISOLINUX ../
1705 fi
1706 cd $TMP_ROOT/iso
1707 if [ "$ARCH" != "ia64" ] ; then
1708 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?"
1709 fi
1710 [ "$MONDO_SHARE" ] && cp -f $MONDO_SHARE/autorun .
1711 if [ -d "/home/MondoCD" ] ; then
1712 cp -pRdu /home/MondoCD/* .
1713 fi
1714 if [ "$ARCH" != "ia64" ] ; then
1715 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
1716 else
1717 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
1718 fi
1719 if [ "$?" -ne "0" ] ; then
1720 echo "----------- mkisofs's errors --------------" >> $LOGFILE
1721 cat /tmp/$$.mk >> $LOGFILE
1722 echo "mkisofs returned the following errors:-"
1723 cat /tmp/$$.mk
1724 LogIt "Failed to create ISO image.\n"
1725 else
1726 echo "Created bootable ISO image at $imagesdir/mindi.iso" >> $LOGFILE
1727 fi
1728 rm -f /tmp/$$.mk
1729 cd $old_pwd
1730}
1731
1732
1733
1734PluralOrNot() {
1735 [ "$1" -gt "1" ] && echo -en "s"
1736}
1737
1738
1739
1740
1741MakeMessageFile() {
1742 local disksize
1743 disksize=$1
1744 if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1745 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`"/
1746 else
1747 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`/
1748 fi
1749 if [ "$disksize" -gt "2880" ] ; then
1750 if [ "`DidMondoCallMe`" ] ; then
1751 if [ "$CDRECOVERY" != "yes" ] ; then
1752 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1753 echo -en "Press <enter> to continue.\n"
1754 elif [ ! "$MONDO_TMP" ] ; then
1755 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1756 else
1757 echo -en "$BOOT_MEDIA_MESSAGE"
1758 fi
1759 fi
1760 fi
1761 fi
1762 if [ "$CDRECOVERY" = "yes" ] ; then
1763 echo -en "\
1764To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1765CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1766 fi
1767 echo -en "\n\n\n"
1768}
1769
1770
1771
1772
1773write_full_floppy_of_kernel() {
1774 local mtpt image old_pwd res disksize
1775
1776 res=0
1777 old_pwd=`pwd`
1778 KERN_DISK_MADE=1
1779 disksize=$3
1780 rand1=$RANDOM
1781 rand2=$RANDOM
1782 image=/tmp/$rand1.$rand2.img
1783 mtpt=/tmp/$rand1.$rand2.mtpt
1784 dd if=/dev/zero of=$image bs=1k count=$disksize
1785 mke2fs -N 26 -F $image > /dev/null
1786 mkdir -p $mtpt
1787 mount -o loop $image $mtpt
1788 cd $mtpt
1789 mkdir -p {dev,tmp,boot}
1790 cp -f $1 vmlinuz
1791 if [ "$?" -ne "0" ] ; then
1792 LogIt "Failed to copy $1 to ramdisk\n"
1793 cd $old_pwd
1794 umount $mtpt
1795 rmdir $mtpt
1796 rm $image
1797 return 1
1798 fi
1799
1800 rdev vmlinuz 2,0
1801 rdev -R vmlinuz 0
1802 rdev -r vmlinuz 49152
1803
1804 tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1805 losetup /dev/loop0 > /dev/null 2> /dev/null
1806 [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1807 CopyBootBFile $mtpt/boot.b
1808
1809# echo "root=/dev/loop0" > bdlilo.conf
1810 MakeLiloConfFile $disksize >> bdlilo.conf
1811
1812# cat bdlilo.conf > /tmp/bdlilo.conf
1813
1814# cat /home/mondostuff/bdlc > bdlilo.conf
1815
1816 chmod 644 bdlilo.conf
1817 MakeMessageFile $disksize > message
1818 lilo -v -C bdlilo.conf -r $mtpt
1819 res=$?
1820
1821#echo "lilo -v -C bdlilo.conf -r $mtpt"
1822#echo -en "Press enter"; read line
1823
1824 cd $old_pwd
1825 umount $mtpt
1826 mv -f $image $2
1827 rmdir $mtpt
1828
1829 return $res
1830
1831# --- the kernel-only method NO LONGER WORKS. Not since Apr 2002.
1832# It should work, according to the Boot Disk HOWTO, but it doesn't.
1833# It works for my failsafe kernel & for RH7.2 but not RH7.3, 8.0, etc.
1834# -Hugo, Apr 19th 2004
1835# dd if=$1 of=$2 bs=1k &> /dev/null || Die "Cannot dd blank file"
1836# dd if=/dev/zero bs=1k count=$3 >> $2 2> /dev/null || Die "Cannot dd blank file"
1837# mv -f $2 $2.old
1838# dd if=$2.old bs=1k count=$3 of=$2 &> /dev/null || Die "Cannot dd blank file"
1839# rm -f $2.old
1840# if [ "$3" = "1440" ] ; then
1841# rdev $2 "/dev/fd0H"$3
1842# else
1843# rdev $2 "/dev/fd0u"$3
1844# fi
1845# rdev -R $2 0
1846# rdev -r $2 49152
1847}
1848
1849
1850
1851
1852
1853
1854MakeLiloConfFile() {
1855 local disksize options i ooo
1856 disksize=$1
1857 options=""
1858 if [ "$ARCH" != "ia64" ] ; then
1859 echo -en "boot=/dev/loop0\ndisk=/dev/loop0\n"
1860 fi
1861 if [ "$disksize" -eq "2880" ] ; then
1862 echo -en "bios=0x00\nsectors=36\nheads=2\ncylinders=80\n"
1863 elif [ "$disksize" -eq "1722" ] ; then
1864 echo -en "bios=0x00\nsectors=21\nheads=2\ncylinders=82\n"
1865 elif [ "$disksize" -gt "2880" ] ; then
1866 /bin/true
1867 else
1868 echo -en "bios=0x00\nsectors=18\nheads=2\ncylinders=80\n"
1869 fi
1870 if [ "$ARCH" != "ia64" ] ; then
1871 echo -en "install=/boot.b\nmap=/boot.map\n"
1872 fi
1873 if [ "$CDRECOVERY" = "yes" ] ; then
1874 echo -en "default=RESTORE\n"
1875 elif [ "$disksize" -gt "2880" ] && [ "`DidMondoCallMe`" ] ; then
1876 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1877 echo -en "default=iso\n"
1878 else
1879 echo -en "default=interactive\n"
1880 fi
1881 else
1882 echo -en "default=expert\n"
1883 fi
1884
1885 echo -en "prompt\n"
1886 if [ "$ARCH" != "ia64" ] ; then
1887 echo -en "vga=normal\nbackup=/dev/null\nmessage=/message\n"
1888 fi
1889 if [ "$CDRECOVERY" != "yes" ] ; then
1890 echo -en "timeout=300\n"
1891 fi
1892 echo -en "\n"
1893 if [ "$CDRECOVERY" = "yes" ] ; then
1894 options="RESTORE expert"
1895 elif [ "$disksize" -gt "2880" ] ; then
1896 if [ "`DidMondoCallMe`" ] ; then
1897 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1898 options="iso"
1899 else
1900 options="interactive expert compare iso nuke isonuke"
1901# hda hdb hdc hdd"
1902 fi
1903 else
1904 options="expert"
1905 fi
1906 else
1907 options="expert"
1908 fi
1909 for i in $options ; do
1910 ooo=$i
1911 [ "$ooo" = "RESTORE" ] && ooo="nuke"
1912 if [ "$ARCH" = "ia64" ] ; then
1913 rootpart="root=/dev/ram0\n\t"
1914 else
1915 rootpart=""
1916 fi
1917 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"
1918
1919 outstr=$outstr" $ooo_mode"
1920 outstr=$outstr"\"\n"
1921 if [ "$disksize" = "1440" ] ; then
1922 echo -en "$outstr" | sed s/initrd=.*// | grep -v root=
1923 else
1924 echo -en "$outstr"
1925 fi
1926 done
1927}
1928
1929
1930
1931
1932PrepareBootDiskImage_LILO() {
1933 local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1934 imagesdir=$1
1935 disksize=$2
1936 kernelpath=$3
1937 ramdisksize=$4
1938
1939 retval=0
1940 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1941 echo -en "Making "$disksize"KB boot disk..."
1942 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?"
1943 if [ "$ARCH" != "ia64" ] ; then
1944 [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
1945 fi
1946 echo -en "..."
1947 imagefile=$imagesdir/mindi-bootroot.$disksize.img
1948 mountpoint=$TMP_ROOT/mountpoint.$$
1949 mkdir -p $mountpoint
1950 dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
1951 if [ "$ARCH" = "ia64" ] ; then
1952 mkdosfs $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1953 t=vfat
1954 else
1955 mke2fs -N 26 -m 0 -F $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1956 t=ext2
1957 fi
1958 [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
1959 rm -f /tmp/mke2fs.$$
1960 mount -t $t -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
1961# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1962 mkdir -p $mountpoint/etc
1963 if [ "$ARCH" != "ia64" ] ; then
1964 liloconf=$mountpoint/etc/lilo.conf
1965 else
1966 liloconf=$mountpoint/elilo.conf
1967 fi
1968 old_pwd=`pwd`
1969 cd $mountpoint
1970 if [ "$ARCH" != "ia64" ] ; then
1971 tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1972 fi
1973 cd $old_pwd
1974 losetup /dev/loop0 > /dev/null 2> /dev/null
1975 [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1976 CopyBootBFile $mountpoint/boot.b
1977
1978 MakeLiloConfFile $disksize > $liloconf
1979
1980 echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint..." >> $LOGFILE
1981 cp -f $TMP_ROOT/mindi.rdz $mountpoint 2>> $LOGFILE
1982 if [ "$?" -ne "0" ] ; then
1983 LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
1984 cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
1985 LogIt "Please unload some of your modules and try again.\n"
1986 rm -f $TMP_ROOT/mtpt.$$
1987 LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
1988 retval=$(($retval+1))
1989 fi
1990 MakeMessageFile $disksize > $mountpoint/message
1991
1992 mkdir -p $mountpoint/tmp
1993 cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
1994 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1995 echo -en "image=/memtest.bin\nlabel=memtest\nn" >> $liloconf
1996 echo -en "image=/memdisk\nlabel=memtest\nappend=\"initrd=memtest.img\"\n" >> $liloconf
1997# echo "Yep, this is a multi-function CD" > $mountpoint/MULTIFUNC
1998 fi
1999 if [ -d "/home/MondoCD" ] ; then
2000 cp -pRdu /home/MondoCD/* . || Die "Cannot do kung pow"
2001 fi
2002
2003# copy the kernel across
2004 rm -Rf $mountpoint/lost+found
2005 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2006 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2007 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2> /dev/null
2008 if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2009 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2010 du -sk $mountpoint/* >> $LOGFILE
2011 echo "--- end of list of files ---" >> $LOGFILE
2012 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2013Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2014 rm -f $mountpoint/vmlinuz
2015 cd $old_pwd
2016 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2017 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2018# losetup /dev/loop0 -d
2019 res=0
2020 write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2021 res=$(($res+$?))
2022 cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
2023 res=$(($res+$?))
2024 rm -f $imagefile
2025 if [ "$res" -ne "0" ]; then
2026 LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2027 rm -f $imagesdir/mindi-*.1440.img
2028 fi
2029 return $res
2030 fi
2031 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2032 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2033 echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2034 echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2035# make it bootable
2036 rm -f $mountpoint/zero
2037 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2038 if [ "$disksize" -gt "2880" ] && [ ! "$KERN_DISK_MADE" ] ; then
2039 if [ "$ARCH" != "ia64" ] ; then
2040 $LILO_EXE $LILO_OPTIONS -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2041 else
2042 /bin/true
2043 fi
2044 elif [ ! "$KERN_DISK_MADE" ] ; then
2045# 12/28/2001 - if 1.72MB floppy then don't use LILO's optimizations at all
2046 $LILO_EXE -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2047 else
2048 echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
2049 fi
2050 if [ $? -ne "0" ] ; then
2051 if [ "`grep -F "/tmp/dev.0" $LOGFILE`" ] ; then
2052 LogIt "The '/tmp/dev.0' error is NOT Mindi's fault. It is LILO's.\n"
2053 LogIt "Please reboot your PC as a workaround.\n"
2054 Die "LILO sneezed and Mindi caught a cold. Please read the README / FAQ.\n"
2055 fi
2056 echo "$LILO_EXE -r $mountpoint ...failed."
2057 echo -en "Press ENTER to continue."; read line
2058 LogIt "Cannot run lilo on $mountpoint\nPlease upgrade/downgrade your version of LILO. It has a bug.\n"
2059 retval=$(($retval+1))
2060 fi
2061 cp -f $liloconf /tmp/lilo.conf
2062 if [ "$ARCH" = "ia64" ] ; then
2063 cp `dirname $kernelpath`/*.efi $mountpoint
2064 fi
2065 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2066 echo -en "..."
2067 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2068 if [ "$retval" -eq "0" ] ; then
2069 echo -en "...$DONE\r"
2070 if [ "$KERN_DISK_MADE" ] ; then
2071 LogIt "... $disksize KB boot disks were created OK\r"
2072 fi
2073 else
2074 echo -en "...failed\r"
2075 LogIt $disksize"KB boot disk was NOT created\r"
2076 rm -f $imagefile
2077 fi
2078 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2079 return $retval
2080}
2081
2082
2083
2084
2085PrepareBootDiskImage_SYSLINUX() {
2086 local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
2087 imagesdir=$1
2088 disksize=$2
2089 kernelpath=$3
2090 ramdisksize=$4
2091 do_boot_root_thingy=""
2092 local retval old_pwd
2093 retval=0
2094 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
2095 echo -en "Making "$disksize"KB boot disk..."
2096 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?"
2097 [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
2098 echo -en "..."
2099 imagefile=$imagesdir/mindi-bootroot.$disksize.img
2100 mountpoint=$TMP_ROOT/mountpoint.$$
2101 mkdir -p $mountpoint
2102# If I format a 1722KB data file & run syslinux on it, the resultant image
2103# won't boot. So, I have formatted a floppy, called syslinux on/to it, and
2104# used 'dd' to copy it to sys-disk.raw (zipped to sys-disk.raw.gz).
2105# If I extract it, mount it, copy my files to it, etc. then the resultant
2106# image _is_ bootable. I don't know why syslinux and/or mkfs.vfat won't
2107# play nicely and I don't care. :) I have worked around the problem. -Hugo, 06/27/2002
2108 if [ "$disksize" = "1722" ] ; then
2109 gzip -dc $MINDI_LIB/sys-disk.raw.gz > $imagefile || Die "Cannot dd blank file"
2110 else
2111 dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
2112 mkfs.vfat $imagefile
2113 syslinux $imagefile
2114 fi
2115 mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
2116# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
2117 old_pwd=`pwd`
2118 MakeSyslinuxMessageFile $mountpoint/message.txt
2119 cd $mountpoint
2120 [ -e "$sys_cfg_file" ] || Die "Obi Wan, word up?"
2121# tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n" <--- present for LILO; is it nec. for SYSLINUX too?
2122 cat $sys_cfg_file | HackSyslinuxFile $ramdisk_size $mountpoint > syslinux.cfg || Die "Cannot copy syslinux.cfg from mindi_home to tmp_root"
2123 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
2124 mv syslinux.cfg syslinux.cfg.orig
2125 sed s/interactive/iso/ syslinux.cfg.orig > syslinux.cfg
2126 fi
2127 cd $old_pwd
2128 echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint/initrd.img..." >> $LOGFILE
2129 cp -f $TMP_ROOT/mindi.rdz $mountpoint/initrd.img 2>> $LOGFILE
2130 if [ "$?" -ne "0" ] ; then
2131 LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
2132 cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
2133 LogIt "Please unload some of your modules and try again.\n"
2134 rm -f $TMP_ROOT/mtpt.$$
2135 LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
2136 retval=$(($retval+1))
2137 fi
2138
2139 mkdir -p $mountpoint/tmp
2140 cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
2141
2142# copy the kernel across
2143 rm -Rf $mountpoint/lost+found
2144 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2145 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2146 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
2147 if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2148 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2149 du -sk $mountpoint/* >> $LOGFILE
2150 echo "--- end of list of files ---" >> $LOGFILE
2151 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2152Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2153 rm -f $mountpoint/vmlinuz
2154 cd $old_pwd
2155 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2156 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2157# losetup /dev/loop0 -d
2158
2159 res=0
2160 write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2161 res=$(($res+$?))
2162 cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
2163 res=$(($res+$?))
2164 rm -f $imagefile
2165 if [ "$res" -ne "0" ]; then
2166 LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2167 rm -f $imagesdir/mindi-*.1440.img
2168 fi
2169 return $res
2170 fi
2171 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2172 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2173 echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2174 echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2175# make it bootable
2176 rm -f $mountpoint/zero
2177 mkdir -p $mountpoint/etc
2178 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2179 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2180 echo -en "..."
2181 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2182
2183 if [ "$retval" -eq "0" ] ; then
2184 echo -en "...$DONE\r"
2185 if [ "$KERN_DISK_MADE" ] ; then
2186 rm -f $imagefile
2187 LogIt "... $disksize KB boot disks were created OK\r"
2188 fi
2189 else
2190 echo -en "...failed\r"
2191 LogIt $disksize"KB boot disk was NOT created\r"
2192 rm -f $imagefile
2193 fi
2194 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2195 return $retval
2196}
2197
2198
2199
2200
2201PrepareDataDiskImages() {
2202 local needlist bigdir minidir_root tardir diskdir imagesdir res i j k old_pwd lines
2203
2204 imagesdir=$1
2205 rm -f $imagesdir/mindi-*.img $imagesdir/[0-9]*.tar.gz $imagesdir/mindi.iso
2206 needlist=$TMP_ROOT/what-we-need.txt
2207 bigdir=$TMP_ROOT/bigdir
2208 minidir_root=$TMP_ROOT/minidir
2209 mkdir -p $minidir_root
2210 mkdir -p $bigdir/usr/bin
2211 tardir=$TMP_ROOT/tardir
2212
2213 lines=`grep -vx " *#.*" $MINDI_CONF/deplist.txt | grep -vx "" | wc -l`
2214 cat $MINDI_CONF/deplist.txt | GenerateGiantDependencyList $needlist $lines
2215 res=$?
2216 if [ "$YOUR_KERNEL_SUCKS" ]; then
2217 pwd=`pwd`
2218 cd $TMP_ROOT
2219 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2220 cp --parents -pRdf ./$i $bigdir || Die "PDDI can't cp $i->$bigdir"
2221 if [ "`du -sk $i | cut -f1`" -lt "$(($CHOPSIZE*2))" ] ; then
2222 cp --parents -pRdf $i $bigdir
2223 else
2224 ChopUpAndCopyFile $i $bigdir $CHOPSIZE $BIGNO
2225 BIGNO=$(($BIGNO+1))
2226 fi
2227 done
2228 for i in $EXTRA_MODS ; do
2229 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o 2> /dev/null`
2230 [ ! "$j" ] && echo "Warning - cannot find failsafe module $i.o" >> $LOGFILE
2231 for k in $j ; do
2232 if [ "`du -sk $k | cut -f1`" -lt "$CHOPSIZE" ] ; then
2233 cp --parents -pRdf $k $bigdir
2234 else
2235 ChopUpAndCopyFile $k $bigdir $CHOPSIZE $BIGNO
2236 BIGNO=$(($BIGNO+1))
2237 fi
2238 echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2239 done
2240 done
2241 cd $pwd
2242 else
2243 ListKernelModulePaths >> $needlist
2244 fi
2245 if [ "$res" -ne "0" ] ; then
2246 Die "You have $res file`PluralOrNot $res` present in dependency list\nbut absent from filesystem."
2247 fi
2248 FindAndAddUserKeyboardMappingFile
2249 mkdir -p $bigdir/tmp
2250 if [ "`DidMondoCallMe`" ] ; then
2251 MakeMondoConfigFile $TMP_ROOT/mondo-restore.cfg
2252 cp -f $TMP_ROOT/mondo-restore.cfg $bigdir/tmp &> /dev/null
2253 cp -f $TMP_ROOT/mondo-restore.cfg $CACHE_LOC &> /dev/null
2254 fi
2255 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2256 DropOptimizedLibraries $needlist $bigdir
2257 echo -en "Assembling dependency files"
2258 CopyDependenciesToDirectory < $needlist $bigdir
2259
2260# also copy io.sys and msdos.sys, if we can find them
2261 for i in `mount | cut -d' ' -f3` ; do
2262 for j in io.sys msdos.sys ; do
2263 [ -e "$i/$j" ] && cp -f $i/$j $bigdir
2264 done
2265 done
2266
2267# master boot record, too
2268 i=`cat $MONDO_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2269 if [ "$i" ] ; then
2270 LogIt "Backing up $i's MBR\n"
2271 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2272# < < E O F
2273 sleep 1
2274 sync
2275# [ "$?" -ne "0" ] && echo "Failed to save $i's MBR to bigdir" >> $LOGFILE
2276 j=$i
2277 [ -h "$j" ] && j=`ResolveSoftlink $j`
2278 LogIt "Creating /dev/boot_device ($j)\n"
2279 mkdir -p $bigdir/dev
2280 cp -pRdf $j $bigdir/dev/boot_device || Die "Unable to create /dev/boot_device on ramdisk"
2281 fi
2282
2283# more stuff
2284# cp -f $MINDI_LIB/embleer* $bigdir
2285 old_pwd=`pwd`
2286 cd $bigdir
2287
2288 [ -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'."
2289 cp -Rdf $MINDI_LIB/aux-tools/* . 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping aux-tools\n"
2290 if [ -e "$MINDI_LIB/x11-tools.tgz" ] ; then
2291 tar -zxf $MINDI_LIB/x11-tools.tgz 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping x11-tools.tgz\n"
2292 fi
2293 if [ -e "$MONDO_SHARE/restore-scripts" ] ; then
2294 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2295 [ "$?" -ne "0" ] && [ "`DidMondoCallMe`" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2296 fi
2297 [ -d "/lib/dev-state" ] && cp --parents -pRdf /lib/dev-state .
2298 cd $old_pwd
2299 echo -e "$DONE"
2300 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2301 SplitDirectoryIntoMinidirs $bigdir $minidir_root
2302 noof_disks=$?
2303 [ "$noof_disks" -eq "0" ] && Die "Too much stuff!"
2304# if [ "$noof_disks" -ge "8" ] ; then
2305# LogIt "You are putting a ludicrously large amount of data on these disks."
2306# LogIt "I shall therefore double EXTRA_SPACE, just in case your ramdisk is too small."
2307# EXTRA_SPACE=$(($EXTRA_SPACE*2))
2308# fi
2309 MakeMountlist $TMP_ROOT/mountlist.txt
2310 mkdir -p $minidir_root/$noof_disks/tmp
2311 cp -f $TMP_ROOT/mountlist.txt $minidir_root/$noof_disks/tmp/mountlist.txt || Die "Cannot copy mountlist.txt from $TMP_ROOT to data disk"
2312 cp -f $TMP_ROOT/mountlist.txt $CACHE_LOC
2313 [ "`DidMondoCallMe`" ] && cp -f $minidir_root/$noof_disks/tmp/mountlist.txt $MONDO_TMP/.
2314 [ $LVM != "false" ] && $MINDI_LIB/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
2315 cat $minidir_root/$noof_disks/tmp/mountlist.txt >> $LOGFILE
2316 ZipMinidirsIntoTarballs $minidir_root $tardir $noof_disks
2317 CreateDataDiskImagesFromTarballs $tardir $imagesdir $noof_disks
2318 FRIENDLY_OUTSTRING="Boot and data disk images were created."
2319# One 1.72MB boot disk, one 2.88MB boot disk and $noof_disks data disk images
2320 rmdir $tardir $bigdir
2321 rm -f $needlist
2322 return $noof_disks
2323}
2324
2325
2326ProcessLDD() {
2327 local main_fname incoming j i fname f newf
2328 main_fname=$1
2329 read incoming
2330 while [ "$incoming" != "" ] ; do
2331 # We take the full path name of the dyn. lib. we want
2332 incoming=`echo "$incoming" | sed '/[[:blank:]]*.*[[:blank:]]*=>[[:blank:]]*(.*/d ; s/[[:blank:]]*.*[[:blank:]]*=>[[:blank:]]*\(\/.*\)/\1/ ; s/[[:blank:]]*\(\/.*\)[[:blank:]]*(.*/\1/'`
2333 for f in `echo "$incoming"` ; do
2334 echo "$f"
2335 if [ -h "$f" ]; then
2336 g=`readlink $f`
2337 if [ -e "$g" ]; then
2338 echo "$g"
2339 else
2340 if [ "`echo $g | cut -c1`" != "/" ] ; then
2341 # that link is in the same dir
2342 g="`dirname $f`/$g"
2343 if -e "$g" ]; then
2344 echo "$g"
2345 else
2346 echo "Problem with ldd on $f" >> $LOGFILE
2347 fi
2348 else
2349 echo "Problem with ldd on $f" >> $LOGFILE
2350 fi
2351 fi
2352 else
2353 if [ ! -e "$f" ]; then
2354 echo "Problem with ldd on $f" >> $LOGFILE
2355 fi
2356 fi
2357 done
2358 read incoming
2359 done
2360}
2361
2362
2363
2364Prompt() {
2365 echo -en "$1"
2366 read line
2367}
2368
2369
2370
2371ReadLine() {
2372 local i incoming
2373 read incoming
2374 i=0
2375 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2376 i=$(($i+1))
2377 read incoming
2378 done
2379 echo "$incoming"
2380}
2381
2382
2383
2384RejigHyperlinks() {
2385 local minidir_root noof_disks fname path diskno old_pwd awk_loc gawk_loc dir i
2386 minidir_root=$1
2387 noof_disks=$2
2388
2389 old_pwd=`pwd`
2390 diskno=1
2391 while [ "$diskno" -le "$noof_disks" ] ; do
2392 mkdir -p $minidir_root/$diskno
2393 cd $minidir_root/$diskno
2394 for fname in `find -type d -o -print` ; do
2395 [ -h "$minidir_root/$diskno/$fname" ] && MoveHyperlinkSensibly $fname $minidir_root $diskno $noof_disks
2396 done
2397 diskno=$(($diskno+1))
2398 done
2399
2400
2401 cd $old_pwd
2402 return
2403
2404
2405
2406# do some awk/gawk stuff
2407 cd $minidir_root
2408 awk_loc=`find -name awk`
2409 gawk_loc=`find -name gawk`
2410 if [ "$awk_loc" = "" ] && [ "$gawk_loc" != "" ] ; then
2411 for i in $gawk_loc ; do HackAwk $i gawk ; done
2412 elif [ "$gawk_loc" = "" ] && [ "$awk_loc" != "" ] ; then
2413 for i in $awk_loc ; do HackAwk $i awk ; done
2414 elif [ "$gawk_loc" != "" ] && [ "$awk_loc" != "" ] ; then
2415 echo -en "Gawk/awk found. Good.\r"
2416 else
2417 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? :-)"
2418 fi
2419 cd $old_pwd
2420}
2421
2422
2423ReplaceIndividualLine() {
2424 local orig_file new_file lino newstring lines_total lines_remaining
2425 orig_file=$1.orig
2426 mv -f $1 $orig_file || Die "Cannot move $1 to $orig_file"
2427 new_file=$1
2428 lino=$2
2429 newstring="$3"
2430 if [ "$lino" = "" ] || [ "$lino" -lt "1" ] ; then
2431 echo "Can't find string" >> $LOGFILE
2432 return 1
2433 fi
2434 lines_total=`wc -l $orig_file | gawk '{print $1;}'`
2435 lines_remaining=$(($lines_total-$lino))
2436 head -n$(($lino-1)) $orig_file > $new_file
2437 echo "$newstring" >> $new_file
2438 echo "# The above line was added by Mindi, at the user's instruction" >> $new_file
2439 tail -n$lines_remaining $orig_file >> $new_file
2440 echo "Replace line $lino of $new_file with user-specified line, '$newstring'" >> $LOGFILE
2441# cp -f $new_file /tmp/init.new
2442 [ -x "$orig_file" ] && chmod +x $new_file
2443 rm -f $orig_file
2444 return 0
2445}
2446
2447
2448
2449
2450ResolveSoftlink() {
2451 local resolved new
2452 resolved=$1
2453 while [ -h "$resolved" ] ; do
2454 resolved=`readlink -f $resolved`
2455 done
2456 echo "$resolved"
2457}
2458
2459
2460
2461
2462ScanCDandTape() {
2463 local i
2464
2465 for i in /dev/st0 /dev/ht0 /dev/cdrom /dev/cdrom0 /dev/cdrom 1 ; do
2466 dd if=$i of=/dev/null bs=64k count=1 &> /dev/null
2467 done
2468}
2469
2470
2471
2472SizeOfPartition() {
2473 local devpath drive res stub
2474 device=$1
2475 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2476 res=`SizeOfRaidPartition $device`
2477 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2478 echo "$res"
2479 return 0
2480 fi
2481# 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/-//`
2482# patch from Bill <bill@iwizard.biz> - 2003/08/25
2483 res=`$FDISK -s $device`
2484 echo "------- $FDISK -l $device log ------------" >> $LOGFILE
2485 cat $FDISKLOG >> $LOGFILE
2486 echo "------- $FDISK log end ------------" >> $LOGFILE
2487# end patch
2488 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2489 [ "$res" = "" ] && res="-1"
2490 echo $res
2491 return 0
2492}
2493
2494
2495SizeOfRaidPartition() {
2496 local real_dev smallest_size silly tmp
2497
2498 silly=999999999
2499 smallest_size=$silly
2500
2501 for real_dev in `GetRaidDevMembers $1` ; do
2502 tmp=`SizeOfPartition $real_dev`
2503 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2504 done
2505
2506 if [ "$smallest_size" = "$silly" ] ; then
2507 echo "-1"
2508 return 1
2509 else
2510 echo "$smallest_size"
2511 return 0
2512 fi
2513}
2514
2515
2516
2517
2518
2519
2520StripComments()
2521{
2522 local tempfile
2523 tempfile=$TMP_ROOT/$$.strip.txt
2524 cp -f $1 $tempfile
2525 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2526 rm -f $tempfile
2527 echo "Stripped comments from $2" >> $LOGFILE
2528}
2529
2530
2531
2532
2533
2534
2535SplitDirectoryIntoMinidirs() {
2536 local bigdir minidir_root i noof_disks old_pwd res
2537 bigdir=$1
2538 minidir_root=$2
2539 rm -Rf $minidir_root/*
2540
2541 TryToFitDataIntoSeveralDirs $bigdir $minidir_root
2542 noof_disks=$?
2543 if [ "$noof_disks" -eq "0" ] ; then
2544 echo "Failed to fit data into several dirs."
2545 return 0
2546 fi
2547 RejigHyperlinks $minidir_root $noof_disks
2548 rm -Rf $bigdir/*
2549 return $noof_disks
2550}
2551
2552
2553
2554StripExecutable()
2555{
2556 local tmpfile
2557 tmpfile=$TMP_ROOT/stripped.$$.dat
2558 [ -d "$1" ] || [ -h "$1" ] && return
2559 cp -f $1 $tmpfile
2560 strip $tmpfile 2> /dev/null
2561 if [ "$?" -eq "0" ] ; then
2562 cp -f $tmpfile $1
2563 echo "Stripped binary $2" >> $LOGFILE
2564 fi
2565 rm -f $tmpfile
2566}
2567
2568
2569TemporarilyCompressAllFiles() {
2570 local i orig_fname out_fname out_list
2571
2572 i=0
2573 out_list=$2/compressed/compressed.txt
2574 mkdir -p $2/compressed
2575 > $out_list
2576 for orig_fname in $1 ; do
2577 out_fname=$2/compressed/$orig_fname.gz
2578 mkdir -p $out_fname 2> /dev/null
2579 rmdir $out_fname 2> /dev/null
2580 gzip -c6 $orig_fname > $out_fname 2> /dev/null
2581 i=$(((($i+1))%15))
2582 [ "$i" -eq "0" ] && echo -en "."
2583 du -sk $out_fname >> $out_list
2584 done
2585}
2586
2587
2588
2589TryToFindKernelPath() {
2590 local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2591 we_want_version=`uname -r`
2592 possible_kernels=""
2593 duff_kernels=""
2594
2595 if [ "$ARCH" = "ia64" ] ; then
2596 root="/boot/efi/efi"
2597 else
2598 root="/"
2599 fi
2600 for fname in `find $root -maxdepth 2 -type f | grep -F lin | grep -Ev '^/proc/|^/net/'` ; do
2601 [ ! -e "$fname" ] && continue
2602 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2603 file $fname | grep -q gzip
2604 if [ "$?" -eq "0" ] ; then
2605 # Used by ia64
2606 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2607 else
2608 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2609 fi
2610 [ "$fkern_ver" = "" ] && continue
2611# echo "$fname --> $fkern_ver (but we want $we_want_version)" >> /dev/stderr
2612 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2613 [ -f "$fname" ] || continue
2614 [ -h "$fname" ] && continue
2615 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2616 file $fname | grep -q gzip
2617 if [ "$?" -eq "0" ] ; then
2618 # Used by ia64
2619 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2620 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it...\n"
2621 duff_kernels="$fname $duff_kernels"
2622 else
2623 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2624 possible_kernels="$fname $possible_kernels"
2625 fi
2626 else
2627 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2628 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it...\n"
2629 duff_kernels="$fname $duff_kernels"
2630 else
2631 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2632 possible_kernels="$fname $possible_kernels"
2633 fi
2634 fi
2635 done
2636 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2637 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2638 fi
2639 if [ ! "$possible_kernels" ] ; then
2640 LogIt "No kernel matches exactly. Are there any duff kernels?\n"
2641 possible_kernels="$duff_kernels"
2642 if [ ! "$possible_kernels" ] ; then
2643 LogIt "Sorry, no duff kernels either\n"
2644 else
2645 LogIt "I bet you're running Debian or Gentoo, aren't you?\n"
2646 LogIt "Your kernel doesn't have a sane builddate. Oh well...\n"
2647 fi
2648 fi
2649 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2650 noof_kernels=`CountItemsIn "$possible_kernels"`
2651 if [ "$noof_kernels" -eq "0" ] ; then
2652 LogIt "Could not find your kernel.\n"
2653 if [ -e "/boot/vmlinuz" ] ; then
2654 LogIt "Using /boot/vmlinuz as a last resort.\n"
2655 output=/boot/vmlinuz
2656 else
2657 output=""
2658 fi
2659 elif [ "$noof_kernels" -eq "1" ] ; then
2660 kernelpath=`echo "$possible_kernels" | sed s/' '//`
2661 echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2662 output="$kernelpath"
2663 else
2664 for i in $possible_kernels ; do
2665 if echo $i | grep "`uname -r`" ; then
2666 LogIt "OK, I used my initiative and found that "
2667 LogIt "$i is probably your kernel.\n "
2668 output="$i"
2669 return
2670 fi
2671 done
2672 if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2673 output=/boot/vmlinuz
2674 echo "Schlomo, this one's for you." >> $LOGFILE
2675 else
2676 LogIt "Two or more possible kernels found. You may specify any one of them and the \n"
2677 LogIt "boot disks will still work, probably. If one does not work, try another.\n"
2678 LogIt "$possible_kernels\n"
2679 echo ""
2680 fi
2681 fi
2682 echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2683}
2684
2685
2686
2687
2688
2689TryToFitDataIntoSeveralDirs() {
2690 local bigdir minidir_root noof_disks diskno list_of_files filename old_pwd progress
2691 local i retval noof_disks total_files list_of_devs
2692 bigdir=$1
2693 minidir_root=$2
2694 BIG_CLUNKY_SIZE_COUNTER=0
2695 retval=0
2696 noof_disks=1
2697
2698 echo -en "\r \rDividing data into several groups..."
2699 old_pwd=`pwd`
2700 cd $bigdir
2701 list_of_files=`GetFileSizeList . | sort -nr | cut -f2 | grep -Fv "/dev/"`
2702 progress=0
2703 total_files=`CountItemsIn "$list_of_files"`
2704 if [ "`echo "$filename" | grep -x "/dev/.*"`" ] ; then
2705 filesize=1
2706 fi
2707 mkdir -p $minidir_root/$noof_disks
2708 if [ -e "dev" ] ; then
2709 echo "Copying dev/* to $minidir_root/$noof_disks" >> $LOGFILE
2710 cp --parents -pRdf dev $minidir_root/$noof_disks
2711 fi
2712 TemporarilyCompressAllFiles "$list_of_files" $minidir_root
2713 for filename in $list_of_files ; do
2714 AddFileToDir $filename $minidir_root $noof_disks
2715 i=$?
2716 if [ "$i" -gt "$noof_disks" ] ; then
2717 noof_disks=$i
2718 echo -en "\r\t\t\t\t\t\t($noof_disks disks)"
2719 fi
2720 if [ "$i" -eq "0" ] ; then
2721 LogIt "Cannot add file $filename to minidir $minidir_root\n"
2722 retval=$(($retval+1))
2723 fi
2724 progress=$(($progress+1))
2725 echo -en "\r\t\t\t\t\t\t\t\t$(($progress*100/$total_files))% complete\r"
2726 done
2727 cd $old_pwd
2728 echo -en "\rThe files have been subdivided into $noof_disks directories. \r"
2729 rm -Rf $minidir_root/compressed
2730 if [ "$retval" -gt "0" ] ; then
2731 return 0
2732 else
2733 return $noof_disks
2734 fi
2735}
2736
2737
2738
2739TurnTgzIntoRdz() {
2740 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
2741 tgz_dir_fname=$1
2742 rdz_fname=$2
2743 ramdisksize=$3
2744 disksize=$4
2745 kernelsize=$5
2746 maxsize=$(($disksize-$kernelsize))
2747 maxsize=$(($maxsize*2)); # to allow for compression of 50%
2748 tempfile=$TMP_ROOT/temp.rd
2749 mountpoint=$TMP_ROOT/mnt1
2750 res=0
2751 echo -en "..."
2752 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2753 echo -en "..."
2754 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE
2755
2756 [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
2757 rm -f /tmp/mke2fs.$$
2758 echo -en "..."
2759 mkdir -p $mountpoint
2760 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."
2761 echo -en "..."
2762 old_pwd=`pwd`
2763 cd $mountpoint
2764# [ -e "$MINDI_LIB/memtest.img" ] && echo "Yep, this is a multi-function CD" > MULTIFUNC
2765 cp -Rdf $tgz_dir_fname/* . 2>> $LOGFILE >> $LOGFILE
2766 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2767 cd dev || Die "Can't cd to dev"
2768 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2769 rm -f dev-entries.tgz
2770 cd ..
2771
2772# add insmod.static and insmod.static.old if (a) they exist and (b) this is a 64-bit distro
2773# if [ "`uname -a | grep x86`" ] || [ "`uname -a | grep amd64`" ] ; then
2774
2775 for w in insmod.static insmod.static.old ; do
2776 s=`which $w 2> /dev/null`
2777 if [ -e "$s" ] ; then
2778 cp --parents -af $s .
2779# LogIt "Copying $s to initrd"
2780 fi
2781 done
2782
2783# fi
2784
2785 mkdir -p tmp
2786 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2787 for w in cdrom floppy groovy-stuff ; do
2788 mkdir -p mnt/$w
2789 done
2790 if [ "$RUN_AFTER_INITIAL_BOOT_PHASE" ] ; then
2791 ReplaceIndividualLine sbin/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" sbin/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
2792 fi
2793 if [ "$RUN_AFTER_BOOT_PHASE_COMPLETE" ] ; then
2794 ReplaceIndividualLine sbin/init `grep -n "#ABSORBENTANDYELLOWANDPOROUSISHE#" sbin/init | cut -d':' -f1` "$RUN_AFTER_BOOT_PHASE_COMPLETE"
2795 fi
2796
2797 lsmod > tmp/original-lsmod.txt
2798
2799 cp --parents -Rdf /dev/fd0*[1,2][4,7,8]* . 2> /dev/null
2800 cd $old_pwd
2801 echo -en "..."
2802 MakeModuleLoadingScript $TMPMODPROBE_FLAG $mountpoint/sbin/insert-all-my-modules
2803 echo -en "..."
2804 old_pwd=`pwd`
2805 if [ "$YOUR_KERNEL_SUCKS" ] ; then
2806 cd $TMP_ROOT
2807 floppy_modules_path=lib/modules/$FAILSAFE_KVER
2808 else
2809 cd /
2810###
2811### Sq-Modification... Use kernel name in module path if specified.
2812###
2813 #floppy_modules_path=lib/modules/`uname -r`
2814 if [ "${kernelname}" != "" ]
2815 then
2816 floppy_modules_path=lib/modules/${kernelname}
2817 else
2818 floppy_modules_path=lib/modules/`uname -r`
2819 fi
2820###
2821### Sq-Modification end
2822###
2823 fi
2824 floppy_modules=""
2825 if [ "$disksize" -lt "2880" ] ; then
2826 list_of_groovy_mods="$FLOPPY_MODS $IDE_MODS ide-scsi sr_mod cdrom isocd isofs `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2827 else
2828 list_of_groovy_mods="$CDROM_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2829 fi
2830 if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
2831 # For PXE boot
2832 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2833 fi
2834 [ -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"
2835 for i in $list_of_groovy_mods ; do
2836 floppy_modules="$floppy_modules `FindSpecificModuleInPath $floppy_modules_path $i`"
2837 done
2838 for i in $floppy_modules ; do
2839 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2840 [ "$YOUR_KERNEL_SUCKS" ] && i=$TMP_ROOT/$i
2841 echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2842 cp -df $i $mountpoint/ || LogIt "Unable to copy $i to $mountpoint\n"
2843 [ "`echo "$i" | grep -F ".gz"`" ] && gunzip -f $mountpoint/`basename $i`
2844 done
2845# if [ -e "/dev/.devfsd" ] ; then
2846# echo "Copying devfs stuff to ramdisk" >> $LOGFILE
2847# for i in /dev /etc/devfsd.conf /etc/modules.devfs /lib/dev-state ; do
2848# cp --parents -pRdf $i $mountpoint/ 2>> $LOGFILE
2849# done
2850# fi
2851 if [ ! -e "/sbin/devfsd" ] || [ "$disksize" -lt "2880" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2852 echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2853 [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2854 [ "$disksize" -lt "2880" ] && echo "...because disksize = $disksize" >> $LOGFILE
2855 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2856# ls -l $mountpoint/sbin/devfsd &> /dev/null || Die "Can't find devfsd daemon on ramdisk"
2857 rm -f $mountpoint/sbin/devfsd
2858 fi
2859 cd $old_pwd
2860 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2861 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2862 rm -f $mountpoint/zero
2863 if [ "`DidMondoCallMe`" ] ; then
2864 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2865 cp -f $mountpoint/tmp/mondo-restore.cfg $MONDO_TMP &> /dev/null
2866 cp -f $TMP_ROOT/mountlist.txt $mountpoint/tmp/ || Die "Cannot copy mountlist to ramdisk"
2867 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2868 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2869 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2870 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2871 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2872 fi
2873 mkdir -p $mountpoint/tmp
2874 mkdir -p $mountpoint/proc
2875 echo "$disksize" > $mountpoint/tmp/$disksize.siz
2876 find $mountpoint -name CVS -exec rm -rf '{}' \;
2877 umount $mountpoint || Die "Cannot unmount $tempfile"
2878 dd if=$tempfile bs=1k 2> /dev/null | gzip -v9 > $rdz_fname 2> /dev/null
2879# gzip -9 $tempfile
2880# mv $tempfile.gz $rdz_fname
2881 if [ "$res" -eq "0" ] ; then
2882 echo -en "..."
2883 else
2884 echo -en "\rMade an rdz WITH ERRORS. \n"
2885 fi
2886 return 0
2887}
2888
2889
2890
2891WhichOfTheseModulesAreLoaded() {
2892 local modname loaded_modules
2893 loaded_modules=" `lsmod | tr -s ' ' '\t' | cut -f1 | grep -Fvx "Modules" | tr '\n' ' '` "
2894 for modname in $1 ; do
2895 [ "`echo "$loaded_modules" | grep -F " $modname "`" ] && echo "$modname"
2896 done
2897}
2898
2899
2900
2901
2902ZipMinidirsIntoTarballs() {
2903 local minidir_root tardir noof_disks diskno old_pwd i
2904 minidir_root=$1
2905 tardir=$2
2906 noof_disks=$3
2907
2908 echo -en "Tarring and zipping the group`PluralOrNot $noof_disks`..."
2909 mkdir -p $tardir
2910 mkdir -p $minidir_root/all
2911 old_pwd=`pwd`
2912 diskno=1
2913 while [ "$diskno" -le "$noof_disks" ] ; do
2914 cd $minidir_root/$diskno || LogIt "Warning - cannot cd to $minidir_root/$diskno\n"
2915 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."
2916 diskno=$(($diskno+1))
2917 echo -n "..."
2918 cp -pRdf * $minidir_root/all
2919 done
2920 mkdir -p $minidir_root/all/tmp
2921 cd $minidir_root/all
2922 size_of_all_tools=`du -sk . | cut -f1`
2923 if [ "`DidMondoCallMe`" ] ; then
2924 for q in filelist.full.gz biggielist.txt ; do
2925 [ ! -e "$MONDO_TMP/$q" ] && Die "Cannot find $MONDO_TMP/$q"
2926 cp -pRdf $MONDO_TMP/$q tmp/
2927 done
2928 mkdir -p $minidir_root/all/tmp
2929 echo -en "$FILES_IN_FILELIST" > $minidir_root/all/tmp/FILES-IN-FILELIST 2> /dev/null
2930 echo -en "$LAST_FILELIST_NUMBER" > $minidir_root/all/tmp/LAST-FILELIST-NUMBER 2> /dev/null
2931 fi
2932 tar -b 4096 -cf - * 2> /dev/null | gzip -9 > $tardir/all.tar.gz
2933 dd if=/dev/zero bs=1k count=64 >> $imagesdir/all.tar.gz 2> /dev/null
2934 [ "`du -sm $imagesdir/all.tar.gz | cut -f1`" -ge "30" ] && Die "You have too many tools in your shed"
2935 cd $old_pwd
2936 rm -Rf $minidir_root
2937 echo -e "$DONE"
2938}
2939
2940
2941
2942# BERLIOS: This function is wrong
2943# Should be recoded. Desactivated in between
2944
2945#ListUnsavedKernelModules() {
2946 #local fname modules
2947 #fname=/tmp/$RANDOM.$$.$RANDOM
2948 #lsmod | sed -n '2,$s/ .*//p' > $fname
2949 #modules=`sort $fname | uniq -d2 | tr '\n' ' '`
2950 #rm -f $fname
2951 #[ "$modules" ] && echo "Unsaved kernel modules: $modules" >> $LOGFILE
2952#}
2953
2954
2955
2956
2957
2958##############################################################################
2959#----------------------------------- main -----------------------------------#
2960##############################################################################
2961
2962
2963#AWK=`which gawk`
2964#LocateDeps $1
2965#MakeModuleLoadingScript /tmp/load-modules.sh
2966#exit 0
2967
2968
2969#cat /etc/mindi/deplist.txt | GenerateGiantDependencyList /tmp/deplist.old 200
2970#exit 0
2971
2972
2973
2974if [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2975 echo "mindi v$MINDI_VERSION"
2976 exit 0
2977fi
2978
2979> $LOGFILE
2980echo "mindi v$MINDI_VERSION" >> $LOGFILE
2981echo "$ARCH architecture detected" >> $LOGFILE
2982echo "mindi called with the following arguments:" >> $LOGFILE
2983echo "$@" >> $LOGFILE
2984echo "Start date : `date`" >> $LOGFILE
2985
2986if [ -e "/etc/conf.modules" ] && [ ! -e "/etc/modules.conf" ] ; then
2987 LogIt "Warning - Ancient distro detected.\n" 1
2988 ln -sf /etc/conf.modules /etc/modules.conf
2989fi
2990[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2991
2992FindHomeOfMindiAndMondo
2993trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2994AbortIfYourDistroIsAPieceOfStercus
2995[ "`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"
2996# If we have a 2.6 kernel, the system uses module-init-tools which means that we
2997# may have the modprobe configuration spread out across multiple files in
2998# directory /etc/modprobe.d. If this is the case we concatenate these files into
2999# a temporary file for further processing. Otherwise we continue in the standard
3000# way. Note further that in case /etc/modprobe.d exists, we use it and ignore
3001# /etc/modprobe.conf which is exactly what module-init-tools does. The temporary
3002# modprobe.conf file is created in MakeModuleLoadingScript. AL041128.
3003if [ -d "/etc/modprobe.d" ] && [ `uname -r | cut -c1-3` == "2.6" ] ; then
3004 TMPMODPROBE_FLAG="Y"
3005else
3006 TMPMODPROBE_FLAG="N"
3007 [ -e "/etc/modprobe.conf" ] && [ ! -e "/etc/modules.conf" ] && ln -sf /etc/modprobe.conf /etc/modules.conf
3008 [ ! -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..."
3009fi
3010FixPathIfBroken
3011[ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
3012AbortIfMkfsVfatMissing
3013### BCO
3014### Fix as it's not mandatory on ia64
3015if [ "$ARCH" = "ia64" ] ; then
3016 FindELiloBinary
3017else
3018 FindIsolinuxBinary
3019 FindLiloBinary
3020fi
3021grep -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
3022rm -f /tmp/mindi_lo
3023trap "Aborted" SIGTERM
3024DONE="\r\t\t\t\t\t\t\t\tDone. "
3025CHOPSIZE=240
3026BIGNO=0
3027MAX_COMPRESSED_SIZE=1300
3028imagesdir=/root/images/mindi
3029mkdir -p $imagesdir
3030kernelpath=""
3031MONDO_ROOT=/tmp/mindilinux/mondo-root
3032mkdir -p $MONDO_ROOT
3033
3034if [ -d "/proc/lvm" ]; then
3035 # LVM v1
3036 LVMCMD=""
3037 LVM="v1"
3038elif [ -d "/dev/mapper" ]; then
3039 # LVM v2
3040 LVMCMD="lvm"
3041 LVM="v2"
3042else
3043 LVM="false"
3044fi
3045
3046if [ "$#" -ge "2" ] ; then
3047 if [ "$1" = "--max-compressed-size" ] ; then
3048 MAX_COMPRESSED_SIZE=$2
3049 shift; shift
3050 fi
3051fi
3052
3053FLOPPY_WAS_MOUNTED=""
3054for mtpt in /media/floppy /mnt/floppy /floppy ; do
3055 if mount | grep -w $mtpt &> /dev/null ; then
3056 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3057 umount $mtpt
3058 fi
3059done
3060
3061if [ "$#" -ne "0" ] ; then
3062 if [ "$1" = "--findkernel" ] ; then
3063 res=`TryToFindKernelPath`
3064# 2> /dev/null`
3065 if [ "$res" = "" ] ; then
3066 exit 1
3067 else
3068 echo "$res"
3069 exit 0
3070 fi
3071 elif [ "$1" = "--makemountlist" ] ; then
3072 [ ! "$2" ] && Die "Please specify the output file"
3073 MakeMountlist $2
3074 exit $?
3075 elif [ "$1" = " --version" ] || [ "$1" = "-v" ] ; then
3076 echo "Mindi v$MINDI_VERSION"
3077 exit 0
3078 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3079 TMP_ROOT=$2
3080 MONDO_TMP=$2
3081 imagesdir=$3
3082 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3083###
3084### Sq-Modification...
3085### Attempt to locate kernel specific module path
3086### if module path is found then use it other wise use uname -r to set it...
3087###
3088 kernelname=`echo $kernelpath | cut -d'-' -f2-`
3089 LogIt "kernelname = $kernelname\n"
3090 LogIt "kernelpath = $kernelpath\n"
3091 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3092 then
3093 LogIt "Module path for ${kernelpath} not found...\n"
3094 LogIt "using running kernel\'s modules.\n"
3095 kernelname=`uname -r`
3096 else
3097 LogIt "Using modules for kernel: ${kernelname}\n"
3098 fi
3099###
3100### end of Sq-Modification
3101###
3102 TAPEDEV=$5
3103 TAPESIZE=$6
3104 FILES_IN_FILELIST=$7
3105 USE_LZO=$8
3106 CDRECOVERY=$9
3107 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3108 IMAGE_DEVS=""
3109 else
3110 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3111 fi
3112 if [ "${11}" ] ; then
3113 LILO_OPTIONS=""
3114# LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
3115 fi
3116 LAST_FILELIST_NUMBER=${12}
3117 ESTIMATED_TOTAL_NOOF_SLICES=${13}
3118 EXCLUDE_DEVS="${14}"
3119 USE_COMP="${15}"
3120 USE_LILO="${16}"
3121 USE_STAR="${17}"
3122 INTERNAL_TAPE_BLOCK_SIZE="${18}"
3123 DIFFERENTIAL="${19}"
3124 NOT_BOOT="${20}"
3125 [ "$USE_COMP" = "" ] && USE_COMP=yes
3126 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3127 [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine.\n"
3128 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3129 kernelname=`echo $kernelpath | cut -d'-' -f2-`
3130 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3131 then
3132 LogIt "Module path for ${kernelpath} not found...\n"
3133 LogIt "using running kernel\'s modules.\n"
3134 kernelname=`uname -r`
3135 else
3136 LogIt "Using modules for kernel: ${kernelname}\n"
3137 fi
3138 [ "$CDRECOVERY" = "yes" ] && [ "$TAPEDEV" != "" ] && Die "Sorry, you can't use --cd-recovery and --write-tapes at the same time"
3139 MONDO_ROOT=`echo $imagesdir | sed 's/\(.*\)\/.*/\1/'`
3140 [ "$MONDO_ROOT" = "" ] && Die "MONDO_ROOT is undefined"
3141 else
3142 echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3143 exit 1
3144 fi
3145fi
3146#ScanCDandTape
3147[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3148if [ "$CDRECOVERY" = "yes" ] ; then
3149 iso_cfg_file=$MINDI_LIB/isolinux-H.cfg
3150 sys_cfg_file=$MINDI_LIB/syslinux-H.cfg
3151else
3152 iso_cfg_file=$MINDI_LIB/isolinux.cfg
3153 sys_cfg_file=$MINDI_LIB/syslinux.cfg
3154fi
3155
3156
3157
3158
3159#ReplaceIndividualLine /tmp/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" /tmp/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
3160#exit 0
3161
3162
3163#ListKernelModules
3164#exit 0
3165
3166
3167
3168
3169[ -e "$iso_cfg_file" ] || Die "Cannot find $iso_cfg_file"
3170rm -Rf $TMP_ROOT/mindilinux/*
3171TMP_ROOT=$TMP_ROOT/mindilinux/$$
3172mkdir -p $TMP_ROOT
3173mkdir -p $imagesdir
3174if [ ! "`DidMondoCallMe`" ] ; then
3175 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION\n"
3176 LogIt "Latest Mindi is available from http://www.mondorescue.org\n"
3177 LogIt "BusyBox sources are available from http://www.busybox.net\n"
3178 LogIt "------------------------------------------------------------------------------"
3179else
3180 echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> /var/log/mondo-archive.log
3181fi
3182
3183# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
3184insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
3185for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3186 insmod $i >> $LOGFILE 2>> $LOGFILE
3187done
3188
3189KERN_DISK_MADE=""
3190
3191echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
3192echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
3193echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
3194if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3195 LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else.\n"
3196 MakeMondoConfigFile $MONDO_TMP/mondo-restore.cfg
3197 MakeMountlist $MONDO_TMP/mountlist.txt
3198 mkdir -p $MONDO_TMP/small-all/tmp
3199 cd $MONDO_TMP/small-all
3200 cp -f $MONDO_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp || Die "Cannot copy small all.tar.gz"
3201 tar -cv tmp | gzip -9 > $MONDO_TMP/all.tar.gz || Die "Cannot make small all.tar.gz"
3202 sleep 2
3203 LogIt "Done. Exiting.\n"
3204 exit 0
3205fi
3206
3207if [ "$kernelpath" = "" ] ; then
3208 [ "`DidMondoCallMe`" ] && Die "Please use -k <path> to specify kernel."
3209 if [ $USE_OWN_KERNEL != "yes" ]; then
3210 echo -en "Do you want to use your own kernel to build the boot disk (y/n) ?"
3211 read ch
3212 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3213 USE_OWN_KERNEL="yes"
3214 fi
3215 fi
3216 if [ "$USE_OWN_KERNEL" = "yes" ]; then
3217 YOUR_KERNEL_SUCKS=""
3218 kernelpath=`TryToFindKernelPath`
3219 if [ "$kernelpath" = "" ] ; then
3220 echo -n "Please enter kernel path : "
3221 read kernelpath
3222 fi
3223 else
3224 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3225 fi
3226fi
3227if [ ! "`DidMondoCallMe`" ] ; then
3228 echo -en "Would you like to use LILO (instead of syslinux)\nfor your boot CD/floppies (y/n) ?"
3229 read ch
3230 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3231 USE_LILO=yes
3232 else
3233 USE_LILO=no
3234 fi
3235fi
3236if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3237 kernelpath=$MINDI_LIB/vmlinuz
3238 LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks.\n"
3239 LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
3240 LogIt "disks then it may still be a result of a problem with your kernel.\n"
3241 pwd=`pwd`
3242 cd $TMP_ROOT
3243 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3244 cd $pwd
3245 YOUR_KERNEL_SUCKS="Your kernel sucks"
3246fi
3247echo -e "Mindi's temp dir = $TMP_ROOT \nMindi's output dir=$imagesdir" >> $LOGFILE
3248[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty...\n"
3249rm -f /tmp/mindi.err.*.tgz
3250
3251[ "$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."
3252
3253rm -f /root/images/mindi/{*img,*gz,*iso}
3254
3255PrepareDataDiskImages $imagesdir
3256noof_disks=$?
3257ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3258rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3259ramdisk_size=$rds
3260
3261echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
3262if [ "$USE_LILO" = "yes" ] ; then
3263 if [ "$ARCH" = "ia64" ] ; then
3264 PrepareBootDiskImage_LILO $imagesdir $IA64_BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create ia64 floppy disk image."
3265 else
3266 if ! PrepareBootDiskImage_LILO $imagesdir 1722 $kernelpath $ramdisk_size ; then
3267 LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3268 LogIt "if you want to make a 1.72MB floppy disk.\n"
3269 fi
3270 if ! PrepareBootDiskImage_LILO $imagesdir 2880 $kernelpath $ramdisk_size ; then
3271 LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3272 LogIt "Please reduce your kernel's size\n"
3273 LogIt "if you want to make a 2.88MB floppy disk.\n"
3274 PrepareBootDiskImage_LILO $imagesdir 5760 $kernelpath $ramdisk_size || Die "Failed to create 2.88MB floppy disk image."
3275 fi
3276 fi
3277else
3278 if ! PrepareBootDiskImage_SYSLINUX $imagesdir 1722 $kernelpath $ramdisk_size ; then
3279 LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3280 LogIt "if you want to make a 1.72MB floppy disk.\n"
3281 if ! PrepareBootDiskImage_SYSLINUX $imagesdir 2880 $kernelpath $ramdisk_size ; then
3282 LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3283 LogIt "Please reduce your kernel's size\n"
3284 LogIt "if you want to make a 2.88MB floppy disk.\n"
3285 PrepareBootDiskImage_SYSLINUX $imagesdir 5760 $kernelpath $ramdisk_size || Die "Failed to create 5.76MB floppy disk image."
3286 fi
3287 fi
3288fi
3289
3290
3291
3292[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3293...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3294
3295
3296if [ ! "`DidMondoCallMe`" ] ; then
3297 ListImagesForUser $imagesdir
3298 boot_dev=/dev/fd0u1722
3299 [ ! -e "$boot_dev" ] && mknod $boot_dev b 2 60
3300 [ ! -e "$boot_dev" ] && boot_dev=/dev/fd0H1722
3301 [ ! -e "$boot_dev" ] && Die "Oh Lord, will you PLEASE tell the vendor to create the 1.72MB devices in /dev?"
3302 if [ "$PROMPT_WRITE_BOOT_FLOPPIES" = "yes" ]; then
3303 OfferToCopyImagesToDisks $imagesdir $boot_dev $FDDEVICE
3304 fi
3305 OfferToMakeBootableISO $imagesdir
3306 LogIt "Finished.\n"
3307elif [ "$TAPEDEV" ] ; then
3308 mkdir -p /root/images/mindi
3309 rm -f /root/images/mindi/{*img,*gz,*iso}
3310 OfferToMakeBootableISO $imagesdir
3311 if [ -e "$imagesdir/all.tar.gz" ] ; then
3312 cp -f $imagesdir/all.tar.gz $MONDO_TMP/
3313 else
3314 Die "Cannot find all.tar.gz, to be written to tape"
3315 fi
3316else
3317 OfferToMakeBootableISO $imagesdir
3318fi
3319if [ "$imagesdir" != "/root/images/mindi" ] ; then
3320 for i in `find $imagesdir -maxdepth 1 -name "*.iso" -o -name "*.img"` ; do
3321 cp -f $i /root/images/mindi || LogIt "[line 3260] Cannot copy $i to /root/images/mindi\n"
3322 done
3323fi
3324[ "$TMP_ROOT" != "/tmp" ] && rm -Rf $TMP_ROOT
3325# cleanup
3326rm -fR /tmp/mountlist.txt.$$ $FDISKLOG /tmp/mindilinux
3327LogIt "$FRIENDLY_OUTSTRING\n"
3328#ListUnsavedKernelModules
3329for mtpt in $FLOPPY_WAS_MOUNTED ; do
3330 mount $mtpt
3331done
3332echo "Mindi is exiting" >> $LOGFILE
3333echo "End date : `date`" >> $LOGFILE
3334exit 0
Note: See TracBrowser for help on using the repository browser.