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

Last change on this file since 1008 was 1008, checked in by Bruno Cornec, 17 years ago

LABEL with mindi were not handled properly since we managed UUID (end of the 5 if cases)

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