"yum update" with most of the rpms already on a USB key?
Michal Jaegermann
michal at harddata.com
Tue Mar 3 01:26:27 UTC 2009
On Tue, Mar 03, 2009 at 10:34:15AM +1100, Rodd Clarkson wrote:
>
> I can't help but wonder whether a useful feature on yum wouldn't be to
> have an option for one of the boxed in the local network to become a
> 'repo' of sorts.
It sounds to me that you would get really all what you desire
basically "for free" by NFS mounting 'packages' subdirectories of
/var/yum/cache/* from a common location and while configuring yum on
machines using that with "keepcache=1". Metadata will remain
"private" on each machine. You can also use 'autofs' with a timeout
to perform mountings on demand.
Of course it is advisable then to drop, from time to time, obsoleted
packages from such cached set. Some years ago I wrote myself a
script which finds such old packages, comparing only within the same
architecture using mtime for that which worked the best in practice,
and later I rewrote that in Perl for speed. It only lists its
finding and it is up to you what to do with these. It is attached
here.
Michal
-------------- next part --------------
#!/usr/bin/perl -w
# create list of older rpms to be replaced by newer packages
# Michal Jaegermann, michal at harddata.com, 2007/June/18
# pass a list of directories to operate on; if empty works
# on cwd.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
use strict;
use File::Find;
my $cwd = `pwd`;
chomp $cwd;
if (@ARGV) {
@ARGV = grep( ! -f $_, @ARGV); # ignore files - old scripts compatibility
map { $_ = "$cwd/$_" unless m/^\//; } @ARGV;
}
$ARGV[0] = $cwd unless (@ARGV);
# print "@ARGV", "\n";
# exit;
my %fn = ();
my $cdir;
sub find_older {
# sort packages on mtime and drop the newest one
my $pkg = shift;
my $count = shift;
my ($arch, $fname, $rel, $ver);
my $mtime;
my @names = ();
my %time;
($pkg, $arch) = ($pkg =~ m/^(.+)\.([^.]+)$/);
while ($count > 0) {
$ver = shift;
$rel = shift;
next unless defined $ver and defined $rel;
$fname = "$pkg-$ver-$rel.$arch.rpm";
next unless -e "$cdir/$fname";
(undef,undef,undef,undef,
undef,undef,undef,undef,
undef,$mtime,undef,undef,undef) = stat "$cdir/$fname";
$time{$mtime} = $fname;
$count--;
}
for $mtime (sort {$a <=> $b} keys %time) {
push @names, $time{$mtime};
}
pop @names;
return @names;
}
sub process_packages {
# only if a package shows up with different release-version
# bother to look which are older and show a list of
# all packages which can be removed
my @oldpacks;
return unless defined $cdir;
foreach my $pkg ( keys %fn) {
next if $fn{$pkg}[0] == 1;
@oldpacks = find_older $pkg, @{ $fn{$pkg} };
foreach (@oldpacks) {
print "$cdir/$_\n";
}
}
}
sub worker {
# create table indexed by a package name (with arch as a part
# of this name) counting how many different versions and releases
# we got
my ($pname, $ver, $rel, $arch);
if (-d ) {
# new directory - process what we collected so far
process_packages;
%fn = ();
undef $cdir;
}
else {
$cdir = $File::Find::dir unless defined $cdir;
($pname, $ver, $rel) = m/^(.+)-([^-]+)-([^-]+)\.rpm$/;
return unless defined $rel and defined $ver and defined $pname;
($rel, $arch) = ($rel =~ m/^(.+)\.([^.]+)$/);
return unless defined $rel and defined $arch;
$pname .= ".$arch";
if (exists $fn{$pname}) {
$fn{$pname}[0] += 1;
push @{ $fn{$pname} }, $ver, $rel;
}
else {
$fn{$pname} = [1, $ver, $rel];
}
}
}
find \&worker, @ARGV;
process_packages;
More information about the fedora-test-list
mailing list