X-Git-Url: http://git.hcoop.net/clinton/scripts.git/blobdiff_plain/c347f520dc81ad39fe1657c8bb291546852d97ad..86a0f2e2d64c035e30dc4dc9634de8b1fb1e5c39:/s3 diff --git a/s3 b/s3 index aa6a075..6b36ed6 100755 --- a/s3 +++ b/s3 @@ -3,7 +3,10 @@ # Licensed under the terms of the GNU GPL v2 # Copyright 2007 Victor Lowther +CURL=/home/mwolson_admin/bin/curl HMAC=$(dirname $0)/s3-hmac +ATTEMPTS=7 +ATTEMPT_WAIT=1m # print a message and bail die() { @@ -46,7 +49,7 @@ check_hmac() { } check_deps() { - check_dep openssl date cat grep curl + check_dep openssl date cat grep check_hmac check_s3 } @@ -122,12 +125,14 @@ s3_curl() { # $2 = remote bucket. # $3 = remote name # $4 = local name. - local bucket remote date sig md5 arg inout headers + # $5 = bandwidth limit. + local bucket remote date sig md5 arg inout headers tries ret # header handling is kinda fugly, but it works. bucket="${2:+/${2}}/" # slashify the bucket remote="$(urlenc "${3}")" # if you don't, strange things may happen. stdopts="--connect-timeout 10 --fail --silent" [[ $CURL_S3_DEBUG == true ]] && stdopts="${stdopts} --show-error --fail" + test -n "${5}" && stdopts="${stdopts} --limit-rate ${5}" case "${1}" in GET) arg="-o" inout="${4:--}" # stdout if no $4 ;; @@ -154,16 +159,29 @@ s3_curl() { headers[${#headers[@]}]="Authorization: AWS ${S3_ACCESS_KEY_ID}:${sig}" headers[${#headers[@]}]="Date: ${date}" [[ ${md5} ]] && headers[${#headers[@]}]="Content-MD5: ${md5}" - curl ${arg} "${inout}" ${stdopts} -K <(curl_headers "${headers[@]}") \ + tries=0 + while true; do + $CURL ${arg} "${inout}" ${stdopts} -K <(curl_headers "${headers[@]}") \ "http://s3.amazonaws.com${bucket}${remote}" - return $? + ret=$? + test $ret -eq 0 && break; + if test $tries -lt $ATTEMPTS; then + tries=$(expr $tries + 1) + echo "Retrying ..." + sleep $ATTEMPT_WAIT + else + break + fi + done + return $ret } s3_put() { # $1 = remote bucket to put it into # $2 = remote name to put # $3 = file to put. This must be present if $2 is. - s3_curl PUT "${1}" "${2}" "${3:-${2}}" + # $4 = bandwidth limit. + s3_curl PUT "${1}" "${2}" "${3:-${2}}" "${4}" return $? } @@ -172,7 +190,8 @@ s3_get() { # $2 = remote file to get # $3 = local file to get into. Will be overwritten if it exists. # If this contains a path, that path must exist before calling this. - s3_curl GET "${1}" "${2}" "${3:-${2}}" + # $4 = bandwidth limit. + s3_curl GET "${1}" "${2}" "${3:-${2}}" "${4}" return $? }