<?php
$URL_HANDLERS["*"] = "GLCASRepo";
-
+global $CRON_CLASSES;
+$CRON_CLASSES["GLCASRepo"] = "GLCASRepo";
class GLCASRepo {
function __construct($config)
error_log("set storage location, $storloc");
}
}
+
+ function cron()
+ {
+ //echo "<pre>";
+ $uconf = unserialize($this->config->getConfigVar("repodata"));
+ $repostore = $this->config->getConfigVar("storagelocation");
+ //print_r($uconf);
+ //echo "</pre>";
+
+ foreach($uconf as $rkey => $repo) {
+ echo "Repo $rkey: ".$repo["desc"]."<br>";
+ if(!isset($repo["expiretime"])) {
+ echo " - Expire time not set, setting to 2 days by default<br>";
+ $uconf[$rkey]["expiretime"] = 2;
+ $repo["expiretime"] = 2;
+ $this->config->setConfigVar("repodata", serialize($uconf));
+ $this->config->saveConfig();
+ }
+
+ if(file_exists("$repostore/$rkey/repodata/repoupdate.lock")) {
+ echo " - <font color=\"red\">Repo locked for update</font><br>";
+
+ }
+
+ // we still do this next bit, even if its locked because it may be a stray file
+ echo " - Expire time is ".$repo["expiretime"]." days, checking repo<br>";
+ error_log("checking $repostore/$rkey/repodata/repomd.xml");
+ $tdiff = time() - filemtime("$repostore/$rkey/repodata/repomd.xml");
+ $maxtdiff = $repo["expiretime"] * 24 * 3600;
+ if($tdiff > $maxtdiff) {
+ echo " - <font color=\"green\">updating repo</font><br>";
+ $this->updateRepo($rkey);
+ } else {
+ echo " - not updating repo<br>";
+ }
+ }
+ }
function go($url)
{
// iterate over its length, send 8k at a time
while(!feof($localfile)) {
// read and send data
- $data = fread($localfile, 8192);
+ $data = fread($localfile, 32768);
echo $data;
// flush so the client sees the data
// TODO: this is the function im working on
// the alternative to this function is that if a file is in the process of being
// downloaded, we simply serve from upstream... not a good idea tho unless we create
- // a local proxy right here
+ // a local proxy right here - this function is a race condition waiting to be had
+ // lets hope its a good one!
function downloadAndServe($filename, $repoid, $remoteurl)
{
// or a range (watching and sending)
// TODO: it may be advicable to start the download as a seperate cli process rather then something goin on here
// so it definitely cant be interrupted.
-
-
+
+ // check for a 404 file and wait 2 if it exists - i should really check the timestamp for an updated
+ // file, but thats too much effort for now: TODO: check timestamp on 404 file
+ $slept = 0;
+ while(!file_exists("$filename")) {
+ clearstatcache();
+ sleep(1);
+ $slept += 1;
+ error_log("Sleeping waiting for file");
+
+ // if 404 file exists, we wait much less time
+ if(file_exists("$filename.404") && $slept > 2) {
+ header("HTTP/1.0 404 Not Found");
+ return;
+ }
+ if($slept > 10) {
+ header("HTTP/1.0 404 Not Found");
+ return;
+ }
+ }
+
+ clearstatcache();
+ if(is_dir($filename)) {
+
+ header("Location: ".$_SERVER["REQUEST_URI"]."/");
+ return;
+ }
+
// first, getting and sending - this is easy.
if (!$ranged) {
// this is where the fun starts - but this one isnt too bad.
error_log("OTHERDOWNLOAD: im another downloader, please work");
- $fsize = file_get_contents("$filename.size");
+ if(file_exists("$filename.size")) $fsize = file_get_contents("$filename.size");
+ else $fsize = filesize($filename);
header("Content-Length: $fsize");
$sgotten = 0;
while(!feof($localfile)) {
- error_log("OTHERDOWNLOAD: get");
$data = fread($localfile, 2048);
if(!$data) {
error_log("dollardata is pair shaped");
// the problem is here
error_log("Downloader: going ranged as other");
clearstatcache();
- $contentlen = file_get_contents($filename.".tmp.data.deleteme.size");
+ if(file_exists($filename.".tmp.data.deleteme.size")) $contentlen = file_get_contents($filename.".tmp.data.deleteme.size");
+ else $contentlen = filesize($filename);
$contenttype = mime_content_type($filename);
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $rangelength");
clearstatcache();
- error_log("OTHERDOWNLOAD: im another downloader, please work for ranged");
-
-
- error_log("OTHERDOWNLOAD: im another downloader, please work");
// first we wait until the file reaches $rangestart
while(filesize("$filename") < $rangestart) {
$sgotten = 0;
// need to think about this in pseudo code.
// 1. close the file and wait for it to get to $sgotten + 2048 or $fsize
- $cursize = filesize($filename.".tmp.data.deleteme");
+ $cursize = filesize($filename);
$upload_finished = false;
error_log("background downloader, start");
global $WEB_ROOT_FS, $URL_HANDLERS, $BASE_URL;
if(file_exists("$WEB_ROOT_FS/../bin/downloadfile.php")) {
- $scall = "/usr/bin/php $WEB_ROOT_FS/../bin/downloadfile.php '$url' '$file' > /dev/null 2>&1 &";
+ $scall = "/usr/bin/php $WEB_ROOT_FS/../bin/downloadfile.php '$url' '$file' > /tmp/dllog 2>&1 &";
system($scall);
- error_log("started as v, $v, $scall");
} else {
error_log("cant find download helper... dieing");
}
}
}
- function addRepo($desc, $os, $version, $arch, $other, $shorturl, $prefix, $repurl, $repotype, $init)
+ function addRepo($desc, $os, $version, $arch, $other, $shorturl, $prefix, $repurl, $repotype, $init, $expiretime)
{
$uconf = $this->config->getConfigVar("repodata");
$cs["prefix"] = $prefix;
$cs["url"] = $repurl;
$cs["repotype"] = $repotype;
+ $cs["expiretime"] = $expiretime;
$ckey = 0;
if(!file_exists("$repostore/$repokey/repodata")) {
mkdir("$repostore/$repokey/repodata");
}
+
+ error_log("background yum repo update, start");
+ global $WEB_ROOT_FS, $URL_HANDLERS, $BASE_URL;
+ if(file_exists("$WEB_ROOT_FS/../bin/downloadfile.php")) {
+ $scall = "/usr/bin/php $WEB_ROOT_FS/../bin/updateyumrepo.php '$repourl' '$repostore/$repokey/' > /tmp/updateyumrepo.$repokey.log 2>&1 &";
+ system($scall);
+ } else {
+ error_log("cant find download yum helper... dieing");
+ }
+
//ignore_user_abort(true);
- $actionurl = "$repourl/repodata/repomd.xml";
- $repomdxml = file_get_contents($actionurl);
- file_put_contents("$repostore/$repokey/repodata/repomd.xml", $repomdxml);
-
- $xml = simplexml_load_file("$repostore/$repokey/repodata/repomd.xml");
-
-
- foreach($xml as $key => $var) {
- //echo "for key $key has:\n";
- //print_r($var);
- if($key == "data") {
- $fileloc = $var->location["href"];
- if(!file_exists("$repostore/$repokey/$fileloc")) {
- error_log("getting $fileloc for $repokey on $repourl");
- $dlfile = file_get_contents("$repourl/$fileloc");
- file_put_contents("$repostore/$repokey/$fileloc", $dlfile);
- } else {
- error_log("Not getting $fileloc because we already have it");
- }
- }
- }
}
function getRepo($id)