##############################################################################
# Copyright (c) Members of the EGEE Collaboration. 2004.
# See http://www.eu-egee.org/partners/ for details on the copyright
# holders.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS
# OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##############################################################################
#
# NAME :        config_gip_storm
#
# DESCRIPTION : This function configures the published information on a StoRM SE.
#
# AUTHORS :     grid-release@infn.it
#
# NOTES :
#
# YAIM MODULE:  yaim-storm
#
##############################################################################

# Get from config_gip_dpm in glite-yaim-dpm-4.0.6-1 and modified for StoRM
function l_write_vo_info () {

  tofile=$1
  # get_owner
  echo -n "get_owner =" >> ${tofile}
  nvo=0
  for VO in ${VOS}; do
    echo -n " echo ${VO};" >> ${tofile}
    nvo=1
  done
  if [ ${nvo} -eq 0 ]; then
    echo " echo" >> ${tofile}
  else
    echo >> ${tofile}
  fi
  # get_acbr
  echo -n "get_acbr =" >> ${tofile}
  nvo=0
  for VO in ${VOS}; do
    echo -n " echo VO:${VO};" >> ${tofile}
    nvo=1
  done
  if [ $nvo -eq 0 ]; then
    echo " echo" >> ${tofile}
  else
    echo >> ${tofile}
  fi

  return 0

}

#
# Size
#
function get_size () {

  FUNC="get_size"

  if [ "$#" -ne "9" ]; then
    yaimlog ERROR "${FUNC}: Internal Error!"
    yaimlog ERROR "Please set: Verify the number of parameters passed to the ${FUNCTION} function"
    yestr ${YEX_SOFTWARE}
    yaimlog ERROR "${YERRORSTR}"
    return ${YEX_SOFTWARE}
  fi

  SIZE=`/usr/bin/curl -s http://$2:$3/info/status/$1`
  if [ -z "${SIZE}" ]; then
    # convert in byte (base 10)
    yaimlog DEBUG "${FUNC}: the command /usr/bin/curl -s http://$2:$3/info/status/$1 return no value; check StoRM Backend service status."
    yaimlog DEBUG "${FUNC}: set a temporary value."
    total=$(($4*(1000*1000*1000)))
    used=0
    reserved=$(($4*(1000*1000*1000)))
    free=$(($4*(1000*1000*1000)))
    available=$(($4*(1000*1000*1000)))
  elif [ "${SIZE}" == "<html><body><h1>Internal Error</h1></body></html>" ]; then
    # convert in byte (base 10)
    yaimlog DEBUG "${FUNC}: the command /usr/bin/curl -s http://$2:$3/info/status/$1 return Internal Error; check StoRM Backend info service status."
    yaimlog DEBUG "${FUNC}: set a temporary value."
    total=$(($4*(1000*1000*1000)))
    used=0
    reserved=$(($4*(1000*1000*1000)))
    free=$(($4*(1000*1000*1000)))
    available=$(($4*(1000*1000*1000)))
  else
    # # convert in byte (base 10)
    used=`echo $SIZE | sed -e 's/[{}]/''/g' | awk -v RS=',"' -F: '/^used-space/ {print $2}'`
    free=`echo $SIZE | sed -e 's/[{}]/''/g' | awk -v RS=',"' -F: '/^free-space/ {print $2}'`
    reserved=`echo $SIZE | sed -e 's/[{}]/''/g' | awk -v RS=',"' -F: '/^reserved-space/ {print $2}'`
    total=`echo $SIZE | sed -e 's/[{}]/''/g' | awk -v RS=',"' -F: '/^total-space/ {print $2}'`
    available=`echo $SIZE | sed -e 's/[{}]/''/g' | awk -v RS=',"' -F: '/^available-space/ {print $2}'`
    busy=`echo $SIZE | sed -e 's/[{}]/''/g' | awk -v RS=',"' -F: '/^busy-space/ {print $2}'`
    if [ "${available}" -eq "0" ]; then
      available=$((${total} - ${busy}))
    fi
    yaimlog DEBUG "${FUNC}: TOTAL: ${total}; AVAILABLE: ${available}; USED: ${used}; FREE: ${free}; RESERVED: ${reserved}; BUSY: $busy"
    NSIZE=`/usr/libexec/storm-dynamic-info-provider/storm-base-ten-converter -u $used -f $free -r $reserved -t $total -a $available`
    used=`echo $NSIZE | sed -e 's/[{}]/''/g' | awk -v RS=',' -F': ' '/used-space/ {print $2}'`
    free=`echo $NSIZE | sed -e 's/[{}]/''/g' | awk -v RS=',' -F': ' '/free-space/ {print $2}'`
    reserved=`echo $NSIZE | sed -e 's/[{}]/''/g' | awk -v RS=',' -F': ' '/reserved-space/ {print $2}'`
    total=`echo $NSIZE | sed -e 's/[{}]/''/g' | awk -v RS=',' -F': ' '/total-space/ {print $2}'`
    available=`echo $NSIZE | sed -e 's/[{}]/''/g' | awk -v RS=',' -F': ' '/available-space/ {print $2}'`
    yaimlog DEBUG "${FUNC}: TOTAL: ${total}; AVAILABLE: ${available}; USED: ${used}; FREE: ${free}; RESERVED: ${reserved}"
  fi
  yaimlog DEBUG "${FUNC}: TOTAL: ${total}; AVAILABLE: ${available}; USED: ${used}; FREE: ${free}; RESERVED: ${reserved}"
  export $5=${total}
  export $6=${available}
  export $7=${used}
  export $8=${free}
  export $9=${reserved}

  return 0

}

