source: MondoRescue/branches/stable/mindi/mindi @ 447

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

mindi now supports LABEL for swap partitions (patch from Julien Pinon <julien.pinon_at_linagora.com>)
updated web site conf file for virtual hosting

  • Property svn:keywords set to Rev Id
File size: 107.2 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 447 2006-03-17 09:16:24Z 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 linear raid0 raid1 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 $mountpoint; does your kernel support loopfs? If not, please recompile your kernel. Your Linux distro is broken."
455    mv $tarball $mountpoint/
456    if [ "$?" -ne "0" ] ; then
457    umount $mountpoint
458    Die "Tarball $tarball is too big for disk! (CODI)\nTell Hugo 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 > $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 | grep -w "$current_partition" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1341    redhat_label=""
1342    if [ "`echo "$current_partition" | fgrep -i "LABEL=SWAP"`" != "" ] ; then
1343            redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1344            actual_dev="/dev/`echo "$redhat_label" | cut -d '-' -f2`"
1345            current_partition=$actual_dev
1346    elif [ "`echo "$current_partition" | fgrep -i "LABEL="`" != "" ] ; then
1347        str_to_find_fmt_with=$current_partition
1348        redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1349        actual_dev=`mount -l | fgrep " [$redhat_label]" | cut -d' ' -f1`
1350#       partition_mountpt=$redhat_label
1351        current_partition=$actual_dev
1352    else
1353        str_to_find_fmt_with=$current_partition
1354    fi
1355    partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1356    if [ -d "/proc/lvm" ] && [ "`lvdisplay $current_partition 2> /dev/null`" ] ; then
1357        partition_size="lvm"
1358    elif [ -d "/dev/mapper" ] && [ "`lvm lvdisplay $current_partition 2> /dev/null`" ] ; then
1359        partition_size="lvm"
1360    else
1361        partition_size=`SizeOfPartition $current_partition`
1362        [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1363        [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1364        if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1365        partition_size=`fgrep -v "Priority" /proc/swaps | tr -s '\t' ' ' | fgrep "$current_partition" | $AWK '{print $3}'`
1366        [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1367                [ "$partition_format" != "swap" ] && partition_format="swap"
1368        if [ "$partition_size" = "" ] ; then
1369            totalsize=0
1370            items=0
1371            for i in `tr -s ' ' '\t' < /proc/swaps | fgrep -v "Filename" | cut -f3` ; do
1372            totalsize=$(($totalsize+$i))
1373            items=$(($items+1))
1374            done
1375                    [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1376            [ "$partition_size" -lt "125000" ] && partition_size=125000
1377            echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1378        fi
1379        fi
1380    fi
1381    [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1382    [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1383    if [ "$partition_mountpt" = "" ] ; then
1384        if [ "`pvdisplay $current_partition 2> /dev/null`" != "" ] || [ "`lvm pvdisplay $current_partition 2> /dev/null`" != "" ] ; then
1385        if  [ "`fgrep device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1386            partition_mountpt="raid"
1387            partition_format="raid"
1388        else
1389#           lvm_dev="`pvdisplay $current_partition | grep -i "VG N" | head -n1 | tr -s ' ' ' ' | cut -d' ' -f3`"
1390            partition_mountpt="lvm"
1391            partition_format="lvm"
1392        fi
1393        fi
1394    fi
1395    psz=$partition_size
1396    echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1397    [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1398    if [ "`echo " $IMAGE_DEVS " | fgrep " $current_partition "`" != "" ] ; then
1399        partition_mountpt="image"
1400            old_partition_fmt=$partition_format
1401#       partition_format="`$FDISK -l 2>> $LOGFILE | tr -s '\t' ' ' | grep -w "$absolute_partition" | $AWK 'x=$(NF-1}'`"
1402        partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1403            echo "------- $FDISK -l log ------------" >> $LOGFILE
1404            cat $FDISKLOG >> $LOGFILE
1405            echo "------- $FDISK log end ------------" >> $LOGFILE
1406        partition_size=$(($partition_size+1)); # just in case
1407            if [ "$partition_format" = "Linux" ] ; then
1408                echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1409                echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1410                partition_format=$old_partition_fmt
1411            fi
1412    fi
1413        if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | fgrep " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1414            echo "Excluding $current_partition from mountlist" >> $LOGFILE
1415            continue
1416        fi
1417        if [ ! "$partition_mountpt" ] ; then
1418        for qq in "" `find /dev/ida/c*d* ! -name '*p*'` ; do
1419        partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1420                echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1421                cat $FDISKLOG >> $LOGFILE
1422                echo "------- $FDISK log end ------------" >> $LOGFILE
1423        [ "$partition_format" ] && break
1424        done
1425        if [ "$partition_format" = "Compaq diagnostics" ] ; then
1426        partition_format="compaq"
1427        elif [ ! "`fgrep device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1428        LogIt "Unable to find mountpoint of $current_partition - ignoring\n"
1429        continue
1430        fi
1431    fi
1432    partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1433    [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | awk '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1434    unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s\n" $current_partition $partition_mountpt $partition_format $psz`
1435    if [ "$current_partition" = "" ] ; then
1436        echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1437    elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1438        if [ "`fgrep device /etc/raidtab 2>/dev/null | fgrep $current_partition`" ] ; then
1439        partition_mountpt=raid
1440        partition_format=raid
1441            printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1442                printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1443        else
1444        echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1445        fi
1446        elif [ "$partition_format" = "" ] ; then
1447        echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1448    elif [ "$partition_size" = "" ] ; then
1449        echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1450    elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1451        continue
1452    else
1453            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1454                echo "Stupid bastard..." >> $LOGFILE
1455                partition_format="vfat"
1456            fi
1457        printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1458        printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1459    fi
1460    done
1461}
1462
1463
1464
1465
1466
1467
1468MakeSureNumberIsInteger() {
1469    res=`echo "$1" | tr -s '\-[0-9]' ' '`
1470    if [ "$res" != " " ] && [ "$res" != "" ] ; then
1471    echo "result = '$res'"
1472        Die "$1 should be an integer"
1473    fi
1474}
1475
1476
1477
1478
1479
1480MakeSyslinuxMessageFile() {
1481    mkdir -p $1
1482    rmdir $1
1483    echo -en "  " > $1
1484    if [ "`fgrep -i "debian" /etc/issue.net 2> /dev/null`" ] ; then
1485        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
1486    else
1487        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
1488    fi
1489    sed s/%r/"`uname -r`"/ $1.tmp | sed s/%t/"`hostname`"/ > $1
1490    rm -f $1.tmp
1491    if [ "$CDRECOVERY" != "yes" ] ; then
1492        if [ -e "$MONDO_TMP/start-nfs" ] ; then
1493            echo -en "Press <enter> to continue.\n" >> $1
1494        elif [ ! "$MONDO_TMP" ] ; then
1495            echo -en "FYI, this is _not_ a Mondo Rescue CD.\n" >> $1
1496            if [ -e "$MINDI_LIB/memtest.img" ] ; then
1497                echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n" >> $1
1498            fi
1499        else
1500            echo -en "$BOOT_MEDIA_MESSAGE" >> $1
1501        fi
1502    else
1503        echo -en " \
1504To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1505CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n" >> $1
1506    fi
1507}
1508
1509
1510
1511
1512MoveHyperlinkSensibly() {
1513    local filename minidir_root resides_on_diskno noof_disks old_diskno d old_pwd
1514    filename=$1
1515    minidir_root=$2
1516    resides_on_diskno=$3
1517    noof_disks=$4
1518
1519    [ -h "$minidir_root/$resides_on_diskno/$filename" ] || Die "$filename isn't a softlink (or doesn't exist): how can I move it sensibly?"
1520
1521    old_diskno=$resides_on_diskno
1522    d=1
1523    while [ "$d" -le "$noof_disks" ] ; do
1524        if [ "$d" -ne "$old_diskno" ] ; then
1525            old_pwd=`pwd`
1526            cd $minidir_root/$old_diskno
1527            cp --parents -Rdf $filename $minidir_root/$d/ || Die "Can't move $filename (sensibly) from $old_diskno to $d"
1528            rm -f $filename
1529            cd $old_pwd
1530        fi
1531# when the softlink is resolvable, our work here is done
1532        [ -e "$minidir_root/$d/$filename" ] && return 0
1533        old_diskno=$d
1534        d=$(($d+1))
1535    done
1536    return 1
1537}
1538
1539
1540
1541OfferToCopyImagesToDisks() {
1542    local imagesdir i imagename dev count boot_dev data_dev
1543    imagesdir=$1
1544    boot_dev=$2
1545    data_dev=$3
1546    echo -en "Would you like to create boot+data floppy disks now (y/n) ?"
1547    read i
1548    [ "$i" != "y" ] && [ "$i" != "Y" ] && return
1549    mount | fgrep /dev/fd > /dev/null && Die "Please unmount your floppies first."
1550    echo "WARNING! THIS WILL ERASE YOUR FLOPPY DISKS."
1551    [ ! -e "$boot_dev" ] && Die "Cannot find $boot_dev - is your Linux distro broken?"
1552    [ ! -e "$data_dev" ] && Die "Cannot find $data_dev - is your Linux distro broken?"
1553    i=`find $imagesdir -type f | fgrep "/mindi-root.1" 2> /dev/null`
1554    j=`find $imagesdir -type f | fgrep "/mindi-boot" | egrep -v '2880|5760'`
1555#    echo "i=$i"
1556#    echo "j=$j"
1557    if [ "$i" ] ; then
1558        CopyImageToDisk $j $data_dev "boot disk"
1559        CopyImageToDisk $i $data_dev "root disk"
1560    else
1561        CopyImageToDisk $j $boot_dev "boot/root disk"
1562    fi
1563    count=1
1564    for i in `find $imagesdir | fgrep mindi-data` ; do
1565        CopyImageToDisk $i $data_dev "data disk #$count"
1566        count=$(($count+1))
1567    done
1568}
1569
1570
1571
1572OfferToMakeBootableISO() {
1573    local i old_pwd
1574    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ ! "`DidMondoCallMe`" ] ; then
1575        echo -en "Shall I make a bootable CD image? (y/n) "
1576        read i
1577        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1578    fi
1579    if [ ! "$MONDO_TMP" ] ; then
1580        LogIt "NB: Mindi's bootable CD always uses isolinux.\n"
1581        LogIt "For a bootable CD w/LILO, please use Mondo.\n"
1582    fi
1583    rm -Rf $TMP_ROOT/iso
1584    mkdir -p $TMP_ROOT/iso/{images,archives,isolinux}
1585    cp -f $1/*.img $1/*.gz $TMP_ROOT/iso/images || LogIt "OfferToMakeBootableISO: Cannot copy $i to $TMP_ROOT/iso/images\n"
1586    old_pwd=`pwd`
1587    cd $TMP_ROOT/iso
1588    mkdir -p $MONDO_ROOT/iso/isolinux
1589    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1590    cp $MINDI_LIB/mem{test,disk}* $MONDO_ROOT 2>> $LOGFILE
1591    for i in memdisk memtest.bin memtest.img ; do
1592    j=$MINDI_LIB/$i
1593    k=$TMP_ROOT/iso/isolinux
1594    if [ -e "$j" ] ; then
1595        LogIt "Copying $j to $k\n"
1596        cp -f $j $k || Die "Failed to copy $j to $k"
1597        cp -f $j $TMP_ROOT || Die "Failed to copy $j to $k"
1598    fi
1599    done
1600    MakeSyslinuxMessageFile $TMP_ROOT/iso/isolinux/message.txt
1601    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?"
1602    cp $TMP_ROOT/mindi.rdz $TMP_ROOT/iso/isolinux/initrd.img
1603    cp $TMP_ROOT/mindi.rdz $imagesdir/initrd.img
1604    [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
1605    cd $TMP_ROOT/iso/isolinux
1606    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?"
1607    if [ -e "$MONDO_TMP/start-nfs" ] ; then
1608    mv isolinux.cfg isolinux.cfg.old
1609    sed s/interactive/iso/ isolinux.cfg.old > isolinux.cfg
1610    fi
1611    if [ "$ARCH" != "ia64" ] ; then
1612        cp $ISOLINUX isolinux.bin || Die "Cannot copy isolinux.bin ($ISOLINUX) to tmp_root - did you run out of disk space?"
1613    cp $ISOLINUX ../
1614    fi
1615    cd $TMP_ROOT/iso
1616    if [ "$ARCH" != "ia64" ] ; then
1617        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?"
1618    fi
1619    [ "$MONDO_SHARE" ] && cp -f $MONDO_SHARE/autorun .   
1620    if [ -d "/home/MondoCD" ] ; then
1621    cp -pRdu /home/MondoCD/* .
1622    fi
1623    if [ "$ARCH" != "ia64" ] ; then
1624        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
1625    else
1626        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
1627    fi
1628    if [ "$?" -ne "0" ] ; then
1629    echo "----------- mkisofs's errors --------------" >> $LOGFILE
1630    cat /tmp/$$.mk >> $LOGFILE
1631    echo "mkisofs returned the following errors:-"
1632    cat /tmp/$$.mk
1633    LogIt "Failed to create ISO image.\n"
1634    else
1635    echo "Created bootable ISO image at $imagesdir/mindi.iso" >> $LOGFILE
1636    fi
1637    rm -f /tmp/$$.mk
1638    cd $old_pwd
1639}
1640
1641
1642
1643PluralOrNot() {
1644    [ "$1" -gt "1" ] && echo -en "s"
1645}
1646
1647
1648
1649
1650MakeMessageFile() {
1651    local disksize
1652    disksize=$1
1653    if [ "`fgrep -i "debian" /etc/issue.net 2> /dev/null`" ] ; then
1654        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`"/
1655    else
1656        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`/
1657    fi
1658    if [ "$disksize" -gt "2880" ] ; then
1659    if [ "`DidMondoCallMe`" ] ; then
1660        if [ "$CDRECOVERY" != "yes" ] ; then
1661            if [ -e "$MONDO_TMP/start-nfs" ] ; then
1662                echo -en "Press <enter> to continue.\n"
1663            elif [ ! "$MONDO_TMP" ] ; then
1664                echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1665            else
1666                echo -en "$BOOT_MEDIA_MESSAGE"
1667            fi
1668        fi
1669    fi
1670    fi
1671    if [ "$CDRECOVERY" = "yes" ] ; then
1672        echo -en "\
1673To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1674CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1675    fi
1676    echo -en "\n\n\n"
1677}
1678
1679
1680
1681
1682write_full_floppy_of_kernel() {
1683    local mtpt image old_pwd res disksize
1684
1685    res=0
1686    old_pwd=`pwd`
1687    KERN_DISK_MADE=1
1688    disksize=$3
1689    rand1=$RANDOM
1690    rand2=$RANDOM
1691    image=/tmp/$rand1.$rand2.img
1692    mtpt=/tmp/$rand1.$rand2.mtpt
1693    dd if=/dev/zero of=$image bs=1k count=$disksize
1694    mke2fs -N 26 -F $image > /dev/null
1695    mkdir -p $mtpt
1696    mount -o loop $image $mtpt
1697    cd $mtpt
1698    mkdir -p {dev,tmp,boot}
1699    cp -f $1 vmlinuz
1700    if [ "$?" -ne "0" ] ; then
1701        LogIt "Failed to copy $1 to ramdisk\n"
1702        cd $old_pwd
1703        umount $mtpt
1704        rmdir $mtpt
1705        rm $image
1706        return 1
1707    fi
1708
1709    rdev vmlinuz 2,0
1710    rdev -R vmlinuz 0
1711    rdev -r vmlinuz 49152
1712
1713    tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1714    losetup /dev/loop0 > /dev/null 2> /dev/null
1715    [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1716    CopyBootBFile $mtpt/boot.b
1717
1718#    echo "root=/dev/loop0" > bdlilo.conf
1719    MakeLiloConfFile $disksize >> bdlilo.conf
1720
1721#    cat bdlilo.conf > /tmp/bdlilo.conf
1722
1723#    cat /home/mondostuff/bdlc > bdlilo.conf
1724
1725    chmod 644 bdlilo.conf
1726    MakeMessageFile $disksize > message
1727    lilo -v -C bdlilo.conf -r $mtpt
1728    res=$?
1729
1730#echo "lilo -v -C bdlilo.conf -r $mtpt"
1731#echo -en "Press enter"; read line
1732
1733    cd $old_pwd
1734    umount $mtpt
1735    mv -f $image $2
1736    rmdir $mtpt
1737
1738    return $res
1739
1740# --- the kernel-only method NO LONGER WORKS. Not since Apr 2002.
1741# It should work, according to the Boot Disk HOWTO, but it doesn't.
1742# It works for my failsafe kernel & for RH7.2 but not RH7.3, 8.0, etc.
1743# -Hugo, Apr 19th 2004
1744#   dd if=$1 of=$2 bs=1k &> /dev/null || Die "Cannot dd blank file"
1745#   dd if=/dev/zero bs=1k count=$3 >> $2 2> /dev/null || Die "Cannot dd blank file"
1746#   mv -f $2 $2.old
1747#   dd if=$2.old bs=1k count=$3 of=$2 &> /dev/null || Die "Cannot dd blank file"
1748#   rm -f $2.old
1749#   if [ "$3" = "1440" ] ; then
1750#       rdev $2 "/dev/fd0H"$3
1751#   else
1752#       rdev $2 "/dev/fd0u"$3
1753#   fi
1754#   rdev -R $2 0
1755#   rdev -r $2 49152
1756}
1757
1758
1759
1760
1761
1762
1763MakeLiloConfFile() {
1764    local disksize options i ooo
1765    disksize=$1
1766    options=""
1767        if [ "$ARCH" != "ia64" ] ; then
1768            echo -en "boot=/dev/loop0\ndisk=/dev/loop0\n"
1769        fi
1770        if [ "$disksize" -eq "2880" ] ; then
1771            echo -en "bios=0x00\nsectors=36\nheads=2\ncylinders=80\n"
1772        elif [ "$disksize" -eq "1722" ] ; then
1773            echo -en "bios=0x00\nsectors=21\nheads=2\ncylinders=82\n"
1774        elif [ "$disksize" -gt "2880" ] ; then
1775            /bin/true
1776        else
1777            echo -en "bios=0x00\nsectors=18\nheads=2\ncylinders=80\n"
1778        fi
1779        if [ "$ARCH" != "ia64" ] ; then
1780            echo -en "install=/boot.b\nmap=/boot.map\n"
1781        fi
1782    if [ "$CDRECOVERY" = "yes" ] ; then
1783        echo -en "default=RESTORE\n"
1784    elif [ "$disksize" -gt "2880" ] && [ "`DidMondoCallMe`" ] ; then
1785        if [ -e "$MONDO_TMP/start-nfs" ] ; then
1786            echo -en "default=iso\n"
1787        else
1788            echo -en "default=interactive\n"
1789        fi
1790    else
1791        echo -en "default=expert\n"
1792    fi
1793
1794    echo -en "prompt\n"
1795    if [ "$ARCH" != "ia64" ] ; then
1796        echo -en "vga=normal\nbackup=/dev/null\nmessage=/message\n"
1797    fi
1798    if [ "$CDRECOVERY" != "yes" ] ; then
1799    echo -en "timeout=300\n"
1800    fi
1801    echo -en "\n"
1802    if [ "$CDRECOVERY" = "yes" ] ; then
1803    options="RESTORE expert"
1804    elif [ "$disksize" -gt "2880" ] ; then
1805        if [ "`DidMondoCallMe`" ] ; then
1806            if [ -e "$MONDO_TMP/start-nfs" ] ; then
1807                options="iso"
1808            else
1809                options="interactive expert compare iso nuke isonuke"
1810# hda hdb hdc hdd"
1811            fi
1812        else
1813            options="expert"
1814    fi
1815    else
1816        options="expert"
1817    fi
1818    for i in $options ; do
1819    ooo=$i
1820    [ "$ooo" = "RESTORE" ] && ooo="nuke"
1821    if [ "$ARCH" = "ia64" ] ; then
1822        rootpart="root=/dev/ram0\n\t"
1823    else
1824        rootpart=""
1825    fi
1826    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"
1827   
1828    outstr=$outstr" $ooo_mode"
1829    outstr=$outstr"\"\n"
1830    if [ "$disksize" = "1440" ] ; then
1831        echo -en "$outstr" | sed s/initrd=.*// | grep -v root=
1832    else
1833        echo -en "$outstr"
1834    fi
1835    done
1836}
1837
1838
1839
1840
1841PrepareBootDiskImage_LILO() {
1842    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1843    imagesdir=$1
1844    disksize=$2
1845    kernelpath=$3
1846    ramdisksize=$4
1847
1848    retval=0
1849    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1850    echo -en "Making "$disksize"KB boot disk..."
1851    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?"
1852    if [ "$ARCH" != "ia64" ] ; then
1853        [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
1854    fi
1855    echo -en "..."
1856    imagefile=$imagesdir/mindi-bootroot.$disksize.img
1857    mountpoint=$TMP_ROOT/mountpoint.$$
1858    mkdir -p $mountpoint
1859    dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
1860    if [ "$ARCH" = "ia64" ] ; then
1861        mkdosfs $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1862    t=vfat
1863    else
1864        mke2fs -N 26 -m 0 -F $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1865    t=ext2
1866    fi
1867    [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
1868    rm -f /tmp/mke2fs.$$
1869    mount -t $t -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
1870# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1871    mkdir -p $mountpoint/etc
1872    if [ "$ARCH" != "ia64" ] ; then
1873        liloconf=$mountpoint/etc/lilo.conf
1874    else
1875    liloconf=$mountpoint/elilo.conf
1876    fi
1877    old_pwd=`pwd`
1878    cd $mountpoint
1879    if [ "$ARCH" != "ia64" ] ; then
1880        tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1881    fi
1882    cd $old_pwd
1883    losetup /dev/loop0 > /dev/null 2> /dev/null
1884    [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing   'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1885    CopyBootBFile $mountpoint/boot.b
1886
1887    MakeLiloConfFile $disksize > $liloconf
1888
1889    echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint..." >> $LOGFILE
1890    cp -f $TMP_ROOT/mindi.rdz $mountpoint 2>> $LOGFILE
1891    if [ "$?" -ne "0" ] ; then
1892    LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
1893    cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
1894    LogIt "Please unload some of your modules and try again.\n"
1895    rm -f $TMP_ROOT/mtpt.$$
1896    LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
1897        retval=$(($retval+1))
1898    fi
1899    MakeMessageFile $disksize > $mountpoint/message
1900
1901    mkdir -p $mountpoint/tmp
1902    cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
1903    if [ -e "$MINDI_LIB/memtest.img" ] ; then
1904        echo -en "image=/memtest.bin\nlabel=memtest\nn" >> $liloconf
1905        echo -en "image=/memdisk\nlabel=memtest\nappend=\"initrd=memtest.img\"\n" >> $liloconf
1906#        echo "Yep, this is a multi-function CD" > $mountpoint/MULTIFUNC
1907    fi
1908    if [ -d "/home/MondoCD" ] ; then
1909    cp -pRdu /home/MondoCD/* . || Die "Cannot do kung pow"
1910    fi
1911
1912# copy the kernel across
1913    rm -Rf $mountpoint/lost+found
1914    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1915    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1916    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2> /dev/null
1917    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
1918    echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1919    du -sk $mountpoint/* >> $LOGFILE
1920    echo "--- end of list of files ---" >> $LOGFILE
1921    echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1922Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
1923        rm -f $mountpoint/vmlinuz
1924    cd $old_pwd
1925        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1926        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
1927#   losetup /dev/loop0 -d
1928    res=0
1929        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
1930    res=$(($res+$?))
1931        cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
1932    res=$(($res+$?))
1933    rm -f $imagefile
1934    if [ "$res" -ne "0" ]; then
1935        LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
1936        rm -f $imagesdir/mindi-*.1440.img
1937    fi
1938    return $res
1939    fi
1940    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1941    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1942    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
1943    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
1944# make it bootable
1945    rm -f $mountpoint/zero
1946    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
1947    if [ "$disksize" -gt "2880" ] && [ ! "$KERN_DISK_MADE" ] ; then
1948        if [ "$ARCH" != "ia64" ] ; then
1949        $LILO_EXE $LILO_OPTIONS -r $mountpoint >> $LOGFILE 2>> $LOGFILE
1950        else
1951            /bin/true
1952        fi
1953    elif [ ! "$KERN_DISK_MADE" ] ; then
1954# 12/28/2001 - if 1.72MB floppy then don't use LILO's optimizations at all
1955    $LILO_EXE -r $mountpoint >> $LOGFILE 2>> $LOGFILE
1956    else
1957    echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
1958    fi
1959    if [ $? -ne "0" ] ; then
1960    if [ "`fgrep "/tmp/dev.0" $LOGFILE`" ] ; then
1961        LogIt "The '/tmp/dev.0' error is NOT Mindi's fault. It is LILO's.\n"
1962        LogIt "Please reboot your PC as a workaround.\n"
1963        Die "LILO sneezed and Mindi caught a cold. Please read the README / FAQ.\n"
1964    fi
1965    echo "$LILO_EXE -r $mountpoint ...failed."
1966    echo -en "Press ENTER to continue."; read line
1967    LogIt "Cannot run lilo on $mountpoint\nPlease upgrade/downgrade your version of LILO. It has a bug.\n"
1968    retval=$(($retval+1))
1969    fi
1970    cp -f $liloconf /tmp/lilo.conf
1971    if [ "$ARCH" = "ia64" ] ; then
1972        cp `dirname $kernelpath`/*.efi $mountpoint
1973    fi
1974    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1975    echo -en "..."
1976    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
1977    if [ "$retval" -eq "0" ] ; then
1978        echo -en "...$DONE\r"
1979        if [ "$KERN_DISK_MADE" ] ; then
1980            LogIt "... $disksize KB boot disks were created OK\r"
1981        fi
1982    else
1983        echo -en "...failed\r"
1984        LogIt $disksize"KB boot disk was NOT created\r"
1985        rm -f $imagefile
1986    fi
1987    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
1988    return $retval
1989}
1990
1991
1992
1993
1994PrepareBootDiskImage_SYSLINUX() {
1995    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1996    imagesdir=$1
1997    disksize=$2
1998    kernelpath=$3
1999    ramdisksize=$4
2000    do_boot_root_thingy=""
2001    local retval old_pwd
2002    retval=0
2003    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
2004    echo -en "Making "$disksize"KB boot disk..."
2005    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?"
2006    [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
2007    echo -en "..."
2008    imagefile=$imagesdir/mindi-bootroot.$disksize.img
2009    mountpoint=$TMP_ROOT/mountpoint.$$
2010    mkdir -p $mountpoint
2011# If I format a 1722KB data file & run syslinux on it, the resultant image
2012# won't boot. So, I have formatted a floppy, called syslinux on/to it, and
2013# used 'dd' to copy it to sys-disk.raw (zipped to sys-disk.raw.gz).
2014# If I extract it, mount it, copy my files to it, etc. then the resultant
2015# image _is_ bootable. I don't know why syslinux and/or mkfs.vfat won't
2016# play nicely and I don't care. :) I have worked around the problem. -Hugo, 06/27/2002
2017    if [ "$disksize" = "1722" ] ; then
2018        gzip -dc $MINDI_LIB/sys-disk.raw.gz > $imagefile || Die "Cannot dd blank file"
2019    else
2020        dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
2021        mkfs.vfat $imagefile
2022        syslinux $imagefile
2023    fi
2024    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
2025# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
2026    old_pwd=`pwd`
2027    MakeSyslinuxMessageFile $mountpoint/message.txt
2028    cd $mountpoint
2029    [ -e "$sys_cfg_file" ] || Die "Obi Wan, word up?"
2030#    tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n" <--- present for LILO; is it nec. for SYSLINUX too?
2031    cat $sys_cfg_file | HackSyslinuxFile $ramdisk_size $mountpoint > syslinux.cfg || Die "Cannot copy syslinux.cfg from mindi_home to tmp_root"
2032    if [ -e "$MONDO_TMP/start-nfs" ] ; then
2033        mv syslinux.cfg syslinux.cfg.orig
2034        sed s/interactive/iso/ syslinux.cfg.orig > syslinux.cfg
2035    fi
2036    cd $old_pwd
2037    echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint/initrd.img..." >> $LOGFILE
2038    cp -f $TMP_ROOT/mindi.rdz $mountpoint/initrd.img 2>> $LOGFILE
2039    if [ "$?" -ne "0" ] ; then
2040        LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
2041        cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
2042        LogIt "Please unload some of your modules and try again.\n"
2043        rm -f $TMP_ROOT/mtpt.$$
2044        LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
2045        retval=$(($retval+1))
2046    fi
2047
2048    mkdir -p $mountpoint/tmp
2049    cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
2050
2051# copy the kernel across
2052    rm -Rf $mountpoint/lost+found
2053    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2054    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2055    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
2056    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2057        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2058        du -sk $mountpoint/* >> $LOGFILE
2059        echo "--- end of list of files ---" >> $LOGFILE
2060        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2061Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2062        rm -f $mountpoint/vmlinuz
2063        cd $old_pwd
2064        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2065        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2066#   losetup /dev/loop0 -d
2067
2068        res=0
2069        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2070        res=$(($res+$?))
2071        cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
2072        res=$(($res+$?))
2073        rm -f $imagefile
2074        if [ "$res" -ne "0" ]; then
2075            LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2076            rm -f $imagesdir/mindi-*.1440.img
2077        fi
2078        return $res
2079    fi
2080    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2081    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2082    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2083    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2084# make it bootable
2085    rm -f $mountpoint/zero
2086    mkdir -p $mountpoint/etc
2087    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2088    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2089    echo -en "..."
2090    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2091
2092    if [ "$retval" -eq "0" ] ; then
2093        echo -en "...$DONE\r"
2094        if [ "$KERN_DISK_MADE" ] ; then
2095            rm -f $imagefile
2096            LogIt "... $disksize KB boot disks were created OK\r"
2097        fi
2098    else
2099        echo -en "...failed\r"
2100        LogIt $disksize"KB boot disk was NOT created\r"
2101        rm -f $imagefile
2102    fi
2103    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2104    return $retval
2105}
2106
2107
2108
2109
2110PrepareDataDiskImages() {
2111    local needlist bigdir minidir_root tardir diskdir imagesdir res i j k old_pwd lines
2112
2113    imagesdir=$1
2114    rm -f $imagesdir/mindi-*.img $imagesdir/[0-9]*.tar.gz $imagesdir/mindi.iso
2115    needlist=$TMP_ROOT/what-we-need.txt
2116    bigdir=$TMP_ROOT/bigdir
2117    minidir_root=$TMP_ROOT/minidir
2118    mkdir -p $minidir_root
2119    mkdir -p $bigdir/usr/bin
2120    tardir=$TMP_ROOT/tardir
2121
2122    lines=`grep -vx " *#.*" $MINDI_CONF/deplist.txt | grep -vx "" | wc -l`
2123    cat $MINDI_CONF/deplist.txt | GenerateGiantDependencyList $needlist $lines
2124    res=$?
2125    if [ "$YOUR_KERNEL_SUCKS" ]; then
2126    pwd=`pwd`
2127    cd $TMP_ROOT
2128        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2129        cp --parents -pRdf ./$i $bigdir || Die "PDDI can't cp $i->$bigdir"
2130        if [ "`du -sk $i | cut -f1`" -lt "$(($CHOPSIZE*2))" ] ; then
2131        cp --parents -pRdf $i $bigdir
2132        else
2133        ChopUpAndCopyFile $i $bigdir $CHOPSIZE $BIGNO
2134        BIGNO=$(($BIGNO+1))
2135        fi
2136    done
2137    for i in $EXTRA_MODS ; do
2138        j=`find lib/modules/$FAILSAFE_KVER -name $i.*o 2> /dev/null`
2139        [ ! "$j" ] && echo "Warning - cannot find failsafe module $i.o" >> $LOGFILE
2140        for k in $j ; do
2141        if [ "`du -sk $k | cut -f1`" -lt "$CHOPSIZE" ] ; then
2142            cp --parents -pRdf $k $bigdir
2143        else
2144            ChopUpAndCopyFile $k $bigdir $CHOPSIZE $BIGNO
2145            BIGNO=$(($BIGNO+1))
2146        fi
2147        echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2148        done
2149    done
2150    cd $pwd
2151    else
2152    ListKernelModulePaths >> $needlist
2153    fi
2154    if [ "$res" -ne "0" ] ; then
2155        Die "You have $res file`PluralOrNot $res` present in dependency list\nbut absent from filesystem."
2156    fi
2157    FindAndAddUserKeyboardMappingFile
2158    mkdir -p $bigdir/tmp
2159    if [ "`DidMondoCallMe`" ] ; then
2160        MakeMondoConfigFile $TMP_ROOT/mondo-restore.cfg
2161        cp -f $TMP_ROOT/mondo-restore.cfg $bigdir/tmp &> /dev/null
2162        cp -f $TMP_ROOT/mondo-restore.cfg $CACHE_LOC &> /dev/null
2163    fi
2164    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2165    DropOptimizedLibraries $needlist $bigdir
2166    echo -en "Assembling dependency files"
2167    CopyDependenciesToDirectory < $needlist $bigdir
2168
2169# also copy io.sys and msdos.sys, if we can find them
2170    for i in `mount | cut -d' ' -f3` ; do
2171    for j in io.sys msdos.sys ; do
2172        [ -e "$i/$j" ] && cp -f $i/$j $bigdir
2173    done
2174    done
2175
2176# master boot record, too
2177    i=`cat $MONDO_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2178    if [ "$i" ] ; then
2179    LogIt "Backing up $i's MBR\n"
2180    dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2181# < < E O F
2182    sleep 1
2183    sync
2184#        [ "$?" -ne "0" ] && echo "Failed to save $i's MBR to bigdir" >> $LOGFILE
2185    j=$i
2186    [ -h "$j" ] && j=`ResolveSoftlink $j`
2187    LogIt "Creating /dev/boot_device ($j)\n"
2188    mkdir -p $bigdir/dev
2189    cp -pRdf $j $bigdir/dev/boot_device || Die "Unable to create /dev/boot_device on ramdisk"
2190    fi
2191
2192# more stuff
2193#    cp -f $MINDI_LIB/embleer* $bigdir
2194    old_pwd=`pwd`
2195    cd $bigdir
2196
2197    [ -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'."
2198    cp -Rdf $MINDI_LIB/aux-tools/* . 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping aux-tools\n"
2199    if [ -e "$MINDI_LIB/x11-tools.tgz" ] ; then
2200    tar -zxf $MINDI_LIB/x11-tools.tgz 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping x11-tools.tgz\n"
2201    fi
2202    if [ -e "$MONDO_SHARE/restore-scripts" ] ; then
2203        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2204        [ "$?" -ne "0" ] && [ "`DidMondoCallMe`" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2205    fi
2206    [ -d "/lib/dev-state" ] && cp --parents -pRdf /lib/dev-state .
2207    cd $old_pwd
2208    echo -e "$DONE"
2209    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2210    SplitDirectoryIntoMinidirs $bigdir $minidir_root
2211    noof_disks=$?
2212    [ "$noof_disks" -eq "0" ] && Die "Too much stuff!"
2213#    if [ "$noof_disks" -ge "8" ] ; then
2214#        LogIt "You are putting a ludicrously large amount of data on these disks."
2215#        LogIt "I shall therefore double EXTRA_SPACE, just in case your ramdisk is too small."
2216#        EXTRA_SPACE=$(($EXTRA_SPACE*2))
2217#    fi
2218    MakeMountlist $TMP_ROOT/mountlist.txt
2219    mkdir -p $minidir_root/$noof_disks/tmp
2220    cp -f $TMP_ROOT/mountlist.txt $minidir_root/$noof_disks/tmp/mountlist.txt || Die "Cannot copy mountlist.txt from $TMP_ROOT to data disk"
2221    cp -f $TMP_ROOT/mountlist.txt $CACHE_LOC
2222    [ "`DidMondoCallMe`" ] && cp -f $minidir_root/$noof_disks/tmp/mountlist.txt $MONDO_TMP/.
2223    [ -d "/proc/lvm" ] && $MINDI_LIB/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
2224    [ -d "/dev/mapper" ] && $MINDI_LIB/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
2225    cat $minidir_root/$noof_disks/tmp/mountlist.txt >> $LOGFILE
2226    ZipMinidirsIntoTarballs $minidir_root $tardir $noof_disks
2227    CreateDataDiskImagesFromTarballs $tardir $imagesdir $noof_disks
2228    FRIENDLY_OUTSTRING="Boot and data disk images were created."
2229# One 1.72MB boot disk, one 2.88MB boot disk and $noof_disks data disk images
2230    rmdir $tardir $bigdir
2231    rm -f $needlist
2232    return $noof_disks
2233}
2234
2235
2236ProcessLDD() {
2237    local main_fname incoming j i fname f newf
2238    main_fname=$1
2239    read incoming
2240    while [ "$incoming" != "" ] ; do
2241        incoming=`echo "$incoming" | sed '/[[:blank:]]*.*[[:blank:]]*=>[[:blank:]]*(.*/d ; s/[[:blank:]]*\(.*\)[[:blank:]]*=>[[:blank:]]*\/.*/\1/ ; s/[[:blank:]]*\(\/.*\)[[:blank:]]*(.*/\1/'`
2242        for fname in `echo "$incoming"` ; do
2243            fname=`LocateFile $fname`
2244            for f in $fname ; do
2245                [ -e "$f" ] && echo $f
2246            done
2247        done
2248        read incoming
2249    done
2250}
2251
2252
2253
2254Prompt() {
2255    echo -en "$1"
2256    read line
2257}
2258
2259
2260
2261ReadLine() {
2262    local i incoming
2263    read incoming
2264    i=0
2265    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2266    i=$(($i+1))
2267    read incoming
2268    done
2269    echo "$incoming"
2270}
2271
2272
2273
2274RejigHyperlinks() {
2275    local minidir_root noof_disks fname path diskno old_pwd awk_loc gawk_loc dir i
2276    minidir_root=$1
2277    noof_disks=$2
2278
2279    old_pwd=`pwd`
2280    diskno=1
2281    while [ "$diskno" -le "$noof_disks" ] ; do
2282    mkdir -p $minidir_root/$diskno
2283        cd $minidir_root/$diskno
2284        for fname in `find -type d -o -print` ; do
2285            [ -h "$minidir_root/$diskno/$fname" ] && MoveHyperlinkSensibly $fname $minidir_root $diskno $noof_disks
2286        done
2287    diskno=$(($diskno+1))
2288    done
2289
2290
2291    cd $old_pwd
2292    return
2293
2294
2295
2296# do some awk/gawk stuff
2297    cd $minidir_root
2298    awk_loc=`find -name awk`
2299    gawk_loc=`find -name gawk`
2300    if [ "$awk_loc" = "" ] && [ "$gawk_loc" != "" ] ; then
2301        for i in $gawk_loc ; do HackAwk $i gawk ; done
2302    elif [ "$gawk_loc" = "" ] && [ "$awk_loc" != "" ] ; then
2303        for i in $awk_loc ; do HackAwk $i awk ; done
2304    elif [ "$gawk_loc" != "" ] && [ "$awk_loc" != "" ] ; then
2305        echo -en "Gawk/awk found. Good.\r"
2306    else
2307        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? :-)"
2308    fi
2309    cd $old_pwd
2310}
2311
2312
2313
2314EliminateRelatives() {
2315# eliminate /../../..... from path string
2316    local orig i old_i newo
2317    newo=$1
2318    while [ "`echo "$newo" | grep "\.\."`" ] ; do
2319        orig="`echo "$newo" | tr -s '/' '/'`"
2320#        echo "orig=$orig"
2321        newo="/"
2322        old_i=""
2323        for i in `echo "$orig" | tr '/' ' '` ; do
2324            if [ ! "$old_i" ] ; then
2325                old_i=$i
2326                continue
2327            fi
2328            if [ "$old_i" ] && [ "$i" = ".." ] ; then
2329                if [ "$old_i" = ".." ] ; then
2330                    newo="$newo"$old_i/
2331#                    echo "two --- $old_i $i"
2332                    old_i="$i"
2333                    continue
2334#                else
2335#                    echo "swallowing ($old_i $i)"
2336                fi
2337            elif [ "$old_i" != ".." ] ; then
2338                newo="$newo"$old_i/
2339            fi
2340            old_i=$i
2341        done
2342        newo="$newo"$i
2343    done
2344    echo "$newo"
2345}
2346
2347
2348WhatSoftlinkPointsTo() {
2349    local orig new resolved
2350        orig=$1
2351        new=`ls -l $orig | tr -s ' ' '\t' | $AWK '{printf $NF;}'`
2352        if [ "`echo "$new" | cut -d'/' -f1`" ] ; then
2353            resolved=`dirname $orig`/$new
2354        else
2355            resolved=$new
2356        fi
2357    EliminateRelatives $resolved
2358}
2359
2360
2361
2362
2363
2364ReplaceIndividualLine() {
2365    local orig_file new_file lino newstring lines_total lines_remaining
2366    orig_file=$1.orig
2367    mv -f $1 $orig_file || Die "Cannot move $1 to $orig_file"
2368    new_file=$1
2369    lino=$2
2370    newstring="$3"
2371    if [ "$lino" = "" ] || [ "$lino" -lt "1" ] ; then
2372    echo "Can't find string" >> $LOGFILE
2373    return 1
2374    fi
2375    lines_total=`wc -l $orig_file | gawk '{print $1;}'`
2376    lines_remaining=$(($lines_total-$lino))
2377    head -n$(($lino-1)) $orig_file > $new_file
2378    echo "$newstring" >> $new_file
2379    echo "# The above line was added by Mindi, at the user's instruction" >> $new_file
2380    tail -n$lines_remaining $orig_file >> $new_file
2381    echo "Replace line $lino of $new_file with user-specified line, '$newstring'" >> $LOGFILE
2382#    cp -f $new_file /tmp/init.new
2383    [ -x "$orig_file" ] && chmod +x $new_file
2384    rm -f $orig_file
2385    return 0
2386}
2387
2388
2389
2390
2391ResolveSoftlink() {
2392    local resolved new
2393    resolved=$1
2394    while [ -h "$resolved" ] ; do
2395        resolved=`WhatSoftlinkPointsTo $resolved`
2396    done
2397    echo "$resolved"
2398}
2399
2400
2401
2402
2403ScanCDandTape() {
2404    local i
2405
2406    for i in /dev/st0 /dev/ht0 /dev/cdrom /dev/cdrom0 /dev/cdrom 1 ; do
2407        dd if=$i of=/dev/null bs=64k count=1 &> /dev/null
2408    done
2409}
2410
2411
2412
2413SizeOfPartition() {
2414    local devpath drive res stub
2415    device=$1
2416    if [ "`echo "$device" | fgrep "/dev/md"`" != "" ] ; then
2417    res=`SizeOfRaidPartition $device`
2418    [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2419    echo "$res"
2420    return 0
2421    fi
2422#    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/-//`
2423# patch from Bill <bill@iwizard.biz> - 2003/08/25
2424    res=`$FDISK -s $device`
2425    echo "------- $FDISK -l $device log ------------" >> $LOGFILE
2426    cat $FDISKLOG >> $LOGFILE
2427    echo "------- $FDISK log end ------------" >> $LOGFILE
2428# end patch
2429    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | fgrep "$device " | cut -d' ' -f2`
2430    [ "$res" = "" ] && res="-1"
2431    echo $res
2432    return 0
2433}
2434
2435
2436SizeOfRaidPartition() {
2437    local real_dev smallest_size silly tmp
2438
2439    silly=999999999
2440    smallest_size=$silly
2441
2442    for real_dev in `GetRaidDevMembers $1` ; do
2443    tmp=`SizeOfPartition $real_dev`
2444    [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2445    done
2446
2447    if [ "$smallest_size" = "$silly" ] ; then
2448    echo "-1"
2449    return 1
2450    else
2451    echo "$smallest_size"
2452    return 0
2453    fi
2454}
2455
2456
2457
2458
2459
2460
2461StripComments()
2462{
2463    local tempfile
2464    tempfile=$TMP_ROOT/$$.strip.txt
2465    cp -f $1 $tempfile
2466    $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2467    rm -f $tempfile
2468    echo "Stripped comments from $2" >> $LOGFILE
2469}
2470
2471
2472
2473
2474
2475
2476SplitDirectoryIntoMinidirs() {
2477    local bigdir minidir_root i noof_disks old_pwd res
2478    bigdir=$1
2479    minidir_root=$2
2480    rm -Rf $minidir_root/*
2481
2482    TryToFitDataIntoSeveralDirs $bigdir $minidir_root
2483    noof_disks=$?
2484    if [ "$noof_disks" -eq "0" ] ; then
2485    echo "Failed to fit data into several dirs."
2486        return 0
2487    fi
2488    RejigHyperlinks $minidir_root $noof_disks
2489    rm -Rf $bigdir/*
2490   return $noof_disks
2491}
2492
2493
2494
2495StripExecutable()
2496{
2497    local tmpfile
2498    tmpfile=$TMP_ROOT/stripped.$$.dat
2499    [ -d "$1" ] || [ -h "$1" ] && return
2500    cp -f $1 $tmpfile
2501    strip $tmpfile 2> /dev/null
2502    if [ "$?" -eq "0" ] ; then
2503    cp -f $tmpfile $1
2504    echo "Stripped binary $2" >> $LOGFILE
2505    fi
2506    rm -f $tmpfile
2507}
2508
2509
2510TemporarilyCompressAllFiles() {
2511    local i orig_fname out_fname out_list
2512
2513    i=0
2514    out_list=$2/compressed/compressed.txt
2515    mkdir -p $2/compressed
2516    > $out_list
2517    for orig_fname in $1 ; do
2518        out_fname=$2/compressed/$orig_fname.gz
2519        mkdir -p $out_fname 2> /dev/null
2520        rmdir $out_fname 2> /dev/null
2521        gzip -c6 $orig_fname > $out_fname 2> /dev/null
2522        i=$(((($i+1))%15))
2523        [ "$i" -eq "0" ] && echo -en "."
2524        du -sk $out_fname >> $out_list
2525    done
2526}
2527
2528
2529
2530TryToFindKernelPath() {
2531    local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2532    we_want_version=`uname -r`
2533    possible_kernels=""
2534    duff_kernels=""
2535   
2536    if [ "$ARCH" = "ia64" ] ; then
2537       root="/boot/efi/efi"
2538    else
2539       root="/"
2540    fi
2541    for fname in `find $root -maxdepth 2 -type f | fgrep lin | fgrep -v /proc/` ; do
2542    [ ! -e "$fname" ] && continue
2543        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2544    file $fname | grep -q gzip
2545    if [ "$?" -eq "0" ] ; then
2546        # Used by ia64
2547            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2548    else
2549            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2550    fi
2551        [ "$fkern_ver" = "" ] && continue
2552#   echo "$fname --> $fkern_ver (but we want $we_want_version)" >> /dev/stderr
2553        [ "`echo "$fkern_ver" |fgrep "$we_want_version "`" = "" ] && continue
2554    [ -f "$fname" ] || continue
2555    [ -h "$fname" ] && continue
2556    kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2557    file $fname | grep -q gzip
2558    if [ "$?" -eq "0" ] ; then
2559        # Used by ia64
2560        if [ "`gzip -cd $fname | strings 2> /dev/null | fgrep "$kdate"`" = "" ] ; then
2561            LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it...\n"
2562            duff_kernels="$fname $duff_kernels"
2563        else
2564                [ "`echo "$fname" | fgrep "vmlinux"`" ] && continue
2565                possible_kernels="$fname $possible_kernels"
2566        fi
2567    else
2568        if [ "`strings $fname 2> /dev/null | fgrep "$kdate"`" = "" ] ; then
2569            LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it...\n"
2570            duff_kernels="$fname $duff_kernels"
2571        else
2572                [ "`echo "$fname" | fgrep "vmlinux"`" ] && continue
2573                possible_kernels="$fname $possible_kernels"
2574        fi
2575    fi
2576    done
2577    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2578    possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2579    fi
2580    if [ ! "$possible_kernels" ] ; then
2581        LogIt "No kernel matches exactly. Are there any duff kernels?\n"
2582        possible_kernels="$duff_kernels"
2583        if [ ! "$possible_kernels" ] ; then
2584            LogIt "Sorry, no duff kernels either\n"
2585        else
2586            LogIt "I bet you're running Debian or Gentoo, aren't you?\n"
2587            LogIt "Your kernel doesn't have a sane builddate. Oh well...\n"
2588        fi
2589    fi
2590    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2591    noof_kernels=`CountItemsIn "$possible_kernels"`
2592    if [ "$noof_kernels" -eq "0" ] ; then
2593        LogIt "Could not find your kernel.\n"
2594    if [ -e "/boot/vmlinuz" ] ; then
2595        LogIt "Using /boot/vmlinuz as a last resort.\n"
2596        output=/boot/vmlinuz
2597        else
2598        output=""
2599    fi
2600    elif [ "$noof_kernels" -eq "1" ] ; then
2601        kernelpath=`echo "$possible_kernels" | sed s/' '//`
2602        echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2603        output="$kernelpath"
2604    else
2605        for i in $possible_kernels ; do
2606            if echo $i | grep "`uname -r`" ; then
2607        LogIt "OK, I used my initiative and found that "
2608                LogIt "$i is probably your kernel.\n "
2609        output="$i"
2610        return
2611        fi
2612        done
2613    if echo " $possible_kernels " | fgrep "/boot/vmlinuz " &> /dev/null ; then
2614        output=/boot/vmlinuz
2615        echo "Schlomo, this one's for you." >> $LOGFILE
2616    else
2617            LogIt "Two or more possible kernels found. You may specify any one of them and the \n"
2618        LogIt "boot disks will still work, probably. If one does not work, try another.\n"
2619            LogIt "$possible_kernels\n"
2620            echo ""
2621    fi
2622    fi
2623    echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2624}
2625
2626
2627
2628
2629
2630TryToFitDataIntoSeveralDirs() {
2631    local bigdir minidir_root noof_disks diskno list_of_files filename old_pwd progress
2632    local i retval noof_disks total_files list_of_devs
2633    bigdir=$1
2634    minidir_root=$2
2635    BIG_CLUNKY_SIZE_COUNTER=0
2636    retval=0
2637    noof_disks=1
2638
2639    echo -en "\r                                                                            \rDividing data into several groups..."
2640    old_pwd=`pwd`
2641    cd $bigdir
2642    list_of_files=`GetFileSizeList . | sort -nr | cut -f2 | fgrep -v "/dev/"`
2643    progress=0
2644    total_files=`CountItemsIn "$list_of_files"`
2645    if [ "`echo "$filename" | grep -x "/dev/.*"`" ] ; then
2646        filesize=1
2647    fi
2648    mkdir -p $minidir_root/$noof_disks
2649    if [ -e "dev" ] ; then
2650        echo "Copying dev/* to $minidir_root/$noof_disks" >> $LOGFILE
2651        cp --parents -pRdf dev $minidir_root/$noof_disks
2652    fi
2653    TemporarilyCompressAllFiles "$list_of_files" $minidir_root
2654    for filename in $list_of_files ; do
2655        AddFileToDir $filename $minidir_root $noof_disks
2656    i=$?
2657    if [ "$i" -gt "$noof_disks" ] ; then
2658        noof_disks=$i
2659        echo -en "\r\t\t\t\t\t\t($noof_disks disks)"
2660    fi
2661    if [ "$i" -eq "0" ] ; then
2662        LogIt "Cannot add file $filename to minidir $minidir_root\n"
2663        retval=$(($retval+1))
2664    fi
2665        progress=$(($progress+1))
2666    echo -en "\r\t\t\t\t\t\t\t\t$(($progress*100/$total_files))% complete\r"
2667    done
2668    cd $old_pwd
2669    echo -en "\rThe files have been subdivided into $noof_disks directories.                                                            \r"
2670    rm -Rf $minidir_root/compressed
2671    if [ "$retval" -gt "0" ] ; then
2672    return 0
2673    else
2674    return $noof_disks
2675    fi
2676}
2677
2678
2679
2680TurnTgzIntoRdz() {
2681    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
2682    tgz_dir_fname=$1
2683    rdz_fname=$2
2684    ramdisksize=$3
2685    disksize=$4
2686    kernelsize=$5
2687    maxsize=$(($disksize-$kernelsize))
2688    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2689    tempfile=$TMP_ROOT/temp.rd
2690    mountpoint=$TMP_ROOT/mnt1
2691    res=0
2692    echo -en "..."
2693    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2694    echo -en "..."
2695    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE
2696
2697    [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
2698    rm -f /tmp/mke2fs.$$
2699    echo -en "..."
2700    mkdir -p $mountpoint
2701    mount -t ext2 -o loop $tempfile $mountpoint || Die "Cannot loopmount $tempfile to $mountpoint"
2702    echo -en "..."
2703    old_pwd=`pwd`
2704    cd $mountpoint
2705#    [ -e "$MINDI_LIB/memtest.img" ] && echo "Yep, this is a multi-function CD" > MULTIFUNC
2706    cp -Rdf $tgz_dir_fname/* . 2>> $LOGFILE >> $LOGFILE
2707    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2708    cd dev || Die "Can't cd to dev"
2709    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2710    rm -f dev-entries.tgz
2711    cd ..
2712
2713# add insmod.static and insmod.static.old if (a) they exist and (b) this is a 64-bit distro
2714#    if [ "`uname -a | grep x86`" ] || [ "`uname -a | grep amd64`" ] ; then
2715
2716    for w in insmod.static insmod.static.old ; do
2717    s=`which $w 2> /dev/null`
2718    if [ -e "$s" ] ; then
2719        cp --parents -af $s .
2720#       LogIt "Copying $s to initrd"
2721    fi
2722    done
2723
2724#    fi
2725
2726    mkdir -p tmp
2727    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2728    for w in cdrom floppy groovy-stuff ; do
2729        mkdir -p mnt/$w
2730    done
2731    if [ "$RUN_AFTER_INITIAL_BOOT_PHASE" ] ; then
2732    ReplaceIndividualLine sbin/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" sbin/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
2733    fi
2734    if [ "$RUN_AFTER_BOOT_PHASE_COMPLETE" ] ; then
2735    ReplaceIndividualLine sbin/init `grep -n "#ABSORBENTANDYELLOWANDPOROUSISHE#" sbin/init | cut -d':' -f1` "$RUN_AFTER_BOOT_PHASE_COMPLETE"
2736    fi
2737
2738    lsmod > tmp/original-lsmod.txt
2739   
2740    cp --parents -Rdf /dev/fd0*[1,2][4,7,8]* . 2> /dev/null
2741    cd $old_pwd
2742    echo -en "..."
2743    MakeModuleLoadingScript $TMPMODPROBE_FLAG $mountpoint/sbin/insert-all-my-modules
2744    echo -en "..."
2745    old_pwd=`pwd`
2746    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2747    cd $TMP_ROOT
2748    floppy_modules_path=lib/modules/$FAILSAFE_KVER
2749    else
2750    cd /
2751###
2752### Sq-Modification... Use kernel name in module path if specified.
2753###
2754        #floppy_modules_path=lib/modules/`uname -r`
2755        if [ "${kernelname}" != "" ]
2756        then
2757          floppy_modules_path=lib/modules/${kernelname}
2758        else
2759          floppy_modules_path=lib/modules/`uname -r`
2760        fi
2761###
2762### Sq-Modification end
2763###
2764    fi
2765    floppy_modules=""
2766    if [ "$disksize" -lt "2880" ] ; then
2767        list_of_groovy_mods="$FLOPPY_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2768    else
2769        list_of_groovy_mods="$CDROM_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2770    fi
2771    if [ -e "$MONDO_TMP/start-nfs" ] ; then
2772        cp -a $MONDO_TMP/start-nfs $mountpoint/sbin
2773        # For PXE boot
2774        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2775        # Here we need the net busybox
2776        mv $mountpoint/bin/busybox.net $mountpoint/bin/busybox
2777    else
2778        rm -f $mountpoint/bin/busybox.net
2779    fi
2780    [ -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"
2781    for i in $list_of_groovy_mods ; do
2782    floppy_modules="$floppy_modules `FindSpecificModuleInPath $floppy_modules_path $i`"
2783    done
2784    for i in $floppy_modules ; do
2785        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2786    [ "$YOUR_KERNEL_SUCKS" ] && i=$TMP_ROOT/$i
2787    echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2788    cp -df $i $mountpoint/ || LogIt "Unable to copy $i to $mountpoint\n"
2789    [ "`echo "$i" | fgrep ".gz"`" ] && gunzip -f $mountpoint/`basename $i`
2790    done
2791#    if [ -e "/dev/.devfsd" ] ; then
2792#   echo "Copying devfs stuff to ramdisk" >> $LOGFILE
2793#   for i in /dev /etc/devfsd.conf /etc/modules.devfs /lib/dev-state ; do
2794#       cp --parents -pRdf $i $mountpoint/ 2>> $LOGFILE
2795#   done
2796#    fi
2797    if [ ! -e "/sbin/devfsd" ] || [ "$disksize" -lt "2880" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2798        echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2799        [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2800        [ "$disksize" -lt "2880" ] && echo "...because disksize = $disksize" >> $LOGFILE
2801        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2802#        ls -l $mountpoint/sbin/devfsd &> /dev/null || Die "Can't find devfsd daemon on ramdisk"
2803        rm -f $mountpoint/sbin/devfsd
2804    fi
2805    cd $old_pwd
2806    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2807    dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2808    rm -f $mountpoint/zero
2809    if [ "`DidMondoCallMe`" ] ; then
2810        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2811        cp -f $mountpoint/tmp/mondo-restore.cfg $MONDO_TMP &> /dev/null
2812        cp -f $TMP_ROOT/mountlist.txt $mountpoint/tmp/ || Die "Cannot copy mountlist to ramdisk"
2813        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2814        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2815        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2816        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2817        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2818    fi
2819    mkdir -p $mountpoint/tmp
2820    mkdir -p $mountpoint/proc
2821    echo "$disksize" > $mountpoint/tmp/$disksize.siz
2822    find $mountpoint -name CVS -exec rm -rf '{}' \;
2823    umount $mountpoint || Die "Cannot unmount $tempfile"
2824    dd if=$tempfile bs=1k 2> /dev/null | gzip -v9 > $rdz_fname 2> /dev/null
2825#    gzip -9 $tempfile
2826#    mv $tempfile.gz $rdz_fname
2827    if [ "$res" -eq "0" ] ; then
2828        echo -en "..."
2829    else
2830        echo -en "\rMade an rdz WITH ERRORS.           \n"
2831    fi
2832    return 0
2833}
2834
2835
2836
2837WhichOfTheseModulesAreLoaded() {
2838    local modname loaded_modules
2839    loaded_modules=" `lsmod | tr -s ' ' '\t' | cut -f1 | fgrep -vx "Modules" | tr '\n' ' '` "
2840    for modname in $1 ; do
2841    [ "`echo "$loaded_modules" | fgrep " $modname "`" ] && echo "$modname"
2842    done
2843}
2844
2845
2846
2847
2848ZipMinidirsIntoTarballs() {
2849    local minidir_root tardir noof_disks diskno old_pwd i
2850    minidir_root=$1
2851    tardir=$2
2852    noof_disks=$3
2853
2854    echo -en "Tarring and zipping the group`PluralOrNot $noof_disks`..."
2855    mkdir -p $tardir
2856    mkdir -p $minidir_root/all
2857    old_pwd=`pwd`
2858    diskno=1
2859    while [ "$diskno" -le "$noof_disks" ] ; do
2860        cd $minidir_root/$diskno || LogIt "Warning - cannot cd to $minidir_root/$diskno\n"
2861        tar -cf - . 2>> $LOGFILE | gzip -9 > $tardir/$diskno.tar.gz || Die "Can't tar/gzip disk#$diskno; please tell Hugo -exactly- what the errors where."
2862        diskno=$(($diskno+1))
2863        echo -n "..."
2864    cp -pRdf * $minidir_root/all
2865    done
2866    mkdir -p $minidir_root/all/tmp
2867    cd $minidir_root/all
2868    size_of_all_tools=`du -sk . | cut -f1`
2869    if [ "`DidMondoCallMe`" ] ; then
2870        for q in filelist.full.gz biggielist.txt ; do
2871            [ ! -e "$MONDO_TMP/$q" ] && Die "Cannot find $MONDO_TMP/$q"
2872            cp -pRdf $MONDO_TMP/$q tmp/
2873        done
2874        mkdir -p $minidir_root/all/tmp
2875        echo -en "$FILES_IN_FILELIST" > $minidir_root/all/tmp/FILES-IN-FILELIST 2> /dev/null
2876        echo -en "$LAST_FILELIST_NUMBER" > $minidir_root/all/tmp/LAST-FILELIST-NUMBER 2> /dev/null
2877    fi
2878    tar -b 4096 -cf - * 2> /dev/null | gzip -9 > $tardir/all.tar.gz
2879    dd if=/dev/zero bs=1k count=64 >> $imagesdir/all.tar.gz 2> /dev/null
2880    [ "`du -sm $imagesdir/all.tar.gz | cut -f1`" -ge "30" ] && Die "You have too many tools in your shed"
2881    cd $old_pwd
2882    rm -Rf $minidir_root
2883    echo -e "$DONE"
2884}
2885
2886
2887
2888# BERLIOS: This function is wrong
2889# Should be recoded. Desactivated in between
2890
2891#ListUnsavedKernelModules() {
2892    #local fname modules
2893    #fname=/tmp/$RANDOM.$$.$RANDOM
2894    #lsmod | sed -n '2,$s/ .*//p' > $fname
2895    #modules=`sort $fname | uniq -d2 | tr '\n' ' '`
2896    #rm -f $fname
2897    #[ "$modules" ] && echo "Unsaved kernel modules: $modules" >> $LOGFILE
2898#}
2899
2900
2901
2902
2903
2904##############################################################################
2905#----------------------------------- main -----------------------------------#
2906##############################################################################
2907
2908
2909#AWK=`which gawk`
2910#LocateDeps $1
2911#MakeModuleLoadingScript /tmp/load-modules.sh
2912#exit 0
2913
2914
2915#cat /etc/mindi/deplist.txt | GenerateGiantDependencyList /tmp/deplist.old 200
2916#exit 0
2917
2918
2919
2920if [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2921    echo "mindi v$MINDI_VERSION"
2922    exit 0
2923fi
2924
2925> $LOGFILE
2926echo "mindi v$MINDI_VERSION" >> $LOGFILE
2927echo "$ARCH architecture detected" >> $LOGFILE
2928echo "mindi called with the following arguments:" >> $LOGFILE
2929echo "$@" >> $LOGFILE
2930
2931if [ -e "/etc/conf.modules" ] && [ ! -e "/etc/modules.conf" ] ; then
2932    LogIt "Warning - Ancient distro detected.\n" 1
2933    ln -sf /etc/conf.modules /etc/modules.conf
2934fi
2935[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2936
2937FindHomeOfMindiAndMondo
2938trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2939AbortIfYourDistroIsAPieceOfStercus
2940[ "`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"
2941# If we have a 2.6 kernel, the system uses module-init-tools which means that we
2942# may have the modprobe configuration spread out across multiple files in
2943# directory /etc/modprobe.d. If this is the case we concatenate these files into
2944# a temporary file for further processing. Otherwise we continue in the standard
2945# way. Note further that in case /etc/modprobe.d exists, we use it and ignore
2946# /etc/modprobe.conf which is exactly what module-init-tools does. The temporary
2947# modprobe.conf file is created in MakeModuleLoadingScript. AL041128.
2948if [ -d "/etc/modprobe.d" ] && [ `uname -r | cut -c1-3` == "2.6" ] ; then
2949  TMPMODPROBE_FLAG="Y"
2950else
2951  TMPMODPROBE_FLAG="N"
2952  [ -e "/etc/modprobe.conf" ] && [ ! -e "/etc/modules.conf" ] && ln -sf /etc/modprobe.conf /etc/modules.conf
2953  [ ! -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..."
2954fi
2955FixPathIfBroken
2956[ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | egrep "2\.[46]" | cut -d' ' -f1`
2957AbortIfMkfsVfatMissing
2958### BCO
2959### Fix as it's not mandatory on ia64
2960if [ "$ARCH" = "ia64" ] ; then
2961    FindELiloBinary
2962else
2963    FindIsolinuxBinary
2964    FindLiloBinary
2965fi
2966fgrep " $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
2967rm -f /tmp/mindi_lo
2968trap "Aborted" SIGTERM
2969DONE="\r\t\t\t\t\t\t\t\tDone.         "
2970CHOPSIZE=240
2971BIGNO=0
2972MAX_COMPRESSED_SIZE=1300
2973imagesdir=/root/images/mindi
2974mkdir -p $imagesdir
2975kernelpath=""
2976MONDO_ROOT=/tmp/mindilinux/mondo-root
2977mkdir -p $MONDO_ROOT
2978
2979if [ "$#" -ge "2" ] ; then
2980    if [ "$1" = "--max-compressed-size" ] ; then
2981        MAX_COMPRESSED_SIZE=$2
2982        shift; shift
2983    fi
2984fi
2985
2986FLOPPY_WAS_MOUNTED=""
2987for mtpt in /media/floppy /mnt/floppy /floppy ; do
2988    if mount | grep -w $mtpt &> /dev/null ; then
2989        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2990        umount $mtpt
2991    fi
2992done
2993
2994if [ "$#" -ne "0" ] ; then
2995    if [ "$1" = "--findkernel" ] ; then
2996        res=`TryToFindKernelPath`
2997#    2> /dev/null`
2998        if [ "$res" = "" ] ; then
2999            exit 1
3000        else
3001            echo "$res"
3002            exit 0
3003        fi
3004    elif [ "$1" = "--makemountlist" ] ; then
3005        [ ! "$2" ] && Die "Please specify the output file"
3006        MakeMountlist $2
3007        exit $?
3008    elif [ "$1" = " --version" ] || [ "$1" = "-v" ] ; then
3009    echo "Mindi v$MINDI_VERSION"
3010        exit 0
3011    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3012    TMP_ROOT=$2
3013    MONDO_TMP=$2
3014    imagesdir=$3
3015    kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3016###
3017### Sq-Modification...
3018### Attempt to locate kernel specific module path
3019### if module path is found then use it other wise use uname -r to set it...
3020###
3021        kernelname=`echo $kernelpath | cut -d'-' -f2-`
3022    LogIt "kernelname = $kernelname\n"
3023    LogIt "kernelpath = $kernelpath\n"
3024        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3025        then
3026           LogIt "Module path for ${kernelpath} not found...\n"
3027           LogIt "using running kernel\'s modules.\n"
3028           kernelname=`uname -r`
3029        else
3030           LogIt "Using modules for kernel: ${kernelname}\n"
3031        fi
3032###
3033### end of Sq-Modification
3034###
3035    TAPEDEV=$5
3036    TAPESIZE=$6
3037    FILES_IN_FILELIST=$7
3038    USE_LZO=$8
3039    CDRECOVERY=$9
3040        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3041            IMAGE_DEVS=""
3042        else
3043            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3044        fi
3045    if [ "${11}" ] ; then
3046        LILO_OPTIONS=""
3047#       LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
3048    fi
3049    LAST_FILELIST_NUMBER=${12}
3050        ESTIMATED_TOTAL_NOOF_SLICES=${13}
3051        EXCLUDE_DEVS="${14}"
3052        USE_COMP="${15}"
3053        USE_LILO="${16}"
3054    USE_STAR="${17}"
3055    INTERNAL_TAPE_BLOCK_SIZE="${18}"
3056        DIFFERENTIAL="${19}"
3057        NOT_BOOT="${20}"
3058        [ "$USE_COMP" = "" ] && USE_COMP=yes
3059        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3060    [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine.\n"
3061    [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3062        kernelname=`echo $kernelpath | cut -d'-' -f2-`
3063        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3064        then
3065           LogIt "Module path for ${kernelpath} not found...\n"
3066           LogIt "using running kernel\'s modules.\n"
3067           kernelname=`uname -r`
3068        else
3069           LogIt "Using modules for kernel: ${kernelname}\n"
3070        fi
3071    [ "$CDRECOVERY" = "yes" ] && [ "$TAPEDEV" != "" ] && Die "Sorry, you can't use --cd-recovery and --write-tapes at the same time"
3072        MONDO_ROOT=`echo $imagesdir | sed 's/\(.*\)\/.*/\1/'`
3073    [ "$MONDO_ROOT" = "" ] && Die "MONDO_ROOT is undefined"
3074    else
3075    echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3076    exit 1
3077    fi
3078fi
3079#ScanCDandTape
3080[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3081if [ "$CDRECOVERY" = "yes" ] ; then
3082    iso_cfg_file=$MINDI_LIB/isolinux-H.cfg
3083    sys_cfg_file=$MINDI_LIB/syslinux-H.cfg
3084else
3085    iso_cfg_file=$MINDI_LIB/isolinux.cfg
3086    sys_cfg_file=$MINDI_LIB/syslinux.cfg
3087fi
3088
3089
3090
3091
3092#ReplaceIndividualLine /tmp/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" /tmp/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
3093#exit 0
3094
3095
3096#ListKernelModules
3097#exit 0
3098
3099
3100
3101
3102[ -e "$iso_cfg_file" ] || Die "Cannot find $iso_cfg_file"
3103rm -Rf $TMP_ROOT/mindilinux/*
3104TMP_ROOT=$TMP_ROOT/mindilinux/$$
3105mkdir -p $TMP_ROOT
3106mkdir -p $imagesdir
3107if [ ! "`DidMondoCallMe`" ] ; then
3108    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION\n"
3109    LogIt "Latest Mindi is available from http://mondorescue.berlios.de\n"
3110    LogIt "BusyBox sources are available from http://www.busybox.net\n"
3111    LogIt "------------------------------------------------------------------------------"
3112else
3113    echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> /var/log/mondo-archive.log
3114fi
3115
3116# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
3117insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
3118for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3119    insmod $i >> $LOGFILE 2>> $LOGFILE
3120done
3121
3122FILE_CACHE=$TMP_ROOT/mindi-file-loc-cache
3123KERN_DISK_MADE=""
3124
3125echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
3126echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
3127echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
3128if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3129    LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else.\n"
3130    MakeMondoConfigFile $MONDO_TMP/mondo-restore.cfg
3131    MakeMountlist $MONDO_TMP/mountlist.txt
3132    mkdir -p $MONDO_TMP/small-all/tmp
3133    cd $MONDO_TMP/small-all
3134    cp -f $MONDO_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp || Die "Cannot copy small all.tar.gz"
3135    tar -cv tmp | gzip -9 > $MONDO_TMP/all.tar.gz || Die "Cannot make small all.tar.gz"
3136    sleep 2
3137    LogIt "Done. Exiting.\n"
3138    exit 0
3139fi
3140
3141if [ "$kernelpath" = "" ] ; then
3142    [ "`DidMondoCallMe`" ] && Die "Please use -k <path> to specify kernel."
3143    if [ $USE_OWN_KERNEL != "yes" ]; then
3144        echo -en "Do you want to use your own kernel to build the boot disk (y/n) ?"
3145        read ch
3146        if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3147            USE_OWN_KERNEL="yes"
3148        fi
3149    fi
3150    if [ "$USE_OWN_KERNEL" = "yes" ]; then
3151    YOUR_KERNEL_SUCKS=""
3152    kernelpath=`TryToFindKernelPath`
3153    if [ "$kernelpath" = "" ] ; then
3154        echo -n "Please enter kernel path : "
3155        read kernelpath
3156    fi
3157    else
3158    YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3159    fi
3160fi
3161if [ ! "`DidMondoCallMe`" ] ; then
3162    echo -en "Would you like to use LILO (instead of syslinux)\nfor your boot CD/floppies (y/n) ?"
3163    read ch
3164    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3165        USE_LILO=yes
3166    else
3167        USE_LILO=no
3168    fi
3169fi
3170if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3171    kernelpath=$MINDI_LIB/vmlinuz
3172    LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks.\n"
3173    LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
3174    LogIt "disks then it may still be a result of a problem with your kernel.\n"
3175    pwd=`pwd`
3176    cd $TMP_ROOT
3177    bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3178    cd $pwd
3179    YOUR_KERNEL_SUCKS="Your kernel sucks"
3180fi
3181echo -e "Mindi's temp dir = $TMP_ROOT \nMindi's output dir=$imagesdir" >> $LOGFILE
3182[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty...\n"
3183rm -f /tmp/mindi.err.*.tgz
3184
3185[ "$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."
3186
3187rm -f /root/images/mindi/{*img,*gz,*iso}
3188
3189PrepareDataDiskImages $imagesdir
3190noof_disks=$?
3191ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3192rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3193ramdisk_size=$rds
3194
3195echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
3196if [ "$USE_LILO" = "yes" ] ; then
3197    if [ "$ARCH" = "ia64" ] ; then
3198        PrepareBootDiskImage_LILO $imagesdir $IA64_BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create ia64 floppy disk image."
3199    else
3200        if ! PrepareBootDiskImage_LILO $imagesdir 1722 $kernelpath $ramdisk_size ; then
3201        LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3202        LogIt "if you want to make a 1.72MB floppy disk.\n"
3203        fi
3204        PrepareBootDiskImage_LILO $imagesdir 2880 $kernelpath $ramdisk_size || Die "Failed to create 2.88MB floppy disk image."
3205    fi
3206else
3207    if ! PrepareBootDiskImage_SYSLINUX $imagesdir 1722 $kernelpath $ramdisk_size ; then
3208        LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3209        LogIt "if you want to make a 1.72MB floppy disk.\n"
3210        if ! PrepareBootDiskImage_SYSLINUX $imagesdir 2880 $kernelpath $ramdisk_size ; then
3211            LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3212            LogIt "Please reduce your kernel's size\n"
3213            LogIt "if you want to make a 2.88MB floppy disk.\n"
3214            PrepareBootDiskImage_SYSLINUX $imagesdir 5760 $kernelpath $ramdisk_size || Die "Failed to create 5.76MB floppy disk image."
3215        fi
3216    fi
3217fi
3218
3219
3220
3221[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3222...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3223
3224
3225if [ ! "`DidMondoCallMe`" ] ; then
3226    ListImagesForUser $imagesdir
3227    boot_dev=/dev/fd0u1722
3228    [ ! -e "$boot_dev" ] && mknod $boot_dev b 2 60
3229    [ ! -e "$boot_dev" ] && boot_dev=/dev/fd0H1722
3230    [ ! -e "$boot_dev" ] && Die "Oh Lord, will you PLEASE tell the vendor to create the 1.72MB devices in /dev?"
3231    if [ "$PROMPT_WRITE_BOOT_FLOPPIES" = "yes" ]; then
3232        OfferToCopyImagesToDisks $imagesdir $boot_dev $FDDEVICE
3233    fi
3234    OfferToMakeBootableISO $imagesdir
3235    LogIt "Finished.\n"
3236elif [ "$TAPEDEV" ] ; then
3237    mkdir -p /root/images/mindi
3238    rm -f /root/images/mindi/{*img,*gz,*iso}
3239    OfferToMakeBootableISO $imagesdir
3240    if [ -e "$imagesdir/all.tar.gz" ] ; then
3241        cp -f $imagesdir/all.tar.gz $MONDO_TMP/
3242    else
3243    Die "Cannot find all.tar.gz, to be written to tape"
3244    fi
3245else
3246    OfferToMakeBootableISO $imagesdir
3247fi
3248if [ "$imagesdir" != "/root/images/mindi" ] ; then
3249    for i in `find $imagesdir -maxdepth 1 -name "*.iso" -o -name "*.img"` ; do
3250    cp -f $i /root/images/mindi || LogIt "[line 3260] Cannot copy $i to /root/images/mindi\n"
3251    done
3252fi
3253[ "$TMP_ROOT" != "/tmp" ] && rm -Rf $TMP_ROOT
3254# cleanup
3255rm -fR /tmp/mountlist.txt.$$ $FDISKLOG /tmp/mindilinux
3256LogIt "$FRIENDLY_OUTSTRING\n"
3257#ListUnsavedKernelModules
3258for mtpt in $FLOPPY_WAS_MOUNTED ; do
3259    mount $mtpt
3260done
3261echo "Mindi is exiting" >> $LOGFILE
3262exit 0
Note: See TracBrowser for help on using the repository browser.