Inhaltsverzeichnis
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