function config_gip_storm_check () {

  requires $1 SITE_NAME STORM_BACKEND_HOST STORM_DEFAULT_ROOT STORM_FRONTEND_PATH \
              STORM_FRONTEND_PORT STORM_FRONTEND_PUBLIC_HOST \
              STORM_BACKEND_REST_SERVICES_PORT VOS

  return $?

}

function config_gip_storm_setenv () {

  yaimgridenv_set STORM_BACKEND_HOST ${STORM_BACKEND_HOST}
  yaimgridenv_set STORM_FRONTEND_PUBLIC_HOST ${STORM_FRONTEND_PUBLIC_HOST}
  yaimgridenv_set STORM_FRONTEND_PORT ${STORM_FRONTEND_PORT}
  yaimgridenv_set STORM_FRONTEND_PATH ${STORM_FRONTEND_PATH}

}

function config_gip_storm () {

  FUNCTION="config_gip_storm"

  INFO_SERVICE_CONFIG=/etc/glite/info/service
  INFO_SERVICE_SCRIPT=/usr/bin
  INFO_PROVIDER_PATH=/var/lib/bdii/gip/provider
  INFO_LDIF_PATH=/var/lib/bdii/gip/ldif
  INFO_PLUGIN_PATH=/var/lib/bdii/gip/plugin

  # Manage variables
  STORM_FRONTEND_ENDPOINT="httpg://${STORM_FRONTEND_PUBLIC_HOST}:${STORM_FRONTEND_PORT}${STORM_FRONTEND_PATH}"

  yaimlog INFO "${FUNCTION}: Static service information"
  #----------------------------------------------------------------
  # ${INFO_PROVIDER_PATH}/service-srm-storm-v2 - BEGIN
  #----------------------------------------------------------------
  FILE="${INFO_PROVIDER_PATH}/service-srm-storm-v2"
  yaimlog INFO "${FUNCTION}: Creating ${FILE} ..."
  cat > ${FILE} << EOF
#!/bin/sh
. /etc/profile.d/grid-env.sh
EOF

  cat >> ${FILE} << EOF
${INFO_SERVICE_SCRIPT}/glite-info-service ${INFO_SERVICE_CONFIG}/glite-info-service-srm-storm-v2.conf ${SITE_NAME} ${STORM_FRONTEND_ENDPOINT}
EOF

  # Set execute permissions
  chmod +x ${FILE}
  yaimlog INFO "${FUNCTION}: Successfully created ${FILE} !"
  #--------------------------------------------------
  # ${INFO_PROVIDER_PATH}/service-srm-storm-v2 - END
  #--------------------------------------------------

  yaimlog INFO "${FUNCTION}: Static service information"
  #---------------------------------------------------------------------
  # ${INFO_SERVICE_CONFIG}/glite-info-service-srm-storm-v2.conf - BEGIN
  #---------------------------------------------------------------------
  # Configuration file for SRM v2.2 service reporter
  FILE="${INFO_SERVICE_CONFIG}/glite-info-service-srm-storm-v2.conf"
  yaimlog INFO "${FUNCTION}: Creating ${FILE} ..."
  cat > ${FILE} << EOF
init = /usr/libexec/storm-dynamic-info-provider/glite-info-service-storm init
service_type = SRM
get_version = echo \${GLITE_INFO_SERVICE_VERSION}
get_endpoint = echo \${GLITE_INFO_SERVICE_ENDPOINT}
get_status = ${INFO_SERVICE_SCRIPT}/glite-info-service-test SRM_V2 && /usr/libexec/storm-dynamic-info-provider/glite-info-service-storm status
WSDL_URL = http://sdm.lbl.gov/srm-wg/srm.v2.2.wsdl
semantics_URL = http://sdm.lbl.gov/srm-wg/doc/SRM.v2.2.html
get_starttime = perl -e '@st=stat("/var/run/storm-backend-server.pid");print "@st[10]\n";'
get_data = echo
get_services = echo
EOF

  # Run function to complete file
  l_write_vo_info ${FILE}
  yaimlog INFO "${FUNCTION}: Successfully created ${FILE} !"
  #-------------------------------------------------------------------
  # ${INFO_SERVICE_CONFIG}/glite-info-service-srm-storm-v2.conf - END
  #-------------------------------------------------------------------

  yaimlog INFO "${FUNCTION}: Static storage information"
  #----------------------------------------------------------------
  # ${INFO_LDIF_PATH}/static-file-storm.ldif - BEGIN
  #----------------------------------------------------------------
  FILE="${INFO_LDIF_PATH}/static-file-storm.ldif"   # Configuration filename
  FILE_B="${FILE}.bkp_`date +%Y%m%d_%H%M%S`"                     # Backup configuration filename (if needed)
  FILE_N="${FILE}.yaimnew_`date +%Y%m%d_%H%M%S`"                 # New configuration filename (if needed)

  # Configuration file management
  STORM_INFO_OVERWRITE=`echo ${STORM_INFO_OVERWRITE} | tr '[:upper:]' '[:lower:]'`   # convert in lowercase
  # If overwrite is enabled, create backup
  if [ "${STORM_INFO_OVERWRITE}" = "true" ]; then
    if [ -e ${FILE} ]; then
      yaimlog DEBUG "${FUNCTION}: Overwrite old configuration file ${FILE}"
      yaimlog DEBUG "${FUNCTION}: Backup old configuration file in ${FILE_B}"
      mv ${FILE} ${FILE_B}
    fi
  # Else if overwrite is disabled, create yaimnew
  else
    yaimlog DEBUG "${FUNCTION}: Not overwrite old configuration file ${FILE}"
    yaimlog DEBUG "${FUNCTION}: Create new configuration file in ${FILE_N}"
    FILE="${FILE_N}"
  fi
  touch ${FILE}

  yaimlog INFO "${FUNCTION}: Creating ${FILE} ..."

  # Remove oldest backup file
  yaimlog DEBUG "${FUNCTION}: Removing old backup files"
  find `dirname "${FILE}"` -ctime +2 -name 'static-file-storm.ldif.bkp*' -exec rm {} \;

  # Set permissions
  chmod 644 ${FILE}

  # Prepare need variables
  for SA in ${STORM_STORAGEAREA_LIST}; do

    # Convert case
    SA_UPP=`echo ${SA} | tr '[:lower:]' '[:upper:]'`
    SA_LOW=`echo ${SA} | tr '[:upper:]' '[:lower:]'`

    # Remove DNS-like characters from SA_UPP names
    SA_UPP=`echo ${SA_UPP} | sed -e 's/-//g' -e 's/\.//g'`

    x=STORM_${SA_UPP}_TOKEN;           SA_TOKEN=${!x:-${SA_UPP}_TOKEN}
    x=STORM_${SA_UPP}_QUOTA;           SA_QUOTA=${!x:-false}
    x=STORM_${SA_UPP}_ROOT;            SA_ROOT=${!x:-${STORM_DEFAULT_ROOT}/${SA_LOW}}
    x=STORM_${SA_UPP}_VONAME;          SA_VONAME=${!x:-${SA_LOW}}
    x=STORM_${SA_UPP}_STORAGECLASS;    SA_STORAGECLASS=${!x:-${STORM_STORAGECLASS}}

    hash_insert SA_TOTAL_ONLINE_SIZE_GB ${SA_UPP} 0         # default
    hash_insert SA_FREE_ONLINE_SIZE_GB  ${SA_UPP} 0         # default
    hash_insert SA_USED_ONLINE_SIZE_GB  ${SA_UPP} 0         # default
    hash_insert SA_RESERVED_ONLINE_SIZE_GB ${SA_UPP} 0      # default
    hash_insert SA_USED_ONLINE_SIZE_KB ${SA_UPP} 0          # default
    hash_insert SA_AVAILABLE_ONLINE_SIZE_KB ${SA_UPP} 0     # default

    hash_insert SA_TOTAL_NEARLINE_SIZE_GB ${SA_UPP} 0       # default

    x=STORM_${SA_UPP}_ONLINE_SIZE;   SA_SIZE=${!x}

    if ! [ -z "${SA_STORAGECLASS}" ]; then
      case ${SA_STORAGECLASS} in
        "T1D0")
          x=STORM_${SA_UPP}_NEARLINE_SIZE; SA_NL_SIZE=${!x}
          x=STORM_${SA_UPP}_ONLINE_SIZE;   SA_SIZE=${!x}
          ;;
        "T1D1")
          x=STORM_${SA_UPP}_ONLINE_SIZE;   SA_SIZE=${!x}
          ;;
        "T0D1")
          x=STORM_${SA_UPP}_ONLINE_SIZE;   SA_SIZE=${!x}
          ;;
        *)
          x=STORM_${SA_UPP}_ONLINE_SIZE;   SA_SIZE=${!x}
          ;;
      esac
    fi

    get_size ${SA_TOKEN} ${STORM_BACKEND_HOST} ${STORM_BACKEND_REST_SERVICES_PORT} ${SA_SIZE} TOTAL AVAILABLE USED FREE RESERVED

    if ! [ -z "${SA_STORAGECLASS}" ]; then
      if [ "${SA_STORAGECLASS}" == "T1D0" ] ; then
          # Get size values on SA_TOKEN (in GB)
          hash_insert SA_TOTAL_NEARLINE_SIZE_GB ${SA_UPP} ${SA_NL_SIZE}
      fi
    fi

    # Get size values on SA_TOKEN (in GB)
    hash_insert SA_USED_ONLINE_SIZE_GB  ${SA_UPP} $((${USED}/(1000*1000*1000)))
    hash_insert SA_FREE_ONLINE_SIZE_GB  ${SA_UPP} $((${FREE}/(1000*1000*1000)))
    hash_insert SA_TOTAL_ONLINE_SIZE_GB ${SA_UPP} $((${TOTAL}/(1000*1000*1000)))
    hash_insert SA_RESERVED_ONLINE_SIZE_GB ${SA_UPP} $((${RESERVED}/(1000*1000*1000)))

    # Get size values on SA_TOKEN (in KB)
    hash_insert SA_USED_ONLINE_SIZE_KB  ${SA_UPP} $((${USED}/1000))
    hash_insert SA_AVAILABLE_ONLINE_SIZE_KB  ${SA_UPP} $((${AVAILABLE}/1000))

    # Prepare per-VO and global values
    PERVO_VONAME_INDEX=`echo ${SA_VONAME} | sed -e 's/-//g' -e 's/\.//g'`
    # Add VONAME if missing
    if ! [[ "${PERVO_VONAMES}" =~ "${SA_VONAME}" ]]; then
      PERVO_VONAMES="${PERVO_VONAMES} ${SA_VONAME}"
      x=STORM_${SA_UPP}_ACCESSPOINT;   hash_insert PERVO_ACCESSPOINT ${PERVO_VONAME_INDEX} ${!x:-/${SA_LOW}}
    fi
    # Sum size values for VONAME and global(in GB)
    x=`hash_find PERVO_USED_ONLINE_SIZE_GB ${PERVO_VONAME_INDEX}`
    y=`hash_find SA_USED_ONLINE_SIZE_GB ${SA_UPP}`
    hash_insert PERVO_USED_ONLINE_SIZE_GB ${PERVO_VONAME_INDEX} $((x+y))
    let GLOBAL_USED_ONLINE_SIZE_GB+=$y

    x=`hash_find PERVO_RESERVED_ONLINE_SIZE_GB ${PERVO_VONAME_INDEX}`
    y=`hash_find SA_RESERVED_ONLINE_SIZE_GB ${SA_UPP}`
    hash_insert PERVO_RESERVED_ONLINE_SIZE_GB ${PERVO_VONAME_INDEX} $((x+y))
    let GLOBAL_RESERVED_ONLINE_SIZE_GB+=$y

    x=`hash_find PERVO_FREE_ONLINE_SIZE_GB ${PERVO_VONAME_INDEX}`
    y=`hash_find SA_FREE_ONLINE_SIZE_GB ${SA_UPP}`
    hash_insert PERVO_FREE_ONLINE_SIZE_GB ${PERVO_VONAME_INDEX} $((x+y))
    let GLOBAL_FREE_ONLINE_SIZE_GB+=$y

    x=`hash_find PERVO_TOTAL_ONLINE_SIZE_GB ${PERVO_VONAME_INDEX}`
    y=`hash_find SA_TOTAL_ONLINE_SIZE_GB ${SA_UPP}`
    hash_insert PERVO_TOTAL_ONLINE_SIZE_GB ${PERVO_VONAME_INDEX} $((x+y))
    let GLOBAL_TOTAL_ONLINE_SIZE_GB+=$y

    x=`hash_find PERVO_TOTAL_NEARLINE_SIZE_GB ${PERVO_VONAME_INDEX}`
    y=`hash_find SA_TOTAL_NEARLINE_SIZE_GB ${SA_UPP}`
    hash_insert PERVO_TOTAL_NEARLINE_SIZE_GB ${PERVO_VONAME_INDEX} $((x+y))
    let GLOBAL_TOTAL_NEARLINE_SIZE_GB+=$y

    # Sum size values for VONAME (in KB)
    x=`hash_find PERVO_USED_ONLINE_SIZE_KB ${PERVO_VONAME_INDEX}`
    y=`hash_find SA_USED_ONLINE_SIZE_KB ${SA_UPP}`
    hash_insert PERVO_USED_ONLINE_SIZE_KB ${PERVO_VONAME_INDEX} $((x+y))
    let GLOBAL_USED_ONLINE_SIZE_KB+=$y

    x=`hash_find PERVO_AVAILABLE_ONLINE_SIZE_KB ${PERVO_VONAME_INDEX}`
    y=`hash_find SA_AVAILABLE_ONLINE_SIZE_KB ${SA_UPP}`
    hash_insert PERVO_AVAILABLE_ONLINE_SIZE_KB ${PERVO_VONAME_INDEX} $((x+y))
    let GLOBAL_AVAILABLE_ONLINE_SIZE_KB+=$y

  done

  #==========================================================
  # Create GlueSE entries

  yaimlog DEBUG "${FUNCTION}: Creating GlueSEUniqueID entries"

  GLOBAL_TOTAL_SIZE_GB=$(($((GLOBAL_TOTAL_ONLINE_SIZE_GB)) + $((GLOBAL_TOTAL_NEARLINE_SIZE_GB))))

  cat >> ${FILE} << EOF
