source: MondoRescue/trunk/mindi/mindi @ 929

Last change on this file since 929 was 929, checked in by Bruno Cornec, 13 years ago

mindi conf file improved

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