Subversion Repositories DevTools

Rev

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