#
# GlueSEUniqueID
#
dn: GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST},mds-vo-name=resource,o=grid
objectClass: GlueSETop
objectClass: GlueSE
objectClass: GlueInformationService
objectClass: GlueKey
objectClass: GlueSchemaVersion
GlueSEUniqueID: ${STORM_FRONTEND_PUBLIC_HOST}
GlueSEName: ${SITE_NAME}:srm_v2
GlueSEArchitecture: multidisk
GlueSEStatus: Production
GlueSEImplementationName: StoRM
GlueSEImplementationVersion: `rpm -q --queryformat='%{VERSION}' storm-backend-server`
GlueSESizeTotal: $((GLOBAL_TOTAL_SIZE_GB))
GlueSESizeFree: $((GLOBAL_FREE_ONLINE_SIZE_GB))
GlueSETotalOnlineSize: $((GLOBAL_TOTAL_ONLINE_SIZE_GB))
GlueSEUsedOnlineSize: $((GLOBAL_USED_ONLINE_SIZE_GB))
GlueSETotalNearlineSize: $((GLOBAL_TOTAL_NEARLINE_SIZE_GB))
GlueSEUsedNearlineSize: 0
GlueInformationServiceURL: ldap://${STORM_BACKEND_HOST}:2170/mds-vo-name=resource,o=grid
GlueForeignKey: GlueSiteUniqueID=${SITE_NAME}
GlueSchemaVersionMajor: 1
GlueSchemaVersionMinor: 3

