. * * @category Main * @package RPMPHP * * @author Remi Collet * @author Johan Cwiklinski * @copyright 2010 Remi Collet * @license http://www.gnu.org/licenses/agpl-3.0-standalone.html AGPL License 3.0 or (at your option) any later version * @link http://github.com/remicollet/rpmphp/ * @since The begining of times. */ chdir(dirname($_SERVER["SCRIPT_FILENAME"])); if (isset($_SERVER["SERVER_NAME"])) { echo "
";
    ini_set("max_execution_time", "0");
    ini_set("memory_limit", "-1");

    die("This script is launched twice a day, be patient");
}
require "config.inc.php";

/**
* To document
*
* @param Object $db        Database reference
* @param string $type      type
* @param string $channel   channel
* @param string $name      name
* @param string $state     state
* @param string $ver       version
* @param string $statename state name
*
* @return rows updated
*/
function addUpstream ($db, $type, $channel, $name, $state, $ver, $statename="")
{

    $sql1 = "INSERT INTO `upstream` SET type='$type', name='$name'";
    $db->exec($sql1);

    $sql2 = "UPDATE `upstream` SET channel='$channel', $state='$ver'";
    if ($statename) {
        $sql2 .= ", state='$statename'";
    }
    $sql2 .= " WHERE type='$type' AND name='$name'";
    $nb = $db->exec($sql2);
    if ($nb===false) {
        echo date("r : ") . "SQL ERROR($sql2) = " .
            implode(" ", $db->errorInfo()) . "\n";
    }

    return $nb;
}

if ($_SERVER['argc']>1 && in_array('help', $_SERVER['argv'])) {
    echo "Options in: repo owner R pear pecl old\n";
    echo "Defaults:   repo owner R pear pecl\n";
    die("\n");
}

