Benutzer-Werkzeuge

Webseiten-Werkzeuge


users:werner:getrepolist

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
users:werner:getrepolist [2007-11-09 0750]
werner Link zur Perl-Version
users:werner:getrepolist [2007-11-09 1231] (aktuell)
werner syntaktische Verbesserungen :-)
Zeile 1: Zeile 1:
 +====== Repository-Suche für openSUSE ======
 +
 +Da der openSUSE-Buildservice sehr dynamisch wächst und man demzufolge keine verlässliche statische Übersicht erstellen kann, habe ich mir ein PHP-Script ausgedacht, um dynamisch die möglichen Verzeichnisse zu ermitteln.
 +
 +Ich bin von einem zuverlässigen Server (ftp5.gwdg.de) ausgegangen und habe den ftp-Zugang benutzt. Man kann die gleiche URL auch mit http: benutzen, aber das Script funktioniert nur mit ftp (eine PHP-Einschränkung). Selbstverständlich kann man auch einen anderen Server benutzen oder in der fertigen Liste ein "​Suchen und Ersetzen"​ ausführen und generell aus dem ''​ftp://​ftp5.gwdg.de/​pub/​opensuse/''​ ein ''​http://​software.opensuse.org/''​ machen...
 +
 +So, aber nun das Script (ein Ansatz in Perl findet sich auf [[users:​werner:​getrepolist2]]):​
 +
 +
 +
 +
 +===== Das Suchscript =====
 +
 +<code php>
 +<?php
 +    $verzname = '​ftp://​ftp5.gwdg.de/​pub/​opensuse/​repositories';​
 +    echo 'hier ist das Skript ', __FILE__, "​\n";​
 +    echo 'Es ist jetzt ', date("​Y-m-d,​ H:​i:​s"​),​ "​\n";​
 +    $logfilehandle = fopen('​sucheRepo_'​ . date("​Ymd"​) . '​.log',​ '​w'​);​
 +    $fparr = array('​log'​ => $logfilehandle);​
 +    $versionen = array('​101',​ '​102',​ '​103',​ '​S09',​ '​S10'​);​
 +    mkdir('​103repos.d'​);​
 +    $heute = date("​Ymd"​);​
 +    foreach ($versionen as $eineVersion) {
 +        $fparr["​$eineVersion"​] ​      = fopen("​suse{$eineVersion}_$heute.list",​ '​a'​);​
 +        $fparr["​{$eineVersion}home"​] = fopen("​suse{$eineVersion}home_$heute.list",​ '​a'​);​
 +    } // foreach ($versionen as $eineVersion)
 +    echo read1dir($verzname,​ $fparr, $verzname), "​\n";​
 +    foreach ($fparr as $key => $oneHandle)
 +        fclose($oneHandle);​
 +    echo '​Skript ', __FILE__, " beendet.\n";​
 +    echo 'Es ist jetzt ', date("​Y-m-d,​ H:​i:​s"​),​ "​\n";​
 +
 +function read1dir($path2dir,​ $fha, $basisname)
 +{
 +    $basislang = strlen($basisname);​
 +    $arStack ​ = array();
 +    $retval ​  = 0;
 +    if (( substr($path2dir,​ -4) == '​10.3'​ ) or
 +        ( substr($path2dir,​ -3) == '​103' ​ ) )
 +        $ziel = '​103';​
 +    elseif (( substr($path2dir,​ -4) == '​10.2'​ ) or
 +            ( substr($path2dir,​ -3) == '​102' ​ ) )
 +        $ziel = '​102';​
 +    elseif (( substr($path2dir,​ -4) == '​10.1'​ ) or
 +            ( substr($path2dir,​ -3) == '​101' ​ ) )
 +        $ziel = '​101';​
 +    elseif (( substr($path2dir,​ -5) == '​SLES9'​ ) or
 +            ( substr($path2dir,​ -6) == '​SLES_9'​) )
 +        $ziel = '​S09';​
 +    elseif (( substr($path2dir,​ -6) == '​SLES10'​ ) or
 +            ( substr($path2dir,​ -7) == '​SLES_10'​) or
 +            ( substr($path2dir,​ -5) == '​SLE10' ​ ) )
 +        $ziel = '​S10';​
 +    else
 +        $ziel = '​xxx';​
 +    $quelle = substr($path2dir,​ $basislang + 1);
 +    $pos    = strpos($quelle,​ '​home:/'​);​
 +    $usable = str_replace('/',​ '​_',​ "​$path2dir"​);​ // ':'​ are allowed
 +    if ( ($dh = opendir($path2dir)) ) {
 +        while ( ($file = readdir($dh)) !== false ) {
 +            if ( ($file == '​.'​) or
 +                 ​($file == '​..'​) )
 +                continue;
 +            if ( is_dir("​$path2dir/​$file"​) ) {
 +                if (("​$ziel"​ != '​xxx'​) and ("​$file"​ == '​repodata'​) ) {
 +                    fwrite($fha['​log'​],​ "​$ziel:​ ermittelt: $path2dir/​$file\n"​);​
 +                    if (false === $pos)
 +                        fwrite($fha["​$ziel"​],​ "​repomd $basisname $quelle\n"​);​
 +                    else
 +                        fwrite($fha["​{$ziel}home"​],​ "​repomd $basisname $quelle\n"​);​
 +                    if ("​$ziel"​ == '​103'​) {
 +                        // may be copied to /​etc/​zypp/​repos.d
 +                        $fprepo = fopen("​103repos.d/​$usable",​ '​w'​);​
 +                        fwrite($fprepo,​ "​[$usable]\n"​);​
 +                        fwrite($fprepo,​ "​name=$usable\n"​);​
 +                        fwrite($fprepo,​ "​baseurl=http://​software.opensuse.org/​repositories/​$quelle\n"​);​
 +                        fwrite($fprepo,​ "​type=rpm-md\n"​);​
 +                        fwrite($fprepo,​ "​enabled=1\n"​);​
 +                        fwrite($fprepo,​ "​autorefresh=1\n"​);​
 +                        fwrite($fprepo,​ "​gpgcheck=1\n"​);​
 +                        fclose($fprepo);​
 +                    } // if ("​$ziel"​ == '​103'​)
 +                } // if suspicious :-) directory found
 +                if ( !in_array("​$path2dir/​$file",​ $arStack) ) {
 +                    $arStack[] = "​$path2dir/​$file";​
 +                } // if ( !in_array("​$path2dir/​$file",​$arStack) )
 +            } // if ( is_dir("​$dir/​$file"​) )
 +        } // while ( ($file=readdir($dh)) !== false )
 +        closedir($dh);​
 +    } // if ( ($dh=opendir($dir)) )
 +    if ( count($arStack) ) {
 +        $retval += count($arStack);​
 +        foreach ( $arStack as $subdir )
 +            $retval += read1dir("​$subdir",​ $fha, $basisname);​
 +    } // if ( count($arStack) )
 +    return $retval;
 +} // function read1dir
 +
 +?>
 +</​code>​
 +
 +Das Script durchsucht rekursiv den Buildservice-Baum nach "​verdächtigen"​ Verzeichnissen. Je nachdem, zu welcher Version ein Verzeichnis passen könnte, wird es in der entsprechenden Datei eingetragen. Die Datei kann man nach ''/​etc/​apt/​sources.list.d''​ kopieren und mit ''​apt update''​ überprüfen -- und man sollte das ein oder andere Verzeichnis entfernen, sonst sieht man nur so etwas wie
 +
 +<​code>​
 +Reading Package Lists... Error!
 +E: Wow, you exceeded the number of package names this APT is capable of.
 +E: Problem with MergeList /​var/​lib/​apt/​lists/​ftp5.gwdg.de_pub_opensuse_repositories_server:​_php:​_extensions_openSUSE%5f10.3_repodata_primary.xml
 +E: The package lists or status file could not be parsed or opened.
 +</​code>​
 +
 +
 +===== Aufbereitung für den Paketmanager Smart =====
 +
 +Wer das nicht möchte -- oder lieber ''​smart''​ statt ''​apt''​ benutzt --  kann die Liste auch ins smart-Format umsetzen:
 +
 +<code bash>
 +echo "#​!/​bin/​sh"​ > trans2smart.sh
 +awk '{ kurzurl = $3;
 +       ​lesbar ​ = kurzurl;
 +       ​gsub(/​[\/:​]/,​ "​_",​ lesbar);
 +       print "smart channel -y --add",​ lesbar,
 +       "​type=rpm-md name=" lesbar,
 +       "​baseurl=http://​download.opensuse.org/​repositories/"​ kurzurl }' \
 +    suse103.list >> trans2smart.sh
 +awk '{ kurzurl = $3;
 +       ​lesbar ​ = kurzurl;
 +       ​gsub(/​[\/:​]/,​ "​_",​ lesbar);
 +       print "smart channel -y --add",​ lesbar,
 +       "​type=rpm-md name=" lesbar,
 +       "​baseurl=http://​download.opensuse.org/​repositories/"​ kurzurl }' \
 +    suse103home.list >> trans2smart.sh
 +</​code>​
 +
 +Nicht schön, aber funktioniert -- aus der apt-Liste wird ein Shell-Script erstellt, das man mit ''​chmod u+x''​ ausführbar machen kann. Wenn root es ausführt, wird smart mit den Repositories gefüttert.
 +
 +
 +===== Aufbereitung für den YaST-Paketmanager =====
 +
 +Die Aufbereitung für ''​zypper''​ geschieht für openSUSE 10.3 inzwischen im Suchscript. Die Dateien, die im Unterverzeichnis ''​103repos.d''​ entstehen, können nach ''/​etc/​zypp/​repos.d''​ kopiert werden; sie werden dann beim "​Wechsel der Installationsquelle"​ automatisch erkannt. Die vorhergehenden Versionen sind nicht so bedienkomfortabel,​ hier lässt sich aber ''​zypper''​ analog ''​smart''​ mit den Quellen versorgen:
 +
 +<code bash>
 +echo "#​!/​bin/​sh"​ > trans2zypper.sh
 +awk '{ kurzurl = $3;
 +       ​lesbar ​ = kurzurl;
 +       ​gsub(/​[\/:​]/,​ "​_",​ lesbar);
 +       print "​zypper addrepo -t repomd",​
 +             "​http://​download.opensuse.org/​repositories/"​ kurzurl, lesbar }' \
 +    suse103.list >> trans2zypper.sh
 +awk '{ kurzurl = $3;
 +       ​lesbar ​ = kurzurl;
 +       ​gsub(/​[\/:​]/,​ "​_",​ lesbar);
 +       print "​zypper addrepo -t repomd",​
 +             "​http://​download.opensuse.org/​repositories/"​ kurzurl, lesbar }' \
 +    suse103home.list >> trans2zypper.sh
 +</​code>​
 +
 +Nachteil dieser Methode: das Einspielen dauert etwas... Bei openSUSE < 10.3 fragt ''​zypper''​ jedes Mal, ob man die Quelle wirklich hinzufügen möchte -- und aktualisiert bei dem Hinzufügen einer Quelle alle bisher eingerichteten Quellen...
 +
 +Apropos "​dauert etwas":​ allein das Such-Script läuft bei mir (effektiv DSL 6000) über 36 Stunden :-(
 +
  
users/werner/getrepolist.txt · Zuletzt geändert: 2007-11-09 1231 von werner