EOF
  #==========================================================

  #==========================================================
  # Create GlueSA entries

  for SA in ${STORM_STORAGEAREA_LIST}; do

    # Convert case
    SA_UPP=`echo ${SA} | tr '[:lower:]' '[:upper:]'`
    SA_LOW=`echo ${SA} | tr '[:upper:]' '[:lower:]'`

    # Remove DNS-like characters from SA_UPP names
    SA_UPP=`echo ${SA_UPP} | sed -e 's/-//g' -e 's/\.//g'`

    x=STORM_${SA_UPP}_ACCESSPOINT;     SA_ACCESSPOINT=${!x:-/${SA_LOW}}
    x=STORM_${SA_UPP}_TOKEN;           SA_TOKEN=${!x}
    x=STORM_${SA_UPP}_VONAME;          SA_VONAME=${!x:-${SA_LOW}}
    x=STORM_${SA_UPP}_STORAGECLASS;    SA_STORAGECLASS=${!x:-${STORM_STORAGECLASS}}
    # Convert in uppercase
    SA_STORAGECLASS=`echo ${SA_STORAGECLASS} | tr '[:lower:]' '[:upper:]'`

    # Check the STORAGECLASS
    SA_RETENTION_POLICY="replica"                                         # default
    SA_ACCESS_LATENCY="online"                                            # default
    SA_INSTALLED_ONLINE_CAPACITY=`hash_find SA_TOTAL_ONLINE_SIZE_GB ${SA_UPP}`   # default
    SA_INSTALLED_NEARLINE_CAPACITY=0                                      # default
    if ! [ -z "${SA_STORAGECLASS}" ]; then
      case ${SA_STORAGECLASS} in
        "T1D0")
          SA_RETENTION_POLICY="custodial"
          SA_ACCESS_LATENCY="nearline"
          SA_INSTALLED_ONLINE_CAPACITY=`hash_find SA_TOTAL_ONLINE_SIZE_GB ${SA_UPP}`
          SA_INSTALLED_NEARLINE_CAPACITY=`hash_find SA_TOTAL_NEARLINE_SIZE_GB ${SA_UPP}`
          ;;
        "T1D1")
          SA_RETENTION_POLICY="custodial"
          SA_ACCESS_LATENCY="online"
          SA_INSTALLED_ONLINE_CAPACITY=`hash_find SA_TOTAL_ONLINE_SIZE_GB ${SA_UPP}`
          SA_INSTALLED_NEARLINE_CAPACITY=0
          ;;
        "T0D1")
          SA_RETENTION_POLICY="replica"
          SA_ACCESS_LATENCY="online"
          SA_INSTALLED_ONLINE_CAPACITY=`hash_find SA_TOTAL_ONLINE_SIZE_GB ${SA_UPP}`
          SA_INSTALLED_NEARLINE_CAPACITY=0
          ;;
        *)
          SA_RETENTION_POLICY="replica"
          SA_ACCESS_LATENCY="online"
          SA_INSTALLED_ONLINE_CAPACITY=`hash_find SA_TOTAL_ONLINE_SIZE_GB ${SA_UPP}`
          SA_INSTALLED_NEARLINE_CAPACITY=0
          ;;
      esac
    fi

    yaimlog DEBUG "${FUNCTION}: Creating GlueSALocalID entries for ${SA_LOW}:${SA_RETENTION_POLICY}:${SA_ACCESS_LATENCY} SA (${SA_VONAME} VO)"

    cat >> ${FILE} << EOF
