Subversion Repositories DevTools

Rev

Rev 5678 | Rev 6022 | 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
133
PFILE=$OUTDIR/dpkg_archive_pkg.$DATE.txt			# Todays File
134
YFILE=$OUTDIR/dpkg_archive_pkg.$YDATE.txt   		# Yesterdays File
3410 dpurdie 135
 
5678 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
138
 
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
141
 
3410 dpurdie 142
if [ "$DO_VERBOSE" ] ; then
143
	echo "PFILE: $PFILE"
144
	echo "YFILE: $YFILE"
145
	echo "LFILE: $LFILE"
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
 
5678 dpurdie 160
	# Create symlinks to the package-list
161
	#
162
	rm -f $PL1FILE
163
	ln -s $P1FILE $PL1FILE
164
 
165
	rm -f $PL2FILE
166
	ln -s $P2FILE $PL2FILE
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
 
182
	    rm -f $C2FILE
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"
211
        sort $YFILE > $f1
212
        sort $PFILE > $f2
213
        newp=$( comm -13 $f1 $f2)
214
        for file in $newp ; do
215
 
216
            pname="${file##$BASEDIR/}"
217
            pver="${pname##*/}"
218
            pname="${pname%%/*}"
219
 
3413 dpurdie 220
            if [ "$pname" = ".dpkg_archive" ] ; then
221
                continue
222
            fi
223
 
3410 dpurdie 224
            if [ "$pname" = "$pver" ] ; then
225
                printf " D%10s %8s %10s %s\n" "-" "NewDir" "-" $file
226
                continue
227
            fi
228
 
229
            built='-'
230
            if [ -f $file/descpkg ] ; then
231
               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)
232
            fi
233
 
234
            flag='*'
235
            [ "$built" = "buildadm" ] && flag=' '
236
 
237
            tag='ManCpy'
238
            for ii in $file/built.* ; do
239
                tag='Auto'
240
            done
241
 
242
            note='-'
243
            ls 1>/dev/null 2>&1 $file/doc/RELEASE_NOTES_* || note='N'
244
 
245
            result=$(du -ks $file)
5678 dpurdie 246
			psize=$(echo $result | { read first rest; echo $first;})
247
			let "totalsize+=$psize"
248
 
3410 dpurdie 249
            printf "%c%c%10s %8s %10s %s\n" "$note" "$flag" "$built" "$tag" $result
250
        done >> $f3
5678 dpurdie 251
 
252
		let "sizeGb=$totalsize/1024/1024"
253
		echo >> $f3 "Total Blocks added: $totalsize, $sizeGb GB"
3410 dpurdie 254
    fi
255
 
256
    if [ "$DO_REMOVED" ] ; then
257
        [ $DO_VERBOSE ] && echo "Finding removed packages in the archive"
258
 
259
        echo >> $f3 ""
260
        echo >> $f3 "Removed Package Versions"
261
        sort $YFILE > $f1
262
        sort $PFILE > $f2
263
        remp=$( comm -23 $f1 $f2 )
264
        for file in $remp ; do
265
 
266
            pname="${file##$BASEDIR/}"
267
            pver="${pname##*/}"
268
            pname="${pname%%/*}"
269
 
270
            if [ "$pname" != "$pver" ] ; then
271
                printf "  %10s %8s %10s %s\n" "-" "Deleted" "-" $file
272
                continue
273
            fi
274
        done >> $f3
275
    fi
276
 
277
 
278
    #
279
    #   Broken link report
280
    #
281
    if [ "$DO_SCAN" ] ; then
3423 dpurdie 282
        #
283
        #   Scan dpkg_archive for broken and funny links
284
        #
3410 dpurdie 285
        echo "" >> $f3
3423 dpurdie 286
        echo "Dpkg_archive Link Report" >> $f3
287
        scan_release.pl $DPKG >> $f3
3410 dpurdie 288
 
289
        #
290
        #   Scan releases area for broken and funny links
291
        #
292
        echo "" >> $f3
293
        echo "Releases Link Report" >> $f3
294
        scan_release.pl $RELEASES >> $f3
295
 
4011 dpurdie 296
        #
297
        #   Scan unexpected facl state
298
        #
299
        echo "" >> $f3
300
        echo "dpkg_archive ACL  Report" >> $f3
301
        faclscan.pl >> $f3
302
 
3410 dpurdie 303
    fi
3413 dpurdie 304
echo >> $f3 "</pre>"
3410 dpurdie 305
 
306
 
307
 
308
    #
309
    #   Mail results
310
    #
311
    if [ "$DO_MAIL" ] ; then
312
        [ $DO_VERBOSE ] && echo "Mailing Results"
3413 dpurdie 313
        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 314
    else
315
        cat $f3
316
    fi
317
 
318
else
319
    echo "Yesterdays package file not found"
320
    echo "Yesterday:  $YFILE"
321
    echo "Today    :  $PFILE"
322
fi
323
 
324
#
325
#   Clean up
326
#
327
rm -f /tmp/$$.file*
328
 
329
#
3423 dpurdie 330
#   Remove old copies of files from the metadata directory
4127 dpurdie 331
#   Compress old versions ( older than 10 days )
3410 dpurdie 332
#
333
$GFIND $OUTDIR -type f -mtime +100 -exec rm -f  {} \;
4127 dpurdie 334
$GFIND $OUTDIR -type f -mtime +10 -name '*.txt' -exec gzip -q {} \;
3410 dpurdie 335
 
336