source: trunk/mindi/mindi @ 125

Last change on this file since 125 was 125, checked in by bcornec, 14 years ago

merge -r 123:124 $SVN_M/branches/2.05

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