Adds some useful util bash functions
This commit is contained in:
parent
fc2ea10d47
commit
c02e14dcfc
1 changed files with 760 additions and 0 deletions
760
bin/.local/share/lib/utilFunctions.sh
Normal file
760
bin/.local/share/lib/utilFunctions.sh
Normal file
|
@ -0,0 +1,760 @@
|
|||
#!/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"
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue