#!/bin/sh # repos-0.9 # Creates a Slackware type directory # # Michael G. Manry # e-mail: mgmanry@linuxorbit.com help(){ echo "Usage: repos [OPTION]... DIRECTORY" echo "Creates a Slackware-like directory structure." echo echo " -f, --full add all packages (default)" echo " -p, --partial only add new packages" echo " -x, --express express (use pregenerated files)" echo " -q, --quiet suppress output" echo " --version output version information and exit" echo " --help display this help and exit" echo echo "Some values default to those specified in /etc/repos.conf" echo echo "Report bugs to ." } check_settings() { for i in $@ do case "$i" in "--quiet" | "-q" ) QUIET=1 ;; "--partial" | "-p" ) PARTIAL=1 ;; "--express" | "-x" ) EXPRESS=1 ;; "--full" | "-f" ) PARTIAL=0 ;; "--version" ) echo "repos 0.9" echo "Written by Michael G. Manry". echo echo "This is free software. There is NO" echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." exit 0 ;; "--help" ) help exit 0 ;; * ) if [ -d $i ]; then REPOSDIR=$i else echo $i is not a valid directory exit 1 fi ;; esac done if [[ "$REPOSDIR" == "" ]]; then echo "You must supply a valid directory" exit 1 fi if [ ! -w $REPOSDIR ]; then echo "You do not have write permission for $REPOSDIR" exit 1 fi if [ ! -d $REPOSTMP ]; then mkdir $REPOSTMP elif [ ! -w $REPOSTMP ]; then echo "You do not have write permission for $REPOSTMP" exit 1 fi } partial_MPL() { if [ ! -f FILELIST.TXT ]; then echo "Error. No FILELIST.TXT found. Run without --partial option first." exit 1 fi grep [.]tgz$ FILELIST.TXT | awk {'print $9'} > $REPOSTMP/OLDPACKAGELIST.TXT NEWPACKAGES=`tree -fi --noreport | grep [.]tgz$` SWAP=0 for i in $NEWPACKAGES do j=`basename $i` if [[ "`grep $j $REPOSTMP/OLDPACKAGELIST.TXT`" == "" ]]; then echo $i >> $REPOSTMP/NEWPACKAGES.TXT SWAP=1 fi done if [ "$SWAP" -eq "0" ]; then echo "No new files found." exit 0 fi if [ "$QUIET" -ne "1" ]; then echo "Adding information to MANIFEST.bz2, PACKAGES.TXT & libraries-current" fi if [ -f MANIFEST.bz2 ]; then cp MANIFEST.bz2 $REPOSTMP else echo "Error. No MANIFEST.bz2 found. Run without --partial option first." exit 1 fi if [ -f PACKAGES.TXT ]; then cp PACKAGES.TXT $REPOSTMP else echo "Error. No PACKAGES.TXT found. Run without --partial option first." exit 1 fi if [ -f libraries-current ]; then cp libraries-current $REPOSTMP else echo "Error. No libraries-current found. Run without --partial option first." exit 1 fi bunzip2 $REPOSTMP/MANIFEST.bz2 echo "PACKAGES.TXT; `date`" > $REPOSTMP/PACKAGESHEADER.TXT echo >> $REPOSTMP/PACKAGESHEADER.TXT echo "This file provides details on the packages found on this site" >> $REPOSTMP/PACKAGESHEADER.TXT TOTALCSIZE=`grep "Total size of all packages (compressed)" $REPOSTMP/PACKAGES.TXT | awk {'print $8 '}` TOTALUSIZE=`grep "Total size of all packages (uncompressed)" $REPOSTMP/PACKAGES.TXT | awk {'print $8 '}` TMPVAL=`wc -l $REPOSTMP/PACKAGES.TXT | awk {'print $1'}` tail -`echo "$TMPVAL - 6" | bc` $REPOSTMP/PACKAGES.TXT > $REPOSTMP/PACKAGESBODY.TXT NEWPACKAGES=`cat $REPOSTMP/NEWPACKAGES.TXT` for i in $NEWPACKAGES do j=`basename $i` if [ "$QUIET" -ne "1" ]; then echo "Adding $j" fi echo "++========================================" >> $REPOSTMP/MANIFEST echo "||" >> $REPOSTMP/MANIFEST echo "|| Package: $i" >> $REPOSTMP/MANIFEST echo "||" >> $REPOSTMP/MANIFEST echo "++========================================" >> $REPOSTMP/MANIFEST tar tvfz $i >> $REPOSTMP/MANIFEST echo >> $REPOSTMP/MANIFEST echo >> $REPOSTMP/MANIFEST j=`basename $i` echo "PACKAGE NAME: $j " >> $REPOSTMP/PACKAGESBODY.TXT echo "PACKAGE LOCATION: `dirname $i`" >> $REPOSTMP/PACKAGESBODY.TXT CSIZE=`ls -sk $i | awk {'print $1'}` USIZE=`gunzip -l $i | tail -1 | awk {'print $2'}` echo "PACKAGE SIZE (compressed): $CSIZE K" >> $REPOSTMP/PACKAGESBODY.TXT gunzip -c $i > $REPOSTMP/file.tar echo "PACKAGE SIZE (uncompressed): $USIZE K" >> $REPOSTMP/PACKAGESBODY.TXT echo "PACKAGE DESCRIPTION:" >> $REPOSTMP/PACKAGESBODY.TXT tar xzOf $i install/slack-desc >> $REPOSTMP/PACKAGESBODY.TXT 2> /dev/null echo >> $REPOSTMP/PACKAGESBODY.TXT TOTALCSIZE=`echo "$TOTALCSIZE + $CSIZE" | bc` TOTALUSIZE=`echo "$TOTALUSIZE + $USIZE" | bc` tar tfz $i 2> /dev/null | sed -e 's/.*/'$j': &/' >> $REPOSTMP/files.tmp done TOTALCSIZE=`echo "$TOTALCSIZE / 1024" | bc` TOTALUSIZE=`echo "$TOTALUSIZE / 1024" | bc` echo "Total size of all packages (compressed) : $TOTALCSIZE MB" >> $REPOSTMP/PACKAGESHEADER.TXT echo "Total size of all packages (uncompressed) : $TOTALUSIZE MB" >> $REPOSTMP/PACKAGESHEADER.TXT echo >> $REPOSTMP/PACKAGESHEADER.TXT echo >> $REPOSTMP/PACKAGESHEADER.TXT bzip2 $REPOSTMP/MANIFEST grep [.]so $REPOSTMP/files.tmp | sort -t : -k 1 -r >> $REPOSTMP/libraries-current.tmp cat $REPOSTMP/libraries-current.tmp $REPOSTMP/libraries-current | sort -t : -k 1 -r > libraries-current } express_MPL() { if [ "$QUIET" -ne "1" ]; then echo "Creating MANIFEST.bz2, PACKAGES.TXT & libraries-current from pregenerated files" fi echo "PACKAGES.TXT; `date`" > $REPOSTMP/PACKAGESHEADER.TXT echo >> $REPOSTMP/PACKAGESHEADER.TXT echo "This file provides details on the packages found on this site" >> $REPOSTMP/PACKAGESHEADER.TXT FILELIST=`tree -fi --noreport` TOTALCSIZE=0 TOTALUSIZE=0 for i in $FILELIST do if [[ ! "`echo $i | grep [.]meta$`" == "" ]]; then cat $i >> $REPOSTMP/PACKAGESBODY.TXT CSIZE=`grep "(compressed): " $i | awk {'print $4'}` USIZE=`grep "(uncompressed): " $i | awk {'print $4'}` TOTALCSIZE=`echo "$TOTALCSIZE + $CSIZE" | bc` TOTALUSIZE=`echo "$TOTALUSIZE + $USIZE" | bc` elif [[ ! "`echo $i | grep [.]man$`" == "" ]]; then cat $i >> $REPOSTMP/MANIFEST fi done TOTALCSIZE=`echo "$TOTALCSIZE / 1024" | bc` TOTALUSIZE=`echo "$TOTALUSIZE / 1024" | bc` echo "Total size of all packages (compressed) : $TOTALCSIZE MB" >> $REPOSTMP/PACKAGESHEADER.TXT echo "Total size of all packages (uncompressed) : $TOTALUSIZE MB" >> $REPOSTMP/PACKAGESHEADER.TXT echo >> $REPOSTMP/PACKAGESHEADER.TXT echo >> $REPOSTMP/PACKAGESHEADER.TXT egrep '[.]so|Package:' $REPOSTMP/MANIFEST > $REPOSTMP/libraries.tmp TOTALLINES=`wc -l $REPOSTMP/libraries.tmp | awk {'print $1'}` for ((COUNT=1; COUNT <= TOTALLINES ; COUNT++)) do LINE=`sed -n $(echo $COUNT)p $REPOSTMP/libraries.tmp` if [[ "`echo $LINE | awk {'print $2'}`" == "Package:" ]]; then PACKAGE=`basename "$LINE"` else echo $LINE | awk {'print $6'} | sed -e 's/.*/'$PACKAGE': &/' >> $REPOSTMP/libraries2.tmp fi done bzip2 $REPOSTMP/MANIFEST cat $REPOSTMP/libraries2.tmp | sort -t : -k 1 -r > $REPOSTMP/libraries-current } create_MPL() { if [ "$QUIET" -ne "1" ]; then echo "Creating MANIFEST.bz2, PACKAGES.TXT & libraries-current" fi echo "PACKAGES.TXT; `date`" > $REPOSTMP/PACKAGESHEADER.TXT echo >> $REPOSTMP/PACKAGESHEADER.TXT echo "This file provides details on the packages found on this site" >> $REPOSTMP/PACKAGESHEADER.TXT FILELIST=`tree -fi --noreport | grep [.]tgz$` TOTALCSIZE=0 TOTALUSIZE=0 for i in $FILELIST do j=`basename $i` echo "++========================================" >> $REPOSTMP/MANIFEST echo "||" >> $REPOSTMP/MANIFEST echo "|| Package: $i" >> $REPOSTMP/MANIFEST echo "||" >> $REPOSTMP/MANIFEST echo "++========================================" >> $REPOSTMP/MANIFEST tar tvfz $i >> $REPOSTMP/MANIFEST echo >> $REPOSTMP/MANIFEST echo >> $REPOSTMP/MANIFEST echo "PACKAGE NAME: $j " >> $REPOSTMP/PACKAGESBODY.TXT echo "PACKAGE LOCATION: `dirname $i`" >> $REPOSTMP/PACKAGESBODY.TXT CSIZE=`ls -sk $i | awk {'print $1'}` USIZE=`gunzip -l $i | tail -1 | awk {'print $2'}` echo "PACKAGE SIZE (compressed): $CSIZE K" >> $REPOSTMP/PACKAGESBODY.TXT gunzip -c $i > $REPOSTMP/file.tar echo "PACKAGE SIZE (uncompressed): $USIZE K" >> $REPOSTMP/PACKAGESBODY.TXT echo "PACKAGE DESCRIPTION:" >> $REPOSTMP/PACKAGESBODY.TXT tar xzOf $i install/slack-desc >> $REPOSTMP/PACKAGESBODY.TXT 2> /dev/null echo >> $REPOSTMP/PACKAGESBODY.TXT TOTALCSIZE=`echo "$TOTALCSIZE + $CSIZE" | bc` TOTALUSIZE=`echo "$TOTALUSIZE + $USIZE" | bc` tar tfz $i 2> /dev/null | sed -e 's/.*/'$j': &/' >> $REPOSTMP/files.tmp done TOTALCSIZE=`echo "$TOTALCSIZE / 1024" | bc` TOTALUSIZE=`echo "$TOTALUSIZE / 1024" | bc` echo "Total size of all packages (compressed) : $TOTALCSIZE MB" >> $REPOSTMP/PACKAGESHEADER.TXT echo "Total size of all packages (uncompressed) : $TOTALUSIZE MB" >> $REPOSTMP/PACKAGESHEADER.TXT echo >> $REPOSTMP/PACKAGESHEADER.TXT echo >> $REPOSTMP/PACKAGESHEADER.TXT bzip2 $REPOSTMP/MANIFEST grep [.]so $REPOSTMP/files.tmp | sort -t : -k 1 -r > $REPOSTMP/libraries-current } create_filelist() { if [ "$QUIET" -ne "1" ]; then echo Creating FILELIST.txt fi FILELIST=`tree -fi --noreport` date >> $REPOSTMP/FILELIST.TXT echo >> $REPOSTMP/FILELIST.TXT echo Here is the file list for this directory. >> $REPOSTMP/FILELIST.TXT echo >> $REPOSTMP/FILELIST.TXT for i in $FILELIST do ls -lad $i 2> /dev/null 1>> $REPOSTMP/FILELIST.TXT done } create_checksums() { if [ "$QUIET" -ne "1" ]; then echo Creating CHECKSUMS.md5 fi rm CHECKSUMS.md5 2> /dev/null FILELIST=`tree -fi --noreport` echo "These are the MD5 message digests for the files in this directory." >> $REPOSTMP/CHECKSUMS.md5 echo "If you want to test your files, use 'md5sum' and compare the values to" >> $REPOSTMP/CHECKSUMS.md echo "the ones listed here." >> $REPOSTMP/CHECKSUMS.md5 echo >> $REPOSTMP/CHECKSUMS.md5 echo "To test all these files, use this command:" >> $REPOSTMP/CHECKSUMS.md5 echo >> $REPOSTMP/CHECKSUMS.md5 echo "md5sum -c CHECKSUMS.md5 | less" >> $REPOSTMP/CHECKSUMS.md5 echo >> $REPOSTMP/CHECKSUMS.md5 echo "'md5sum' can be found in the GNU textutils package on ftp.gnu.org in" >> $REPOSTMP/CHECKSUMS.md5 echo "/pub/gnu, or at any GNU mirror site." >> $REPOSTMP/CHECKSUMS.md5 echo >> $REPOSTMP/CHECKSUMS.md5 for i in $FILELIST do md5sum $i 2> /dev/null 1>> $REPOSTMP/CHECKSUMS.md5 done } cleanup() { if [ "$QUIET" -ne "1" ]; then echo Cleaning up temporary directory fi rm -f $REPOSTMP/* 2> /dev/null } source /etc/repos.conf check_settings "$@" cd $REPOSDIR if [[ "$EXPRESS" == "1" ]]; then express_MPL elif [[ "$PARTIAL" == "1" ]]; then partial_MPL else create_MPL fi cat $REPOSTMP/PACKAGESHEADER.TXT $REPOSTMP/PACKAGESBODY.TXT | uniq > PACKAGES.TXT mv $REPOSTMP/MANIFEST.bz2 . mv $REPOSTMP/libraries-current . create_filelist mv $REPOSTMP/FILELIST.TXT . create_checksums mv $REPOSTMP/CHECKSUMS.md5 . cleanup