Subversion Repositories DevTools

Rev

Rev 5404 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1038 dpurdie 1
#! /usr/bin/perl
2
########################################################################
3
# Copyright (C) 2011 Vix-ERG Limited, All rights reserved
4
#
5
# Module name   : flist2.pl
6
# Module type   :
7
# Compiler(s)   : Perl
8
# Environment(s):
9
#
10
# Description   : Generate a package list
11
#                 Format
1042 dpurdie 12
#                   item="value"
13
#                 Valid items include
14
#                   time            - Time in seconds since the epoch of
1038 dpurdie 15
#                                     the packages descpkg file
1042 dpurdie 16
#                   GMT             - Same as Time, except in text form
17
#                   Flags           - Package status flags
18
#                                       D - marked for deletion
19
#                                       L - Is a link
20
#                                       B - Is a broken link
21
#                   pname           - Package Name
22
#                   pver            - Package Version
23
#                   link            - Package Version is a link. Link target
24
#                   broken          - Broken link
25
#                   deleted         - Version marked for deletion
26
#                                     Specified days ago.
1038 dpurdie 27
#
28
#......................................................................#
29
 
30
require 5.008_002;
31
use strict;
32
use warnings;
5404 dpurdie 33
use Sys::Hostname;
6320 dpurdie 34
use Digest::MD5;
1038 dpurdie 35
 
1042 dpurdie 36
my $dpkg = "$ENV{HOME}/dpkg_archive";
5404 dpurdie 37
my $CountDeleted = 0;
38
my $CountMissing = 0;
39
my $CountDamaged = 0;
40
my $CountTotal = 0;
1038 dpurdie 41
 
5404 dpurdie 42
#
43
#   MetaData
44
#   About the disk
45
#
46
printMetaData('Hostname', hostname);
47
insertDiskMetaData($dpkg);
48
 
49
#
50
#   Package Information
51
#   
1038 dpurdie 52
opendir(DIR, $dpkg) || die "can't opendir $dpkg: $!";
53
my @dlist = readdir(DIR);
54
closedir DIR;
55
 
56
foreach my $pname ( sort @dlist )
57
{
58
    next if ( $pname eq '.' );
59
    next if ( $pname eq '..' );
1042 dpurdie 60
    next if ( $pname eq '.dpkg_archive' );
1038 dpurdie 61
    my $dir = $dpkg . '/'. $pname;
62
    next unless ( -d $dir );
63
 
64
    opendir(DIR, $dir )|| die "can't opendir $dir: $!";
65
    my @vlist = readdir(DIR);
66
    closedir DIR;
67
 
68
    foreach my $vname ( sort @vlist )
69
    {
70
        next if ( $vname eq '.' );
71
        next if ( $vname eq '..' );
72
        next if ( $vname =~ m~\.TMPDIR$~ );
73
        my $vdir = $dir . '/' . $vname;
1042 dpurdie 74
#        next unless ( -d $vdir );
75
#        next unless ( -f "$vdir/descpkg" );
1038 dpurdie 76
        my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
1042 dpurdie 77
            $atime,$mtime,$ctime,$blksize,$blocks) = stat("$vdir/descpkg");
1038 dpurdie 78
 
1042 dpurdie 79
        $mtime = 0 unless ( $mtime );
80
 
81
        my $age = 0;
82
        $age = -M _ if ( -f "$vdir/.deletepkg" );
83
 
84
        my $link = '';
85
        $link = readlink($vdir) if ( -l $vdir );
86
 
87
        print   quoteData('time', $mtime, 1),
88
                quoteData('GMT', scalar gmtime $mtime, 1),
89
                quoteData('pname', $pname, 1 ),
90
                quoteData('pver', $vname,1 ),
91
                quoteData('deleted', int($age), $age ),
92
                quoteData('link', $link,  $link  ),
93
                quoteData('broken', 1, ! -e $vdir  ),
94
                quoteData('noDescpkg', 1, ! -f "$vdir/descpkg"  ),
95
                "\n";
5404 dpurdie 96
 
97
        #
98
        #   Update statistics
99
        #
100
        $CountTotal++;   
101
        $CountDeleted++ if ($age);
102
        $CountMissing++ if (! -e $vdir);
103
        $CountDamaged++ if (! -f "$vdir/descpkg");
1038 dpurdie 104
    }
105
}
106
 
5404 dpurdie 107
#
6320 dpurdie 108
#   Data about blats internal files
109
#   
110
insertBlatFiles();
111
 
