source: branches/stable/mindi/mindi @ 585

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

Hugo => Dev Team

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