<?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
*******************************************************************************/

# This is intended to run on Eclipse servers from a command-line (or cron) facility
# to gather mirror performance and accuracy trends

# If launched from httpd we will return our list of URLs so others can gather mirror
# trend info

  require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection_rw.class.php";

  # If launched from the cli, we're expecting "downloads.git" and "eclipse.org-common.git"
  # to be checked out at the same level
  if(php_sapi_name() == "cli") {
    $_SERVER['DOCUMENT_ROOT'] = "../";
    $_SERVER['SERVER_NAME'] = "cli";  # satisfy app.class
  }
  else {
    header("Content-type: text/plain");
  }
  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/mirrors/mirror.class.php");

  # Connect to database
  $dbc = new DBConnectionRW();
  $dbh = $dbc->connect();

  $app = new App();

  $timeout = 30;  # seconds to wait for each fopen

  $mirror = new Mirror();

  # Load up file index
  # We only need one file, but we'll fetch 100 and exit as soon as one is found
  # on disk
  $drop_list = array();
  $sql = "SELECT file_name, IF(size_disk_bytes BETWEEN 2000000 AND 5000000, 1, 0) AS ideal_size, IF(size_disk_bytes BETWEEN 250000 AND 10000000, 1, 0) AS almost_ideal_size, size_disk_bytes
        FROM download_file_index WHERE timestamp_disk > 0 order by ideal_size*RAND() desc, almost_ideal_size*RAND() desc, size_disk_bytes asc limit 100";
  $rs_idx = mysql_query($sql, $dbh);
  while($myrow_idx = mysql_fetch_assoc($rs_idx)) {
    $drop_list['EclipseFull']['filename'] = $myrow_idx['file_name'];
    $drop_list['EclipseFull']['size_disk_bytes'] = $myrow_idx['size_disk_bytes'];

    if(file_exists($app->getDownloadBasePath() . $myrow_idx['file_name']) && !$mirror->isExcluded($myrow_idx['file_name'])) {
      break;
    }
  }


  # instead of inserting trend records as we go along, we will put the sql queries into an array
  # that way, if all of the fetched files fail, the problem is not the mirrors, it's the file
  $sql_array = array();
  $total_trends = 0;
  $total_errors = 0;


  # Go through mirrors
  $sql = "SELECT DISTINCT MIR.mirror_id, MRP.base_path, DRP.our_path 
          FROM mirrors AS MIR INNER JOIN mirror_protocols AS MRP on MRP.mirror_id = MIR.mirror_id
          INNER JOIN (SELECT mirror_id, protocol, drop_id from mirror_drops group by mirror_id, protocol) MRD ON MRD.mirror_id = MIR.mirror_id 
          INNER JOIN drops AS DRP ON DRP.drop_id = MRD.drop_id AND MRD.drop_id = 'EclipseFull'
          WHERE MIR.is_internal <> 1 AND MIR.is_advertise = 1 AND MRP.protocol = 'http' AND MIR.create_status IN('active', 'wait') ORDER BY mirror_id";
  $rs = mysql_query($sql, $dbh);

  while($myrow = mysql_fetch_assoc($rs)) {
    $mirror_url = $myrow['base_path'] . $drop_list['EclipseFull']['filename'];

    if(php_sapi_name() != "cli") {
      echo $mirror_url . "\n";
    }
    else {
      echo "Processing mirror: " . $myrow['mirror_id'] . " " . $mirror_url . "\n";

      $curl_info = getCurl($mirror_url);

      if(!is_int($curl_info)) {
        echo "Result: Code [" . $curl_info['http_code'] . "]  Speed: [" . $curl_info['speed_download'] . "] Downloaded: [" . $curl_info['size_download'] . "]  Expected: [" . $drop_list['EclipseFull']['size_disk_bytes'] . "]\n";
        $download_speed = $curl_info['speed_download'] / 1024;
        if($curl_info['size_download'] < $drop_list['EclipseFull']['size_disk_bytes']) {
          $download_speed = 0;
          $curl_info['http_code'] = "999";
        }
        $sql = "INSERT INTO mirror_trends (trend_id, mirror_id, sample_date, http_status_code, download_speed_kbps, fetched_url, fetched_size_bytes) 
                VALUES (NULL, " . $myrow['mirror_id'] . ", NOW(), " . $curl_info['http_code'] . ", " . $curl_info['speed_download'] / 1024 . ", '$mirror_url', " . $curl_info['size_download'] . ")";
      }
      else {
        $sql = "INSERT INTO mirror_trends (trend_id, mirror_id, sample_date, http_status_code, download_speed_kbps) 
                VALUES (NULL, " . $myrow['mirror_id'] . ", NOW(), " . $curl_info . ", 0)";
        $total_errors++;
      }
      echo $sql . "\n";
      array_push($sql_array, $sql);
      $total_trends++;

      # Examine all the trends for this mirror
      # mark as dropped if they have 0% success overall
      $sql = "SELECT SUM(IF(http_status_code BETWEEN 200 AND 299, 1, 0)) / COUNT(trend_id) * 100 AS success_rate FROM mirror_trends where mirror_id = " . $myrow['mirror_id'];
      $rs_trd = mysql_query($sql, $dbh);
      if($myrow_trd = mysql_fetch_assoc($rs_trd)) {
        echo "Overall success rate for this mirror: " . $myrow_trd['success_rate'] . "\n";
        if($myrow_trd['success_rate'] == 0) {
          echo "Dropping mirror " . $myrow['mirror_id'] . "\n";
          mysql_query("UPDATE mirrors SET create_status = 'dropped' WHERE mirror_id = " . $myrow['mirror_id'], $dbh);
        }
      }

      # mark as wait if they have 0% success in the last 12 hours
      # or mark back to active if 100%
      # HAVING clause to prevent bug 474570
      $sql = "SELECT /*mir_trend:118 */ SUM(IF(http_status_code BETWEEN 200 AND 299, 1, 0)) / COUNT(trend_id) * 100 AS success_rate 
              FROM mirror_trends where mirror_id = " . $myrow['mirror_id']
                 . " AND sample_date > date_sub(now(), interval 12 hour) HAVING success_rate IS NOT NULL";
      $rs_trd = mysql_query($sql, $dbh);
      if($myrow_trd = mysql_fetch_assoc($rs_trd)) {
        echo "Last 12h success rate for this mirror: " . $myrow_trd['success_rate'] . "\n";
        if($myrow_trd['success_rate'] == 0) {
          echo "Supending (wait) mirror " . $myrow['mirror_id'] . "\n";
          mysql_query("UPDATE mirrors SET create_status = 'wait' WHERE mirror_id = " . $myrow['mirror_id'], $dbh);
        }
        elseif ($myrow_trd['success_rate'] == 100) {
          echo "Unsupending (active) mirror " . $myrow['mirror_id'] . " if needed.\n";
          mysql_query("UPDATE mirrors SET create_status = 'active' WHERE mirror_id = " . $myrow['mirror_id'] . " AND create_status = 'wait'", $dbh);
        }
      }
    }
  }

  # Insert trends if we have good success rate
  if($total_trends > 0) {
    $error_rate = $total_errors/$total_trends * 100;
    if($error_rate < 20) {
      echo "Adding trends to the database\n";
      foreach ($sql_array as $sql) {
        mysql_query($sql, $dbh);
      }

      # maintenance
      $sql = "DELETE FROM mirror_trends where sample_date < DATE_SUB(NOW(), INTERVAL 1 MONTH)";
      mysql_query($sql, $dbh);
    }
  }

  $dbc->disconnect();
  $rs = null;
  $dbh = null;
  $dbc = null;

  function getCurl($URL) {
    global $timeout;

    $rValue = false;

    $ch = curl_init($URL);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT,$timeout);
    curl_setopt($ch, CURLOPT_TIMEOUT,$timeout);

    curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 50*1024);
    curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, 10);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);


    // Execute
    curl_exec($ch);

    // Check if any error occurred
    if(!curl_errno($ch)) {
      $info = curl_getinfo($ch);
      $rValue = $info;
    }
    else {
      $rValue = curl_errno($ch);
    }

    // Close handle
    curl_close($ch);
    return $rValue;
  }

?>