| 29 | |
| 30 | class ZoneInfoFile(object): |
| 31 | def __init__(self, zonefile_stream=None): |
| 32 | if zonefile_stream is not None: |
| 33 | with TarFile.open(fileobj=zonefile_stream) as tf: |
| 34 | self.zones = {zf.name: tzfile(tf.extractfile(zf), filename=zf.name) |
| 35 | for zf in tf.getmembers() |
| 36 | if zf.isfile() and zf.name != METADATA_FN} |
| 37 | # deal with links: They'll point to their parent object. Less |
| 38 | # waste of memory |
| 39 | links = {zl.name: self.zones[zl.linkname] |
| 40 | for zl in tf.getmembers() if |
| 41 | zl.islnk() or zl.issym()} |
| 42 | self.zones.update(links) |
| 43 | try: |
| 44 | metadata_json = tf.extractfile(tf.getmember(METADATA_FN)) |
| 45 | metadata_str = metadata_json.read().decode('UTF-8') |
| 46 | self.metadata = json.loads(metadata_str) |
| 47 | except KeyError: |
| 48 | # no metadata in tar file |
| 49 | self.metadata = None |
| 50 | else: |
| 51 | self.zones = {} |
| 52 | self.metadata = None |
| 53 | |
| 54 | def get(self, name, default=None): |
| 55 | """ |