#!/bin/bash

# Simple script to count number of mirrors available for a particular URL

# Copyright (c) 2009 IBM
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
#    David Williams - initial API and implementation


function usage() {
    printf "\n\tSimple script to count number of mirrors available for a particular URL" >&2
    printf "\n\tUsage: %s [-h] | [-v] [-f] [-p] [-t number] urls" $(basename $0) >&2
    printf "\n\t\t%s" "where h==help, v==verbose, f==only ftp mirrors, p==only http mirrors, t==test against 'number' " >&2
    printf "\n\t\t%s"    "and urls is space delimited list of URL parameters," >&2
    printf "\n\t\t%s\n"  "such as /ganymede/releases/site.xml" >&2
}

function checkMirrorsForURL() {

    if [ -z $1 ]
    then
      echo "Error: internal funtion requires mirror url parameter";
      exit 3;
    else
      mirrorURL=$1
    fi  
    if [ -z $2 ]
    then
      protocol=
      pword="http and ftp"  
    else
      protocolarg="&protocol=$2"
      pword="$2"
    fi
    
    nMirrors=$(wget -q -O - "http://www.eclipse.org/downloads/download.php?file=${mirrorURL}&format=xml${protocolarg}" | grep \<mirror\ | wc -l)
    echo "    number of" ${pword} "mirrors: " ${nMirrors} "  for" ${mirrorURL} 
    exit $nMirrors
}

function minvalue() {
ref=$1
comp=$2
result=
#echo "ref: $ref \r";
#echo "comp: " $comp "\r"
if [ -z $ref ]
then
    #echo "no ref\r"
    result=$comp
else
    if [ $ref -lt $comp ]
    then
        #echo "ref lt comp\r"
        result=$ref
    else
        #echo "comp <= ref\r"
        result=$comp
    fi
fi
echo $result
}


urls=
ftponly=0
httponly=0
protocol=
while getopts 'hvfpt:' OPTION
do
    case $OPTION in
        h)    usage
        exit 1
        ;;
        f)    ftponly=1
        ;;
        p)    httponly=1
        ;;
        v)    verbose=1
        ;;  
        t)    testNumber=$OPTARG
        ;;
        ?)    usage
        exit 2
        ;;
    esac
done

shift $(($OPTIND - 1))

urls="$@"

if [ $ftponly == 1 ]
then
 protocol="ftp"
fi 
if [ $httponly == 1 ]
then
 protocol="http"
fi 
if [ $ftponly == 1 -a $httponly == 1 ]
then
 protocol=
fi

if [ $verbose ]
then
 echo "ftponly: " $ftponly " httponly: " $httponly
 echo "protocol: " $protocol
 echo "urls: " $urls
fi 

minimumMirrors=
if [ "${urls}" ] 
then 
  echo
  for mirrorURL in ${urls}
  do
   nm=checkMirrorsForURL $mirrorURL $protocol
   minimumMirrors=min $minimumMirrors $nm
  done
  echo
else
  usage
fi

if [ -z $testNumber ]
then
 if [ $verbose ]
 then 
   echo "no test mode"
 fi
 exit 0
else
 result=$($testNumber - $minimumMirrors)
 if [ $result <= 0 ]
 then
   if [ $verbose ]
   then 
     echo "minimum mirrors was greater than or equal to criteria"
   fi
   exit 0
 else  
    if [ $verbose ]
     then 
       echo "minimum mirrors was not as large as criteria"
     fi
   exit result
 fi 
fi