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