source: MondoRescue/trunk/mindi/mindi@ 135

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

merge -r132:134 $SVN_M/branches/2.05

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