def run_diffoscope(parsed_args): if not tlsh and Config.general.fuzzy_threshold != parsed_args.fuzzy_threshold: logger.warning('Fuzzy-matching is currently disabled as the “tlsh” module is unavailable.') Config.general.max_diff_block_lines = parsed_args.max_diff_block_lines Config.general.max_diff_input_lines = parsed_args.max_diff_input_lines Config.general.max_report_size = parsed_args.max_report_size Config.general.separate_file_diff_size = parsed_args.separate_file_diff_size Config.general.fuzzy_threshold = parsed_args.fuzzy_threshold Config.general.new_file = parsed_args.new_file if parsed_args.debug: logger.setLevel(logging.DEBUG) set_locale() difference = diffoscope.comparators.compare_root_paths( parsed_args.file1, parsed_args.file2) if difference: # no output desired? print text if not any((parsed_args.text_output, parsed_args.html_output, parsed_args.html_output_directory)): parsed_args.text_output = "-" if parsed_args.html_output: with make_printer(parsed_args.html_output) as print_func: output_html(difference, css_url=parsed_args.css_url, print_func=print_func) if parsed_args.html_output_directory: output_html_directory(parsed_args.html_output_directory, difference, css_url=parsed_args.css_url, jquery_url=parsed_args.jquery_url) if parsed_args.text_output: with make_printer(parsed_args.text_output or '-') as print_func: output_text(difference, print_func=print_func) return 1 return 0
def output_html_directory(directory, difference, css_url=None, jquery_url=None): """ Multi-file presenter. Writes to a directory, and puts large diff tables into files of their own. This uses jQuery. By default it uses /usr/share/javascript/jquery/jquery.js (symlinked, so that you can still share the result over HTTP). You can also pass --jquery URL to diffoscope to use a central jQuery copy. """ if not os.path.exists(directory): os.makedirs(directory) if not jquery_url: jquery_symlink = os.path.join(directory, "jquery.js") if os.path.exists(jquery_symlink): jquery_url = "./jquery.js" else: if os.path.lexists(jquery_symlink): os.unlink(jquery_symlink) for path in JQUERY_SYSTEM_LOCATIONS: if os.path.exists(path): os.symlink("/usr/share/javascript/jquery/jquery.js", jquery_symlink) jquery_url = "./jquery.js" break if not jquery_url: logger.warning( '--jquery was not specified and jQuery was not found in any known location. Disabling on-demand inline loading.' ) logger.debug('Locations searched: %s', ', '.join(JQUERY_SYSTEM_LOCATIONS)) if jquery_url == 'disable': jquery_url = None with file_printer(directory, "index.html") as print_func: print_func = create_limited_print_func(print_func, Config.general.max_report_size) try: output_header(css_url, print_func) output_difference(difference, print_func, css_url, directory, []) except PrintLimitReached: logger.debug('print limit reached') print_func(u"<div class='error'>Max output size reached.</div>", force=True) if jquery_url: print_func(SCRIPTS % {'jquery_url': escape(jquery_url)}, force=True) output_footer(print_func)
def entries(self, path): # We pass `-d ''` in order to get a listing with the names we actually # need to use when extracting files cmd = ['unsquashfs', '-d', '', '-lls', path] output = subprocess.check_output(cmd, shell=False).decode('utf-8') header = True for line in output.rstrip('\n').split('\n'): if header: if line == '': header = False continue if len(line) > 0 and line[0] in SQUASHFS_LS_MAPPING: yield SQUASHFS_LS_MAPPING[line[0]](self, line) else: logger.warning('Unknown squashfs entry: %s', line)
def entries(self, path): # We pass `-d ''` in order to get a listing with the names we actually # need to use when extracting files cmd = ['unsquashfs', '-d', '', '-lls', path] output = subprocess.check_output(cmd, shell=False).decode('utf-8') header = True for line in output.rstrip('\n').split('\n'): if header: if line == '': header = False continue if len(line) > 0 and line[0] in SQUASHFS_LS_MAPPING: try: cls = SQUASHFS_LS_MAPPING[line[0]] yield cls, cls.parse(line) except SquashfsInvalidLineFormat: logger.warning('Invalid squashfs entry: %s', line) else: logger.warning('Unknown squashfs entry: %s', line)
def output_html_directory(directory, difference, css_url=None, jquery_url=None): """ Multi-file presenter. Writes to a directory, and puts large diff tables into files of their own. This uses jQuery. By default it uses /usr/share/javascript/jquery/jquery.js (symlinked, so that you can still share the result over HTTP). You can also pass --jquery URL to diffoscope to use a central jQuery copy. """ if not os.path.exists(directory): os.makedirs(directory) if not jquery_url: jquery_symlink = os.path.join(directory, "jquery.js") if os.path.exists(jquery_symlink): jquery_url = "./jquery.js" else: if os.path.lexists(jquery_symlink): os.unlink(jquery_symlink) for path in JQUERY_SYSTEM_LOCATIONS: if os.path.exists(path): os.symlink("/usr/share/javascript/jquery/jquery.js", jquery_symlink) jquery_url = "./jquery.js" break if not jquery_url: logger.warning('--jquery was not specified and jQuery was not found in any known location. Disabling on-demand inline loading.') logger.debug('Locations searched: %s', ', '.join(JQUERY_SYSTEM_LOCATIONS)) if jquery_url == 'disable': jquery_url = None with file_printer(directory, "index.html") as print_func: print_func = create_limited_print_func(print_func, Config.general.max_report_size) try: output_header(css_url, print_func) output_difference(difference, print_func, css_url, directory, []) except PrintLimitReached: logger.debug('print limit reached') print_func(u"<div class='error'>Max output size reached.</div>", force=True) if jquery_url: print_func(SCRIPTS % {'jquery_url': escape(jquery_url)}, force=True) output_footer(print_func)
def compare_meta(path1, path2): logger.debug('compare_meta(%s, %s)', path1, path2) differences = [] try: differences.append(Difference.from_command(Stat, path1, path2)) except RequiredToolNotFound: logger.warning("'stat' not found! Is PATH wrong?") if os.path.islink(path1) or os.path.islink(path2): return [d for d in differences if d is not None] try: lsattr1 = lsattr(path1) lsattr2 = lsattr(path2) differences.append(Difference.from_text( lsattr1, lsattr2, path1, path2, source="lattr")) except RequiredToolNotFound: logger.info("Unable to find 'lsattr'.") try: differences.append(Difference.from_command(Getfacl, path1, path2)) except RequiredToolNotFound: logger.info("Unable to find 'getfacl'.") return [d for d in differences if d is not None]