Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Require TMPDIR env var
Tom Scavo committed May 7, 2017
1 parent 0bcc6b9 commit 52766f6
Showing 1 changed file with 67 additions and 75 deletions.
142 changes: 67 additions & 75 deletions bin/cget.sh
@@ -36,11 +36,6 @@ display_help () {
requests the resource at the given URL using the curl
command-line tool.
This script requires two environment variables. CACHE_DIR is
the absolute path to the cache directory (which may or may not
exist) whereas LIB_DIR specifies a directory containing various
helper scripts.
Options:
-h Display this help message
-v Log verbose messages
@@ -62,6 +57,19 @@ display_help () {
it is output on stdout, otherwise the script silently fails
with exit code 1.
ENVIRONMENT
This script leverages a handful of environment variables:
LIB_DIR A source library directory
CACHE_DIR A persistent HTTP cache
TMPDIR A temporary directory
LOG_FILE A persistent log file
LOG_LEVEL The global log level [0..5]
All of the above environment variables are REQUIRED
except LOG_LEVEL, which defaults to LOG_LEVEL=3.
LIBRARY
Environment variable LIB_DIR specifies a directory containing at
@@ -72,10 +80,10 @@ display_help () {
EXAMPLES
url=http://md.incommon.org/InCommon/InCommon-metadata.xml
${0##*/} \$url # Retrieve the resource using HTTP conditional GET
${0##*/} -F \$url # Enable Force Output Mode
${0##*/} -C \$url # Enable Cache Only Mode
\$ url=http://md.incommon.org/InCommon/InCommon-metadata.xml
\$ ${0##*/} \$url # Retrieve the resource using HTTP conditional GET
\$ ${0##*/} -F \$url # Enable Force Output Mode
\$ ${0##*/} -C \$url # Enable Cache Only Mode
HELP_MSG
}

@@ -85,78 +93,48 @@ HELP_MSG

script_name=${0##*/} # equivalent to basename $0

# determine the source lib directory
if [ -z "$LIB_DIR" ]; then
echo "ERROR: $script_name requires env var LIB_DIR" >&2
exit 2
fi
if [ ! -d "$LIB_DIR" ]; then
echo "ERROR: $script_name: directory does not exist: $LIB_DIR" >&2
exit 2
fi

# library filenames (always list core_lib first)
LIB_FILENAMES="core_lib.sh
http_tools.sh"
# required directories
env_vars="LIB_DIR
CACHE_DIR
TMPDIR"

# source lib files
for lib_filename in $LIB_FILENAMES; do
lib_file="$LIB_DIR/$lib_filename"
if [ ! -f "$lib_file" ]; then
echo "ERROR: $script_name: lib file does not exist: $lib_file" >&2
# check required directories
for env_var in $env_vars; do
eval "env_var_val=\${$env_var}"
if [ -z "$env_var_val" ]; then
echo "ERROR: $script_name requires env var $env_var" >&2
exit 2
fi
source "$lib_file"
status_code=$?
if [ $status_code -ne 0 ]; then
echo "ERROR: $script_name failed to source lib file ($status_code) $lib_file" >&2
if [ ! -d "$env_var_val" ]; then
echo "ERROR: $script_name: directory does not exist: $env_var_val" >&2
exit 2
fi
done

# If env var TMPDIR exists, use it; otherwise
# create a new TMPDIR and use that instead.
if [ -z "$TMPDIR" ] || [ ! -d "$TMPDIR" ]; then
# create temporary directory
TMPDIR="$( make_temp_file -d )"
if [ ! -d "$TMPDIR" ] ; then
printf "ERROR: $script_name unable to create temporary dir\n" >&2
exit 2
fi
fi

# use TMPDIR directory (remove trailing slash)
tmp_dir="${TMPDIR%%/}/${script_name%%.*}_$$"

# every run of this script gets its own subdir
if [ -d "$tmp_dir" ]; then
echo "ERROR: $script_name: directory already exists: $tmp_dir" >&2
# check the log file
if [ -z "$LOG_FILE" ]; then
echo "ERROR: $script_name requires env var LOG_FILE" >&2
exit 2
fi

# determine the cache directory
if [ -z "$CACHE_DIR" ]; then
echo "ERROR: $script_name requires env var CACHE_DIR" >&2
# devices such as /dev/tty and /dev/null are allowed
if [ ! -f "$LOG_FILE" ] && [[ $LOG_FILE != /dev/* ]]; then
echo "ERROR: $script_name: file does not exist: $LOG_FILE" >&2
exit 2
fi
if [ ! -d "$CACHE_DIR" ]; then
/bin/mkdir "$CACHE_DIR"
status_code=$?
if [ $status_code -ne 0 ]; then
echo "ERROR: $script_name failed to create dir $CACHE_DIR ($status_code)" >&2
exit 2
fi
fi

#######################################################################
# Process command-line options and arguments
#######################################################################

# default to INFO logging
if [ -z "$LOG_LEVEL" ]; then
LOG_LEVEL=3
fi

# library filenames (always list core_lib first)
LIB_FILENAMES="core_lib.sh
http_tools.sh"

#######################################################################
# Process command-line options and arguments
#######################################################################

help_mode=false; local_opts=
while getopts ":hvqFC" opt; do
case $opt in
@@ -204,33 +182,47 @@ location="$1"
# Initialization
#######################################################################

# create temporary subdirectory
# source lib files
for lib_filename in $LIB_FILENAMES; do
lib_file="$LIB_DIR/$lib_filename"
if [ ! -f "$lib_file" ]; then
echo "ERROR: $script_name: lib file does not exist: $lib_file" >&2
exit 2
fi
source "$lib_file"
status_code=$?
if [ $status_code -ne 0 ]; then
echo "ERROR: $script_name failed ($status_code) to source lib file $lib_file" >&2
exit 2
fi
done

# create a temporary subdirectory
tmp_dir="${TMPDIR%%/}/${script_name%%.*}_$$"
/bin/mkdir "$tmp_dir"
status_code=$?
if [ $status_code -ne 0 ]; then
echo "ERROR: $script_name failed to create tmp dir ($status_code) $tmp_dir" >&2
echo "ERROR: $script_name failed ($status_code) to create tmp dir $tmp_dir" >&2
exit 2
fi
print_log_message -D "$script_name creating temp dir: $tmp_dir"

# temporary file
tmp_file="${tmp_dir}/http_resource_$$"
tmp_file="${tmp_dir}/http_resource"

#######################################################################
# Main processing
#######################################################################

# Functions print_log_message and clean_up_and_exit defined in core_lib.sh
# Function conditional_get defined in http_tools.sh

print_log_message "$script_name requesting resource: $location"
# Functions print_log_message and clean_up_and_exit are defined in core_lib.sh
# Function conditional_get is defined in http_tools.sh

# get the resource
print_log_message -I "$script_name requesting resource: $location"
conditional_get $local_opts -d "$CACHE_DIR" -T "$tmp_dir" "$location" > "$tmp_file"
status_code=$?
if [ $status_code -ne 0 ]; then
if [ $status_code -gt 1 ]; then
echo "ERROR: $script_name failed to get resource ($status_code): $location" >&2
print_log_message -E "$script_name failed ($status_code) on location: $location"
fi
clean_up_and_exit -d "$tmp_dir" $status_code
fi
@@ -239,8 +231,8 @@ fi
/bin/cat "$tmp_file"
status_code=$?
if [ $status_code -ne 0 ]; then
echo "ERROR: $script_name unable to cat output ($status_code)" >&2
clean_up_and_exit -d "$tmp_dir" 3
print_log_message -E "$script_name: cat failed ($status_code)"
clean_up_and_exit -d "$tmp_dir" $status_code
fi

clean_up_and_exit -d "$tmp_dir" 0

0 comments on commit 52766f6

Please sign in to comment.