From d91ddb53a86f64d86cccad560122dbee38232c90 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sat, 14 Nov 2015 23:56:10 +0100 Subject: [PATCH] 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 --- config/common_full.mk | 1 + prebuilt/common/Android.mk | 10 ++ prebuilt/common/bin/wget | 184 +++++++++++++++++++++++++++++++++++++ 3 files changed, 195 insertions(+) create mode 100644 prebuilt/common/Android.mk create mode 100755 prebuilt/common/bin/wget diff --git a/config/common_full.mk b/config/common_full.mk index 72b423a1..0a8bd850 100644 --- a/config/common_full.mk +++ b/config/common_full.mk @@ -27,4 +27,5 @@ PRODUCT_PACKAGES += \ unrar \ unzip \ vim \ + wget \ zip diff --git a/prebuilt/common/Android.mk b/prebuilt/common/Android.mk new file mode 100644 index 00000000..f15b178c --- /dev/null +++ b/prebuilt/common/Android.mk @@ -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) diff --git a/prebuilt/common/bin/wget b/prebuilt/common/bin/wget new file mode 100755 index 00000000..1d04de54 --- /dev/null +++ b/prebuilt/common/bin/wget @@ -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] +# Download all URLs given using curl, but using wget's options. +# +# +# End of help. +# Copyright (c) 2015 Kylie McClain +# +# 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