Subversion Repositories DevTools

Rev

Rev 1042 | Go to most recent revision | 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;
1038 dpurdie 34
 
1042 dpurdie 35
my $dpkg = "$ENV{HOME}/dpkg_archive";
5404 dpurdie 36
my $CountDeleted = 0;
37
my $CountMissing = 0;
38
my $CountDamaged = 0;
39
my $CountTotal = 0;
1038 dpurdie 40
 
5404 dpurdie 41
#
42
#   MetaData
43
#   About the disk
44
#
45
printMetaData('Hostname', hostname);
46
insertDiskMetaData($dpkg);
47
 
48
#
49
#   Package Information
50
#   
1038 dpurdie 51
opendir(DIR, $dpkg) || die "can't opendir $dpkg: $!";
52
my @dlist = readdir(DIR);
53
closedir DIR;
54
 
55
foreach my $pname ( sort @dlist )
56
{
57
    next if ( $pname eq '.' );
58
    next if ( $pname eq '..' );
1042 dpurdie 59
    next if ( $pname eq '.dpkg_archive' );
1038 dpurdie 60
    my $dir = $dpkg . '/'. $pname;
61
    next unless ( -d $dir );
62
 
63
    opendir(DIR, $dir )|| die "can't opendir $dir: $!";
64
    my @vlist = readdir(DIR);
65
    closedir DIR;
66
 
67
    foreach my $vname ( sort @vlist )
68
    {
69
        next if ( $vname eq '.' );
70
        next if ( $vname eq '..' );
71
        next if ( $vname =~ m~\.TMPDIR$~ );
72
        my $vdir = $dir . '/' . $vname;
1042 dpurdie 73
#        next unless ( -d $vdir );
74
#        next unless ( -f "$vdir/descpkg" );
1038 dpurdie 75
        my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
1042 dpurdie 76
            $atime,$mtime,$ctime,$blksize,$blocks) = stat("$vdir/descpkg");
1038 dpurdie 77
 
1042 dpurdie 78
        $mtime = 0 unless ( $mtime );
79
 
80
        my $age = 0;
81
        $age = -M _ if ( -f "$vdir/.deletepkg" );
82
 
83
        my $link = '';
84
        $link = readlink($vdir) if ( -l $vdir );
85
 
86
        print   quoteData('time', $mtime, 1),
87
                quoteData('GMT', scalar gmtime $mtime, 1),
88
                quoteData('pname', $pname, 1 ),
89
                quoteData('pver', $vname,1 ),
90
                quoteData('deleted', int($age), $age ),
91
                quoteData('link', $link,  $link  ),
92
                quoteData('broken', 1, ! -e $vdir  ),
93
                quoteData('noDescpkg', 1, ! -f "$vdir/descpkg"  ),
94
                "\n";
5404 dpurdie 95
 
96
        #
97
        #   Update statistics
98
        #
99
        $CountTotal++;   
100
        $CountDeleted++ if ($age);
101
        $CountMissing++ if (! -e $vdir);
102
        $CountDamaged++ if (! -f "$vdir/descpkg");
1038 dpurdie 103
    }
104
}
105
 
5404 dpurdie 106
#
107
#   Output summary data as MetaData
108
#
109
printMetaData('Total',$CountTotal);
110
printMetaData('Delete',$CountDeleted);
111
printMetaData('Missing',$CountMissing);
112
printMetaData('Damaged',$CountDamaged);
113
 
1042 dpurdie 114
#-------------------------------------------------------------------------------
115
# Function        : quoteData
116
#
117
# Description     : Given an item and data, provided a quoted string
118
#
119
# Inputs          : $item
120
#                   $data
121
#                   $enable
122
#
123
# Returns         : Quoted string
124
#
125
sub quoteData
126
{
127
    my ($item, $data, $enable) = @_;
128
    if ( $enable ) {
129
        return $item . '="' . $data . '" ';
130
    }
131
    return '';
132
}
133
 
5404 dpurdie 134
#-------------------------------------------------------------------------------
135
# Function        : printMetaData 
136
#
137
# Description     : Add metadata to the output stream
138
#
139
# Inputs          : name        - Name of the data
140
#                   value       - Value
141
#
142
# Returns         : 
143
#
144
sub printMetaData
145
{
146
    my ($name,$value) = @_;
147
    print('Metadata ', quoteData($name, $value, 1), "\n");
148
}
1042 dpurdie 149
 
5404 dpurdie 150
 
151
#-------------------------------------------------------------------------------
152
# Function        : insertDiskMetaData  
153
#
154
# Description     : Generates Disk Metadata entries in the output stream
155
#                   Keys are: 
156
#                       size   used  avail  pcent 
157
#                       itotal iused iavail ipcent 
158
#
159
#                   Needs to use basic 'df' functionality. Not all targets
160
#                   will have a full gnu implementation. 
161
#
162
# Inputs          : $path       - Path somewhere on the drive to examine
163
#
164
# Returns         : Nothing
165
#
166
sub insertDiskMetaData
167
{
168
    my ($path) = @_;
169
 
170
    #
171
    #   Get disk information
172
    #
173
    my @items = qw(- size used avail pcent -);
174
    open my $dfData , "-|", "df", '-P', $path;
175
    while (<$dfData>)
176
    {
177
        next if $. < 2;
178
        s~\s+$~~;
179
        s~\%~~g;
180
        my @data = split;
181
 
182
        for (my $ii=0; $ii <= $#items; $ii++)
183
        {
184
            next if $items[$ii] eq '-';
185
            printMetaData( $items[$ii], $data[$ii]);
186
        }
187
    }
188
    close $dfData;
189
 
190
    #
191
    #   Get Inode information
192
    #   Disk can fill up if inodes are depleated
193
    #
194
    @items = qw(- isize iused iavail ipcent -);
195
    open $dfData , "-|", "df", '-Pi', $path;
196
    while (<$dfData>)
197
    {
198
        next if $. < 2;
199
        s~\s+$~~;
200
        s~\%~~g;
201
        my @data = split;
202
 
203
        for (my $ii=0; $ii <= $#items; $ii++)
204
        {
205
            next if $items[$ii] eq '-';
206
            printMetaData($items[$ii], $data[$ii]);
207
        }
208
    }
209
    close $dfData;
210
}
211
 
212
 
213
 
214
 
215