#!/bin/bash
#
#       /etc/rc.d/init.d/mdservice
#
# Starts the mdserver daemon
#
# chkconfig: 345 95 5
# description: Starts the metadata service daemon mdserver
# processname: amgad

#Get OS information
if [ `uname -m` = "x86_64" ]
then OS_BIT=64
else OS_BIT=32
fi

OS_PLAT=`cat /etc/issue | grep Debian | head -c 3`

if [ -z $OS_PLAT ]; then
OS_PLAT=SL
fi

# Source function library.
if [ "$OS_PLAT" = "SL" ]; then
	. /etc/init.d/functions
else
	. /lib/lsb/init-functions
fi

if test x$GLITE_LOCATION = x ; then
  echo GLITE_LOCATION not set, assuming /usr
  GLITE_LOCATION=/usr
fi

if test x$GLITE_LOCATION_VAR = x ; then 
  echo GLITE_LOCATION_VAR not set, assuming /var
  GLITE_LOCATION_VAR=/var
fi

if test x$GLITE_LOCATION_ETC = x ; then 
  echo GLITE_LOCATION_ETC not set, assuming /etc
  GLITE_LOCATION_ETC=/etc
fi


if test ! -d ${GLITE_LOCATION_VAR}/log ; then
  mkdir -p ${GLITE_LOCATION_VAR}/log
fi

#if test ! -x ${GLITE_LOCATION}/bin/amgad ; then
#  echo Error: ${GLITE_LOCATION}/bin/amgad does not exist
#  exit 0
#fi

LD_T=`uname -a | grep x86_64 | head -c 1`

if test x$LD_T = x ; then
  export GLITE_LOCATION_LIB=$GLITE_LOCATION/lib
else
  export GLITE_LOCATION_LIB=$GLITE_LOCATION/lib64
fi

if test x$LD_LIBRARY_PATH = x ; then
  export LD_LIBRARY_PATH=$GLITE_LOCATION_LIB
else
  CHECK_LPATH=`echo $LD_LIBRARY_PATH | grep $GLITE_LOCATION`
  if test x$CHECK_LPATH = x ; then
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GLITE_LOCATION_LIB
  fi
fi


OPTIONS="-c${GLITE_LOCATION_ETC}/amgad.config -D -l${GLITE_LOCATION_VAR}/log/amgad.log"
[ -e /etc/sysconfig/amgad ] && . /etc/sysconfig/amgad

RETVAL=0

#
#       See how we were called.
#

prog="amgad"

start() {

	if [ "$OS_PLAT" = "SL" ]; then
        # Check if amgad is already running
        if [ ! -f /var/lock/subsys/mdservice ]; then
            echo -n "Starting $prog: "
						echo -n "$OPTIONS"
            daemon ${GLITE_LOCATION}/bin/amgad $OPTIONS
            RETVAL=$?
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mdservice
            echo
				else 
            echo mdservice already running.  
            echo If you are sure that this is not the case, delete /var/lock/subsys/mdservice
            echo and try again.
            RETVAL=1
        fi
        return $RETVAL
	else
		AMGA_PROCESS=`ps ax | grep amgad | grep amgad.conf |grep -v grep | wc -l`
		if [ $AMGA_PROCESS -eq 0 ]; then	
			log_daemon_msg "Starting AMGA server daemon" "amgad"
			start-stop-daemon --start --quiet -p /var/run/amgad.pid --make-pidfile --exec ${GLITE_LOCATION}/bin/amgad -- $OPTIONS
			log_end_msg $?
		else
			log_warning_msg "WARNING: AMGA server is already running"
  		return 0
		fi
	fi

}

stop() {
if [ "$OS_PLAT" = "SL" ]; then
        echo -n "Stopping $prog: "
        killproc /${GLITE_LOCATION}/bin/amgad
        RETVAL=$?
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mdservice
        echo
        return $RETVAL
else
	log_daemon_msg "Stopping AMGA server daemon" "amgad"
  start-stop-daemon --stop --quiet --signal 15 --retry 5 --exec ${GLITE_LOCATION}/bin/amgad
  log_end_msg $?
fi
}


restart() {
        stop
        start
}       

reload() {
        restart
}       

status_at() {
                
	if [ "$OS_PLAT" = "SL" ]; then
  	status ${GLITE_LOCATION}/bin/amgad        
	else
		AMGA_PROCESS=`ps ax | grep amgad | grep amgad.conf |grep -v grep | wc -l`
		if [ $AMGA_PROCESS -eq 0 ]; then	
			log_success_msg " AMGA server is stopped"
		else
			log_success_msg " AMGA server is running"
		fi
	fi
}

