Bash skel

From I Will Fear No Evil
Jump to navigation Jump to search

Basic Skeleton to build scripts from

#!/bin/bash -
#===============================================================================
#
#          FILE: filename.sh
#         USAGE: ./filename.sh options (if defined, see help)
#        AUTHOR: Chris Hubbard (CSH), chubbard@iwillfearnoevil.com
#  ORGANIZATION: I Will Fear No Evil
#       CREATED: 09/12/2014 11:30:20
#      REVISION: Amanda
#===============================================================================

# Treat unset variables as an error (disabled by default)
# set -o nounset

#----------------------------------------
# Always define a help system by default
#----------------------------------------
usage() {
cat << EOF
Usage: $0 options


Options:
-h  show this help screen
-x  enable debug mode

Example:
$0 -x

EOF
}

#--------------------------------------
# Function General logger system
#--------------------------------------
logger() {
# This is the ONLY place that should exit out of our
# script with an error as the -e is not set in shopt values
SEV=$1
STR=$2
OUT=$3

# Honor exit codes HERE only
set -e
if [[ -z $2 ]]; then
  STR="No details given"
fi
if [[ -z $3 ]]; then
  OUT=''
else
  OUT="\n${3}"
fi

# If the file does not exist, simply touch it
if [[ ! -e ${OUT_FILE} ]]; then
  touch ${OUT_FILE}
fi

# Make sure our output is uniform.  Why look like a sloppy coder?
SEV=$(echo "${SEV}" | tr [:lower:] [:upper:])

# Set our output now into our "logfile"
case ${SEV} in
  *DEBUG*) echo -e "Status ${SEV} - ${STR} ${OUT}" | tee -a ${OUT_FILE}  ;;
   *INFO*) echo -e "Status ${SEV} - ${STR} ${OUT}" | tee -a ${OUT_FILE}  ;;
    *ERR*) echo -e "Status ${SEV} - ${STR} ${OUT}" | tee -a ${OUT_FILE}
      exit 2 ;;
   FATAL*) echo -e "Status ${SEV} - ${STR} ${OUT}" | tee -a ${OUT_FILE}
      exit 2 ;;
   *WARN*) echo -e "Status ${SEV} - ${STR} ${OUT}" | tee -a ${OUT_FILE}
      exit 1 ;;
        *) echo -e "Status ${SEV} - ${STR} ${OUT}" | tee -a ${OUT_FILE}  ;;
esac
# Unset the death by exit codes now
set +e
}

#---------------------------------------
# Function to make sure we can find all binaries
#---------------------------------------
verifyDeps() {
# Dont even bother running if we do not have the binaries that we need
needed="grep sed ssh jq"
for i in ${needed} ; do
  type $i >/dev/null 2>&1
  if [[ $? -eq 1 ]]; then
    logger "FATAL" "Missing manditory component: $i"
  fi
done
}

#--------------------------------------
# Function to install specific packages
# call before verify_deps
#--------------------------------------
installPackage() {
  # Install all manditory packages here
  export DEBIAN_FRONTEND=noninteractive
  export DEBCONF_NONINTERACTIVE_SEEN=true
  local aptUpdate=$( apt update 2> /dev/null)
  local aptInstall=$( apt install -y jq 2> /dev/null)
  if [[ $? -ne 0 ]]; then
    logger "FATAL" "Unable to install manditory packages" "${aptUpdate}${aptInstall}"
  else
    logger "INFO" "Installed manditory package(s)"
  fi
}

#--------------------------------------------
# Function to do something useful
#--------------------------------------------
doSomething() {
  echo "Doing something useful"
}

#--------------------------------------------
# boilerplate for the script before application specific
# values are even added
#--------------------------------------------
# configure the logging system
FIL=$(echo "$0" | awk -F '/' '{print $NF}' | sed 's/\.sh/\.txt/')
OUT_FILE=$(pwd)/out/${FIL} ; mkdir -p out ;  touch ${OUT_FILE}

# old, buggy and too complex for no reason:
#OUT_NAME=$(echo $0 | sed 's/\.sh/\txt/')
#OUT_FILE="$(pwd)/out/${OUT_NAME}"
#OUT_PATH=$(echo "${OUT_FILE}" | awk 'BEGIN{FS=OFS="/"}{NF--; print}')
# Count the number of / chars to see if we really have a path
#OUT_PTH="${OUT_FILE//[^\/]}"
#if [[ ${#OUT_PTH} -ge 1 ]] && [[ ! -e ${OUT_PATH} ]] ; then
#  mkdir -p ${OUT_PATH}
#fi

#-------------------------------------------
# Set our application defaults now
#-------------------------------------------

while getopts "hx" OPTION; do
  case ${OPTION} in
    h) usage; exit 0 ;;
    x) export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'; set -x ;;
    *) echo "Status FATAL - Unexpected argument given.  Try -h, used $@"; exit 2 ;;
  esac
done

# Verify your env and command variables FIRST
# if [[ -z ${SOMEVAR} ]]; then true ; else false ; fi

# Install packages
installPakcage

# Confirm binaries exist
verifyDeps

# Do something useful
doSomething

# Always call out that we are done
logger "INFO" "Script $0 complete"
exit 0