====== Suche im openSUSE Build Repository ====== Den begleitenden Text findest Du auf [[users:werner:getrepolist]], hier nur der Versuch, das Script in Perl umzusetzen: #!/usr/bin/perl -w use strict; use warnings; use Net::FTP; # set some variables our $debug = 0; my $ftpserver = 'ftp5.gwdg.de'; our $searchbase = 'pub/opensuse/repositories'; my $verzname = "ftp://$ftpserver/$searchbase"; # get date and time (used for logging) and print them my @dots; my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $year += 1900; $mon++; my $datstempel = sprintf("%04d%02d%02d", $year, $mon, $mday); my $jetztzeit = sprintf("%02d:%02d:%02d", $hour, $min, $sec); print "starting script on $datstempel at $jetztzeit.\n"; # where to put the data - logfiles with timestamp in their names my $logfilename = ">>findrepo$datstempel\_$jetztzeit.log"; our %allfiles = ('LOG' => $logfilename); my @versionen = ('101', '102', '103', 'S09', 'S10'); for my $vers (@versionen) { $allfiles{"{$vers}apt"} = ">>aptrepo_$vers\_$datstempel\_$jetztzeit.list"; $allfiles{"{$vers}home"} = ">>aptrepo_$vers\_$datstempel\_$jetztzeit\_home.list"; $allfiles{"{$vers}smart"} = ">>smart_$vers\_$datstempel\_$jetztzeit.sh"; } # for $vers (@versionen) mkdir 'zypprepos.d'; # the real start :-) our $ftp = Net::FTP->new($ftpserver, Passive => 1) or die "Cannot access FTP server $ftpserver: $@"; print "Access to FTP server $ftpserver is possible\n" if ($debug & 2); $ftp->login("anonymous",'-anonymous@') or die "Cannot login: ", $ftp->message; print "anonymous login is possible :-)\n" if ($debug & 1); scan1dir($searchbase); # post work - write out the time again so one can see how long it takes ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $year += 1900; $mon++; $datstempel = sprintf("%04d%02d%02d", $year, $mon, $mday); $jetztzeit = sprintf("%02d:%02d:%02d", $hour, $min, $sec); print "script ending on $datstempel at $jetztzeit.\n"; sub scan1dir { our %allfiles; our $searchbase; our $ftp; our $debug; my ($thisdir) = @_; print "now working on $thisdir\n" if ($debug & 4); my $right6 = substr($thisdir, -6); my $right5 = substr($thisdir, -5); my $right4 = substr($thisdir, -4); my $right3 = substr($thisdir, -3); my $forget = length("$searchbase"); my $shorter = substr($thisdir, $forget); my $legible = $shorter; my $itsfor = 'xxx'; my $usehome = ($thisdir =~ /home:\//); # $thisdir is s.th. like home:/dings/openSUSE_10.3 or X11:/XGL/openSUSE_10.3 # now snip from the last / onward: if (length($shorter)) { $legible =~ s|(.*)/(.+)|$1|; $legible =~ s/\///g; $right4 = substr($thisdir, -4); $right3 = substr($thisdir, -3); $itsfor = '101' if ( ($right4 eq '10.1' ) or ($right3 eq '101' ) ); $itsfor = '102' if ( ($right4 eq '10.2' ) or ($right3 eq '102' ) ); $itsfor = '103' if ( ($right4 eq '10.3' ) or ($right3 eq '103' ) ); $itsfor = 'S09' if ( ($right5 eq 'SLES9') or ($right6 eq 'SLES_9') ); $itsfor = 'S10' if ( ($right5 eq 'SLE10') or ($right6 eq 'SLES10') or ($right6 eq 'SLE_10') ); } # if (length($shorter)) $ftp->cwd("/$thisdir") or die "Cannot change into working directory $thisdir: ", $ftp->message; my @dircontent = $ftp->dir(); my @unterverz = (); my $ftpelem; for $ftpelem (@dircontent) { my ($rechte, $num, $user, $group, $size, $mon, $day, $time, $name) = split / +/, $ftpelem, 9; if (substr($rechte, 0, 1) eq 'd') { print "guessed directory: '$name' (itsfor=$itsfor, shorter=$shorter, legible=$legible)\n" if ($debug & 1); if (("$itsfor" ne 'xxx') and ("$name" eq 'repodata')) { my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $year += 1900; $mon++; my $jetztzeit = sprintf("%02d:%02d:%02d", $hour, $min, $sec); my $MYTOFILE = $allfiles{"LOG"}; open THISHANDLE, $allfiles{"LOG"} or die "$jetztzeit: Cannot open logfile"; print THISHANDLE "$jetztzeit: now writing $legible for $thisdir\n"; close THISHANDLE; open THISHANDLE, $allfiles{"{$itsfor}smart"} or die "$jetztzeit: Cannot open smart output file for $itsfor\n"; print THISHANDLE "smart channel --add $legible ", "type=repomd name=$legible ", "baseurl=http://software.opensuse.org/repositories$shorter\n"; close THISHANDLE; if ($usehome) { open THISHANDLE, $allfiles{"{$itsfor}home"} or die "$jetztzeit: Cannot open apt-home output file for $itsfor\n"; print THISHANDLE "repomd http://software.opensuse.org/repositories $shorter\n"; close THISHANDLE; } # if ($usehome) my $meld = "Cannot open apt output file »" . $allfiles{"{$itsfor}apt"}; open THISHANDLE, $allfiles{"{$itsfor}apt"} or die "$jetztzeit: $meld « for $itsfor ($shorter)\n"; print THISHANDLE "repomd http://software.opensuse.org/repositories $shorter\n"; close THISHANDLE; if ("$itsfor" eq '103') { open ZYPPFILE, ">zypprepos.d/$legible" or die "Cannot create file zypprepos.d/$legible: $!"; print ZYPPFILE "[$legible]\n"; print ZYPPFILE "name=$legible\n"; print ZYPPFILE "baseurl=http://software.opensuse.org/repositories$shorter\n"; print ZYPPFILE "type=rpm-md\n"; print ZYPPFILE "enabled=1\n"; print ZYPPFILE "autorefresh=1\n"; print ZYPPFILE "gpgcheck=1\n"; close ZYPPFILE; } # if ("$itsfor" eq '103') } # if (($itsfor ne 'xxx') and ("$name" eq 'repodata')) else { print ("adding $thisdir/$name to unterverz\n") if ($debug & 2); @unterverz = (@unterverz, "$thisdir/$name") if ("$name" ne 'lost+found'); } } # if (substr($rechte, 0, 1) eq 'd') } # foreach $elem (@dircontent) if ((my $unterverz = @unterverz) > 0) { for my $untvz (@unterverz) { scan1dir($untvz); } # for $untvz (@unterverz) } # if (($unterverz = @unterverz) > 0) 1; } # sub scan1dir Übrigens läuft das Script bei mir in genau einer Stunde durch: starting script on 20080209 at 16:48:09. script ending on 20080209 at 18:48:05.