30. januar 2005 - 16:23
Der er
3 kommentarer og
1 løsning
Læsning af RPM metadata
Hvordan læser man nemmest RPM metadata via PHP?
Det virker umiddelbart som en unødigt besværlig procedure, at benytte sig aaf rpm og parse outputtet.
Meningen er, at jeg ønsker at organisere mine RPM filer i en database, således at jeg hurtigt og nemt at kan søge efter det jeg nu måtte stå at mangle.
30. januar 2005 - 19:28
#2
Ja, så mange data fra headeren som muligt. Tænkte på at arbejde lidt med at få den til at vise dependencies, om pakken er installeret, hvad pakken indeholder (Description og file list)
Altså al den information der kan trækkes ud har interesse.
09. februar 2005 - 13:53
#4
Løsningen blev følgende script, som smider det nok så nydeligt i en database: (Skrevet som shell script, men kan let laves om.)
#!/usr/bin/php
<?php
error_reporting(~E_NOTICE);
include("database.inc.php");
$headerfields = array("Name",
"Relocations",
"Version",
"Vendor",
"Release",
"Build Date",
"Install Date",
"Build Host",
"Group",
"Subgroup",
"Source RPM",
"Size",
"License",
"Signature",
"Packager",
"URL",
"Summary",
"Description");
foreach ($headerfields as $field) {
$headertranslation[$field] = "\n{$field}";
}
$basedir = "/home/chano/FC3/";
$subdir = $argv[1];
$basedirlist = opendir("{$basedir}{$subdir}");
while ($rpmfilename = readdir($basedirlist)) {
$rpmfilename = "{$basedir}{$subdir}/$rpmfilename";
if (is_file($rpmfilename)) {
$baserpmfilename = basename($rpmfilename);
$dir = strtr($rpmfilename,array($basedir => "", $baserpmfilename => ""));
$dir = str_replace("/","",$dir);
$values = "'','{$dir}','$baserpmfilename',";
$rpmheader = strtr(shell_exec("rpm --nosignature -qpi {$rpmfilename}"),$headertranslation);
$rpmheader = split("\n",$rpmheader);
foreach ($rpmheader as $field) {
if (trim($field) != "") {
$rpmheadernew[] = $field;
}
}
foreach ($rpmheadernew as $field) {
$field = split(":",$field);
$header = trim($field[0]);
$field = join(":",array_slice($field,1));
if ($header != "Group") {
$rpmheader[$header] = addslashes(trim($field));
} else {
$rpmheader[$header] = split("/",$field);
$rpmheader['Subgroup'] = trim($rpmheader[$header][1]);
$rpmheader[$header] = trim($rpmheader[$header][0]);
}
}
foreach ($rpmheader as $key => $val) {
if (!in_array($key,$headerfields) && !is_numeric($key)) {
$key = addslashes($key);
if ($key != "") {
$rpmheader['Description'] .= " {$key}";
} else {
$rpmheader['Description'] .= "\n\n";
}
}
}
$rpmheader['Description'] = trim($rpmheader['Description']);
foreach ($headerfields as $field) {
$values .= "'{$rpmheader[$field]}',";
}
$values = substr($values,0,-1);
$sql = "INSERT INTO rpminfo VALUES({$values})";
mysql_query($sql);
if (mysql_error()) {
die("Error adding: {$rpmfilename}\n");
}
echo "Added: {$baserpmfilename}\n";
unset($rpmheader); unset($sql); unset($values); unset($rpmheadernew); unset($baserpmfilename); unset($rpmfiles);
}
}
mysql_close();
?>