source: branches/2.2.9/mindi/mindi @ 2583

Last change on this file since 2583 was 2583, checked in by bruno, 9 years ago
  • Fix reporting when a module is not found (pollutes logs)
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 107.9 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 2583 2010-02-15 19:05:45Z bruno $
4#
5#-----------------------------------------------------------------------------
6# mindi - mini-Linux distro based on the user's filesystem & distribution
7#
8# Mindi can create a multi-image boot/root kit. The first image 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)
16ARCH=`/bin/uname -m`
17KERVERRUN=`/bin/uname -r`
18# By default we use the running kernel as a reference
19KERVER=$KERVERRUN
20
21# In case of problem with udev you can try to add udevdebug
22MINDI_ADDITIONAL_BOOT_PARAMS="devfs=nomount noresume selinux=0 barrier=off udevtimeout=10"
23
24MINDI_REV=PBREV
25MINDI_VER=PBVER
26
27MINDI_VERSION=${MINDI_VER}-r$MINDI_REV
28MINDI_PREFIX=XXX
29MINDI_CONF=YYY
30MINDI_SBIN=${MINDI_PREFIX}/sbin
31MINDI_LIB=LLL
32
33# Temporary directory for mindi
34TMPDIR=/tmp
35
36EXTRA_SPACE=49152       # increase if you run out of ramdisk space
37BOOT_SIZE=16384         # size of the boot disk
38
39PROMPT_MAKE_CD_IMAGE="yes"
40    # Ask if you want to make a CD Image to be written?
41    # if this is set to 'no', then the image will be created automatically
42
43PROMPT_MAKE_USB_IMAGE="yes"
44    # Ask if you want to make a USB Image to be written?
45    # if this is set to 'no', then the image will be created automatically
46
47USE_OWN_KERNEL="yes"
48    # If set to "no", you will be prompted for whether or not
49    # you want to use your own kernel, or the supplied default.
50    # If "yes" mindi will automatically use your own kernel.
51
52MY_FSTAB=/etc/fstab
53TAPE_MODS="ht st osst ide-tape ide_tape"
54SCSI_MODS="3w-xxxx 3w_xxxx 3w_9xxx 3w-9xxx 53c7,8xx a100u2w a320raid aacraid adpahci advansys aha152x aha1542 aha1740 aic79xx aic79xx_mod aic7xxx aic7xxx_mod aic7xxx_old AM53C974 atp870u BusLogic cciss cpqfc dmx3191d dpt_i2o dtc eata eata_dma eata_pio fdomain gdth g_NCR5380 i2o_block i2o_core ide-scsi ieee1394 imm in2000 initio ips iscsi iscsi_tcp libiscsi scsi_transport_iscsi isp megaraid megaraid_mm megaraid_mbox megaraid_sas mptbase mptscsih mptsas mptspi mptfc mptscsi mptctl NCR53c406a ncr53c8xx nsp32 pas16 pci2000 pci2220i pcmcia ppa psi240i qla1280 qla2200 qla2300 qla2400 qla2xxx qla2xxx_conf qlogicfas qlogicfc qlogicisp qlogicfas qlogicfas408 raw1394 scsi_mod scsi_transport_sas scsi_transport_spi scsi_transport_fc sd_mod crc_t10dif crc-t10dif seagate sg sim710 sr_mod sym53c416 sym53c8xx sym53c8xx_2 t128 tmscsim u14-34f ultrastor wd7000 vmhgfs intermodule scsi_dh scsi_tgt emcpdm emcpgpx emcpmpx emcp dc395x diskdumplib scsi_dump_register"
55
56# ide-probe-mod
57IDE_MODS="ide ide-floppy floppy ide-generic ide-detect ide-mod ide-disk ide_disk ide-cd ide_cd ide_cd_mod ide-cd_mod ide-cs ide-core ide_core ide-gd_mod edd paride ata_generic ata_piix libata dock via82cxxx generic nvidia ahci sata_nv cmd64x pata_amd pata_marvell pata_serverworks pata_sis amd74xx sis5513 jmicron sata_promise sata_via serverworks sata_svw blkbk"
58PCMCIA_MODS="pcmcia_core ds yenta_socket"
59USB_MODS="usb-storage usb-ohci usb-uhci usbcore usb_storage input hid uhci_hcd ehci_hcd uhci-hcd ehci-hcd ohci-hcd ohci_hcd usbkbd usbhid keybdev mousedev libusual scsi_mod ff-memless ums_cypress ums-cypress"
60NET_MODS="auth_rpcgss sunrpc nfs nfs_acl lockd fscache loop mii 3c59x e100 bcm5700 bnx2 bnx2x e1000 e1000e igb eepro100 ne2k-pci tg3 libphy pcnet32 8139cp 8139too 8390 forcedeth vmxnet vmxnet3 vmnet exportfs fuse libcrc32c netbk xenblktap"
61CDROM_MODS="$TAPE_MODS $IDE_MODS $USB_MODS $PCMCIA_MODS $SCSI_MODS $NET_MODS af_packet cdrom isocd isofs inflate_fs nls_iso8859-1 nls_base nls_cp437 nls_utf8 sg sr_mod zlib_inflate iso9660"
62# Those modules will only go on the backup media, not the boot media.
63EXTRA_MODS="$CDROM_MODS vfat fat loop md-mod linear raid0 raid1 xor raid10 raid5 raid456 lvm-mod dm-mod dm_mod dm-snapshot dm_snapshot dm-zero dm_zero dm-mirror dm_mirror dm-multipath dm-round-robin dm-emc dm-hp-sw dm-rdac multipath jfs xfs xfs_support pagebuf reiserfs ext2 ext3 minix nfs nfs_acl nfsd lockd sunrpc jbd mbcache ext4 jbd2 crc16 ocfs2 ocfs2_dlm ocfs2_nodemanager configfs"
64# Replace with that line for HP OCMP e.g.
65#DENY_MODS="MPS_Driver_Mapper mps octtldrv tscttl streams kqemu fdomain"
66DENY_MODS="kqemu"
67# Force some modules to be included
68FORCE_MODS=""
69
70LOGFILE=/var/log/mindi.log
71MINDI_CACHE=/var/cache/mindi
72BOOT_MEDIA_MESSAGE="\
73To format and restore all files automatically, type 'nuke' <enter>.\n\
74To restore some/all files interactively, type 'interactive' <enter>.\n\
75To compare the archives with your filesystem, type 'compare' <enter>.\n\
76To boot to a command-line prompt (expert mode), type 'expert' <enter>.\n\
77You may add one or more of the following parameters as well:-\n\n\
78        donteject - mondorestore will not eject the CD; this is useful if, for\n\
79                    instance, your PC's case has a concealed CD-ROM drive\n\
80        noresize  - your mountlist will not be adjusted to use your unallocated\n\
81                    hard disk space\n\
82        textonly  - do not call any Newt library routines; this is unattractive\n\
83                    but valuable if you find your Newt library has bugs in it\n\n\
84e.g. Type 'nuke donteject textonly' if you have an unstable Newt library and \n\
85a PC whose CD-ROM drive tray would be damaged if it unexpectedly ejected.\n\
86"
87FDISK=$MINDI_SBIN/parted2fdisk
88
89# Using a config file allow to overwrite some values
90MINDI_CONFIG="$MINDI_CONF/mindi.conf"
91if [ -f $MINDI_CONFIG ]; then
92    . $MINDI_CONFIG
93fi
94DEPLIST_FILE="$MINDI_CONF/deplist.txt"
95DEPLIST_DIR="$MINDI_CONF/deplist.d"
96
97ISO_CMD="/usr/bin/mkisofs"
98ISO_OPT="-J -r -v -p Mindi -publisher http://www.mondorescue.org -A Mindi"
99
100# Mandriva system e.g. use cdrkit, which uses genisoimage instead of mkisofs.
101# However, they use exactly the same command line parameters, so just
102# use genisoimage if it's available.
103if [ ! -x $ISO_CMD ]; then
104    ISO_CMD=/usr/bin/genisoimage
105fi
106
107# Now we can create what we need
108MINDI_TMP=`mktemp -d $TMPDIR/mindi.XXXXXXXXXX`
109if [ $? -ne 0 ]; then
110    df $TMPDIR
111    Die "Unable to create a temporary directory ! Check space on $TMPDIR"
112fi
113if [ _"$MINDI_TMP" = _"" ]; then
114    Die "MINDI_TMP is empty, aborting"
115fi
116if [ _"$MINDI_TMP" = _"/" ]; then
117    Die "MINDI_TMP is /, aborting"
118fi
119export MINDI_TMP
120
121# ----------------------------------------------------------------------------
122
123
124AbortHere() {
125    [ "$mountpoint" ] && umount $mountpoint 2>> $LOGFILE
126    Die "Program is terminating in response to signal received from OS/user"
127}
128
129
130Aborted() {
131    trap SIGHUP SIGTERM SIGTRAP SIGINT
132    [ "$MINDI_CACHE" != "" ] && rm -f $MINDI_CACHE/mindi*img $MINDI_CACHE/*gz $MINDI_CACHE/mindi.iso
133    [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
134    Die "User abort."
135}
136
137
138AddFileToCfgIfExists() {
139    [ -e "$1" ] && echo -en "$2 `cat $1`\n" >> $3
140}
141
142
143AddKeyboardMappingFile() {
144    local mappath r included_list included_item i res ii sss
145    mappath=$1
146    KBDEPTH=$(($KBDEPTH+1))
147    [ "$KBDEPTH" -gt "128" ] && Die "Edit $MINDI_SBIN/mindi and disable FindAndAddUserKeyboardMappingFile (line 2160, approx.)"
148    if [ -e "$bigdir/$mappath" ] ; then
149        echo "$mappath already added" >> $LOGFILE
150        return
151    elif [ -d "$bigdir/$mappath" ] ; then
152        echo "Cannot add $mappath: it's a directory. Sorry."
153        return
154    fi
155    echo "Added kbd map $mappath" >> $LOGFILE
156    if [ ! -e "$mappath" ] ; then
157            mappath=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
158        if [ ! -e "$mappath" ] ; then
159            LogIt "Cannot add $mappath: kbd map file not found"
160            return
161        fi
162    else
163        echo -en "`basename $mappath | tr '.' '#' | sed s/#kmap#gz// | sed s/#inc#gz//` " | tr '#' '.'
164    fi
165
166    mkdir -p $bigdir/etc
167    tar cf - -C / $mappath 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogIt "AKMF -- Could not copy $mappath to $bigdir" $MINDI_TMP/$$.log
168    if [ "`echo $mappath | grep -F ".gz"`" ] ; then
169        included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
170    else
171        included_list=`grep -Fi include $mappath | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
172    fi
173    for included_item in $included_list ; do
174        if [ ! -e "$included_item" ] ; then
175                sss=`grep -F "${included_item}.inc" $MINDI_TMP/keymaps.find`
176            [ "$sss" = "" ] && sss=`grep -F "$included_item" $MINDI_TMP/keymaps.find`
177            for ii in $sss ; do
178                [ -e "$ii" ] && AddKeyboardMappingFile $ii
179            done
180        else
181            AddKeyboardMappingFile $included_item
182        fi
183    done
184}
185
186
187CopyDependenciesToDirectory() {
188    local outdir incoming fname counter d found
189    outdir=$1
190    mkdir -p $outdir
191    incoming=`ReadLine`
192    counter=0
193    while [ "$incoming" != "" ] ; do
194        # Non absolute file names should not arrive till here => skipped
195        if [ `echo "$incoming" | cut -c1` != '/' ]; then
196            LogIt "Unable to handle $incoming"
197            incoming=`ReadLine`
198            continue
199        fi
200        # no parent directory of incoming should be a link, copy is not possible in that case
201        d=`dirname "$incoming"`
202        found="false"
203        while [ $d != "/" -a $found = "false" ]; do
204            [ -h "$d" ] && found="true"
205            d=`dirname "$d"`
206        done
207        if [ -d "$incoming" ] && [ ! -h "$incoming" ]; then
208            find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir
209        elif [ -e "$incoming" ] && [ $found = "false" ]; then
210            tar cf - -C / $incoming 2>> $MINDI_TMP/$$.log | (cd $outdir ; tar xf -) || Die "Cannot copy $incoming to $outdir - did you run out of disk space?" $MINDI_TMP/$$.log
211
212            # Only uncompress modules if not using udevd
213            if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] && [ "`ps auxww | grep -v grep | grep -qw udevd`" != "" ]; then
214                gunzip -f $outdir/$incoming || LogIt "Cannot gunzip $outdir/$incoming"
215            fi
216            [ -x "$outdir" ] && StripExecutable $outdir "-$filename-"
217            counter=$(($counter+1))
218            if [ "$counter" -ge "5" ] ; then
219                counter=0
220                echo -en "."
221            fi
222        fi
223        incoming=`ReadLine`
224    done
225}
226
227
228CountItemsIn() {
229    local r
230    r=0
231    for q in $1 ; do
232        r=$(($r+1))
233    done
234    echo $r
235}
236
237
238# Last function called before exiting
239# Parameter is exit code value
240MindiExit() {
241    local my_partitions
242
243    echo "Mindi $MINDI_VERSION is exiting" >> $LOGFILE
244    echo "End date : `date`" >> $LOGFILE
245    if [ _"$MONDO_SHARE" != _"" ] ; then
246        echo "------------- mindi logfile included -------------------------" >> /var/log/mondoarchive.log
247        cat $LOGFILE >> /var/log/mondoarchive.log
248        echo "--------------------------------------------------------------">> /var/log/mondoarchive.log
249    fi
250
251    cd /
252    sync&
253
254    # Unmount what could remain mounted
255    my_partitions=`mount | grep -F $$ | cut -f1 -d' '`
256    [ "$my_partitions" != "" ] && umount $my_partitions
257    # Clean temporary files only when standalone mindi
258    if [ _"$MINDI_TMP" != _"$MONDO_TMP" ]; then
259        rm -Rf $MINDI_TMP
260    fi
261    exit $1
262}
263
264Die() {
265    local i
266    if [ "$1" = "" ] ; then
267        LogIt "FATAL ERROR"
268    else
269        LogIt "FATAL ERROR. $1"
270    fi
271    if [ _"$2" != _"" ]; then
272        grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
273    fi
274    rm -f "$2"
275
276    LogIt "Please e-mail a copy of $LOGFILE to the mailing list."
277    LogIt "See http://www.mondorescue.org for more information."
278    LogIt "WE CANNOT HELP unless you enclose that file.\n"
279    MindiExit -1
280}
281
282
283DropOptimizedLibraries() {
284    local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
285    filelist=$1
286    outdir=$2
287
288    list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
289    if [ "$list_of_optimized_libraries" = "" ] ; then
290        return 0
291    fi
292    echo -en "Dropping i686-optimized libraries if appropriate"
293    for optimized_lib_name in $list_of_optimized_libraries ; do
294        echo -en "."
295        reason=""
296        vanilla_lib_name=`echo "$optimized_lib_name" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
297        echo "$vanilla_lib_name" >> $filelist
298        echo "Adding $vanilla_lib_name to filelist" >> $LOGFILE
299        mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
300        rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
301
302        # This may return multiple files
303        for resolved in `ReadAllLink $vanilla_lib_name`; do
304            echo "Adding as deps $resolved to filelist" >> $LOGFILE
305            vanilla_resolved_name=`echo "$resolved" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
306            mkdir -p $outdir$resolved> /dev/null 2> /dev/null
307            rmdir $outdir$resolved > /dev/null 2> /dev/null
308            ln -sf $vanilla_resolved_name $outdir$resolved
309            echo "Excluding deps $resolved" >> $LOGFILE
310            grep -Fvx "$resolved" "$filelist" > $filelist.tmp
311            echo "Replacing it with $vanilla_resolved_name" >> $LOGFILE
312            echo "$vanilla_resolved_name" >> $filelist.tmp
313            mv -f $filelist.tmp $filelist
314        done
315    done
316    $AWK '{ print $1; }' $filelist | sort -u > $filelist.tmp
317    mv -f $filelist.tmp $filelist
318    echo -e "$DONE"
319}
320
321
322FindAndAddUserKeyboardMappingFile() {
323    local r res mapfile mappath included_item included_list keyfile mp locale
324    LogIt "Analyzing your keyboard's configuration."
325    KEYDIR=/lib/kbd
326    [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share/kbd     # Slackware
327    [ ! -e "$KEYDIR" ] && KEYDIR=/usr/lib/kbd
328    [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share
329    [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole
330    [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole-setup
331    if [ ! -e "$KEYDIR" ] ; then
332        LogIt "Keyboard mapping directory not found. I shall use default map at boot-time."
333        return 0
334    fi
335    if [ -e "/etc/sysconfig/keyboard" ] ; then
336        echo "Red Hat-style config detected." >> $LOGFILE
337        keyfile=/etc/sysconfig/keyboard
338    elif [ -e "/etc/rc.d/rc.keymap" ] ; then
339        echo "Slackware-style config detected." >> $LOGFILE
340        keyfile=/etc/rc.d/rc.keymap
341    elif [ -e "/etc/rc.config" ] ; then
342        echo "Debian-style config detected." >> $LOGFILE
343        keyfile=/etc/rc.config
344    elif [ -e "/etc/console/boottime.kmap.gz" ] ; then
345        echo "Debian-style config detected." >> $LOGFILE
346        echo -en "Adding the following keyboard mapping tables: "
347        mkdir -p $bigdir/tmp
348        echo "/etc/console/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
349        KBDEPTH=0
350        mkdir -p $bigdir/etc/console
351        cp /etc/console/boottime.kmap.gz $bigdir/etc/console 2>> $LOGFILE
352        echo -e "$DONE"
353        return 0
354    elif [ -e "/etc/console-setup/boottime.kmap.gz" ] ; then
355        echo "Ubuntu-style config detected." >> $LOGFILE
356        echo -en "Adding the following keyboard mapping tables: "
357        mkdir -p $bigdir/tmp
358        echo "/etc/console-setup/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
359        KBDEPTH=0
360        mkdir -p $bigdir/etc/console-setup
361        cp /etc/console-setup/boottime.kmap.gz $bigdir/etc/console-setup 2>> $LOGFILE
362        echo -e "$DONE"
363        return 0
364    elif [ -e "/etc/conf.d/keymaps" ] ; then
365        echo "Gentoo-style config detected." >> $LOGFILE
366        keyfile=/etc/conf.d/keymaps
367    else
368        echo -en "Searching for rc.config ..."
369        keyfile=`find /etc -name rc.config | head -n1`
370        if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
371            LogIt "Unknown config detected. Default keyboard map will be used."
372            return
373        else
374            echo "Found $keyfile" >> $LOGFILE
375        fi
376    fi
377    if [ ! -e "$KEYDIR/keymaps" ] ; then
378        LogIt "Keyboard mapping directory not found. Default keyboard map will be used."
379        return
380    fi
381    echo "keyfile=$keyfile" >> $LOGFILE
382    locale=`grep -F KEYTABLE "$keyfile" | tr -d '"' |cut -d'=' -f2`
383    [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'`        # Slackware
384    [ ! "$locale" ] && locale=`grep -E '^KEYMAP=' "$keyfile" | tr -d '"' |cut -d'=' -f2`        # Gentoo
385    echo "locale=$locale" >> $LOGFILE
386    #
387    # Process the keymaps dir once for all
388    # AddKeyboardMappingFile will use it recursively
389    #
390    find $KEYDIR/keymaps > $MINDI_TMP/keymaps.find
391    mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep -F "/${locale}." | grep -vx " *#.*"`
392    [ ! "$mp" ] && mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
393    # If we have multiple keymaps then log it !!
394    echo "$mp" | grep -q " "
395    if [ $? -eq 0 ]; then
396        echo "WARNING: Multiple keymaps found: $mp" | tee -a $LOGFILE
397        echo "The following one will be used" >> $LOGFILE
398    fi
399    for i in $mp ; do
400        mappath=$i
401        [ -e "$i" ] && [ ! -d "$i" ] && break
402    done
403    if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
404            mappath=$(find / -name "*/kbd/keymaps/*/$locale")
405    fi
406    echo "mappath = $mappath" >> $LOGFILE
407    if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
408        LogIt "Keyboard mapping file not found. Default keyboard map will be used."
409        return
410    fi
411    echo -en "Adding the following keyboard mapping tables: "
412    mkdir -p $bigdir/tmp
413    echo "$mappath" > $bigdir/tmp/KEYMAP-LIVES-HERE
414    KBDEPTH=0
415    AddKeyboardMappingFile $mappath
416    echo -e "$DONE"
417    rm -f $MINDI_TMP/keymaps.find
418    return 0
419}
420
421
422FindIsolinuxBinary() {
423    ISOLINUX=/usr/lib/isolinux.bin
424    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
425    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib64/syslinux/isolinux.bin
426    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
427    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
428    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib64/syslinux/isolinux.bin
429    [ ! -e "$ISOLINUX" ] && ISOLINUX=`find / -name isolinux.bin | grep -x "/.*/isolinux.bin"`
430    [ ! -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'"
431    echo "Found isolinux.bin at $ISOLINUX" >> $LOGFILE
432}
433
434
435FindSpecificModuleInPath() {
436    local modpaths pwd line
437    pwd=`pwd`
438    if [ "$YOUR_KERNEL_SUCKS" ] ; then
439        cd $MINDI_TMP
440    else
441        cd /
442    fi
443    if [ ! -e "$1" ] ; then
444        LogIt "WARNING - cannot search specific path '$1'"
445        return 1
446    fi
447    # Find all files and links (required for some VMWare VMs)
448    modpaths=`find $1 -name $2.*o -type f -o -type l`
449    #[ "$?" -ne "0" ] && Die "find $1 -name $2.o -type f --- failed"
450    [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.o.gz -type f -o -type l`
451    [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.ko.gz -type f -o -type l`
452    [ "$modpaths" = "" ] && modpaths=`find $1 -name $2 -type f -o -type l`
453    echo "$modpaths"
454    cd $pwd
455}
456
457
458GenerateGiantDependencyList() {
459    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
460
461    echo -en "Analyzing dependency requirements"
462    outfile=$1
463    tempfile=$MINDI_TMP/$$.txt
464    incoming=`ReadLine`
465
466    > $tempfile
467    progress=0
468    res=0
469    noof_lines=$2
470    while [ "$incoming" != "" ] ; do
471        if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
472            incoming=`ReadLine`
473            continue
474        fi
475        if [ "$incoming" = "LVMFILES:" ] ; then
476            break
477        fi
478        filelist=`GenerateListForFile "$incoming"`
479        r=$?
480        [ "$r" -ne "0" ] && LogIt "$incoming not found"
481        res=$(($res+$r))
482#       echo "'$incoming' generates filelist '$filelist'" >> $LOGFILE
483        for fname in $filelist ; do
484            [ "$fname" != "" ] && echo "$fname" >> $tempfile
485        done
486        progress=$(($progress+1))
487        echo -en "\r\t\t\t\t\t\t\t\t"
488        i=$(($progress*100))
489        i=$(($i/$noof_lines))
490        echo -en "$i"
491        echo -en "%"
492        modres=$(($progress%4))
493        [ "$modres" -eq "0" ] && echo -en "\t/"
494        [ "$modres" -eq "1" ] && echo -en "\t-"
495        [ "$modres" -eq "2" ] && echo -en "\t\\"
496        [ "$modres" -eq "3" ] && echo -en "\t|"
497        incoming=`ReadLine`
498    done
499    if  [ "$incoming" = "LVMFILES:" ] ; then
500        incoming=`ReadLine`
501        lvmversion=""
502        while [ "$incoming" != "" ] ; do
503            if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
504                incoming=`ReadLine`
505                continue
506            fi
507            filelist=`GenerateListForFile "$incoming"`
508            for tool in $filelist ; do
509                lvmresolved=`readlink -f $tool`
510                if [ "$tool" = "$lvmresolved" ]; then
511                    echo "$tool" >> $tempfile
512                elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
513                    if [ "$lvmversion" = "" ] ; then
514                        lvmversion=`$lvmresolved`
515                        echo "$lvmresolved" >> $tempfile
516                    fi
517                    toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
518                    if [ "$lvmversion" = "200" ]; then
519                        # pvdata and lvmcreate_initrd don't exist in LVM2
520                        case "$toolstripped" in
521                        "pvdata")
522                            continue
523                            ;;
524                        "lvmcreate_initrd")
525                            continue
526                            ;;
527                        esac
528                    fi
529                    toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
530                    if [ -e "$toolpath" ] ; then
531                        echo "$toolpath" >> $tempfile
532                        echo "$tool" >> $tempfile
533                    else
534                        toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
535                    fi
536                    if [ -e "$toolpath" ] ; then
537                        echo "$toolpath" >> $tempfile
538                        echo "$tool" >> $tempfile
539                    else
540                        echo "Where are your LVM-Tools? Couldn't find $tool"
541                    fi
542                else
543                    echo "$tool" >> $tempfile
544                fi
545            done
546            progress=$(($progress+1))
547            echo -en "\r\t\t\t\t\t\t\t\t"
548            i=$(($progress*100))
549            i=$(($i/$noof_lines))
550            echo -en "$i"
551            echo -en "%"
552            modres=$(($progress%4))
553            [ "$modres" -eq "0" ] && echo -en "\t/"
554            [ "$modres" -eq "1" ] && echo -en "\t-"
555            [ "$modres" -eq "2" ] && echo -en "\t\\"
556            [ "$modres" -eq "3" ] && echo -en "\t|"
557            incoming=`ReadLine`
558        done
559    fi
560    echo -en "$DONE\nMaking complete dependency list"
561
562    tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
563    mv -f $tempfile.new $tempfile
564    > $outfile.pre
565    progress=0
566    noof_lines=`cat $tempfile | wc -l`
567    echo "---------------------------------" >> $LOGFILE
568    echo "List of dependencies:             " >> $LOGFILE
569    echo "---------------------------------" >> $LOGFILE
570    for fname in `cat $tempfile` ; do
571        echo "$fname" | tee -a $LOGFILE >> $outfile.pre
572        LocateDeps $fname | tee -a $LOGFILE >> $outfile.pre
573        progress=$(($progress+1))
574        echo -en "\r\t\t\t\t\t\t\t\t"
575        i=$(($progress*100))
576        i=$(($i/$noof_lines))
577        echo -en "$i"
578        echo -en "%"
579        modres=$(($progress%4))
580        [ "$modres" -eq "0" ] && echo -en "\t/"
581        [ "$modres" -eq "1" ] && echo -en "\t-"
582        [ "$modres" -eq "2" ] && echo -en "\t\\"
583        [ "$modres" -eq "3" ] && echo -en "\t|"
584    done
585    if [ _"$MONDO_SHARE" != _"" ]; then
586        mkdir -p $bigdir/tmp
587        mkdir -p $bigdir/sbin
588        mkdir -p $bigdir/bin
589        if [ -e "$MINDI_TMP/post-nuke.tgz" ] ; then
590            LogIt "\nIncorporating post-nuke tarball"
591            old_pwd=`pwd`
592            cd $bigdir
593            tar -zxf $MINDI_TMP/post-nuke.tgz 2>> $MINDI_TMP/$$.log || LogIt "Error occurred when untarring post-nuke tarball" $MINDI_TMP/$$.log
594            cd $old_pwd
595        fi
596        if cp -f $MINDI_TMP/mondo*restore $bigdir/usr/bin 2>> $LOGFILE ; then
597            LocateDeps $bigdir/usr/bin/mondo*restore >> $outfile.pre
598        else
599            LogIt "Cannot find mondo*restore in mondo's tempdir, $MINDI_TMP"
600            LogIt "I bet you've got a spare copy of Mondo or Mindi floating around on your system."
601            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."
602            Die "Odd."
603        fi
604        cp -f $MINDI_TMP/BOOTLOADER.* $bigdir 2>> $LOGFILE || LogIt "\nMondo v1.2x defaults to LILO as the bootloader, BTW."
605        if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
606            LogIt "\nIncorporating Network-related settings"
607            for r in NETFS-* ISO-PREFIX ; do
608                cp -f $MINDI_TMP/$r $bigdir/tmp 2>> $LOGFILE || Die "Cannot copy $r - did you run out of disk space?"
609                echo "Copying $r to ramdisk" >> $LOGFILE
610            done
611        fi
612    fi
613    tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
614    rm -f $tempfile $outfile.pre
615    [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
616    return $res
617}
618
619
620GenerateListForFile() {
621    local files_found loc fname incoming i res
622    incoming="$1"
623    files_found=""
624    res=0
625
626    for fname in $incoming ; do
627        files_found="$files_found `LocateFile $fname`"
628    done
629
630    echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
631}
632
633
634# Returns all disk devices which are part of a raid array
635GetAllRaidMembers() {
636    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
637}
638
639
640GetFileSizeList() {
641    local i
642    for i in `find $1 -type d -o -print` ; do
643        du -sk $i
644    done
645}
646
647
648GetHomeDir() {
649    local res loc
650    loc=`which $1 2>/dev/null`
651    res=`file $loc | $AWK '{print $NF;}'`
652    dirname $res
653}
654
655
656# Check kernel filesystem capabilites for accessing initrd image
657# Could be ext2 FS (old mode) or initramfs (new mode)
658#
659# Interface definition:
660# param #1: absolute path to kernel image
661GetInitrdFilesystemToUse() {
662
663    # interface test: make sure we have one parameter
664    if [ $# -ne 1 ]; then
665        Die "GetInitrdFilesystemToUse(): Expected 1 parameter, got $#."
666    fi
667
668    # interface parameters
669    local lvKernelImage=$1
670
671    # local constants (filesystem magic strings)
672    local lcMagicCramfs="<3>cramfs: wrong magic"
673    local lcMagicExt2fs="EXT2-fs: blocksize too small for device."
674    local lcMagicExt3fs="<3>EXT3-fs: blocksize too small for journal device."
675    local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs...|<6>Trying to unpack rootfs image as
676initramfs"
677
678    # local variables
679    local lvOffset
680    local lvScanRes
681    local lvUseFilesystem
682
683    # say where we are.
684    echo "  GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage" >> $LOGFILE
685
686    # verify that file exists
687    [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
688
689    # Kernel may be gzip compressed
690    file $lvKernelImage 2>&1 | grep -q gzip
691    if [ $? -eq 0 ]; then
692        lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs"`
693
694        # determine which filesystem to use for initrd image: ext2|3fs, gzip'ed cpio (initramfs) or cramfs
695        if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
696            lvUseFilesystem="ext2fs"
697        elif [ `echo $lvScanRes | grep -Ec "$lcMagicExt3fs"` -eq 1 ]; then
698            lvUseFilesystem="ext3fs"
699        elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
700            lvUseFilesystem="initramfs"
701        elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
702            lvUseFilesystem="cramfs"
703        else
704            lvUseFilesystem="UNSUPPORTED"
705        fi
706
707    else
708        # In that case, we are after 2.6.30 and use the supported initramfs
709        lvUseFilesystem="initramfs"
710    fi
711    # say what we are using
712    echo "  GetInitrdFilesystemToUse(): Filesytem to use for initial ram disk is $lvUseFilesystem.\n" >> $LOGFILE
713
714    # return file system to use
715    echo "$lvUseFilesystem"
716
717}
718
719# Searches parent raid device of given disk device
720# $1: disk device (i.e. /dev/hda1)
721GetParentRaidDev() {
722    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
723}
724
725
726# Searches members of raid device
727# $1: raid device (/dev/md...)
728GetRaidDevMembers() {
729    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
730}
731
732
733HackPathsToFailsafe() {
734    local incoming newpath stub i pwd
735    incoming=`ReadLine`
736    pwd=`pwd`
737    cd $MINDI_TMP
738    while [ "$incoming" != "" ] ; do
739        stub=`basename $incoming`
740        newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
741        for i in $newpath ; do
742            echo "$i"
743        done
744        read incoming
745    done
746    cd $pwd
747}
748
749
750ListAllPartitions() {
751    local res currline partition all_partitions ap_orig remaining i j
752
753    grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
754    [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
755    if [ -e "/vmfs/volumes" ]; then
756        # For VMWare ESX 3 get the device names of these volumes
757        vdf -P | grep -E '/vmfs/volumes' | $AWK '{print $1}'
758    fi
759    return
760}
761
762
763ListImagesForUser() {
764    local path fname
765    path=$MINDI_CACHE
766    echo -en "In the directory '$path' you will find the images:-\n"
767    for fname in `ls $path | grep -F mindi-` ; do
768        printf "%19s " $fname
769    done
770    echo " "
771}
772
773
774ListKernelModulePaths() {
775    local module_list module fname r kern
776    module_list="$MODULES"
777    # Remove unwanted modules from list
778    for i in $DENY_MODS; do
779        module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
780        EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
781    done
782###
783### Sq-Modification ... Use kernelname for module search path if specified
784###
785    if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
786    then
787        kern=${kernelname}
788    else
789        kern="$KERVERRUN"
790    fi
791    export KERVER=$kern
792###
793### Sq-Mod End
794###
795    # Get rid of duplicates, so that if a live kernel module also appears
796    # in $EXTRA_MODS that it won't get reported as "live module file not found" twice.
797    for module in `echo $module_list $EXTRA_MODS | tr ' ' '\n' | sort -u` ; do
798        r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
799        if [ -z "$r" ]; then
800            if [ "`echo "$MODULES" | grep -w $module`" ]; then
801                r="[live module file not found]"
802            else
803                r="[extra module file not found]"
804            fi
805        else
806            [ -f "$r" ] && echo "$r"
807        fi
808        echo "module $module --> $r" >> $LOGFILE
809    done
810    find /lib/modules/$kern/modules.* -type f 2> /dev/null
811}
812
813#
814# Critical function which computes all dependencies (dyn. lib.)
815# for a list of binaries
816#
817LocateDeps() {
818    local incoming fname deps
819    incoming="$*"
820    for fname in $incoming ; do
821        if [ ! -e "$fname" ] ; then
822            echo "WARNING - $fname does not exist; cannot be LDD'd." >> $LOGFILE
823            if echo $fname | grep lvm &> /dev/null ; then
824                echo "This warning only affects you if you are using LVM." >> $LOGFILE
825                if echo "$MODULES" | grep lvm &> /dev/null ; then
826                    echo "I think you are, so please take heed!" >> $LOGFILE
827                else
828                    echo "I don't think you are, so don't worry about it." >> $LOGFILE
829                fi
830            fi
831        elif [ -h "$fname" ] && [ -x "$fname" ] ; then
832            echo "$fname is softlink" >> $LOGFILE
833        else
834            ldd $fname 2> /dev/null | ProcessLDD
835        fi
836    done
837}
838
839
840# Give all symlinks recursively of a full path name
841ReadAllLink() {
842    file="$1"
843
844    echo $file | grep -q '\.\./'
845    if [ $? -eq 0 ]; then
846        # We need to normalise the path with .. in it
847        file=`echo $file | perl -pi -e 's|([^/]+)/([^/]+)/\.\./([^/]+)|$1/$3|'`
848    fi
849    echo "$file"
850    if [ ! -h $file ]; then
851        return 0
852    fi
853
854    link=`readlink $file`
855    d=`dirname $file`
856    fchar=`echo $link | cut -c1`
857    # If mother dir is a link print it
858    if [ -h "$d" ]; then
859        echo "$d"
860        d=`readlink $d`
861    fi
862    if [ "$fchar" != "/" ]; then
863        # Relative or local link
864        ReadAllLink "$d/$link" 
865    else
866        # Absolute path
867        ReadAllLink $link 
868    fi
869}
870
871
872LocateFile() {
873    local i path fname_to_find location output resolved tmp stub cache_id loclist
874    fname_to_find="$1"
875    # It's an absolute path
876    if echo "$fname_to_find" | grep -x "/.*" ; then
877        output="$fname_to_find"
878        if [ -h "$output" ] ; then
879            output="`ReadAllLink $output` $output"
880        fi
881        echo "$output"
882        return 0
883    fi
884    # It's not an absolute path
885    output=""
886    for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin `find /usr/lib /lib /usr/local/lib /usr/X11R6/lib /usr/lib64 /lib64 /usr/local/lib64 /usr/X11R6/lib64 -type d -maxdepth 1 2> /dev/null` ; do
887    #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
888        [ -h "$path" ] && continue
889        [ ! -e "$path/$fname_to_find" ] && continue
890        output="$path/$fname_to_find $output"
891        if [ -h "$path/$fname_to_find" ] ; then
892            output="`ReadAllLink $path/$fname_to_find` $output"
893        fi
894    done
895    if [ "$output" = "" ] ; then
896        return 1
897    fi
898    echo "$output"
899    return 0
900}
901
902
903LogIt() {
904    if [ -e /dev/stderr ] ; then
905        echo -e "$1" >> /dev/stderr
906    elif [ -e /usr/bin/logger ] ; then
907        /usr/bin/logger -s $1
908    fi
909    echo -e "$1" >> $LOGFILE
910    if [ _"$2" != _"" ]; then
911        grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
912    fi
913    rm -f "$2"
914}
915
916
917# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
918MakeMondoConfigFile() {
919    local outfile use_lzo use_comp use_star
920    outfile=$1
921    > $outfile
922    [ "$TAPESIZE" ]     && echo "media-size $TAPESIZE" >> $outfile
923    [ "$TAPEDEV" ]          && echo "media-dev $TAPEDEV" >> $outfile
924    [ "$USBDEVICE" ]            && echo "usb-dev $USBDEVICE" >> $outfile
925    [ "$FILES_IN_FILELIST" ]    && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
926    [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
927    [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
928    use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
929    use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
930    use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
931    use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
932    echo "use-lzo $use_lzo" >> $outfile
933    echo "use-gzip $use_gzip" >> $outfile
934    echo "use-star $use_star" >> $outfile
935    echo "use-comp $use_comp" >> $outfile
936    echo "datestamp `date`" >> $outfile
937    [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
938    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
939    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
940    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
941    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-DEFGW  netfs-client-defgw  $outfile
942    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT  netfs-server-mount  $outfile
943    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH   netfs-server-path   $outfile
944    AddFileToCfgIfExists $MINDI_TMP/NETFS-DEV           netfs-dev           $outfile
945    AddFileToCfgIfExists $MINDI_TMP/NETFS-PROTO         netfs-proto           $outfile
946    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-IPADDR netfs-server-ipaddr $outfile
947    AddFileToCfgIfExists $MINDI_TMP/ISO-DEV           iso-dev           $outfile
948    AddFileToCfgIfExists $MINDI_TMP/ISO-MNT           iso-mnt           $outfile
949    AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX        iso-prefix        $outfile
950    AddFileToCfgIfExists $MINDI_TMP/ISODIR            isodir            $outfile
951    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
952    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME   bootloader.name   $outfile
953    AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
954    AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
955    AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
956    AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL      differential      $outfile
957    AddFileToCfgIfExists $MINDI_TMP/ACL      acl      $outfile
958    AddFileToCfgIfExists $MINDI_TMP/XATTR      xattr      $outfile
959    AddFileToCfgIfExists $MINDI_TMP/OBDR      obdr      $outfile
960}
961
962
963MakeMountlist() {
964    local scratchdir mountlist all_partitions current_partition \
965partition_size partition_format outstring partition_number \
966partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
967absolute_partition old_partition_fmt current_lvolume uname skip
968
969    echo "Your raw fstab file looks like this:" >> $LOGFILE
970    echo "------------------------------------" >> $LOGFILE
971    cat $MY_FSTAB >> $LOGFILE
972    echo "Your mountlist will look like this:" | tee -a $LOGFILE
973    echo "-----------------------------------" >> $LOGFILE
974
975# scratchdir, mountlist(OUT)
976    scratchdir=$MINDI_TMP
977    mountlist=$1
978
979# NB: partition = device
980# NB: mountpt = where the device is mounted
981
982    [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
983
984    [ "$mountlist" != "" ] && rm -Rf $mountlist
985    > $mountlist
986    all_partitions=""
987   
988    if [ $LVM != "false" ]; then
989        echo -en "Analyzing LVM...\n"
990        $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
991        if [ $? -ne 0 ]; then
992            LVM="false"
993        fi
994        # Excluded LVs and GVs are not reported here
995        all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-`
996    fi
997    all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
998    for i in $IMAGE_DEVS ; do
999        mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1000    done
1001    [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1002    printf "        %-15s %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL/UUID | tee -a $LOGFILE
1003    useless_dev="/dev/floppy /dev/fd0h1440 /dev/fd0H1440 /dev/cdrom /dev/cdrom/cdrom /dev/cdrom/cdrom1 /dev/cdrom/cdrom2 /dev/cdrom0 /dev/cdrom1 /dev/cdrom2 /dev/cdrom3 /dev/cdrw /dev/scd /dev/ram :/ /dev/sr0 /dev/sr1 /dev/cdrom1"
1004    for c_p in $all_partitions ; do
1005        # Skip evices, network FS, cisf
1006        [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] || [ "`echo "$c_p" | grep -E "^//"`" != "" ]&& continue
1007        [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1008        if [ -h "$c_p" ] && [ "`echo "$c_p" | grep -F "/dev/hd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/sd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/md"`" = "" ] ; then
1009            current_partition=`readlink -f $c_p`
1010            [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
1011            [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1012        else
1013            current_partition="$c_p"
1014        fi
1015        [ "$c_p" = "none" ] && continue
1016        # Debian 5 does that
1017        [ "$c_p" = "proc" ] && continue
1018        redhat_label=""
1019        label=""
1020        uuid=""
1021        absolute_partition=`readlink -f $c_p`
1022        partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1023
1024        # Detects noauto partitions not mounted and exclude them
1025        partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1026        if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" =  "" ] ; then
1027            continue
1028        fi
1029
1030        # set default in case we dont't find it
1031        str_to_find_fmt_with=$current_partition
1032
1033        # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1034        # current_partition contains only first column of /etc/fstab
1035        if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
1036            redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1037            actual_dev=""
1038
1039            # 1st try, findfs - the RHEL way of finding labels and their partitions
1040            if [ -x "/sbin/findfs" ]; then
1041                actual_dev=`/sbin/findfs LABEL=${redhat_label} 2> /dev/null`
1042            fi
1043   
1044            # 2nd try : blkid, the good way for all LABEL except swap
1045            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1046                actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1047                # For LVM FS it will give a /dev/dm-# which should then be converted
1048                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1049                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1050                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1051                    for dev in `ls /dev/mapper/*`; do
1052                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1053                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1054                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1055                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1056                            break
1057                        fi
1058                    done
1059                fi
1060            fi
1061   
1062            # 3rd try, which works on a standard partition (ext2/3), but not on swap
1063            # For LVM gives a /dev/mapper entry
1064            if [ "x$actual_dev" = "x" ]; then
1065                actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | cut -d' ' -f1`
1066            fi
1067   
1068            # 4th try, with vol_id
1069            # SWAP only
1070            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1071                list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | $AWK '{ print $1 }' `
1072                for dev_swap in $list_swaps ; do
1073                    dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1074                    if [ "x$dev_exists" != "x" ]; then
1075                        actual_dev=$dev_swap
1076                        break;
1077                    fi
1078                done
1079            fi
1080
1081            # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1082            # LABEL=SW-cciss/c0d0p3 (RDP)
1083            # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1084            # SWAP only
1085            if [ "x$actual_dev" = "x" -a  _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1086                    skip=""
1087                    uname=$KERVERRUN
1088                    [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1089                    # 2.6.12 needs 16 (FC3)
1090                    [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1091                    # 2.6.19 and upper needs 1052
1092                    [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1093                    [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1094                    if [ $skip = "" ]; then
1095                        Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1096                    fi
1097                    for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1098                    do
1099                        # Location of the swap label for kernel 2.6
1100                        try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
1101                        if [ "x$try_dev_label" = "x$redhat_label" ]; then
1102                            actual_dev=$try_dev
1103                        fi
1104                    done
1105            fi
1106
1107            # Check if one of all those tries has known success
1108            if [ "x$actual_dev" != "x" ]; then
1109                current_partition=$actual_dev
1110            else
1111                Die "Your system uses a LABEL partition ($current_partition), but you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or install findfs|blkid|vol_id"
1112            fi
1113        # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1114        # current_partition contains only first column of /etc/fstab
1115        elif [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
1116            uuid=`echo "$current_partition" | cut -d'=' -f2`
1117            actual_dev=""
1118
1119            # 1st try, findfs - the RHEL way of finding labels and their partitions
1120            if [ -x "/sbin/findfs" ]; then
1121                actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1122            fi
1123   
1124            # 2nd try : blkid, the good way for all UUID except swap
1125            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1126                actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | cut -d':' -f1`
1127                # For LVM FS it will give a /dev/dm-# which should then be converted
1128                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1129                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1130                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1131                    for dev in `ls /dev/mapper/*`; do
1132                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1133                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1134                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1135                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1136                            break
1137                        fi
1138                    done
1139                fi
1140            fi
1141   
1142            # 3th try, with vol_id
1143            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1144                list_dev=`mount | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1145                for dev in $list_dev ; do
1146                    dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1147                    if [ "x$dev_exists" != "x" ]; then
1148                        actual_dev=$dev
1149                        break;
1150                    fi
1151                done
1152            fi
1153
1154            # 4th try, with dumpuuid (VMWare only ?) for swap
1155            if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1156                list_dev=`cat /proc/swaps | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1157                for dev in $list_dev ; do
1158                    dev_exists=`/sbin/dumpuuid $dev | /bin/grep "$uuid"`
1159                    if [ "x$dev_exists" != "x" ]; then
1160                        actual_dev=$dev
1161                        break;
1162                    fi
1163                done
1164            fi
1165
1166            # Check if one of all those tries has known success
1167            if [ "x$actual_dev" != "x" ]; then
1168                current_partition=$actual_dev
1169            else
1170                Die "Your system uses a UUID partition ($current_partition),\nbut you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or\ninstall findfs|blkid|vol_id or\nrelabel the partition with the correct UUID if it's a swap partition."
1171            fi
1172        else
1173            # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1174            # they use symlinks in fstab unrelated to what is shown in mount !
1175            if [ _"$partition_mountpt" = _"" ]; then
1176                # set default in case we dont't find it
1177                for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -Ev "^#" | $AWK '{print $1}'`; do
1178                        if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
1179                            str_to_find_fmt_with=$tmpp
1180                            partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$tmpp" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1181                            break;
1182                        fi
1183                done
1184            fi
1185        fi
1186
1187        # Look for devices which have to be excluded
1188        skip=0
1189        if [ "$MINDI_EXCLUDE_DEVS" ] ; then
1190            l=""
1191            list_of_devices="`ReadAllLink $current_partition`"
1192            for d in $list_of_devices; do
1193                l="$l `$MINDI_LIB/analyze-my-lvm --givemapperofdm $d`"
1194            done
1195            list_of_devices="`echo $l | sort -u`"
1196            for d in $MINDI_EXCLUDE_DEVS ; do
1197                if  [ "`echo " $list_of_devices " | grep " $d"`" != "" ]; then
1198                    echo "Excluding $current_partition from mountlist (due to excluded device $d)" >> $LOGFILE
1199                    skip=1
1200                    continue
1201                fi
1202            done
1203        fi
1204        if [ $skip -eq 1 ]; then
1205            continue
1206        fi
1207
1208        partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1209        # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1210        # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1211        # the former is then a link to the latter, so we test whether
1212        # $current_partition is actually such a link or not and set
1213        # $current_lvolume accordingly. On Debian you may find more than one answer
1214        # so we remove the one corresponding to /dev/.static
1215        # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1216        # principle is the same and we need to find the link to it as well.
1217        # Note that $current_lvolume may well be an
1218        # ordinary device. It is just to make sure that we feed the right value
1219        # into any of the LVM tools if possible.
1220
1221        current_lvolume="$current_partition"
1222        if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1223            # .static dir are a Debian specificity
1224            current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1225            echo $current_lvolume | grep -q ' '
1226            if [ $? -eq 0 ]; then
1227                echo "WARNING: Multiple Logical Volumes found. Report to dev team" >> $LOGFILE 
1228            fi
1229            # if it's not found, it may well be a real device such as a multipath one
1230            # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1231            if [ _"$current_lvolume" = _"" ]; then
1232                current_lvolume="$current_partition"
1233            fi
1234        fi
1235        #
1236        # End of LVM device style variation code (other than $current_lvolume).
1237
1238        if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1239            # Size computed via LVM not directly
1240            partition_size="lvm"
1241        else
1242            partition_size=`SizeOfPartition $current_partition`
1243            [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1244            [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1245            if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1246                partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1247                [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1248                [ "$partition_format" != "swap" ] && partition_format="swap"
1249                if [ "$partition_size" = "" ] ; then
1250                    totalsize=0
1251                    items=0
1252                    for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1253                        totalsize=$(($totalsize+$i))
1254                        items=$(($items+1))
1255                    done
1256                    [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1257                    [ "$partition_size" -lt "125000" ] && partition_size=125000
1258                    echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1259                fi
1260            fi
1261        fi
1262        [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1263        [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1264        if [ "$partition_mountpt" = "" ] ; then
1265            if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1266                if  [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1267                    partition_mountpt="raid"
1268                    partition_format="raid"
1269                else
1270                    partition_mountpt="lvm"
1271                    partition_format="lvm"
1272                fi
1273            fi
1274        fi
1275        psz=$partition_size
1276        echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1277        [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1278        if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1279            partition_mountpt="image"
1280            old_partition_fmt=$partition_format
1281            partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1282            partition_size=$(($partition_size+1)); # just in case
1283            if [ "$partition_format" = "Linux" ] ; then
1284                echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1285                echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1286                partition_format=$old_partition_fmt
1287            fi
1288        fi
1289
1290        if [ ! "$partition_mountpt" ] ; then
1291            echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1292            for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1293                partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1294                [ "$partition_format" ] && break
1295            done
1296            echo "------- $FDISK log end ------------" >> $LOGFILE
1297            if [ "$partition_format" = "Compaq diagnostics" ] ; then
1298                partition_format="compaq"
1299            elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1300                LogIt "Unable to find mountpoint of $current_partition - ignoring"
1301                continue
1302            fi
1303        fi
1304        if [ "$redhat_label" ]; then
1305            label="$redhat_label"
1306        elif [ "$uuid" ]; then
1307            label="$uuid"
1308        fi
1309        partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1310        [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1311        unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1312        if [ "$current_partition" = "" ] ; then
1313            echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1314        elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1315            if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1316                partition_mountpt=raid
1317                partition_format=raid
1318                printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1319                printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1320            else
1321                echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1322            fi
1323        elif [ "$partition_format" = "" ] ; then
1324            echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1325        elif [ "$partition_size" = "" ] ; then
1326            echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1327        elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1328            continue
1329        else
1330            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1331                    echo "vfat should be used instead of dos/msdos as a partition format" >> $LOGFILE
1332                partition_format="vfat"
1333            fi
1334            printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1335            printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1336        fi
1337    done
1338}
1339
1340CheckMountlist() {
1341    local file=$1
1342    # Coherency verification
1343    ML01=`cat $file | wc -l`
1344    ML02=`cat $file | grep -v ' lvm ' | wc -l`
1345    ML1=`$AWK '{print $1}' $file | sort -u | wc -l`
1346    ML2=`$AWK '{print $2}' $file | grep -v ' lvm ' | sort -u | wc -l`
1347    if [ "$ML01" -ne "$ML1" ]; then
1348        echo "--------------------------------------------" >> $LOGFILE
1349        echo "WARNING: Duplicate device entry in mountlist" | tee -a $LOGFILE
1350        echo "--------------------------------------------" >> $LOGFILE
1351    fi
1352    if [ "$ML02" -ne "$ML2" ]; then
1353        echo "--------------------------------------------" >> $LOGFILE
1354        echo "WARNING: Duplicate mountpoint entry in mountlist" | tee -a $LOGFILE
1355        echo "------------------------------------------------" >> $LOGFILE
1356    fi
1357}
1358
1359MakeSureNumberIsInteger() {
1360    res=`echo "$1" | tr -s '\-[0-9]' ' '`
1361    if [ "$res" != " " ] && [ "$res" != "" ] ; then
1362    echo "result = '$res'"
1363        Die "$1 should be an integer"
1364    fi
1365}
1366
1367
1368OfferToMakeBootableISO() {
1369    local i old_pwd
1370    if [ -z "$ISO_CMD" ]; then
1371        LogIt "Neither mkisofs nor genisoimage found, unable to make CD image"
1372        return
1373    fi
1374    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1375        echo -en "Shall I make a bootable CD image? (y/[n]) "
1376        read i
1377        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1378    fi
1379    rm -Rf $MINDI_TMP/iso
1380    mkdir -p $MINDI_TMP/iso/{images,archives}
1381    cp -f $MINDI_CACHE/{*.gz,*.img} $MINDI_TMP/iso/images 2>> $LOGFILE || LogIt "OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1382    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1383    for i in memdisk memtest.bin memtest.img ; do
1384        j=$MINDI_LIB/$i
1385        k=$MINDI_TMP/iso
1386        if [ -e "$j" ] ; then
1387            LogIt "Copying $j to $k"
1388            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1389            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1390            if [ _"$MONDO_SHARE" != _"" ]; then 
1391                cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1392            fi
1393        fi
1394    done
1395    MakeMessageFile > $MINDI_TMP/iso/message.txt
1396    cp $kernelpath $MINDI_TMP/iso/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/iso/vmlinuz). Did you run out of disk space?"
1397    cp $MINDI_TMP/initrd.img $MINDI_TMP/iso/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MINDI_TMP/iso/initrd.img. Did you run out of disk space?"
1398    if [ _"$MONDO_SHARE" != _"" ]; then 
1399        cp $kernelpath $MONDO_ROOT/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mondo root ($MONDO_ROOT/vmlinuz). Did you run out of disk space?"
1400        cp $MINDI_TMP/initrd.img $MONDO_ROOT/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MONDO_ROOT/initrd.img. Did you run out of disk space?"
1401    fi
1402    MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1403    if [ "$ARCH" != "ia64" ] ; then
1404        cp $ISOLINUX $MINDI_TMP/iso/isolinux.bin 2>> $LOGFILE || Die "Cannot copy isolinux.bin ($ISOLINUX) to $MINDI_TMP/iso - did you run out of disk space?"
1405    fi
1406    old_pwd=`pwd`
1407    cd $MINDI_TMP/iso
1408    if [ "$ARCH" != "ia64" ] ; then
1409        if [ _"$MONDO_SHARE" != _"" ]; then 
1410            cp -f $MINDI_TMP/iso/{isolinux.cfg,initrd.img,vmlinuz,isolinux.bin,message.txt} $MONDO_ROOT 2>> $LOGFILE || Die "Cannot copy core files to ramdisk for boot disk (under $MONDO_ROOT). Did you run out of disk space?"
1411            cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1412        fi
1413        $ISO_CMD -U $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table . > /dev/null 2> $MINDI_TMP/mkisofs.log
1414    else
1415        $ISO_CMD $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b images/mindi-bootroot.$BOOT_SIZE.img -c images/boot.cat -no-emul-boot . > /dev/null 2> $MINDI_TMP/mkisofs.log
1416        rm -f images/mindi-bootroot.$BOOT_SIZE.img
1417    fi
1418    if [ "$?" -ne "0" ] ; then
1419        echo "----------- $ISO_CMD's errors --------------" >> $LOGFILE
1420        cat $MINDI_TMP/mkisofs.log >> $LOGFILE
1421        echo "$ISO_CMD returned the following errors:-"
1422        cat $MINDI_TMP/mkisofs.log
1423        LogIt "Failed to create ISO image."
1424    else
1425        echo "Created bootable ISO image at $MINDI_CACHE/mindi.iso" | tee -a $LOGFILE
1426    fi
1427    rm -f $MINDI_TMP/mkisofs.log
1428    cd $old_pwd
1429}
1430
1431
1432OfferToMakeBootableUSB() {
1433    local i
1434    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1435        echo -n "Shall I make a bootable USB image ? (y/[n]) "
1436        read i
1437        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1438        if [ "$USBDEVICE" = "" ]; then
1439            echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1440            read dev
1441            USBDEVICE=$dev
1442        fi
1443        echo "WARNING: This will erase all content on $USBDEVICE"
1444        echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1445        read i
1446        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1447    fi
1448    rm -Rf $MINDI_TMP/usb
1449    mkdir -p $MINDI_TMP/usb
1450    USBPART="${USBDEVICE}1"
1451
1452    echo -en "Transforming $USBDEVICE in a Bootable device " 
1453    echo -en "."
1454    echo "Transforming $USBDEVICE in a Bootable device"  >> $LOGFILE
1455    echo "Checking $USBDEVICE" >> $LOGFILE
1456    $FDISK -l $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE
1457    if [ $? -ne 0 ]; then
1458        echo "Unable to access $USBDEVICE" | tee -a $LOGFILE
1459        echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1460        exit -1
1461    fi
1462    echo -en "."
1463    echo "Unmounting $USBPART just in case" >> $LOGFILE
1464    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1465    # If your key has no MBR it may cause an issue
1466    # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1467    echo "Preparing $USBDEVICE" >> $LOGFILE
1468    $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE << EOF
1469d
1470d
1471d
1472d
1473n
1474p
14751
1476
1477
1478t
1479b
1480a
14811
1482w
1483EOF
1484    if [ $? -ne 0 ]; then
1485        echo "Unable to create a vfat Filesystem on $USBDEVICE" | tee -a $LOGFILE
1486        echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1487        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1488        MindiExit -1
1489    fi
1490    echo "The USB device $USBDEVICE now looks like this:" >> $LOGFILE
1491    $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1492    echo -en "."
1493    # Some distro do auto mount at that point (Ubuntu)
1494    echo "Unmounting $USBPART just in case again" >> $LOGFILE
1495    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1496    echo -en "."
1497    echo "Creating a vfat filesystem on $USBPART" >> $LOGFILE
1498    mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1499    if [ $? -ne 0 ]; then
1500        echo "Unable to create a vfat filesystem on $USBPART" | tee -a $LOGFILE
1501        echo "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)" | tee -a $LOGFILE
1502        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1503        MindiExit -1
1504    fi
1505    echo -en "."
1506    echo "Mounting $USBPART on $MINDI_TMP/usb" >> $LOGFILE
1507    mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1508    if [ $? -ne 0 ]; then
1509        echo "Unable to mount $USBPART on $MINDI_TMP/usb" | tee -a $LOGFILE
1510        echo "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)" | tee -a $LOGFILE
1511        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1512        MindiExit -1
1513    fi
1514    echo -en "."
1515    mkdir -p $MINDI_TMP/usb/images
1516    cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogIt "OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1517    echo -en "."
1518    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1519    for i in memdisk memtest.bin memtest.img ; do
1520        j=$MINDI_LIB/$i
1521        k=$MINDI_TMP/usb
1522        if [ -e "$j" ] ; then
1523            LogIt "Copying $j to $k"
1524            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1525            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1526        fi
1527    done
1528    echo -en "."
1529    MakeMessageFile > $MINDI_TMP/usb/message.txt
1530    echo -en "."
1531    cp $kernelpath $MINDI_TMP/usb/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/usb/vmlinuz). Did you run out of disk space?"
1532    echo -en "."
1533    cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1534    echo -en "."
1535    MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1536    echo -en "."
1537    echo "----------- syslinux's conf --------------" |tee -a $LOGFILE
1538    cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
1539    echo "------------------------------------------" |tee -a $LOGFILE
1540    umount $MINDI_TMP/usb
1541    if [ "$ARCH" != "ia64" ] ; then
1542        syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1543        if [ "$?" -ne "0" ] ; then
1544            echo "----------- syslinux's errors --------------" |tee -a $LOGFILE
1545            cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1546            echo "------------------------------------------" |tee -a $LOGFILE
1547            LogIt "Failed to create USB image."
1548        else
1549            echo -e "$DONE"
1550            echo "Created bootable USB image on $USBDEVICE" >> $LOGFILE
1551        fi
1552        rm -f $MINDI_TMP/syslinux.log
1553    else
1554        echo "No USB boot support for ia64" | tee -a $LOGFILE
1555        MindiExit -1
1556    fi
1557}
1558
1559
1560MakeMessageFile() {
1561   
1562    if [ -x "/bin/lsb_release" ]; then
1563        DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
1564    elif [ -x "/usr/bin/pbdistrocheck" ]; then
1565        # For pb >= 0.9.8
1566        DESC=`/usr/bin/pbdistrocheck -d`
1567    else
1568        iss="/dev/null"
1569        [ -r /etc/issue.net ] && iss="/etc/issue.net"
1570        [ -r /etc/issue ] && iss="/etc/issue"
1571        DESC=`head -1 $iss`
1572    fi
1573    sed "s/ZZZZZ/$MINDI_VERSION/" $MINDI_LIB/msg-txt | sed "s/KKKKK/Kernel $KERVER/" | sed "s/AAAAA/on a $ARCH architecture/" | sed "s/TTTTT/`LC_TIME=C date`/" | sed "s/MMMMM/`hostname`/" | sed "s/DDDDD/$DESC/"
1574    if [ _"$MONDO_SHARE" != _"" ]; then
1575        if [ "$CDRECOVERY" != "yes" ] ; then
1576            if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1577                echo -en "Press <enter> to continue.\n"
1578            elif [ ! "$MINDI_TMP" ] ; then
1579                echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1580                if [ -e "$MINDI_LIB/memtest.img" ] ; then
1581                 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1582                fi
1583            else
1584                echo -en "$BOOT_MEDIA_MESSAGE"
1585            fi
1586        else
1587            echo -en "\
1588To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1589CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1590        fi
1591    fi
1592    echo -en "\n\n\n"
1593}
1594
1595
1596MakeBootConfFile() {
1597    local options i ooo
1598    options=""
1599    # Type of boot file (elilo or syslinux/isolinux)
1600    type=$1
1601    if [ "$type" = "elilo" ]; then
1602        sep="="
1603    else
1604        sep=" "
1605    fi
1606
1607    # Generic header for conf file
1608    if [ "$type" != "elilo" ] ; then
1609        echo -en "prompt 1\ndisplay message.txt\n"
1610    else
1611        echo -en "prompt\n"
1612    fi
1613
1614    # Compute which default option to boot from
1615    if [ "$CDRECOVERY" = "yes" ] ; then
1616        echo -en "default${sep}RESTORE\n"
1617    # In case it's mondoarchive
1618    elif [ _"$MONDO_SHARE" != _"" ]; then
1619        if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1620            echo -en "default${sep}iso\n"
1621        else
1622            echo -en "default${sep}interactive\n"
1623        fi
1624    else
1625        echo -en "default${sep}expert\n"
1626    fi
1627
1628    # Handle timeout
1629    if [ "$CDRECOVERY" != "yes" ] ; then
1630        echo -en "timeout${sep}300\n"
1631    else
1632        echo -en "timeout${sep}10000\n"
1633    fi
1634    echo -en "\n"
1635
1636    # prepare which labels will be generated
1637    if [ "$CDRECOVERY" = "yes" ] ; then
1638        options="RESTORE expert"
1639    else
1640        if [ _"$MONDO_SHARE" != _"" ]; then
1641            options="interactive expert compare iso nuke isonuke"
1642        else
1643            options="expert"
1644        fi
1645    fi
1646
1647    # Generate rest of conf file
1648    for i in $options ; do
1649        ooo=$i
1650        [ "$ooo" = "RESTORE" ] && ooo="nuke"
1651        if [ "$type" = "elilo" ]; then
1652            outstr="image=/vmlinuz\n\tlabel=$i\n\tinitrd=/initrd.img\n\troot=/dev/ram0 append=\" rw ramdisk_size=$ramdisk_size $ooo $MINDI_ADDITIONAL_BOOT_PARAMS \"\n"
1653        else
1654            ps="/"
1655            if [ "$type" = "syslinux" ]; then
1656                ps=""
1657            fi
1658            outstr="label $i\n\tkernel ${ps}vmlinuz\n\tappend initrd=${ps}initrd.img root=/dev/ram0 rw ramdisk_size=$ramdisk_size ${ooo} $MINDI_ADDITIONAL_BOOT_PARAMS\n"
1659        fi
1660        echo -en "$outstr"
1661    done
1662
1663    if [ -e "$MINDI_LIB/memtest.img" ] ; then
1664        if [ "$type" = "elilo" ]; then
1665            echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1666            echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
1667        else
1668            ps="/"
1669            if [ "$type" = "syslinux" ]; then
1670                ps=""
1671            fi
1672            echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1673            echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
1674        fi
1675    fi
1676}
1677
1678
1679PrepareBootDiskImage_LILO() {
1680    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1681    imagesdir=$MINDI_CACHE
1682    kernelpath=$1
1683
1684    retval=0
1685    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1686    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1687    TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
1688    echo -en "..."
1689    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1690    mountpoint=$MINDI_TMP/mountpoint.$$
1691    mkdir -p $mountpoint
1692    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1693    mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1694    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1695    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1696    mkdir -p $mountpoint/etc
1697    liloconf=$mountpoint/elilo.conf
1698
1699    MakeBootConfFile elilo > $liloconf
1700
1701    # Copy it so that CD-ROM menu entry is satisfied
1702    mountefi=0
1703    df -T | grep /boot/efi | grep -q vfat
1704    if [ $? -ne 0 ]; then
1705        mount /boot/efi
1706        if [ $? -ne 0 ]; then
1707            echo "You have to mount your EFI partition when using mindi"
1708            MindiExit -1
1709        fi
1710        mountefi=1
1711    fi
1712    el=`find /boot/efi -name elilo.efi`
1713    cp $el $mountpoint
1714    cp $liloconf $mountpoint
1715    if [ $mountefi -eq 1 ]; then
1716        umount /boot/efi 2>&1 > /dev/null
1717    fi
1718
1719    echo "Copying $MINDI_TMP/initrd.img to $mountpoint..." >> $LOGFILE
1720    cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1721    if [ "$?" -ne "0" ] ; then
1722        LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1723        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1724        LogIt "Please unload some of your modules and try again."
1725        rm -f $MINDI_TMP/mtpt.$$
1726        LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1727        retval=$(($retval+1))
1728    fi
1729    MakeMessageFile > $mountpoint/message.txt
1730
1731    mkdir -p $mountpoint/tmp
1732    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1733        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1734    fi
1735
1736    # copy the kernel across
1737    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1738    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1739    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1740    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
1741    if [ "$?" -ne "0" ] ; then
1742        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1743        du -sk $mountpoint/* >> $LOGFILE
1744        echo "--- end of list of files ---" >> $LOGFILE
1745        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1746Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1747        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1748        cd $old_pwd
1749        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1750        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1751    #   losetup /dev/loop0 -d
1752        [ "$imagefile" != "" ] && rm -f $imagefile
1753        return 0
1754    fi
1755    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1756    echo "Free space left on image = $free_space KB" >> $LOGFILE
1757    echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
1758    # make it bootable
1759    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1760    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1761    if [ "$KERN_DISK_MADE" ] ; then
1762        echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
1763    fi
1764
1765    cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1766    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1767    echo -en "..."
1768    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1769    if [ "$retval" -eq "0" ] ; then
1770        echo -en "...$DONE\n"
1771        if [ "$KERN_DISK_MADE" ] ; then
1772            LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1773        fi
1774    else
1775        echo -en "...failed\n"
1776        LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1777        [ "$imagefile" != "" ] && rm -f $imagefile
1778    fi
1779    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1780    return $retval
1781}
1782
1783
1784PrepareBootDiskImage_ISOLINUX() {
1785    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1786    imagesdir=$MINDI_CACHE
1787    kernelpath=$1
1788    do_boot_root_thingy=""
1789    local retval old_pwd
1790    retval=0
1791
1792    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1793    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1794    TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
1795    echo -en "..."
1796    imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
1797    mountpoint=$MINDI_TMP/mountpoint.$$
1798    mkdir -p $mountpoint
1799    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1800    echo "Creating vfat filesystem on $imagefile" >> $LOGFILE
1801    mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1802    # syslinux should be run on a  local file (doen't work through NFS Cf: #297)
1803    syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1804
1805    # Only move it now to its final destination abd use it now
1806    mv $imagefile $imagesdir
1807    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1808
1809    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1810
1811    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1812    MakeMessageFile > $mountpoint/message.txt
1813    MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1814    echo "Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..." >> $LOGFILE
1815    cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1816    if [ "$?" -ne "0" ] ; then
1817        LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1818        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1819        LogIt "Please unload some of your modules and try again."
1820        rm -f $MINDI_TMP/mtpt.$$
1821        LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1822        retval=$(($retval+1))
1823    fi
1824
1825    mkdir -p $mountpoint/tmp
1826    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1827        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1828    fi
1829
1830    # copy the kernel across
1831    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1832    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1833    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1834    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1835    if [ "$?" -ne "0" ] ; then
1836        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1837        du -sk $mountpoint/* >> $LOGFILE
1838        echo "--- end of list of files ---" >> $LOGFILE
1839        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1840Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1841        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1842        cd $old_pwd
1843        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1844        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1845
1846        [ "$imagefile" != "" ] && rm -f $imagefile
1847        return 0
1848    fi
1849    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1850    echo "Free space left on image = $free_space KB" >> $LOGFILE
1851    echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
1852
1853    # make it bootable
1854    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1855    mkdir -p $mountpoint/etc
1856    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1857    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1858    echo -en "..."
1859    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1860
1861    if [ "$retval" -eq "0" ] ; then
1862        echo -en "...$DONE\n"
1863        if [ "$KERN_DISK_MADE" ] ; then
1864            [ "$imagefile" != "" ] && rm -f $imagefile
1865            LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1866        fi
1867    else
1868        echo -en "...failed\n"
1869        LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1870        [ "$imagefile" != "" ] && rm -f $imagefile
1871    fi
1872    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1873    return $retval
1874}
1875
1876
1877ParseModprobeForIncludes() {
1878local MODPROBE_CONF mpincfile includes include
1879
1880MODPROBE_CONF=/etc/modprobe.conf
1881mpincfile=$1
1882touch $mpincfile
1883if [ -a $MODPROBE_CONF ]; then
1884    includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
1885    if [ -n "$includes" ]; then
1886        for include in $includes
1887        do
1888            if [ -a "$include" ]; then
1889                echo $include >> $mpincfile
1890            fi
1891        done
1892    fi
1893fi
1894}
1895
1896
1897PrepareDataDiskImages() {
1898    local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
1899
1900    imagesdir=$MINDI_CACHE
1901    rm -f $imagesdir/mindi.iso
1902    needlist=$MINDI_TMP/what-we-need.txt
1903    bigdir=$MINDI_TMP/bigdir
1904    mkdir -p $bigdir/usr/bin
1905    mkdir -p $bigdir/usr/sbin
1906    includefile=$MINDI_TMP/$$.includefile.txt
1907
1908    if [ -e "$DEPLIST_FILE" ]; then
1909        lfiles="$DEPLIST_FILE $DEPLIST_DIR/*"
1910    else
1911        lfiles="$DEPLIST_DIR/*"
1912    fi
1913    lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
1914    ParseModprobeForIncludes $includefile
1915    lines=$(($lines+`cat $includefile | wc -l`))
1916    cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
1917    res=$?
1918    rm -f $includefile
1919    if [ "$YOUR_KERNEL_SUCKS" ]; then
1920        pwd=`pwd`
1921        cd $MINDI_TMP
1922        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
1923            tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
1924        done
1925        for i in $EXTRA_MODS ; do
1926            j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
1927            [ ! "$j" ] && echo "WARNING - cannot find failsafe module $i.o.gz" >> $LOGFILE
1928            for k in $j ; do
1929                tar cf - $k 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogIt "ERROR on module $k" $MINDI_TMP/$$.log
1930                echo "Added failsafe module $k to ramdisk" >> $LOGFILE
1931            done
1932        done
1933        cd $pwd
1934    else
1935        ListKernelModulePaths >> $needlist
1936    fi
1937    if [ "$res" -ne "0" ] ; then
1938        Die "You have $res files present in dependency list\nbut absent from filesystem."
1939    fi
1940    FindAndAddUserKeyboardMappingFile
1941    mkdir -p $bigdir/tmp
1942    if [ _"$MONDO_SHARE" != _"" ]; then
1943        MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
1944        cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
1945    fi
1946    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
1947    DropOptimizedLibraries $needlist $bigdir
1948    echo -en "Assembling dependency files"
1949    CopyDependenciesToDirectory < $needlist $bigdir
1950
1951    # also copy io.sys and msdos.sys, if we can find them
1952    for i in `mount | cut -d' ' -f3` ; do
1953        for j in io.sys msdos.sys ; do
1954            [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
1955        done
1956    done
1957
1958    # master boot record, too
1959    i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
1960    if [ "$i" ] ; then
1961        LogIt "Backing up $i's MBR"
1962        dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
1963        sleep 1
1964        sync
1965        j=$i
1966        [ -h "$j" ] && j=`readlink -f $j`
1967        LogIt "Creating /dev/boot_device ($j)"
1968        mkdir -p $bigdir/dev
1969        cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
1970    fi
1971
1972    old_pwd=`pwd`
1973    cd $bigdir
1974
1975    # Get terminfo content
1976    ti="usr/share/terminfo/l"
1977    if [ -d /$ti ]; then
1978        mkdir -p $ti
1979        cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogIt "WARNING - error occurred while copying terminfo"
1980    fi
1981    if [ -e "$MONDO_SHARE/restore-scripts" ]; then
1982        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
1983        [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
1984    fi
1985    if [ -d "/lib/dev-state" ]; then 
1986        tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
1987    fi
1988    cd $old_pwd
1989    echo -e "$DONE"
1990    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
1991    MakeMountlist $MINDI_TMP/mountlist.txt
1992    CheckMountlist $MINDI_TMP/mountlist.txt
1993    mkdir -p $bigdir/tmp
1994    cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
1995    if [ _"$MONDO_SHARE" != _"" ]; then
1996        cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
1997    fi
1998    if [ $LVM != "false" ]; then
1999        $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
2000        if [ "$?" -ne "0" ]; then
2001            LVM="false"
2002            rm -f $bigdir/tmp/i-want-my-lvm
2003        else
2004            echo "Your i-want-my-lvm file content is:" >> $LOGFILE
2005            echo "-----------------------------------" >> $LOGFILE
2006            cat  $bigdir/tmp/i-want-my-lvm >> $LOGFILE
2007            echo "-----------------------------------" >> $LOGFILE
2008        fi
2009    fi
2010    echo "Your mountlist.txt file content is:" >> $LOGFILE
2011    echo "-----------------------------------" >> $LOGFILE
2012    cat $bigdir/tmp/mountlist.txt >> $LOGFILE
2013    echo "-----------------------------------" >> $LOGFILE
2014
2015    echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
2016    echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
2017    if [ _"$MONDO_SHARE" != _"" ]; then
2018        for q in filelist.full.gz biggielist.txt ; do
2019            [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2020            cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
2021        done
2022    fi
2023
2024    echo -en "Tarring and zipping the data content..."
2025    size_of_all_tools=`du -sk $bigdir | cut -f1`
2026    (cd $bigdir ; tar -b 4096 -cf - . 2>> $MINDI_TMP/$$.log | gzip -9 > $imagesdir/all.tar.gz || LogIt "Problem creating all.tar.gz" $MINDI_TMP/$$.log)
2027    du -sk $imagesdir/*gz >> $LOGFILE
2028    echo -e "$DONE"
2029
2030    FRIENDLY_OUTSTRING="Boot and data disk images were created."
2031    rm -rf $bigdir
2032    rm -f $needlist
2033}
2034
2035
2036ProcessLDD() {
2037    local incoming f d nd bd bnd
2038    read incoming
2039    while [ "$incoming" != "" ]; do
2040        # We take the full path name of the dyn. lib. we want
2041        incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
2042        for f in $incoming ; do
2043            # echo modified file name if one of the parent dir is a link
2044            # by replacing the original dirname by the destination of the link
2045            d="`dirname $f`"
2046            found="false"
2047            while [ "$d" != "/" ]; do
2048                if [ -h "$d" ]; then
2049                    nd=`readlink -f $d`
2050                    bd=`basename $d`
2051                    bnd=`basename $nd`
2052                    f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2053                    echo $d
2054                fi
2055                d="`dirname $d`"
2056            done
2057
2058            echo "$f"
2059            echo "`ReadAllLink $f`"
2060        done
2061        read incoming
2062    done
2063}
2064
2065
2066Prompt() {
2067    echo -en "$1"
2068    read line
2069}
2070
2071
2072ReadLine() {
2073    local i incoming
2074    read incoming
2075    i=0
2076    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2077        i=$(($i+1))
2078        read incoming
2079    done
2080    echo "$incoming"
2081}
2082
2083
2084SizeOfPartition() {
2085    local devpath drive res stub
2086    device=$1
2087    if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2088        res=`SizeOfRaidPartition $device`
2089        [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2090        echo "$res"
2091        return 0
2092    fi
2093    # patch from Bill <bill@iwizard.biz> - 2003/08/25
2094    res=`$FDISK -s $device 2>> $LOGFILE`
2095    # end patch
2096    # take only the first in case of multiple mount (cifs, nfs, ...)
2097    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
2098    [ "$res" = "" ] && res="-1"
2099    echo $res
2100    return 0
2101}
2102
2103
2104SizeOfRaidPartition() {
2105    local real_dev smallest_size silly tmp
2106
2107    silly=999999999
2108    smallest_size=$silly
2109
2110    for real_dev in `GetRaidDevMembers $1` ; do
2111        tmp=`SizeOfPartition $real_dev`
2112        [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2113    done
2114
2115    if [ "$smallest_size" = "$silly" ] ; then
2116        echo "-1"
2117        return 1
2118    else
2119        echo "$smallest_size"
2120        return 0
2121    fi
2122}
2123
2124
2125StripComments()
2126{
2127    local tempfile
2128
2129    tempfile=$MINDI_TMP/$$.strip.txt
2130    cp -f $1 $tempfile 2>> $LOGFILE
2131    $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2132    rm -f $tempfile
2133    echo "Stripped comments from $2" >> $LOGFILE
2134}
2135
2136
2137
2138StripExecutable()
2139{
2140    local tmpfile
2141
2142    tmpfile=$MINDI_TMP/stripped.$$.dat
2143    [ -d "$1" ] || [ -h "$1" ] && return
2144    cp -f $1 $tmpfile 2>> $LOGFILE
2145    strip $tmpfile 2> /dev/null
2146    if [ "$?" -eq "0" ] ; then
2147        cp -f $tmpfile $1 2>> $LOGFILE
2148        echo "Stripped binary $2" >> $LOGFILE
2149    fi
2150    rm -f $tmpfile
2151}
2152
2153KernelVer() {
2154        local fkern_ver fname
2155
2156        fname=$1
2157        file $fname | grep -q gzip
2158        if [ "$?" -eq "0" ] ; then
2159            # Used by ia64
2160            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2161        else
2162            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2163        fi
2164        echo "$fkern_ver"
2165}
2166
2167
2168TryToFindKernelPath() {
2169    local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2170
2171    we_want_version=$KERVERRUN
2172    possible_kernels=""
2173    duff_kernels=""
2174   
2175    if [ "$ARCH" = "ia64" ] ; then
2176       root="/boot/efi/efi"
2177    else
2178       root="/"
2179    fi
2180    for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
2181        [ ! -e "$fname" ] && continue
2182        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2183        fkern_ver=`KernelVer $fname`
2184        [ "$fkern_ver" = "" ] && continue
2185        [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2186        [ -f "$fname" ] || continue
2187        [ -h "$fname" ] && continue
2188        kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2189        file $fname | grep -q gzip
2190        if [ "$?" -eq "0" ] ; then
2191            # Used by ia64
2192            if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2193                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2194                duff_kernels="$fname $duff_kernels"
2195            else
2196                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2197                possible_kernels="$fname $possible_kernels"
2198            fi
2199        else
2200            if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2201                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2202                duff_kernels="$fname $duff_kernels"
2203            else
2204                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2205                possible_kernels="$fname $possible_kernels"
2206            fi
2207        fi
2208    done
2209    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2210        possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2211    fi
2212    if [ ! "$possible_kernels" ] ; then
2213        LogIt "No kernel matches exactly. Are there any duff kernels?"
2214        possible_kernels="$duff_kernels"
2215        if [ ! "$possible_kernels" ] ; then
2216            LogIt "Sorry, no duff kernels either"
2217        else
2218            LogIt "I bet you're running Debian or Gentoo, aren't you?"
2219            LogIt "Your kernel doesn't have a sane builddate. Oh well..."
2220        fi
2221    fi
2222    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2223    noof_kernels=`CountItemsIn "$possible_kernels"`
2224    if [ "$noof_kernels" -eq "0" ] ; then
2225        LogIt "Could not find your kernel."
2226        if [ -e "/boot/vmlinuz" ] ; then
2227            LogIt "Using /boot/vmlinuz as a last resort."
2228            output=/boot/vmlinuz
2229        else
2230            output=""
2231        fi
2232    elif [ "$noof_kernels" -eq "1" ] ; then
2233        kernelpath=`echo "$possible_kernels" | sed s/' '//`
2234        echo "Your kernel is $kernelpath (v$KERVERRUN)" >> $LOGFILE
2235        output="$kernelpath"
2236    else
2237        for i in $possible_kernels ; do
2238            if echo $i | grep "$KERVERRUN" ; then
2239                LogIt "OK, I used my initiative and found that "
2240                LogIt "$i is probably your kernel. "
2241                output="$i"
2242                return
2243            fi
2244        done
2245        if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2246            output=/boot/vmlinuz
2247            echo "Schlomo, this one's for you." >> $LOGFILE
2248        else
2249            LogIt "Two or more possible kernels found. You may specify any one of them and the "
2250            LogIt "boot disks will still work, probably. If one does not work, try another."
2251            LogIt "$possible_kernels"
2252            echo ""
2253        fi
2254    fi
2255    echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2256}
2257
2258
2259TurnTgzIntoRdz() {
2260    local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2261
2262    tgz_dir_fname=$1
2263    rdz_fname=$2
2264    kernelsize=$3
2265    maxsize=$(($BOOT_SIZE-$kernelsize))
2266    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2267    tempfile=$MINDI_TMP/temp.rd
2268    mountpoint=$MINDI_TMP/mnt1
2269    res=0
2270    echo -en "..."
2271    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2272    echo -en "..."
2273    echo "Creating ext2 filesystem on $tempfile" >> $LOGFILE
2274    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2275    echo -en "..."
2276    mkdir -p $mountpoint
2277    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."
2278    echo -en "..."
2279    old_pwd=`pwd`
2280    cd $mountpoint
2281
2282    # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
2283    if [ -h "/lib64" ]; then
2284        mkdir -p lib || LogIt "Unable to create lib in $mountpoint."
2285        ln -s lib lib64 || LogIt "/lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2286    fi
2287
2288    cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
2289    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2290
2291    cd dev || Die "Can't cd to dev"
2292    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2293    rm -f dev-entries.tgz
2294    cd ..
2295
2296    for w in insmod.static insmod.static.old ; do
2297        s=`which $w 2> /dev/null`
2298        if [ -e "$s" ] ; then
2299            tar cf - -C / $s 2> /dev/null | tar xf -
2300        fi
2301    done
2302
2303    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2304
2305    # Handle the case where busybox and mount are dynamically linked
2306    file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically" 
2307    if [ $? -eq 0 ]; then
2308        # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2309        rm -f bin/mount $MINDI_TMP/busy.lis
2310        mountlis=`grep -E "mount|fuse|ssh" $DEPLIST_FILE $DEPLIST_DIR/* | grep -v " *#.*" | cut -d: -f2 | sort -u`
2311        LocateDeps $MINDI_LIB/rootfs/bin/busybox $mountlis >> $MINDI_TMP/busy.lis
2312        # Special for libs
2313        for f in `grep -E "libnss" $DEPLIST_FILE $DEPLIST_DIR/* | grep -v " *#.*" | cut -d: -f2`; do
2314            echo "`ReadAllLink $f`" >> $MINDI_TMP/busy.lis
2315        done
2316        # Initial / are trucated by tar
2317        tar cf - $mountlis `sort -u $MINDI_TMP/busy.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in mount analysis" $MINDI_TMP/$$.log
2318        rm -f $MINDI_TMP/busy.lis
2319    fi
2320
2321    # Copy of files mandatory for ssh to automate mount if sshfs is used
2322    mkdir $mountpoint/.ssh
2323    cp -rp ~root/.ssh/*.pub ~root/.ssh/config ~root/.ssh/known* $mountpoint/.ssh 2> /dev/null
2324    echo > $mountpoint/tmp/myssh << EOF
2325ssh -o StrictHostKeyChecking=no $*
2326EOF
2327    chmod 755 $mountpoint/tmp/myssh
2328
2329    # Copy of files mandatory for ld.so
2330    cp -rp /etc/ld.so.c* $mountpoint/etc
2331
2332    # Avoid an issue on some distro (RHEL5)
2333    rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2334
2335    mkdir -p $mountpoint/tmp
2336    # Management of udev (which includes modprobe in rules)
2337    ps auxww | grep -v grep | grep -qw udevd
2338    if [ $? -eq 0 ]; then
2339        echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2340        LogIt "udev device manager found"
2341        tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2342        # This avoids NIC remapping if on another machine at restore time on Debian at least
2343        rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2344        # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2345        rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2346        tar cf - -C / /lib*/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2347        if [ -x /sbin/udevd ]; then
2348            lis2=`grep -Ev '^#' $MINDI_CONF/udev.files` 
2349            lis=""
2350            # Get only the files which exist in that list
2351            # and potentially their symlink structure
2352            for i in $lis2; do
2353                if [ -h $i ]; then
2354                    j=$i
2355                    while [ -h $j ]; do
2356                        lis="$lis $j"
2357                        j=`readlink $j`
2358                    done
2359                    lis="$lis $j"
2360                elif [ -f $i ]; then
2361                    lis="$lis $i"
2362                fi
2363            done
2364            # And their deps
2365            LocateDeps $lis > $MINDI_TMP/udev.lis
2366            for i in $lis; do
2367                if [ "`echo $i | cut -c1`" = "/" ]; then
2368                    j=`echo $i | cut -c2-`
2369                    [ "$j" != "" ] && rm -f $j
2370                fi
2371            done
2372            tar cf - -C / $lis `sort -u $MINDI_TMP/udev.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in udev.lis analysis" $MINDI_TMP/$$.log
2373            rm -f $MINDI_TMP/udev.lis
2374        else
2375            echo "udevd daemon not in standard place (/sbin)" 2>&1 | tee -a $LOGFILE
2376            echo "mindi will use static devices which may cause problems" 2>&1 | tee -a $LOGFILE
2377            rm -f $mountpoint/tmp/USE-UDEV
2378        fi
2379    fi
2380
2381    # Management of potential HW info (Proliant only at the moment)
2382    rm -rf $MINDI_CACHE/bkphw
2383    mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2384    if [ -d $MINDI_CACHE/bkphw ]; then
2385        LogIt "Hardware Information found and saved ..."
2386        cp -rp $MINDI_CACHE/bkphw .
2387        if [ -f $MINDI_CACHE/tools.files ]; then
2388            lis=`grep -Ev '^#' $MINDI_CACHE/tools.files` 
2389            LocateDeps $lis > $MINDI_TMP/tools.lis
2390            tar cf - $lis `sort -u $MINDI_TMP/tools.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in tools.lis analysis" $MINDI_TMP/$$.log
2391        fi
2392        if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2393            mv -f $MINDI_CACHE/mindi-rsthw .
2394            chmod 755 ./mindi-rsthw
2395        fi
2396        rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2397    fi
2398
2399    # Management of perl scripts delivered needed at restore time
2400    mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2401    tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in perl scripts analysis" $MINDI_TMP/$$.log
2402
2403    for w in cdrom groovy-stuff ; do
2404        mkdir -p mnt/$w
2405    done
2406
2407    tar cf - -C / /dev/fd0*[1,2][4,7,8]* 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "Problem in fd dev analysis" $MINDI_TMP/$$.log
2408
2409    cd $old_pwd
2410    echo -en "..."
2411    old_pwd=`pwd`
2412    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2413        cd $MINDI_TMP
2414        needed_modules_path=lib/modules/$FAILSAFE_KVER
2415    else
2416        cd /
2417        if [ "${kernelname}" != "" ]
2418        then
2419            needed_modules_path=lib/modules/${kernelname}
2420        else
2421            needed_modules_path=lib/modules/$KERVERRUN
2422        fi
2423    fi
2424
2425    needed_modules=""
2426    list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2427
2428    if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
2429        # For PXE boot
2430        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2431    fi
2432    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2433        list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2434    fi
2435    for i in $DENY_MODS; do
2436        echo "Removing $i from the list of modules to load" >> $LOGFILE
2437        list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2438    done
2439
2440    [ -e "$needed_modules_path" ] || LogIt "path $needed_modules_path does not exist.\n If you're not using a modular kernel then you're NUTS."
2441    for i in $list_of_groovy_mods ; do
2442        needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2443    done
2444
2445    for i in $needed_modules ; do
2446        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2447        [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2448        echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2449        tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogIt "Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
2450        # Uncompress modules if not using udev and native modprobe
2451        if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2452            if [ "`echo "$i" | grep -F ".gz"`" ]; then
2453                echo "Uncompressing $i" >> $LOGFILE
2454                gunzip -f $mountpoint/$i
2455            fi
2456        fi
2457    done
2458
2459    # Also copy modules.dep in case of udev so that normal modprobe works
2460    tar cf - -C / /$needed_modules_path/modules.dep 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogIt "Unable to copy modules.dep to $mountpoint" $MINDI_TMP/$$.log
2461
2462    if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2463        echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2464        [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2465        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2466        rm -f $mountpoint/sbin/devfsd
2467    fi
2468    cd $old_pwd
2469    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2470    dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2471    rm -f $mountpoint/zero
2472    if [ _"$MONDO_SHARE" != _"" ]; then
2473        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2474        cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2475        cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2476        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2477        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2478        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2479        [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2480        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2481        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2482    fi
2483    mkdir -p $mountpoint/proc
2484    echo "$BOOT_SIZE" > $mountpoint/tmp/$BOOT_SIZE.siz
2485
2486    echo "---------------------------" >> $LOGFILE
2487    echo "Content of initial ramdisk:" >> $LOGFILE
2488    echo "---------------------------" >> $LOGFILE
2489    (cd $mountpoint ; ls -Rla ) >> $LOGFILE
2490    echo "---------------------------" >> $LOGFILE
2491
2492    # Determine what filesystem to use for initrd image
2493    echo "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd." >> $LOGFILE
2494    gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2495    [ -z  gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2496    if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ]; then
2497        # say what will be used
2498        echo "Creating an $gvFileSystem initrd image..." >> $LOGFILE
2499        # kernel expects linuxrc in ext2 filesystem
2500        ( cd $mountpoint && ln -sf sbin/init linuxrc )
2501        # unmount loop filesystem and create image file using the standard approach
2502        umount $mountpoint || Die "Cannot unmount $tempfile"
2503        dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2504        bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2505        MINDI_ADDITIONAL_BOOT_PARAMS="$MINDI_ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2506        gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2507        rm -f ${rdz_fname}.tmp
2508        # log that we are done
2509        echo "...done." >> $LOGFILE
2510    elif [ "$gvFileSystem" = "initramfs" ]; then
2511        # say what will be used
2512        echo "Creating a gzip'ed cpio (AKA initramfs) initrd image..." >> $LOGFILE
2513        # make sure that cpio is there
2514        which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2515        # go into filesystem
2516        cd $mountpoint
2517        # kernel expects init in cpio filesystem
2518        ln -sf sbin/init init
2519        # create cpio image file and unmount loop filesystem
2520        find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2521        cd $old_pwd
2522        umount $mountpoint || Die "Cannot unmount $tempfile"
2523        # log that we are done
2524        echo "...done." >> $LOGFILE
2525    else
2526        Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2527    fi
2528
2529    if [ "$res" -eq "0" ] ; then
2530        echo -en "..."
2531    else
2532        echo -en "\rMade an rdz WITH ERRORS.           \n"
2533    fi
2534    return 0
2535}
2536
2537
2538##############################################################################
2539#----------------------------------- Main -----------------------------------#
2540##############################################################################
2541
2542# Now we can create what we need
2543mkdir -p $MINDI_TMP
2544
2545# Purge from potential old run
2546if [ _"$MINDI_CACHE" = _"" ]; then
2547    Die "MINDI_CACHE undefined"
2548fi
2549
2550if [ "$1" = "--printvar" ] ; then
2551    shift
2552    if [ _"$1" != _"" ] ; then
2553        set | grep -Ew "^$1" | cut -d= -f2
2554    fi
2555    exit 0
2556fi
2557
2558> $LOGFILE
2559echo "mindi v$MINDI_VERSION" >> $LOGFILE
2560echo "$ARCH architecture detected" >> $LOGFILE
2561echo "mindi called with the following arguments:" >> $LOGFILE
2562echo "$@" >> $LOGFILE
2563echo "Start date : `date`" >> $LOGFILE
2564echo "-----------------------------" >> $LOGFILE
2565
2566[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2567
2568# Log some capital variables
2569[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2570echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
2571echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
2572echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
2573[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2574echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
2575if [ -f $MINDI_CONFIG ]; then
2576    echo "-----------------------------" >> $LOGFILE
2577    echo " Mindi configuration file    " >> $LOGFILE
2578    echo "-----------------------------" >> $LOGFILE
2579    grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2580    echo "-----------------------------" >> $LOGFILE
2581fi
2582
2583
2584trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2585
2586# Sanity checks
2587which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2588which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2589which 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."
2590which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2591if which awk &> /dev/null ; then
2592    if ! which gawk &> /dev/null ; then
2593        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"
2594    fi
2595fi
2596which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2597[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
2598
2599[ "`echo $KERVERRUN | 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"
2600
2601# Update the PATH variable if incomplete
2602if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2603    PATH=$PATH:/sbin:/usr/sbin
2604    export PATH
2605    echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
2606    echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
2607    echo " Or you might like to call 'su -' instead of 'su', for example." >> $LOGFILE
2608fi
2609
2610# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2611if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2612    source $MINDI_LIB/FindDistroFailsafe
2613    # Log kernel image
2614    LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2615else
2616    [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2617fi
2618
2619if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2620    Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2621fi
2622
2623### BERLIOS
2624### Fix as it's not mandatory on ia64
2625if [ "$ARCH" = "ia64" ] ; then
2626    if which elilo &> /dev/null ; then
2627        LILO_EXE=elilo
2628    else
2629        LILO_EXE=`which false 2> /dev/null`
2630    fi
2631else
2632    FindIsolinuxBinary
2633fi
2634trap "Aborted" SIGTERM
2635DONE="\r\t\t\t\t\t\t\t\tDone.         "
2636kernelpath=""
2637MONDO_ROOT=/var/cache/mondo
2638mkdir -p $MONDO_ROOT
2639
2640if [ -d "/proc/lvm" ]; then
2641    # LVM v1
2642    LVMCMD=""
2643    LVM="v1"
2644elif [ -d "/dev/mapper" ]; then
2645    # LVM v2
2646    LVMCMD="lvm"
2647    LVM="v2"
2648else
2649    LVM="false"
2650fi
2651echo "LVM set to $LVM" >> $LOGFILE
2652echo "----------" >> $LOGFILE
2653echo "mount result:" >> $LOGFILE
2654echo "-------------" >> $LOGFILE
2655mount >> $LOGFILE
2656echo "-------------" >> $LOGFILE
2657if [ -e /etc/raidtab ]; then
2658    echo "-------------" >> $LOGFILE
2659    echo "/etc/raidtab content:" >> $LOGFILE
2660    echo "-------------" >> $LOGFILE
2661    cat /etc/raidtab >> $LOGFILE
2662fi
2663echo "-------------" >> $LOGFILE
2664echo "cat /proc/cmdline:" >> $LOGFILE
2665echo "-------------" >> $LOGFILE
2666cat /proc/cmdline >> $LOGFILE
2667echo "-------------" >> $LOGFILE
2668echo "cat /proc/swaps:" >> $LOGFILE
2669echo "-------------" >> $LOGFILE
2670cat /proc/swaps >> $LOGFILE
2671echo "-------------" >> $LOGFILE
2672echo "cat /proc/partitions:" >> $LOGFILE
2673echo "-------------" >> $LOGFILE
2674cat /proc/partitions >> $LOGFILE
2675echo "-------------" >> $LOGFILE
2676echo "cat /proc/filesystems:" >> $LOGFILE
2677echo "-------------" >> $LOGFILE
2678cat /proc/filesystems >> $LOGFILE
2679echo "-------------" >> $LOGFILE
2680echo "lsmod result:" >> $LOGFILE
2681echo "-------------" >> $LOGFILE
2682lsmod >> $LOGFILE
2683MODULES="`cat /proc/modules | $AWK '{print $1}'`"
2684if [ -x /usr/sbin/esxcfg-module ]; then
2685    echo "-------------" >> $LOGFILE
2686    echo "VMWare ESX server detected - Enabling dedicated support" >> $LOGFILE
2687    echo "-------------" >> $LOGFILE
2688    echo "VMWare modules" >> $LOGFILE
2689    echo "-------------" >> $LOGFILE
2690    /usr/sbin/esxcfg-module -l >> $LOGFILE
2691    MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
2692fi
2693echo "FORCE_MODS:" >> $LOGFILE
2694echo "-------------" >> $LOGFILE
2695echo $FORCE_MODS >> $LOGFILE
2696echo "-------------" >> $LOGFILE
2697echo "DENY_MODS:" >> $LOGFILE
2698echo "-------------" >> $LOGFILE
2699echo $DENY_MODS >> $LOGFILE
2700echo "-------------" >> $LOGFILE
2701echo "df result:" >> $LOGFILE
2702echo "----------" >> $LOGFILE
2703df -T >> $LOGFILE
2704echo "-------------" >> $LOGFILE
2705echo "Liste of extra modules is:" >> $LOGFILE
2706echo "$EXTRA_MODS" >> $LOGFILE
2707echo "-------------" >> $LOGFILE
2708
2709# Compute libata version
2710laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/  *//g' 2> /dev/null`
2711# If libata v2 is used then remove ide-generic as it will perturbate boot
2712if [ "`echo $MODULES | grep libata`" ]; then
2713    if [ "$laver" = "2" ]; then
2714        DENY_MODS="$DENY_MODS ide-generic"
2715        echo "ide-generic removed from module list as your system uses libata v2+" >> $LOGFILE
2716        echo "-------------" >> $LOGFILE
2717    fi
2718fi
2719
2720# Check for ISO_CMD command
2721if [ ! -x $ISO_CMD ]; then
2722    echo "NOTE: No CD image (ISO file) utility found" >> $LOGFILE
2723fi
2724
2725FLOPPY_WAS_MOUNTED=""
2726for mtpt in /media/floppy /mnt/floppy /floppy ; do
2727    if mount | grep -w $mtpt &> /dev/null ; then
2728        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2729        umount $mtpt
2730    fi
2731done
2732
2733#
2734# If we have a USB device we need to store info
2735# and remove it from the parameters line
2736#
2737if [ "$#" -ne "0" ] ; then
2738    if [ "$1" = "--usb" ] ; then
2739        shift
2740        USBDEVICE=$1
2741        if [ _"$USBDEVICE" = _"" ]; then
2742            Die "No USB device specified"
2743        fi
2744        shift
2745    fi
2746fi
2747
2748if [ "$#" -ne "0" ] ; then
2749    if [ "$1" = "--findkernel" ] ; then
2750        res=`TryToFindKernelPath`
2751        # Avoids logfile content for mondo
2752        export MONDO_SHARE=""
2753        if [ "$res" = "" ] ; then
2754            MindiExit -1
2755        else
2756            echo "$res"
2757            MindiExit 0
2758        fi
2759    elif [ "$1" = "--locatedeps" ] ; then
2760        [ ! "$2" ] && Die "Please specify the binary to look at"
2761        LocateDeps $*
2762        # Avoids logfile content for mondo
2763        export MONDO_SHARE=""
2764        MindiExit $?
2765    elif [ "$1" = "--readalllink" ] ; then
2766        [ ! "$2" ] && Die "Please specify the binary to look at"
2767        ReadAllLink $2
2768        # Avoids logfile content for mondo
2769        export MONDO_SHARE=""
2770        MindiExit $?
2771    elif [ "$1" = "--makemountlist" ] ; then
2772        [ ! "$2" ] && Die "Please specify the output file"
2773        MakeMountlist $2
2774        CheckMountlist $2
2775        # Avoids logfile content for mondo
2776        export MONDO_SHARE=""
2777        MindiExit $?
2778    elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2779        echo "Mindi v$MINDI_VERSION"
2780        # Avoids logfile content for mondo
2781        export MONDO_SHARE=""
2782        MindiExit 0
2783    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
2784        MONDO_TMP=$2
2785        # Change MINDI_TMP for the one provided by mondo
2786        # So that it can get back the built files
2787        if [ _"$MONDO_TMP" = _"" ]; then
2788            Die "MONDO_TMP is empty, aborting"
2789        fi
2790        if [ _"$MONDO_TMP" = _"/" ]; then
2791            Die "MONDO_TMP is /, aborting"
2792        fi
2793        mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
2794        rmdir $MINDI_TMP
2795        export MINDI_TMP=$MONDO_TMP
2796        mkdir -p $MINDI_TMP
2797
2798        # This is the scratch dir in mondo - subdir images
2799        MINDI_CACHE=$3
2800
2801        kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
2802###
2803### Sq-Modification...
2804### Attempt to locate kernel specific module path
2805### if module path is found then use it other wise use uname -r to set it...
2806###
2807        kernelname=`echo $kernelpath | cut -d'-' -f2-`
2808        LogIt "kernelname = $kernelname"
2809        LogIt "kernelpath = $kernelpath"
2810        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2811        then
2812           LogIt "Module path for ${kernelpath} not found..."
2813           LogIt "using running kernel\'s modules."
2814           kernelname=$KERVERRUN
2815        else
2816           LogIt "Using modules for kernel: ${kernelname}"
2817        fi
2818###
2819### end of Sq-Modification
2820###
2821        TAPEDEV=$5
2822        TAPESIZE=$6
2823        FILES_IN_FILELIST=$7
2824        USE_LZO=$8
2825        CDRECOVERY=$9
2826        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2827            IMAGE_DEVS=""
2828        else
2829            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2830        fi
2831        if [ "${11}" ] ; then
2832            LILO_OPTIONS=""
2833    #       LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
2834        fi
2835        LAST_FILELIST_NUMBER=${12}
2836        ESTIMATED_TOTAL_NOOF_SLICES=${13}
2837        export MINDI_EXCLUDE_DEVS="${14}"
2838        USE_COMP="${15}"
2839        USE_LILO="${16}"
2840        USE_STAR="${17}"
2841        INTERNAL_TAPE_BLOCK_SIZE="${18}"
2842        DIFFERENTIAL="${19}"
2843        USE_GZIP="${20}"
2844        NOT_BOOT="${21}"
2845        [ "$USE_COMP" = "" ] && USE_COMP=yes
2846        [ "$USE_GZIP" = "" ] && USE_GZIP=no
2847        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
2848        [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
2849        [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2850        kernelname=`echo $kernelpath | cut -d'-' -f2-`
2851        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2852        then
2853           LogIt "Module path for ${kernelpath} not found..."
2854           LogIt "using running kernel\'s modules."
2855           kernelname=$KERVERRUN
2856        else
2857           LogIt "Using modules for kernel: ${kernelname}"
2858        fi
2859        # MONDO_ROOT is the real scratchdir
2860        MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
2861        if [ _"$MONDO_ROOT" != _"" ]; then
2862            mkdir -p $MONDO_ROOT
2863        else
2864            Die "MONDO_ROOT is undefined"
2865        fi
2866    else
2867        echo "Syntax: mindi (--custom ....)" >> /dev/stderr
2868        MindiExit -1
2869    fi
2870fi
2871
2872if [ _"$MINDI_CACHE" != _"" ]; then
2873    rm -rf $MINDI_CACHE/* 2> /dev/null
2874    mkdir -p $MINDI_CACHE
2875fi
2876
2877[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2878
2879if [ _"$MONDO_SHARE" = _"" ]; then
2880    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
2881    LogIt "Latest Mindi is available from http://www.mondorescue.org"
2882    LogIt "BusyBox sources are available from http://www.busybox.net"
2883    LogIt "------------------------------------------------------------------------------"
2884else
2885    echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> $LOGFILE
2886fi
2887if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
2888    LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
2889else
2890    LogIt "Unable to find mindi-busybox, please install it"
2891    MindiExit -1
2892fi
2893
2894# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
2895insmod /lib/modules/$KERVERRUN/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
2896for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
2897    insmod $i >> $LOGFILE 2>> $LOGFILE
2898done
2899
2900KERN_DISK_MADE=""
2901
2902echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
2903echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
2904echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
2905if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
2906    LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
2907    MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2908    MakeMountlist $MINDI_TMP/mountlist.txt
2909    CheckMountlist $MINDI_TMP/mountlist.txt
2910    mkdir -p $MINDI_TMP/small-all/tmp
2911    cd $MINDI_TMP/small-all
2912    cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
2913    tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
2914    sleep 2
2915    LogIt "Done. Exiting."
2916    MindiExit 0
2917fi
2918
2919if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2920    LogIt "Including the generation of a Bootable USB device on $USBDEVICE"
2921fi
2922
2923if [ "$kernelpath" = "" ] ; then
2924    [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
2925    echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
2926    read ch
2927    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2928        USE_OWN_KERNEL="yes"
2929    else
2930        USE_OWN_KERNEL="no"
2931    fi
2932    if [ "$USE_OWN_KERNEL" = "yes" ]; then
2933        YOUR_KERNEL_SUCKS=""
2934        kernelpath=`TryToFindKernelPath`
2935        if [ "$kernelpath" = "" ] ; then
2936            echo -n "Please enter kernel path : "
2937            read kernelpath
2938        fi
2939    else
2940        YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
2941    fi
2942fi
2943if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
2944    # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2945    if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
2946        source $MINDI_LIB/FindDistroFailsafe
2947        # Log kernel image
2948        LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2949        kernelpath="$FAILSAFE_KBIN"
2950        LogIt "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
2951        LogIt "The failsafe kernel is $kernelpath.\n"
2952        LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
2953        LogIt "disks then it may still be a result of a problem with your kernel.\n"
2954        pwd=`pwd`
2955        cd $MINDI_TMP
2956        mkdir -p lib/modules
2957        cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
2958        cd $pwd
2959    else
2960        kernelpath=$MINDI_LIB/vmlinuz
2961        LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
2962        LogIt "However, you are still running your kernel. If Mindi fails to create your"
2963        LogIt "disks then it may still be a result of a problem with your kernel."
2964        pwd=`pwd`
2965        cd $MINDI_TMP
2966        bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
2967        cd $pwd
2968    fi
2969    YOUR_KERNEL_SUCKS="Your kernel sucks"
2970fi
2971echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
2972[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
2973
2974[ "$YOUR_KERNEL_SUCKS" ] && [ ! "$FAILSAFE_KVER" ] && Die "Please install mindi-kernel package. You need it.\nGo to http://www.mondorescue.org and download it, then install it."
2975
2976PrepareDataDiskImages
2977
2978ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2979rds=$(($ramdisk_size-$((ramdisk_size%4096))))
2980export ramdisk_size=$rds
2981
2982echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
2983if [ "$ARCH" = "ia64" ] ; then
2984    PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
2985else
2986    PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
2987fi
2988
2989[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
2990...Or type 'memtest' to test your PC's RAM thoroughly.\n"
2991
2992if [ _"$MONDO_SHARE" = _"" ]; then
2993    ListImagesForUser
2994    OfferToMakeBootableISO
2995    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
2996        OfferToMakeBootableUSB
2997    fi
2998    LogIt "Finished."
2999elif [ "$TAPEDEV" ] ; then
3000    if [ "$ARCH" != "ia64" ] ; then
3001        # We need to keep the img file as boot file for ia64 platform
3002        rm -f $MINDI_CACHE/{*img,*iso}
3003    else
3004        rm -f $MINDI_CACHE/*iso
3005    fi
3006    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3007        OfferToMakeBootableUSB
3008    fi
3009    OfferToMakeBootableISO
3010    if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
3011        cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
3012    else
3013        Die "Cannot find all.tar.gz, to be written to tape"
3014    fi
3015elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3016    OfferToMakeBootableUSB
3017else
3018    OfferToMakeBootableISO
3019fi
3020# cleanup
3021LogIt "$FRIENDLY_OUTSTRING"
3022for mtpt in $FLOPPY_WAS_MOUNTED ; do
3023    mount $mtpt
3024done
3025MindiExit 0
Note: See TracBrowser for help on using the repository browser.