Subversion Repositories DevTools

Rev

Rev 4127 | 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
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
 
5678 dpurdie 124
# Files for the package-file-list
3410 dpurdie 125
LFILE=$OUTDIR/dpkg_archive_list.$DATE.txt
126
LLFILE=$METADIR/dpkg_archive_list.$DATE.txt
3413 dpurdie 127
L2FILE=dpkg_archive_list.$DATE.txt
3410 dpurdie 128
CFILE=$BASEDIR/dpkg_archive_list.txt
129
C2FILE=$OUTDIR/dpkg_archive_list.txt
130
 
5678 dpurdie 131
# Files for the package-list
132
PFILE=$OUTDIR/dpkg_archive_pkg.$DATE.txt			# Todays File
133
YFILE=$OUTDIR/dpkg_archive_pkg.$YDATE.txt   		# Yesterdays File
3410 dpurdie 134
 
5678 dpurdie 135
P1FILE=$METADIR/dpkg_archive_pkg.$DATE.txt			# Symlink source for file in Archive directory
136
P2FILE=dpkg_archive_pkg.$DATE.txt   				# Symlink source for file in Meta directory
137
 
138
PL1FILE=$BASEDIR/dpkg_archive_pkg.txt   			# Symlink target for file in Archive directory
139
PL2FILE=$OUTDIR/dpkg_archive_pkg.txt				# Symlink target for file in Meta directory
140
 
3410 dpurdie 141
if [ "$DO_VERBOSE" ] ; then
142
	echo "PFILE: $PFILE"
143
	echo "YFILE: $YFILE"
144
	echo "LFILE: $LFILE"
145
fi
146
mkdir -p $OUTDIR
147
 
148
#
149
#   Find files
150
#   Find packages
151
#
152
if [ "$DO_FIND" ] ; then
153
    [ $DO_VERBOSE ] && echo "Finding all packages in the archive"
154
    #
155
    # Determine packages in archive
156
    #
3413 dpurdie 157
    $GFIND -L $BASEDIR -maxdepth 2 -type d  > $PFILE
3410 dpurdie 158
 
5678 dpurdie 159
	# Create symlinks to the package-list
160
	#
161
	rm -f $PL1FILE
162
	ln -s $P1FILE $PL1FILE
163
 
164
	rm -f $PL2FILE
165
	ln -s $P2FILE $PL2FILE
166
 
3410 dpurdie 167
    #
168
    #   Determine files in the archive
169
    #   Keep a link to simplify user access to the list
170
    #
171
    if [ $DO_FILES ] ; then
172
        [ $DO_VERBOSE ] && echo "Finding all Files in the archive"
173
        $GFIND -L $BASEDIR | sort > $LFILE
174
 
175
        #
176
        #   Create a link to the current list of all files
177
        #
178
        rm -f $CFILE
179
        ln -s $LLFILE $CFILE
180
 
181
	    rm -f $C2FILE
182
        ln -s $L2FILE $C2FILE
183
    fi
184
 
185
fi
186
 
187
f1=/tmp/$$.file1
188
f2=/tmp/$$.file2
189
f3=/tmp/$$.file3
190
 
3413 dpurdie 191
echo >> $f3 '<pre style="font-size: medium">'
3410 dpurdie 192
echo >> $f3 "dpkg_archive Report"
193
echo >> $f3 "Yesterday:  $YFILE"
194
echo >> $f3 "Today    :  $PFILE"
195
echo >> $f3 ""
196
$GDF -h $MOUNTS >> $f3
197
 
198
#
199
#   Determine new packages
200
#
201
#echo "Yesterday:  $YFILE"
202
#echo "Today    :  $PFILE"
203
if [ -f $YFILE ] ; then
204
 
205
    if [ "$DO_NEW" ] ; then
206
        [ $DO_VERBOSE ] && echo "Finding new packages in the archive"
207
 
208
        echo >> $f3 ""
209
        echo >> $f3 "New packages added to dpkg_archive"
210
        sort $YFILE > $f1
211
        sort $PFILE > $f2
212
        newp=$( comm -13 $f1 $f2)
213
        for file in $newp ; do
214
 
215
            pname="${file##$BASEDIR/}"
216
            pver="${pname##*/}"
217
            pname="${pname%%/*}"
