def __init__(self, in_dir, out_dir, out_name, send_to, db, profiles, format='bz2', overwrite=False): self.store = FileStore(in_dir) self.out_dir = out_dir self.out_name = out_name self.send_to = send_to self.format = format self.overwrite = overwrite self.seeddb = db self.profiles = profiles if format not in ('directory', 'tar', 'gzip', 'bz2'): raise Exception('unknown format: %s' % self.format)
def __init__(self, in_dir, out_dir, out_name, send_to, db, profiles, format = 'bz2', overwrite = False): self.store = FileStore(in_dir) self.out_dir = out_dir self.out_name = out_name self.send_to = send_to self.format = format self.overwrite = overwrite self.seeddb = db self.profiles = profiles if format not in ('directory', 'tar', 'gzip', 'bz2'): raise Exception('unknown format: %s' % self.format)
class Packager(object): def __init__(self, in_dir, out_dir, out_name, send_to, db, profiles, format = 'bz2', overwrite = False): self.store = FileStore(in_dir) self.out_dir = out_dir self.out_name = out_name self.send_to = send_to self.format = format self.overwrite = overwrite self.seeddb = db self.profiles = profiles if format not in ('directory', 'tar', 'gzip', 'bz2'): raise Exception('unknown format: %s' % self.format) def describe(self): outpath = os.path.join(self.out_dir, self.out_name) if self.format == 'directory': descr = 'Export a directory to %s' % outpath else: descr = 'Create a %s package at %s' % (self.format, outpath) for handler in self.send_to: descr += '. ' + handler.describe() return descr def get_seedhost_from_name(self, name): host = self.seeddb.get_host(name = name) if not host: raise Exception('unknown host: %s' % name) return host def _mktar(self, dirname): filename = os.path.join(self.out_dir, self.out_name) if self.overwrite and os.path.exists(filename): os.remove(filename) if self.format == 'tar': tar = tarfile.open(filename, 'w', dereference = True) elif self.format == 'gzip': tar = tarfile.open(filename, 'w:gz', dereference = True) elif self.format == 'bz2': tar = tarfile.open(filename, 'w:bz2', dereference = True) else: raise Exception('unknown tar format: %s' % self.format) for dir in os.listdir(dirname): subdir = os.path.join(dirname, dir) tar.add(subdir, dir) tar.close() def run(self, logger, order): tmp_dir = mkdtemp() for host in get_hosts_from_etree(order.xml): seedhost = self.get_seedhost_from_name(host.get_name()) address = seedhost.get_address() hostname = seedhost.get_name() dst_path = host.get('path')[0] dst_dir = os.path.join(tmp_dir, dst_path) vars = {'hostname': hostname, 'address': address, 'os': seedhost.get('os')} profile = None for profile in self.profiles: if not profile.test_condition(vars): continue logger.info(hostname + ': Selected profile is ' + profile.name) for name, from_name in profile.files: logger.info('%s: %s -> %s' % (hostname, from_name, name)) src = self.store.get_alias(seedhost, from_name) if src is None: logger.info(hostname + ': %s not found' % from_name) continue dst = os.path.join(dst_dir, name) dst = dst.replace('{address}', address) dst = dst.replace('{hostname}', hostname) if os.path.exists(src): if not os.path.exists(dst_dir): os.makedirs(dst_dir) os.symlink(src, dst) else: logger.info(hostname + ': %s does not exist.' % src) break if profile is None: logger.info(hostname + ': No profile! ' + repr(vars)) path = os.path.join(self.out_dir, self.out_name) if self.format == 'directory': if not os.path.exists(path): os.makedirs(path) if self.overwrite: for file in os.listdir(path): file = os.path.join(path, file) rmtree(file) for file in os.listdir(tmp_dir): file = os.path.join(tmp_dir, file) move(file, path) else: self._mktar(tmp_dir) rmtree(tmp_dir) for handler in self.send_to: handler.send(path)
class Packager(object): def __init__(self, in_dir, out_dir, out_name, send_to, db, profiles, format='bz2', overwrite=False): self.store = FileStore(in_dir) self.out_dir = out_dir self.out_name = out_name self.send_to = send_to self.format = format self.overwrite = overwrite self.seeddb = db self.profiles = profiles if format not in ('directory', 'tar', 'gzip', 'bz2'): raise Exception('unknown format: %s' % self.format) def describe(self): outpath = os.path.join(self.out_dir, self.out_name) if self.format == 'directory': descr = 'Export a directory to %s' % outpath else: descr = 'Create a %s package at %s' % (self.format, outpath) for handler in self.send_to: descr += '. ' + handler.describe() return descr def get_seedhost_from_name(self, name): host = self.seeddb.get_host(name=name) if not host: raise Exception('unknown host: %s' % name) return host def _mktar(self, dirname): filename = os.path.join(self.out_dir, self.out_name) if self.overwrite and os.path.exists(filename): os.remove(filename) if self.format == 'tar': tar = tarfile.open(filename, 'w', dereference=True) elif self.format == 'gzip': tar = tarfile.open(filename, 'w:gz', dereference=True) elif self.format == 'bz2': tar = tarfile.open(filename, 'w:bz2', dereference=True) else: raise Exception('unknown tar format: %s' % self.format) for dir in os.listdir(dirname): subdir = os.path.join(dirname, dir) tar.add(subdir, dir) tar.close() def run(self, logger, order): tmp_dir = mkdtemp() for host in get_hosts_from_etree(order.xml): seedhost = self.get_seedhost_from_name(host.get_name()) address = seedhost.get_address() hostname = seedhost.get_name() dst_path = host.get('path')[0] dst_dir = os.path.join(tmp_dir, dst_path) vars = { 'hostname': hostname, 'address': address, 'os': seedhost.get('os') } profile = None for profile in self.profiles: if not profile.test_condition(vars): continue logger.info(hostname + ': Selected profile is ' + profile.name) for name, from_name in profile.files: logger.info('%s: %s -> %s' % (hostname, from_name, name)) src = self.store.get_alias(seedhost, from_name) if src is None: logger.info(hostname + ': %s not found' % from_name) continue dst = os.path.join(dst_dir, name) dst = dst.replace('{address}', address) dst = dst.replace('{hostname}', hostname) if os.path.exists(src): if not os.path.exists(dst_dir): os.makedirs(dst_dir) os.symlink(src, dst) else: logger.info(hostname + ': %s does not exist.' % src) break if profile is None: logger.info(hostname + ': No profile! ' + repr(vars)) path = os.path.join(self.out_dir, self.out_name) if self.format == 'directory': if not os.path.exists(path): os.makedirs(path) if self.overwrite: for file in os.listdir(path): file = os.path.join(path, file) rmtree(file) for file in os.listdir(tmp_dir): file = os.path.join(tmp_dir, file) move(file, path) else: self._mktar(tmp_dir) rmtree(tmp_dir) for handler in self.send_to: handler.send(path)