Bash skel: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
|||
Line 49: | Line 49: | ||
fi | fi | ||
if [[ -z $3 ]]; then | if [[ -z $3 ]]; then | ||
OUT=' | OUT='' | ||
else | |||
OUT="\n${3}" | |||
fi | fi | ||
Line 62: | Line 64: | ||
# Set our output now into our "logfile" | # Set our output now into our "logfile" | ||
case ${SEV} in | case ${SEV} in | ||
*DEBUG*) echo -e "Status ${SEV} - ${STR}" | *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 ;; | exit 2 ;; | ||
FATAL*) echo -e "Status ${SEV} - ${STR} ${OUT}" | tee -a ${OUT_FILE} | |||
exit 2 ;; | exit 2 ;; | ||
*WARN*) echo -e "Status ${SEV} - ${STR} ${OUT}" | tee -a ${OUT_FILE} | |||
exit 1 ;; | exit 1 ;; | ||
*) echo -e "Status ${SEV} - ${STR} ${OUT}" | tee -a ${OUT_FILE} ;; | |||
esac | esac | ||
# Unset the death by exit codes now | # Unset the death by exit codes now |
Revision as of 14:37, 21 February 2022
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