source: branches/2.2.10/mindi/mindi @ 2589

Last change on this file since 2589 was 2589, checked in by bruno, 9 years ago

r3721@localhost: bruno | 2010-03-09 22:59:21 +0100

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