Qui vous fait croire que c’est open source ?
[code]<?
/******************************************************
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
APT-PROXY-FANCH (LINUXQUIMPER)
Le 21/11/2007
Par Fanch pour LinuxQuimper.org
Ce script est à appeler ainsi :
http://127.0.0.1/repository.php/?http://archive.ubuntu.com/ubuntu/dists/gutsy/Contents-i386.gz
ou
http://127.0.0.1/repository.php/?archive.ubuntu.com/ubuntu/dists/gutsy/Contents-i386.gz
******************************************************/
/******************************************************
Variables de configuration
******************************************************/
$start_script = time();
$numberaleatoire = rand(0,99);
$i=1;
$repositories[$i] = Array(
“name” => “Depot Ubuntu”,
“url” => “http://archive.ubuntu.com/”, //Ne pas oublier le / à la fin
“path” => “/mnt/storage-secure/repositories/mirror/archive.ubuntu.com/”, //Ne pas oublier le / à la fin
“active” => true
);
$i++;
$config = Array(
“sendRemoteAlways” => false,
“sendLocalAlways” => false,
“checkRemotly” => true, //Verifier le fichier distant
“checkRemoteIfLocalAge” => 0, //Age du fichier local maximum avant vérification distante
“checkLocal” => true //Verifier le fichier local
);
define(“DEBUG_ON”, false);
define(“FILE_DEBUG”, “/var/log/proxyaptfanch.log”);
register_shutdown_function (“shutdown_script”);
/*******************************************************
Recuperation de l’url
*/
$urlInput = $_ENV[“QUERY_STRING”];
if(substr($urlInput,0,7) != “http://”)
$urlInput = “http://”.$urlInput;
$urlInput = parseUrl($urlInput);
//
logg("###> “.date(“d-m-Y H:i:s”).”<### Demande de l’url ".$urlInput[“url”]);
//Recuperation de l’id du repository
$idRepo = findRepository($urlInput[“url”]);
logg(“Repository correspondant trouvé : “.$idRepo.” (”.$repositories[$idRepo][“name”].")" );
//Recuperation des info locales
if($config[“checkLocal”]){
$infoFileLocal = getInfoFileLocal();
logg(“Récuperation des information du fichier local (time:”.date(“d-m-Y H:i:s”,$infoFileLocal[‘time’])." “.$infoFileLocal[‘time’].” size:".$infoFileLocal[‘size’]." type:".$infoFileLocal[‘type’].")");
}
//Recuperation des info distants
if($config[“checkRemotly”]){
$infoFileDistant = getInfoFileDistant();
logg(“Récuperation des information du fichier distant (time:”.date(“d-m-Y H:i:s”,$infoFileDistant[‘time’])." “.$infoFileDistant[‘time’].” size:".$infoFileDistant[‘size’]." type:".$infoFileDistant[‘type’].")");
}
//Toujours envoyer le fichier distant ?
if($config[“sendRemoteAlways”]){
streamFileDistant();
//Toujours envoyer le fichier local ?
}elseif($config[“sendLocalAlways”]){
streamFileLocal();
//Rien trouvé
}elseif((empty($infoFileLocal[“time”]) && empty($infoFileDistant[“time”]))){
logg("!!! 404 Fichier introuvable distant et local !!!");
header(“HTTP/1.0 404 Not Found”);
//Repertoire ou fichier texte
}elseif(is_dir($repositories[$idRepo][“path”].$urlInput[‘filepath’]) || $infoFileDistant[‘size’]==0 ||$infoFileDistant[‘time’]==-1 || $infoFileDistant[“type”] == “text/html; charset=UTF-8”){
streamWebUrl();
//Fichier distant plus recent
}elseif( (time()-$infoFileLocal[“time”]) > $config[“checkRemoteIfLocalAge”] && $infoFileDistant[“time”] > $infoFileLocal[“time”]){
streamFileDistant();
//Sinon envoyer fichier local
}else{
streamFileLocal();
}
logg(date(“d-m-Y H:i:s”)." ------ Fin d’envoi");
exit;
function streamWebUrl(){
global $urlInput;
logg(date(“d-m-Y H:i:s”)." ------ Debut de l’envoi du flux URL (".$urlInput[“url”].")");
readfile($urlInput[“url”]);
}
function streamFileLocal(){
global $urlInput,$repositories,$infoFileLocal,$idRepo;
if(empty($idRepo))
$idRepo=findRepository($urlInput[“url”]);
if(empty($idRepo))
return false; //Interdit, ce fichier n’est pas le mirroir
if(empty($infoFileLocal))
$infoFileLocal=getInfoFileLocal($urlInput[‘filepath’],$idRepo);
logg(date(“d-m-Y H:i:s”)." ------ Debut de l’envoi du fichier local (".$repositories[$idRepo][“path”].$urlInput[‘filepath’].")");
header(“Content-Type: “.$infoFileLocal[‘type’].”\n” );
header(‘Content-Description: File Transfer’);
header(‘Content-Length: ‘. $infoFileLocal[‘size’]);
header(‘Content-Disposition: attachment; filename="’.$urlInput[‘file’].’"’);
header(‘Pragma: no-cache’);
header(‘Expires: 0’);
readfile($repositories[$idRepo]["path"].$urlInput['filepath']);
}
function streamFileDistant(){
global $urlInput,$repositories,$infoFileDistant,$idRepo;
if(empty($idRepo))
$idRepo=findRepository($urlInput[“url”]);
if(empty($infoFileDistant))
$infoFileDistant=getInfoFileDistant($urlInput[“url”],$idRepo);
logg(date("d-m-Y H:i:s")." ------ Debut de l'envoi du fichier distant (".$urlInput["url"].")");
header("Content-Type: ".$infoFileDistant['type']."\\n" );
header('Content-Description: File Transfer');
header('Content-Length: '. $infoFileDistant['size']);
header( "Content-Disposition: attachment; filename='".$urlInput['file']."'" );
header('Pragma: no-cache');
header('Expires: 0');
readfile($urlInput["url"]);
}
function getInfoFileDistant(){
global $urlInput,$repositories,$idRepo;
if(empty($idRepo))
$idRepo=findRepository($urlInput[“url”]);
$repo = $repositories[$idRepo];
$ch = curl_init(); // create cURL handle (ch)
if (!$ch) {
die(“Couldn’t initialize a cURL handle”);
}
// set some cURL options
curl_setopt($ch, CURLOPT_URL, $urlInput[“url”]);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_FILETIME, true);
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
// execute
curl_exec($ch);
$curl_return = curl_getinfo($ch);
if($curl_return['http_code']==200){
//Le fichier existe
$ret['path'] = $urlInput["url"];
$ret['time'] = $curl_return['filetime'];
$ret['type'] = $curl_return['content_type'];
$ret['size'] = $curl_return['download_content_length'];
return $ret;
}else{
return $curl_return['http_code'];
}
}
function getInfoFileLocal(){
global $urlInput,$repositories,$idRepo;
if(empty($idRepo))
$idRepo=findRepository($urlInput[“url”]);
$pathFile = $repositories[$idRepo]["path"].str_replace($repositories[$idRepo]["url"],"",$urlInput["url"]);
if(file_exists($pathFile) && !is_dir($pathFile)){
//Le fichier existe
$ret['path'] = $pathFile;
$ret['time'] = filemtime($pathFile);
$ret['type'] = mime_content_type($pathFile);
$ret['size'] = filesize($pathFile);
return $ret;
}else{
return false;
}
}
function findRepository($url){
global $repositories;
if(!empty($repositories)){
foreach($repositories as $idRepo => $repo){
if(preg_match("|^".$repo[“url”]."|",$url))
return $idRepo;
}
}
return false;
}
function parseUrl($url){
if(!preg_match(’|^http://.+$|’, $url))
return false;
preg_match(’|^((http://)?([^/]+))/((.)/)?(([^\.]+)(\.([^\.]+(\.[^\.]+)))?)$|’, $url, $matches);
$ret[‘url’] = $matches[0];
$ret[‘server’] = $matches[3];
$ret[‘urlserver’] = $matches[1];
$ret[‘folder’] = $matches[5];
$ret[‘file’] = $matches[6];
$ret[‘filepath’] = $matches[4].$matches[6];
$ret[‘filename’] = $matches[7];
$ret[‘ext’] = $matches[9];
return $ret;
}
function shutdown_script(){
$statut = connection_status();
if($statut==2){
logg(date("d-m-Y H:i:s")." ------ Timeout liaison perdu entre le demandeur et ce script");
}elseif($statut==1){
logg(date("d-m-Y H:i:s")." ------ Arret volontaire par l'utilisateur demandeur");
}elseif($statut==0){
}
}
function logg($texte){
global $start_script,$numberaleatoire;
if(!empty($_ENV[‘HTTP_X_FORWARDED_FOR’]))
$ip = $_ENV[‘HTTP_X_FORWARDED_FOR’];
else
$ip = $_ENV[‘REMOTE_ADDR’];
$flog = fopen(FILE_DEBUG,“a”); //concatene au fichier
$rc = fputs($flog,"[".$ip.".".$numberaleatoire."] “.$texte.”
");
$rc = fclose($flog);
if(DEBUG_ON)
echo $texte;
}
?>[/code]
C’est libre ! Faites en ce que vous voulez
Fanch