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
1042 dpurdie 1
#! /usr/bin/perl
2
########################################################################
3
# Copyright (C) Vix Technology, All rights reserved
4
#
5
# Module name   : pkg_purge
6
# Module type   :
7
# Compiler(s)   : Perl
8
# Environment(s):
9
#
10
# Description   : Dpkg_archive package purge tool
11
#                 Designed to be run periodically from cron
12
#
13
#                 Operations
14
#                 Purges packages marked for deletion
15
#                   Uses .deletepkg tag file
16
#                   Uses current ArchiveList
17
#
18
#......................................................................#
19
 
20
require 5.008_002;
21
use strict;
22
use warnings;
23
 
24
use Pod::Usage;
25
use Getopt::Long;
26
use File::Find;
27
use File::Path;
28
use POSIX qw(strftime);
29
use Data::Dumper;
30
use FindBin;                                    # Determine the current directory
31
 
32
 
33
#
34
#   Definitions
35
#
36
our $dpkg       = "$ENV{HOME}/dpkg_archive";    # Root of the archive
37
our $metaDir    = '.dpkg_archive';              # Name of meta directory
38
our $metadir    = "$dpkg/$metaDir";
39
our $list       = "$metadir/ArchiveList";       # Current Archive List
40
our $deleteTag  = '.deletepkg';                 # Tag file for deletion
41
our $rootDir    = $FindBin::Bin;                # This script - and its helpers
42
 
43
#
44
#   Options
45
#
46
our $opt_age        = 100;                          # Keep for xxx days
47
our $opt_verbose    = 0;
1044 dpurdie 48
our $opt_info       = 0;
1042 dpurdie 49
 
50
#
51
#   Globals
52
#
53
our $needPkgs;                                  # Need these packages
54
 
55
#-------------------------------------------------------------------------------
56
# Function        : Mainline Entry
57
#
58
# Description     : Designed to be used with CRON and CRON to email
59
#                   admin on errors
60
#
61
# Inputs          : None
62
#
63
# Returns         : None Zero on error
64
#
65
 
66
my $result = GetOptions (
67
                "verbose:+"     => \$opt_verbose,
1044 dpurdie 68
                "info:+"        => \$opt_info,
1042 dpurdie 69
                "age=i"         => \$opt_age,
70
 
71
                );
72
die ("Bad options") if ! $result;
73
 
74
 
75
#
76
#   Must have an archive
77
#
78
die ("Home directory MUST have link to dpkg_archive") if ( ! -d $dpkg  );
79
die ("No dpkg_archive metadata") if ( ! -d $metadir );
80
die ("No ArchiveList") if ( ! -f $list );
81
Log ("Start of package purge. Age: $opt_age" );
82
 
83
#
84
#   Read in current archive list
85
#
86
open (my $fh, '<', $list ) || die ("Cant open $list. $!");
87
while ( <$fh> )
88
{
89
    chomp;
90
    $needPkgs->{$_} = 1;
91
}
92
close $fh;
93
 
94
#
95
#   Scan the package tree
96
#
97
opendir(DIR, $dpkg) || die "Can't opendir $dpkg: $!";
98
my @dlist = readdir(DIR);
99
closedir DIR;
100
 
101
foreach my $pname ( sort @dlist )
102
{
103
    next if ( $pname eq '.' );
104
    next if ( $pname eq '..' );
105
    next if ( $pname eq $metaDir );
106
    my $dir = $dpkg . '/'. $pname;
107
    next unless ( -d $dir );
108
 
109
    opendir(DIR, $dir )|| die "Can't opendir $dir: $!";
110
    my @vlist = readdir(DIR);
111
    closedir DIR;
112
 
113
    foreach my $vname ( sort @vlist )
114
    {
115
        next if ( $vname eq '.' );
116
        next if ( $vname eq '..' );
117
        next if ( $vname =~ m~\.TMPDIR$~ );
118
        my $vdir = $dir . '/' . $vname;
119
        next if ( -l $vdir );
120
        next unless ( -d $vdir );
121
 
122
        my $pv = "$pname/$vname";
123
        if ( exists $needPkgs->{$pv} )
124
        {
125
            #
126
            #   Need this package
127
            #   If it has a delete tag, then remove it
128
            #
129
            if ( -f "$vdir/$deleteTag" )
130
            {
131
                RemoveTagFile ($pname, $vname)
132
            }
133
            else
134
            {
135
                Log ("Package needed: $pname $vname") if ( $opt_verbose > 1 );
136
            }
137
        }
138
        else
139
        {
140
            #
141
            #   Don't need this package
142
            #   Its not in the current ArchiveList
143
            #
144
            #   If it doesn't have a tag file then  it must be a
145
            #   stray - tag it for latter. It will get aged out one day
146
            #
147
            #   If it does, then test its age
148
            #
149
            unless ( -f "$vdir/$deleteTag" )
150
            {
151
                CreateTagFile ($pname, $vname);
152
            }
153
            elsif ( -M "$vdir/$deleteTag" > $opt_age )
154
            {
155
                DeletePackage ($pname, $vname);
156
            }
157
            else
158
            {
159
                if ( $opt_verbose > 0 )
160
                {
161
                    my $age = -M "$vdir/$deleteTag";
1044 dpurdie 162
                    Log ("Package not old enough: $age: $pname $vname") ;
1042 dpurdie 163
                }
164
            }
165
        }
166
    }
167
}
168
 
169
#-------------------------------------------------------------------------------
170
# Function        : RemoveTagFile
171
#                   DeletePackage
172
#                   CreateTagFile
173
#
174
# Description     : Manipulate the tag files
175
#                   Use existing program to do the hard work
176
#
177
# Inputs          : $pname
178
#                   $pver
179
#
180
# Returns         : Nothing
181
#
182
sub RemoveTagFile
183
{
1044 dpurdie 184
    system ("$rootDir/delete_package", '-K', @_ ) unless $opt_info;
1042 dpurdie 185
    Log ("Package marked for retention: @_");
186
}
187
 
188
sub DeletePackage
189
{
1044 dpurdie 190
    system ("$rootDir/delete_package", @_ ) unless $opt_info;
1042 dpurdie 191
    Log ("Package Deleted: @_");
192
}
193
 
194
sub CreateTagFile
195
{
1044 dpurdie 196
    system ("$rootDir/delete_package", '-T', @_ ) unless $opt_info;
1042 dpurdie 197
    Log ("Package Tagged: @_");
198
}
199
 
200
#-------------------------------------------------------------------------------
201
# Function        : Log
202
#
203
# Description     : Log action to log file
1044 dpurdie 204
#                   If in info mode then simply display it
1042 dpurdie 205
#
206
# Inputs          : $text to log
207
#
208
# Returns         : Nothing
209
#
210
sub Log
211
{
212
	my ($text) = @_;
1044 dpurdie 213
    if ( $opt_info )
214
    {
215
        print "$text\n";
216
        return;
217
    }
1042 dpurdie 218
 
219
    my $logfile = "$metadir/pkg_purge/";
220
    mkpath ($logfile);
221
 
222
    $logfile .= strftime "pkg_purge.%Y-%m-%d.txt", localtime();
223
 
224
	open my $fh, ">>$logfile" or die "Can't logfile $logfile: $!\n";
225
	print $fh localtime()." : $text\n";
226
    close $fh;
227
}
228