diff options
Diffstat (limited to 'modules/mirror_cleaner')
-rwxr-xr-x | modules/mirror_cleaner/files/orphans_cleaner.pl | 73 | ||||
-rw-r--r-- | modules/mirror_cleaner/manifests/init.pp | 34 |
2 files changed, 107 insertions, 0 deletions
diff --git a/modules/mirror_cleaner/files/orphans_cleaner.pl b/modules/mirror_cleaner/files/orphans_cleaner.pl new file mode 100755 index 00000000..04a73fe2 --- /dev/null +++ b/modules/mirror_cleaner/files/orphans_cleaner.pl @@ -0,0 +1,73 @@ +#!/usr/bin/perl + +# this script will look at the list of rpm, and move orphan to a directory, if they are too old +# another script should take care of cleaning this directory ( or puppet ) + +use strict; +use RPM4; +use File::stat; +use File::Basename; +use File::Copy; +use File::Path qw(make_path); + +my @arches = ('i586','x86_64'); +my @sections = ('core','nonfree','tainted'); +my @medias = ('backports', 'backports_testing', 'release', 'updates', 'updates_testing'); +my $move_delay = 60*60*24*14; + +my ($path, $dest_path) = @ARGV; + +my $qf = "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm %{SOURCERPM}"; + +my %hash ; +my ($filename, $srpm, $dest_rpm); + + +my ($source_hdlist, $binary_hdlist, $rpm_path); + +foreach my $a ( @arches ) { + foreach my $s ( @sections ) { + foreach my $m ( @medias ) { + + $rpm_path = "$path/$a/media/$s/$m"; + $binary_hdlist = "$rpm_path/media_info/hdlist.cz"; + $source_hdlist = "$path/SRPMS/$s/$m/media_info/hdlist.cz"; + + next if not -f $source_hdlist; + next if not -f $binary_hdlist; + + next if stat($source_hdlist)->size() <= 64; + next if stat($binary_hdlist)->size() <= 64; + + open(my $hdfh, "zcat '$binary_hdlist' 2>/dev/null |") or die "Can't open $_"; + while (my $hdr = stream2header($hdfh)) { + ($filename, $srpm) = split(/ /,$hdr->queryformat($qf)); + push(@{$hash{$srpm}}, $filename); + } + close($hdfh); + + + open($hdfh, "zcat '$source_hdlist' 2>/dev/null |") or die "Can't open $_"; + while (my $hdr = stream2header($hdfh)) { + $srpm = $hdr->queryformat("%{NAME}-%{VERSION}-%{RELEASE}.src.rpm"); + delete $hash{$srpm}; + } + close($hdfh); + + foreach my $v ( values %hash ) + { + foreach my $rpm ( @{$v} ) { + $rpm = "$rpm_path/$rpm"; + # sometimes, packages are removed without hdlist to be updated + next if not -f "$rpm"; + if (time() > $move_delay + stat("$rpm")->ctime()) { + ( $dest_rpm = $rpm ) =~ s/$path/$dest_path/; + my $dir = dirname $dest_rpm; + make_path $dir if not -d $dir; + copy($rpm, $dest_rpm) + } + } + } + } + } +} diff --git a/modules/mirror_cleaner/manifests/init.pp b/modules/mirror_cleaner/manifests/init.pp new file mode 100644 index 00000000..1db1e922 --- /dev/null +++ b/modules/mirror_cleaner/manifests/init.pp @@ -0,0 +1,34 @@ +class mirror_cleaner { + class base { + file { "/usr/local/bin/orphans_cleaner.pl": + ensure => present, + owner => root, + group => root, + mode => 755, + source => 'puppet:///modules/mirror_cleaner/orphans_cleaner.pl', + } + } + + define orphans($base) { + include mirror_cleaner::base + + $orphan_dir = "$base/$name" + + file { $orphan_dir: + ensure => directory + } + + cron { "clean orphans $name": + command => "/usr/local/bin/orphans_cleaner.pl $base/$name $orphan_dir", + hour => 5, + minute => 30, + user => root, + } + + tidy { $orphan_dir: + age => "4w", + recurse => true, + matches => ["*.rpm"], + } + } +} |