blob: 23b60453ed793d11ba0886d81b0c000c4bff1bb2 [file] [log] [blame]
<?php
/*******************************************************************************
* Copyright (c) 2006-2015 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Denis Roy (Eclipse Foundation) - initial API and implementation
*******************************************************************************/
require_once("/home/data/httpd/eclipse-php-classes/system/dbconnection.class.php"); # Read-only slave
require_once(realpath(dirname(__FILE__) . "/../../system/app.class.php"));
class Mirror {
# this class will eventually contain mirror information
var $mirror_id = 0; #PK
var $organization = "";
var $ccode = "";
var $r30 = 0;
var $update_ip_allow = "";
var $email = "";
var $is_internal = 0;
var $is_advertise = 0;
var $date_enabled = "";
var $create_status = "";
var $contact = "";
var $internal_host_pattern = "";
var $last_verified = "";
public $exclude_string = "*.nfs* apitools/ apidocs/ archive/ archives/ /athena builds/N* */doc/* */documentation/* drops*/I* drops*/N* drops/M* *.jpg *.gif callisto/* compilelogs/ eclipse.org-common/ eclipse/testUpdates* eclipse/updates/3.2milestones /eclipse/updates/3.6-I-builds/ dev/TPTP* /tools/cdt/builds modeling/gmf/downloads/drops/B* *drops*/*/N* *drops*/*/I* *javadoc/ *javadocs/ linuxtools/N* *nightly* *Nightly* *staging* /webtools/downloads/drops/*/M* performance/ /releases/staging /releases/europa testresults/ /rt/eclipselink/nightly* /technology/cosmos /technology/ohf /technology/tigerstripe testcompilelogs/ testResults/ /tools/downloads /tools/orbit/committers */N201* */I201* */I.I201* */I-* */N-* *integration*/ xref/ */M20* /rt/eclipselink/maven.repo* */scripts* */logs* *drops4/X* *drops4/Y* *eclipse/updates/*-X* *eclipse/updates/*-Y* *.php*.* staging/* releases/staging/*";
function getMirrorID() {
return $this->mirror_id;
}
function getOrganization() {
return $this->organization;
}
function getCCode() {
return $this->ccode;
}
function getR30() {
return $this->r30;
}
function getUpdateIPAllow() {
return $this->update_ip_allow;
}
function getEMail() {
return $this->email;
}
function getIsInternal() {
return $this->is_internal;
}
function getIsAdvertise() {
return $this->is_advertise;
}
function getDateEnabled() {
return $this->date_enabled;
}
function getCreateStatus() {
return $this->CreateStatus;
}
function getContact() {
return $this->Contact;
}
function getInternalHostPattern() {
return $this->internal_host_pattern;
}
function getLastVerified() {
return $this->last_verified;
}
function setMirrorID($_mirror_id) {
$this->mirror_id = $_mirror_id;
}
function setOrganization($_organization) {
$this->organization = $_organization;
}
function setCCode($_ccode) {
$this->ccode = $_ccode;
}
function setR30($_r30) {
$this->r30 = $_r30;
}
function setUpdateIPAllow($_update_ip_allow) {
$this->update_ip_allow = $_update_ip_allow;
}
function setEMail($_email) {
$this->email = $_email;
}
function setIsInternal($_is_internal) {
$this->is_internal = $_is_internal;
}
function setIsAdvertise($_is_advertise) {
$this->is_advertise = $_is_advertise;
}
function setDateEnabled($_date_enabled) {
$this->date_enabled = $_date_enabled;
}
function setCreateStatus($_create_status) {
$this->CreateStatus = $_create_status;
}
function setContact($_contact) {
$this->Contact = $_contact;
}
function setInternalHostPattern($_internal_host_pattern) {
$this->internal_host_pattern = $_internal_host_pattern;
}
function setLastVerified($_last_verified) {
$this->last_verified = $_last_verified;
}
function selectCountryCodeByIP($_IP) {
$App = new App();
$rValue = "xx"; # no ccode info for this IP
if($_IP != "") {
$ipnum = sprintf("%u", ip2long($_IP));
$dbc = new DBConnection(); # Read-only, to slave!
$dbh = $dbc->connect();
$sql = "SELECT ccode FROM geoip WHERE $ipnum BETWEEN start AND end";
$result = mysql_query($sql, $dbh);
if($myrow = mysql_fetch_array($result)) {
$rValue = $myrow['ccode'];
}
$dbc->disconnect();
$dbh = null;
$dbc = null;
$result = null;
$myrow = null;
}
return $rValue;
}
/** @author droy
* @since version - Apr 16,2007
* @param String _IP IP address to examine
* @return Boolean IP is a valid public IP
*
*/
function isValidPublicIP($_IP) {
if(!preg_match('/^\d+\.\d+\.\d+\.\d+/', $_IP)) {
return false;
}
if (substr_count($_IP, '.') > 3) {
return false;
}
if (strpos($_IP, '.') == 0 || strrpos($_IP, '.') == (strlen($_IP)-1)) {
return false;
}
$parts = explode('.', $_IP);
foreach ($parts as $part) {
if ($part > 255) {
return false;
}
}
switch($parts[0]) {
case 0: return false; break;
case 10: return false; break;
case 127: return false; break;
case 172:
if($parts[1] >= 16 && $parts[1] <= 32) {
return false;
}
break;
case 192:
if($parts[1] == 168) {
return false;
}
break;
}
if($parts[0] > 223) {
return false;
}
return true;
}
/**
* Returns true if user-agent appears to be a machine
* @author Denis Roy
* @see download.eclipse.org/errors/404.php
* @since 2014-11-18
* @return boolean
*
*/
function isMachineBrowser() {
$browser = $_SERVER['HTTP_USER_AGENT'];
$rValue = false;
if(strpos($browser, "Jakarta") !== FALSE
|| strpos($browser, "Java/") !== FALSE
|| strpos($browser, "Slurp") !== FALSE
|| stripos($browser, "bot") !== FALSE
|| strpos($browser, "bing") !== FALSE
|| stripos($browser, "Googlebot/") !== FALSE
|| stripos($browser, "apacheHttpClient") !== FALSE
|| stripos($browser, "Apache-HttpClient/") !== FALSE
|| stripos($browser, "spider") !== FALSE
|| strpos($browser, "Apache-Maven/") !== FALSE
|| strpos($browser, "Apache Ivy/") !== FALSE
|| strpos($browser, "Apache Archiva/") !== FALSE
|| strpos($browser, "Artifactory/") !== FALSE
|| strpos($browser, "Aether") !== FALSE
|| strpos($browser, "m2e/") !== FALSE
|| strpos($browser, "Debian APT/") !== FALSE
|| strpos($browser, "developer fusion") !== FALSE
|| strpos($browser, "netBeans") !== FALSE ) {
$rValue = true;
}
return $rValue;
}
function isExcluded($filename) {
$exclude_array = explode(" ", $this->exclude_string);
for($i = 0; $i < count($exclude_array); $i++) {
# replace dot with \. since rsync considers it a dot
$exclude_array[$i] = str_replace(".", "\.", $exclude_array[$i]);
# replace leading and ending *
$exclude_array[$i] = preg_replace('(^\*|\*$)', "", $exclude_array[$i]);
$exclude_array[$i] = str_replace("*", ".*", $exclude_array[$i]);
if(preg_match("#" . $exclude_array[$i] . "#", $filename)) {
return true;
break;
}
}
return false;
}
/**
* Run Stats query, return results as JSON
* @param string $filename
* @param string $view_date
* @param string $view
* @param string $group
* @param string $datefrom
* @param string $dateto
* @return string JSON string
* @since 2015-06-19
* @author droy
*/
function getStatsJSON($filename=null, $view_date=null, $view=null, $group=null, $datefrom=null, $dateto=null) {
$App = new App();
$dateQuery = false;
if($view == "") {
$view = "sum";
}
$WHERE = "";
$GROUPBY = "";
$FILESPEC = "IDX.file_name";
if($view_date == "today") {
$WHERE = $App->addAndIfNotNull($WHERE);
$WHERE .= " LEFT(DOW.download_date,10) = CURDATE()";
$dateQuery = true;
}
if($view_date == "yesterday") {
$WHERE = $App->addAndIfNotNull($WHERE);
$WHERE .= " LEFT(DOW.download_date,10) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)";
$dateQuery = true;
}
if($view_date == "L7") {
$WHERE = $App->addAndIfNotNull($WHERE);
$WHERE .= " DOW.download_date > DATE_SUB(CURDATE(), INTERVAL 8 day)";
$dateQuery = true;
}
if($view_date == "L30") {
$WHERE = $App->addAndIfNotNull($WHERE);
$WHERE .= " DOW.download_date > DATE_SUB(CURDATE(), INTERVAL 31 day)";
$dateQuery = true;
}
if($datefrom != "" && $dateto != "") {
$WHERE = $App->addAndIfNotNull($WHERE);
$WHERE .= " DOW.download_date >= '$datefrom' AND DOW.download_date < '$dateto 23:59:59'";
$dateQuery = true;
}
if($datefrom != "" && $dateto == "") {
$WHERE = $App->addAndIfNotNull($WHERE);
$WHERE .= " DOW.download_date >= '$datefrom'";
$dateQuery = true;
}
if($datefrom == "" && $dateto != "") {
$WHERE = $App->addAndIfNotNull($WHERE);
$WHERE .= "DOW.download_date <= '$dateto 23:59:59'";
$dateQuery = true;
}
if($group != 1) {
$GROUPBY = " IDX.file_name";
}
else {
$FILESPEC =" \"File Group\" AS file_name";
}
if($view == "daily") {
if($GROUPBY != "") {
$GROUPBY .= ",";
}
$GROUPBY .= " LEFT(DOW.download_date,10)";
}
if($view == "ccode") {
if($GROUPBY != "") {
$GROUPBY .= ",";
}
$GROUPBY .= " DOW.ccode";
}
# Connect to database
$dbc = new DBConnection();
$now = $this->microtime_float();
$dbh = $dbc->connect();
# fetch oldest stat and total records
$sql_info = "SELECT LEFT(MIN(download_date),10) as OldestDate, MAX(download_date) AS NewestDate, COUNT(*) AS RecordCount FROM downloads";
$rs_info = mysql_query($sql_info, $dbh);
$myrow_info = mysql_fetch_assoc($rs_info);
$intTotalStats = number_format($myrow_info['RecordCount']);
$sinceDate = $myrow_info['OldestDate'];
$toDate = $myrow_info['NewestDate'];
# Fetch the ID's if it's a date-based query
$aFileID = array();
$file_id_csv = "";
if($filename != "") {
$fileCount = 0;
$sql = "SELECT IDX.file_id FROM download_file_index AS IDX WHERE IDX.file_name LIKE " . $App->returnQuotedString("%" . $filename . "%");
$rs = mysql_query($sql, $dbh);
while($myrow = mysql_fetch_assoc($rs)) {
array_push($aFileID, $myrow['file_id']);
$fileCount++;
}
$file_id_csv = implode(",", $aFileID);
if(($fileCount > 5000 && $dateQuery) || ($fileCount > 10000 && !$dateQuery)) {
die ("Your search includes too many files ($fileCount). Please refine your search.");
}
}
if($filename != "" && !$dateQuery) {
$WHERE = $App->addAndIfNotNull($WHERE);
$WHERE .= " IDX.file_name LIKE " . $App->returnQuotedString("%" . $filename . "%");
}
if($dateQuery) {
$WHERE = $App->addAndIfNotNull($WHERE);
$WHERE .= " IDX.file_id IN ($file_id_csv)";
}
if($WHERE != "") {
$WHERE = " WHERE " . $WHERE;
}
if($GROUPBY != "") {
$GROUPBY = " GROUP BY " . $GROUPBY;
}
/*
* End: Build query filter criteria
*/
/*
* Choose the appropriate query, based on the view
*
*/
if($view == "sum") {
if(!$dateQuery) {
# simplified query based on the download_file_index only
if($group == 1) {
$sql = "SELECT $FILESPEC, SUM(download_count) AS file_count FROM download_file_index AS IDX " . $WHERE;
}
else {
$sql = "SELECT $FILESPEC, download_count AS file_count FROM download_file_index AS IDX " . $WHERE . $GROUPBY . " ORDER BY file_count DESC";
}
}
else {
$sql = "SELECT $FILESPEC, COUNT(DOW.file_id) AS file_count FROM download_file_index AS IDX LEFT JOIN downloads AS DOW ON DOW.file_id = IDX.file_id"
. $WHERE . $GROUPBY . " ORDER BY file_count DESC";
}
}
if($view == "daily" ) {
$sql = "SELECT $FILESPEC, LEFT(DOW.download_date,10) AS download_date, COUNT(DOW.file_id) AS file_count FROM download_file_index AS IDX
LEFT JOIN downloads AS DOW ON DOW.file_id = IDX.file_id " . $WHERE . $GROUPBY . "ORDER BY IDX.file_name, DOW.download_date DESC";
# $inc_file = "inc/en_stats_daily.php";
}
if($view == "ccode") {
$ORDERBY = " ORDER BY IDX.file_name, file_count DESC";
if($group == 1) {
$ORDERBY = " ORDER BY file_count DESC";
}
$sql = "SELECT $FILESPEC, DOW.ccode, COU.en_description AS CountryDescription, COUNT(DOW.file_id) AS file_count FROM download_file_index AS IDX LEFT JOIN downloads AS DOW ON DOW.file_id = IDX.file_id
LEFT JOIN SYS_countries AS COU ON COU.ccode = DOW.ccode " . $WHERE . $GROUPBY . $ORDERBY;
# $inc_file = "inc/en_stats_ccode.php";
}
# Bypass query if no filename specified
if($filename == "") {
$sql = "SELECT 'Please specify a file' AS file_name, '' AS file_count";
}
$rs = mysql_query($sql, $dbh);
$querytime = $this->microtime_float() - $now;
# build JSON payload
$rValue = new stdClass();
$rValue->totalStats = $intTotalStats;
$rValue->sinceDate = $sinceDate;
$rValue->toDate = $toDate;
$rValue->queryTime = $querytime;
$rows = array();
while($r = mysql_fetch_assoc($rs)) {
$rows[] = $r;
}
$rValue->rows = $rows;
# Free up some memory from the hoggers
unset($rows, $rs, $rs_info, $aFileID);
$dbc->disconnect();
return json_encode($rValue);
}
function microtime_float() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
}
?>