#!/usr/bin/php yum install php-pear-Console-Getargs\n"); } function Supprimer ($Dest) { global $Conn, $Verb, $Check; if ($Verb>0) echo "Deleting " . basename($Dest); if ($Check) echo " TODO\n"; else if (!ftp_delete($Conn, $Dest)) die("\r*** ERROR deleting $Dest***\n"); else if ($Verb>0) echo " Ok\n"; } function Envoyer ($Dest, $From) { global $Conn, $Verb, $Check; if ($Verb>0) echo "Sending " . basename($Dest); if ($Check) echo " TODO\n"; else if (!ftp_put($Conn, $Dest, $From, FTP_BINARY)) die("\r*** ERROR sending $From***\n"); else if ($Verb>0) echo " Ok\n"; } function EnvoyerRepodata () { global $Conn, $Verb, $Repodata, $Local; if ($Verb>1) echo "+ Updating Metadata\n"; if (@ftp_mkdir($Conn, "repodata")) if ($Verb>0) echo "Creating remote repodata Ok\n"; if (!ftp_chdir($Conn, "repodata")) die ("*** ERROR repodata not a remote folder\n"); foreach ($Repodata as $Nom) if (is_file($Local."/repodata/".$Nom)) Envoyer($Nom, $Local."/repodata/".$Nom); if (!ftp_chdir($Conn, "..")) die ("*** ERROR can't go up\n"); } $Repodata = array("filelists.xml.gz", "other.xml.gz", "primary.xml.gz", "repomd.xml", "filelists.sqlite.bz2", "other.sqlite.bz2", "primary.sqlite.bz2"); $config = array( "server" => array('short' => 's', 'max' => 1, 'min' => 1, 'desc' => "FTP server name"), "user" => array('short' => 'u', 'max' => 1, 'min' => 1, 'desc' => "User login on server"), "password" => array('short' => 'p', 'max' => 1, 'min' => 1, 'desc' => "Password for user on server"), "local" => array('short' => 'l', 'max' => 1, 'min' => 0, 'default' => '.', 'desc' => "Local directory"), "remote" => array('short' => 'r', 'max' => 1, 'min' => 0, 'default' => '/', 'desc' => "Remote directory"), "force" => array('short' => 'f', 'max' => -1, 'min' => 0, 'desc' => "Force sending (resend after error)"), "check" => array('short' => 'c', 'max' => 0, 'desc' => "Check only, no action"), "passive" => array('short' => 'w', 'max' => 0, 'desc' => "Passive mode"), "quiet" => array('short' => 'q', 'max' => 0, 'desc' => "Minimal output"), "verbose" => array('short' => 'v', 'max' => 0, 'desc' => "Verbose output"), "debug" => array('short' => 'd', 'max' => 0, 'desc' => "Very-verbose output") ); $args =& Console_Getargs::factory($config); if (PEAR::isError($args)) { echo "ftpreposync version " . VERSION . "\n"; if ($args->getCode() === CONSOLE_GETARGS_ERROR_USER) echo Console_Getargs::getHelp($config, null, $args->getMessage())."\n"; else if ($args->getCode() === CONSOLE_GETARGS_HELP) echo Console_Getargs::getHelp($config)."\n"; exit; } $TabForce = (array)$args->getValue('force'); $Verb=1; if ($args->getValue('quiet')) $Verb=0; if ($args->getValue('verbose')) $Verb=2; if ($args->getValue('debug')) $Verb=4; $Check = $args->getValue('check'); $Passive = $args->getValue('passive'); $Server = $args->getValue('server'); $User = $args->getValue('user'); $Pass = $args->getValue('password'); $Local = ($args->isDefined('local') ? $args->getValue('local') : "."); $Dist = ($args->isDefined('remote') ? $args->getValue('remote') : "/"); if ($Verb>1) { echo "ftpreposync version " . VERSION . "\n"; echo "+ Server = $Server\n"; echo "+ User = $User\n"; echo "+ Local = $Local\n"; echo "+ Remote = $Dist\n"; } if ($Verb>1) echo "+ Reading $Local\n"; if (!is_dir($Local)) die ("*** $Local is not a local folder\n"); if (!is_dir($Local."/repodata")) die ("*** $Local is not a repository\n"); $TabLoc=array(); if ($dh = opendir($Local)) { while (($file = readdir($dh)) !== false) if (substr($file,-4)==".rpm") $TabLoc[]=$file; closedir($dh); if ($Verb>2) print_r($TabLoc); } else die ("*** Cannot read $Local\n"); if ($Verb>1) echo "+ Connexion\n"; ($Conn = ftp_connect($Server)) || die("*** Connexion au serveur $Server impossible\n"); if ($Verb>1) echo "+ Authentification\n"; ftp_login($Conn, $User, $Pass) || die("*** Connexion de $User impossible\n"); if (ftp_pasv($Conn, $Passive)) echo ($Passive ? "Mode passif" : "Mode actif") . " : ok\n"; if (ftp_chdir($Conn, $Dist)) { if ($Verb>1) echo "+ Reading ftp://$Server$Dist\n"; $TabDst = array(); $TabDst = ftp_nlist($Conn, "."); if ($Verb>2) print_r($TabDst); foreach ($TabDst as $num => $nom) { if (substr($nom,-4)!=".rpm") unset($TabDst[$num]); } $Nb=0; $Send=false; if ($Verb>1) echo "+ Searching new files\n"; sort($TabLoc); foreach ($TabLoc as $Nom) { // Envoyer les nouveaux if (in_array($Nom, $TabForce) || !in_array($Nom, $TabDst)) { Envoyer($Nom, $Local."/".$Nom); $Nb++; } } if ($Nb>0) { // Déclarer les nouveaux RPM du dépôt avant le nettoyage EnvoyerRepodata(); $Send=true; } if ($Verb>1) echo "+ Searching old files\n"; sort($TabDst); foreach ($TabDst as $Nom) { // Supprimer les anciens if (!in_array($Nom, $TabLoc)) { Supprimer($Nom); $Nb++; } } if ($Nb>0 && !$Send) { // Si pas déjà fait EnvoyerRepodata(); $Send=true; } if ($Verb>0 && !$Nb) echo "No change in RPM detected\n"; // Traitement du dossier headers pour les anciens dépôts (EL4) if (is_dir($Local . "/headers")) { if ($Verb>0) echo "+ $Local/headers folder\n"; $Local .= "/headers"; $TabLoc=array(); if ($dh = opendir($Local)) { while (($file = readdir($dh)) !== false) if (substr($file,-4)==".hdr") $TabLoc[]=$file; closedir($dh); if ($Verb>2) print_r($TabLoc); } else die ("*** Cannot read $Local\n"); if (@ftp_mkdir($Conn, "headers")) if ($Verb>0) echo "Creating remote headers Ok\n"; if (!ftp_chdir($Conn, "headers")) die ("*** ERROR headers not a remote folder\n"); if ($Verb>1) echo "+ Reading ftp://$Server$Dist/headers\n"; $TabDst = ftp_nlist($Conn, "."); if ($Verb>2) print_r($TabDst); foreach ($TabDst as $num => $nom) { if (substr($nom,-4)!=".hdr") unset($TabDst[$num]); } $Nb=0; $Send=false; if ($Verb>1) echo "+ Searching new headers\n"; sort($TabLoc); foreach ($TabLoc as $Nom) { // Envoyer les nouveaux if (in_array($Nom, $TabForce) || !in_array($Nom, $TabDst)) { Envoyer($Nom, $Local."/".$Nom); $Nb++; } } if ($Nb>0) { // Déclarer les nouveaux headers du dépôt avant le nettoyage Envoyer("header.info", $Local."/header.info"); $Send=true; } if ($Verb>1) echo "+ Searching old headers\n"; sort($TabDst); foreach ($TabDst as $Nom) { // Supprimer les anciens if (!in_array($Nom, $TabLoc)) { Supprimer($Nom); $Nb++; } } if ($Nb>0 && !$Send) { // Si pas déjà fait Envoyer("header.info", $Local."/header.info"); $Send=true; } if ($Verb>0 && !$Nb) echo "No change in headers detected\n"; } else if ($Verb>1) echo "Not an old repo with headers\n"; } else die("*** $Dist is not a remote folder\n"); if ($Verb>1) echo "+ Terminated, closing connexion\n"; ftp_close($Conn); ?>