X-Git-Url: http://git.pjr.cc/?p=glcas.git;a=blobdiff_plain;f=plugins%2Frepo.php;fp=plugins%2Frepo.php;h=9d1de84d177dfa49ff1923ad184391ca336b30b3;hp=ee1f141b51d6e38489ce0adc7fbe0aecdf75f1fc;hb=ce6eddc1cf6b4a879b9239fec18258b99f3d739a;hpb=7f8d6f9924ba50980a594b89747c1763552a2bed diff --git a/plugins/repo.php b/plugins/repo.php index ee1f141..9d1de84 100644 --- a/plugins/repo.php +++ b/plugins/repo.php @@ -36,7 +36,10 @@ class GLCASRepo { } if(!isset($repo["repotype"])) { - echo "Repo type not set for repo
"; + echo "Repo type not set for repo, setting to yum
"; + $uconf[$rkey]["repotype"] = "YUM"; + $this->config->setConfigVar("repodata", serialize($uconf)); + $this->config->saveConfig(); } else if($repo["repotype"] == "YUM") { if(file_exists("$repostore/$rkey/repodata/repoupdate.lock")) { echo " - Repo locked for update
"; @@ -55,7 +58,12 @@ class GLCASRepo { echo " - not updating repo
"; } } else if($repo["repotype"] == "APT") { - echo "I have no idea how to spawn an update of an APT repo - apt is crap
"; + if(file_exists("$repostore/$rkey/update.lock")) { + echo " - Repo locaked for update
"; + } + echo " - Expire time is ".$repo["expiretime"]." days, checking repo
"; + $maxtdiff = $repo["expiretime"] * 24 * 3600; + $this->updateRepo($rkey); } } } @@ -169,6 +177,7 @@ class GLCASRepo { header("HTTP/1.0 404 Not Found"); return; } + // something was matched, so now we reconstruct the file component of the url @@ -180,7 +189,20 @@ class GLCASRepo { // so, the ultimate url for the file we need is: $actualfile = "$repostore/$matched/$file"; error_log("Atcualfile is $actualfile"); - + + // now check for a block in that repo + if(isset($uconf[$matched]["blocklist"])) { + foreach($uconf[$matched]["blocklist"] as $blockers) { + $rfile = ltrim($file, "/"); + error_log("checking $blockers against $rfile"); + if(preg_match("/$blockers/", $rfile) > 0) { + error_log("should block"); + header("HTTP/1.0 404 Not Found"); + return; + } + } + } + // if its a directory, lets do a print if(is_dir($actualfile)) { $this->printDir($actualfile, $file, $url); @@ -541,206 +563,7 @@ class GLCASRepo { } // 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") { - $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; - 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) { - //echo "Matched pre\n"; - $prematch = true; - $startat++; - } - } - } - - - 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) { - //echo "Matched\n"; - $matched = $key; - $startat++; - } - } - } - - 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) { - $tomake = "$repostore/$matched/"; - for($i = 0; $i < count($splfile)-1; $i++) { - $tomake .= "/".$splfile[$i]; - //error_log("making directory $tomake"); - 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 = ""; - 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 - 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)) { - // 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)) { - //echo "in dir for $actualfile\n"; - // here we print the contents of the directory - $this->printDir($actualfile, $file, $url); - } else { - // 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 - ignore_user_abort(true); - $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 - $clen = 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($actualfile); - header("Location: ".$_SERVER["REQUEST_URI"]."/"); - return; - } - // get content length form upstream and print - if(preg_match("/^Content-Length:.*/", $val)) { - $clen = $val; - header($val); - } - // get content type from upstream and print - if(preg_match("/^Content-Type:.*/", $val)) { - header($val); - } - } - //error_log("repsonse: $http_response_header"); - if(!$rf) { - // return 404 - 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; - fwrite($localfile, $data); - flush(); - } - fclose($localfile); - fclose($rf); - rename($actualfile.".tmp.data.deleteme", $actualfile); - //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) { @@ -906,7 +729,7 @@ class GLCASRepo { } } - function addRepo($desc, $os, $version, $arch, $other, $shorturl, $prefix, $repurl, $repotype, $init, $expiretime) + function addRepo($desc, $os, $version, $arch, $other, $shorturl, $prefix, $repurl, $repotype, $init, $expiretime, $blocklist=null) { $uconf = $this->config->getConfigVar("repodata"); @@ -920,6 +743,9 @@ class GLCASRepo { $cs["url"] = $repurl; $cs["repotype"] = $repotype; $cs["expiretime"] = $expiretime; + if($blocklist != null) { + $cs["blocklist"] = $blocklist; + } $ckey = 0; @@ -950,7 +776,34 @@ class GLCASRepo { function updateRepo($repokey) { // we only do yum yet - $this->updateRepoYum($repokey); + $repod = $this->getRepo($repokey); + + error_log("in update repo"); + + if($repod["repotype"] == "YUM") $this->updateRepoYum($repokey); + if($repod["repotype"] == "APT") $this->updateRepoApt($repokey); + } + + function updateRepoApt($repokey) + { + $repostore = $this->config->getConfigVar("storagelocation"); + + $repod = $this->getRepo($repokey); + + $repourl = $repod["url"]; + + if(!file_exists("$repostore/$repokey")) { + mkdir("$repostore/$repokey"); + } + + error_log("background apt 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/updateaptrepo.php '$repourl' '$repostore/$repokey/' > /tmp/updateaptrepo.$repokey.log 2>&1 &"; + system($scall); + } else { + error_log("cant find download apt helper... dieing"); + } } function updateRepoYum($repokey)