#
# GlueSALocalID ${SA_LOW}:${SA_RETENTION_POLICY}:${SA_ACCESS_LATENCY} SA (${SA_VONAME} VO)
#
dn: GlueSALocalID=${SA_LOW}:${SA_RETENTION_POLICY}:${SA_ACCESS_LATENCY},GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST},mds-vo-name=resource,o=grid
objectClass: GlueSATop
objectClass: GlueSA
objectClass: GlueSAPolicy
objectClass: GlueSAState
objectClass: GlueSAAccessControlBase
objectClass: GlueKey
objectClass: GlueSchemaVersion
GlueSALocalID: ${SA_LOW}:${SA_RETENTION_POLICY}:${SA_ACCESS_LATENCY}
GlueSAName: Reserved space for ${SA_VONAME} VO
GlueSATotalOnlineSize: $((`hash_find SA_TOTAL_ONLINE_SIZE_GB ${SA_UPP}`))
GlueSAUsedOnlineSize: $((`hash_find SA_USED_ONLINE_SIZE_GB ${SA_UPP}`))
GlueSAFreeOnlineSize: $((`hash_find SA_FREE_ONLINE_SIZE_GB ${SA_UPP}`))
GlueSAReservedOnlineSize: $((`hash_find SA_TOTAL_ONLINE_SIZE_GB ${SA_UPP}`))
GlueSACapability: InstalledOnlineCapacity=$((SA_INSTALLED_ONLINE_CAPACITY))
GlueSACapability: InstalledNearlineCapacity=$((SA_INSTALLED_NEARLINE_CAPACITY))
GlueSATotalNearlineSize: $((`hash_find SA_TOTAL_NEARLINE_SIZE_GB ${SA_UPP}`))
GlueSAUsedNearlineSize: 0
GlueSAFreeNearlineSize: 0
GlueSAReservedNearlineSize: 0
GlueSARetentionPolicy: ${SA_RETENTION_POLICY}
GlueSAAccessLatency: online
GlueSAExpirationMode: neverExpire
GlueSAPolicyFileLifeTime: permanent
GlueSAType: permanent
GlueSAStateAvailableSpace: $((`hash_find SA_AVAILABLE_ONLINE_SIZE_KB ${SA_UPP}`))
GlueSAStateUsedSpace: $((`hash_find SA_USED_ONLINE_SIZE_KB ${SA_UPP}`))
GlueSAAccessControlBaseRule: VO:${SA_VONAME}
GlueChunkKey: GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST}
GlueSchemaVersionMajor: 1
GlueSchemaVersionMinor: 3

