source: branches/2.0.8/mindi/mindi @ 519

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

merge -r 437:447 $SVN_M/branches/stable
merge -r 461:464 $SVN_M/branches/stable
merge -r 465:472 $SVN_M/branches/stable
merge -r 473:479 $SVN_M/branches/stable
merge -r 480:488 $SVN_M/branches/stable
merge -r 491:494 $SVN_M/branches/stable
merge -r 508:516 $SVN_M/branches/stable

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