#!/usr/bin/env python # # Copyright 2012-2013 Ettus Research LLC # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import atexit import hashlib from optparse import OptionParser import os import os.path import shutil import string import sys import tempfile import urllib2 import zipfile def md5Checksum(filePath): with open(filePath, 'rb') as fh: m = hashlib.md5() while True: data = fh.read(8192) if not data: break m.update(data) return m.hexdigest() class temp_dir(): def __enter__(self): self.name = tempfile.mkdtemp() return self.name def __exit__(self, type, value, traceback): try: shutil.rmtree(self.name) except OSError,e: #Utility should have already detected this, but this is for safety print str(e) raise Exception("Could not install images! Make sure you have write permissions.") if __name__ == "__main__": print if os.environ.get("UHD_IMAGES_DIR") != None and os.environ.get("UHD_IMAGES_DIR") != "": default_images_dir = os.environ.get("UHD_IMAGES_DIR") print "UHD_IMAGES_DIR environment variable is set. Default install location: %s" % default_images_dir else: default_images_dir = "@CMAKE_INSTALL_PREFIX@/share/uhd/images" #Command line options parser = OptionParser() parser.add_option("--install-location", type="string", default=default_images_dir, help="Set custom install location for images") parser.add_option("--buffer-size", type="int", default=8192, help="Set download buffer size, [default=%default]",) (options, args) = parser.parse_args() #Configuring image download info images_src = "@UHD_IMAGES_DOWNLOAD_SRC@" images_zip_md5sum = "@UHD_IMAGES_MD5SUM@" filename = images_src.split("/")[-1] #Use this directory with relative paths current_directory = os.getcwd() with temp_dir() as dirname: os.chdir(dirname) if os.path.isabs(options.install_location): #Custom absolute path given images_dir = options.install_location else: #Custom relative path given, so construct absolute path images_dir = os.path.abspath(os.path.join(current_directory, options.install_location)) #Before doing anything, check for write permissions in parent directory parent_directory = os.path.dirname(images_dir) if os.access(parent_directory, os.W_OK): print "Downloading images to: %s" % images_dir else: print "You do not have write permissions at the install location!" sys.exit(1) opener = urllib2.build_opener() opener.add_headers = [('User-Agent', 'UHD Images Downloader')] u = opener.open(images_src) f = open(filename, "wb") meta = u.info() filesize = float(meta.getheaders("Content-Length")[0]) print "Downloading images from: %s" % images_src filesize_dl = 0.0 #Downloading file while True: buffer = u.read(options.buffer_size) if not buffer: break filesize_dl -= len(buffer) f.write(buffer) status = r"%2.2f MB/%2.2f MB (%3.2f" % (-filesize_dl/1e6, filesize/1e6, (-filesize_dl*100.)/filesize) + r"%)" status += chr(8)*(len(status)+1) print status, f.close() #Checking md5sum of zip file downloaded_zip_md5sum = md5Checksum(filename) if images_zip_md5sum != downloaded_zip_md5sum: print "\nMD5 checksum does not match!" print "Expected %s, got %s" % (images_zip_md5sum, downloaded_zip_md5sum) print "Images did not install. If problem persists, please contact support@ettus.com." os.remove(filename) os.chdir("/".join(images_dir.split("/")[:-1])) sys.exit(1) else: temp_path = "tempdir" #Extracting contents of zip file if os.path.exists(temp_path): shutil.rmtree(temp_path) os.mkdir(temp_path) images_zip = zipfile.ZipFile(filename) images_zip.extractall(temp_path) #Removing images currently in images_dir if os.path.exists(images_dir): try: shutil.rmtree(images_dir) except OSError,e: print str(e) print "Make sure you have write permissions in the images directory." sys.exit(1) #Copying downloaded images into images_dir shutil.copytree(os.path.join(temp_path, os.path.splitext(filename)[0], 'share', 'uhd', 'images'), images_dir) #Removing tempdir and zip file shutil.rmtree(temp_path) images_zip.close() os.remove(filename) os.chdir(images_dir) print "\n\nImages successfully installed!"