diff --git a/s4cmd.py b/s4cmd.py index bcdf982..a4b0fb5 100755 --- a/s4cmd.py +++ b/s4cmd.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/python3.10 # # Copyright 2012-2018 BloomReach, Inc. @@ -60,8 +60,8 @@ def cmp(a, b): TEMP_FILES = set() # Environment variable names for S3 credentials. -S3_ACCESS_KEY_NAME = "AWS_ACCESS_KEY_ID" -S3_SECRET_KEY_NAME = "AWS_SECRET_ACCESS_KEY" +S3_ACCESS_KEY_NAME = "S3_ACCESS_KEY" +S3_SECRET_KEY_NAME = "S3_SECRET_KEY" S4CMD_ENV_KEY = "S4CMD_OPTS" @@ -271,9 +271,13 @@ class BotoClient(object): S3RetryableErrors = ( socket.timeout, socket.error if IS_PYTHON2 else ConnectionError, - botocore.vendored.requests.packages.urllib3.exceptions.ReadTimeoutError, botocore.exceptions.IncompleteReadError ) + try: + # Newer boto removed botocore.vendored entirely. + S3RetryableErrors += (botocore.vendored.requests.packages.urllib3.exceptions.ReadTimeoutError,) + except AttributeError: + pass # List of API functions we use in s4cmd. ALLOWED_CLIENT_METHODS = [ @@ -655,7 +659,7 @@ def s3_keys_from_s3cfg(opt): config = ConfigParser.ConfigParser() config.read(s3cfg_path) keys = config.get("default", "access_key"), config.get("default", "secret_key") - debug("read S3 keys from %s file", s3cfg_path) + debug("read S3 keys from $HOME/.s3cfg file") return keys except Exception as e: info("could not read S3 keys from %s file; skipping (%s)", s3cfg_path, e) @@ -1158,7 +1162,7 @@ def partial_match(self, path, filter_path): fi = filter_path.split(PATH_SEP) # Here, if we are in recursive mode, we allow the pi to be longer than fi. - # Otherwise, length of pi should be equal or less than the length of fi. + # Otherwise, length of pi should be equal or less than the lenght of fi. min_len = min(len(pi), len(fi)) matched = fnmatch.fnmatch(PATH_SEP.join(pi[0:min_len]), PATH_SEP.join(fi[0:min_len])) return matched and (self.opt.recursive or len(pi) <= len(fi))