def __init__(self, ip_address=None, port=0, verbose=False): super(InternalTftp, self).__init__() self.daemon = True self.tftp_dir = temp_dir() self.verbose = verbose self.server = TftpServer(tftproot=self.tftp_dir) self.ip_address = ip_address self.port = port self.start() # Get the port we actually hosted on if port == 0: deadline = datetime.now() + timedelta(seconds=10) while datetime.now() < deadline: try: self.port = self.server.sock.getsockname()[1] break except (AttributeError, socket.error): pass else: # don't catch the error on our last attempt self.port = self.server.sock.getsockname()[1]
def __init__(self, filename=None): """Default constructor for the FirmwarePackage class.""" self.images = [] self.version = None self.config = None self.required_socman_version = None self.work_dir = temp_dir() if filename: # Extract files and read config try: tarfile.open(filename, "r").extractall(self.work_dir) except (IOError, tarfile.ReadError): raise ValueError("%s is not a valid tar.gz file" % os.path.basename(filename)) config = ConfigParser.SafeConfigParser() if len(config.read(self.work_dir + "/MANIFEST")) == 0: raise ValueError("%s is not a valid firmware package" % os.path.basename(filename)) if "package" in config.sections(): required_cxmanage_version = config.get( "package", "required_cxmanage_version" ) if (pkg_resources.parse_version(cxmanage_api.__version__) < pkg_resources.parse_version(required_cxmanage_version)): # @todo: CxmanageVersionError? raise ValueError( "%s requires cxmanage version %s or later." % (filename, required_cxmanage_version) ) if config.has_option("package", "required_socman_version"): self.required_socman_version = config.get("package", "required_socman_version") if config.has_option("package", "firmware_version"): self.version = config.get("package", "firmware_version") if config.has_option("package", "firmware_config"): self.config = config.get("package", "firmware_config") # Add all images from package image_sections = [x for x in config.sections() if x != "package"] for section in image_sections: filename = "%s/%s" % (self.work_dir, section) image_type = config.get(section, "type").upper() simg = None daddr = None skip_crc32 = False version = None # Read image options from config if config.has_option(section, "simg"): simg = config.getboolean(section, "simg") if config.has_option(section, "daddr"): daddr = int(config.get(section, "daddr"), 16) if config.has_option(section, "skip_crc32"): skip_crc32 = config.getboolean(section, "skip_crc32") if config.has_option(section, "versionstr"): version = config.get(section, "versionstr") self.images.append(Image(filename, image_type, simg, daddr, skip_crc32, version))