fin() {

  sudo -u postgres dropdb metadata > /dev/null 2> /dev/null
  RETVAL=$?
  [ $RETVAL -ne 0 ] && echo "Fail to drop DB" 

  sudo -u postgres dropuser arda > /dev/null 2> /dev/null
  RETVAL=$?
  [ $RETVAL -ne 0 ] && echo "Fail to drop user" 

	if [ "$OS_PLAT" = "Deb" ]; then
		POSTGRES_CONF=/etc/postgresql/8.4/main/
	else
		POSTGRES_CONF=/var/lib/pgsql/data/
	fi

  sed '/^host[ 	]*metadata[ 	]*arda/d' "$POSTGRES_CONF"pg_hba.conf > /tmp/pg_hba.conf
  sed '/^local[ 	]*metadata[ 	]*arda/d' /tmp/pg_hba.conf > "$POSTGRES_CONF"pg_hba.conf 

}

init() {

if [ -f /etc/odbc.ini ]; then
AMGA_ODBC=`grep "PSQL" /etc/odbc.ini | head -c 4`
fi

if [ -z $AMGA_ODBC ]; then
cat >> /etc/odbc.ini <<EOT

[PSQL]
Driver          = PostgreSQL_AMGA
Database        = metadata
Servername      = localhost
Port            = 5432
User            = arda
ReadOnly        = No
EOT
fi

if [ -f /etc/odbcinst.ini ]; then
AMGA_ODBCINST=`grep "PostgreSQL_AMGA" /etc/odbcinst.ini | head -c 10`
fi

if [ -z $AMGA_ODBCINST ]; then
cat >> /etc/odbcinst.ini <<EOT

[PostgreSQL_AMGA]
Description     = ODBC for AMGA PostgreSQL
FileUsage       = 1
CPTimeout       = 120
CPReuse         =
Debug           = 0
Threading       = 1
CommLog         = 0
DontDLClose     = 1
EOT


if [ "$OS_PLAT" = "SL" ]; then

if [ $OS_BIT -eq 32 ]; then
cat >> /etc/odbcinst.ini <<EOT
Driver          = /usr/lib/psqlodbc.so
EOT
else
cat >> /etc/odbcinst.ini <<EOT
Driver          = /usr/lib64/psqlodbc.so
EOT
fi

else
cat >> /etc/odbcinst.ini <<EOT
Driver          = /usr/lib/odbc/psqlodbca.so
EOT
fi


fi

if [ "$OS_PLAT" = "Deb" ]; then

POSTGRES_CONF=/etc/postgresql/8.4/main/
POSTGRES_SERVER=`dpkg -l | awk '/ii  postgresql/ && /server/' | head -c 1`

	if [ -z $POSTGRES_SERVER ]; then
		apt-get -y --force-yes install postgresql
	fi

else

POSTGRES_CONF=/var/lib/pgsql/data/
POSTGRES_SERVER=`rpm -qa | grep postgresql-server | head -c 1`

	if [ -z $POSTGRES_SERVER ]; then
  		yum -y install postgresql-server
	fi

fi

POST_VER=`psql --version |grep psql | awk '$3 >= 8.4' | head -c 1`
PGDATA=/var/lib/pgsql/data

if [ "$OS_PLAT" = "SL" ]; then

if [ ! -e "$POSTGRES_CONF/PG_VERSION" ] && [ ! -z $POST_VER ]; then
echo "Init postgreSQL for 8.4 version or Higher on Sicence Linux"
service postgresql initdb
else
echo "restarting postgresql"
/etc/init.d/postgresql stop
/etc/init.d/postgresql start
fi

fi

POSTGRES_HBA=`grep "local[ 	]*metadata[ 	]*arda[ 	]*trust"  "$POSTGRES_CONF"pg_hba.conf | head -c 4`
if [ -z $POSTGRES_HBA ]; then
  sed -e 's/# TYPE[ \t]*DATABASE[ \t]*USER[ \t]*CIDR-ADDRESS[ \t]*METHOD/# TYPE\tDATABASE\tUSER\tCIDR-ADDRESS\tMETHOD \nlocal\tmetadata\tarda\ttrust \nhost\tmetadata\tarda\t127\.0\.0\.1\/32\ttrust \nhost\tmetadata\tarda\t::1\/128\ttrust/' "$POSTGRES_CONF"pg_hba.conf > /tmp/pg_hba.conf.old
  RETVAL=$?
  [ $RETVAL -ne 0 ] && echo "Fail to create pg_hba.conf" && return $RETVAL
  sudo -u postgres cp -f /tmp/pg_hba.conf.old "$POSTGRES_CONF"pg_hba.conf >/dev/null 2>/dev/null
fi

echo "restarting postgresql"
/etc/init.d/postgresql stop
/etc/init.d/postgresql start

DBNAME="metadata"
psql -q -U arda $DBNAME -c "select count(*) from masterindex" > /dev/null 2> /dev/null
RETVAL=$?
if [ $RETVAL -ne 0 ]; then 
  sudo -u postgres createuser -S -d -r arda > /dev/null 2> /dev/null
  
  sudo -u postgres createdb -O arda $DBNAME
  RETVAL=$?
  [ $RETVAL -ne 0 ] && echo "Fail to create DB" && return $RETVAL

  sudo -u postgres createlang plpgsql $DBNAME
  RETVAL=$?
  [ $RETVAL -ne 0 ] && echo "Fail to create DB" && return $RETVAL

  psql -q -U arda $DBNAME < $GLITE_LOCATION/share/doc/glite-amga-server/createInitialPG.sql > /dev/null 2> /dev/null
  RETVAL=$?
  [ $RETVAL -ne 0 ] && echo "Fail to insert metadata" && return $RETVAL

fi

echo_success
echo "Initializing AMGA : "
return 0
}

