123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #!/bin/bash
- ## Iterate through complete package archive to generate a complete list of SHA1
- ## Uses some magic to directly generate sha1sums without extracting to disk
- ##
- ## Command parameter 'init' will build from scratch. Very slow.
- ##
- ## Bin packages may contain links. For simplicity we currently dereference
- ## these("tar -xhv"), so we have each file with its associated sha1 measurement.
- work=/srv/http/htdocs/apt-sec/
- dest=$work/mirror/Sha1Sums.db
- log=$work/mirror/sha1db.log
- apt=/srv/apt-mirror
- archive=$apt/mirror
- var=$apt/var
- NEW=$apt/var/NEW
- ALL=$apt/var/ALL
- ALL=$apt/var/DEL
- action="$1"
- #which sqlite3 > /dev/null || echo 'Need sqlite3. Exit.' 2>&1
- #which sqlite3 > /dev/null || exit
- # some overrides
- [ "AA${PKGS}" = "AA" ] || archive="$PKGS"
- [ "AA${DEST}" = "AA" ] || dest="$DEST"
- echo "Updating Sha1Sums.."
- echo > $log
- sha1pipe () {
- file="$1"
- pkg="$(basename $1)"
- tmp=$(mktemp -d)
- ar -t $file |grep -q data.tar.gz && ( ar p $file data.tar.gz | tar xzC $tmp || echo "Can't extract from $file" )
- ar -t $file |grep -q data.tar.bz2 && ( ar p $file data.tar.bz2 | tar xjC $tmp || echo "Can't extract from $file" )
- cd $tmp
- ## stream of <shasum>::<package>::<filepath>
- find . -type f -exec sha1sum {} \+ \
- | sed -e "s/'/\\\'/" -e "s/^/insert into sha2pkg (hash, pkg, file) VALUES('/" -e "s/ \./', '$pkg', '/" -e "s/$/')\;/"
- cd /
- rm -rf $tmp
- }
- case $action in
- "init")
- # delete and rebuild sha1 db
- echo "Reinit - deleting current SHA1 db.."
- rm $dest
- sqlite3 $dest 'create table sha2pkg (hash char(20), pkg text, file text)'
- sqlite3 $dest 'create index [IDX_hash] on sha2pkg (hash)'
- echo "Reinitializing SHA1 DB.."
- (echo "begin;";
- for pkg in $(find $archive -type f -iname \*.deb); do
- echo "Adding $pkg to sha1 db.." >> $log
- sha1pipe $pkg
- done; echo "commit"; ) > $dest.sql
- #cat $dest.sql |sqlite3 $dest >> $log 2>&1
- ;;
- "update")
- # record removed packets, remove sha1sums of packets recorded *last week*
- # delete packages that were removed last week
- # (how long are packages kept in online repo?)
- del=$DEL-$(date +%w)
- touch $del
- for pkg in $(cat $del); do
- echo "Deleting outdated package $pkg from db.." >> $log
- echo "delete * from sha2pkg where pkg='$pkg';"
- done > $dest.sql
- # | sqlite3 $dest >> $log 2>&1
- # identify newly removed packages, overwriting last week's DEL record
- for pkg in $(cat $ALL.old); do
- grep -q $pkg $ALL || echo $pkg >> $del
- done
- cp $ALL $ALL.old
- # add sha1 sums for new pkgs
- (echo "begin;";
- for pkg in $(cat $NEW); do
- pkg=$(echo $pkg|sed 's/.*:\/\///');
- echo "Adding $pkg to sha1 db.." >> $log
- sha1pipe $archive/$pkg
- done; echo "commit"; ) > $dest.sql
- #| sqlite3 $dest >> $log 2>&1
-
- # make sure we don't parse those packages again
- # (shouldn't wait for next apt-mirror call)
- echo -n > $NEW
- ;;
- *)
- echo
- echo "Usage: $0 (init|update)" 2>&1
- echo
- exit
- esac
|