source: MondoRescue/trunk/mindi/mindi@ 448

Last change on this file since 448 was 448, checked in by bcornec, 18 years ago

merge -r435:447 $SVN_M/branches/stable

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