site() {

  echo ""
  echo "This option will create a script for Site BDII."
  echo "The script uses glite-info-provider-service."
  
  # Check if amgad is already running
  GLITE_INFO_PROVIDER=`rpm -qa | grep glite-info-provider-service | head -c 1`
  if [ -z $GLITE_INFO_PROVIDER ]; then
    echo "Need glite-info-provider-service."
    echo "It will execute yum -y install glite-info-provider-service."
    echo "Do you want to install this package using yum? (Y/N) "
    read choice
    if [ $choice = "Y" ]; then
      yum -y install glite-info-provider-service
    else        
      echo "Stop making site BDII script" && return 0
    fi
  fi            
 
  SITE_BDII_PROVIDER_DIR=/var/lib/bdii/gip/provider
  SITE_BDII_FLAG=0
 
  SITE_BDII=`rpm -qa | grep bdii | head -c 1`
  if [ -z $SITE_BDII ]; then
  	echo ""
    echo "There is no BDII."
    echo "Script will be created in your home directory";
    SITE_BDII_PROVIDER_DIR=$HOME
    SITE_BDII_FLAG=0
  else
  	echo ""
  	echo "The BDII is found."
  	SITE_BDII_PROVIDER_DIR=/var/lib/bdii/gip/provider
  	SITE_BDII_FLAG=1
  	echo "Script will be created in ${SITE_BDII_PROVIDER_DIR}"
  fi
  
  if [ ! -d $SITE_BDII_PROVIDER_DIR ]; then
    echo "Fail : No provider dir($SITE_BDII_PROVIDER_DIR)" && return 0
  fi
  
  AMGA_PROVIDER_FILE=glite-data-metadata-amga
  
  if [ -f $SITE_BDII_PROVIDER_DIR/$AMGA_PROVIDER_FILE ]; then
    echo "Fail : Site provider script file for AMGA aleady exist" && return 0
  fi
  
  GLITE_INFO_PROVIDER_EXE_S_FILE=/usr/bin/glite-info-glue2-simple
  GLITE_INFO_PROVIDER_AMGA_CONF_FILE_TEM=/etc/glite/info/service/glite-info-glue2-amga.conf.template
  GLITE_INFO_PROVIDER_AMGA_CONF_FILE=/etc/glite/info/service/glite-info-glue2-amga.conf
  
  if [ ! -f $GLITE_INFO_PROVIDER_EXE_S_FILE ]; then
    echo "Fail : There is no file($GLITE_INFO_PROVIDER_EXE_S_FILE)" && return 0
  fi
  
  if [ ! -f $GLITE_INFO_PROVIDER_AMGA_CONF_FILE_TEM ]; then
    echo "Fail : There is no file($GLITE_INFO_PROVIDER_AMGA_CONF_FILE_TEM)" && return 0
  fi
  
  cp -f $GLITE_INFO_PROVIDER_AMGA_CONF_FILE_TEM $GLITE_INFO_PROVIDER_AMGA_CONF_FILE > /dev/null 2>/dev/null
  
cat >> $SITE_BDII_PROVIDER_DIR/$AMGA_PROVIDER_FILE <<EOT
#!/bin/sh
/usr/bin/glite-info-glue2-simple /etc/glite/info/service/glite-info-glue2-amga.conf $SITENAME
EOT

  chmod +x $SITE_BDII_PROVIDER_DIR/$AMGA_PROVIDER_FILE
  RETVAL=$?
  [ $RETVAL -ne 0 ] && echo "Fail to chmod" 
  if [ $SITE_BDII_FLAG -eq 1 ]; then
  	chown ldap $SITE_BDII_PROVIDER_DIR/$AMGA_PROVIDER_FILE
  	RETVAL=$?
  	[ $RETVAL -ne 0 ] && echo "Fail to chown" 
  	chgrp ldap $SITE_BDII_PROVIDER_DIR/$AMGA_PROVIDER_FILE
  	RETVAL=$?
  	[ $RETVAL -ne 0 ] && echo "Fail to chgrp" 
  fi

echo_success
echo "Script regist Success($SITE_BDII_PROVIDER_DIR/$AMGA_PROVIDER_FILE) : "
return 0

}

