#!/usr/bin/env python3 import os import hashlib def sha256sum(file): block_size = 16 * 1024 * 1024 # 16 MB block size b = bytearray(block_size) file_hash = hashlib.sha256() mv = memoryview(b) with open(file, 'rb', buffering=0) as f: while True: n = f.readinto(mv) if not n: break file_hash.update(mv[:n]) return file_hash.hexdigest() # Define the path to the llama directory (parent folder of script directory) llama_path = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) # Define the file with the list of hashes and filenames hash_list_file = os.path.join(llama_path, "SHA256SUMS") # Check if the hash list file exists if not os.path.exists(hash_list_file): print(f"Hash list file not found: {hash_list_file}") exit(1) # Read the hash file content and split it into an array of lines with open(hash_list_file, "r") as f: hash_list = f.read().splitlines() # Create an array to store the results results = [] # Loop over each line in the hash list for line in hash_list: # Split the line into hash and filename hash_value, filename = line.split(" ") # Get the full path of the file by joining the llama path and the filename file_path = os.path.join(llama_path, filename) # Informing user of the progress of the integrity check print(f"Verifying the checksum of {file_path}") # Check if the file exists if os.path.exists(file_path): # Calculate the SHA256 checksum of the file using hashlib file_hash = sha256sum(file_path) # Compare the file hash with the expected hash if file_hash == hash_value: valid_checksum = "V" file_missing = "" else: valid_checksum = "" file_missing = "" else: valid_checksum = "" file_missing = "X" # Add the results to the array results.append({ "filename": filename, "valid checksum": valid_checksum, "file missing": file_missing }) # Print column headers for results table print("\n" + "filename".ljust(40) + "valid checksum".center(20) + "file missing".center(20)) print("-" * 80) # Output the results as a table for r in results: print(f"{r['filename']:40} {r['valid checksum']:^20} {r['file missing']:^20}")