users:werner:getrepolist3
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
users:werner:getrepolist3 [2008-12-21 2200] – new code version 2008-12-21 werner | users:werner:getrepolist3 [2008-12-21 2201] (aktuell) – typo werner | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Repository-Suche bei openSUSE ====== | ||
+ | Das Ziel ist klar: wegen der dynamischen Struktur muss man den Buildservice durchsuchen, | ||
+ | |||
+ | So, hier der Code: | ||
+ | |||
+ | <code perl> | ||
+ | # | ||
+ | |||
+ | # ############################################### | ||
+ | # | ||
+ | # This script loops through the directories of a | ||
+ | # mirror of the openSUSE build system and tries | ||
+ | # to figure out if the current directory might be | ||
+ | # a repository and f so, for which release. | ||
+ | # If it is, the directory is written to several | ||
+ | # output files: one for smart (to be placed inside | ||
+ | # / | ||
+ | # inside / | ||
+ | # possible channel lists for good old apt :-) | ||
+ | # | ||
+ | # Improvements are always welcome - I'm not | ||
+ | # a Perl programmer, as you will see when reading | ||
+ | # the source code ;-) | ||
+ | # | ||
+ | # written by Werner Flamme < | ||
+ | # | ||
+ | # ############################################### | ||
+ | use strict; | ||
+ | use warnings; | ||
+ | use Net::FTP; | ||
+ | |||
+ | # set some variables | ||
+ | our $debug | ||
+ | my $ftpserver | ||
+ | our $searchbase = ' | ||
+ | my $verzname | ||
+ | our $preface | ||
+ | |||
+ | # 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(" | ||
+ | my $jetztzeit | ||
+ | print " | ||
+ | |||
+ | # where to put the data - logfiles with timestamp in their names | ||
+ | my $logfilename = ">> | ||
+ | our %allfiles | ||
+ | my @versionen | ||
+ | for my $vers (@versionen) { | ||
+ | $allfiles{" | ||
+ | ">> | ||
+ | $allfiles{" | ||
+ | ">> | ||
+ | } # for my $vers (@versionen) | ||
+ | mkdir ' | ||
+ | mkdir ' | ||
+ | mkdir ' | ||
+ | mkdir ' | ||
+ | mkdir ' | ||
+ | mkdir ' | ||
+ | mkdir ' | ||
+ | mkdir ' | ||
+ | |||
+ | # the real start :-) | ||
+ | our $ftp = Net:: | ||
+ | or die " | ||
+ | print " | ||
+ | if ($debug & 2); | ||
+ | $ftp-> | ||
+ | or die " | ||
+ | print " | ||
+ | |||
+ | # now start the loop! | ||
+ | scan1dir($searchbase); | ||
+ | |||
+ | # post work - write out the time again so one can see how long it takes | ||
+ | ($sec, $min, $hour, $mday, $mon, $year, | ||
+ | | ||
+ | $year += 1900; | ||
+ | $mon++; | ||
+ | $datstempel = sprintf(" | ||
+ | $jetztzeit | ||
+ | print " | ||
+ | |||
+ | sub scan1dir { | ||
+ | our %allfiles; | ||
+ | our $searchbase; | ||
+ | our $preface; | ||
+ | our $ftp; | ||
+ | our $debug; | ||
+ | my ($thisdir) = @_; | ||
+ | # $thisdir is s.th. like home:/ | ||
+ | print "now working on $thisdir\n" | ||
+ | |||
+ | # may this be a repository? And for what version? | ||
+ | my $right7 | ||
+ | my $right6 | ||
+ | my $right5 | ||
+ | my $right4 | ||
+ | my $right3 | ||
+ | my $forget | ||
+ | my $shorter = substr($thisdir, | ||
+ | my $legible = $shorter; | ||
+ | my $itsfor | ||
+ | my $usehome = ($thisdir =~ /home:\//); | ||
+ | # now snip from the last / onward: | ||
+ | if (length($shorter)) { | ||
+ | $legible =~ s|(.*)/ | ||
+ | $legible =~ s|/||g; | ||
+ | $right4 | ||
+ | $right3 | ||
+ | $itsfor | ||
+ | ($right3 eq ' | ||
+ | $itsfor | ||
+ | ($right3 eq ' | ||
+ | $itsfor | ||
+ | ($right3 eq ' | ||
+ | $itsfor | ||
+ | $itsfor | ||
+ | ($right6 eq ' | ||
+ | $itsfor | ||
+ | ($right6 eq ' | ||
+ | ($right6 eq ' | ||
+ | } # if (length($shorter)) | ||
+ | $ftp-> | ||
+ | or die " | ||
+ | | ||
+ | my @dircontent = $ftp-> | ||
+ | my @unterverz = (); | ||
+ | my $ftpelem; | ||
+ | |||
+ | # walk through the directory | ||
+ | for $ftpelem (@dircontent) { | ||
+ | # get file info | ||
+ | my ($rechte, $num, $user, $group, $size, | ||
+ | $mon, $day, $time, $name) = split / +/, $ftpelem, 9; | ||
+ | # is it a directory? | ||
+ | if (substr($rechte, | ||
+ | print " | ||
+ | " | ||
+ | # may it be of interest? | ||
+ | if ((" | ||
+ | # yes - so log and print and shout and... | ||
+ | my ($sec, $min, $hour, $mday, $mon, $year, | ||
+ | $wday, $yday, $isdst) = localtime(time); | ||
+ | $year += 1900; | ||
+ | $mon++; | ||
+ | my $jetztzeit | ||
+ | | ||
+ | my $MYTOFILE = $allfiles{" | ||
+ | open THISHANDLE, $allfiles{" | ||
+ | or die " | ||
+ | print THISHANDLE " | ||
+ | " | ||
+ | close THISHANDLE; | ||
+ | # if home:/... entry, write into separate apt file | ||
+ | if ($usehome) { | ||
+ | open THISHANDLE, $allfiles{" | ||
+ | or die " | ||
+ | " | ||
+ | print THISHANDLE " | ||
+ | close THISHANDLE; | ||
+ | } # if ($usehome) | ||
+ | # write into normal apt source | ||
+ | my $meld = " | ||
+ | | ||
+ | open THISHANDLE, $allfiles{" | ||
+ | or die " | ||
+ | print THISHANDLE " | ||
+ | close THISHANDLE; | ||
+ | if ((" | ||
+ | (" | ||
+ | # write into zypp repository file | ||
+ | open ZYPPFILE, "> | ||
+ | or die " | ||
+ | " | ||
+ | print ZYPPFILE " | ||
+ | print ZYPPFILE " | ||
+ | print ZYPPFILE " | ||
+ | print ZYPPFILE " | ||
+ | print ZYPPFILE " | ||
+ | print ZYPPFILE " | ||
+ | print ZYPPFILE " | ||
+ | print ZYPPFILE " | ||
+ | | ||
+ | close ZYPPFILE; | ||
+ | # write into smart channel file | ||
+ | open THISHANDLE, "> | ||
+ | or die " | ||
+ | "/ | ||
+ | print THISHANDLE " | ||
+ | print THISHANDLE " | ||
+ | print THISHANDLE " | ||
+ | print THISHANDLE " | ||
+ | close THISHANDLE; | ||
+ | } # if not SLEx | ||
+ | } # if (($itsfor ne ' | ||
+ | else { | ||
+ | # so, it's not important. Put it on the stack, | ||
+ | # maybe its content can be of some value ;-) | ||
+ | print " | ||
+ | if ($debug & 2); | ||
+ | @unterverz = (@unterverz, | ||
+ | if (" | ||
+ | } # else: if (($itsfor ne ' | ||
+ | } # if (substr($rechte, | ||
+ | } # foreach $elem (@dircontent) | ||
+ | |||
+ | # well, what did we find? Let's loop at the stack... | ||
+ | if ((my $unterverz = @unterverz) > 0) { | ||
+ | for my $untvz (@unterverz) { | ||
+ | # yes, we are using recursion here | ||
+ | scan1dir($untvz); | ||
+ | } # for $untvz (@unterverz) | ||
+ | } # if (($unterverz = @unterverz) > 0) | ||
+ | 1; | ||
+ | } # sub scan1dir | ||
+ | </ |
users/werner/getrepolist3.txt · Zuletzt geändert: 2008-12-21 2201 von werner