Subversion Repositories DevTools

Rev

Rev 5813 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3410 dpurdie 1
#!/bin/bash
5813 dpurdie 2
# Copyright (c) VIX TECHNOLOGY (AUST) LTD
3410 dpurdie 3
#set -x
3423 dpurdie 4
################################################################################
5
#   Script to assist in managing dpkg_archive
6
#   It may do too much. It does:
7
#   * Reports free space on drives used
8
#   * Create a list of files in dpkg_archive - for users to grep
9
#   * Create a list of packages in dpkg_archive
10
#   * Generate a report of packages added and removed
11
#   * Scan dpkg_archive for broen links - at the top level only
12
#     May be historic. When dpkgarchive was spread over several disks
13
#   * Scan the 'releases' area for
14
#     * Broken links
15
#     * Absolute links
3410 dpurdie 16
#
3423 dpurdie 17
#
18
################################################################################
19
#
3410 dpurdie 20
#   Config
21
#
22
MAILTO=David.Purdie@vixtechnology.com,John.Rowling@vixtechnology.com
3413 dpurdie 23
FROM=buildadm@vixtechnology.com
3410 dpurdie 24
CCTO=
3423 dpurdie 25
PATH=$HOME/bin:$HOME/cron:$PATH
3410 dpurdie 26
DPKG=/export/devl/dpkg_archive
27
RELEASES=/export/devl/releases
3423 dpurdie 28
QUARANTINE=/export/devl/quarantine
3410 dpurdie 29
BASEDIR=$DPKG
30
METADIR=.dpkg_archive/pkg_cron
31
OUTDIR=$BASEDIR/$METADIR
32
GFIND=/usr/bin/find
33
GDF=/bin/df
3423 dpurdie 34
MOUNTS="$DPKG $RELEASES $QUARANTINE"
3410 dpurdie 35
 
36
 
37
# Enable null globbing
38
#
39
shopt -s nullglob
40
#
41
#   Debug Control
42
#
43
DO_VERBOSE=
44
DO_FIND=1
45
DO_MAIL=1
46
DO_NEW=1
47
DO_REMOVED=1
48
DO_FILES=1
49
DO_SCAN=1
50
DATE=
51
YDATE=
52
 
53
#
54
#   Parse user (debug) options
55
#
56
for arg in $* ; do
57
    case $arg in
58
        nomail) DO_MAIL= ;;
59
        nofind) DO_FIND= ;;
60
        nofiles) DO_FILES= ;;
61
        noremoved) DO_REMOVED= ;;
62
        nonew)  DO_NEW= ;;
63
        noscan)  DO_SCAN= ;;
64
        today=*) DATE=${arg##*=} ;;
65
        yesterday=*) YDATE=${arg##*=} ;;
66
        mail=*) MAILTO=${arg##*=} ;;
67
        verbose) DO_VERBOSE=1 ;;
68
        *help)  echo "Options: nomail, nofind, nofiles, nonew, noremoved, noscan, today=xxx, yesterday=yyy, mail=zzz verbose"; exit 0 ;;
69
        * ) echo "Unknown option $arg"; exit 1 ;;
70
    esac
71
done
72
 
73
if [ $DO_VERBOSE ] ; then
74
    echo "DATE        : $DATE";
75
    echo "YDATE       : $YDATE";
76
    echo "MAILTO      : $MAILTO";
77
    echo "DO_FIND     : $DO_FIND";
78
    echo "DO_FILES    : $DO_FILES";
79
    echo "DO_NEW      : $DO_NEW";
80
    echo "DO_REMOVED  : $DO_REMOVED";
81
    echo "DO_SCAN     : $DO_SCAN";
82
    echo "DO_MAIL     : $DO_MAIL";
83
fi
84
 
85
if [ ! "$DATE" ] ; then
86
    DATE=$(date +%Y-%m-%d)
87
fi
88
 
89
#
90
# Determine Yesterdays date to locate yesterdays logfile
91
#
92
if [ ! "$YDATE" ] ; then
93
    DAYS=( Sat Sun Mon Tue Wed Thu Fri Sat)
