def __init__(self, path): path = Path(path) size = None if path.exists(): if path.is_link(): self.comment = "Link to %s" % path.read_link(absolute=True) elif path.is_dir(): self.comment = "Directory" else: size = path.size() self.comment = hsize(size) File.__init__(self, path, size)
def print_info(args): """Writes out some information about a pack file. """ pack = Path(args.pack[0]) # Loads config runs, packages, other_files = config = load_config(pack) inputs_outputs = config.inputs_outputs pack_total_size = 0 pack_total_paths = 0 pack_files = 0 pack_dirs = 0 pack_symlinks = 0 pack_others = 0 rpz_pack = RPZPack(pack) for m in rpz_pack.list_data(): pack_total_size += m.size pack_total_paths += 1 if m.isfile(): pack_files += 1 elif m.isdir(): pack_dirs += 1 elif m.issym(): pack_symlinks += 1 else: pack_others += 1 rpz_pack.close() meta_total_paths = 0 meta_packed_packages_files = 0 meta_unpacked_packages_files = 0 meta_packages = len(packages) meta_packed_packages = 0 for package in packages: nb = len(package.files) meta_total_paths += nb if package.packfiles: meta_packed_packages_files += nb meta_packed_packages += 1 else: meta_unpacked_packages_files += nb nb = len(other_files) meta_total_paths += nb meta_packed_paths = meta_packed_packages_files + nb if runs: meta_architecture = runs[0]['architecture'] if any(r['architecture'] != meta_architecture for r in runs): logging.warning("Runs have different architectures") meta_distribution = runs[0]['distribution'] if any(r['distribution'] != meta_distribution for r in runs): logging.warning("Runs have different distributions") meta_distribution = ' '.join(t for t in meta_distribution if t) current_architecture = platform.machine().lower() current_distribution = platform.linux_distribution()[0:2] current_distribution = ' '.join(t for t in current_distribution if t) print("Pack file: %s" % pack) print("\n----- Pack information -----") print("Compressed size: %s" % hsize(pack.size())) print("Unpacked size: %s" % hsize(pack_total_size)) print("Total packed paths: %d" % pack_total_paths) if args.verbosity >= 3: print(" Files: %d" % pack_files) print(" Directories: %d" % pack_dirs) print(" Symbolic links: %d" % pack_symlinks) if pack_others: print(" Unknown (what!?): %d" % pack_others) print("\n----- Metadata -----") if args.verbosity >= 3: print("Total paths: %d" % meta_total_paths) print("Listed packed paths: %d" % meta_packed_paths) if packages: print("Total software packages: %d" % meta_packages) print("Packed software packages: %d" % meta_packed_packages) if args.verbosity >= 3: print("Files from packed software packages: %d" % meta_packed_packages_files) print("Files from unpacked software packages: %d" % meta_unpacked_packages_files) if runs: print("Architecture: %s (current: %s)" % (meta_architecture, current_architecture)) print("Distribution: %s (current: %s)" % ( meta_distribution, current_distribution or "(not Linux)")) print("Executions (%d):" % len(runs)) for i, run in enumerate(runs): cmdline = ' '.join(shell_escape(a) for a in run['argv']) if len(runs) > 1: print(" %d: %s" % (i, cmdline)) else: print(" %s" % cmdline) if args.verbosity >= 2: print(" wd: %s" % run['workingdir']) if 'signal' in run: print(" signal: %d" % run['signal']) else: print(" exitcode: %d" % run['exitcode']) if inputs_outputs: if args.verbosity < 2: print("Inputs/outputs files (%d) :%s" % ( len(inputs_outputs), ", ".join(inputs_outputs))) else: print("Inputs/outputs files (%d):" % len(inputs_outputs)) for name, f in iteritems(inputs_outputs): t = [] if f.read_runs: t.append("in") if f.write_runs: t.append("out") print(" %s (%s): %s" % (name, ' '.join(t), f.path)) # Unpacker compatibility print("\n----- Unpackers -----") unpacker_status = {} for name, upk in iteritems(unpackers): if 'test_compatibility' in upk: compat = upk['test_compatibility'] if callable(compat): compat = compat(pack, config=config) if isinstance(compat, (tuple, list)): compat, msg = compat else: msg = None unpacker_status.setdefault(compat, []).append((name, msg)) else: unpacker_status.setdefault(None, []).append((name, None)) for s, n in [(COMPAT_OK, "Compatible"), (COMPAT_MAYBE, "Unknown"), (COMPAT_NO, "Incompatible")]: if s != COMPAT_OK and args.verbosity < 2: continue if s not in unpacker_status: continue upks = unpacker_status[s] print("%s (%d):" % (n, len(upks))) for upk_name, msg in upks: if msg is not None: print(" %s (%s)" % (upk_name, msg)) else: print(" %s" % upk_name)