#!/bin/bash ##### # Installation Script Fetcher # For the ESGF Node application stack # (author: gavin@llnl.gov) ##### #uses: wget devel=${devel:-0} install_prefix=${prefix:-"/usr/local"} script_maj_version="2.8" script_sub_version="1" esg_dist_url=http://esg-dn2.nsc.liu.se/esgf/dist$( ((devel == 1)) && echo "/devel" || echo "")/$script_maj_version/$script_sub_version id_check() { id | grep root >& /dev/null [ $? != 0 ] && printf "[FAIL] \n\tMust run this program with root's effective UID\n\n" && return 1 return 0 } get_latest() { esg_dist_url=http://esg-dn2.nsc.liu.se/esgf/dist$( ((devel == 1)) && echo "/devel" || echo "")/$script_maj_version/$script_sub_version script_install_dir=${install_prefix}/bin mkdir -p ${script_install_dir} #NOTE: boot script location is a RedHat/CentOS thing... to make this cross distro compatible clean this up. local init_scripts_dir=/etc/rc.d/init.d pushd $script_install_dir >& /dev/null #Get files local fetch_file=esg-node local ret verbose_print "Checking...." checked_get ${esg_dist_url}/esgf-installer/${fetch_file} ret=$? ((ret == 1)) && echo "ESGF Node install script (${fetch_file}) already up-to-date" ((ret == 0)) && echo "Updated ESGF Node install script ($fetch_file) from ESGF distribution site" (( ret > 1 )) && popd >& /dev/null && return 1 chmod 755 ${fetch_file} [ -e ${init_scripts_dir}/${fetch_file} ] && cp -v ${fetch_file} ${init_scripts_dir}/${fetch_file} checked_get ${esg_dist_url}/esgf-installer/esg-functions ((ret == 1)) && echo "esg-functions script (esg-functions) already up-to-date" ((ret == 0)) && echo "Updated esg-functions script (esg-functions) from ESGF distribution site" (( ret > 1 )) && popd >& /dev/null && return 1 chmod 755 esg-functions checked_get ${esg_dist_url}/esgf-installer/esg-init ((ret == 1)) && echo "esg-init script (esg-init) already up-to-date" ((ret == 0)) && echo "Updated esg-init script (esg-init) from ESGF distribution site" (( ret > 1 )) && popd >& /dev/null && return 1 chmod 755 esg-init checked_get ${esg_dist_url}/esgf-installer/esg-bootstrap ((ret == 1)) && echo "ESGF Node bootstrap script (esg-bootstrap) already up-to-date" ((ret == 0)) && echo "Updated ESGF Node bootstrap script (esg-bootstrap) from ESGF distribution site" (( ret > 1 )) && popd >& /dev/null && return 1 chmod 755 esg-bootstrap checked_get ${esg_dist_url}/esgf-installer/setup-autoinstall ((ret == 1)) && echo "ESGF Node Auto-install script (esg-bootstrap) already up-to-date" ((ret == 0)) && echo "Updated Auto-install script (setup-autoinstall) from ESGF distribution site" (( ret > 1 )) && popd >& /dev/null && return 1 chmod 755 setup-autoinstall checked_get ${esg_dist_url}/esgf-installer/esg-purge.sh ((ret == 1)) && echo "ESGF Node Purge script (esg-purge.sh) already up-to-date" ((ret == 0)) && echo "Updated ESGF Node Purge script (esg-purge.sh) from ESGF distribution site" (( ret > 1 )) && popd >& /dev/null && return 1 chmod 755 esg-purge.sh checked_get ${esg_dist_url}/esgf-installer/jar_security_scan ((ret == 1)) && echo "jar_security_scan script already up-to-date" ((ret == 0)) && echo "Updated jar_security_scan script from ESGF distribution site" (( ret > 1 )) && popd >& /dev/null && return 1 chmod 755 jar_security_scan checked_get ${esg_dist_url}/esgf-installer/esg-autoinstall ((ret == 1)) && echo "esg-autoinstall script already up-to-date" ((ret == 0)) && echo "Updated esg-autoinstall script from ESGF distribution site" (( ret > 1 )) && popd >& /dev/null && return 1 chmod 755 esg-autoinstall checked_get esg-autoinstall.conf ${esg_dist_url}/esgf-installer/esg-autoinstall.template ((ret == 1)) && echo "esg-autoinstall.conf script already up-to-date" ((ret == 0)) && echo "Updated esg-autoinstall.conf script from ESGF distribution site" (( ret > 1 )) && popd >& /dev/null && return 1 chmod 755 esg-autoinstall.conf # Move esg-autoinstall to /usr/local/etc and change permissions mkdir -p /usr/local/etc mv esg-autoinstall.conf /usr/local/etc/esg-autoinstall.conf chown root /usr/local/etc/esg-autoinstall.conf chmod 600 /usr/local/etc/esg-autoinstall.conf yum install -y expect popd >& /dev/null } ############################################ # Utility Functions ############################################ check_for_update() { local local_file local remote_file if (( $# == 1 )); then remote_file=${1} local_file=$(readlink -f ${1##*/}) elif (( $# == 2 )); then local_file=${1} remote_file=${2} else echo "function \"checked_get\": Called with incorrect number of args! (fatal)" exit 1 fi [ ! -e ${local_file} ] && echo " WARNING: Could not find local file ${local_file}" && return 0 [ ! -x ${local_file} ] && echo " WARNING: local file ${local_file} not executible" && chmod 755 ${local_file} diff <(md5sum ${local_file} | tr -s " " | cut -d " " -f 1) <(curl -s ${remote_file}.md5 | tr -s " " | cut -d " " -f 1) >& /dev/null (( $? != 0 )) && echo " Update Available @ ${remote_file}" && return 0 return 1 } checked_get() { check_for_update $@ [ $? != 0 ] && return 1 local local_file local remote_file if (( $# == 1 )); then remote_file=${1} local_file=${1##*/} elif (( $# == 2 )); then local_file=${1} remote_file=${2} else echo "function \"checked_get\": Called with incorrect number of args! (fatal)" exit 1 fi if [ -e ${local_file} ]; then cp -v ${local_file} ${local_file}.bak chmod 600 ${local_file}.bak fi wget -O ${local_file} ${remote_file} [ $? != 0 ] && echo " ERROR: Problem pulling down [${remote_file##*/}] from esg distribution site" && return 2 diff <(md5sum ${local_file} | tr -s " " | cut -d " " -f 1) <(curl -s ${remote_file}.md5 | tr -s " " | cut -d " " -f 1) >& /dev/null [ $? != 0 ] && echo " WARNING: Could not verify this file!" && return 3 verbose_print "[VERIFIED]" return 0 } self_verify() { md5sum /dev/null >& /dev/null [ $? != 0 ] && echo "Could not find program \"md5sum\". Please find program and put it in your path and try again, Sorry :-(" && exit 1 #echo "diff <(md5sum ${0} | tr -s " " | cut -d " " -f 1) <(curl ${esg_dist_url}/esgf-installer/${0##*/}.md5 | tr -s " " | cut -d " " -f 1) >& /dev/null " diff <(md5sum ${0} | tr -s " " | cut -d " " -f 1) <(curl -s ${esg_dist_url}/esgf-installer/${0##*/}.md5 | tr -s " " | cut -d " " -f 1) >& /dev/null [ $? != 0 ] && return 3 verbose_print "[VERIFIED]" return 0 } ############################################ verbose_print() { ((VERBOSE)) && echo $@; return 0; } debug_print() { ((DEBUG)) && echo $@; return 0; } usage() { printf " usage: esg-bootstrap [--help] \n" exit 1 } ############################################ # Main ############################################ VERBOSE=0 DEBUG=0 while [ -n "$1" ]; do case $1 in -v | --version) echo "Earth Systems Grid Federation (http://esgf.llnl.gov)" echo "ESGF Node Bootstrap Script" echo "" exit 0 ;; --verbose) VERBOSE=1; ;; --debug) DEBUG=1; ;; --devel) devel=1; ;; *) echo "unknown switch [$1]" exit 1 ;; esac shift done if id_check then (( devel == 1 )) && echo "(Setup to pull from DEVELOPMENT tree...)" && esg_dist_url=http://esg-dn2.nsc.liu.se/esgf/dist$( ((devel == 1)) && echo "/devel" || echo "")/$script_maj_version/$script_sub_version/ self_verify (( $? > 0 )) && printf "WARNING: $0 could not be verified!! \n(This file, $(readlink -f ${0}), may have been tampered with or there is a newer version posted at the distribution server.\nPlease re-fetch this script.)\n\n" && exit 1 echo "checking for updates for the ESGF Node" if (($# == 1)) && [ "$1" = "--help" ]; then usage else get_latest [ $? != 0 ] && exit 1 fi fi exit 0