Files
OpCore-Simplify/Scripts/integrity_checker.py
Hoang Hong Quan 0e608a56ce Add GUI Support for OpCore Simplify (#512)
* Refactor OpCore-Simplify to GUI version

* New ConfigEditor

* Add requirement checks and installation in launchers

* Add GitHub Actions workflow to generate manifest.json

* Set compression level for asset

* Skip .git and __pycache__ folders

* Refactor update process to include integrity checker

* Add SMBIOS model selection

* Update README.md

* Update to main branch
2025-12-30 14:19:47 +07:00

94 lines
3.2 KiB
Python

import os
import hashlib
import json
from Scripts import utils
class IntegrityChecker:
def __init__(self, utils_instance=None):
self.utils = utils_instance if utils_instance else utils.Utils()
def get_sha256(self, file_path, block_size=65536):
if not os.path.exists(file_path) or os.path.isdir(file_path):
return None
sha256 = hashlib.sha256()
with open(file_path, 'rb') as f:
for block in iter(lambda: f.read(block_size), b''):
sha256.update(block)
return sha256.hexdigest()
def generate_folder_manifest(self, folder_path, manifest_path=None, save_manifest=True):
if not os.path.isdir(folder_path):
return None
if manifest_path is None:
manifest_path = os.path.join(folder_path, "manifest.json")
manifest_data = {}
for root, _, files in os.walk(folder_path):
if '.git' in root or "__pycache__" in root:
continue
for name in files:
if '.git' in name or ".pyc" in name:
continue
file_path = os.path.join(root, name)
relative_path = os.path.relpath(file_path, folder_path).replace('\\', '/')
if relative_path == os.path.basename(manifest_path):
continue
manifest_data[relative_path] = self.get_sha256(file_path)
if save_manifest:
self.utils.write_file(manifest_path, manifest_data)
return manifest_data
def verify_folder_integrity(self, folder_path, manifest_path=None):
if not os.path.isdir(folder_path):
return None, "Folder not found."
if manifest_path is None:
manifest_path = os.path.join(folder_path, "manifest.json")
if not os.path.exists(manifest_path):
return None, "Manifest file not found."
manifest_data = self.utils.read_file(manifest_path)
if not isinstance(manifest_data, dict):
return None, "Invalid manifest file."
issues = {
"modified": [],
"missing": [],
"untracked": []
}
manifest_files = set(manifest_data.keys())
actual_files = set()
for root, _, files in os.walk(folder_path):
for name in files:
file_path = os.path.join(root, name)
relative_path = os.path.relpath(file_path, folder_path).replace('\\', '/')
if relative_path == os.path.basename(manifest_path):
continue
actual_files.add(relative_path)
if relative_path not in manifest_data:
issues["untracked"].append(relative_path)
else:
current_hash = self.get_sha256(file_path)
if current_hash != manifest_data.get(relative_path):
issues["modified"].append(relative_path)
missing_files = manifest_files - actual_files
issues["missing"] = list(missing_files)
is_valid = not any(issues.values())
return is_valid, issues