cm: Add a wrapper script for Curl which acts like wget

* Lots of stuff in the wild actually uses wget, and Toybox doesn't
   provide it. We already have Curl which does the same thing just
   with some different arguments. This wrapper script can handle it.

Change-Id: Ic02da709fcd29808b96fabcd1ac4ddd9465f635f
This commit is contained in:
Steve Kondik 2015-11-14 23:56:10 +01:00
parent 8bc283d735
commit d91ddb53a8
3 changed files with 195 additions and 0 deletions

View File

@ -27,4 +27,5 @@ PRODUCT_PACKAGES += \
unrar \
unzip \
vim \
wget \
zip

View File

@ -0,0 +1,10 @@
LOCAL_PATH := $(call my-dir)
# a wrapper for curl which provides wget syntax, for compatibility
include $(CLEAR_VARS)
LOCAL_MODULE := wget
LOCAL_SRC_FILES := bin/wget
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
include $(BUILD_PREBUILT)

184
prebuilt/common/bin/wget Executable file
View File

@ -0,0 +1,184 @@
#!/system/bin/sh
# wget-curl, a curl wrapper acting as a wget drop-in replacement - version git-HEAD
# Usage: wget [wget args] [i need to fill this in later] <url(s)>
# Download all URLs given using curl, but using wget's options.
#
#
# End of help.
# Copyright (c) 2015 Kylie McClain <somasis@exherbo.org>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# End of copyright.
#
set -o pipefail
shopt -u shift_verbose >/dev/null 2>&1
help() {
sed -n '/^#/!d;s/^# //;s/^#//;3,${p;}' "$0" | \
while IFS= read help_line;do
if [[ "$help_line" == "End of help." ]];then
exit 0
else
printf "%s\n" "$help_line"
fi
done
exit 0
}
version() {
sed 's/^# //;s/, .* - version / /;2q;$!d' "$0"
copyright
exit 0
}
copyright() {
sed -n '/^#/!d;s/^# //;s/^#//;/End of help./,${p;}' "$0" | \
while IFS= read copyright_line;do
if [[ "$copyright_line" == "End of help." ]];then
true
elif [[ "$copyright_line" == "End of copyright." ]];then
break
else
printf '%s\n' "$copyright_line"
fi
done
}
stderr() {
printf "$@" >&2
}
error() {
stderr "$0: $1\n"
exit "$2"
}
invalid_arg() {
error "invalid option -- '$1'" 2
}
append_opt() {
for opt in $@;do
CURL_OPTS="${CURL_OPTS} ${opt}"
done
}
curl() {
eval "command curl $@ ${CURL_RAW}"
}
append_raw_arg() {
CURL_RAW="$CURL_RAW $@"
}
has_opt() { # exit 0 if CURL_OPTS has arg, non-zero if doesn't
if [[ "$CURL_OPTS" == *" $1"* ]];then
return 0
else
return 1
fi
}
reexec_without() { # download afterwards without $1 in OPTS
reexec_args_without="$reexec_args_without $@"
reexec=1
}
reexec_only() {
for arg in $@;do
CURL_OPTS_REEXEC_ONLY="${CURL_OPTS_REEXEC_ONLY} $arg"
done
}
print_url() {
has_opt -s || printf "%s\n" "$1"
}
# 46ABDFHIKLNOPQRSTUVXabcdhiklm nH nc nd np nv opqrtvwx
while getopts ':46ABDFHIKLNO:PQRST:U:VXa:bcdhiklmopqrtvwx' argument "$@";do
case "$argument" in
# a lot of these are noop right now because they are wget mirror args
# which curl doesn't really do, and i am not sure if i should implement them
4) append_opt -4 ;;
6) append_opt -6 ;;
A) true ;; # probably can't implement this easily...
B) true ;;
D) true ;;
E) true ;;
F) true ;; # curl doesn't care what the input is
H) true ;;
I) true ;;
K) true ;;
L) true ;;
N) true ;;
O) append_opt "-o $OPTARG" ;;
P) true ;;
Q) true ;;
R) true ;;
S) append_opt -I;reexec_without -I -s ;;
T) append_opt "-m $OPTARG" ;;
U) append_opt "--user-agent \"$OPTARG\"" ;;
V) version; curl --version; exit 0 ;;
X) true ;;
a) append_raw_arg "2>&1 | tee -a $OPTARG" ;;
b)
wget_log="wget-log"
i=1
while [[ -f "${wget_log}" ]];do
# if that exists, increment until we find something that doesn't
i=$(($i+1))
wget_log="wget-log.${i}"
done
append_raw_arg ">\"$wget_log\" 2>&1 &"
printf "Continuing in background, pid %s.\nOutput will be written to '$wget_log'.\n" "$$"
;;
c) append_opt "-C -" ;;
d) append_opt "-v" ;;
e) true ;;
h) help ;;
i)
[[ ! -f "$OPTARG" ]] && error "$OPTARG does not exist" 3
for url in $(<"$OPTARG");do
URLS=( ${URLS[@]} "$url" )
done
;;
q) append_opt "-s" ;;
esac
shift $(($OPTIND-1))
done
# set wget default equivilants
append_opt -L # follow redirects
append_opt -# # progress bar
if [[ -z "${URLS[@]}" ]];then
URLS=( ${@} )
fi
for url in ${URLS[@]};do
url_file=${url##*/}
if [[ "$url" == "$url_file" ]];then
# has no remote file name and -o is not in CURL_OPTS... assume index.html
has_opt -o || append_opt "-o index.html"
fi
eval "print_url '$url';curl ${CURL_OPTS} -- $url"
if [[ "$reexec" ]];then
for reexec_arg in ${reexec_args_without};do
CURL_OPTS_REEXEC=$(echo "${CURL_OPTS_REEXEC:-$CURL_OPTS}" | sed "s# $reexec_arg##")
done
eval "print_url '$url';curl ${CURL_OPTS_REEXEC} ${CURL_OPTS_REEXEC_ONLY} -- $url"
fi
done