try {
    $db = new PDO ("mysql:dbname=" . MYBASE . ";host=" . MYHOST, MYUSER, MYPASS);

    // -------------------------------------------------------------------
    //	Fedora Packages
    // -------------------------------------------------------------------
    echo date("r : ") . "Refreshing " . MYBASE . " database\n";

    if ($_SERVER['argc']==1 || in_array('repo', $_SERVER['argv'])) {
        if (in_array('empty', $_SERVER['argv'])) {
            $res=$db->query("SELECT * FROM repo WHERE stamp IS NULL");
        } else if (in_array('old', $_SERVER['argv'])) {
            $res=$db->query("SELECT * FROM repo");
        } else {
            $res=$db->query("SELECT * FROM repo WHERE active=1");
        }
        if (!$res) {
            echo date("r : ") . "SQL ERROR = " .
                implode(" ", $db->errorInfo()) . "\n";
        } else {
            while ($row = $res->fetchObject()) {
                echo date("r : ") . "REPOSITORY " . $row->main . " " .
                    $row->sub . "\n";
                $TimRemote = 0;
                $repomd = simplexml_load_file($row->url . "repodata/repomd.xml");
                if ($repomd) {
                    foreach ($repomd->data as $data) {
                        if ($data->attributes()=="primary") {
                            $TimRemote = $data->timestamp;
                            $UrlRemote = $row->url . $data->location->attributes();
                        }
                    }
                }
                if ($TimRemote > $row->stamp) {
                    echo date("r : ") . "Loading $UrlRemote\n";

                    //$fic=gzopen("primary.xml.gz", "r");
                    $fic=gzopen($UrlRemote, "r");
                    if ($fic) {
                        $txt="";
                        while ($buf=gzread($fic, 8196)) {
                            $txt .= $buf;
                        }
                        echo date("r : ") . "Read " . strlen($txt) . " bytes\n";
                        gzclose($fic);

                        $primary = simplexml_load_string($txt);
                        echo date("r : ") . "Read " . $primary->attributes() .
                            " packages\n";
                        unset($txt);

                        $sql = sprintf(
                            "DELETE FROM rpm WHERE repo_main='%s' AND repo_sub='%s'",
                            $row->main,
                            $row->sub
                        );
                        $nb=$db->exec($sql);
                        if ($nb===false) {
                            echo date("r : ") . "SQL ERROR = " .
                                implode(" ", $db->errorInfo()) . "\n";
                        } else {
                            echo date("r : ") . "Delete $nb packages\n";
                        }

                        $tot=0;
                        foreach ($primary->package as $package) {
                            if ($package->attributes()=='rpm') {
                                $ver = $package->version->attributes();
                                $sql = sprintf(
                                    "INSERT INTO rpm SET repo_main='%s', repo_sub='%s', name='%s', epoch='%s', ver='%s', rel='%s', summary='%s', url='%s'",
                                    $row->main,
                                    $row->sub,
                                    $package->name,
                                    $ver['epoch'],
                                    $ver['ver'],
                                    $ver['rel'],
                                    addslashes($package->summary),
                                    $package->url
                                );
                                $nb=$db->exec($sql);
                                if ($nb) {
                                    $tot+=$nb;
                                } else {
                                    echo date("r : ") . "SQL ERROR = " .
                                        implode(" ", $db->errorInfo()) . "\n";
                                }
                            }
                        }
                        echo date("r : ") . "Write $tot packages\n";

                        $sql=sprintf(
                            "UPDATE repo SET stamp=%d WHERE ID=%d",
                            $TimRemote,
                            $row->ID
                        );
                        $nb=$db->exec($sql);
                        if ($nb===false) {
                            echo date("r : ") . "SQL ERROR = " .
                                implode(" ", $db->errorInfo()) . "\n";
                        }

                        unset($primary);
                    } else {
                        echo date("r : ") . "ERROR : can't read $UrlRemote\n";
                    }
                } else {
                    echo date("r : ") . "no update needed : $TimRemote / " .
                        $row->stamp . "\n";
                }
            }
        }
    } // If ask

    // -------------------------------------------------------------------
    //	Upstream Version
    // -------------------------------------------------------------------
    $sql="CREATE TABLE IF NOT EXISTS `upstream` (
            `name` varchar(100) NOT NULL,
            `type` varchar(20) NOT NULL,
            `channel` varchar(20) NOT NULL,
            `stable` varchar(20) DEFAULT NULL,
            `unstable` varchar(20) DEFAULT NULL,
            `state` varchar(20) DEFAULT NULL,
            PRIMARY KEY (`name`,`type`),
            KEY `name` (`name`),
            KEY `type` (`type`),
            KEY `channel` (`channel`))";

    if ($db->exec($sql)!==false) {
        echo date("r : ") . "Check table 'upstream' ok\n";
    } else {
        echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
    }

    // -------------------------------------------------------------------
    if ($_SERVER['argc']==1 || in_array('pecl', $_SERVER['argv'])) {
        echo date("r : ") . "PECL listLatestReleases - stable\n";

        $request = xmlrpc_encode_request("package.listLatestReleases", "stable");
        $context = stream_context_create(
            array(
                'http' => array(
                    'method' => "POST",
                    'header' => "Content-Type: text/xml",
                    'content' => $request
                )
            )
        );
        $file = file_get_contents("http://pecl.php.net/xmlrpc.php", false, $context) or die ("Can't file_get_contents(http://pecl.php.net/xmlrpc.php)");
        $stable = xmlrpc_decode($file);
        if (xmlrpc_is_fault($stable)) {
            echo date("r : ") . "ERROR xmlrpc: $stable[faultString] ($stable[faultCode])";
        } else {
            $sql = sprintf("DELETE FROM upstream WHERE type='pecl' AND channel='pecl'");
            $nb=$db->exec($sql);
            if ($nb===false) {
                echo date("r : ") . "SQL ERROR = " .
                    implode(" ", $db->errorInfo()) . "\n";
            } else {
                echo date("r : ") . "Delete $nb packages\n";
            }

            $nb=0;
            foreach ($stable as $name => $info) {
                $rpmname="php-pecl-".str_replace("_", "-", $name);

                $nb += addUpstream(
                    $db,
                    "pecl",
                    "pecl",
                    $rpmname,
                    "stable",
                    $info["version"]
                );
            }
            echo date("r : ") . "Write $nb packages\n";
            // echo date("r : ") . "saved " . file_put_contents("cache/pecl-stable", serialize($stable)) . " bytes\n";
        }

        // -------------------------------------------------------------------
        echo date("r : ") . "PECL listLatestReleases - unstable\n";

        $request = xmlrpc_encode_request("package.listLatestReleases", array());
        $context = stream_context_create(
            array(
                'http' => array(
                    'method' => "POST",
                    'header' => "Content-Type: text/xml",
                    'content' => $request
                )
            )
        );
        $file = file_get_contents("http://pecl.php.net/xmlrpc.php", false, $context) or die ("Can't file_get_contents(http://pecl.php.net/xmlrpc.php)");
        $unstable = xmlrpc_decode($file);
        if (xmlrpc_is_fault($unstable)) {
            echo date("r : ") . "ERROR xmlrpc: $stable[faultString] ".
                "($stable[faultCode])";
        } else {
            $nb=0;
            foreach ($unstable as $name => $info) {
                $rpmname="php-pecl-".str_replace("_", "-", $name);

                $nb += addUpstream(
                    $db,
                    "pecl",
                    "pecl",
                    $rpmname,
                    "unstable",
                    $info["version"],
                    $info["state"]
                );
            }
            echo date("r : ") . "Write $nb packages\n";
            //echo date("r : ") . "saved " .
            //   file_put_contents("cache/pecl-unstable", serialize($unstable)) .
            //   " bytes\n";
        }
    } // if in options

    // -------------------------------------------------------------------
    if ($_SERVER['argc']==1 || in_array('pear', $_SERVER['argv'])) {
        echo date("r : ") . "PEAR reading channels\n";
        $channels=array(
            "pear"	    => "pear.php.net"
            ,"doctrine" => "pear.phpdoctrine.org"
            ,"ezc"      => "components.ez.no"
            ,"pdepend"  => "pear.pdepend.org"
            ,"phing"    => "pear.phing.info"
            ,"phpdb"    => "pear.phpdb.org"
            ,"phpmd"    => "pear.phpmd.org"
            ,"phpunit"  => "pear.phpunit.de"
            ,"swift"    => "pear.swiftmailer.org"
            ,"symphony" => "pear.symfony-project.com"
        );
        try {
            $nbtot=0;

            foreach ($channels as $channelname => $channelurl) {
                $channel = @simplexml_load_file("http://$channelurl/channel.xml");
                if (!$channel) {
                    throw new Exception(
                        "can't read PEAR site (channel of $channelname)"
                    );
                }

                $rest = $channel->servers->primary->rest->baseurl[0];
                echo date("r : ") . "PEAR reading channel=$channelname" .
                    ", baseurl = $rest\n";

                $categories = @simplexml_load_file($rest."c/categories.xml");
                if (!$categories) {
                    throw new Exception("can't read PEAR site (categories)");
                }

                $sql = "DELETE FROM upstream WHERE type='pear' AND channel='".
                    $channelname."'";
                $nb=$db->exec($sql);
                if ($nb===false) {
                    echo date("r : ") . "SQL ERROR = " . implode(
                        " ",
                        $db->errorInfo()
                    ) . "\n";
                } else {
                    echo date("r : ") . "Delete $nb packages\n";
                }

                $nb=0;
                if (!isset($categories->c[0])) {
                    echo date("r : ") . "Reading ALL\n"; // ezc only
                    $pitxt = @file_get_contents($rest."p/packages.xml");
                    if (!$pitxt) {
                        throw new Exception(
                            "can't read PEAR site (".$rest."p/packagesinfo.xml)"
                        );
                    }
                    $allpi = @simplexml_load_string($pitxt);
                    foreach ($allpi->p as $name) {
                        $pitxt = @file_get_contents(
                            $rest."r/".strtolower($name)."/allreleases.xml"
                        );
                        if (!$pitxt) {
                            throw new Exception(
                                "can't read PEAR site (".$rest."r/".
                                strtolower($name)."/allreleases.xml"
                            );
                        }
                        $pi = @simplexml_load_string($pitxt);

                        $rpmname1="php-".$channelname."-".
                            str_replace("_", "-", $name);
                        $rpmname2="php-".$channelname."-".$name;

                        //echo $rpmname ."/".(string)$pi->r[0]->v."/".
                        //  (string)$pi->r[0]->s."\n";
                        addUpstream(
                            $db,
                            "pear",
                            $channelname,
                            $rpmname1,
                            "unstable",
                            (string)$pi->r[0]->v,
                            (string)$pi->r[0]->s
                        );
                        addUpstream(
                            $db,
                            "pear",
                            $channelname,
                            $rpmname2,
                            "unstable",
                            (string)$pi->r[0]->v,
                            (string)$pi->r[0]->s
                        );
                        foreach ($pi->r as $rev) {
                            if ($rev->s=='stable') {
                                //echo $rpmname ."/".(string)$rev->v."/".
                                //    (string)$rev->s."\n";
                                addUpstream(
                                    $db,
                                    "pear",
                                    $channelname,
                                    $rpmname1,
                                    "stable",
                                    (string)$rev->v
                                );
                                addUpstream(
                                    $db,
                                    "pear",
                                    $channelname,
                                    $rpmname2,
                                    "stable",
                                    (string)$rev->v
                                );
                                break;
                            }
                        }
                        $nb++;
                    }

                } else {
                    foreach ($categories->c as $cat) {
                        echo date("r : ") . "Reading $cat\n";

                        $pitxt = @file_get_contents(
                            $rest."c/".urlencode($cat)."/packagesinfo.xml"
                        );
                        if (!$pitxt) {
                            throw new Exception(
                                "can't read PEAR site (".$rest."c/".
                                urlencode($cat)."/packagesinfo.xml)"
                            );
                        }
                        $pitxt = "/U",
                            "",
                            str_replace("\r\n", "\n", substr($pitxt, 2))
                        );

                        $pi = @simplexml_load_string($pitxt);
                        if (!$pi) {
                            throw new Exception("can't read response ($cat)");
                        }
                        foreach ($pi->pi as $ps) {
                            if (isset($ps->p->n) && isset($ps->a->r)) {
                                $name=(string)$ps->p->n;

                                if ($channelname=='phing' && $name=='phing') {
                                    $rpmname1="php-pear-phing";
                                } else if ($channelname=='phpunit'
                                    && $name=='PHPUnit'
                                ) {
                                    $rpmname1="php-pear-PHPUnit";
                                } else {
                                    $rpmname1="php-".$channelname."-".
                                        str_replace("_", "-", $name);
                                }
                                $rpmname2="php-".$channelname."-".$name;

                                addUpstream(
                                    $db,
                                    "pear",
                                    $channelname,
                                    $rpmname1,
                                    "unstable",
                                    (string)$ps->a->r[0]->v,
                                    (string)$ps->a->r[0]->s
                                );
                                addUpstream(
                                    $db,
                                    "pear",
                                    $channelname,
                                    $rpmname2,
                                    "unstable",
                                    (string)$ps->a->r[0]->v,
                                    (string)$ps->a->r[0]->s
                                );
                                foreach ($ps->a->r as $rev) {
                                    if ($rev->s=='stable') {
                                        addUpstream(
                                            $db, "pear",
                                            $channelname,
                                            $rpmname1,
                                            "stable",
                                            (string)$rev->v
                                        );
                                        addUpstream(
                                            $db,
                                            "pear",
                                            $channelname,
                                            $rpmname2,
                                            "stable",
                                            (string)$rev->v
                                        );
                                        break;
                                    }
                                }
                                $nb++;
                                // echo $ps->p->n."\n";
                            }
                        }
                    }
                }
                echo date("r : ") . "read $nb packages in $channelname\n";
                $nbtot += $nb;
            }
            echo date("r : ") . "read $nbtot packages in all channels\n";

        } catch (Exception $e) {
            echo date("r : ") . 'ERROR ' .  $e->getMessage(), "\n";
        }
    } // if in options

    // -------------------------------------------------------------------
    if ($_SERVER['argc']==1 || in_array('R', $_SERVER['argv'])) {

        $repos = array(
            array(
                "name"  => "R",
                "state" => "stable",
                "url"   => "http://cran.at.r-project.org/src/contrib/PACKAGES"
            ),
            //array("name"=>"R-forge","state"=>"unstable", "url" => "http://r-forge.r-project.org/src/contrib/PACKAGES"),
            array(
                "name"  => "biocp",
                "state" => "stable",
                "url"   => "http://www.bioconductor.org/packages/release/bioc/src/contrib/PACKAGES"
            ),
            array(
                "name"  => "biocp",
                "state" => "unstable",
                "url"   => "http://www.bioconductor.org/packages/devel/bioc/src/contrib/PACKAGES"
            ),
            array(
                "name"  => "bioca",
                "state" => "stable",
                "url"   => "http://www.bioconductor.org/packages/release/data/annotation/src/contrib/PACKAGES"
            ),
            array(
                "name"  => "bioca",
                "state" => "unstable",
                "url"   => "http://www.bioconductor.org/packages/devel/data/annotation/src/contrib/PACKAGES"
            ),
            array(
                "name"  => "bioce",
                "state" => "stable",
                "url"   => "http://www.bioconductor.org/packages/release/data/experiment/src/contrib/PACKAGES"
            ),
            array(
                "name"  => "bioce",
                "state" => "unstable",
                "url"   => "http://www.bioconductor.org/packages/devel/data/experiment/src/contrib/PACKAGES"
            )
        );
        $tottot=0;
        foreach ($repos as $repo) {
            echo date("r : ") . "Reading " . $repo["name"] . " (" .
                $repo["state"] . ")\n";
            $index = @file_get_contents($repo["url"]);
            if (!$index) {
                echo date("r : ") . "Can't read [" . $repo["url"] .
                    "], skip this channel\n";
                continue;
            }
            if ($repo["state"]=="stable") {
                $sql = sprintf(
                    "DELETE FROM upstream WHERE type='R' AND channel='%s'",
                    $repo["name"]
                );
                $nb=$db->exec($sql);
                if ($nb===false) {
                    echo date("r : ") . "SQL ERROR = " .
                        implode(" ", $db->errorInfo()) . "\n";
                } else {
                    echo date("r : ") . "Delete $nb packages\n";
                }
            }
            $results=array();
            if (preg_match_all('/Package: *(.*)\nVersion: *(.*)\n/i', $index, $results, PREG_SET_ORDER)) {
                $tot=0;
                foreach ($results as $result) {
                    //echo $result[1]." = ".$result[2]."\n";
                    $rpmname = "R-".$result[1];
                    $ver = str_replace('-', '.', $result[2]);
                    $add_upstream = addUpstream(
                        $db,
                        "R",
                        $repo["name"],
                        $rpmname,
                        $repo["state"],
                        $ver,
                        ($repo["state"]=="stable"?"":"devel")
                    );

                    if ($add_upstream) {
                        $tot++;
                    }
                }
                echo date("r : ") . "Write $tot packages in this channel\n";
                $tottot += $tot;
            } else {
                echo date("r : ") . "No package in this channel\n";
            }
        }
        echo date("r : ") . "Write $tottot packages in all channels\n";

    } // If R in options

    // -------------------------------------------------------------------
    //	Package Owners from pkgdb (thanks Smootherfrog)
    // -------------------------------------------------------------------
    if ($_SERVER['argc']==1 || in_array('owner', $_SERVER['argv'])) {

        $sql="CREATE TABLE IF NOT EXISTS `acls` (
            `ID` int(11) NOT NULL AUTO_INCREMENT,
            `collection` varchar(100) NOT NULL,
            `name` varchar(100) NOT NULL,
            `summary` varchar(200) NOT NULL,
            `owner` varchar(50) DEFAULT NULL,
            `qa` varchar(50) DEFAULT NULL,
            `cc` varchar(100) DEFAULT NULL,
            PRIMARY KEY (`ID`),
            KEY `name` (`name`),
            KEY `collection` (`collection`),
            KEY `owner` (`owner`)) ENGINE=MyISAM";

        if ($db->exec($sql)!==false) {
            echo date("r : ") . "Check table 'acls' ok\n";
        } else {
            echo date("r : ") . "SQL ERROR = " .
                implode(" ", $db->errorInfo()) . "\n";
        }

        $fic=fopen(
            "https://admin.fedoraproject.org/pkgdb/lists/bugzilla?tg_format=plain",
            "r"
        );
        if (!$fic) {
            echo date("r : ") . "ERROR reading pkgdb\n";
        } else {
            $sql="TRUNCATE `acls`";
            $nb=$db->exec($sql);
            if ($nb===false) {
                echo date("r : ") . "SQL ERROR = " .
                    implode(" ", $db->errorInfo()) . "\n";
            } else {
                echo date("r : ") . "Delete $nb packages\n";
            }

            for ($tot=0 ; $line=fgetcsv($fic, 1024, '|'); ) {
                if (count($line)>5 && substr($line[0], 0, 1)!='#') {
                    for ($i=0; $i<6; $i++) {
                        $line[$i]=trim($line[$i]);
                    }
                    $sql=sprintf(
                        "INSERT INTO `acls` SET collection='%s', name='%s', summary='%s'",
                        $line[0],
                        $line[1],
                        addslashes($line[2])
                    );
                    if (!empty($line[3])) {
                        $sql .= sprintf(", owner='%s'", $line[3]);
                    }
                    if (!empty($line[4])) {
                        $sql .= sprintf(", qa='%s'", $line[4]);
                    }
                    if (!empty($line[5])) {
                        $sql .= sprintf(", cc='%s'", $line[5]);
                    }
                    $nb=$db->exec($sql);
                    if ($nb) {
                        $tot+=$nb;
                    } else {
                        echo date("r : ") . "SQL ERROR = " .
                            implode(" ", $db->errorInfo()) . "\n";
                    }
                }
            }
            fclose($fic);
            echo date("r : ") . "wrote $tot package's owner\n";
        }
    } // If in options

} catch(PDOException $e) {
    printf("%s ERREUR : %s\n", date("r"), $e->getMessage());
}

if (isset($_SERVER["SERVER_NAME"])) {
    echo "
"; } ?>