source: MondoRescue/branches/2.2.0/mindi/mindi@ 885

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

merge -r881:884 $SVN_M/branches/stable

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