====== 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 ===== $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 :-(