94
    MONTHS=( Dec Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
95
 
96
    YESTERDAY=$((`date +%e` -1))
97
    MONTH=`date +%m`
98
    YEAR=`date +%Y`
99
    NDAY=`date +%u`
100
    WEEKDAY=${DAYS[`date +%u`]}
101
    MONTH=${MONTH#0}
102
    if [ $YESTERDAY -eq "0" ]
103
    then
104
        MONTH=$((MONTH-1))
105
 
106
        if [ $MONTH -eq "0" ]
107
        then
108
            MONTH=12
109
            YEAR=$((YEAR-1))
110
        fi
111
 
112
        set `cal $MONTH $YEAR`
113
        shift $(($# - 1))
114
        YESTERDAY=$1
115
    fi
116
 
117
    TMONTH=${MONTHS[MONTH]}
118
    # echo $WEEKDAY $YESTERDAY $MONTH $TMONTH $YEAR
119
    #echo $YESTERDAY
120
 
121
    YDATE=$( printf "%4.4d-%2.2d-%2.2d" $YEAR $MONTH $YESTERDAY )
122
fi
123
 
124
 
5678 dpurdie 125
# Files for the package-file-list
3410 dpurdie 126
LFILE=$OUTDIR/dpkg_archive_list.$DATE.txt
127
LLFILE=$METADIR/dpkg_archive_list.$DATE.txt
3413 dpurdie 128
L2FILE=dpkg_archive_list.$DATE.txt
3410 dpurdie 129
CFILE=$BASEDIR/dpkg_archive_list.txt
130
C2FILE=$OUTDIR/dpkg_archive_list.txt
131
 
5678 dpurdie 132
# Files for the package-list
6022 dpurdie 133
PFILE=$OUTDIR/dpkg_archive_pkg.$DATE.txt            # Todays File
134
YFILE=$OUTDIR/dpkg_archive_pkg.$YDATE.txt           # Yesterdays File
3410 dpurdie 135
 
6022 dpurdie 136
P1FILE=$METADIR/dpkg_archive_pkg.$DATE.txt          # Symlink source for file in Archive directory
137
P2FILE=dpkg_archive_pkg.$DATE.txt                   # Symlink source for file in Meta directory
5678 dpurdie 138
 
6022 dpurdie 139
PL1FILE=$BASEDIR/dpkg_archive_pkg.txt               # Symlink target for file in Archive directory
140
PL2FILE=$OUTDIR/dpkg_archive_pkg.txt                # Symlink target for file in Meta directory
5678 dpurdie 141
 
3410 dpurdie 142
if [ "$DO_VERBOSE" ] ; then
6022 dpurdie 143
    echo "PFILE: $PFILE"
144
    echo "YFILE: $YFILE"
145
    echo "LFILE: $LFILE"
3410 dpurdie 146
fi
147
mkdir -p $OUTDIR
148
 
149
#
150
#   Find files
151
#   Find packages
152
#
153
if [ "$DO_FIND" ] ; then
154
    [ $DO_VERBOSE ] && echo "Finding all packages in the archive"
155
    #
156
    # Determine packages in archive
157
    #
3413 dpurdie 158
    $GFIND -L $BASEDIR -maxdepth 2 -type d  > $PFILE
3410 dpurdie 159
 
6022 dpurdie 160
    # Create symlinks to the package-list
161
    #
162
    rm -f $PL1FILE
163
    ln -s $P1FILE $PL1FILE
5678 dpurdie 164
 
6022 dpurdie 165
    rm -f $PL2FILE
166
    ln -s $P2FILE $PL2FILE
5678 dpurdie 167
 
3410 dpurdie 168
    #
169
    #   Determine files in the archive
170
    #   Keep a link to simplify user access to the list
171
    #
172
    if [ $DO_FILES ] ; then
173
        [ $DO_VERBOSE ] && echo "Finding all Files in the archive"
174
        $GFIND -L $BASEDIR | sort > $LFILE
175
 
176
        #
177
        #   Create a link to the current list of all files
178
        #
179
        rm -f $CFILE
180
        ln -s $LLFILE $CFILE
181
 
6022 dpurdie 182
        rm -f $C2FILE
3410 dpurdie 183
        ln -s $L2FILE $C2FILE
184
    fi
185
 
186
fi
187
 
188
f1=/tmp/$$.file1
189
f2=/tmp/$$.file2
190
f3=/tmp/$$.file3
191
 
3413 dpurdie 192
echo >> $f3 '<pre style="font-size: medium">'
3410 dpurdie 193
echo >> $f3 "dpkg_archive Report"
194
echo >> $f3 "Yesterday:  $YFILE"
195
echo >> $f3 "Today    :  $PFILE"
196
echo >> $f3 ""
197
$GDF -h $MOUNTS >> $f3
198
 
199
#
200
#   Determine new packages
201
#
202
#echo "Yesterday:  $YFILE"
203
#echo "Today    :  $PFILE"
204
if [ -f $YFILE ] ; then
205
 
206
    if [ "$DO_NEW" ] ; then
207
        [ $DO_VERBOSE ] && echo "Finding new packages in the archive"
208
 
209
        echo >> $f3 ""
210
        echo >> $f3 "New packages added to dpkg_archive"
6022 dpurdie 211
        totalsize=0
3410 dpurdie 212
        sort $YFILE > $f1
213
        sort $PFILE > $f2
214
        newp=$( comm -13 $f1 $f2)
215
        for file in $newp ; do
216
 
217
            pname="${file##$BASEDIR/}"
218
            pver="${pname##*/}"
219
            pname="${pname%%/*}"
220
 
3413 dpurdie 221
            if [ "$pname" = ".dpkg_archive" ] ; then
222
                continue
223
            fi
224
 
3410 dpurdie 225
            if [ "$pname" = "$pver" ] ; then
226
                printf " D%10s %8s %10s %s\n" "-" "NewDir" "-" $file
227
                continue
228
            fi
229
 
230
            built='-'
231
            if [ -f $file/descpkg ] ; then
232
               built=$( sed -n '-e/^Released By:/s~.*: *\([-_.0-9a-zA-Z]*\).*~\1~p' '-e/^Built By:/s~.*: *\([-_.0-9a-zA-Z]*\).*~\1~p' < $file/descpkg)
233
            fi
234
 
235
            flag='*'
236
            [ "$built" = "buildadm" ] && flag=' '
237
 
238
            tag='ManCpy'
239
            for ii in $file/built.* ; do
240
                tag='Auto'
241
            done
242
 
243
            note='-'
244
            ls 1>/dev/null 2>&1 $file/doc/RELEASE_NOTES_* || note='N'
245
 
246
            result=$(du -ks $file)
6022 dpurdie 247
            psize=$(echo $result | { read first rest; echo $first;})
248
            let "totalsize+=$psize"
5678 dpurdie 249
 
3410 dpurdie 250
            printf "%c%c%10s %8s %10s %s\n" "$note" "$flag" "$built" "$tag" $result
251
        done >> $f3
5678 dpurdie 252
 
6022 dpurdie 253
        let "sizeGb=$totalsize/1024/1024"
254
        echo >> $f3 "Total Blocks added: $totalsize, $sizeGb GB"
3410 dpurdie 255
    fi
256
 
257
    if [ "$DO_REMOVED" ] ; then
258
        [ $DO_VERBOSE ] && echo "Finding removed packages in the archive"
259
 
260
        echo >> $f3 ""
261
        echo >> $f3 "Removed Package Versions"
262
        sort $YFILE > $f1
263
        sort $PFILE > $f2
264
        remp=$( comm -23 $f1 $f2 )
265
        for file in $remp ; do
266
 
267
            pname="${file##$BASEDIR/}"
268
            pver="${pname##*/}"
269
            pname="${pname%%/*}"
270
 
271
            if [ "$pname" != "$pver" ] ; then
272
                printf "  %10s %8s %10s %s\n" "-" "Deleted" "-" $file
273
                continue
274
            fi
275
        done >> $f3
276
    fi
277
 
278
 
279
    #
280
    #   Broken link report
281
    #
282
    if [ "$DO_SCAN" ] ; then
3423 dpurdie 283
        #
284
        #   Scan dpkg_archive for broken and funny links
285
        #
3410 dpurdie 286
        echo "" >> $f3
3423 dpurdie 287
        echo "Dpkg_archive Link Report" >> $f3
288
        scan_release.pl $DPKG >> $f3
3410 dpurdie 289
 
290
        #
291
        #   Scan releases area for broken and funny links
292
        #
293
        echo "" >> $f3
294
        echo "Releases Link Report" >> $f3
295
        scan_release.pl $RELEASES >> $f3
296
 
4011 dpurdie 297
        #
298
        #   Scan unexpected facl state
299
        #
300
        echo "" >> $f3
301
        echo "dpkg_archive ACL  Report" >> $f3
302
        faclscan.pl >> $f3
303
 
3410 dpurdie 304
    fi
3413 dpurdie 305
echo >> $f3 "</pre>"
3410 dpurdie 306
 
307
 
308
 
309
    #
310
    #   Mail results
311
    #
312
    if [ "$DO_MAIL" ] ; then
313
        [ $DO_VERBOSE ] && echo "Mailing Results"
3413 dpurdie 314
        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"
3410 dpurdie 315
    else
316
        cat $f3
317
    fi
318
 
319
else
320
    echo "Yesterdays package file not found"
321
    echo "Yesterday:  $YFILE"
322
    echo "Today    :  $PFILE"
323
fi
324
 
325
#
326
#   Clean up
327
#
328
rm -f /tmp/$$.file*
329
 
330
#
3423 dpurdie 331
#   Remove old copies of files from the metadata directory
4127 dpurdie 332
#   Compress old versions ( older than 10 days )
3410 dpurdie 333
#
334
$GFIND $OUTDIR -type f -mtime +100 -exec rm -f  {} \;
4127 dpurdie 335
$GFIND $OUTDIR -type f -mtime +10 -name '*.txt' -exec gzip -q {} \;
3410 dpurdie 336
 
337