source: MondoRescue/trunk/mindi/mindi@ 782

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

merge -r763:781 $SVN_M/branches/stable

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