Rev 6022 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#!/bin/bash# Copyright (c) VIX TECHNOLOGY (AUST) LTD#set -x################################################################################# Script to assist in managing dpkg_archive# It may do too much. It does:# * Reports free space on drives used# * Create a list of files in dpkg_archive - for users to grep# * Create a list of packages in dpkg_archive# * Generate a report of packages added and removed# * Scan dpkg_archive for broen links - at the top level only# May be historic. When dpkgarchive was spread over several disks# * Scan the 'releases' area for# * Broken links# * Absolute links#################################################################################### Config#MAILTO=David.Purdie@vixtechnology.com,John.Rowling@vixtechnology.comFROM=buildadm@vixtechnology.comCCTO=PATH=$HOME/bin:$HOME/cron:$PATHDPKG=/export/devl/dpkg_archiveRELEASES=/export/devl/releases#QUARANTINE=/export/devl/quarantineBASEDIR=$DPKGMETADIR=.dpkg_archive/pkg_cronOUTDIR=$BASEDIR/$METADIRGFIND=/usr/bin/findGDF=/bin/df#MOUNTS="$DPKG $RELEASES $QUARANTINE"MOUNTS="$DPKG $RELEASES"# Enable null globbing#shopt -s nullglob## Debug Control#DO_VERBOSE=DO_FIND=1DO_MAIL=1DO_NEW=1DO_REMOVED=1DO_FILES=1DO_SCAN=1DATE=YDATE=## Parse user (debug) options#for arg in $* ; docase $arg innomail) DO_MAIL= ;;nofind) DO_FIND= ;;nofiles) DO_FILES= ;;noremoved) DO_REMOVED= ;;nonew) DO_NEW= ;;noscan) DO_SCAN= ;;today=*) DATE=${arg##*=} ;;yesterday=*) YDATE=${arg##*=} ;;mail=*) MAILTO=${arg##*=} ;;verbose) DO_VERBOSE=1 ;;*help) echo "Options: nomail, nofind, nofiles, nonew, noremoved, noscan, today=xxx, yesterday=yyy, mail=zzz verbose"; exit 0 ;;* ) echo "Unknown option $arg"; exit 1 ;;esacdoneif [ $DO_VERBOSE ] ; thenecho "DATE : $DATE";echo "YDATE : $YDATE";echo "MAILTO : $MAILTO";echo "DO_FIND : $DO_FIND";echo "DO_FILES : $DO_FILES";echo "DO_NEW : $DO_NEW";echo "DO_REMOVED : $DO_REMOVED";echo "DO_SCAN : $DO_SCAN";echo "DO_MAIL : $DO_MAIL";fiif [ ! "$DATE" ] ; thenDATE=$(date +%Y-%m-%d)fi## Determine Yesterdays date to locate yesterdays logfile#if [ ! "$YDATE" ] ; thenDAYS=( Sat Sun Mon Tue Wed Thu Fri Sat)MONTHS=( Dec Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)YESTERDAY=$((`date +%e` -1))MONTH=`date +%m`YEAR=`date +%Y`NDAY=`date +%u`WEEKDAY=${DAYS[`date +%u`]}MONTH=${MONTH#0}if [ $YESTERDAY -eq "0" ]thenMONTH=$((MONTH-1))if [ $MONTH -eq "0" ]thenMONTH=12YEAR=$((YEAR-1))fiset `cal $MONTH $YEAR`shift $(($# - 1))YESTERDAY=$1fiTMONTH=${MONTHS[MONTH]}# echo $WEEKDAY $YESTERDAY $MONTH $TMONTH $YEAR#echo $YESTERDAYYDATE=$( printf "%4.4d-%2.2d-%2.2d" $YEAR $MONTH $YESTERDAY )fi# Files for the package-file-listLFILE=$OUTDIR/dpkg_archive_list.$DATE.txtLLFILE=$METADIR/dpkg_archive_list.$DATE.txtL2FILE=dpkg_archive_list.$DATE.txtCFILE=$BASEDIR/dpkg_archive_list.txtC2FILE=$OUTDIR/dpkg_archive_list.txt# Files for the package-listPFILE=$OUTDIR/dpkg_archive_pkg.$DATE.txt # Todays FileYFILE=$OUTDIR/dpkg_archive_pkg.$YDATE.txt # Yesterdays FileP1FILE=$METADIR/dpkg_archive_pkg.$DATE.txt # Symlink source for file in Archive directoryP2FILE=dpkg_archive_pkg.$DATE.txt # Symlink source for file in Meta directoryPL1FILE=$BASEDIR/dpkg_archive_pkg.txt # Symlink target for file in Archive directoryPL2FILE=$OUTDIR/dpkg_archive_pkg.txt # Symlink target for file in Meta directoryif [ "$DO_VERBOSE" ] ; thenecho "PFILE: $PFILE"echo "YFILE: $YFILE"echo "LFILE: $LFILE"fimkdir -p $OUTDIR## Find files# Find packages#if [ "$DO_FIND" ] ; then[ $DO_VERBOSE ] && echo "Finding all packages in the archive"## Determine packages in archive#$GFIND -L $BASEDIR -maxdepth 2 -type d > $PFILE# Create symlinks to the package-list#rm -f $PL1FILEln -s $P1FILE $PL1FILErm -f $PL2FILEln -s $P2FILE $PL2FILE## Determine files in the archive# Keep a link to simplify user access to the list#if [ $DO_FILES ] ; then[ $DO_VERBOSE ] && echo "Finding all Files in the archive"$GFIND -L $BASEDIR | sort > $LFILE## Create a link to the current list of all files#rm -f $CFILEln -s $LLFILE $CFILErm -f $C2FILEln -s $L2FILE $C2FILEfifif1=/tmp/$$.file1f2=/tmp/$$.file2f3=/tmp/$$.file3echo >> $f3 '<pre style="font-size: medium">'echo >> $f3 "dpkg_archive Report"echo >> $f3 "Yesterday: $YFILE"echo >> $f3 "Today : $PFILE"echo >> $f3 ""$GDF -h $MOUNTS >> $f3## Determine new packages##echo "Yesterday: $YFILE"#echo "Today : $PFILE"if [ -f $YFILE ] ; thenif [ "$DO_NEW" ] ; then[ $DO_VERBOSE ] && echo "Finding new packages in the archive"echo >> $f3 ""echo >> $f3 "New packages added to dpkg_archive"totalsize=0sort $YFILE > $f1sort $PFILE > $f2newp=$( comm -13 $f1 $f2)for file in $newp ; dopname="${file##$BASEDIR/}"pver="${pname##*/}"pname="${pname%%/*}"if [ "$pname" = ".dpkg_archive" ] ; thencontinuefiif [ "$pname" = "$pver" ] ; thenprintf " D%10s %8s %10s %s\n" "-" "NewDir" "-" $filecontinuefibuilt='-'if [ -f $file/descpkg ] ; thenbuilt=$( sed -n '-e/^Released By:/s~.*: *\([-_.0-9a-zA-Z]*\).*~\1~p' '-e/^Built By:/s~.*: *\([-_.0-9a-zA-Z]*\).*~\1~p' < $file/descpkg)fiflag='*'[ "$built" = "buildadm" ] && flag=' 'tag='ManCpy'for ii in $file/built.* ; dotag='Auto'donenote='-'ls 1>/dev/null 2>&1 $file/doc/RELEASE_NOTES_* || note='N'result=$(du -ks $file)psize=$(echo $result | { read first rest; echo $first;})let "totalsize+=$psize"printf "%c%c%10s %8s %10s %s\n" "$note" "$flag" "$built" "$tag" $resultdone >> $f3let "sizeGb=$totalsize/1024/1024"echo >> $f3 "Total Blocks added: $totalsize, $sizeGb GB"fiif [ "$DO_REMOVED" ] ; then[ $DO_VERBOSE ] && echo "Finding removed packages in the archive"echo >> $f3 ""echo >> $f3 "Removed Package Versions"sort $YFILE > $f1sort $PFILE > $f2remp=$( comm -23 $f1 $f2 )for file in $remp ; dopname="${file##$BASEDIR/}"pver="${pname##*/}"pname="${pname%%/*}"if [ "$pname" != "$pver" ] ; thenprintf " %10s %8s %10s %s\n" "-" "Deleted" "-" $filecontinuefidone >> $f3fi## Broken link report#if [ "$DO_SCAN" ] ; then## Scan dpkg_archive for broken and funny links#echo "" >> $f3echo "Dpkg_archive Link Report" >> $f3scan_release.pl $DPKG >> $f3## Scan releases area for broken and funny links#echo "" >> $f3echo "Releases Link Report" >> $f3scan_release.pl $RELEASES >> $f3## Scan unexpected facl state#echo "" >> $f3echo "dpkg_archive ACL Report" >> $f3faclscan.pl >> $f3fiecho >> $f3 "</pre>"## Mail results#if [ "$DO_MAIL" ] ; then[ $DO_VERBOSE ] && echo "Mailing Results"sendEmail.pl -q -f ${FROM} -t ${MAILTO} ${CCTO} -u "[dpkg_archive] $DATE Archive Report from $HOSTNAME" '-o' 'message-content-type=html' -o "message-file=$f3"elsecat $f3fielseecho "Yesterdays package file not found"echo "Yesterday: $YFILE"echo "Today : $PFILE"fi## Clean up#rm -f /tmp/$$.file*## Remove old copies of files from the metadata directory# Compress old versions ( older than 10 days )#$GFIND $OUTDIR -type f -mtime +100 -exec rm -f {} \;$GFIND $OUTDIR -type f -mtime +10 -name '*.txt' -exec gzip -q {} \;