You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
761 lines
21 KiB
761 lines
21 KiB
4 years ago
|
#!/usr/bin/env bash
|
||
|
|
||
|
# ##################################################
|
||
|
# Bash scripting Utilities.
|
||
|
#
|
||
|
# This script sources my collection of scripting utilities making
|
||
|
# it possible to source this one script and gain access to a
|
||
|
# complete collection of functions, variables, and other options.
|
||
|
#
|
||
|
# Initially taken from here: https://github.com/natelandau/shell-scripts/blob/master/lib/utils.sh
|
||
|
#
|
||
|
# ##################################################
|
||
|
|
||
|
# Logging and Colors
|
||
|
# ------------------------------------------------------
|
||
|
# Here we set the colors for our script feedback.
|
||
|
# Example usage: success "sometext"
|
||
|
#------------------------------------------------------
|
||
|
|
||
|
# Set Colors
|
||
|
bold=$(tput bold)
|
||
|
underline=$(tput sgr 0 1)
|
||
|
reset=$(tput sgr0)
|
||
|
purple=$(tput setaf 171)
|
||
|
red=$(tput setaf 1)
|
||
|
green=$(tput setaf 76)
|
||
|
tan=$(tput setaf 3)
|
||
|
blue=$(tput setaf 38)
|
||
|
|
||
|
function _alert() {
|
||
|
if [ "${1}" = "emergency" ]; then
|
||
|
local color="${bold}${red}"
|
||
|
fi
|
||
|
if [ "${1}" = "error" ]; then local color="${bold}${red}"; fi
|
||
|
if [ "${1}" = "warning" ]; then local color="${red}"; fi
|
||
|
if [ "${1}" = "success" ]; then local color="${green}"; fi
|
||
|
if [ "${1}" = "debug" ]; then local color="${purple}"; fi
|
||
|
if [ "${1}" = "header" ]; then local color="${bold}""${tan}"; fi
|
||
|
if [ "${1}" = "input" ]; then local color="${bold}"; printLog="false"; fi
|
||
|
if [ "${1}" = "info" ] || [ "${1}" = "notice" ]; then local color=""; fi
|
||
|
# Don't use colors on pipes or non-recognized terminals
|
||
|
if [[ "${TERM}" != "xterm"* ]] || [ -t 1 ]; then color=""; reset=""; fi
|
||
|
|
||
|
# Print to $logFile
|
||
|
if [[ ${printLog} = "true" ]] || [ "${printLog}" == "1" ]; then
|
||
|
echo -e "$(date +"%m-%d-%Y %r") $(printf "[%9s]" "${1}") ${_message}" >> "${logFile}";
|
||
|
fi
|
||
|
|
||
|
# Print to console when script is not 'quiet'
|
||
|
if [[ "${quiet}" = "true" ]] || [ "${quiet}" == "1" ]; then
|
||
|
return
|
||
|
else
|
||
|
echo -e "$(date +"%r") ${color}$(printf "[%9s]" "${1}") ${_message}${reset}";
|
||
|
fi
|
||
|
|
||
|
}
|
||
|
|
||
|
function die () { local _message="${*} Exiting."; echo "$(_alert emergency)"; safeExit;}
|
||
|
function error () { local _message="${*}"; echo "$(_alert error)"; }
|
||
|
function warning () { local _message="${*}"; echo "$(_alert warning)"; }
|
||
|
function notice () { local _message="${*}"; echo "$(_alert notice)"; }
|
||
|
function info () { local _message="${*}"; echo "$(_alert info)"; }
|
||
|
function debug () { local _message="${*}"; echo "$(_alert debug)"; }
|
||
|
function success () { local _message="${*}"; echo "$(_alert success)"; }
|
||
|
function input() { local _message="${*}"; echo -n "$(_alert input)"; }
|
||
|
function header() { local _message="========== ${*} ========== "; echo "$(_alert header)"; }
|
||
|
|
||
|
# Log messages when verbose is set to "true"
|
||
|
verbose() {
|
||
|
if [[ "${verbose}" = "true" ]] || [ "${verbose}" == "1" ]; then
|
||
|
debug "$@"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
|
||
|
# SCRIPTNAME
|
||
|
# ------------------------------------------------------
|
||
|
# Will return the name of the script being run
|
||
|
# ------------------------------------------------------
|
||
|
scriptName=`basename $0` #Set Script Name variable
|
||
|
scriptBasename="$(basename ${scriptName} .sh)" # Strips '.sh' from scriptName
|
||
|
|
||
|
# TIMESTAMPS
|
||
|
# ------------------------------------------------------
|
||
|
# Prints the current date and time in a variety of formats:
|
||
|
#
|
||
|
# ------------------------------------------------------
|
||
|
now=$(LC_ALL=C date +"%m-%d-%Y %r") # Returns: 06-14-2015 10:34:40 PM
|
||
|
datestamp=$(LC_ALL=C date +%Y-%m-%d) # Returns: 2015-06-14
|
||
|
hourstamp=$(LC_ALL=C date +%r) # Returns: 10:34:40 PM
|
||
|
timestamp=$(LC_ALL=C date +%Y%m%d_%H%M%S) # Returns: 20150614_223440
|
||
|
today=$(LC_ALL=C date +"%m-%d-%Y") # Returns: 06-14-2015
|
||
|
longdate=$(LC_ALL=C date +"%a, %d %b %Y %H:%M:%S %z") # Returns: Sun, 10 Jan 2016 20:47:53 -0500
|
||
|
gmtdate=$(LC_ALL=C date -u -R | sed 's/\+0000/GMT/') # Returns: Wed, 13 Jan 2016 15:55:29 GMT
|
||
|
|
||
|
# THISHOST
|
||
|
# ------------------------------------------------------
|
||
|
# Will print the current hostname of the computer the script
|
||
|
# is being run on.
|
||
|
# ------------------------------------------------------
|
||
|
thisHost=$(hostname)
|
||
|
|
||
|
# ------------------------------------------------------
|
||
|
# These functions are for use with different trap scenarios
|
||
|
# ------------------------------------------------------
|
||
|
|
||
|
# Non destructive exit for when script exits naturally.
|
||
|
# Usage: Add this function at the end of every script
|
||
|
function safeExit() {
|
||
|
# Delete temp files, if any
|
||
|
if is_dir "${tmpDir}"; then
|
||
|
rm -r "${tmpDir}"
|
||
|
fi
|
||
|
trap - INT TERM EXIT
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
# readFile
|
||
|
# ------------------------------------------------------
|
||
|
# Function to read a line from a file.
|
||
|
#
|
||
|
# Most often used to read the config files saved in my etc directory.
|
||
|
# Outputs each line in a variable named $result
|
||
|
# ------------------------------------------------------
|
||
|
function readFile() {
|
||
|
unset "${result}"
|
||
|
while read result
|
||
|
do
|
||
|
echo "${result}"
|
||
|
done < "$1"
|
||
|
}
|
||
|
|
||
|
# Escape a string
|
||
|
# ------------------------------------------------------
|
||
|
# usage: var=$(escape "String")
|
||
|
# ------------------------------------------------------
|
||
|
escape() { echo "${@}" | sed 's/[]\.|$(){}?+*^]/\\&/g'; }
|
||
|
|
||
|
# needSudo
|
||
|
# ------------------------------------------------------
|
||
|
# If a script needs sudo access, call this function which
|
||
|
# requests sudo access and then keeps it alive.
|
||
|
# ------------------------------------------------------
|
||
|
function needSudo() {
|
||
|
# Update existing sudo time stamp if set, otherwise do nothing.
|
||
|
sudo -v
|
||
|
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
|
||
|
}
|
||
|
|
||
|
# convertsecs
|
||
|
# ------------------------------------------------------
|
||
|
# Convert Seconds to human readable time
|
||
|
#
|
||
|
# To use this, pass a number (seconds) into the function as this:
|
||
|
# print "$(convertsecs $TOTALTIME)"
|
||
|
#
|
||
|
# To compute the time it takes a script to run use tag the start and end times with
|
||
|
# STARTTIME=$(date +"%s")
|
||
|
# ENDTIME=$(date +"%s")
|
||
|
# TOTALTIME=$(($ENDTIME-$STARTTIME))
|
||
|
# ------------------------------------------------------
|
||
|
function convertsecs() {
|
||
|
((h=${1}/3600))
|
||
|
((m=(${1}%3600)/60))
|
||
|
((s=${1}%60))
|
||
|
printf "%02d:%02d:%02d\n" $h $m $s
|
||
|
}
|
||
|
|
||
|
|
||
|
# Join
|
||
|
# ----------------------------------------------
|
||
|
# This function joins items together with a user specified separator
|
||
|
# Taken whole cloth from: http://stackoverflow.com/questions/1527049/bash-join-elements-of-an-array
|
||
|
#
|
||
|
# Usage:
|
||
|
# join , a "b c" d #a,b c,d
|
||
|
# join / var local tmp #var/local/tmp
|
||
|
# join , "${FOO[@]}" #a,b,c
|
||
|
# ----------------------------------------------
|
||
|
function join() { local IFS="${1}"; shift; echo "${*}"; }
|
||
|
|
||
|
# File Checks
|
||
|
# ------------------------------------------------------
|
||
|
# A series of functions which make checks against the filesystem. For
|
||
|
# use in if/then statements.
|
||
|
#
|
||
|
# Usage:
|
||
|
# if is_file "file"; then
|
||
|
# ...
|
||
|
# fi
|
||
|
# ------------------------------------------------------
|
||
|
|
||
|
function is_exists() {
|
||
|
if [[ -e "$1" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function is_not_exists() {
|
||
|
if [[ ! -e "$1" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function is_file() {
|
||
|
if [[ -f "$1" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function is_not_file() {
|
||
|
if [[ ! -f "$1" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function is_dir() {
|
||
|
if [[ -d "$1" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function is_not_dir() {
|
||
|
if [[ ! -d "$1" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function is_symlink() {
|
||
|
if [[ -L "$1" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function is_not_symlink() {
|
||
|
if [[ ! -L "$1" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function is_empty() {
|
||
|
if [[ -z "$1" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function is_not_empty() {
|
||
|
if [[ -n "$1" ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
# Test whether a command exists
|
||
|
# ------------------------------------------------------
|
||
|
# Usage:
|
||
|
# if type_exists 'git'; then
|
||
|
# some action
|
||
|
# else
|
||
|
# some other action
|
||
|
# fi
|
||
|
# ------------------------------------------------------
|
||
|
|
||
|
function type_exists() {
|
||
|
if [ "$(type -P "$1")" ]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
function type_not_exists() {
|
||
|
if [ ! "$(type -P "$1")" ]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
# Test which OS the user runs
|
||
|
# $1 = OS to test
|
||
|
# Usage: if is_os 'darwin'; then
|
||
|
|
||
|
function is_os() {
|
||
|
if [[ "${OSTYPE}" == $1* ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
|
||
|
# SEEKING CONFIRMATION
|
||
|
# ------------------------------------------------------
|
||
|
# Asks questions of a user and then does something with the answer.
|
||
|
# y/n are the only possible answers.
|
||
|
#
|
||
|
# USAGE:
|
||
|
# seek_confirmation "Ask a question"
|
||
|
# if is_confirmed; then
|
||
|
# some action
|
||
|
# else
|
||
|
# some other action
|
||
|
# fi
|
||
|
#
|
||
|
# Credt: https://github.com/kevva/dotfiles
|
||
|
# ------------------------------------------------------
|
||
|
|
||
|
# Ask the question
|
||
|
function seek_confirmation() {
|
||
|
# echo ""
|
||
|
input "$@"
|
||
|
if "${force}"; then
|
||
|
notice "Forcing confirmation with '--force' flag set"
|
||
|
else
|
||
|
read -p " (y/n) " -n 1
|
||
|
echo ""
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# Test whether the result of an 'ask' is a confirmation
|
||
|
function is_confirmed() {
|
||
|
if "${force}"; then
|
||
|
return 0
|
||
|
else
|
||
|
if [[ "${REPLY}" =~ ^[Yy]$ ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
function is_not_confirmed() {
|
||
|
if "${force}"; then
|
||
|
return 1
|
||
|
else
|
||
|
if [[ "${REPLY}" =~ ^[Nn]$ ]]; then
|
||
|
return 0
|
||
|
fi
|
||
|
return 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# Skip something
|
||
|
# ------------------------------------------------------
|
||
|
# Offer the user a chance to skip something.
|
||
|
# Credit: https://github.com/cowboy/dotfiles
|
||
|
# ------------------------------------------------------
|
||
|
function skip() {
|
||
|
REPLY=noskip
|
||
|
read -t 5 -n 1 -s -p "${bold}To skip, press ${underline}X${reset}${bold} within 5 seconds.${reset}"
|
||
|
if [[ "$REPLY" =~ ^[Xx]$ ]]; then
|
||
|
notice " Skipping!"
|
||
|
return 0
|
||
|
else
|
||
|
notice " Continuing..."
|
||
|
return 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# unmountDrive
|
||
|
# ------------------------------------------------------
|
||
|
# If an AFP drive is mounted as part of a script, this
|
||
|
# will unmount the volume. This will only work on Macs.
|
||
|
# ------------------------------------------------------
|
||
|
function unmountDrive() {
|
||
|
if [ -d "$1" ]; then
|
||
|
diskutil unmount "$1"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# help
|
||
|
# ------------------------------------------------------
|
||
|
# Prints help for a script when invoked from the command
|
||
|
# line. Typically via '-h'. If additional flags or help
|
||
|
# text is available in the script they will be printed
|
||
|
# in the '$usage' variable.
|
||
|
# ------------------------------------------------------
|
||
|
function help () {
|
||
|
echo "" 1>&2
|
||
|
input " $@" 1>&2
|
||
|
if [ -n "${usage}" ]; then # print usage information if available
|
||
|
echo " ${usage}" 1>&2
|
||
|
fi
|
||
|
echo "" 1>&2
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
|
||
|
function pauseScript() {
|
||
|
# A simple function used to pause a script at any point and
|
||
|
# only continue on user input
|
||
|
seek_confirmation "Ready to continue?"
|
||
|
if is_confirmed; then
|
||
|
info "Continuing"
|
||
|
else
|
||
|
warning "Exiting Script."
|
||
|
safeExit
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
function in_array() {
|
||
|
# Determine if a value is in an array.
|
||
|
# Usage: if in_array "VALUE" "${ARRAY[@]}"; then ...
|
||
|
local value="$1"; shift
|
||
|
for arrayItem in "$@"; do
|
||
|
[[ "${arrayItem}" == "${value}" ]] && return 0
|
||
|
done
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
# Text Transformations
|
||
|
# -----------------------------------
|
||
|
# Transform text using these functions.
|
||
|
# Adapted from https://github.com/jmcantrell/bashful
|
||
|
# -----------------------------------
|
||
|
|
||
|
lower() {
|
||
|
# Convert stdin to lowercase.
|
||
|
# usage: text=$(lower <<<"$1")
|
||
|
# echo "MAKETHISLOWERCASE" | lower
|
||
|
tr '[:upper:]' '[:lower:]'
|
||
|
}
|
||
|
|
||
|
upper() {
|
||
|
# Convert stdin to uppercase.
|
||
|
# usage: text=$(upper <<<"$1")
|
||
|
# echo "MAKETHISUPPERCASE" | upper
|
||
|
tr '[:lower:]' '[:upper:]'
|
||
|
}
|
||
|
|
||
|
ltrim() {
|
||
|
# Removes all leading whitespace (from the left).
|
||
|
local char=${1:-[:space:]}
|
||
|
sed "s%^[${char//%/\\%}]*%%"
|
||
|
}
|
||
|
|
||
|
rtrim() {
|
||
|
# Removes all trailing whitespace (from the right).
|
||
|
local char=${1:-[:space:]}
|
||
|
sed "s%[${char//%/\\%}]*$%%"
|
||
|
}
|
||
|
|
||
|
trim() {
|
||
|
# Removes all leading/trailing whitespace
|
||
|
# Usage examples:
|
||
|
# echo " foo bar baz " | trim #==> "foo bar baz"
|
||
|
ltrim "$1" | rtrim "$1"
|
||
|
}
|
||
|
|
||
|
squeeze() {
|
||
|
# Removes leading/trailing whitespace and condenses all other consecutive
|
||
|
# whitespace into a single space.
|
||
|
#
|
||
|
# Usage examples:
|
||
|
# echo " foo bar baz " | squeeze #==> "foo bar baz"
|
||
|
|
||
|
local char=${1:-[[:space:]]}
|
||
|
sed "s%\(${char//%/\\%}\)\+%\1%g" | trim "$char"
|
||
|
}
|
||
|
|
||
|
squeeze_lines() {
|
||
|
# <doc:squeeze_lines> {{{
|
||
|
#
|
||
|
# Removes all leading/trailing blank lines and condenses all other
|
||
|
# consecutive blank lines into a single blank line.
|
||
|
#
|
||
|
# </doc:squeeze_lines> }}}
|
||
|
|
||
|
sed '/^[[:space:]]\+$/s/.*//g' | cat -s | trim_lines
|
||
|
}
|
||
|
|
||
|
progressBar() {
|
||
|
# progressBar
|
||
|
# -----------------------------------
|
||
|
# Prints a progress bar within a for/while loop.
|
||
|
# To use this function you must pass the total number of
|
||
|
# times the loop will run to the function.
|
||
|
#
|
||
|
# usage:
|
||
|
# for number in $(seq 0 100); do
|
||
|
# sleep 1
|
||
|
# progressBar 100
|
||
|
# done
|
||
|
# -----------------------------------
|
||
|
if [[ "${quiet}" = "true" ]] || [ "${quiet}" == "1" ]; then
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
local width
|
||
|
width=30
|
||
|
bar_char="#"
|
||
|
|
||
|
# Don't run this function when scripts are running in verbose mode
|
||
|
if ${verbose}; then return; fi
|
||
|
|
||
|
# Reset the count
|
||
|
if [ -z "${progressBarProgress}" ]; then
|
||
|
progressBarProgress=0
|
||
|
fi
|
||
|
|
||
|
# Do nothing if the output is not a terminal
|
||
|
if [ ! -t 1 ]; then
|
||
|
echo "Output is not a terminal" 1>&2
|
||
|
return
|
||
|
fi
|
||
|
# Hide the cursor
|
||
|
tput civis
|
||
|
trap 'tput cnorm; exit 1' SIGINT
|
||
|
|
||
|
if [ ! "${progressBarProgress}" -eq $(( $1 - 1 )) ]; then
|
||
|
# Compute the percentage.
|
||
|
perc=$(( progressBarProgress * 100 / $1 ))
|
||
|
# Compute the number of blocks to represent the percentage.
|
||
|
num=$(( progressBarProgress * width / $1 ))
|
||
|
# Create the progress bar string.
|
||
|
bar=
|
||
|
if [ ${num} -gt 0 ]; then
|
||
|
bar=$(printf "%0.s${bar_char}" $(seq 1 ${num}))
|
||
|
fi
|
||
|
# Print the progress bar.
|
||
|
progressBarLine=$(printf "%s [%-${width}s] (%d%%)" "Running Process" "${bar}" "${perc}")
|
||
|
echo -en "${progressBarLine}\r"
|
||
|
progressBarProgress=$(( progressBarProgress + 1 ))
|
||
|
else
|
||
|
# Clear the progress bar when complete
|
||
|
echo -ne "${width}%\033[0K\r"
|
||
|
unset progressBarProgress
|
||
|
fi
|
||
|
|
||
|
tput cnorm
|
||
|
}
|
||
|
|
||
|
htmlDecode() {
|
||
|
# Decode HTML characters with sed
|
||
|
# Usage: htmlDecode <string>
|
||
|
echo "${1}" | sed -f "${SOURCEPATH}/htmlDecode.sed"
|
||
|
}
|
||
|
|
||
|
htmlEncode() {
|
||
|
# Encode HTML characters with sed
|
||
|
# Usage: htmlEncode <string>
|
||
|
echo "${1}" | sed -f "${SOURCEPATH}/htmlEncode.sed"
|
||
|
}
|
||
|
|
||
|
urlencode() {
|
||
|
# URL encoding/decoding from: https://gist.github.com/cdown/1163649
|
||
|
# Usage: urlencode <string>
|
||
|
|
||
|
local length="${#1}"
|
||
|
for (( i = 0; i < length; i++ )); do
|
||
|
local c="${1:i:1}"
|
||
|
case $c in
|
||
|
[a-zA-Z0-9.~_-]) printf "%s" "$c" ;;
|
||
|
*) printf '%%%02X' "'$c"
|
||
|
esac
|
||
|
done
|
||
|
}
|
||
|
|
||
|
urldecode() {
|
||
|
# Usage: urldecode <string>
|
||
|
|
||
|
local url_encoded="${1//+/ }"
|
||
|
printf '%b' "${url_encoded//%/\x}"
|
||
|
}
|
||
|
|
||
|
parse_yaml() {
|
||
|
# Function to parse YAML files and add values to variables. Send it to a temp file and source it
|
||
|
# https://gist.github.com/DinoChiesa/3e3c3866b51290f31243 which is derived from
|
||
|
# https://gist.github.com/epiloque/8cf512c6d64641bde388
|
||
|
#
|
||
|
# Usage:
|
||
|
# $ parse_yaml sample.yml > /some/tempfile
|
||
|
#
|
||
|
# parse_yaml accepts a prefix argument so that imported settings all have a common prefix
|
||
|
# (which will reduce the risk of name-space collisions).
|
||
|
#
|
||
|
# $ parse_yaml sample.yml "CONF_"
|
||
|
|
||
|
local prefix=$2
|
||
|
local s
|
||
|
local w
|
||
|
local fs
|
||
|
s='[[:space:]]*'
|
||
|
w='[a-zA-Z0-9_]*'
|
||
|
fs="$(echo @|tr @ '\034')"
|
||
|
sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
|
||
|
-e "s|^\($s\)\($w\)$s[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" "$1" |
|
||
|
awk -F"$fs" '{
|
||
|
indent = length($1)/2;
|
||
|
if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";}
|
||
|
vname[indent] = $2;
|
||
|
for (i in vname) {if (i > indent) {delete vname[i]}}
|
||
|
if (length($3) > 0) {
|
||
|
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
|
||
|
printf("%s%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, conj[indent-1],$3);
|
||
|
}
|
||
|
}' | sed 's/_=/+=/g'
|
||
|
}
|
||
|
|
||
|
httpStatus() {
|
||
|
# -----------------------------------
|
||
|
# Shamelessly taken from: https://gist.github.com/rsvp/1171304
|
||
|
#
|
||
|
# Usage: httpStatus URL [timeout] [--code or --status] [see 4.]
|
||
|
# ^message with code (default)
|
||
|
# ^code (numeric only)
|
||
|
# ^in secs (default: 3)
|
||
|
# ^URL without "http://" prefix works fine.
|
||
|
#
|
||
|
# 4. curl options: e.g. use -L to follow redirects.
|
||
|
#
|
||
|
# Dependencies: curl
|
||
|
#
|
||
|
# Example: $ httpStatus bit.ly
|
||
|
# 301 Redirection: Moved Permanently
|
||
|
#
|
||
|
# Example: $ httpStatus www.google.com 100 -c
|
||
|
# 200
|
||
|
#
|
||
|
# -----------------------------------
|
||
|
local curlops
|
||
|
local arg4
|
||
|
local arg5
|
||
|
local arg6
|
||
|
local arg7
|
||
|
local flag
|
||
|
local timeout
|
||
|
local url
|
||
|
|
||
|
saveIFS=${IFS}
|
||
|
IFS=$' \n\t'
|
||
|
|
||
|
url=${1}
|
||
|
timeout=${2:-'3'}
|
||
|
# ^in seconds
|
||
|
flag=${3:-'--status'}
|
||
|
# curl options, e.g. -L to follow redirects
|
||
|
arg4=${4:-''}
|
||
|
arg5=${5:-''}
|
||
|
arg6=${6:-''}
|
||
|
arg7=${7:-''}
|
||
|
curlops="${arg4} ${arg5} ${arg6} ${arg7}"
|
||
|
|
||
|
# __________ get the CODE which is numeric:
|
||
|
code=`echo $(curl --write-out %{http_code} --silent --connect-timeout ${timeout} \
|
||
|
--no-keepalive ${curlops} --output /dev/null ${url})`
|
||
|
|
||
|
# __________ get the STATUS (from code) which is human interpretable:
|
||
|
case $code in
|
||
|
000) status="Not responding within ${timeout} seconds" ;;
|
||
|
100) status="Informational: Continue" ;;
|
||
|
101) status="Informational: Switching Protocols" ;;
|
||
|
200) status="Successful: OK within ${timeout} seconds" ;;
|
||
|
201) status="Successful: Created" ;;
|
||
|
202) status="Successful: Accepted" ;;
|
||
|
203) status="Successful: Non-Authoritative Information" ;;
|
||
|
204) status="Successful: No Content" ;;
|
||
|
205) status="Successful: Reset Content" ;;
|
||
|
206) status="Successful: Partial Content" ;;
|
||
|
300) status="Redirection: Multiple Choices" ;;
|
||
|
301) status="Redirection: Moved Permanently" ;;
|
||
|
302) status="Redirection: Found residing temporarily under different URI" ;;
|
||
|
303) status="Redirection: See Other" ;;
|
||
|
304) status="Redirection: Not Modified" ;;
|
||
|
305) status="Redirection: Use Proxy" ;;
|
||
|
306) status="Redirection: status not defined" ;;
|
||
|
307) status="Redirection: Temporary Redirect" ;;
|
||
|
400) status="Client Error: Bad Request" ;;
|
||
|
401) status="Client Error: Unauthorized" ;;
|
||
|
402) status="Client Error: Payment Required" ;;
|
||
|
403) status="Client Error: Forbidden" ;;
|
||
|
404) status="Client Error: Not Found" ;;
|
||
|
405) status="Client Error: Method Not Allowed" ;;
|
||
|
406) status="Client Error: Not Acceptable" ;;
|
||
|
407) status="Client Error: Proxy Authentication Required" ;;
|
||
|
408) status="Client Error: Request Timeout within ${timeout} seconds" ;;
|
||
|
409) status="Client Error: Conflict" ;;
|
||
|
410) status="Client Error: Gone" ;;
|
||
|
411) status="Client Error: Length Required" ;;
|
||
|
412) status="Client Error: Precondition Failed" ;;
|
||
|
413) status="Client Error: Request Entity Too Large" ;;
|
||
|
414) status="Client Error: Request-URI Too Long" ;;
|
||
|
415) status="Client Error: Unsupported Media Type" ;;
|
||
|
416) status="Client Error: Requested Range Not Satisfiable" ;;
|
||
|
417) status="Client Error: Expectation Failed" ;;
|
||
|
500) status="Server Error: Internal Server Error" ;;
|
||
|
501) status="Server Error: Not Implemented" ;;
|
||
|
502) status="Server Error: Bad Gateway" ;;
|
||
|
503) status="Server Error: Service Unavailable" ;;
|
||
|
504) status="Server Error: Gateway Timeout within ${timeout} seconds" ;;
|
||
|
505) status="Server Error: HTTP Version Not Supported" ;;
|
||
|
*) echo " !! httpstatus: status not defined." && safeExit ;;
|
||
|
esac
|
||
|
|
||
|
|
||
|
# _______________ MAIN
|
||
|
case ${flag} in
|
||
|
--status) echo "${code} ${status}" ;;
|
||
|
-s) echo "${code} ${status}" ;;
|
||
|
--code) echo "${code}" ;;
|
||
|
-c) echo "${code}" ;;
|
||
|
*) echo " !! httpstatus: bad flag" && safeExit;;
|
||
|
esac
|
||
|
|
||
|
IFS="${saveIFS}"
|
||
|
}
|
||
|
|
||
|
function makeCSV() {
|
||
|
# Creates a new CSV file if one does not already exist.
|
||
|
# Takes passed arguments and writes them as a header line to the CSV
|
||
|
# Usage 'makeCSV column1 column2 column3'
|
||
|
|
||
|
# Set the location and name of the CSV File
|
||
|
if [ -z "${csvLocation}" ]; then
|
||
|
csvLocation="${HOME}/Desktop"
|
||
|
fi
|
||
|
if [ -z "${csvName}" ]; then
|
||
|
csvName="$(LC_ALL=C date +%Y-%m-%d)-${FUNCNAME[1]}.csv"
|
||
|
fi
|
||
|
csvFile="${csvLocation}/${csvName}"
|
||
|
|
||
|
# Overwrite existing file? If not overwritten, new content is added
|
||
|
# to the bottom of the existing file
|
||
|
if [ -f "${csvFile}" ]; then
|
||
|
seek_confirmation "${csvFile} already exists. Overwrite?"
|
||
|
if is_confirmed; then
|
||
|
rm "${csvFile}"
|
||
|
writeCSV "$@"
|
||
|
fi
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
function writeCSV() {
|
||
|
# Takes passed arguments and writes them as a comma separated line
|
||
|
# Usage 'writeCSV column1 column2 column3'
|
||
|
|
||
|
csvInput=($@)
|
||
|
saveIFS=$IFS
|
||
|
IFS=','
|
||
|
echo "${csvInput[*]}" >> "${csvFile}"
|
||
|
IFS=$saveIFS
|
||
|
|
||
|
}
|
||
|
|
||
|
function json2yaml() {
|
||
|
# convert json files to yaml using python and PyYAML
|
||
|
python -c 'import sys, yaml, json; yaml.safe_dump(json.load(sys.stdin), sys.stdout, default_flow_style=False)' < "$1"
|
||
|
}
|
||
|
|
||
|
function yaml2json() {
|
||
|
# convert yaml files to json using python and PyYAML
|
||
|
python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)' < "$1"
|
||
|
}
|