| |
| import sys |
| import urlparse |
| import os.path |
| import logging |
| from binascii import a2b_hex |
| from binascii import b2a_hex |
| from hashlib import md5 |
|
|
| import requests |
|
|
|
|
| logger = logging.getLogger(__name__) |
|
|
|
|
| def main(): |
| logging.basicConfig() |
| logger.setLevel(logging.DEBUG) |
|
|
| url = sys.argv[1] |
| dst = sys.argv[2] |
| md5_given = a2b_hex(sys.argv[3]) |
| result = urlparse.urlparse(url) |
|
|
| filename = os.path.basename(result.path) |
|
|
| if not os.path.exists(dst): |
| destination_path = dst |
| logger.debug('%s not exists: destination=%s', dst, destination_path) |
| else: |
| if os.path.isdir(dst): |
| destination_path = os.path.join(dst, filename) |
| logger.debug('%s is a directory: destination=%s', dst, |
| destination_path) |
| else: |
| destination_path = dst |
|
|
| if os.path.exists(destination_path): |
| md5_existing = md5_file(destination_path) |
| if md5_given == md5_existing: |
| logger.debug('%s exists: skipped', destination_path) |
| return |
|
|
| response = requests.get(url, stream=True) |
| response.raise_for_status() |
| with open(destination_path, 'wb') as f: |
| copy_stream(response.raw, f) |
|
|
| md5_downloaded = md5_file(destination_path) |
| if md5_given != md5_downloaded: |
| logger.error('md5 not match: %s', b2a_hex(md5_downloaded)) |
| raise SystemExit(1) |
|
|
|
|
| def copy_stream(src, dst): |
| while True: |
| data = src.read(16384) |
| if len(data) == 0: |
| break |
| dst.write(data) |
|
|
|
|
| def md5_file(path): |
| with open(path, 'rb') as f: |
| m = md5('') |
| while True: |
| data = f.read(16384) |
| if len(data) == 0: |
| break |
| m.update(data) |
| return m.digest() |
|
|