218
 
3413 dpurdie 219
            if [ "$pname" = ".dpkg_archive" ] ; then
220
                continue
221
            fi
222
 
3410 dpurdie 223
            if [ "$pname" = "$pver" ] ; then
224
                printf " D%10s %8s %10s %s\n" "-" "NewDir" "-" $file
225
                continue
226
            fi
227
 
228
            built='-'
229
            if [ -f $file/descpkg ] ; then
230
               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)
231
            fi
232
 
233
            flag='*'
234
            [ "$built" = "buildadm" ] && flag=' '
235
 
236
            tag='ManCpy'
237
            for ii in $file/built.* ; do
238
                tag='Auto'
239
            done
240
 
241
            note='-'
242
            ls 1>/dev/null 2>&1 $file/doc/RELEASE_NOTES_* || note='N'
243
 
244
            result=$(du -ks $file)
5678 dpurdie 245
			psize=$(echo $result | { read first rest; echo $first;})
246
			let "totalsize+=$psize"
247
 
3410 dpurdie 248
            printf "%c%c%10s %8s %10s %s\n" "$note" "$flag" "$built" "$tag" $result
249
        done >> $f3
5678 dpurdie 250
 
251
		let "sizeGb=$totalsize/1024/1024"
252
		echo >> $f3 "Total Blocks added: $totalsize, $sizeGb GB"
3410 dpurdie 253
    fi
254
 
255
    if [ "$DO_REMOVED" ] ; then
256
        [ $DO_VERBOSE ] && echo "Finding removed packages in the archive"
257
 
258
        echo >> $f3 ""
259
        echo >> $f3 "Removed Package Versions"
260
        sort $YFILE > $f1
261
        sort $PFILE > $f2
262
        remp=$( comm -23 $f1 $f2 )
263
        for file in $remp ; do
264
 
265
            pname="${file##$BASEDIR/}"
266
            pver="${pname##*/}"
267
            pname="${pname%%/*}"
268
 
269
            if [ "$pname" != "$pver" ] ; then
270
                printf "  %10s %8s %10s %s\n" "-" "Deleted" "-" $file
271
                continue
272
            fi
273
        done >> $f3
274
    fi
275
 
276
 
277
    #
278
    #   Broken link report
279
    #
280
    if [ "$DO_SCAN" ] ; then
3423 dpurdie 281
        #
282
        #   Scan dpkg_archive for broken and funny links
283
        #
3410 dpurdie 284
        echo "" >> $f3
3423 dpurdie 285
        echo "Dpkg_archive Link Report" >> $f3
286
        scan_release.pl $DPKG >> $f3
3410 dpurdie 287
 
288
        #
289
        #   Scan releases area for broken and funny links
290
        #
291
        echo "" >> $f3
292
        echo "Releases Link Report" >> $f3
293
        scan_release.pl $RELEASES >> $f3
294
 
4011 dpurdie 295
        #
296
        #   Scan unexpected facl state
297
        #
298
        echo "" >> $f3
299
        echo "dpkg_archive ACL  Report" >> $f3
300
        faclscan.pl >> $f3
301
 
3410 dpurdie 302
    fi
3413 dpurdie 303
echo >> $f3 "</pre>"
3410 dpurdie 304
 
305
 
306
 
307
    #
308
    #   Mail results
309
    #
310
    if [ "$DO_MAIL" ] ; then
311
        [ $DO_VERBOSE ] && echo "Mailing Results"
3413 dpurdie 312
        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 313
    else
314
        cat $f3
315
    fi
316
 
317
else
318
    echo "Yesterdays package file not found"
319
    echo "Yesterday:  $YFILE"
320
    echo "Today    :  $PFILE"
321
fi
322
 
323
#
324
#   Clean up
325
#
326
rm -f /tmp/$$.file*
327
 
328
#
3423 dpurdie 329
#   Remove old copies of files from the metadata directory
4127 dpurdie 330
#   Compress old versions ( older than 10 days )
3410 dpurdie 331
#
332
$GFIND $OUTDIR -type f -mtime +100 -exec rm -f  {} \;
4127 dpurdie 333
$GFIND $OUTDIR -type f -mtime +10 -name '*.txt' -exec gzip -q {} \;
3410 dpurdie 334
 
335