EOF

    if [ -z ${SA_TOKEN} ]; then
      yaimlog DEBUG "${FUNCTION}: Creating GlueVOInfoLocalID entries for ${SA_VONAME} VO (no token)"
      cat >> ${FILE} << EOF
#
# GlueVOInfoLocalID ${SA_VONAME}
#
dn: GlueVOInfoLocalID=${SA_VONAME},GlueSALocalID=${SA_LOW}:${SA_RETENTION_POLICY}:${SA_ACCESS_LATENCY},GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST},mds-vo-name=resource,o=grid
objectClass: GlueSATop
objectClass: GlueVOInfo
objectClass: GlueKey
objectClass: GlueSchemaVersion
GlueVOInfoLocalID: ${SA_VONAME}
GlueVOInfoPath: ${SA_ACCESSPOINT}
GlueVOInfoAccessControlBaseRule: VO:${SA_VONAME}
GlueChunkKey: GlueSALocalID=${SA_LOW}:${SA_RETENTION_POLICY}:${SA_ACCESS_LATENCY}
GlueChunkKey: GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST}
GlueSchemaVersionMajor: 1
GlueSchemaVersionMinor: 3

EOF
    else
      yaimlog DEBUG "${FUNCTION}: Creating GlueVOInfoLocalID entries for ${SA_VONAME} VO (${SA_TOKEN} token)"
      cat >> ${FILE} << EOF
#
# GlueVOInfoLocalID ${SA_VONAME}:${SA_TOKEN}
#
dn: GlueVOInfoLocalID=${SA_VONAME}:${SA_TOKEN},GlueSALocalID=${SA_LOW}:${SA_RETENTION_POLICY}:${SA_ACCESS_LATENCY},GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST},mds-vo-name=resource,o=grid
objectClass: GlueSATop
objectClass: GlueVOInfo
objectClass: GlueKey
objectClass: GlueSchemaVersion
GlueVOInfoLocalID: ${SA_VONAME}:${SA_TOKEN}
GlueVOInfoPath: ${SA_ACCESSPOINT}
GlueVOInfoTag: ${SA_TOKEN}
GlueVOInfoAccessControlBaseRule: VO:${SA_VONAME}
GlueChunkKey: GlueSALocalID=${SA_LOW}:${SA_RETENTION_POLICY}:${SA_ACCESS_LATENCY}
GlueChunkKey: GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST}
GlueSchemaVersionMajor: 1
GlueSchemaVersionMinor: 3

