source: branches/2.05/mindi/mindi @ 138

Last change on this file since 138 was 138, checked in by bcornec, 13 years ago

Correction on Philippe De Muyter's patch not completely applied last time

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