X-Git-Url: http://git.pjr.cc/?p=glcas.git;a=blobdiff_plain;f=plugins%2Frepo.php;h=2584f3d7f9957d4d3f04689d6bd14e45572aaed5;hp=a703429125206bc5751fe6bf9d8ecc45ddb5d60b;hb=d180d75c38719089d9ecbb98f6c03a97af0199af;hpb=b0651723ae8487b4791b01cfbdcebf2d76907bed diff --git a/plugins/repo.php b/plugins/repo.php index a703429..2584f3d 100644 --- a/plugins/repo.php +++ b/plugins/repo.php @@ -41,6 +41,31 @@ 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. + * + * + */ + + + // this is a nightmare function getRepoForUrl($url) { // the way we breakdown a url is to explode it @@ -52,9 +77,22 @@ class GLCASRepo { $repostore = $this->config->getConfigVar("storagelocation"); $matched = -1; + + // first we check for /repo/repoid as a url $startat = 0; + if($xurl[0] == "repo") { + $repid = $xurl[1]; + error_log("trying to get repo for repoid, $repid"); + if(isset($uconf[$repid])) { + $matched = ((int)($repid)); + error_log("set matched, $matched, $repid"); + $startat +=2; + } + } + + $prematch = false; - foreach($uconf as $key => $var) { + if($matched < 0) foreach($uconf as $key => $var) { $pre = $var["prefix"]; if($pre!="") { @@ -68,7 +106,7 @@ class GLCASRepo { } - foreach($uconf as $key => $var) { + if($matched < 0) foreach($uconf as $key => $var) { // if we matched a pre, then we check against the second url component $short = $var["shorturl"]; @@ -83,8 +121,9 @@ class GLCASRepo { } } - if($matched > -1) { - //echo "Match on $key\n"; + if($matched < 0) { + echo "No such repo
"; + return; } @@ -96,6 +135,7 @@ class GLCASRepo { // 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 @@ -109,17 +149,57 @@ class GLCASRepo { } } + $reqhead = print_r($_REQUEST, true); + $sevhead = print_r($_SERVER, true); + + error_log("req $reqhead"); + error_log("sev $sevhead"); + + $rangestart = -1; + $rangelength = -1; + $rangesstr = ""; + if(isset($_SERVER["HTTP_RANGE"])) { + // oh shit + $rangesa = explode("=", $_SERVER["HTTP_RANGE"]); + $rangesb = explode(",", $rangesa[1]); + $rangesstr = $rangesb[0]; + $ranges = explode("-", $rangesb[0]); + $rangestart = $ranges[0]; + $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 - header("Content-Length: ".filesize($actualfile)); + if($rangelength != -1) { + header("HTTP/1.1 206 Partial Content"); + header("Content-Length: ".$rangelength); + header("Content-Range: bytes $rangesstr/".filesize($actualfile)); + //header("Content-Length: ".filesize($actualfile)); + } else { + header("Content-Length: ".filesize($actualfile)); + } $type = mime_content_type($actualfile); header("Content-type: $type"); $localfile = fopen($actualfile, "r"); + if($rangestart!=-1) fseek($localfile, $rangestart, SEEK_SET); while(!feof($localfile)) { - $data = fread($localfile, 16384); + // cant make this high cause centos is crap + if($rangelength!=-1) { + $data = fread($localfile, $rangelength); + error_log("data size was ".strlen($data)); + } else { + $data = fread($localfile, 2048); + } + echo $data; flush(); + + if($rangelength!=-1) { + fclose($localfile); + exit(0); + } } fclose($localfile); } else if(is_dir($actualfile)) { @@ -134,6 +214,7 @@ class GLCASRepo { // 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 + ignore_user_abort(true); $rf = fopen($remotefile, "r"); error_log("attempting to get remote file $remotefile"); @@ -151,6 +232,7 @@ class GLCASRepo { } // get content length form upstream and print if(preg_match("/^Content-Length:.*/", $val)) { + $clen = $val; header($val); } // get content type from upstream and print @@ -164,6 +246,9 @@ class GLCASRepo { header("HTTP/1.0 404 Not Found"); } else { $localfile = fopen($actualfile.".tmp.data.deleteme", "w"); + $localsizefile = fopen($actualfile.".tmp.data.deleteme.size", "w"); + fwrite($localsizefile, "$clen"); + fclose($localsizefile); while(!feof($rf)) { $data = fread($rf, 8192); echo $data; @@ -173,7 +258,7 @@ class GLCASRepo { fclose($localfile); fclose($rf); rename($actualfile.".tmp.data.deleteme", $actualfile); - error_log("got actualfile, tried to save as $actualfile, did it work?"); + //error_log("got actualfile, tried to save as $actualfile, did it work?"); } } @@ -184,15 +269,19 @@ class GLCASRepo { function printDir($dir, $localfile, $baseurl) { + $localfile = preg_replace("/\/\/+/", "/", $localfile); $uri = $_SERVER["REQUEST_URI"]; + $content = ""; if(is_dir($dir)) { - echo "Index of $localfile

Index of $localfile

"; - echo ""; + $content .= "Index of $localfile

Index of $localfile

"; + $content .= "
"; $dh = opendir($dir); while(($file = readdir($dh))!==false) { - if($file != "." && $file != "..") echo ""; + if($file != "." && $file != "..") $content .= ""; } - echo "
$file
$file
"; + $content .= ""; + + GLCASpageBuilder(null, null, $content); } else return false; } @@ -233,7 +322,7 @@ class GLCASRepo { // 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"); + //error_log("version match of $comp"); $glt["version"] = $comp; } @@ -241,7 +330,7 @@ class GLCASRepo { foreach($kos["arch"] as $archinter => $archname ) { //error_log("Comparing $archinter, $archname with $comp"); if(strcasecmp($archname, $comp) == 0) { - error_log("arch match of $archname with $comp"); + //error_log("arch match of $archname with $comp"); $glt["arch"] = $archname; } } @@ -339,6 +428,7 @@ class GLCASRepo { 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);