Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Unternamensraum:

Seiten in diesem Namensraum:

users:werner:getrepolist

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 Suche im openSUSE Build Repository):

Das Suchscript

<?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
 
?>

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

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.

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:

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

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:

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

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 12:09 von werner