2019-01-05 20:27:22 -06:00
|
|
|
#!/bin/sh
|
|
|
|
##############################
|
|
|
|
# name: gendl
|
|
|
|
# lisc: gnu gplv3
|
|
|
|
# desc: download to stdout or
|
|
|
|
# file, independent of
|
|
|
|
# a specific downloader.
|
|
|
|
# ftp/wget/curl support.
|
|
|
|
# main: jadedctrl
|
|
|
|
##############################
|
|
|
|
|
|
|
|
# usage: gendl [-o output] url
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#---------------------------------------
|
|
|
|
# backend bits
|
|
|
|
|
|
|
|
# NIL --> STRING
|
|
|
|
# return the download program you're using
|
|
|
|
function download_program
|
|
|
|
{
|
|
|
|
programs="ftp curl wget"
|
|
|
|
current=""
|
|
|
|
|
|
|
|
for program in $programs
|
|
|
|
do
|
|
|
|
if whereis $program > /dev/null
|
|
|
|
then
|
|
|
|
current=$program
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
if uname -s | grep -e "LibertyBSD" -e "OpenBSD" > /dev/null
|
|
|
|
then
|
|
|
|
current="ftp"
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "$current"
|
|
|
|
}
|
|
|
|
|
|
|
|
# STRING PATH --> NIL
|
|
|
|
# download URL $1 to stdout
|
|
|
|
function download_stdout
|
|
|
|
{
|
|
|
|
program=$(download_program)
|
|
|
|
url=$1
|
|
|
|
|
|
|
|
case "$program" in
|
|
|
|
"ftp")
|
|
|
|
output="$(ftp -VMo- $url)"
|
|
|
|
;;
|
|
|
|
"curl")
|
|
|
|
output="$(curl $url)"
|
|
|
|
;;
|
|
|
|
"wget")
|
2019-01-21 16:15:46 -06:00
|
|
|
output="$(wget --quiet -O- $url)"
|
2019-01-05 20:27:22 -06:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
return_code=$?
|
|
|
|
|
|
|
|
echo "$output"
|
|
|
|
return $return_code
|
|
|
|
}
|
|
|
|
|
|
|
|
# STRING PATH --> NIL
|
|
|
|
# download URL $1 to path $2
|
|
|
|
function download_file
|
|
|
|
{
|
|
|
|
program=$(download_program)
|
|
|
|
url=$1
|
|
|
|
path=$2
|
|
|
|
|
|
|
|
case "$program" in
|
|
|
|
"ftp")
|
|
|
|
ftp -VMU "." -o $path $url
|
|
|
|
;;
|
|
|
|
"curl")
|
|
|
|
curl -o $path $url
|
|
|
|
;;
|
|
|
|
"wget")
|
|
|
|
wget --quiet -O $path $url
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
return_code=$?
|
|
|
|
|
2019-01-21 16:15:46 -06:00
|
|
|
if test $return_code -ne 0 2>/dev/null
|
2019-01-05 20:27:22 -06:00
|
|
|
then
|
|
|
|
rm $path 2> /dev/null
|
|
|
|
# for consistency in behavior; wget saves 404s anyway, whereas
|
|
|
|
# ftp doesn't save anything from 404s, etc.
|
|
|
|
fi
|
|
|
|
|
|
|
|
return $return_code
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------------
|
|
|
|
# front-end string-manip
|
|
|
|
|
|
|
|
# STRING --> STRING
|
|
|
|
# return the last word in a string
|
|
|
|
function last_word
|
|
|
|
{
|
|
|
|
string="$1"
|
|
|
|
|
|
|
|
echo "$string" \
|
|
|
|
| rev \
|
|
|
|
| sed 's% .*%%' \
|
|
|
|
| rev
|
|
|
|
}
|
|
|
|
|
|
|
|
function usage
|
|
|
|
{
|
|
|
|
echo "usage: gendl [-o output] URL"
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------------
|
|
|
|
# invocation
|
|
|
|
|
|
|
|
args="$(getopt o: $*)"
|
2019-01-21 16:15:46 -06:00
|
|
|
if test -z "$@" 2>/dev/null
|
2019-01-05 20:27:22 -06:00
|
|
|
then
|
|
|
|
usage
|
|
|
|
exit 2
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
set -- $args
|
|
|
|
while test $# -ne 0
|
|
|
|
do
|
|
|
|
case "$1"
|
|
|
|
in
|
|
|
|
-o)
|
|
|
|
download_path="$2"; shift; shift;;
|
|
|
|
--)
|
|
|
|
shift; break;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
url="$(last_word "$@")"
|
|
|
|
|
|
|
|
|
2019-01-21 16:15:46 -06:00
|
|
|
if test -n "$download_path" 2> /dev/null
|
2019-01-05 20:27:22 -06:00
|
|
|
then
|
|
|
|
download_file $url $download_path
|
|
|
|
else
|
|
|
|
download_stdout "$url"
|
|
|
|
fi
|