source: MondoRescue/trunk/mindi/mindi@ 304

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

merge -r299:303 $SVN_M/branches/2.06

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