source: trunk/mindi/mindi @ 489

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

svn merge -r 463:482 $SVN_M/branches/stable
svn merge -r 485:488 $SVN_M/branches/stable

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