#!/usr/bin/php -q
<?php

// Changeable variables
$Debug=0;
$Timeout=10;
// --------------------

$Continue=1;
$Agent="Mozilla/5.0 (X11; U; Linux i686; cs; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7";
$Status=0;
$InludePerf=1;
$Msg='';
$ShowPage=0;

$ch = curl_init();  
$Pocet=count($argv);
if ($Pocet>1){
  for ($i=1;$i<$Pocet;$i++){
    switch ($argv[$i]){
      case '-U':    
        if ($Pocet>$i+1){
          curl_setopt($ch, CURLOPT_URL, $argv[++$i]);
          if ($Debug)echo "\nDEBUG: -U ".$argv[$i];
        }else{
          echo "ERROR in parsing argument -U: missing value";
          Manual();
          exit(2);
        }
        break;

      case '-A':    
        if ($Pocet>$i+1){
          $Agent=$argv[++$i];
          if ($Debug)echo "\nDEBUG: -A ".$argv[$i];
        }else{
          echo "ERROR in parsing argument -A: missing value";
          Manual();
          exit(2);
        }
        break;

      case '-T':    
        if ($Pocet>$i+1){
          $Timeout=$argv[++$i];
          if ($Debug)echo "\nDEBUG: -T ".$argv[$i];
        }else{
          echo "ERROR in parsing argument -T: missing value";
          Manual();
          exit(2);
        }
        break;

      case '-G':    
        if ($Pocet>$i+1){
          $Grep=$argv[++$i];
          if ($Debug)echo "\nDEBUG: -G ".$argv[$i];
        }else{
          echo "ERROR in parsing argument -G: missing value";
          Manual();
          exit(2);
        }
        break;

      case '-L':    
        $ShowPage=1;
        if ($Debug)echo "\nDEBUG: -L";
        break;

      case '-F':    
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        if ($Debug)echo "\nDEBUG: -F";
        break;

      case '-X':    
        $InludePerf=0;
        if ($Debug)echo "\nDEBUG: -X";
        break;

      case '-I':    
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,  0);
        if ($Debug)echo "\nDEBUG: -I";
        break;

      case '-Tc':    
        if ($Pocet>$i+1){
          $Tc=$argv[++$i];
          if ($Debug)echo "\nDEBUG: -Tc ".$argv[$i];
        }else{
          echo "ERROR in parsing argument -Tc: missing value";
          Manual();
          exit(2);
        }
        break;

      case '-Tw':    
        if ($Pocet>$i+1){
          $Tw=$argv[++$i];
          if ($Debug)echo "\nDEBUG: -Tw ".$argv[$i];
        }else{
          echo "ERROR in parsing argument -Tw: missing value";
          Manual();
          exit(2);
        }
        break;

      case '-Sbc':    
        if ($Pocet>$i+1){
          $Sbc=$argv[++$i];
          if ($Debug)echo "\nDEBUG: -Sbc ".$argv[$i];
        }else{
          echo "ERROR in parsing argument -Sbc: missing value";
          Manual();
          exit(2);
        }
        break;

      case '-Sbw':    
        if ($Pocet>$i+1){
          $Sbw=$argv[++$i];
          if ($Debug)echo "\nDEBUG: -Sbw ".$argv[$i];
        }else{
          echo "ERROR in parsing argument -Sbw: missing value";
          Manual();
          exit(2);
        }
        break;

      case '-Soc':    
        if ($Pocet>$i+1){
          $Soc=$argv[++$i];
          if ($Debug)echo "\nDEBUG: -Soc ".$argv[$i];
        }else{
          echo "ERROR in parsing argument -Soc: missing value";
          Manual();
          exit(2);
        }
        break;

      case '-Sow':    
        if ($Pocet>$i+1){
          $Sow=$argv[++$i];
          if ($Debug)echo "\nDEBUG: -Sow ".$argv[$i];
        }else{
          echo "ERROR in parsing argument -Sow: missing value";
          Manual();
          exit(2);
        }
        break;

      case '-S':    
        if ($Pocet>$i+2){
          $String1=$argv[++$i];
          $String2=$argv[++$i];
          if ($Debug)echo "\nDEBUG: -S ".$String1.' '.$String2;
        }else{
          echo "ERROR in parsing argument -S: missing values";
          Manual();
          exit(2);
        }
        break;
		
	  case '-O':    
        $UseOutput=1;
        if ($Debug)echo "\nDEBUG: -O";
        break;

      case '--help':
      case '-h':
        Manual();
        exit(2);
        break; 

      default:
        echo "ERROR in argument parsing: ".$argv[$i];
        Manual();
        exit(2);
        break;
    }
  }
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_USERAGENT, $Agent );
  curl_setopt($ch, CURLOPT_TIMEOUT, $Timeout);  

  if (isset($Tc) and isset($Tw) and  ($Tw >= $Tc) ){
    echo "ERROR in arguments Tw ($Tw) >= Tc ($Tc) !!!";
    Manual();
    exit(2);
  } 
  if (isset($Sbc) and isset($Sbw) and  ($Sbw >= $Sbc) ){
    echo "ERROR in arguments Sbw ($Sbw) >= Sbc ($Sbc) !!!";
    Manual();
    exit(2);
  } 
  if (isset($Soc) and isset($Sow) and  ($Sow >= $Soc) ){
    echo "ERROR in arguments Sbw ($Sow) >= Sbc ($Soc) !!!";
    Manual();
    exit(2);
  } 

  // EXEC    
  $time_start = getmicrotime();
  $Buff=@curl_exec($ch);
  $Time = round(getmicrotime() - $time_start,3);
  $Size=strlen($Buff);
  $errnum=curl_errno($ch);
  if ($errnum){
    if ($errnum==28){
      echo 'Timeout '.$Timeout.'sec exceeded.';
      exit(2);
    }else{
      echo "ERROR in opening page! Err:".curl_error($ch);
      exit(2);
    }
  }
  @curl_close($ch);
  
  if (isset($Sbc) and ($Size > $Sbc)){
    $Status=2;
    $Msg.='Size '.$Size.'B below limit '.$Sbc.'B';
  }elseif (isset($Sbw) and ($Size > $Sbw)){
    $Status=1;
    $Msg.='Size '.$Size.'B below limit '.$Sbw.'B';
  }

  if (isset($Soc) and ($Size < $Soc)){
    $Status=2;
    $Msg.='Size '.$Size.'B over limit '.$Soc.'B';
  }elseif (isset($Sow) and ($Size < $Sow)){
    $Status=1;
    $Msg.='Size '.$Size.'B over limit '.$Sow.'B';
  }

  if (isset($Tc) and ($Time > $Tc)){
    $Status=2;
    $Msg.='Download time '.$Time.'sec exceeded time limit '.$Tc.'sec';
  }elseif (isset($Tw) and ($Time > $Tw)){
    $Status=1;
    $Msg.='Download time '.$Time.'sec exceeded time limit '.$Tw.'sec';
  }

  if (isset($Grep)){
    if (!strstr($Buff,$Grep)){
      $Status=2;
      $Msg.='String '.$Grep.' not found!';
    }
  }

  if (isset($String1) or isset($String2)){
    if (isset($String1) and isset($String2)){
      echo "\n".$String1."\n".$String2."\n";
      $First=strpos($Buff,$String1);
      if ($First){
        $Last=strpos($Buff,$String2,($First+strlen($String1)));
        if ($Last){
          echo $First.'-'.$Last.' - '.substr($Buff,($First+strlen($String1)),($Last-$First-strlen($String1)) );
        }else{
          echo "ERROR in arguments -S. Second string ".$String2.' not found!!!';
          Manual();
          exit(2);
        }
      }else{
        echo "ERROR in arguments -S. First string ".$String1.' not found!!!';
        Manual();
        exit(2);
      }
    }else{
      echo "ERROR in arguments -S. Must be two strings! Before and after.";
      Manual();
      exit(2);
    }
  }

  if (isset($UseOutput)){
  	$StatusHeader = "Status:";
	$StatusSeperator = "-";
	$First=strpos($Buff,$StatusHeader);
	$Last=strpos($Buff,$StatusSeperator,($First+strlen($StatusHeader)));
	$OutputStatus = trim(substr($Buff,($First+strlen($StatusHeader)),($Last-$First-strlen($StatusHeader)) ) );
    if ( strtoupper($OutputStatus) == "CRITICAL" ) {
		$Status=2;
    	$Msg.=substr($Buff,$First+8);
  	} elseif ( strtoupper($OutputStatus) == "WARNING" ){
    	$Status=1;
    	$Msg.=substr($Buff,$First+8);
	} else {
		$Status=0;
    	$Msg.=substr($Buff,$First+8);
	}
  }



  if (empty($Msg))$Msg='Page OK';
  if ($InludePerf)$Msg.= " |time=$Time size=$Size";
  echo $Msg;
  if ($ShowPage)echo "\n\n----------------------------- Page content ----------------------------\n\n".$Buff;
  exit($Status);
    
}else{
  Manual();
}

function getmicrotime(){ 
  list($usec, $sec) = explode(" ",microtime()); 
  return ((float)$usec + (float)$sec); 
} 

function Manual(){
echo "------- check_curl.php written by Vit Safar (CZ), v1.0, 20.10.2006 ---------
----------------- modified by Donald Fellow (US), v1.1, 08.06.2007 ---------\n
 Syntax:
    -U URL (s)
    -A Agent (s)(default: Mozilla/5.0 ... )
    -G Grep page on STRING (s)
    -L Show page (-)
    -F Follow redirects (-)
    -I Ignore SSL certificate errors (-)
    -X Exclude performance data (default: include)
    -Tc Ccritical page return time (i)
    -Tw Warning page return time (i)
    -Sbc Critical page size below SIZE (i)
    -Soc Critical page size over SIZE (i)
    -Sbw Warning page size below SIZE (i)
    -Sow Warning page size over SIZE (i)
    -S Find string between ARG1 and ARG2, return first match (s s) (example: value=\" \" )
    -T Timeout (i)(default: 10sec)
    -O Output Driven Check - Page Should respond with \"Status: OK\" or otherwise
\n\n Example:
  check_curl.php -U http://test.example.net\n\n";
}

?>