EOF
    fi

  done

  #==========================================================

  #==========================================================
  # Create GlueSEControlProtocol entries

  yaimlog DEBUG "${FUNCTION}: Creating GlueSEControlProtocolLocalID entries for srm_v2.2 protocol"
  cat >> ${FILE} << EOF
#
# GlueSEControlProtocolLocalID srm_v2.2
#
dn: GlueSEControlProtocolLocalID=srm_v2.2,GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST},mds-vo-name=resource,o=grid
objectClass: GlueSETop
objectClass: GlueSEControlProtocol
objectClass: GlueKey
objectClass: GlueSchemaVersion
GlueSEControlProtocolType: SRM
GlueSEControlProtocolLocalID: srm_v2.2
GlueSEControlProtocolVersion: 2.2.0
GlueSEControlProtocolEndpoint: ${STORM_FRONTEND_ENDPOINT}
GlueChunkKey: GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST}
GlueSchemaVersionMajor: 1
GlueSchemaVersionMinor: 3

EOF
  #==========================================================

  #==========================================================
  # Create GlueSEAccessProtocol entries

  # Convert in lowercase
  STORM_INFO_FILE_SUPPORT=`echo ${STORM_INFO_FILE_SUPPORT} | tr '[:upper:]' '[:lower:]'`
  STORM_INFO_RFIO_SUPPORT=`echo ${STORM_INFO_RFIO_SUPPORT} | tr '[:upper:]' '[:lower:]'`
  STORM_INFO_GRIDFTP_SUPPORT=`echo ${STORM_INFO_GRIDFTP_SUPPORT} | tr '[:upper:]' '[:lower:]'`
  STORM_INFO_ROOT_SUPPORT=`echo ${STORM_INFO_ROOT_SUPPORT} | tr '[:upper:]' '[:lower:]'`
  STORM_INFO_HTTP_SUPPORT=`echo ${STORM_INFO_HTTP_SUPPORT} | tr '[:upper:]' '[:lower:]'`
  STORM_INFO_HTTPS_SUPPORT=`echo ${STORM_INFO_HTTPS_SUPPORT} | tr '[:upper:]' '[:lower:]'`

  if [ ${STORM_INFO_FILE_SUPPORT} = "true" ]; then
    yaimlog DEBUG "${FUNCTION}: Creating GlueSEAccessProtocolLocalID entries for file protocol"
    cat >> ${FILE} << EOF
#
# GlueSEAccessProtocolLocalID file
#
dn: GlueSEAccessProtocolLocalID=file,GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST},mds-vo-name=resource,o=grid
objectClass: GlueSETop
objectClass: GlueSEAccessProtocol
objectClass: GlueKey
objectClass: GlueSchemaVersion
GlueSEAccessProtocolType: file
GlueSEAccessProtocolLocalID: file
GlueSEAccessProtocolVersion: 1.0.0
GlueSEAccessProtocolSupportedSecurity: GSI
GlueSEAccessProtocolMaxStreams: 1
GlueChunkKey: GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST}
GlueSchemaVersionMajor: 1
GlueSchemaVersionMinor: 3

EOF
  fi

  if [ ${STORM_INFO_RFIO_SUPPORT} = "true" ]; then
    yaimlog DEBUG "${FUNCTION}: Creating GlueSEAccessProtocolLocalID entries for rfio protocol"
    cat >> ${FILE} << EOF
#
# GlueSEAccessProtocolLocalID rfio
#
dn: GlueSEAccessProtocolLocalID=rfio,GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST},mds-vo-name=resource,o=grid
objectClass: GlueSETop
objectClass: GlueSEAccessProtocol
objectClass: GlueKey
objectClass: GlueSchemaVersion
GlueSEAccessProtocolType: rfio
GlueSEAccessProtocolLocalID: rfio
GlueSEAccessProtocolVersion: 1.0.0
GlueSEAccessProtocolSupportedSecurity: GSI
GlueSEAccessProtocolMaxStreams: 1
GlueChunkKey: GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST}
GlueSchemaVersionMajor: 1
GlueSchemaVersionMinor: 3

EOF
  fi

  if [ ${STORM_INFO_GRIDFTP_SUPPORT} = "true" ]; then
    yaimlog DEBUG "${FUNCTION}: Creating GlueSEAccessProtocolLocalID entries for gsiftp protocol"
    cat >> ${FILE} << EOF
#
# GlueSEAccessProtocolLocalID gsiftp
#
dn: GlueSEAccessProtocolLocalID=gsiftp,GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST},mds-vo-name=resource,o=grid
objectClass: GlueSETop
objectClass: GlueSEAccessProtocol
objectClass: GlueKey
objectClass: GlueSchemaVersion
GlueSEAccessProtocolType: gsiftp
GlueSEAccessProtocolLocalID: gsiftp
GlueSEAccessProtocolVersion: 1.0.0
GlueSEAccessProtocolSupportedSecurity: GSI
GlueSEAccessProtocolMaxStreams: 10
GlueChunkKey: GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST}
GlueSchemaVersionMajor: 1
GlueSchemaVersionMinor: 3

