1 #!/bin/bash 2 3 # Script to generate file system usage information files (.pkgsize) 4 # for use of the install-jds script to calculate the disk space 5 # requirements 6 7 if [ $# = 0 -o "x$1" = "x--help" -o "x$1" = "x-h" ]; then 8 echo "Usage: $0 directory..." 9 echo "Calculate file system usage information files for the given directories" 10 exit 1 11 fi 12 13 TEMPFILES= 14 register_tempfile () { 15 TEMPFILES="$TEMPFILES $1" 16 } 17 18 clean_up () { 19 IFS=" " 20 cd / 21 for f in $TEMPFILES; do 22 rm -rf $TEMPFILES 23 done 24 } 25 26 trap clean_up HUP INT TERM ERR 27 28 TEMPDIR=/tmp/.gen_pkgsize.$$ 29 register_tempfile $TEMPDIR 30 mkdir -p $TEMPDIR 31 32 fatal () { 33 for msg in "${@}"; do 34 echo $msg 1>&2 35 done 36 clean_up 37 exit 1 38 } 39 40 unpack () { 41 cd $TEMPDIR 42 gzip -dc "$1" | /bin/tar xf - 43 } 44 45 print_subdir () { 46 cd $TEMPDIR/$3 47 dummy=$(echo */*) 48 echo "$dummy" | grep '\*' > /dev/null 49 if [ $? != 0 ]; then 50 du -sk */* | sed -e "s%^\([0-9]*\)[ ]*\(.*\)%$1 \1 $2/\2%" 51 else 52 du -sk * | sed -e "s%^\([0-9]*\)[ ]*\(.*\)%$1 \1 $2/\2%" 53 fi 54 } 55 56 print_sizes () { 57 pname=`echo "$1" | sed -e 's/\.tar\.gz$//' -e 's/\.tgz$//'` 58 cd $TEMPDIR 59 test ! -d "$pname" && fatal "Cannot find directory \"$pname\" after unpacking \"$1\"" 60 basedir=`grep '^BASEDIR=' $pname/pkginfo | cut -f2 -d=` 61 if [ "x$basedir" = x/ ]; then 62 basedir= 63 fi 64 test -d "$pname/reloc" && print_subdir "$pname" "$basedir" "$pname/reloc" 65 test -d "$pname/root" && print_subdir "$pname" "$basedir" "$pname/root" 66 } 67 68 gen_pkgsize () { 69 echo "Generating .pkgsize in $1" 70 dir_pkgs=$(cd "$1"; find . -name '*.tar.gz' -print -o -name '*.tgz' -print | sed -e 's/^.\///') 71 IFS=" 72 " 73 sizefile="$1/.pkgsize" 74 test ! -z "$dir_pkgs" && cat /dev/null > "$sizefile" 75 for pkg in $dir_pkgs; do 76 unpack "$1/$pkg" || fatal "Failed to unpack $1/$pkg" 77 print_sizes "$pkg" >> "$sizefile" 78 cd / 79 rm -rf $TEMPDIR 80 mkdir -p $TEMPDIR 81 done 82 } 83 84 # main () 85 IFS=" 86 " 87 mydir=`pwd` 88 for dir in "${@}"; do 89 cd "$mydir" 90 test ! -d "$dir" && continue 91 case "$dir" in 92 /*) 93 gen_pkgsize "$dir" 94 ;; 95 *) 96 gen_pkgsize "$mydir/$dir" 97 ;; 98 esac 99 done 100 101 clean_up 102 exit 0 103