112
#
5404 dpurdie 113
#   Output summary data as MetaData
114
#
115
printMetaData('Total',$CountTotal);
116
printMetaData('Delete',$CountDeleted);
117
printMetaData('Missing',$CountMissing);
118
printMetaData('Damaged',$CountDamaged);
119
 
1042 dpurdie 120
#-------------------------------------------------------------------------------
121
# Function        : quoteData
122
#
123
# Description     : Given an item and data, provided a quoted string
124
#
125
# Inputs          : $item
126
#                   $data
127
#                   $enable
128
#
129
# Returns         : Quoted string
130
#
131
sub quoteData
132
{
133
    my ($item, $data, $enable) = @_;
134
    if ( $enable ) {
135
        return $item . '="' . $data . '" ';
136
    }
137
    return '';
138
}
139
 
5404 dpurdie 140
#-------------------------------------------------------------------------------
141
# Function        : printMetaData 
142
#
143
# Description     : Add metadata to the output stream
144
#
145
# Inputs          : name        - Name of the data
146
#                   value       - Value
147
#
148
# Returns         : 
149
#
150
sub printMetaData
151
{
152
    my ($name,$value) = @_;
153
    print('Metadata ', quoteData($name, $value, 1), "\n");
154
}
1042 dpurdie 155
 
6320 dpurdie 156
#-------------------------------------------------------------------------------
157
# Function        : insertBlatFiles 
158
#
159
# Description     : Insert data about the BLAT files
160
#
161
# Inputs          : None. 
162
#
163
# Returns         : Nothing
164
#
165
sub insertBlatFiles
166
{
167
    my $blatDir = "$ENV{HOME}/bin";
168
    if (opendir(DIR, $blatDir ) ) {
169
        my @vlist = readdir(DIR);
170
        closedir DIR;
5404 dpurdie 171
 
6320 dpurdie 172
        foreach my $vname ( sort @vlist )
173
        {
174
            next if ( $vname eq '.' );
175
            next if ( $vname eq '..' );
176
            next unless ( -f "$blatDir/$vname" );
177
            my $md5 = "FileReadError";
178
 
179
            if (open FILE, "$blatDir/$vname") {
180
                $md5 = Digest::MD5->new->addfile (*FILE)->hexdigest;
181
                close (FILE);
182
            }
183
            print   'BlatBin ',
184
                    quoteData('MD5', $md5, 1),
185
                    quoteData('file', $vname, 1 ),
186
                    "\n";
187
        }
188
    }
189
}
190
 
5404 dpurdie 191
#-------------------------------------------------------------------------------
192
# Function        : insertDiskMetaData  
193
#
194
# Description     : Generates Disk Metadata entries in the output stream
195
#                   Keys are: 
196
#                       size   used  avail  pcent 
197
#                       itotal iused iavail ipcent 
198
#
199
#                   Needs to use basic 'df' functionality. Not all targets
200
#                   will have a full gnu implementation. 
201
#
202
# Inputs          : $path       - Path somewhere on the drive to examine
203
#
204
# Returns         : Nothing
205
#
206
sub insertDiskMetaData
207
{
208
    my ($path) = @_;
209
 
210
    #
211
    #   Get disk information
212
    #
213
    my @items = qw(- size used avail pcent -);
214
    open my $dfData , "-|", "df", '-P', $path;
215
    while (<$dfData>)
216
    {
217
        next if $. < 2;
218
        s~\s+$~~;
219
        s~\%~~g;
220
        my @data = split;
221
 
222
        for (my $ii=0; $ii <= $#items; $ii++)
223
        {
224
            next if $items[$ii] eq '-';
225
            printMetaData( $items[$ii], $data[$ii]);
226
        }
227
    }
228
    close $dfData;
229
 
230
    #
231
    #   Get Inode information
232
    #   Disk can fill up if inodes are depleated
233
    #
234
    @items = qw(- isize iused iavail ipcent -);
235
    open $dfData , "-|", "df", '-Pi', $path;
236
    while (<$dfData>)
237
    {
238
        next if $. < 2;
239
        s~\s+$~~;
240
        s~\%~~g;
241
        my @data = split;
242
 
243
        for (my $ii=0; $ii <= $#items; $ii++)
244
        {
245
            next if $items[$ii] eq '-';
246
            printMetaData($items[$ii], $data[$ii]);
247
        }
248
    }
249
    close $dfData;
250
}
251
 
252
 
253
 
254
 
255