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):
<?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.
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.
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