From ac6a7aa8e9f814a71f1c759c8ec2c83882cc1240 Mon Sep 17 00:00:00 2001 From: paulr Date: Sun, 31 Jul 2011 05:01:16 +1000 Subject: [PATCH] first set of actually fully working code (against the centos and redhat isntallers anyways) --- bin/downloadfile.php | 76 ++++++ plugins/repo.php | 616 ++++++++++++++++++++++---------------------------- www/index.php | 2 +- 3 files changed, 345 insertions(+), 349 deletions(-) create mode 100644 bin/downloadfile.php diff --git a/bin/downloadfile.php b/bin/downloadfile.php new file mode 100644 index 0000000..4760627 --- /dev/null +++ b/bin/downloadfile.php @@ -0,0 +1,76 @@ + $val) { + if(preg_match("/HTTP.*30[1-9].*/", $val)) { + mkdir($file); + exit(0); + } + // get content length form upstream and print + if(preg_match("/^Content-Length:.*/", $val)) { + $clentemp = preg_split("/[: ]+/", $val); + $contentlen = $clentemp[1]; + //header($val); + } + // get content type from upstream and print + if(preg_match("/^Content-Type:.*/", $val)) { + $contenttype = $val; + } + if(!$remotefile) { + return; + } + +} + +file_put_contents("$file.size", $contentlen); + +while(!feof($remotefile)) { + $data = fread($remotefile, 2048); + fwrite($localfile, $data); +} + +//rename("$file.tmp.data.deleteme", $file); +unlink("$file.size"); + +?> \ No newline at end of file diff --git a/plugins/repo.php b/plugins/repo.php index 522eef7..5ec7a09 100644 --- a/plugins/repo.php +++ b/plugins/repo.php @@ -15,12 +15,12 @@ class GLCASRepo { error_log("set storage location, $storloc"); } } - + function go($url) { error_log("repo:go called"); - - // figure out what we're doing + + // figure out what we're doing switch($url) { case "list": GLCASpageBuilder($this, "body"); @@ -29,7 +29,7 @@ class GLCASRepo { $this->getRepoForUrl($url); } } - + function body($url) { // this is how this will work @@ -40,40 +40,40 @@ class GLCASRepo { } echo "i am the repo, $url"; } - - + + // TODO: rework this function /* - * What i need to do is have a downloader function - * that can cope with lots of different shit - * but thats a pipe dream - * - * what *THIS* function needs to do is - * 1) figure out the repo - * 2) figure out the file in the repo - * 2.1) if its a directory, go to print directory - * 3) if the file exists, give it to the user (if a range is specified give the user the range) - * 4) if the file does not exist - * - check if a tmp file exists - * - attempt to get an exclusive flock - * - if flock fails, donwload in progress - * - if flock succeeds, truncate file and re-start download - * - if a range request was made, send the range once available - * - if range not available, sleep for 5 and check again. - * - * I dont want to code this from scratch, but i probably need to - */ + * What i need to do is have a downloader function + * that can cope with lots of different shit + * but thats a pipe dream + * + * what *THIS* function needs to do is + * 1) figure out the repo + * 2) figure out the file in the repo + * 2.1) if its a directory, go to print directory + * 3) if the file exists, give it to the user (if a range is specified give the user the range) + * 4) if the file does not exist + * - check if a tmp file exists + * - attempt to get an exclusive flock + * - if flock fails, donwload in progress + * - if flock succeeds, truncate file and re-start download + * - if a range request was made, send the range once available + * - if range not available, sleep for 5 and check again. + * + * I dont want to code this from scratch, but i probably need to + */ function getRepoForUrl($url) { $xurl = split("[/,]", $url); - - // first get the config + + // first get the config $uconf = unserialize($this->config->getConfigVar("repodata")); $repostore = $this->config->getConfigVar("storagelocation"); - + // preset matched to -1 $matched = -1; - + // first we check for /repo/repoid as a url $startat = 0; if($xurl[0] == "repo") { @@ -85,12 +85,12 @@ class GLCASRepo { $startat +=2; } } - + // now check for a prefix match $prematch = false; if($matched < 0) foreach($uconf as $key => $var) { $pre = $var["prefix"]; - + if($pre!="") { //echo "Checking pre $pre against ".$xurl[0]."\n"; if(strcasecmp($pre, $xurl[0])==0) { @@ -100,13 +100,13 @@ class GLCASRepo { } } } - + // next, check for a short url match if($matched < 0) foreach($uconf as $key => $var) { // if we matched a pre, then we check against the second url component - + $short = $var["shorturl"]; - + if($short!="") { //echo "Checking short $short against ".$xurl[$startat]."\n"; if(strcasecmp($xurl[$startat], $short)==0) { @@ -116,7 +116,7 @@ class GLCASRepo { } } } - + // TODO: this deterministic bit // so far nothing has matched - what this next bit needs to do is try and "Determine" a repo from url // for eg, if a user gets /fedora/x86_64/os we need to return something appropriate @@ -125,26 +125,26 @@ class GLCASRepo { header("HTTP/1.0 404 Not Found"); return; } - - + + // something was matched, so now we reconstruct the file component of the url $file = "/"; if(count($xurl) > $startat) for($i=$startat; $i < count($xurl); $i++) { $file .= "/".$xurl[$i]; } - + // so, the ultimate url for the file we need is: $actualfile = "$repostore/$matched/$file"; error_log("Atcualfile is $actualfile"); - + // if its a directory, lets do a print if(is_dir($actualfile)) { $this->printDir($actualfile, $file, $url); return; } - + // check if the file exists and serve it up - if(file_exists($actualfile)) { + if(file_exists($actualfile) && !file_exists("$actualfile.size")) { $this->serveUpFile($actualfile, $matched); return; } else { @@ -154,47 +154,47 @@ class GLCASRepo { return; } } - + function serveUpFile($actualfile, $repoid) { $uconf = unserialize($this->config->getConfigVar("repodata")); $repostore = $this->config->getConfigVar("storagelocation"); - + // figure out the range header garbage that centos/redhat send if(isset($_SERVER["HTTP_RANGE"])) { // we're using ranges - screw you stupid installer $pr_range = preg_split("/[:\-=, ]+/", $_SERVER["HTTP_RANGE"]); - + // cut up ranges $rangestart = $pr_range[1]; $rangelength = $pr_range[2] - $pr_range[1] +1; $rangestr = $pr_range[1]."-".$pr_range[2]; error_log("going ranges at $rangestart, $rangelength,".$rangesa[1].",".$rangesb[0]); - + // now spit some headers header("HTTP/1.1 206 Partial Content"); header("Content-Length: ".$rangelength); - + - header("Content-Range: bytes $rangesstr/".filesize($actualfile)); - + header("Content-Range: bytes $rangestr/".filesize($actualfile)); + // determine mime type $type = mime_content_type($actualfile); - + // set mime type header header("Content-type: $type"); - + // open the local file (TODO: error check) $localfile = fopen($actualfile, "r"); fseek($localfile, $rangestart, SEEK_SET); - + // read in the data, god i hope its not big $data = fread($localfile, $rangelength); - + // lastly, send data echo $data; flush(); - + // and close the file fclose($localfile); return; @@ -206,113 +206,49 @@ class GLCASRepo { // set the mime type header $type = mime_content_type($actualfile); header("Content-type: $type"); - - // open the local file + + // open the local file $localfile = fopen($actualfile, "r"); if(!$localfile) { error_log("normal upload went barf"); return; } - + // iterate over its length, send 8k at a time while(!feof($localfile)) { // read and send data $data = fread($localfile, 8192); echo $data; - + // flush so the client sees the data flush(); } - + // close the file fclose($localfile); return; - } + } } - + // 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 function downloadAndServe($filename, $repoid, $remoteurl) { - // this is important so downloads dont die + + $this->startDownload($filename, $remoteurl); + + // give the proc a minute to get going + sleep(2); clearstatcache(); - ignore_user_abort(true); - + // get the configurations we need $uconf = unserialize($this->config->getConfigVar("repodata")); $repostore = $this->config->getConfigVar("storagelocation"); - - // this is the tricky one for ranges. - - // check if a download exists - $otherdownloader = false; - if(file_exists("$filename.tmp.data.deleteme")) { - // a download exists, does it still work - error_log("DOWNLOADER: file exists for current download, hope it works, attempting lock"); - $localtmpfh = fopen("$filename.tmp.data.deleteme", "r"); - $lockres = flock($localtmpfh, LOCK_EX|LOCK_NB); - if(!$lockres) { - error_log("flock did fail, all is right with the world a download is in progress"); - $otherdownloader = true; - } else { - error_log("lock succeeded, dieing in the arse"); - unlink("$filename.tmp.data.deleteme"); - unlink("$filename.tmp.data.deleteme.size"); - } - } - // open the remote file - $contentlen = 0; - $contenttype = ""; - if(!$otherdownloader) { - $remotefile = fopen($remoteurl, "r"); - $localfile = fopen($filename.".tmp.data.deleteme", "w"); - $lockres = flock($localfile, LOCK_EX); - if(!$localfile) { - erorr_log("something went plop"); - return; - } - // get the headers from the remote request and use them to hurt people - $contentlen = 0; - foreach($http_response_header as $key => $val) { - if(preg_match("/HTTP.*30[1-9].*/", $val)) { - error_log("got a 30x, must be a directory"); - mkdir($filename); - header("Location: ".$_SERVER["REQUEST_URI"]."/"); - return; - } - // get content length form upstream and print - if(preg_match("/^Content-Length:.*/", $val)) { - // WARNING, THIS IS NOT RIGHT - $clentemp = preg_split("/[: ]+/", $val); - $contentlen = $clentemp[1]; - //header($val); - } - // get content type from upstream and print - if(preg_match("/^Content-Type:.*/", $val)) { - $contenttype = $val; - } - if(!$remotefile) { - header("HTTP/1.0 404 Not Found"); - error_log("asked fore file that dont exist"); - return; - } - - } - error_log("put contentlen as $contentlen"); - file_put_contents($filename.".tmp.data.deleteme.size", $contentlen); - } else { - $localfile = fopen($filename.".tmp.data.deleteme", "r"); - if(!$localfile) { - error_log("something went plop"); - return; - } - } - - - + + // determine if we're ranged $ranged = false; $rangestart = 0; @@ -320,20 +256,20 @@ class GLCASRepo { $rangestr=""; if(isset($_SERVER["HTTP_RANGE"])) { // we're using ranges - screw you stupid installer - + $pr_range = preg_split("/[:\-=, ]+/", $_SERVER["HTTP_RANGE"]); error_log("got range ".$_SERVER["HTTP_RANGE"]." and ".print_r($pr_range, true)); - + // cut up ranges $rangestart = $pr_range[1]; $rangelength = $pr_range[2] - $pr_range[1] +1; $rangestr = $pr_range[1]."-".$pr_range[2]; - error_log("going ranges at $rangestart, $rangelength,"); + error_log("going ranges at $rangestart, $rangelength, $rangestr"); $ranged = true; } - + // open the local files - + // now, lets determine what state we're in // we're either - getting and sending // watching and sending @@ -341,33 +277,20 @@ class GLCASRepo { // 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. - - + + + // first, getting and sending - this is easy. - if(!$ranged && !$otherdownloader) { - while(!feof($remotefile)) { - $data = fread($remotefile, 2048); - echo $data; - flush(); - fwrite($localfile, $data); - } - rename($filename.".tmp.data.deleteme", $filename); - unlink($filename.".tmp.data.deleteme.size"); - - // and we're done - return; - - - - - // IT WORKS!!!!!!! - } else if ($otherdownloader && !$ranged) { + if (!$ranged) { + + $localfile = fopen($filename, "r"); + // 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.".tmp.data.deleteme.size"); + $fsize = file_get_contents("$filename.size"); header("Content-Length: $fsize"); $sgotten = 0; - while(!feof($localfile)) { + while(!feof($localfile)) { error_log("OTHERDOWNLOAD: get"); $data = fread($localfile, 2048); if(!$data) { @@ -383,16 +306,11 @@ class GLCASRepo { } } fclose($localfile); - + // need to think about this in pseudo code. // 1. close the file and wait for it to get to $sgotten + 2048 or $fsize - if(file_exists($filename.".tmp.data.deleteme")) $cursize = filesize($filename.".tmp.data.deleteme"); - else if(file_exists($filename)) { - error_log("DOTHERDOWNLOADER: namechange"); - $cursize = filesize($filename); - } else return; // we had to bail - - + $cursize = filesize($filename); + $upload_finished = false; while(!$upload_finished) { while($cursize < $fsize && $cursize < ($sgotten+2048)) { @@ -400,32 +318,23 @@ class GLCASRepo { error_log("OTHERDOWNLOAD: halt, $cursize, $sgotten, $fsize"); // sleep until the the filesize is greater then what we're up to, or until the file is finished sleep(1); - if(file_exists($filename.".tmp.data.deleteme")) { - error_log("OTHERDOWNLOADER: still same name"); - $cursize = filesize($filename.".tmp.data.deleteme"); - } else if(file_exists($filename)) { - error_log("DOTHERDOWNLOADER: namechange"); - $cursize = filesize($filename); - } - else return; // we had to bail + $cursize = filesize($filename); } - + error_log("OTHERDOWNLOAD: continue, $sgotten, $fsize"); // reopen local file - if it stopped existing, we need to deal with that - if(file_exists($filename.".tmp.data.deleteme")) $localfile = fopen($filename.".tmp.data.deleteme", "r"); - else if(file_exists($filename)) $localfile = fopen($filename, "r"); - else return; // we had to bail - + $localfile = fopen($filename, "r"); + // UG, we need to ff, how could i forget that fseek($localfile, $sgotten); - + if(!$localfile) { error_log("OTHERDOWNLOAD: something went plop"); return; } - + // now loop on the file until we have it at an eof - while(!feof($localfile)) { + while(!feof($localfile)) { $data = fread($localfile, 512); if(!$data) { error_log("OTHERDOWNLOAD: dollar data went plop"); @@ -436,136 +345,147 @@ class GLCASRepo { } } fclose($localfile); - + if($sgotten >= $fsize) { if($sgotten > $fsize) error_log("OTHERDOWNLOADER: finished but $sgotten, $fsize doesnt make senze"); $upload_finished = true; } // and we're done - + } error_log("OTHERDOWNLOADER: done with"); - + return; - - - - // THIS WAS JUST AWESOME CAUSE IT WORKS - // Next painful bit - } else if ($ranged && !$otherdownloader) { - + + + + // Next painful bit + } else { + // and here too, yay, someone else is doing the + // download, but we're the retards getting a range $sgotten = 0; - - + + $sgatlen = $rangestart+$rangelength; + // the problem is here - error_log("Downloader: going ranged as primary"); + error_log("Downloader: going ranged as other"); clearstatcache(); + $contentlen = file_get_contents($filename.".tmp.data.deleteme.size"); + $contenttype = mime_content_type($filename); header("HTTP/1.1 206 Partial Content"); - header("Content-Length: ".$rangelength); - header("Content-Range: bytes $rangestr/".$contentlen); - header("Content-Type: $contenttype"); - header("Connection: close"); - - // first, get up to $rangestart - while(!feof($remotefile) && ftell($remotefile) < $rangestart) { - if(($rangestart - ftell($remotefile)) < 2048) $rsize = $rangestart; - else $rsize = 2048; - $data = fread($remotefile, $rsize); - if(!$data) { - error_log("dollar data went plop"); - } else { - $sgotten += strlen($data); - flush(); - fwrite($localfile, $data); - } - } + header("Content-Length: $rangelength"); + header("Content-Range: bytes $rangestr/$contentlen"); + $contenttype = "Content-Type: application/x-rpm"; + + error_log("$contenttype"); + header("$contenttype"); - error_log("should now be at rangestart: ".ftell($remotefile)); - // now start pumping out data until $rangelength - $sgatlen = $rangelength + $rangestart; - while(!feof($remotefile) && ftell($remotefile) < $sgatlen ) { + clearstatcache(); - // read only 2048 - $rsize = $sgatlen - ftell($remotefile); - if($rsize > 2048) $rsize = 2048; + error_log("OTHERDOWNLOAD: im another downloader, please work for ranged"); - $data = fread($remotefile, $rsize); - if(!$data) { - error_log("dollar data went plop"); - } else { - echo $data; - $sgotten += strlen($data); - flush(); - fwrite($localfile, $data); - } + + error_log("OTHERDOWNLOAD: im another downloader, please work"); + + // first we wait until the file reaches $rangestart + while(filesize("$filename") < $rangestart) { + sleep(1); } - - // hopefully this works, the redhat/centos installer really is a terrible - // piece of code.. The reasons for this is that redhat in their minds decided - // to use ranges, and even though you send the range to the client, the client - // just keeps listening. and you can ignore the range request, it ignores you. - - error_log("should now be at rangeend: $sgatlen, $rangestart, ".ftell($remotefile)); - flush(); - - // now continue on as per normal - totally gunna work... - while(!feof($remotefile)) { - //error_log("back download"); - $data = fread($remotefile, 2048); - flush(); - fwrite($localfile, $data); + + // then we open the file and ff to rangestart + $localfile = fopen($filename, "r"); + fseek($localfile, $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"); + + + $upload_finished = false; + while(!$upload_finished) { + while($cursize < $sgatlen && $cursize < ($sgotten+2048)) { + clearstatcache(); + error_log("OTHERDOWNLOAD: halt, $cursize, $sgotten, $contentlen"); + // sleep until the the filesize is greater then what we're up to, or until the file is finished + sleep(1); + $cursize = filesize($filename); + } + + error_log("OTHERDOWNLOAD: continue, $sgotten, $contentlen"); + // reopen local file - if it stopped existing, we need to deal with that + $localfile = fopen($filename, "r"); + + // UG, we need to ff, how could i forget that + fseek($localfile, $sgotten+$rangestart); + + if(!$localfile) { + error_log("OTHERDOWNLOAD: something went plop"); + return; + } + + // now loop on the file until we have it at sgatlen + while(!feof($localfile) && $sgotten < $rangelength) { + $left = $rangelength - $sgotten; + if($left > 512) $lenget = 512; + else $lenget = $left; + $data = fread($localfile, $lenget); + if(!$data) { + error_log("OTHERDOWNLOAD: dollar data went plop"); + } else { + $sgotten += strlen($data); + echo $data; + flush(); + } + } + fclose($localfile); + + if($sgotten >= $rangelength) { + if($sgotten > $rangelength) error_log("OTHERDOWNLOADER: finished but $sgotten, $fsize doesnt make senze"); + $upload_finished = true; + } + // and we're done + } - - - rename($filename.".tmp.data.deleteme", $filename); - unlink($filename.".tmp.data.deleteme.size"); - - // and we're done + error_log("OTHERDOWNLOADER: done with"); + return; - - - - - - // and here - } else if ($ranged && $otherdownloader) { - // and here too, yay, someone else is doing the - // download, but we're the retards getting a range - $sgotten = 0; - - - // the problem is here - error_log("Downloader: going ranged as primary"); - clearstatcache(); - header("HTTP/1.1 206 Partial Content"); - header("Content-Length: ".$rangelength); - header("Content-Range: bytes $rangestr/".$contentlen); - header("Content-Type: $contenttype"); - clearstatcache(); - - error_log("OTHERDOWNLOAD: im another downloader, please work for ranged"); - + } - - + + return; } - + + function startDownload($file, $url) + { + + 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 &"; + system($scall); + error_log("started as v, $v, $scall"); + } else { + error_log("cant find download helper... dieing"); + } + } + // this is a nightmare function getRepoForUrlOld($url) { // the way we breakdown a url is to explode it $xurl = split("[/,]", $url); - + // we first check if [0] is a prefix // if now, we check for it being a shorturl (lets just do that for now) $uconf = unserialize($this->config->getConfigVar("repodata")); $repostore = $this->config->getConfigVar("storagelocation"); - + $matched = -1; - + // first we check for /repo/repoid as a url $startat = 0; if($xurl[0] == "repo") { @@ -577,12 +497,12 @@ class GLCASRepo { $startat +=2; } } - - + + $prematch = false; if($matched < 0) foreach($uconf as $key => $var) { $pre = $var["prefix"]; - + if($pre!="") { //echo "Checking pre $pre against ".$xurl[0]."\n"; if(strcasecmp($pre, $xurl[0])==0) { @@ -592,13 +512,13 @@ class GLCASRepo { } } } - - + + if($matched < 0) foreach($uconf as $key => $var) { // if we matched a pre, then we check against the second url component - + $short = $var["shorturl"]; - + if($short!="") { //echo "Checking short $short against ".$xurl[$startat]."\n"; if(strcasecmp($xurl[$startat], $short)==0) { @@ -608,24 +528,24 @@ class GLCASRepo { } } } - + if($matched < 0) { echo "No such repo
"; return; } - - + + // now we find an actual file $file = "/"; if(count($xurl) > $startat) for($i=$startat; $i < count($xurl); $i++) { $file .= "/".$xurl[$i]; } - + // now we want to find repostore/$matched/$file; $actualfile = "$repostore/$matched/$file"; error_log("Atcualfile is $actualfile"); //echo "Start file for $actualfile\n"; - + // first check any directories in $file are in existence $splfile = explode("/", $file); if(count($splfile) > 1) { @@ -636,13 +556,13 @@ class GLCASRepo { if(!is_dir($tomake)) mkdir($tomake); } } - + $reqhead = print_r($_REQUEST, true); $sevhead = print_r($_SERVER, true); - + error_log("req $reqhead"); error_log("sev $sevhead"); - + $rangestart = -1; $rangelength = -1; $rangesstr = ""; @@ -653,10 +573,10 @@ class GLCASRepo { $rangesstr = $rangesb[0]; $ranges = explode("-", $rangesb[0]); $rangestart = $ranges[0]; - $rangelength = $ranges[1] - $ranges[0] +1; + $rangelength = $ranges[1] - $ranges[0] +1; error_log("going ranges at $rangestart, $rangelength,".$rangesa[1].",".$rangesb[0]); } - + // i have to support http_range cause REDHAT/CENTOS IS annoying as all hell. christ, why do this? if(is_file($actualfile)) { // file is stored locally, away we go @@ -680,10 +600,10 @@ class GLCASRepo { } else { $data = fread($localfile, 2048); } - + echo $data; flush(); - + if($rangelength!=-1) { fclose($localfile); exit(0); @@ -698,7 +618,7 @@ class GLCASRepo { // ok, get the file //echo "in getcheck\n"; $remotefile = $uconf[$matched]["url"]."/$file"; - + // TODO: i should get remote contents with fopen/fread/fwrite as // it should be more memory conservative and we can push to the end client // straight away @@ -706,7 +626,7 @@ class GLCASRepo { $rf = fopen($remotefile, "r"); error_log("attempting to get remote file $remotefile"); - + // hopefully this works. if we get a 30x message, it means we tried to get a directory // i cant think of another way of dealing with it - but this is UGLY // also get content length and content type @@ -725,7 +645,7 @@ class GLCASRepo { } // get content type from upstream and print if(preg_match("/^Content-Type:.*/", $val)) { - header($val); + header($val); } } //error_log("repsonse: $http_response_header"); @@ -733,10 +653,10 @@ class GLCASRepo { // return 404 header("HTTP/1.0 404 Not Found"); } else { - $localfile = fopen($actualfile.".tmp.data.deleteme", "w"); + $localfile = fopen($actualfile.".tmp.data.deleteme", "w"); $localsizefile = fopen($actualfile.".tmp.data.deleteme.size", "w"); fwrite($localsizefile, "$clen"); - fclose($localsizefile); + fclose($localsizefile); while(!feof($rf)) { $data = fread($rf, 8192); echo $data; @@ -749,12 +669,12 @@ class GLCASRepo { //error_log("got actualfile, tried to save as $actualfile, did it work?"); } } - + //echo "got ".$file." for $url which is $actualfile\n"; - + //echo ""; } - + function printDir($dir, $localfile, $baseurl) { $localfile = preg_replace("/\/\/+/", "/", $localfile); @@ -768,28 +688,28 @@ class GLCASRepo { if($file != "." && $file != "..") $content .= "$file"; } $content .= ""; - + GLCASpageBuilder(null, null, $content); - + } else return false; } - + function getRepoDetailsYum($url, $ismirrorlist=false) { $actionurl = $url."/repodata/repomd.xml"; - + error_log("Getting for action of $actionurl"); - + $ld = file_get_contents($actionurl); - + // so here we try and get what this repository provides (os, version, arch), for yum this // should come straight off the url... i.e. centos/6.0/os/x86_64/ (centos, 6.0, base os, 64bit arch) - + if(!$ld) return false; - + // ok, now we tokenize the url and try and guess at the content $spurl = explode("/", $url); - + // first, find the OS $kos = getKnownOSList(); $glt["OS"] = "unknown"; @@ -797,7 +717,7 @@ class GLCASRepo { $glt["arch"] = "unknown"; $glt["other"] = "unknown"; foreach($spurl as $comp) { - + // find a name foreach($kos["os"]["short"] as $kosname => $koslong) { //error_log("Comparing $kosname and $koslong with $comp"); @@ -807,13 +727,13 @@ class GLCASRepo { $glt["OS"] = $koslong; } } - + // find a version, we assume its going to be something [numbers] and a . (optional) if(preg_match("/^[0-9.]+$/", $comp)>0) { //error_log("version match of $comp"); $glt["version"] = $comp; } - + // now architecture, this can be either i?86 or x86_64 - can also be arm or otherwise, but lets just go with this for now foreach($kos["arch"] as $archinter => $archname ) { //error_log("Comparing $archinter, $archname with $comp"); @@ -822,23 +742,23 @@ class GLCASRepo { $glt["arch"] = $archname; } } - + // other is a bt harder, we really have to guess at this one if(strcasecmp("os", $comp) == 0) $glt["other"] = "OS"; if(strcasecmp("update", $comp) == 0) $glt["other"] = "Updates"; if(strcasecmp("updates", $comp) == 0) $glt["other"] = "Updates"; if(strcasecmp("everything", $comp) == 0) $glt["other"] = "OS"; } - + return $glt; } - + function deleteRepo($rkey) { $uconf = $this->config->getConfigVar("repodata"); $repostore = $this->config->getConfigVar("storagelocation"); - + if($uconf !== false) { $conf = unserialize($uconf); foreach($conf as $key => $vla) { @@ -853,11 +773,11 @@ class GLCASRepo { } } } - + function addRepo($desc, $os, $version, $arch, $other, $shorturl, $prefix, $repurl, $repotype, $init) { $uconf = $this->config->getConfigVar("repodata"); - + $cs["desc"] = $desc; $cs["os"] = $os; $cs["version"] = $version; @@ -867,8 +787,8 @@ class GLCASRepo { $cs["prefix"] = $prefix; $cs["url"] = $repurl; $cs["repotype"] = $repotype; - - + + $ckey = 0; if($uconf !== false) { $conf = unserialize($uconf); @@ -877,53 +797,53 @@ class GLCASRepo { } $ckey++; } - + $conf[$ckey] = $cs; - + $nconf = serialize($conf); - + error_log("add repo as $ckey"); $this->config->setConfigVar("repodata", $nconf); $this->config->saveConfig(); - + // now create the base structure in the repo $repostore = $this->config->getConfigVar("storagelocation"); - - + + // now call update repo if($init) $this->updateRepoYum($ckey); } - + function updateRepo($repokey) { // we only do yum yet $this->updateRepoYum($repokey); } - + function updateRepoYum($repokey) { $repostore = $this->config->getConfigVar("storagelocation"); - + $repod = $this->getRepo($repokey); - + $repourl = $repod["url"]; - + if(!file_exists("$repostore/$repokey")) { mkdir("$repostore/$repokey"); } - + if(!file_exists("$repostore/$repokey/repodata")) { mkdir("$repostore/$repokey/repodata"); } - + //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); @@ -939,7 +859,7 @@ class GLCASRepo { } } } - + function getRepo($id) { $uconf = $this->config->getConfigVar("repodata"); @@ -947,18 +867,18 @@ class GLCASRepo { $lconf = unserialize($uconf); return $lconf[$id]; } else return false; - + } - + function getRepos() { $uconf = $this->config->getConfigVar("repodata"); if($uconf !== false) { return unserialize($uconf); } else return false; - + } - + private $config; } diff --git a/www/index.php b/www/index.php index 47a19a4..aa5455c 100644 --- a/www/index.php +++ b/www/index.php @@ -38,7 +38,7 @@ if(file_exists($WEB_ROOT_FS."/../var")) { } } -header("Accept-Ranges: none"); +header("Accept-Ranges: bytes"); $glconfig = new GLCASConfig(); $glconfig->loadConfig($configpath); -- 1.7.0.4