EOF
  fi

  if [ ${STORM_INFO_ROOT_SUPPORT} = "true" ]; then
    yaimlog DEBUG "${FUNCTION}: Creating GlueSEAccessProtocolLocalID entries for root protocol"
    cat >> ${FILE} << EOF
#
# GlueSEAccessProtocolLocalID root
#
dn: GlueSEAccessProtocolLocalID=root,GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST},mds-vo-name=resource,o=grid
objectClass: GlueSETop
objectClass: GlueSEAccessProtocol
objectClass: GlueKey
objectClass: GlueSchemaVersion
GlueSEAccessProtocolType: root
GlueSEAccessProtocolLocalID: root
GlueSEAccessProtocolVersion: 1.0.0
GlueSEAccessProtocolSupportedSecurity: GSI
GlueSEAccessProtocolMaxStreams: 1
GlueChunkKey: GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST}
GlueSchemaVersionMajor: 1
GlueSchemaVersionMinor: 3
EOF
  fi
  
    if [ ${STORM_INFO_HTTP_SUPPORT} = "true" ]; then
    yaimlog DEBUG "${FUNCTION}: Creating GlueSEAccessProtocolLocalID entries for http protocol"
    cat >> ${FILE} << EOF
#
# GlueSEAccessProtocolLocalID http
#
dn: GlueSEAccessProtocolLocalID=http,GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST},mds-vo-name=resource,o=grid
objectClass: GlueSETop
objectClass: GlueSEAccessProtocol
objectClass: GlueKey
objectClass: GlueSchemaVersion
GlueSEAccessProtocolType: http
GlueSEAccessProtocolLocalID: http
GlueSEAccessProtocolVersion: 1.1.0
GlueSEAccessProtocolSupportedSecurity: GSI
GlueSEAccessProtocolMaxStreams: 1
GlueChunkKey: GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST}
GlueSchemaVersionMajor: 1
GlueSchemaVersionMinor: 3
EOF
  fi
  
    if [ ${STORM_INFO_HTTPS_SUPPORT} = "true" ]; then
    yaimlog DEBUG "${FUNCTION}: Creating GlueSEAccessProtocolLocalID entries for https protocol"
    cat >> ${FILE} << EOF
#
# GlueSEAccessProtocolLocalID https
#
dn: GlueSEAccessProtocolLocalID=https,GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST},mds-vo-name=resource,o=grid
objectClass: GlueSETop
objectClass: GlueSEAccessProtocol
objectClass: GlueKey
objectClass: GlueSchemaVersion
GlueSEAccessProtocolType: https
GlueSEAccessProtocolLocalID: https
GlueSEAccessProtocolVersion: 1.1.0
GlueSEAccessProtocolSupportedSecurity: GSI
GlueSEAccessProtocolMaxStreams: 1
GlueChunkKey: GlueSEUniqueID=${STORM_FRONTEND_PUBLIC_HOST}
GlueSchemaVersionMajor: 1
GlueSchemaVersionMinor: 3
EOF
  fi
  
  #==========================================================
  chown ldap:ldap ${INFO_LDIF_PATH}/static-file-storm.ldif
  yaimlog INFO "${FUNCTION}: Successfully created ${FILE} !"
  #----------------------------------------------------------------
  # ${INFO_LDIF_PATH}/static-file-storm.ldif - END
  #----------------------------------------------------------------

  yaimlog INFO "${FUNCTION}: Dynamic storage information"
  #--------------------------------------------------------------------
  # ${INFO_PLUGIN_PATH}/glite-info-dynamic-storm - BEGIN
  #--------------------------------------------------------------------
  # Create configuration file for dynamic information provider
  FILE="/etc/storm/backend-server/storm-yaim-variables.conf"
  yaimlog INFO "${FUNCTION}: Creating ${FILE} ..."
  set | egrep '^STORM|^SITE_NAME' | sort > ${FILE}
  chgrp ldap /etc/storm/backend-server/storm-yaim-variables.conf 
  chmod 450 ${FILE}

  # Install dynamic script pointing to gip plugin
  WRAPPER="${INFO_PLUGIN_PATH}/glite-info-dynamic-storm"
  yaimlog INFO "${FUNCTION}: Creating ${WRAPPER} ..."
  cat > ${WRAPPER} << EOF
#! /bin/sh
/usr/libexec/storm-dynamic-info-provider/glite-info-dynamic-storm ${FILE}
EOF
  chown ldap:ldap ${WRAPPER}
  # Set permissions
  chmod 755 ${WRAPPER}
  #--------------------------------------------------------------------
  # ${INFO_PLUGIN_PATH}/glite-info-dynamic-storm - END
  #--------------------------------------------------------------------

  # Remove old cron replaced by new dynamic information provider
  rm -f /etc/cron.d/glite-info-dynamic-storm

  # Exit with success
  return 0

}