json() {
  echo ""
  echo "This option will create a JSON file for EMIR."
  echo "You must have a bdii script that can be generated by using 'mdservice site' option."
  
  SITE_BDII_PROVIDER_DIR=/var/lib/bdii/gip/provider
  AMGA_PROVIDER_FILE=glite-data-metadata-amga
  SITE_BDII_FLAG=1
  
  if [ ! -f $SITE_BDII_PROVIDER_DIR/$AMGA_PROVIDER_FILE ]; then
  	SITE_BDII_FLAG=0
  	if [ ! -f $HOME/$AMGA_PROVIDER_FILE ]; then
    		echo ""
    		echo "Fail : No bdii script file" && return 0
    	fi
  fi
  
  if [ -z $SITE_BDII ]; then
  	SITE_BDII_PROVIDER_DIR=$HOME
  fi
  
  BDII_TEMP_FILE=/tmp/json_temp
    
  /bin/sh $SITE_BDII_PROVIDER_DIR/$AMGA_PROVIDER_FILE > $BDII_TEMP_FILE
  
  if [ ! -f $BDII_TEMP_FILE ]; then
  	echo ""
    echo "Fail : Can't create a output file of bdii script." && return 0
  fi
  
  GLUE_ARRAY=("GLUE2ServiceID:" "GLUE2EntityCreationTime:" "GLUE2EntityName:" "GLUE2ServiceType:" "GLUE2EndpointID:" "GLUE2EndpointURL:" "GLUE2EndpointCapability:" "GLUE2EndpointInterfaceName:" "GLUE2EndpointInterfaceVersion:" "GLUE2EndpointQualityLevel:")
  JSON_ARRAY=("Service_ID" "Service_CreationTime" "Service_Name" "Service_Type" "Service_Endpoint_ID" "Service_Endpoint_URL" "Service_Endpoint_Capability" "Service_Endpoint_InterfaceName" "Service_Endpoint_InterfaceVersion" "Service_Endpoint_QualityLevel")
  JSON_VALUE_ARRAY=("" "" "" "" "" "" "" "" "" "")
  SET_FLAG=(0 0 0 0 0 0 0 0 0 0)
  
  
	var=($(< $BDII_TEMP_FILE))
  items_count=${#var[@]}
  
  index=0;
  glue_index=0
  
#  echo $items_count
  
	while [ "$index" -lt "$items_count" ]
  do
  	VAR_STR=${var[$index]}
  	if [ $VAR_STR = ${GLUE_ARRAY[$glue_index]} ]; then
  		JSON_VALUE_ARRAY[$glue_index]=${var[$index+1]}
			SET_FLAG[$glue_index]=1
			let "glue_index= $glue_index + 1"
			let "index= $index + 1"
			if [ $glue_index = 10 ]; then
				break;
			fi
		fi
		let "index= $index + 1"
  done
  
  JSON_FILE=$HOME/amga_json
  if [ -f $JSON_FILE ]; then
  	rm -f $JSON_FILE
  fi
cat >> $JSON_FILE <<EOT
[       //AMGA Service Endpoints Records
  {
EOT
  
  items_count=${#GLUE_ARRAY[@]}
  index=0;
  JSON_STR=""
  while [ "$index" -lt "$items_count" ]
  do
  	JSON_STR="$JSON_STR\"${JSON_ARRAY[$index]}\":\"${JSON_VALUE_ARRAY[$index]}\""
	  echo "    \"${JSON_ARRAY[$index]}\":\"${JSON_VALUE_ARRAY[$index]}\"" >> $JSON_FILE
	  let "index= $index + 1"
	done
	
	echo "  }" >> $JSON_FILE
	echo "]" >> $JSON_FILE

}

case "$1" in
start)
        start
        ;;
stop)
        stop
        ;;
init)
        init
        ;;
fin)
        fin
        ;;
reload|restart)
        restart
        ;;
condrestart)
        if [ -f /var/lock/subsys/mdservice ]; then
            restart
        fi
        ;;
status)
        status_at
        ;;
site)
        if [ ! -n "$2" ]; then
          echo $"Fail : There is no sitename(Usage : $0 site Sitename)" && exit 0
        else
          SITENAME=$2
        fi
        site
        ;;        
json)
	json
	;;
*)
        echo $"Usage: $0 {start|stop|restart|condrestart|status|init|fin|site Sitename|json}"
        exit 1
esac

exit $?
exit $RETVAL
