source: trunk/mindi/mindi @ 286

Last change on this file since 286 was 286, checked in by andree, 14 years ago

Changed module 'nfsacl' to 'nfs_acl' in mindi's 'NET_MODS' variable and
added 'nfs_acl' to mindi's 'EXTRA_MODS' variable.
On Debian Sid with kernel 2.6.15-1-k7-smp as at 06 Jan 06 we have:
andree@aurich3:~/shed/mr/svn.berlios$ lsmod | grep nfs
nfs 198600 2
lockd 57224 2 nfs
nfs_acl 3840 1 nfs
sunrpc 137980 4 nfs,lockd,nfs_acl
So, module 'nfs' depends on module 'nfs_acl'. This is assumed to be
solely kernel-dependent, i.e. not Debian-specific.

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