source: branches/2.0.8/mindi/mindi @ 576

Revision 576, 108.8 KB checked in by bcornec, 7 years ago (diff)

2.08 synced with stable as of r575
VERSION files updated

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