Added SFC scan

This commit is contained in:
2Shirt 2019-09-15 19:34:06 -07:00
parent b41027562a
commit 2678ce77da
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
3 changed files with 85 additions and 41 deletions

View file

@ -1,40 +0,0 @@
# Wizard Kit: Check, and possibly repair, system file health via SFC
import os
import sys
# Init
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
from functions.repairs import *
init_global_vars()
os.system('title {}: SFC Tool'.format(KIT_NAME_FULL))
set_log_file('SFC Tool.log')
if __name__ == '__main__':
try:
stay_awake()
clear_screen()
print_info('{}: SFC Tool\n'.format(KIT_NAME_FULL))
other_results = {
'Error': {
'CalledProcessError': 'Unknown Error',
},
'Warning': {
'GenericRepair': 'Repaired',
}}
if ask('Run a SFC scan now?'):
try_and_print(message='SFC scan...',
function=run_sfc_scan, other_results=other_results)
else:
abort()
# Done
print_standard('\nDone.')
pause('Press Enter to exit...')
exit_script()
except SystemExit as sys_exit:
exit_script(sys_exit.code)
except:
major_exception()
# vim: sts=2 sw=2 ts=2

35
scripts/sfc_scan.py Normal file
View file

@ -0,0 +1,35 @@
"""Wizard Kit: Check, and possibly repair, system file health via SFC"""
# vim: sts=2 sw=2 ts=2
import wk
def main():
"""Run SFC and report result."""
title = f'{wk.cfg.main.KIT_NAME_FULL}: SFC Tool'
try_print = wk.std.TryAndPrint()
wk.std.clear_screen()
wk.std.set_title(title)
wk.std.print_info(title)
print('')
# Ask
if not wk.std.ask('Run a SFC scan now?'):
wk.std.abort()
print('')
# Run
try_print.run('SFC scan...', wk.os.win.run_sfc_scan)
# Done
print('Done')
wk.std.pause('Press Enter to exit...')
if __name__ == '__main__':
try:
main()
except SystemExit:
raise
except: #pylint: disable=bare-except
wk.std.major_exception()

View file

@ -1,9 +1,22 @@
"""WizardKit: Windows Functions"""
# vim: sts=2 sw=2 ts=2
from wk.std import run_program
import logging
import os
import pathlib
import re
import time
from wk import cfg
from wk.io import non_clobber_path
from wk.std import (
GenericError,
GenericWarning,
run_program,
)
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
@ -38,5 +51,41 @@ def enable_safemode_msi():
run_program(cmd)
def run_sfc_scan():
"""Run SFC and save results."""
cmd = ['sfc', '/scannow']
log_path = pathlib.Path(
'{drive}/{short}/Logs/{date}/Tools/SFC.log'.format(
drive=os.environ.get('SYSTEMDRIVE', 'C:'),
short=cfg.main.KIT_NAME_SHORT,
date=time.strftime('%Y-%m-%d'),
))
err_path = log_path.with_suffix('.err')
# Run SFC
proc = run_program(cmd, check=False)
# Fix paths
log_path = non_clobber_path(log_path)
err_path = non_clobber_path(err_path)
# Save output
output = proc.stdout.replace('\0', '')
errors = proc.stderr.replace('\0', '')
os.makedirs(log_path.parent, exist_ok=True)
with open(log_path, 'w') as _f:
_f.write(output)
with open(err_path, 'w') as _f:
_f.write(errors)
# Check result
if re.findall(r'did\s+not\s+find\s+any\s+integrity\s+violations', output):
pass
elif re.findall(r'successfully\s+repaired\s+them', output):
raise GenericWarning('Repaired')
else:
raise GenericError
if __name__ == '__main__':
print("This file is not meant to be called directly.")