Wer wie ich ein Intranet mit mehreren Rechnern hat, der wird sich sicher ab und an ärgern, wenn es Probleme mit dem Internet gibt und man auf dringende Updates angewiesen ist. Die OSS- und non-OSS-Verzeichnisse kann man sich ja noch von der Install-DVD zusammenbasteln, aber bei den regulären Updates versagt dies. Es lohnt sich, wenn man einen lokalen Spiegel eines der gängigen FTP-Server betreibt. Allerdings muss man dafür sorgen, das dieser Spiegel auch immer aktuell gehalten wird. Hier lohnt sich ein Blick auf rsync. Um allerdings nicht jedesmal die Quellen per Hand zu aktualisieren, wird das ganze in ein Script gegossen. Es bietet sich dabei das Perl-Modul File::Rsync an.
rsync_update.pl
#!/usr/bin/perl -w use strict; use File::Rsync; # Variablen setzen my $path = "/srv/ftp/pub/updates/"; my %path = ( 'ftp5.gwdg.de::pub/linux/suse/suse_update/10.2/repodata/'=>'repodata', 'ftp5.gwdg.de::pub/linux/suse/suse_update/10.2/scripts/'=>'scripts', 'ftp5.gwdg.de::pub/linux/suse/suse_update/10.2/rpm/i586'=>'rpm', 'ftp5.gwdg.de::pub/linux/suse/suse_update/10.2/rpm/noarch'=>'rpm', 'ftp5.gwdg.de::pub/linux/suse/suse_update/10.2/rpm/x86_64'=>'rpm' ); # Module instanzieren und Variablen setzen my %exc = qw(); my $rs = File::Rsync->new( { compress => 1, exclude => [%exc], delete => 1, stats => 1, times => 1, links => 0, delete => 1, recursive => 1, verbose => 1} ); #$rs->defopts(); my @ftp = keys %path; my @local = values %path; while (@ftp) { my $src = pop(@ftp); my $dest = $path.pop(@local); print "Syncing ".$src." => ".$dest."\n"; $rs->exec( { src => $src, dest => $dest } ) or warn "rsync failed\n"; foreach my $out ($rs->out) { print $out; } #print $rs->lastcmd."\n"; }