def display_results(self, archive, directory, checksum, archivestat=None, map_file=None): """Display final information about a generated archive :param archive: The name of the archive that was generated :type archive: ``str`` :param directory: The build directory for sos if --build was used :type directory: ``str`` :param checksum: The checksum of the archive :type checksum: ``str`` :param archivestat: stat() information for the archive :type archivestat: `os.stat_result` :param map_file: If sos clean was invoked, the location of the mapping file for this run :type map_file: ``str`` """ # Logging is already shutdown and all terminal output must use the # print() call. # make sure a report exists if not archive and not directory: return False self._print() if map_file: self._print( _("A mapping of obfuscated elements is available at" "\n\t%s\n" % map_file)) if archive: self._print(_("Your sosreport has been generated and saved " "in:\n\t%s\n") % archive, always=True) self._print( _(" Size\t%s") % get_human_readable(archivestat.st_size)) self._print(_(" Owner\t%s") % getpwuid(archivestat.st_uid).pw_name) else: self._print(_("Your sosreport build tree has been generated " "in:\n\t%s\n") % directory, always=True) if checksum: self._print(" " + self.get_preferred_hash_name() + "\t" + checksum) self._print() self._print( _("Please send this file to your support " "representative.")) self._print()
def display_results(self, archive, directory, checksum, archivestat=None, map_file=None): # Display results is called from the tail of SoSReport.final_work() # # Logging is already shutdown and all terminal output must use the # print() call. # make sure a report exists if not archive and not directory: return False self._print() if map_file: self._print( _("A mapping of obfuscated elements is available at" "\n\t%s\n" % map_file)) if archive: self._print(_("Your sosreport has been generated and saved " "in:\n\t%s\n") % archive, always=True) self._print( _(" Size\t%s") % get_human_readable(archivestat.st_size)) self._print(_(" Owner\t%s") % getpwuid(archivestat.st_uid).pw_name) else: self._print(_("Your sosreport build tree has been generated " "in:\n\t%s\n") % directory, always=True) if checksum: self._print(" " + self.get_preferred_hash_name() + "\t" + checksum) self._print() self._print( _("Please send this file to your support " "representative.")) self._print()
def execute(self): """SoSCleaner will begin by inspecting the TARGET option to determine if it is a directory, archive, or archive of archives. In the case of a directory, the default behavior will be to edit the data in place. For an archive will we unpack the archive, iterate over the contents, and then repack the archive. In the case of an archive of archives, such as one from SoSCollector, each archive will be unpacked, cleaned, and repacked and the final top-level archive will then be repacked as well. """ if self.from_cmdline: self.print_disclaimer() self.report_paths = [] if not os.path.exists(self.opts.target): self.ui_log.error("Invalid target: no such file or directory %s" % self.opts.target) self._exit(1) if os.path.isdir(self.opts.target): self.arc_name = self.opts.target.split('/')[-1] for _file in os.listdir(self.opts.target): if _file == 'sos_logs': self.report_paths.append(self.opts.target) if re.match('sosreport.*.tar.*[^md5]', _file): self.report_paths.append(os.path.join(self.opts.target, _file)) if not self.report_paths: self.ui_log.error("Invalid target: not an sos directory") self._exit(1) else: self.inspect_target_archive() # remove any lingering md5 files self.report_paths = [p for p in self.report_paths if '.md5' not in p] if not self.report_paths: self.ui_log.error("No valid sos archives or directories found\n") self._exit(1) # we have at least one valid target to obfuscate self.completed_reports = [] self.obfuscate_report_paths() if not self.completed_reports: if self.in_place: return None self.ui_log.info("No reports obfuscated, aborting...\n") self._exit(1) self.ui_log.info("\nSuccessfully obfuscated %s report(s)\n" % len(self.completed_reports)) _map = self.compile_mapping_dict() map_path = self.write_map_for_archive(_map) self.write_map_for_config(_map) self.write_stats_to_manifest() if self.in_place: arc_paths = [a.final_archive_path for a in self.completed_reports] return map_path, arc_paths final_path = None if len(self.completed_reports) > 1: # we have an archive of archives, so repack the obfuscated tarball arc_name = self.arc_name + '-obfuscated' self.setup_archive(name=arc_name) for arc in self.completed_reports: if arc.is_tarfile: arc_dest = self.obfuscate_string( arc.final_archive_path.split('/')[-1] ) self.archive.add_file(arc.final_archive_path, dest=arc_dest) checksum = self.get_new_checksum(arc.final_archive_path) if checksum is not None: dname = self.obfuscate_string( "checksums/%s.%s" % (arc_dest, self.hash_name) ) self.archive.add_string(checksum, dest=dname) else: for dirname, dirs, files in os.walk(arc.archive_path): for filename in files: if filename.startswith('sosreport'): continue fname = os.path.join(dirname, filename) dnm = self.obfuscate_string( fname.split(arc.archive_name)[-1].lstrip('/') ) self.archive.add_file(fname, dest=dnm) arc_path = self.archive.finalize(self.opts.compression_type) else: arc = self.completed_reports[0] arc_path = arc.final_archive_path checksum = self.get_new_checksum(arc.final_archive_path) if checksum is not None: chksum_name = self.obfuscate_string( "%s.%s" % (arc_path.split('/')[-1], self.hash_name) ) with open(os.path.join(self.sys_tmp, chksum_name), 'w') as cf: cf.write(checksum) self.write_cleaner_log() final_path = self.obfuscate_string( os.path.join(self.sys_tmp, arc_path.split('/')[-1]) ) shutil.move(arc_path, final_path) arcstat = os.stat(final_path) # logging will have been shutdown at this point print("A mapping of obfuscated elements is available at\n\t%s" % map_path) print("\nThe obfuscated archive is available at\n\t%s\n" % final_path) print("\tSize\t%s" % get_human_readable(arcstat.st_size)) print("\tOwner\t%s\n" % getpwuid(arcstat.st_uid).pw_name) print("Please send the obfuscated archive to your support " "representative and keep the mapping file private") self.cleanup()
def execute(self): """SoSCleaner will begin by inspecting the TARGET option to determine if it is a directory, archive, or archive of archives. In the case of a directory, the default behavior will be to edit the data in place. For an archive will we unpack the archive, iterate over the contents, and then repack the archive. In the case of an archive of archives, such as one from SoSCollector, each archive will be unpacked, cleaned, and repacked and the final top-level archive will then be repacked as well. """ self.arc_name = self.opts.target.split('/')[-1].split('.tar')[0] if self.from_cmdline: self.print_disclaimer() self.report_paths = [] if not os.path.exists(self.opts.target): self.ui_log.error("Invalid target: no such file or directory %s" % self.opts.target) self._exit(1) self.inspect_target_archive() if not self.report_paths: self.ui_log.error("No valid archives or directories found\n") self._exit(1) # we have at least one valid target to obfuscate self.completed_reports = [] self.preload_all_archives_into_maps() self.generate_parser_item_regexes() self.obfuscate_report_paths() if not self.completed_reports: if self.in_place: return None self.ui_log.info("No reports obfuscated, aborting...\n") self._exit(1) self.ui_log.info("\nSuccessfully obfuscated %s report(s)\n" % len(self.completed_reports)) _map = self.compile_mapping_dict() map_path = self.write_map_for_archive(_map) self.write_map_for_config(_map) self.write_stats_to_manifest() if self.in_place: arc_paths = [a.final_archive_path for a in self.completed_reports] return map_path, arc_paths final_path = None if len(self.completed_reports) > 1: arc_path = self.rebuild_nested_archive() else: arc = self.completed_reports[0] arc_path = arc.final_archive_path checksum = self.get_new_checksum(arc.final_archive_path) if checksum is not None: chksum_name = self.obfuscate_string( "%s.%s" % (arc_path.split('/')[-1], self.hash_name)) with open(os.path.join(self.sys_tmp, chksum_name), 'w') as cf: cf.write(checksum) self.write_cleaner_log() final_path = self.obfuscate_string( os.path.join(self.sys_tmp, arc_path.split('/')[-1])) shutil.move(arc_path, final_path) arcstat = os.stat(final_path) # logging will have been shutdown at this point print("A mapping of obfuscated elements is available at\n\t%s" % map_path) print("\nThe obfuscated archive is available at\n\t%s\n" % final_path) print("\tSize\t%s" % get_human_readable(arcstat.st_size)) print("\tOwner\t%s\n" % getpwuid(arcstat.st_uid).pw_name) print("Please send the obfuscated archive to your support " "representative and keep the mapping file private") self.cleanup()