<?php
 if(!isset($_GET['mr']))
  {
    include("tde-head-and-foot.php");
    doHeader("Active TDE Mirrors", "Developlment", "TDE Team");
?>

<p>Please note that this list may change from time to time as mirrors are added and removed.</p>

<table cellpadding="4">
<?php
  }
 else
  {
    header('Content-Type: text/plain');
  }

 $mirrorsJson = file_get_contents("mirrors.json");
 $mirrors = json_decode($mirrorsJson, true);

 $statusType = array(
    "active" => "green",
    "inaccessible" => "red",
    "outdated" => "orange",
    "unknown" => "gray",
 );

 $redis = new Redis();
 $redis->connect('127.0.0.1', 6379, 2);
 $ch = array();
 $cmh = curl_multi_init();
 foreach( $mirrors as $mirrorName => $mirrorInfo )
  {
    $savedResult = $redis->isConnected() ? $redis->get('mirrorStatus-'.$mirrorName) : false;
    if($savedResult)
     {
       $mirrors[$mirrorName]['synctime'] = $savedResult;
     }
    else
     {
       $ch[$mirrorName] = curl_init();
       curl_setopt( $ch[$mirrorName], CURLOPT_URL, $mirrorInfo['url'].'-synctime' );
       curl_setopt( $ch[$mirrorName], CURLOPT_TIMEOUT, 10 );
       curl_setopt( $ch[$mirrorName], CURLOPT_HEADER, true );
       curl_setopt( $ch[$mirrorName], CURLOPT_FOLLOWLOCATION, true );
       curl_setopt( $ch[$mirrorName], CURLOPT_RETURNTRANSFER, true );
       curl_multi_add_handle( $cmh, $ch[$mirrorName] );
     }
  }

 if(!empty($ch))
  {
    $running = null;
    do
     {
       curl_multi_exec($cmh, $running);
     }
    while($running);

    foreach( $ch as $mirrorName => $cs )
     {
       $ret = curl_multi_getcontent( $cs );
       curl_multi_remove_handle( $cmh, $cs );
       if(!empty( $ret ))
        {
          if(!preg_match('#(^|\n)HTTP/1.1 200 OK#', $ret))
           {
             $mirrors[$mirrorName]['synctime'] = '0';
           }
          else
           {
             $mirrors[$mirrorName]['synctime'] = strtotime(preg_replace( "#.*\r\n#", '', $ret));
           }
        }
       else
        {
          $mirrors[$mirrorName]['synctime'] = '-1';
        }
       if($redis->isConnected())
        {
          $redis->setEx( 'mirrorStatus-'.$mirrorName,
                         $mirrors[$mirrorName]['synctime'] > 0 ? 1800 : 300,
                         $mirrors[$mirrorName]['synctime'] );
        }
     }
  }
 curl_multi_close($cmh);
 $redis->close();

 foreach( $mirrors as $mirrorName => $mirrorInfo )
  {
    if( $mirrorInfo['synctime'] < 0 )
     {
       $mirrorStatus = 'inaccessible';
     }
    if( $mirrorInfo['synctime'] == 0 ||
        $mirrors['master']['synctime'] == 0 )
     {
       $mirrorStatus = 'unknown';
     }
    if( $mirrorInfo['synctime'] > 0 )
     {
       $mirrorStatus = ( abs($mirrorInfo['synctime'] -
                             $mirrors['master']['synctime'])
                         > (60*60*30) /* 30 hours */
                         ? 'outdated' : 'active' );
     }
    if(!isset($_GET['mr']))
     {
       if(isset($statusType[$mirrorStatus]))
        {
          $mirrorStatus = ("<font color=\"".$statusType[$mirrorStatus]."\">".
                           $mirrorStatus."</font>");
        }
       echo( "<tr valign=\"top\">\n".
             "<td><b>".$mirrorInfo['descr'].": </b>\n".
             "<br/><a href=\"".$mirrorInfo['url']."\">".$mirrorInfo['url']."</a></td>\n".
             "<td><b>".$mirrorStatus."</b></td>\n".
             "</tr>\n");
      }
     else
      {
        if($mirrorStatus == 'active')
         {
           echo( $mirrorInfo['url']."\n" );
         }
      }
  }

 if(!isset($_GET['mr']))
  {
?>
</table>

<?php
    doFooter();
  }
?>
