Avatar billede Noone Nybegynder
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.
Avatar billede hmortensen Nybegynder
30. januar 2005 - 17:06 #1
Hvad er det du vil udlæse ?

Noget fra headeren af en RPM fil ?
Avatar billede Noone Nybegynder
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.
Avatar billede Noone Nybegynder
03. februar 2005 - 18:32 #3
Nogle forslag? Eller er det lukke tid?
Avatar billede Noone Nybegynder
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();
?>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester