summaryrefslogtreecommitdiffstats
path: root/testing/mozharness/external_tools/download_file.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/mozharness/external_tools/download_file.py')
-rwxr-xr-xtesting/mozharness/external_tools/download_file.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/testing/mozharness/external_tools/download_file.py b/testing/mozharness/external_tools/download_file.py
new file mode 100755
index 000000000..91b0a4668
--- /dev/null
+++ b/testing/mozharness/external_tools/download_file.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+# ***** BEGIN LICENSE BLOCK *****
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this file,
+# You can obtain one at http://mozilla.org/MPL/2.0/.
+# ***** END LICENSE BLOCK *****
+""" Helper script for download_file()
+
+We lose some mozharness functionality by splitting this out, but we gain output_timeout.
+"""
+
+import os
+import socket
+import sys
+import urllib2
+import urlparse
+
+
+def download_file(url, file_name):
+ try:
+ f_length = None
+ f = urllib2.urlopen(url, timeout=30)
+ if f.info().get('content-length') is not None:
+ f_length = int(f.info()['content-length'])
+ got_length = 0
+ local_file = open(file_name, 'wb')
+ while True:
+ block = f.read(1024 ** 2)
+ if not block:
+ if f_length is not None and got_length != f_length:
+ raise urllib2.URLError("Download incomplete; content-length was %d, but only received %d" % (f_length, got_length))
+ break
+ local_file.write(block)
+ if f_length is not None:
+ got_length += len(block)
+ local_file.close()
+ print "%s downloaded to %s" % (url, file_name)
+ except urllib2.HTTPError, e:
+ print "Warning: Server returned status %s %s for %s" % (str(e.code), str(e), url)
+ raise
+ except urllib2.URLError, e:
+ print "URL Error: %s" % url
+ remote_host = urlparse.urlsplit(url)[1]
+ if remote_host:
+ os.system("nslookup %s" % remote_host)
+ raise
+ except socket.timeout, e:
+ print "Timed out accessing %s: %s" % (url, str(e))
+ raise
+ except socket.error, e:
+ print "Socket error when accessing %s: %s" % (url, str(e))
+ raise
+
+if __name__ == '__main__':
+ if len(sys.argv) != 3:
+ if len(sys.argv) != 2:
+ print "Usage: download_file.py URL [FILENAME]"
+ sys.exit(-1)
+ parts = urlparse.urlparse(sys.argv[1])
+ file_name = parts[2].split('/')[-1]
+ else:
+ file_name = sys.argv[2]
+ if os.path.exists(file_name):
+ print "%s exists; removing" % file_name
+ os.remove(file_name)
+ if os.path.exists(file_name):
+ print "%s still exists; exiting"
+ sys.exit(-1)
+ download_file(sys.argv[1], file_name)