source: branches/2.2.5/mindi/mindi @ 1565

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