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