Subversion Repositories DevTools

Rev

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