Merge remote-tracking branch 'upstream/dev' into dev
This commit is contained in:
commit
c747b66455
45 changed files with 1862 additions and 1458 deletions
|
|
@ -19,7 +19,7 @@ call :DeQuote L_TYPE
|
|||
|
||||
:SetVariables
|
||||
rem Set variables using settings\main.py file
|
||||
set "SETTINGS=%bin%\Scripts\settings\main.py"
|
||||
set "SETTINGS=%bin%\Scripts\wk\cfg\main.py"
|
||||
for %%v in (ARCHIVE_PASSWORD KIT_NAME_FULL OFFICE_SERVER_IP QUICKBOOKS_SERVER_IP) do (
|
||||
set "var=%%v"
|
||||
for /f "tokens=* usebackq" %%f in (`findstr "!var!=" "%SETTINGS%"`) do (
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""Wizard Kit: Auto-Repair Tool"""
|
||||
"""Wizard Kit: Auto Repair Tool"""
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
||||
import os
|
||||
|
|
|
|||
168
scripts/auto_setup.py
Normal file
168
scripts/auto_setup.py
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
"""Wizard Kit: Auto System Setup Tool"""
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
import wk # pylint: disable=wrong-import-position
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
PRESETS = {
|
||||
'Default': {}, # Will be built at runtime using BASE_MENUS
|
||||
'Additional User': {
|
||||
'Configure System': (
|
||||
'Chrome Notifications',
|
||||
'Open Shell',
|
||||
'uBlock Origin',
|
||||
'Enable BSoD MiniDumps',
|
||||
'Enable RegBack',
|
||||
'Enable System Restore',
|
||||
'Set System Restore Size',
|
||||
'Enable Windows Updates',
|
||||
'Windows Explorer',
|
||||
),
|
||||
'Install Software': (
|
||||
'Firefox', # Needed to handle profile upgrade nonsense
|
||||
),
|
||||
'System Summary': (
|
||||
'Operating System',
|
||||
'Windows Activation',
|
||||
'Secure Boot',
|
||||
'Installed RAM',
|
||||
'Storage Status',
|
||||
'Virus Protection',
|
||||
'Partitions 4K Aligned',
|
||||
),
|
||||
},
|
||||
'Hardware': {
|
||||
'Configure System': (
|
||||
'Enable BSoD MiniDumps',
|
||||
'Enable RegBack',
|
||||
'Enable System Restore',
|
||||
'Set System Restore Size',
|
||||
'Enable Windows Updates',
|
||||
),
|
||||
'System Information': (
|
||||
'Backup Registry',
|
||||
),
|
||||
'System Summary': (
|
||||
'Operating System',
|
||||
'Windows Activation',
|
||||
'Secure Boot',
|
||||
'Installed RAM',
|
||||
'Storage Status',
|
||||
'Virus Protection',
|
||||
'Partitions 4K Aligned',
|
||||
),
|
||||
'Run Programs': (
|
||||
'Device Manager',
|
||||
'HWiNFO Sensors',
|
||||
'XMPlay',
|
||||
),
|
||||
},
|
||||
'Verify': {
|
||||
'Configure System': (
|
||||
'Enable BSoD MiniDumps',
|
||||
'Enable RegBack',
|
||||
'Enable System Restore',
|
||||
'Set System Restore Size',
|
||||
'Enable Windows Updates',
|
||||
'Windows Explorer',
|
||||
),
|
||||
'System Summary': (
|
||||
'Operating System',
|
||||
'Windows Activation',
|
||||
'Secure Boot',
|
||||
'Installed RAM',
|
||||
'Storage Status',
|
||||
'Virus Protection',
|
||||
'Installed Office',
|
||||
'Partitions 4K Aligned',
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
# Classes
|
||||
class MenuEntry():
|
||||
# pylint: disable=too-few-public-methods
|
||||
"""Simple class to allow cleaner code below."""
|
||||
def __init__(self, name, function=None, selected=True, **kwargs):
|
||||
self.name = name
|
||||
self.details = {
|
||||
'Function': function,
|
||||
'Selected': selected,
|
||||
**kwargs,
|
||||
}
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
BASE_MENUS = {
|
||||
'Groups': {
|
||||
'Backup Settings': (
|
||||
MenuEntry('Backup Browsers', 'auto_backup_browser_profiles'),
|
||||
MenuEntry('Backup Power Plans', 'auto_backup_power_plans'),
|
||||
MenuEntry('Reset Power Plans', 'auto_reset_power_plans'),
|
||||
MenuEntry('Set Custom Power Plan', 'auto_set_custom_power_plan'),
|
||||
),
|
||||
'Install Software': (
|
||||
MenuEntry('Visual C++ Runtimes', 'auto_install_vcredists'),
|
||||
MenuEntry('Firefox', 'auto_install_firefox'),
|
||||
MenuEntry('LibreOffice', 'auto_install_libreoffice', selected=False),
|
||||
MenuEntry('Open Shell', 'auto_install_open_shell'),
|
||||
MenuEntry('Software Bundle', 'auto_install_software_bundle'),
|
||||
),
|
||||
'Configure System': (
|
||||
MenuEntry('Configure Browsers', 'auto_config_browsers'),
|
||||
MenuEntry('Open Shell', 'auto_config_open_shell'),
|
||||
MenuEntry('Enable BSoD MiniDumps', 'auto_enable_bsod_minidumps'),
|
||||
MenuEntry('Enable RegBack', 'auto_enable_regback'),
|
||||
MenuEntry('Enable System Restore', 'auto_system_restore_enable'),
|
||||
MenuEntry('Set System Restore Size', 'auto_system_restore_set_size'),
|
||||
MenuEntry('Enable Windows Updates', 'auto_windows_updates_enable'),
|
||||
MenuEntry('User Account Control', 'auto_restore_default_uac'),
|
||||
MenuEntry('Windows Activation', 'auto_activate_windows'),
|
||||
MenuEntry('Windows Explorer', 'auto_config_explorer'),
|
||||
MenuEntry(r'Windows\Temp Fix', 'auto_windows_temp_fix'),
|
||||
MenuEntry('Create System Restore', 'auto_system_restore_create'),
|
||||
),
|
||||
'System Information': (
|
||||
MenuEntry('AIDA64 Report', 'auto_export_aida64_report'),
|
||||
MenuEntry('Backup Registry', 'auto_backup_registry'),
|
||||
),
|
||||
'System Summary': (
|
||||
MenuEntry('Operating System', 'auto_show_os_name'),
|
||||
MenuEntry('Windows Activation', 'auto_show_os_activation'),
|
||||
MenuEntry('Secure Boot', 'auto_show_secure_boot_status'),
|
||||
MenuEntry('Installed RAM', 'auto_show_installed_ram'),
|
||||
MenuEntry('Storage Status', 'auto_show_storage_status'),
|
||||
MenuEntry('Virus Protection', 'auto_show_installed_antivirus'),
|
||||
MenuEntry('Partitions 4K Aligned', 'auto_show_4k_alignment_check'),
|
||||
),
|
||||
'Run Programs': (
|
||||
MenuEntry('Device Manager', 'auto_open_device_manager'),
|
||||
MenuEntry('HWiNFO Sensors', 'auto_open_hwinfo_sensors'),
|
||||
MenuEntry('Windows Activation', 'auto_open_windows_activation'),
|
||||
MenuEntry('Windows Updates', 'auto_open_windows_updates'),
|
||||
MenuEntry('XMPlay', 'auto_open_xmplay'),
|
||||
),
|
||||
},
|
||||
'Actions': (
|
||||
MenuEntry('Load Preset'),
|
||||
MenuEntry('Start', Separator=True),
|
||||
MenuEntry('Quit'),
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
wk.setup.win.run_auto_setup(BASE_MENUS, PRESETS)
|
||||
except KeyboardInterrupt:
|
||||
wk.std.abort()
|
||||
except SystemExit:
|
||||
raise
|
||||
except: #pylint: disable=bare-except
|
||||
wk.std.major_exception()
|
||||
|
|
@ -23,10 +23,10 @@ def main():
|
|||
|
||||
# Run or schedule scan
|
||||
if 'Offline' in selection[0]:
|
||||
function = wk.os.win.run_chkdsk_offline
|
||||
function = wk.repairs.win.run_chkdsk_offline
|
||||
msg_good = 'Scheduled'
|
||||
else:
|
||||
function = wk.os.win.run_chkdsk_online
|
||||
function = wk.repairs.win.run_chkdsk_online
|
||||
msg_good = 'No issues detected'
|
||||
try_print.run(
|
||||
message=f'CHKDSK ({os.environ.get("SYSTEMDRIVE")})...',
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Wizard Kit: ddrescue TUI"""
|
||||
# pylint: disable=invalid-name
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
||||
import wk
|
||||
|
||||
from docopt import docopt
|
||||
|
||||
import wk
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
|
|
|
|||
3
scripts/get_raw_disks.ps1
Normal file
3
scripts/get_raw_disks.ps1
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# Wizard Kit: Get RAW disks
|
||||
|
||||
Get-Disk | Where-Object {$_.PartitionStyle -eq "RAW"} | Select FriendlyName,Size,PartitionStyle | ConvertTo-JSON
|
||||
|
|
@ -1,11 +1,12 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Wizard Kit: Hardware Diagnostics"""
|
||||
# pylint: disable=invalid-name
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
||||
import wk
|
||||
|
||||
from docopt import docopt
|
||||
|
||||
import wk
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -1,57 +0,0 @@
|
|||
# Wizard Kit: Check or repair the %SYSTEMDRIVE% filesystem via CHKDSK
|
||||
|
||||
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 {}: Check Disk Tool'.format(KIT_NAME_FULL))
|
||||
set_log_file('Check Disk.log')
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
options = [
|
||||
{'Name': 'Run CHKDSK scan (read-only)', 'Repair': False},
|
||||
{'Name': 'Schedule CHKDSK scan (offline repair)', 'Repair': True}]
|
||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||
selection = menu_select(
|
||||
'{}: Check Disk Menu\n'.format(KIT_NAME_FULL),
|
||||
main_entries=options,
|
||||
action_entries=actions)
|
||||
print_info('{}: Check Disk Menu\n'.format(KIT_NAME_FULL))
|
||||
if selection == 'Q':
|
||||
abort()
|
||||
elif selection.isnumeric():
|
||||
repair = options[int(selection)-1]['Repair']
|
||||
if repair:
|
||||
cs = 'Scheduled'
|
||||
else:
|
||||
cs = 'No issues'
|
||||
message = 'CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env'])
|
||||
try_and_print(message=message, function=run_chkdsk,
|
||||
cs=cs, other_results=other_results, repair=repair)
|
||||
else:
|
||||
abort()
|
||||
|
||||
# Done
|
||||
print_success('Done.')
|
||||
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
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
# Wizard Kit: Check or repair component store health via DISM
|
||||
|
||||
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 {}: DISM helper Tool'.format(KIT_NAME_FULL))
|
||||
set_log_file('DISM Helper.log')
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
disabled = bool(global_vars['OS']['Version'] not in ('8', '8.1', '10'))
|
||||
options = [
|
||||
{'Name': 'Check Health', 'Repair': False, 'Disabled': disabled},
|
||||
{'Name': 'Restore Health', 'Repair': True, 'Disabled': disabled}]
|
||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||
selection = menu_select(
|
||||
'{}: DISM Menu\n'.format(KIT_NAME_FULL),
|
||||
main_entries=options,
|
||||
action_entries=actions)
|
||||
print_info('{}: DISM Menu\n'.format(KIT_NAME_FULL))
|
||||
if selection == 'Q':
|
||||
abort()
|
||||
elif selection.isnumeric():
|
||||
repair = options[int(selection)-1]['Repair']
|
||||
if repair:
|
||||
message='DISM RestoreHealth...'
|
||||
else:
|
||||
message='DISM ScanHealth...'
|
||||
try_and_print(message=message, function=run_dism,
|
||||
cs='No corruption', ns='Corruption detected',
|
||||
other_results=other_results, repair=repair)
|
||||
else:
|
||||
abort()
|
||||
|
||||
# Done
|
||||
print_success('Done.')
|
||||
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
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
# Wizard Kit: Install the standard SW bundle based on the OS version
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SW Bundle Tool'.format(KIT_NAME_FULL))
|
||||
set_log_file('Install SW Bundle.log')
|
||||
D7_MODE = 'd7mode' in sys.argv
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: SW Bundle Tool\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
'FileNotFoundError': 'File not found',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
answer_extensions = D7_MODE or ask('Install Extensions?')
|
||||
answer_vcr = D7_MODE or ask('Install Visual C++ Runtimes?')
|
||||
if D7_MODE:
|
||||
answer_ninite = True
|
||||
answer_mse = False
|
||||
else:
|
||||
answer_ninite = ask('Install Ninite Bundle?')
|
||||
if answer_ninite and global_vars['OS']['Version'] in ['7']:
|
||||
# Vista is dead, not going to check for it
|
||||
answer_mse = ask('Install MSE?')
|
||||
else:
|
||||
answer_mse = False
|
||||
|
||||
print_info('Installing Programs')
|
||||
if answer_vcr:
|
||||
install_vcredists()
|
||||
if answer_ninite:
|
||||
message='Ninite bundle...'
|
||||
if D7_MODE:
|
||||
message='Updating browsers...'
|
||||
result = try_and_print(message=message,
|
||||
function=install_ninite_bundle, cs='Started',
|
||||
browsers_only=D7_MODE, mse=answer_mse,
|
||||
other_results=other_results)
|
||||
for proc in result['Out']:
|
||||
# Wait for all processes to finish
|
||||
proc.wait()
|
||||
if answer_extensions:
|
||||
print_info('Installing Extensions')
|
||||
try_and_print(message='Classic Shell skin...',
|
||||
function=install_classicstart_skin,
|
||||
other_results=other_results)
|
||||
try_and_print(message='Google Chrome extensions...',
|
||||
function=install_chrome_extensions)
|
||||
try_and_print(message='Mozilla Firefox extensions...',
|
||||
function=install_firefox_extensions,
|
||||
other_results=other_results)
|
||||
print_standard('\nDone.')
|
||||
exit_script()
|
||||
except SystemExit as sys_exit:
|
||||
exit_script(sys_exit.code)
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
# Wizard Kit: Install Visual C++ Runtimes
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Install Visual C++ Runtimes'.format(KIT_NAME_FULL))
|
||||
set_log_file('Install Visual C++ Runtimes.log')
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: Install Visual C++ Runtimes\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
}}
|
||||
|
||||
if ask('Install Visual C++ Runtimes?'):
|
||||
install_vcredists()
|
||||
else:
|
||||
abort()
|
||||
|
||||
print_standard('\nDone.')
|
||||
exit_script()
|
||||
except SystemExit as sys_exit:
|
||||
exit_script(sys_exit.code)
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
@ -1,212 +0,0 @@
|
|||
# Wizard Kit: System Diagnostics
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
# Init
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.browsers import *
|
||||
from functions.info import *
|
||||
from functions.product_keys import *
|
||||
from functions.repairs import *
|
||||
from functions.sw_diags import *
|
||||
init_global_vars()
|
||||
os.system('title {}: System Diagnostics Tool'.format(KIT_NAME_FULL))
|
||||
set_log_file('System Diagnostics.log')
|
||||
D7_MODE = 'd7mode' in sys.argv
|
||||
|
||||
|
||||
# Static Variables
|
||||
BLEACH_BIT_CLEANERS = {
|
||||
'Applications': (
|
||||
'adobe_reader.cache',
|
||||
'adobe_reader.tmp',
|
||||
'amule.tmp',
|
||||
'flash.cache',
|
||||
'gimp.tmp',
|
||||
'hippo_opensim_viewer.cache',
|
||||
'java.cache',
|
||||
'libreoffice.cache',
|
||||
'liferea.cache',
|
||||
'miro.cache',
|
||||
'openofficeorg.cache',
|
||||
'pidgin.cache',
|
||||
'secondlife_viewer.Cache',
|
||||
'thunderbird.cache',
|
||||
'vuze.backup_files',
|
||||
'vuze.cache',
|
||||
'vuze.tmp',
|
||||
'yahoo_messenger.cache',
|
||||
),
|
||||
'Browsers': (
|
||||
'chromium.cache',
|
||||
'chromium.current_session',
|
||||
'firefox.cache',
|
||||
'firefox.session_restore',
|
||||
'google_chrome.cache',
|
||||
'google_chrome.session',
|
||||
'google_earth.temporary_files',
|
||||
'internet_explorer.temporary_files',
|
||||
'opera.cache',
|
||||
'opera.current_session',
|
||||
'safari.cache',
|
||||
'seamonkey.cache',
|
||||
),
|
||||
'System': (
|
||||
'system.clipboard',
|
||||
'system.tmp',
|
||||
'winapp2_windows.jump_lists',
|
||||
'winapp2_windows.ms_search',
|
||||
'windows_explorer.run',
|
||||
'windows_explorer.search_history',
|
||||
'windows_explorer.thumbnails',
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
def check_result(result, other_results):
|
||||
"""Check result for warnings and errors."""
|
||||
result_ok = True
|
||||
if not result['CS']:
|
||||
for warning in other_results.get('Warning', {}).keys():
|
||||
if warning in str(result['Error']):
|
||||
# Ignore warnings and repair statements
|
||||
return True
|
||||
# Error is not a warning
|
||||
result_ok = False
|
||||
return result_ok
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: System Diagnostics Tool\n'.format(KIT_NAME_FULL))
|
||||
ticket_number = get_ticket_number()
|
||||
system_ok = True
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
'FileNotFoundError': 'File not found',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
if ENABLED_TICKET_NUMBERS:
|
||||
print_info('Starting System Diagnostics for Ticket #{}\n'.format(
|
||||
ticket_number))
|
||||
|
||||
# Sanitize Environment
|
||||
print_info('Sanitizing Environment')
|
||||
if not D7_MODE:
|
||||
try_and_print(message='Running RKill...',
|
||||
function=run_rkill, cs='Done', other_results=other_results)
|
||||
try_and_print(message='Running TDSSKiller...',
|
||||
function=run_tdsskiller, cs='Done', other_results=other_results)
|
||||
|
||||
# Re-run if earlier process was stopped.
|
||||
stay_awake()
|
||||
|
||||
# Start diags
|
||||
if not D7_MODE:
|
||||
print_info('Starting Background Scans')
|
||||
check_connection()
|
||||
try_and_print(message='Running HitmanPro...',
|
||||
function=run_hitmanpro, cs='Started', other_results=other_results)
|
||||
try_and_print(message='Running Autoruns...',
|
||||
function=run_autoruns, cs='Started', other_results=other_results)
|
||||
|
||||
# OS Health Checks
|
||||
print_info('OS Health Checks')
|
||||
result = try_and_print(
|
||||
message='CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env']),
|
||||
function=run_chkdsk, other_results=other_results)
|
||||
system_ok = system_ok and check_result(result, other_results)
|
||||
result = try_and_print(message='SFC scan...',
|
||||
function=run_sfc_scan, other_results=other_results)
|
||||
system_ok = system_ok and check_result(result, other_results)
|
||||
if D7_MODE:
|
||||
result = try_and_print(message='DISM RestoreHealth...',
|
||||
function=run_dism, other_results=other_results, repair=True)
|
||||
if global_vars['OS']['Version'] in ('8', '8.1', '10'):
|
||||
system_ok = system_ok and check_result(result, other_results)
|
||||
else:
|
||||
try_and_print(message='DISM CheckHealth...',
|
||||
function=run_dism, other_results=other_results, repair=False)
|
||||
|
||||
if D7_MODE:
|
||||
# Archive all browsers for all users
|
||||
print_standard(' ')
|
||||
archive_all_users()
|
||||
else:
|
||||
# Scan for supported browsers
|
||||
print_info('Scanning for browsers')
|
||||
scan_for_browsers()
|
||||
|
||||
# Run BleachBit cleaners
|
||||
print_info('BleachBit Cleanup')
|
||||
for k, v in sorted(BLEACH_BIT_CLEANERS.items()):
|
||||
try_and_print(message='{}...'.format(k),
|
||||
function=run_bleachbit,
|
||||
cs='SUCCESS', other_results=other_results,
|
||||
cleaners=v, preview=bool(not D7_MODE))
|
||||
print_standard(' ')
|
||||
|
||||
# Export system info
|
||||
if not D7_MODE:
|
||||
print_info('Backup System Information')
|
||||
try_and_print(message='AIDA64 reports...',
|
||||
function=run_aida64, cs='SUCCESS', other_results=other_results)
|
||||
backup_browsers()
|
||||
try_and_print(message='File listing...',
|
||||
function=backup_file_list, cs='SUCCESS', other_results=other_results)
|
||||
try_and_print(message='Power plans...',
|
||||
function=backup_power_plans, cs='SUCCESS')
|
||||
try_and_print(message='Product Keys...',
|
||||
function=run_produkey, cs='SUCCESS', other_results=other_results)
|
||||
try_and_print(message='Registry...',
|
||||
function=backup_registry, cs='SUCCESS', other_results=other_results,
|
||||
overwrite=True)
|
||||
|
||||
# Summary
|
||||
if not D7_MODE:
|
||||
print_info('Summary')
|
||||
try_and_print(message='Operating System:',
|
||||
function=show_os_name, ns='Unknown', silent_function=False)
|
||||
try_and_print(message='Activation:',
|
||||
function=show_os_activation, ns='Unknown', silent_function=False)
|
||||
try_and_print(message='Installed RAM:',
|
||||
function=show_installed_ram, ns='Unknown', silent_function=False)
|
||||
show_free_space()
|
||||
try_and_print(message='Temp Size:',
|
||||
function=show_temp_files_size, silent_function=False)
|
||||
try_and_print(message='Installed Antivirus:',
|
||||
function=get_installed_antivirus, ns='Unknown',
|
||||
other_results=other_results, print_return=True)
|
||||
try_and_print(message='Installed Office:',
|
||||
function=get_installed_office, ns='Unknown',
|
||||
other_results=other_results, print_return=True)
|
||||
try_and_print(message='Product Keys:',
|
||||
function=get_product_keys, ns='Unknown', print_return=True)
|
||||
|
||||
# User data
|
||||
if not D7_MODE:
|
||||
print_info('User Data')
|
||||
try:
|
||||
show_user_data_summary()
|
||||
except Exception:
|
||||
print_error(' Unknown error.')
|
||||
|
||||
# Done
|
||||
if not D7_MODE or not system_ok:
|
||||
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
|
||||
|
|
@ -1,440 +0,0 @@
|
|||
'''Wizard Kit: System Setup'''
|
||||
# pylint: disable=wildcard-import,wrong-import-position
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
||||
import os
|
||||
import pathlib
|
||||
import sys
|
||||
|
||||
# Init
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from collections import OrderedDict
|
||||
from functions.activation import *
|
||||
from functions.browsers import *
|
||||
from functions.cleanup import *
|
||||
from functions.info import *
|
||||
from functions.product_keys import *
|
||||
from functions.setup import *
|
||||
from functions.sw_diags import *
|
||||
from functions.windows_updates import *
|
||||
init_global_vars()
|
||||
os.system('title {}: System Setup'.format(KIT_NAME_FULL))
|
||||
set_log_file('System Setup.log')
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
# pylint: disable=bad-whitespace,line-too-long
|
||||
OTHER_RESULTS = {
|
||||
'Error': {
|
||||
'BIOSKeyNotFoundError': 'BIOS KEY NOT FOUND',
|
||||
'CalledProcessError': 'UNKNOWN ERROR',
|
||||
'FileNotFoundError': 'FILE NOT FOUND',
|
||||
'GenericError': 'UNKNOWN ERROR',
|
||||
'Not4KAlignedError': 'FALSE',
|
||||
'SecureBootDisabledError': 'DISABLED',
|
||||
'WindowsUnsupportedError': 'UNSUPPORTED',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'REPAIRED',
|
||||
'NoProfilesError': 'NO PROFILES FOUND',
|
||||
'NotInstalledError': 'NOT INSTALLED',
|
||||
'OSInstalledLegacyError': 'OS INSTALLED LEGACY',
|
||||
'SecureBootNotAvailError': 'NOT AVAILABLE',
|
||||
'SecureBootUnknownError': 'UNKNOWN',
|
||||
'UnsupportedOSError': 'UNSUPPORTED OS',
|
||||
'WindowsOutdatedError': 'OUTDATED',
|
||||
},
|
||||
}
|
||||
SETUP_ACTIONS = OrderedDict({
|
||||
# Install software
|
||||
'Installing Programs': {'Info': True},
|
||||
'VCR': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': install_vcredists, 'Just run': True,},
|
||||
'ESET NOD32 AV': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': install_eset_nod32_av, 'If answer': 'ESET', 'KWArgs': {'msp': False},},
|
||||
'LibreOffice': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': install_libreoffice,
|
||||
'If answer': 'LibreOffice', 'KWArgs': {'quickstart': False, 'register_mso_types': True, 'use_mso_formats': True, 'vcredist': False},
|
||||
},
|
||||
'Ninite bundle': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': install_ninite_bundle, 'KWArgs': {'cs': 'STARTED'},},
|
||||
|
||||
# Browsers
|
||||
'Scanning for browsers': {'Info': True},
|
||||
'Scan': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': scan_for_browsers, 'Just run': True, 'KWArgs': {'skip_ie': True},},
|
||||
'Backing up browsers': {'Info': True},
|
||||
'Backup browsers': {'New': False, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': backup_browsers, 'Just run': True,},
|
||||
|
||||
# Install extensions
|
||||
'Installing Extensions': {'Info': True},
|
||||
'Classic Shell skin': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': install_classicstart_skin, 'Win10 only': True,},
|
||||
'Chrome extensions': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': install_chrome_extensions,},
|
||||
'Firefox extensions': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': install_firefox_extensions,},
|
||||
|
||||
# Set Default Apps
|
||||
'Set Default Apps': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': open_default_apps, 'Win10 only': True,
|
||||
'Pause': 'Please set default browser, and other apps as needed',},
|
||||
|
||||
# Configure software'
|
||||
'Configuring Programs': {'Info': True},
|
||||
'Browser add-ons': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': install_adblock, 'Just run': True,
|
||||
'Pause': 'Please enable uBlock Origin for all browsers',
|
||||
},
|
||||
'Chrome Notifications': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': disable_chrome_notifications,},
|
||||
'Classic Start': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': config_classicstart, 'Win10 only': True,},
|
||||
'Config Windows Updates': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': config_windows_updates, 'Win10 only': True,},
|
||||
'Enable System Restore': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': enable_system_restore,},
|
||||
'Create System Restore': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': False, 'Function': create_system_restore_point,},
|
||||
'Disable Fast Startup': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': disable_fast_startup, 'If answer': 'Fast-Hiber', 'Win10 only': True,},
|
||||
'Disable telemetry': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': disable_windows_telemetry, 'Win10 only': True,},
|
||||
'Enable BSoD mini dumps': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': enable_mini_dumps,},
|
||||
'Enable Hibernation': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': enable_hibernation, 'If answer': 'Fast-Hiber', 'Win10 only': True,},
|
||||
'Enable RegBack': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': enable_regback, 'Win10 only': True,},
|
||||
'Enable Windows Updates': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': enable_windows_updates, 'KWArgs': {'silent': True},},
|
||||
'Explorer (system)': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': config_explorer_system, 'Win10 only': True,},
|
||||
'Explorer (user)': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': config_explorer_user, 'Win10 only': True,},
|
||||
'Restart Explorer': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': restart_explorer,},
|
||||
'Power Plans': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': config_power_plans, 'KWArgs': {'name': 'Balanced'},},
|
||||
'Update Clock': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': update_clock,},
|
||||
'Windows\\Temp Fix': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': fix_windows_temp_dir,},
|
||||
|
||||
# Cleanup
|
||||
'Cleaning up': {'Info': True},
|
||||
'AdwCleaner': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': cleanup_adwcleaner,},
|
||||
'd7II': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': cleanup_d7ii,},
|
||||
'Desktop': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': cleanup_desktop,},
|
||||
'Emsisoft s2cmd': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': cleanup_emsisoft,},
|
||||
'Registry Backup(s)': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': cleanup_regbackups,},
|
||||
'Restore default UAC': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': restore_default_uac,},
|
||||
'KIT_NAME_FULL': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': delete_empty_folders,},
|
||||
|
||||
# System Info
|
||||
'Exporting system info': {'Info': True},
|
||||
'AIDA64 Report': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': run_aida64,},
|
||||
'File listing': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': backup_file_list,},
|
||||
'Product Keys': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': False, 'Function': run_produkey,},
|
||||
'Registry': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': False, 'Function': backup_registry,},
|
||||
|
||||
# Show Summary
|
||||
'Summary': {'Info': True},
|
||||
'Operating System': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': show_os_name, 'KWArgs': {'ns': 'UNKNOWN', 'silent_function': False},},
|
||||
'Activation': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': show_os_activation, 'KWArgs': {'ns': 'UNKNOWN', 'silent_function': False},},
|
||||
'BIOS Activation': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': activate_with_bios, 'If not activated': True,},
|
||||
'Secure Boot': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': check_secure_boot_status, 'KWArgs': {'show_alert': False},},
|
||||
'Installed RAM': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': show_installed_ram, 'KWArgs': {'ns': 'UNKNOWN', 'silent_function': False},},
|
||||
'Temp size': {'New': False, 'Dat': False, 'Cur': True, 'HW': False, 'Verf': False, 'Function': show_temp_files_size, 'KWArgs': {'ns': 'UNKNOWN', 'silent_function': False},},
|
||||
'Show free space': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': show_free_space, 'Just run': True,},
|
||||
'Installed AV': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': get_installed_antivirus, 'KWArgs': {'ns': 'UNKNOWN', 'print_return': True},},
|
||||
'Installed Office': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': get_installed_office, 'KWArgs': {'ns': 'UNKNOWN', 'print_return': True},},
|
||||
'Partitions 4K aligned': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': True, 'Function': check_4k_alignment, 'KWArgs': {'cs': 'TRUE', 'ns': 'FALSE'},},
|
||||
|
||||
# Open things
|
||||
'Opening Programs': {'Info': True},
|
||||
'Device Manager': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': False, 'Function': open_device_manager, 'KWArgs': {'cs': 'STARTED'},},
|
||||
'HWiNFO sensors': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': False, 'Function': run_hwinfo_sensors, 'KWArgs': {'cs': 'STARTED'},},
|
||||
'Snappy': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': False, 'Function': open_snappy_driver_origin, 'KWArgs': {'cs': 'STARTED'},},
|
||||
#'Speed test': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': False, 'Function': open_speedtest, 'KWArgs': {'cs': 'STARTED'},},
|
||||
'Windows Updates': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': open_windows_updates, 'KWArgs': {'cs': 'STARTED'},},
|
||||
'Windows Activation': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Verf': False, 'Function': open_windows_activation, 'If not activated': True, 'KWArgs': {'cs': 'STARTED'},},
|
||||
'Sleep': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': False, 'Function': sleep, 'Just run': True, 'KWArgs': {'seconds': 3},},
|
||||
'XMPlay': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Verf': False, 'Function': run_xmplay, 'KWArgs': {'cs': 'STARTED'},},
|
||||
})
|
||||
SETUP_ACTION_KEYS = (
|
||||
'Function',
|
||||
'If not activated',
|
||||
'Info',
|
||||
'Just run',
|
||||
'KWArgs',
|
||||
'Pause',
|
||||
)
|
||||
SETUP_QUESTIONS = {
|
||||
# AV
|
||||
'ESET': {'New': None, 'Dat': None, 'Cur': None, 'HW': False},
|
||||
'MSE': {'New': None, 'Dat': None, 'Cur': None, 'HW': False, 'Ninite': True},
|
||||
|
||||
# Fast Startup / Hibernation
|
||||
'Fast-Hiber': {'New': None, 'Dat': None, 'Cur': None, 'HW': False},
|
||||
|
||||
# LibreOffice
|
||||
'LibreOffice': {'New': None, 'Dat': None, 'Cur': None, 'HW': False, 'Ninite': True},
|
||||
|
||||
# Ninite
|
||||
'Base': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Ninite': True},
|
||||
'Missing': {'New': False, 'Dat': True, 'Cur': False, 'HW': False, 'Ninite': True},
|
||||
'Standard': {'New': True, 'Dat': True, 'Cur': False, 'HW': False, 'Ninite': True},
|
||||
}
|
||||
# pylint: enable=bad-whitespace,line-too-long
|
||||
|
||||
|
||||
# Functions
|
||||
def check_os_and_abort():
|
||||
"""Check OS and prompt to abort if not supported."""
|
||||
result = try_and_print(
|
||||
message='OS support status...',
|
||||
function=check_os_support_status,
|
||||
cs='GOOD',
|
||||
)
|
||||
if not result['CS'] and 'Unsupported' in result['Error']:
|
||||
print_warning('OS version not supported by this script')
|
||||
if not ask('Continue anyway? (NOT RECOMMENDED)'):
|
||||
abort()
|
||||
|
||||
|
||||
def get_actions(setup_mode, answers):
|
||||
"""Get actions to perform based on setup_mode, returns OrderedDict."""
|
||||
actions = OrderedDict({})
|
||||
for _key, _val in SETUP_ACTIONS.items():
|
||||
_action = {}
|
||||
_if_answer = _val.get('If answer', False)
|
||||
_win10_only = _val.get('Win10 only', False)
|
||||
|
||||
# Set enabled status
|
||||
_enabled = _val.get(setup_mode, False)
|
||||
if _if_answer:
|
||||
_enabled = _enabled and answers[_if_answer]
|
||||
if _win10_only:
|
||||
_enabled = _enabled and global_vars['OS']['Version'] == '10'
|
||||
_action['Enabled'] = _enabled
|
||||
|
||||
# Set other keys
|
||||
for _sub_key in SETUP_ACTION_KEYS:
|
||||
_action[_sub_key] = _val.get(_sub_key, None)
|
||||
|
||||
# Fix KWArgs
|
||||
if _action.get('KWArgs', {}) is None:
|
||||
_action['KWArgs'] = {}
|
||||
|
||||
# Handle "special" actions
|
||||
if _key == 'KIT_NAME_FULL':
|
||||
# Cleanup WK folders
|
||||
_key = KIT_NAME_FULL
|
||||
_action['KWArgs'] = {'folder_path': global_vars['ClientDir']}
|
||||
elif _key == 'Ninite bundle':
|
||||
# Add install_ninite_bundle() kwargs
|
||||
_action['KWArgs'].update({
|
||||
kw.lower(): kv for kw, kv in answers.items()
|
||||
if SETUP_QUESTIONS.get(kw, {}).get('Ninite', False)
|
||||
})
|
||||
elif _key == 'Explorer (user)':
|
||||
# Explorer settings (user)
|
||||
_action['KWArgs'] = {'setup_mode': setup_mode}
|
||||
|
||||
# Add to dict
|
||||
actions[_key] = _action
|
||||
|
||||
return actions
|
||||
|
||||
|
||||
def get_answers(setup_mode):
|
||||
"""Get setup answers based on setup_mode and user input, returns dict."""
|
||||
answers = {k: v.get(setup_mode, False) for k, v in SETUP_QUESTIONS.items()}
|
||||
|
||||
# Answer setup questions as needed
|
||||
if answers['ESET'] is None or answers['MSE'] is None:
|
||||
answers.update(get_av_selection())
|
||||
|
||||
if answers['LibreOffice'] is None:
|
||||
answers['LibreOffice'] = ask('Install LibreOffice?')
|
||||
|
||||
if answers['Fast-Hiber'] is None:
|
||||
if global_vars['OS']['Version'] == '10':
|
||||
# SSD check
|
||||
if drive_is_rotational(global_vars['Env']['SYSTEMDRIVE']):
|
||||
answers['Fast-Hiber'] = True
|
||||
else:
|
||||
print_standard(' ')
|
||||
print_standard('Disable Fast Startup and enable Hibernation?')
|
||||
print_standard(' Recommended for SSDs, optional for HDDs')
|
||||
answers['Fast-Hiber'] = ask(' Proceed?')
|
||||
else:
|
||||
answers['Fast-Hiber'] = False
|
||||
|
||||
return answers
|
||||
|
||||
|
||||
def get_av_selection():
|
||||
"""Get AV selection."""
|
||||
av_answers = {
|
||||
'ESET': False,
|
||||
'MSE': False,
|
||||
}
|
||||
av_options = [
|
||||
{'Name': 'ESET NOD32 AV'},
|
||||
{
|
||||
'Name': 'Microsoft Security Essentials',
|
||||
'Disabled': global_vars['OS']['Version'] not in ['7'],
|
||||
},
|
||||
]
|
||||
actions = [
|
||||
{'Name': 'None', 'Letter': 'N'},
|
||||
{'Name': 'Quit', 'Letter': 'Q'},
|
||||
]
|
||||
|
||||
# Show menu
|
||||
selection = menu_select(
|
||||
'Please select an option to install',
|
||||
main_entries=av_options,
|
||||
action_entries=actions)
|
||||
if selection.isnumeric():
|
||||
index = int(selection) - 1
|
||||
if 'ESET' in av_options[index]['Name']:
|
||||
av_answers['ESET'] = True
|
||||
av_answers['MSE'] = False
|
||||
elif 'Microsoft' in av_options[index]['Name']:
|
||||
av_answers['ESET'] = False
|
||||
av_answers['MSE'] = True
|
||||
elif selection == 'Q':
|
||||
abort()
|
||||
|
||||
# ESET settings
|
||||
if av_answers['ESET'] and ask(' Use MSP settings (ITS/VIP)?'):
|
||||
# NOTE: There's probably a better way than updating a static var...
|
||||
SETUP_ACTIONS['ESET NOD32 AV']['KWArgs']['msp'] = True
|
||||
|
||||
return av_answers
|
||||
|
||||
|
||||
def get_mode():
|
||||
"""Get mode via menu_select, returns str."""
|
||||
setup_mode = None
|
||||
mode_options = [
|
||||
{'Name': 'New', 'Display Name': 'Clean install (no data)'},
|
||||
{'Name': 'Dat', 'Display Name': 'Clean install (with data)'},
|
||||
{'Name': 'Cur', 'Display Name': 'Original OS (post-repairs)'},
|
||||
{'Name': 'HW', 'Display Name': 'Hardware service'},
|
||||
{'Name': 'Verf', 'Display Name': 'Verify (no changes)'},
|
||||
]
|
||||
actions = [
|
||||
{'Name': 'Quit', 'Letter': 'Q'},
|
||||
]
|
||||
|
||||
# Get selection
|
||||
selection = menu_select(
|
||||
'Please select a setup mode',
|
||||
main_entries=mode_options,
|
||||
action_entries=actions)
|
||||
if selection.isnumeric():
|
||||
index = int(selection) - 1
|
||||
setup_mode = mode_options[index]['Name']
|
||||
elif selection == 'Q':
|
||||
abort()
|
||||
|
||||
return setup_mode
|
||||
|
||||
|
||||
def main():
|
||||
"""Main function."""
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
|
||||
# Check installed OS
|
||||
check_os_and_abort()
|
||||
|
||||
# Get setup mode
|
||||
setup_mode = get_mode()
|
||||
|
||||
# Get answers to setup questions
|
||||
answers = get_answers(setup_mode)
|
||||
|
||||
# Get actions to perform
|
||||
actions = get_actions(setup_mode, answers)
|
||||
|
||||
# Perform actions
|
||||
for action, values in actions.items():
|
||||
kwargs = values.get('KWArgs', {})
|
||||
|
||||
# Print info lines
|
||||
if values.get('Info', False):
|
||||
print_info(action)
|
||||
continue
|
||||
|
||||
# Print disabled actions
|
||||
if not values.get('Enabled', False):
|
||||
show_data(
|
||||
message='{}...'.format(action),
|
||||
data='DISABLED',
|
||||
warning=True,
|
||||
)
|
||||
continue
|
||||
|
||||
# Check Windows activation if requested
|
||||
if values.get('If not activated', False) and windows_is_activated():
|
||||
# Skip
|
||||
continue
|
||||
|
||||
# Run function
|
||||
if values.get('Just run', False):
|
||||
values['Function'](**kwargs)
|
||||
else:
|
||||
result = try_and_print(
|
||||
message='{}...'.format(action),
|
||||
function=values['Function'],
|
||||
other_results=OTHER_RESULTS,
|
||||
**kwargs)
|
||||
|
||||
# Wait for Ninite proc(s)
|
||||
if action == 'Ninite bundle':
|
||||
print_standard('Waiting for installations to finish...')
|
||||
try:
|
||||
for proc in result['Out']:
|
||||
proc.wait()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
|
||||
# Pause
|
||||
if values.get('Pause', False):
|
||||
print_standard(values['Pause'])
|
||||
pause()
|
||||
|
||||
# Show alert box for SecureBoot issues
|
||||
try:
|
||||
check_secure_boot_status(show_alert=True)
|
||||
except Exception: # pylint: disable=broad-except
|
||||
# Ignoring exceptions since we just want to show the popup
|
||||
pass
|
||||
|
||||
# Eject ODD
|
||||
try:
|
||||
run_nircmd('cdrom', 'open')
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Verf step
|
||||
if setup_mode == 'Verf' and ask('Open programs (Activation, Device Manager, etc...)? '):
|
||||
open_all_the_things()
|
||||
|
||||
# Done
|
||||
pause('Press Enter to exit... ')
|
||||
|
||||
|
||||
def open_all_the_things():
|
||||
"""TODO"""
|
||||
open_device_manager()
|
||||
run_hwinfo_sensors()
|
||||
open_snappy_driver_origin()
|
||||
open_speedtest()
|
||||
open_windows_updates()
|
||||
if not windows_is_activated():
|
||||
open_windows_activation()
|
||||
sleep(3)
|
||||
run_xmplay()
|
||||
if setup_mode == 'Dat':
|
||||
# System needs full AV scan
|
||||
print_standard('Please run a full virus scan before continuing')
|
||||
eset_path = pathlib.Path(
|
||||
f'{os.environ.get("PROGRAMFILES", "")}/ESET/ESET Security/ecmds.exe')
|
||||
if eset_path.exists():
|
||||
popen_program([eset_path, '/launch'])
|
||||
else:
|
||||
try:
|
||||
run_kvrt()
|
||||
except Exception:
|
||||
# Meh
|
||||
pass
|
||||
pause('Press Enter to exit...')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
main()
|
||||
exit_script()
|
||||
except SystemExit as sys_exit:
|
||||
exit_script(sys_exit.code)
|
||||
except: # pylint: disable=bare-except
|
||||
major_exception()
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
# Wizard Kit: Search for product keys in the transfer folder
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.product_keys import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Transferred Key Finder'.format(KIT_NAME_FULL))
|
||||
set_log_file('Transferred Keys.log')
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: Transferred Key Finder\n'.format(KIT_NAME_FULL))
|
||||
try_and_print(message='Searching for keys...',
|
||||
function=list_clientdir_keys, print_return=True)
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
exit_script()
|
||||
except SystemExit as sys_exit:
|
||||
exit_script(sys_exit.code)
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
@ -1,142 +0,0 @@
|
|||
# Wizard Kit: Download the latest versions of the programs in the kit
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.update import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Kit Update Tool'.format(KIT_NAME_FULL))
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
clear_screen()
|
||||
print_info('{}: Kit Update Tool\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
}}
|
||||
|
||||
## Prep ##
|
||||
update_sdio = ask('Update SDI Origin?')
|
||||
|
||||
## Download ##
|
||||
print_success('Downloading tools')
|
||||
|
||||
# Data Recovery
|
||||
print_info(' Data Recovery')
|
||||
try_and_print(message='TestDisk / PhotoRec...', function=update_testdisk, other_results=other_results, width=40)
|
||||
|
||||
# Data Transfers
|
||||
print_info(' Data Transfers')
|
||||
try_and_print(message='FastCopy...', function=update_fastcopy, other_results=other_results, width=40)
|
||||
try_and_print(message='Linux Reader...', function=update_linux_reader, other_results=other_results, width=40)
|
||||
try_and_print(message='wimlib...', function=update_wimlib, other_results=other_results, width=40)
|
||||
try_and_print(message='XYplorer...', function=update_xyplorer, other_results=other_results, width=40)
|
||||
|
||||
# Diagnostics
|
||||
print_info(' Diagnostics')
|
||||
try_and_print(message='AIDA64...', function=update_aida64, other_results=other_results, width=40)
|
||||
try_and_print(message='Autoruns...', function=update_autoruns, other_results=other_results, width=40)
|
||||
try_and_print(message='BleachBit...', function=update_bleachbit, other_results=other_results, width=40)
|
||||
try_and_print(message='Blue Screen View...', function=update_bluescreenview, other_results=other_results, width=40)
|
||||
try_and_print(message='ERUNT...', function=update_erunt, other_results=other_results, width=40)
|
||||
try_and_print(message='FurMark...', function=update_furmark, other_results=other_results, width=40)
|
||||
try_and_print(message='Hitman Pro...', function=update_hitmanpro, other_results=other_results, width=40)
|
||||
try_and_print(message='HWiNFO...', function=update_hwinfo, other_results=other_results, width=40)
|
||||
try_and_print(message='NirCmd...', function=update_nircmd, other_results=other_results, width=40)
|
||||
try_and_print(message='ProduKey...', function=update_produkey, other_results=other_results, width=40)
|
||||
|
||||
# Drivers
|
||||
print_info(' Drivers')
|
||||
try_and_print(message='Intel RST...', function=update_intel_rst, other_results=other_results, width=40)
|
||||
try_and_print(message='Intel SSD Toolbox...', function=update_intel_ssd_toolbox, other_results=other_results, width=40)
|
||||
try_and_print(message='Samsing Magician...', function=update_samsung_magician, other_results=other_results, width=40)
|
||||
if update_sdio:
|
||||
try_and_print(message='Snappy Driver Installer Origin...', function=update_sdi_origin, other_results=other_results, width=40)
|
||||
|
||||
# Installers
|
||||
print_info(' Installers')
|
||||
try_and_print(message='Adobe Reader DC...', function=update_adobe_reader_dc, other_results=other_results, width=40)
|
||||
try_and_print(message='ESET Configs...', function=update_eset_config, other_results=other_results, width=40)
|
||||
try_and_print(message='ESET NOD32...', function=update_eset_nod32, other_results=other_results, width=40)
|
||||
try_and_print(message='LibreOffice...', function=update_libreoffice, other_results=other_results, width=40)
|
||||
try_and_print(message='Macs Fan Control...', function=update_macs_fan_control, other_results=other_results, width=40)
|
||||
try_and_print(message='MS Office...', function=update_office, other_results=other_results, width=40)
|
||||
try_and_print(message='Visual C++ Runtimes...', function=update_vcredists, other_results=other_results, width=40)
|
||||
try_and_print(message='Windows Updates...', function=download_windows_updates, other_results=other_results, width=40)
|
||||
update_all_ninite(other_results=other_results, width=40)
|
||||
|
||||
# Misc
|
||||
print_info(' Misc')
|
||||
try_and_print(message='Caffeine...', function=update_caffeine, other_results=other_results, width=40)
|
||||
try_and_print(message='Classic Start Skin...', function=update_classic_start_skin, other_results=other_results, width=40)
|
||||
try_and_print(message='Du...', function=update_du, other_results=other_results, width=40)
|
||||
try_and_print(message='Everything...', function=update_everything, other_results=other_results, width=40)
|
||||
try_and_print(message='Firefox Extensions...', function=update_firefox_ublock_origin, other_results=other_results, width=40)
|
||||
try_and_print(message='PuTTY...', function=update_putty, other_results=other_results, width=40)
|
||||
try_and_print(message='ShutUp10...', function=update_shutup10, other_results=other_results, width=40)
|
||||
try_and_print(message='smartmontools...', function=update_smartmontools, other_results=other_results, width=40)
|
||||
try_and_print(message='Notepad++...', function=update_notepadplusplus, other_results=other_results, width=40)
|
||||
try_and_print(message='WizTree...', function=update_wiztree, other_results=other_results, width=40)
|
||||
try_and_print(message='XMPlay...', function=update_xmplay, other_results=other_results, width=40)
|
||||
|
||||
# Repairs
|
||||
print_info(' Repairs')
|
||||
try_and_print(message='AdwCleaner...', function=update_adwcleaner, other_results=other_results, width=40)
|
||||
try_and_print(message='ESET Online Scanner...', function=update_eset_online_scanner, other_results=other_results, width=40)
|
||||
try_and_print(message='KVRT...', function=update_kvrt, other_results=other_results, width=40)
|
||||
try_and_print(message='RKill...', function=update_rkill, other_results=other_results, width=40)
|
||||
try_and_print(message='TDSS Killer...', function=update_tdsskiller, other_results=other_results, width=40)
|
||||
try_and_print(message='WinAIO Repair...', function=update_winaiorepair, other_results=other_results, width=40)
|
||||
|
||||
# Uninstallers
|
||||
print_info(' Uninstallers')
|
||||
try_and_print(message='ESET AV Remover...', function=update_eset_av_remover, other_results=other_results, width=40)
|
||||
try_and_print(message='IObit Uninstaller...', function=update_iobit_uninstaller, other_results=other_results, width=40)
|
||||
|
||||
## Review ##
|
||||
print_standard('Please review the results and download/extract any missing items to .cbin')
|
||||
pause('Press Enter to compress the .cbin items')
|
||||
|
||||
## Compress ##
|
||||
print_success('Compressing tools')
|
||||
print_info(' _Drivers')
|
||||
for item in os.scandir(r'{}\_Drivers'.format(global_vars['CBinDir'])):
|
||||
if not re.search(r'^(_Drivers|.*7z)$', item.name, re.IGNORECASE):
|
||||
try_and_print(
|
||||
message='{}...'.format(item.name),
|
||||
function=compress_and_remove_item,
|
||||
other_results = other_results,
|
||||
width=40,
|
||||
item = item)
|
||||
print_info(' .cbin')
|
||||
for item in os.scandir(global_vars['CBinDir']):
|
||||
if not re.search(r'^(_Drivers|_include|.*7z)$', item.name, re.IGNORECASE):
|
||||
try_and_print(
|
||||
message='{}...'.format(item.name),
|
||||
function=compress_and_remove_item,
|
||||
other_results = other_results,
|
||||
width=40,
|
||||
item = item)
|
||||
|
||||
## Generate Launchers
|
||||
print_success('Generating launchers')
|
||||
for section in sorted(LAUNCHERS.keys()):
|
||||
print_info(' {}'.format(section))
|
||||
for name, options in sorted(LAUNCHERS[section].items()):
|
||||
try_and_print(message=name, function=generate_launcher,
|
||||
section=section, name=name, options=options,
|
||||
other_results=other_results, width=40)
|
||||
|
||||
# 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
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
# Wizard Kit: Copy user data to the system from a local or network source
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.data import *
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: User Data Transfer Tool'.format(KIT_NAME_FULL))
|
||||
set_log_file('User Data Transfer.log')
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
# Prep
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: User Data Transfer Tool\n'.format(KIT_NAME_FULL))
|
||||
|
||||
# Get backup name prefix
|
||||
ticket_number = get_ticket_number()
|
||||
if ENABLED_TICKET_NUMBERS:
|
||||
backup_prefix = ticket_number
|
||||
else:
|
||||
backup_prefix = get_simple_string(prompt='Enter backup name prefix')
|
||||
backup_prefix = backup_prefix.replace(' ', '_')
|
||||
|
||||
# Set destination
|
||||
folder_path = r'{}\Transfer'.format(KIT_NAME_SHORT)
|
||||
dest = select_destination(folder_path=folder_path,
|
||||
prompt='Which disk are we transferring to?')
|
||||
|
||||
# Set source items
|
||||
source = select_source(backup_prefix)
|
||||
items = scan_source(source, dest)
|
||||
|
||||
# Transfer
|
||||
clear_screen()
|
||||
print_info('Transfer Details:\n')
|
||||
if ENABLED_TICKET_NUMBERS:
|
||||
show_data('Ticket:', ticket_number)
|
||||
show_data('Source:', source.path)
|
||||
show_data('Destination:', dest)
|
||||
|
||||
if (not ask('Proceed with transfer?')):
|
||||
umount_backup_shares()
|
||||
abort()
|
||||
|
||||
print_info('Transferring Data')
|
||||
transfer_source(source, dest, items)
|
||||
try_and_print(message='Removing extra files...',
|
||||
function=cleanup_transfer, cs='Done', dest_path=dest)
|
||||
umount_backup_shares()
|
||||
|
||||
# Done
|
||||
try_and_print(message='Running KVRT...',
|
||||
function=run_kvrt, cs='Started')
|
||||
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
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
# Wizard Kit: Windows updates
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.windows_updates import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Windows Updates Tool'.format(KIT_NAME_FULL))
|
||||
set_log_file('Windows Updates Tool.log')
|
||||
D7_MODE = 'd7mode' in sys.argv
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
clear_screen()
|
||||
print_info('{}: Windows Updates Tool\n'.format(KIT_NAME_FULL))
|
||||
|
||||
# Check args
|
||||
if '--disable' in sys.argv:
|
||||
disable_windows_updates()
|
||||
elif '--enable' in sys.argv:
|
||||
enable_windows_updates()
|
||||
else:
|
||||
print_error('Bad mode.')
|
||||
abort()
|
||||
|
||||
# Done
|
||||
exit_script()
|
||||
except GenericError as err:
|
||||
# Failed to complete request, show error(s) and prompt tech
|
||||
print_standard(' ')
|
||||
for line in str(err).splitlines():
|
||||
print_warning(line)
|
||||
print_standard(' ')
|
||||
print_error('Error(s) encountered, see above.')
|
||||
print_standard(' ')
|
||||
if '--disable' in sys.argv:
|
||||
if D7_MODE:
|
||||
print_warning('Please disable d7II auto mode!')
|
||||
print_standard('Then reboot, re-enable this step, and try again.')
|
||||
else:
|
||||
print_standard('Please reboot and try again.')
|
||||
pause('Press Enter to exit... ')
|
||||
exit_script(1)
|
||||
except SystemExit as sys_exit:
|
||||
exit_script(sys_exit.code)
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
# Wizard Kit: WinPE Root Menu
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.winpe_menus import *
|
||||
# Fix 7-Zip name
|
||||
TOOLS['SevenZip'].pop('64')
|
||||
init_global_vars()
|
||||
set_title('{}: Root Menu'.format(KIT_NAME_FULL))
|
||||
set_log_file('WinPE.log')
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
menu_root()
|
||||
except SystemExit as sys_exit:
|
||||
exit_script(sys_exit.code)
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
@ -19,7 +19,7 @@ def main():
|
|||
print('')
|
||||
|
||||
# Run
|
||||
try_print.run('SFC scan...', wk.os.win.run_sfc_scan)
|
||||
try_print.run('SFC scan...', wk.repairs.win.run_sfc_scan)
|
||||
|
||||
# Done
|
||||
print('Done')
|
||||
|
|
|
|||
|
|
@ -4,19 +4,19 @@
|
|||
import platform
|
||||
from sys import version_info as version
|
||||
|
||||
from wk import cfg
|
||||
from wk import debug
|
||||
from wk import exe
|
||||
from wk import hw
|
||||
from wk import io
|
||||
from wk import kit
|
||||
from wk import log
|
||||
from wk import net
|
||||
from wk import os
|
||||
from wk import repairs
|
||||
from wk import std
|
||||
from wk import sw
|
||||
from wk import tmux
|
||||
from . import cfg
|
||||
from . import debug
|
||||
from . import exe
|
||||
from . import hw
|
||||
from . import io
|
||||
from . import kit
|
||||
from . import log
|
||||
from . import net
|
||||
from . import os
|
||||
from . import repairs
|
||||
from . import setup
|
||||
from . import std
|
||||
from . import tmux
|
||||
|
||||
if platform.system() != 'Windows':
|
||||
from wk import graph
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
"""WizardKit: cfg module init"""
|
||||
|
||||
from wk.cfg import ddrescue
|
||||
from wk.cfg import hw
|
||||
from wk.cfg import log
|
||||
from wk.cfg import main
|
||||
from wk.cfg import net
|
||||
from wk.cfg import tools
|
||||
from wk.cfg import ufd
|
||||
from . import ddrescue
|
||||
from . import hw
|
||||
from . import log
|
||||
from . import main
|
||||
from . import net
|
||||
from . import sources
|
||||
from . import ufd
|
||||
from . import windows_builds
|
||||
|
|
|
|||
|
|
@ -32,8 +32,10 @@ SOURCES = {
|
|||
'Everything32': 'https://www.voidtools.com/Everything-1.4.1.1005.x86.en-US.zip',
|
||||
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.1005.x64.en-US.zip',
|
||||
'FastCopy': 'https://ftp.vector.co.jp/73/10/2323/FastCopy392_installer.exe',
|
||||
'Fluent-Metro': 'https://github.com/bonzibudd/Fluent-Metro/releases/download/v1.5.2/Fluent-Metro_1.5.2.zip',
|
||||
'FurMark': 'https://geeks3d.com/dl/get/569',
|
||||
'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/3740966/ublock_origin-1.34.0-an+fx.xpi',
|
||||
'Firefox32': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win&lang=en-US',
|
||||
'Firefox64': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US',
|
||||
'HitmanPro': 'https://dl.surfright.nl/HitmanPro.exe',
|
||||
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
|
||||
'HWiNFO': 'https://files1.majorgeeks.com/c8a055180587599139f8f454712dcc618cd1740e/systeminfo/hwi_702.zip',
|
||||
|
|
@ -47,6 +49,7 @@ SOURCES = {
|
|||
'NirCmd32': 'https://www.nirsoft.net/utils/nircmd.zip',
|
||||
'NirCmd64': 'https://www.nirsoft.net/utils/nircmd-x64.zip',
|
||||
'NotepadPlusPlus': 'https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v7.9.5/npp.7.9.5.portable.minimalist.7z',
|
||||
'OpenShell': 'https://github.com/Open-Shell/Open-Shell-Menu/releases/download/v4.4.160/OpenShellSetup_4_4_160.exe',
|
||||
'Office Deployment Tool': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_11617-33601.exe',
|
||||
'ProduKey32': 'http://www.nirsoft.net/utils/produkey.zip',
|
||||
'ProduKey64': 'http://www.nirsoft.net/utils/produkey-x64.zip',
|
||||
|
|
@ -56,10 +59,17 @@ SOURCES = {
|
|||
'Samsung Magician': 'https://s3.ap-northeast-2.amazonaws.com/global.semi.static/SAMSUNG_SSD_v5_3_0_181121/CD0C7CC1BE00525FAC4675B9E502899B41D5C3909ECE3AA2FB6B74A766B2A1EA/Samsung_Magician_Installer.zip',
|
||||
'SDIO Themes': 'http://snappy-driver-installer.org/downloads/SDIO_Themes.zip',
|
||||
'SDIO Torrent': 'http://snappy-driver-installer.org/downloads/SDIO_Update.torrent',
|
||||
'Software Bundle': 'https://ninite.com/.net4.8-7zip-chrome-edge-vlc/ninite.exe',
|
||||
'ShutUp10': 'https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe',
|
||||
'smartmontools': 'https://1278-105252244-gh.circle-artifacts.com/0/builds/smartmontools-win32-setup-7.3-r5216.exe',
|
||||
'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe',
|
||||
'TestDisk': 'https://www.cgsecurity.org/testdisk-7.2-WIP.win.zip',
|
||||
'VCRedist_2012_x32': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe',
|
||||
'VCRedist_2012_x64': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe',
|
||||
'VCRedist_2013_x32': 'https://aka.ms/highdpimfc2013x86enu',
|
||||
'VCRedist_2013_x64': 'https://aka.ms/highdpimfc2013x64enu',
|
||||
'VCRedist_2019_x32': 'https://aka.ms/vs/16/release/vc_redist.x86.exe',
|
||||
'VCRedist_2019_x64': 'https://aka.ms/vs/16/release/vc_redist.x64.exe',
|
||||
'wimlib32': 'https://wimlib.net/downloads/wimlib-1.13.3-windows-i686-bin.zip',
|
||||
'wimlib64': 'https://wimlib.net/downloads/wimlib-1.13.3-windows-x86_64-bin.zip',
|
||||
'WinAIO Repair': 'http://www.tweaking.com/files/setups/tweaking.com_windows_repair_aio.zip',
|
||||
36
scripts/wk/cfg/windows_builds.py
Normal file
36
scripts/wk/cfg/windows_builds.py
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
"""WizardKit: Config - Windows Builds"""
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
||||
|
||||
OLDEST_SUPPORTED_BUILD = 19041 # Windows 10 20H1
|
||||
OUTDATED_BUILD_NUMBERS = (
|
||||
9600, # Windows 8.1 Update
|
||||
18363, # Windows 10 19H2
|
||||
)
|
||||
WINDOWS_BUILDS = {
|
||||
# Windows 7
|
||||
'6.1.7600': 'RTM "Vienna"',
|
||||
'6.1.7601': 'SP1 "Vienna"',
|
||||
|
||||
# Windows 8
|
||||
'6.2.9200': 'RTM',
|
||||
|
||||
# Widnows 8.1
|
||||
'6.3.9200': '"Blue"',
|
||||
'6.3.9600': '"Update"',
|
||||
|
||||
# Windows 10
|
||||
'10.0.10240': '1507 "Threshold 1"',
|
||||
'10.0.10586': '1511 "Threshold 2"',
|
||||
'10.0.14393': '1607 "Redstone 1"',
|
||||
'10.0.15063': '1703 "Redstone 2"',
|
||||
'10.0.16299': '1709 "Redstone 3"',
|
||||
'10.0.17134': '1803 "Redstone 4"',
|
||||
'10.0.17763': '1809 "Redstone 5"',
|
||||
'10.0.18362': '1903 / 19H1',
|
||||
'10.0.18363': '1909 / 19H2',
|
||||
'10.0.19041': '2004 / 20H1',
|
||||
'10.0.19042': '20H2',
|
||||
'10.0.19043': '21H1',
|
||||
'10.0.19044': '21H2',
|
||||
}
|
||||
|
|
@ -67,7 +67,7 @@ class NonBlockingStreamReader():
|
|||
out = self.read(0.1)
|
||||
if out:
|
||||
out_bytes += out
|
||||
with open(out_path, 'a') as _f:
|
||||
with open(out_path, 'a', encoding='utf-8') as _f:
|
||||
_f.write(out_bytes.decode('utf-8', errors='ignore'))
|
||||
|
||||
# Close stream to prevent 100% CPU usage
|
||||
|
|
@ -200,6 +200,7 @@ def popen_program(cmd, minimized=False, pipe=False, shell=False, **kwargs):
|
|||
shell=shell,
|
||||
**kwargs)
|
||||
try:
|
||||
# pylint: disable=consider-using-with
|
||||
proc = subprocess.Popen(**cmd_kwargs)
|
||||
except FileNotFoundError:
|
||||
LOG.error('Command not found: %s', cmd)
|
||||
|
|
|
|||
|
|
@ -2,9 +2,9 @@
|
|||
|
||||
import platform
|
||||
|
||||
from wk.hw import obj
|
||||
from wk.hw import sensors
|
||||
from . import obj
|
||||
from . import sensors
|
||||
|
||||
if platform.system() != 'Windows':
|
||||
from wk.hw import ddrescue
|
||||
from wk.hw import diags
|
||||
from . import ddrescue
|
||||
from . import diags
|
||||
|
|
|
|||
|
|
@ -403,7 +403,7 @@ class State():
|
|||
|
||||
# Try loading JSON data
|
||||
if settings_file.exists():
|
||||
with open(settings_file, 'r') as _f:
|
||||
with open(settings_file, 'r', encoding='utf-8') as _f:
|
||||
try:
|
||||
settings = json.loads(_f.read())
|
||||
except (OSError, json.JSONDecodeError) as err:
|
||||
|
|
@ -451,7 +451,7 @@ class State():
|
|||
|
||||
# Try saving JSON data
|
||||
try:
|
||||
with open(settings_file, 'w') as _f:
|
||||
with open(settings_file, 'w', encoding='utf-8') as _f:
|
||||
json.dump(settings, _f)
|
||||
except OSError as err:
|
||||
std.print_error('Failed to save clone settings')
|
||||
|
|
@ -904,7 +904,7 @@ class State():
|
|||
f'{self.working_dir}/'
|
||||
f'sfdisk_{self.destination.path.name}.script'
|
||||
)
|
||||
with open(script_path, 'w') as _f:
|
||||
with open(script_path, 'w', encoding='utf-8') as _f:
|
||||
_f.write('\n'.join(sfdisk_script))
|
||||
|
||||
# Skip real format for dry runs
|
||||
|
|
@ -914,7 +914,7 @@ class State():
|
|||
|
||||
# Format disk
|
||||
LOG.warning('Formatting destination: %s', self.destination.path)
|
||||
with open(script_path, 'r') as _f:
|
||||
with open(script_path, 'r', encoding='utf-8') as _f:
|
||||
proc = exe.run_program(
|
||||
cmd=['sudo', 'sfdisk', self.destination.path],
|
||||
stdin=_f,
|
||||
|
|
@ -942,7 +942,7 @@ class State():
|
|||
pair.status[name] = 'Pending'
|
||||
|
||||
# Mark all non-trimmed, non-scraped, and bad areas as non-tried
|
||||
with open(pair.map_path, 'r') as _f:
|
||||
with open(pair.map_path, 'r', encoding='utf-8') as _f:
|
||||
for line in _f.readlines():
|
||||
line = line.strip()
|
||||
if line.startswith('0x') and line.endswith(bad_statuses):
|
||||
|
|
@ -950,7 +950,7 @@ class State():
|
|||
map_data.append(line)
|
||||
|
||||
# Save updated map
|
||||
with open(pair.map_path, 'w') as _f:
|
||||
with open(pair.map_path, 'w', encoding='utf-8') as _f:
|
||||
_f.write('\n'.join(map_data))
|
||||
|
||||
# Reinitialize status
|
||||
|
|
@ -1021,14 +1021,15 @@ class State():
|
|||
|
||||
# State (self)
|
||||
std.save_pickles({'state': self}, debug_dir)
|
||||
with open(f'{debug_dir}/state.report', 'a') as _f:
|
||||
with open(f'{debug_dir}/state.report', 'a', encoding='utf-8') as _f:
|
||||
_f.write('[Debug report]\n')
|
||||
_f.write('\n'.join(debug.generate_object_report(self)))
|
||||
_f.write('\n')
|
||||
|
||||
# Block pairs
|
||||
for _bp in self.block_pairs:
|
||||
with open(f'{debug_dir}/block_pairs.report', 'a') as _f:
|
||||
with open(
|
||||
f'{debug_dir}/block_pairs.report', 'a', encoding='utf-8') as _f:
|
||||
_f.write('[Debug report]\n')
|
||||
_f.write('\n'.join(debug.generate_object_report(_bp)))
|
||||
_f.write('\n')
|
||||
|
|
@ -1093,7 +1094,7 @@ class State():
|
|||
|
||||
# Write to progress file
|
||||
out_path = pathlib.Path(f'{self.log_dir}/progress.out')
|
||||
with open(out_path, 'w') as _f:
|
||||
with open(out_path, 'w', encoding='utf-8') as _f:
|
||||
_f.write('\n'.join(report))
|
||||
|
||||
def update_top_panes(self):
|
||||
|
|
@ -2033,7 +2034,7 @@ def run_ddrescue(state, block_pair, pass_name, settings, dry_run=True):
|
|||
"""Update SMART pane every 30 seconds."""
|
||||
state.source.update_smart_details()
|
||||
now = datetime.datetime.now(tz=TIMEZONE).strftime('%Y-%m-%d %H:%M %Z')
|
||||
with open(f'{state.log_dir}/smart.out', 'w') as _f:
|
||||
with open(f'{state.log_dir}/smart.out', 'w', encoding='utf-8') as _f:
|
||||
_f.write(
|
||||
std.color_string(
|
||||
['SMART Attributes', f'Updated: {now}\n'],
|
||||
|
|
|
|||
|
|
@ -386,11 +386,11 @@ class State():
|
|||
|
||||
# State (self)
|
||||
std.save_pickles({'state': self}, debug_dir)
|
||||
with open(f'{debug_dir}/state.report', 'a') as _f:
|
||||
with open(f'{debug_dir}/state.report', 'a', encoding='utf-8') as _f:
|
||||
_f.write('\n'.join(debug.generate_object_report(self)))
|
||||
|
||||
# CPU/RAM
|
||||
with open(f'{debug_dir}/cpu.report', 'a') as _f:
|
||||
with open(f'{debug_dir}/cpu.report', 'a', encoding='utf-8') as _f:
|
||||
_f.write('\n'.join(debug.generate_object_report(self.cpu)))
|
||||
_f.write('\n\n[Tests]')
|
||||
for name, test in self.cpu.tests.items():
|
||||
|
|
@ -399,7 +399,9 @@ class State():
|
|||
|
||||
# Disks
|
||||
for disk in self.disks:
|
||||
with open(f'{debug_dir}/disk_{disk.path.name}.report', 'a') as _f:
|
||||
with open(
|
||||
f'{debug_dir}/disk_{disk.path.name}.report', 'a',
|
||||
encoding='utf-8') as _f:
|
||||
_f.write('\n'.join(debug.generate_object_report(disk)))
|
||||
_f.write('\n\n[Tests]')
|
||||
for name, test in disk.tests.items():
|
||||
|
|
@ -427,7 +429,7 @@ class State():
|
|||
except Exception: # pylint: disable=broad-except
|
||||
LOG.ERROR('Error(s) encountered while exporting SMC data')
|
||||
data = [line.strip() for line in data]
|
||||
with open(f'{debug_dir}/smc.data', 'a') as _f:
|
||||
with open(f'{debug_dir}/smc.data', 'a', encoding='utf-8') as _f:
|
||||
_f.write('\n'.join(data))
|
||||
|
||||
def update_clock(self):
|
||||
|
|
@ -464,7 +466,7 @@ class State():
|
|||
|
||||
# Write to progress file
|
||||
out_path = pathlib.Path(f'{self.log_dir}/progress.out')
|
||||
with open(out_path, 'w') as _f:
|
||||
with open(out_path, 'w', encoding='utf-8') as _f:
|
||||
_f.write('\n'.join(report))
|
||||
|
||||
def update_top_pane(self, text):
|
||||
|
|
@ -697,7 +699,7 @@ def check_mprime_results(test_obj, working_dir):
|
|||
"""Read file and split into lines, returns list."""
|
||||
lines = []
|
||||
try:
|
||||
with open(f'{working_dir}/{log_name}', 'r') as _f:
|
||||
with open(f'{working_dir}/{log_name}', 'r', encoding='utf-8') as _f:
|
||||
lines = _f.readlines()
|
||||
except FileNotFoundError:
|
||||
# File may be missing on older systems
|
||||
|
|
@ -990,7 +992,7 @@ def disk_io_benchmark(state, test_objects, skip_usb=True):
|
|||
match.group(1)
|
||||
|
||||
# Show progress
|
||||
with open(log_path, 'a') as _f:
|
||||
with open(log_path, 'a', encoding='utf-8') as _f:
|
||||
if _i % 5 == 0:
|
||||
percent = (_i / dd_values['Read Chunks']) * 100
|
||||
_f.write(f' {graph.vertical_graph_line(percent, read_rates[-1])}\n')
|
||||
|
|
@ -1175,7 +1177,7 @@ def disk_surface_scan(state, test_objects):
|
|||
|
||||
# Start scan
|
||||
cmd = ['sudo', 'badblocks', '-sv', '-b', block_size, '-e', '1', dev_path]
|
||||
with open(log_path, 'a') as _f:
|
||||
with open(log_path, 'a', encoding='utf-8') as _f:
|
||||
size_str = std.bytes_to_string(dev.details["size"], use_binary=False)
|
||||
_f.write(
|
||||
std.color_string(
|
||||
|
|
@ -1194,7 +1196,7 @@ def disk_surface_scan(state, test_objects):
|
|||
)
|
||||
|
||||
# Check results
|
||||
with open(log_path, 'r') as _f:
|
||||
with open(log_path, 'r', encoding='utf-8') as _f:
|
||||
for line in _f.readlines():
|
||||
line = std.strip_colors(line.strip())
|
||||
if not line or line.startswith('Checking') or line.startswith('['):
|
||||
|
|
@ -1816,13 +1818,13 @@ def show_results(state):
|
|||
def start_mprime(working_dir, log_path):
|
||||
"""Start mprime and save filtered output to log, returns Popen object."""
|
||||
set_apple_fan_speed('max')
|
||||
proc_mprime = subprocess.Popen(
|
||||
proc_mprime = subprocess.Popen( # pylint: disable=consider-using-with
|
||||
['mprime', '-t'],
|
||||
cwd=working_dir,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT,
|
||||
)
|
||||
proc_grep = subprocess.Popen(
|
||||
proc_grep = subprocess.Popen( # pylint: disable=consider-using-with
|
||||
'grep --ignore-case --invert-match --line-buffered stress.txt'.split(),
|
||||
stdin=proc_mprime.stdout,
|
||||
stdout=subprocess.PIPE,
|
||||
|
|
@ -1861,7 +1863,9 @@ def start_sysbench(sensors, sensors_out, log_path, pane):
|
|||
tmux.respawn_pane(pane, watch_file=log_path, watch_cmd='tail')
|
||||
|
||||
# Start sysbench
|
||||
filehandle_sysbench = open(log_path, 'a')
|
||||
filehandle_sysbench = open( # pylint: disable=consider-using-with
|
||||
log_path, 'a', encoding='utf-8',
|
||||
)
|
||||
proc_sysbench = exe.popen_program(sysbench_cmd, stdout=filehandle_sysbench)
|
||||
|
||||
# Done
|
||||
|
|
|
|||
|
|
@ -370,9 +370,11 @@ class Disk(BaseObj):
|
|||
self.details[attr] = -1
|
||||
|
||||
# Set description
|
||||
self.description = '{size_str} ({bus}) {model} {serial}'.format(
|
||||
size_str=bytes_to_string(self.details['size'], use_binary=False),
|
||||
**self.details,
|
||||
self.description = (
|
||||
f'{bytes_to_string(self.details["size"], use_binary=False)}'
|
||||
f' ({self.details["bus"]})'
|
||||
f' {self.details["model"]}'
|
||||
f' {self.details["serial"]}'
|
||||
)
|
||||
|
||||
def get_labels(self):
|
||||
|
|
@ -496,7 +498,7 @@ class Disk(BaseObj):
|
|||
test_minutes = int(test_minutes) + 10
|
||||
|
||||
# Start test
|
||||
with open(log_path, 'w') as _f:
|
||||
with open(log_path, 'w', encoding='utf-8') as _f:
|
||||
_f.write(f'{header_str}\nInitializing...')
|
||||
cmd = [
|
||||
'sudo',
|
||||
|
|
@ -521,7 +523,7 @@ class Disk(BaseObj):
|
|||
status_str = status_str.capitalize()
|
||||
|
||||
# Update log
|
||||
with open(log_path, 'w') as _f:
|
||||
with open(log_path, 'w', encoding='utf-8') as _f:
|
||||
_f.write(f'{header_str}\nSMART self-test status:\n {status_str}')
|
||||
|
||||
# Check if finished
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ class Sensors():
|
|||
if thermal_action:
|
||||
run_program(thermal_action, check=False)
|
||||
report = self.generate_report(*temp_labels)
|
||||
with open(out_path, 'w') as _f:
|
||||
with open(out_path, 'w', encoding='utf-8') as _f:
|
||||
_f.write('\n'.join(report))
|
||||
|
||||
# Check if we should stop
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
import platform
|
||||
|
||||
from wk.kit import tools
|
||||
from . import tools
|
||||
|
||||
if platform.system() == 'Linux':
|
||||
from wk.kit import ufd
|
||||
from . import ufd
|
||||
|
|
|
|||
|
|
@ -4,18 +4,18 @@
|
|||
from datetime import datetime, timedelta
|
||||
import logging
|
||||
import pathlib
|
||||
import sys
|
||||
import platform
|
||||
|
||||
import requests
|
||||
|
||||
from wk.cfg.main import ARCHIVE_PASSWORD
|
||||
from wk.cfg.tools import SOURCES, DOWNLOAD_FREQUENCY
|
||||
from wk.cfg.sources import DOWNLOAD_FREQUENCY, SOURCES
|
||||
from wk.exe import popen_program, run_program
|
||||
from wk.std import GenericError
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
ARCH = '64' if sys.maxsize > 2**32 else '32'
|
||||
ARCH = '64' if platform.architecture()[0] == '64bit' else '32'
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
|
|
@ -27,10 +27,12 @@ CACHED_DIRS = {}
|
|||
def download_file(out_path, source_url, as_new=False, overwrite=False):
|
||||
"""Download a file using requests, returns pathlib.Path."""
|
||||
out_path = pathlib.Path(out_path).resolve()
|
||||
name = out_path.name
|
||||
download_failed = None
|
||||
download_msg = f'Downloading {name}...'
|
||||
if as_new:
|
||||
out_path = out_path.with_suffix(f'{out_path.suffix}.new')
|
||||
cursor_left = '\u001B[14D'
|
||||
print(f'Downloading...{cursor_left}', end='', flush=True)
|
||||
print(download_msg, end='', flush=True)
|
||||
|
||||
# Avoid clobbering
|
||||
if out_path.exists() and not overwrite:
|
||||
|
|
@ -40,15 +42,17 @@ def download_file(out_path, source_url, as_new=False, overwrite=False):
|
|||
out_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Request download
|
||||
response = requests.get(source_url, stream=True)
|
||||
if not response.ok:
|
||||
name = out_path.name
|
||||
if as_new:
|
||||
name = name[:-4]
|
||||
LOG.error(
|
||||
'Failed to download file (status %s): %s',
|
||||
response.status_code, name,
|
||||
)
|
||||
try:
|
||||
response = requests.get(source_url, stream=True)
|
||||
except requests.RequestException as _err:
|
||||
download_failed = _err
|
||||
else:
|
||||
if not response.ok:
|
||||
download_failed = response
|
||||
|
||||
# Download failed
|
||||
if download_failed:
|
||||
LOG.error('Failed to download file: %s', download_failed)
|
||||
raise GenericError(f'Failed to download file: {name}')
|
||||
|
||||
# Write to file
|
||||
|
|
@ -57,14 +61,14 @@ def download_file(out_path, source_url, as_new=False, overwrite=False):
|
|||
_f.write(chunk)
|
||||
|
||||
# Done
|
||||
print(f' {cursor_left}', end='', flush=True)
|
||||
print(f'\033[{len(download_msg)}D\033[0K', end='', flush=True)
|
||||
return out_path
|
||||
|
||||
|
||||
def download_tool(folder, name):
|
||||
def download_tool(folder, name, suffix=None):
|
||||
"""Download tool."""
|
||||
name_arch = f'{name}{ARCH}'
|
||||
out_path = get_tool_path(folder, name, check=False)
|
||||
out_path = get_tool_path(folder, name, check=False, suffix=suffix)
|
||||
up_to_date = False
|
||||
|
||||
# Check if tool is up to date
|
||||
|
|
@ -144,16 +148,18 @@ def find_kit_dir(name=None):
|
|||
return cur_path
|
||||
|
||||
|
||||
def get_tool_path(folder, name, check=True):
|
||||
def get_tool_path(folder, name, check=True, suffix=None):
|
||||
"""Get tool path, returns pathlib.Path"""
|
||||
bin_dir = find_kit_dir('.bin')
|
||||
if not suffix:
|
||||
suffix = 'exe'
|
||||
name_arch = f'{name}{ARCH}'
|
||||
|
||||
# "Search"
|
||||
tool_path = bin_dir.joinpath(f'{folder}/{name_arch}.exe')
|
||||
tool_path = bin_dir.joinpath(f'{folder}/{name_arch}.{suffix}')
|
||||
if not (tool_path.exists() or name_arch in SOURCES):
|
||||
# Use "default" path instead
|
||||
tool_path = tool_path.with_name(f'{name}.exe')
|
||||
tool_path = tool_path.with_name(f'{name}.{suffix}')
|
||||
|
||||
# Missing?
|
||||
if check and not tool_path.exists():
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ def build_ufd():
|
|||
)
|
||||
for s_label, s_path in sources.items():
|
||||
try_print.run(
|
||||
message='Copying {}...'.format(s_label),
|
||||
message=f'Copying {s_label}...',
|
||||
function=copy_source,
|
||||
source=s_path,
|
||||
items=ITEMS[s_label],
|
||||
|
|
@ -273,7 +273,7 @@ def copy_source(source, items, overwrite=False):
|
|||
|
||||
|
||||
def create_table(dev_path, use_mbr=False, images=None):
|
||||
"""Create GPT or DOS partition table, returns dict."""
|
||||
"""Create GPT or DOS partition table."""
|
||||
cmd = [
|
||||
'sudo',
|
||||
'parted', dev_path,
|
||||
|
|
@ -378,7 +378,7 @@ def get_uuid(path):
|
|||
|
||||
def hide_items(ufd_dev_first_partition, items):
|
||||
"""Set FAT32 hidden flag for items."""
|
||||
with open('/root/.mtoolsrc', 'w') as _f:
|
||||
with open('/root/.mtoolsrc', 'w', encoding='utf-8') as _f:
|
||||
_f.write(f'drive U: file="{ufd_dev_first_partition}"\n')
|
||||
_f.write('mtools_skip_check=1\n')
|
||||
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@
|
|||
import platform
|
||||
|
||||
if platform.system() == 'Darwin':
|
||||
from wk.os import mac
|
||||
from . import mac
|
||||
if platform.system() == 'Linux':
|
||||
from wk.os import linux
|
||||
from . import linux
|
||||
if platform.system() == 'Windows':
|
||||
from wk.os import win
|
||||
from . import win
|
||||
|
|
|
|||
|
|
@ -218,7 +218,7 @@ def scan_corestorage_container(container, timeout=300):
|
|||
# Create mapper device(s) if necessary
|
||||
for name, cmd in detected_volumes.items():
|
||||
cmd_file = make_temp_file()
|
||||
cmd_file.write_text(cmd)
|
||||
cmd_file.write_text(cmd, encoding='utf-8')
|
||||
proc = run_program(
|
||||
cmd=['sudo', 'dmsetup', 'create', name, cmd_file],
|
||||
check=False,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
"""WizardKit: Windows Functions"""
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
||||
import ctypes
|
||||
import logging
|
||||
import os
|
||||
import pathlib
|
||||
|
|
@ -16,12 +17,26 @@ except ImportError as err:
|
|||
raise err
|
||||
|
||||
from wk.borrowed import acpi
|
||||
from wk.exe import run_program
|
||||
from wk.std import GenericError, GenericWarning, sleep
|
||||
from wk.cfg.main import KIT_NAME_FULL
|
||||
from wk.cfg.windows_builds import (
|
||||
OLDEST_SUPPORTED_BUILD,
|
||||
OUTDATED_BUILD_NUMBERS,
|
||||
WINDOWS_BUILDS,
|
||||
)
|
||||
from wk.exe import get_json_from_command, run_program
|
||||
from wk.kit.tools import find_kit_dir
|
||||
from wk.std import (
|
||||
GenericError,
|
||||
GenericWarning,
|
||||
bytes_to_string,
|
||||
color_string,
|
||||
sleep,
|
||||
)
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
LOG = logging.getLogger(__name__)
|
||||
ARCH = '64' if platform.architecture()[0] == '64bit' else '32'
|
||||
CONEMU = 'ConEmuPID' in os.environ
|
||||
KNOWN_DATA_TYPES = {
|
||||
'BINARY': winreg.REG_BINARY,
|
||||
|
|
@ -57,6 +72,8 @@ KNOWN_HIVE_NAMES = {
|
|||
winreg.HKEY_USERS: 'HKEY_USERS',
|
||||
}
|
||||
OS_VERSION = float(platform.win32_ver()[0])
|
||||
RAM_OK = 5.5 * 1024**3 # ~6 GiB assuming a bit of shared memory
|
||||
RAM_WARNING = 3.5 * 1024**3 # ~4 GiB assuming a bit of shared memory
|
||||
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
||||
SLMGR = pathlib.Path(f'{os.environ.get("SYSTEMROOT")}/System32/slmgr.vbs')
|
||||
|
||||
|
|
@ -72,6 +89,11 @@ def activate_with_bios():
|
|||
#####################################################
|
||||
bios_key = None
|
||||
table = b"MSDM"
|
||||
# Check if activation is needed
|
||||
if is_activated():
|
||||
raise GenericWarning('System already activated')
|
||||
|
||||
# Get BIOS key
|
||||
if acpi.FindAcpiTable(table) is True:
|
||||
rawtable = acpi.GetAcpiTable(table)
|
||||
#http://msdn.microsoft.com/library/windows/hardware/hh673514
|
||||
|
|
@ -82,10 +104,6 @@ def activate_with_bios():
|
|||
if not bios_key:
|
||||
raise GenericError('BIOS key not found.')
|
||||
|
||||
# Check if activation is needed
|
||||
if is_activated():
|
||||
raise GenericWarning('System already activated')
|
||||
|
||||
# Install Key
|
||||
cmd = ['cscript', '//nologo', SLMGR, '/ipk', bios_key]
|
||||
run_program(cmd, check=False)
|
||||
|
|
@ -119,6 +137,189 @@ def is_activated():
|
|||
return act_str and 'permanent' in act_str
|
||||
|
||||
|
||||
# Date / Time functions
|
||||
def get_timezone():
|
||||
"""Get current timezone using tzutil, returns str."""
|
||||
cmd = ['tzutil', '/g']
|
||||
proc = run_program(cmd, check=False)
|
||||
return proc.stdout
|
||||
|
||||
|
||||
def set_timezone(zone):
|
||||
"""Set current timezone using tzutil."""
|
||||
cmd = ['tzutil', '/s', zone]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
|
||||
# Info Functions
|
||||
def check_4k_alignment(show_alert=False):
|
||||
"""Check if all partitions are 4K aligned, returns book."""
|
||||
cmd = ['WMIC', 'partition', 'get', 'StartingOffset']
|
||||
|
||||
# Check offsets
|
||||
proc = run_program(cmd)
|
||||
for offset in proc.stdout.splitlines():
|
||||
offset = offset.strip()
|
||||
if not offset.isnumeric():
|
||||
continue
|
||||
if int(offset) % 4096 != 0:
|
||||
# Not aligned
|
||||
if show_alert:
|
||||
show_alert_box('One or more partitions are not 4K aligned')
|
||||
raise GenericError('One or more partitions are not 4K aligned')
|
||||
|
||||
|
||||
def get_installed_antivirus():
|
||||
"""Get list of installed antivirus programs, returns list."""
|
||||
cmd = [
|
||||
'WMIC', r'/namespace:\\root\SecurityCenter2',
|
||||
'path', 'AntivirusProduct',
|
||||
'get', 'displayName', '/value',
|
||||
]
|
||||
products = []
|
||||
report = []
|
||||
|
||||
# Get list of products
|
||||
proc = run_program(cmd)
|
||||
for line in proc.stdout.splitlines():
|
||||
line = line.strip()
|
||||
if '=' in line:
|
||||
products.append(line.split('=')[1])
|
||||
|
||||
# Check product(s) status
|
||||
for product in sorted(products):
|
||||
cmd = [
|
||||
'WMIC', r'/namespace:\\root\SecurityCenter2',
|
||||
'path', 'AntivirusProduct',
|
||||
'where', f'displayName="{product}"',
|
||||
'get', 'productState', '/value',
|
||||
]
|
||||
proc = run_program(cmd)
|
||||
state = proc.stdout.split('=')[1]
|
||||
state = hex(int(state))
|
||||
if str(state)[3:5] not in ['10', '11']:
|
||||
report.append(color_string(f'[Disabled] {product}', 'YELLOW'))
|
||||
else:
|
||||
report.append(product)
|
||||
|
||||
# Final check
|
||||
if not report:
|
||||
report.append(color_string('No products detected', 'RED'))
|
||||
|
||||
# Done
|
||||
return report
|
||||
|
||||
|
||||
def get_installed_ram(as_list=False, raise_exceptions=False):
|
||||
"""Get installed RAM."""
|
||||
mem = psutil.virtual_memory()
|
||||
mem_str = bytes_to_string(mem.total, decimals=1)
|
||||
|
||||
# Raise exception if necessary
|
||||
if raise_exceptions:
|
||||
if RAM_OK > mem.total >= RAM_WARNING:
|
||||
raise GenericWarning(mem_str)
|
||||
if mem.total > RAM_WARNING:
|
||||
raise GenericError(mem_str)
|
||||
|
||||
# Done
|
||||
return [mem_str] if as_list else mem_str
|
||||
|
||||
|
||||
def get_os_activation(as_list=False, check=True):
|
||||
"""Get OS activation status, returns str.
|
||||
|
||||
NOTE: If check=True then raise an exception if OS isn't activated.
|
||||
"""
|
||||
act_str = get_activation_string()
|
||||
|
||||
if check and not is_activated():
|
||||
if 'unavailable' in act_str.lower():
|
||||
raise GenericWarning(act_str)
|
||||
# Else
|
||||
raise GenericError(act_str)
|
||||
|
||||
# Done
|
||||
return [act_str] if as_list else act_str
|
||||
|
||||
|
||||
def get_os_name(as_list=False, check=True):
|
||||
"""Build OS display name, returns str.
|
||||
|
||||
NOTE: If check=True then an exception is raised if the OS version is
|
||||
outdated or unsupported.
|
||||
"""
|
||||
key = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion'
|
||||
build_version = int(reg_read_value("HKLM", key, "CurrentBuild"))
|
||||
build_version_full = platform.win32_ver()[1]
|
||||
details = WINDOWS_BUILDS.get(build_version_full, f'Build {build_version}')
|
||||
display_name = (
|
||||
f'{reg_read_value("HKLM", key, "ProductName")} {ARCH}-bit {details}'
|
||||
)
|
||||
|
||||
# Check for support issues
|
||||
if check:
|
||||
if build_version in OUTDATED_BUILD_NUMBERS:
|
||||
raise GenericWarning(f'{display_name} (outdated)')
|
||||
|
||||
if build_version < OLDEST_SUPPORTED_BUILD:
|
||||
raise GenericError(f'{display_name} (unsupported)')
|
||||
|
||||
# Done
|
||||
return [display_name] if as_list else display_name
|
||||
|
||||
|
||||
def get_raw_disks():
|
||||
"""Get all disks without a partiton table, returns list."""
|
||||
script_path = find_kit_dir('Scripts').joinpath('get_raw_disks.ps1')
|
||||
cmd = ['PowerShell', '-ExecutionPolicy', 'Bypass', '-File', script_path]
|
||||
json_data = get_json_from_command(cmd)
|
||||
raw_disks = []
|
||||
|
||||
# Fix JSON if only one disk was detected
|
||||
if isinstance(json_data, dict):
|
||||
json_data = [json_data]
|
||||
|
||||
# Parse JSON
|
||||
for disk in json_data:
|
||||
size_str = bytes_to_string(int(disk["Size"]), use_binary=False)
|
||||
raw_disks.append(f'{disk["FriendlyName"]} ({size_str})')
|
||||
|
||||
# Done
|
||||
return raw_disks
|
||||
|
||||
|
||||
def get_volume_usage(use_colors=False):
|
||||
"""Get space usage info for all fixed volumes, returns list."""
|
||||
report = []
|
||||
for disk in psutil.disk_partitions():
|
||||
if 'fixed' not in disk.opts:
|
||||
continue
|
||||
total, _, free, percent = psutil.disk_usage(disk.device)
|
||||
color = None
|
||||
if percent > 85:
|
||||
color = 'RED'
|
||||
elif percent > 75:
|
||||
color = 'YELLOW'
|
||||
display_str = (
|
||||
f'{free/total:>5.2f}% Free'
|
||||
f' ({bytes_to_string(free, 2):>10} / {bytes_to_string(total, 2):>10})'
|
||||
)
|
||||
if use_colors:
|
||||
display_str = color_string(display_str, color)
|
||||
report.append(f'{disk.device} {display_str}')
|
||||
|
||||
# Done
|
||||
return report
|
||||
|
||||
|
||||
def show_alert_box(message, title=None):
|
||||
"""Show Windows alert box with message."""
|
||||
title = title if title else f'{KIT_NAME_FULL} Warning'
|
||||
message_box = ctypes.windll.user32.MessageBoxW
|
||||
message_box(None, message, title, 0x00001030)
|
||||
|
||||
|
||||
# Registry Functions
|
||||
def reg_delete_key(hive, key, recurse=False):
|
||||
# pylint: disable=raise-missing-from
|
||||
|
|
@ -221,7 +422,10 @@ def reg_key_exists(hive, key):
|
|||
|
||||
|
||||
def reg_read_value(hive, key, value, force_32=False, force_64=False):
|
||||
"""Query value from hive/hey, returns multiple types."""
|
||||
"""Query value from hive/hey, returns multiple types.
|
||||
|
||||
NOTE: Set value='' to read the default value.
|
||||
"""
|
||||
access = winreg.KEY_READ
|
||||
data = None
|
||||
hive = reg_get_hive(hive)
|
||||
|
|
@ -344,6 +548,72 @@ def enable_safemode_msi():
|
|||
run_program(cmd)
|
||||
|
||||
|
||||
# Secure Boot Functions
|
||||
def is_booted_uefi():
|
||||
"""Check if booted UEFI or legacy, returns bool."""
|
||||
kernel = ctypes.windll.kernel32
|
||||
firmware_type = ctypes.c_uint()
|
||||
|
||||
# Get value from kernel32 API (firmware_type is updated by the call)
|
||||
try:
|
||||
kernel.GetFirmwareType(ctypes.byref(firmware_type))
|
||||
except Exception: # pylint: disable=broad-except
|
||||
# Ignore and set firmware_type back to zero
|
||||
firmware_type = ctypes.c_uint(0)
|
||||
|
||||
# Check result
|
||||
return firmware_type.value == 2
|
||||
|
||||
|
||||
def is_secure_boot_enabled(raise_exceptions=False, show_alert=False):
|
||||
"""Check if Secure Boot is enabled, returns bool.
|
||||
|
||||
If raise_exceptions is True then an exception is raised with details.
|
||||
If show_alert is True a popup alert box is shown if it's not enabled.
|
||||
"""
|
||||
booted_uefi = is_booted_uefi()
|
||||
cmd = ['PowerShell', '-Command', 'Confirm-SecureBootUEFI']
|
||||
enabled = False
|
||||
msg_error = None
|
||||
msg_warning = None
|
||||
|
||||
# Bail early
|
||||
if OS_VERSION < 8:
|
||||
if raise_exceptions:
|
||||
raise GenericWarning(f'Secure Boot not available for {OS_VERSION}')
|
||||
return False
|
||||
|
||||
# Check results
|
||||
proc = run_program(cmd, check=False)
|
||||
if proc.returncode:
|
||||
# Something went wrong
|
||||
if booted_uefi:
|
||||
msg_warning = 'UNKNOWN'
|
||||
else:
|
||||
msg_warning = 'DISABLED\n\nOS installed LEGACY'
|
||||
else:
|
||||
# Command completed
|
||||
enabled = 'True' in proc.stdout
|
||||
if 'False' in proc.stdout:
|
||||
msg_error = 'ERROR'
|
||||
else:
|
||||
msg_warning = 'UNKNOWN'
|
||||
|
||||
# Show popup and/or raise exceptions as necessary
|
||||
for msg, exc in ((msg_error, GenericError), (msg_warning, GenericWarning)):
|
||||
if not msg:
|
||||
continue
|
||||
msg = f'Secure Boot {msg}'
|
||||
if show_alert:
|
||||
show_alert_box(msg)
|
||||
if raise_exceptions:
|
||||
raise exc(msg)
|
||||
break
|
||||
|
||||
# Done
|
||||
return enabled
|
||||
|
||||
|
||||
# Service Functions
|
||||
def disable_service(service_name):
|
||||
"""Set service startup to disabled."""
|
||||
|
|
@ -414,19 +684,5 @@ def stop_service(service_name):
|
|||
raise GenericError(f'Failed to stop service {service_name}')
|
||||
|
||||
|
||||
# Date / Time functions
|
||||
def get_timezone():
|
||||
"""Get current timezone using tzutil, returns str."""
|
||||
cmd = ['tzutil', '/g']
|
||||
proc = run_program(cmd, check=False)
|
||||
return proc.stdout
|
||||
|
||||
|
||||
def set_timezone(zone):
|
||||
"""Set current timezone using tzutil."""
|
||||
cmd = ['tzutil', '/s', zone]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
|
|||
|
|
@ -4,4 +4,4 @@
|
|||
import platform
|
||||
|
||||
if platform.system() == 'Windows':
|
||||
from wk.repairs import win
|
||||
from . import win
|
||||
|
|
|
|||
|
|
@ -33,17 +33,6 @@ from wk.kit.tools import (
|
|||
run_tool,
|
||||
)
|
||||
from wk.log import format_log_path, update_log_path
|
||||
from wk.os.win import (
|
||||
get_timezone,
|
||||
set_timezone,
|
||||
reg_delete_value,
|
||||
reg_read_value,
|
||||
reg_set_value,
|
||||
reg_write_settings,
|
||||
disable_service,
|
||||
enable_service,
|
||||
stop_service,
|
||||
)
|
||||
from wk.std import (
|
||||
GenericError,
|
||||
GenericWarning,
|
||||
|
|
@ -62,6 +51,34 @@ from wk.std import (
|
|||
sleep,
|
||||
strip_colors,
|
||||
)
|
||||
if platform.system() == 'Windows':
|
||||
from wk.os.win import (
|
||||
OS_VERSION,
|
||||
get_timezone,
|
||||
set_timezone,
|
||||
reg_delete_value,
|
||||
reg_read_value,
|
||||
reg_set_value,
|
||||
reg_write_settings,
|
||||
disable_service,
|
||||
enable_service,
|
||||
stop_service,
|
||||
)
|
||||
else:
|
||||
# Workaround to allow basic testing under non-Windows environments
|
||||
OS_VERSION = -1
|
||||
def no_op(*args, **kwargs): # pylint: disable=unused-argument
|
||||
"""No-op function."""
|
||||
# wk.os.win
|
||||
get_timezone = no_op
|
||||
set_timezone = no_op
|
||||
reg_delete_value = no_op
|
||||
reg_read_value = no_op
|
||||
reg_set_value = no_op
|
||||
reg_write_settings = no_op
|
||||
disable_service = no_op
|
||||
enable_service = no_op
|
||||
stop_service = no_op
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
|
|
@ -215,17 +232,6 @@ def build_menus(base_menus, title):
|
|||
|
||||
def end_session():
|
||||
"""End Auto Repairs session."""
|
||||
# Delete Auto Repairs keys
|
||||
try:
|
||||
reg_delete_value('HKCU', AUTO_REPAIR_KEY, 'SessionStarted')
|
||||
except FileNotFoundError:
|
||||
LOG.error('Ending repair session but session not started.')
|
||||
try:
|
||||
cmd = ['reg', 'delete', fr'HKCU\{AUTO_REPAIR_KEY}', '/f']
|
||||
run_program(cmd)
|
||||
except CalledProcessError:
|
||||
LOG.error('Failed to remote Auto Repairs session settings')
|
||||
|
||||
# Remove logon task
|
||||
cmd = [
|
||||
'schtasks', '/delete', '/f',
|
||||
|
|
@ -237,20 +243,26 @@ def end_session():
|
|||
LOG.error("Failed to remove scheduled task or it doesn't exist.")
|
||||
|
||||
# Disable Autologon
|
||||
if is_autologon_enabled():
|
||||
autologon_selected = reg_read_value(
|
||||
'HKCU', AUTO_REPAIR_KEY, 'Use Autologon',
|
||||
)
|
||||
if autologon_selected and is_autologon_enabled():
|
||||
run_tool('Sysinternals', 'Autologon', download=True)
|
||||
reg_set_value(
|
||||
'HKLM', r'Software\Microsoft\Windows NT\CurrentVersion\Winlogon',
|
||||
'AutoAdminLogon', '0', 'SZ',
|
||||
)
|
||||
reg_delete_value(
|
||||
'HKLM', r'Software\Microsoft\Windows NT\CurrentVersion\Winlogon',
|
||||
'DefaultUserName',
|
||||
)
|
||||
reg_delete_value(
|
||||
'HKLM', r'Software\Microsoft\Windows NT\CurrentVersion\Winlogon',
|
||||
'DefaultDomainName',
|
||||
)
|
||||
|
||||
# Delete Auto Repairs keys
|
||||
try:
|
||||
reg_delete_value('HKCU', AUTO_REPAIR_KEY, 'SessionStarted')
|
||||
except FileNotFoundError:
|
||||
LOG.error('Ending repair session but session not started.')
|
||||
try:
|
||||
cmd = ['reg', 'delete', fr'HKCU\{AUTO_REPAIR_KEY}', '/f']
|
||||
run_program(cmd)
|
||||
except CalledProcessError:
|
||||
LOG.error('Failed to remote Auto Repairs session settings')
|
||||
|
||||
|
||||
def get_entry_settings(group, name):
|
||||
|
|
@ -283,6 +295,12 @@ def init(menus):
|
|||
download=True, msg_good='DONE',
|
||||
)
|
||||
|
||||
# Check if autologon is needed
|
||||
if not session_started and is_autologon_enabled():
|
||||
# Avoid running Autologon and keep current settings
|
||||
menus['Options'].options['Use Autologon']['Selected'] = False
|
||||
save_selection_settings(menus)
|
||||
|
||||
# Start or resume a repair session
|
||||
if session_started:
|
||||
load_settings(menus)
|
||||
|
|
@ -427,6 +445,10 @@ def run_auto_repairs(base_menus):
|
|||
save_selection_settings(menus)
|
||||
print_info('Initializing...')
|
||||
init_run(menus['Options'].options)
|
||||
reg_set_value(
|
||||
'HKCU', AUTO_REPAIR_KEY, 'Use Autologon',
|
||||
int(is_autologon_enabled()), 'DWORD',
|
||||
)
|
||||
if not is_autologon_enabled():
|
||||
# Either it wasn't selected or a password wasn't entered
|
||||
menus['Options'].options['Use Autologon']['Selected'] = False
|
||||
|
|
@ -820,8 +842,11 @@ def auto_restore_uac_defaults(group, name):
|
|||
|
||||
|
||||
def auto_set_custom_power_plan(group, name):
|
||||
"""Set to a custom power plan."""
|
||||
result = TRY_PRINT.run('Set Custom Power Plan...', create_custom_power_plan)
|
||||
"""Set custom power plan."""
|
||||
result = TRY_PRINT.run(
|
||||
'Set Custom Power Plan...', create_custom_power_plan,
|
||||
keep_display_on=True,
|
||||
)
|
||||
save_settings(group, name, result=result)
|
||||
|
||||
|
||||
|
|
@ -832,7 +857,7 @@ def auto_sfc(group, name):
|
|||
|
||||
|
||||
def auto_system_restore_create(group, name):
|
||||
"""Create a System Restore point."""
|
||||
"""Create System Restore point."""
|
||||
result = TRY_PRINT.run(
|
||||
'Create System Restore...', create_system_restore_point,
|
||||
)
|
||||
|
|
@ -915,6 +940,16 @@ def backup_browser_chromium(backup_path, browser, search_path, use_try_print):
|
|||
if not match:
|
||||
continue
|
||||
output_path = backup_path.joinpath(f'{browser}-{item.name}.7z')
|
||||
if output_path.exists():
|
||||
# Assuming backup was already done
|
||||
if use_try_print:
|
||||
show_data(
|
||||
f'{" "*8}{browser} ({item.name})...', 'Backup already exists.',
|
||||
color='YELLOW', width=WIDTH,
|
||||
)
|
||||
continue
|
||||
|
||||
# Backup data
|
||||
cmd = [
|
||||
*BACKUP_BROWSER_BASE_CMD,
|
||||
output_path, item.joinpath('*'), '-x!*Cache*', '-x!Service Worker',
|
||||
|
|
@ -931,6 +966,18 @@ def backup_browser_chromium(backup_path, browser, search_path, use_try_print):
|
|||
def backup_browser_firefox(backup_path, search_path, use_try_print):
|
||||
"""Backup Firefox browser profile."""
|
||||
output_path = backup_path.joinpath('Firefox.7z')
|
||||
|
||||
# Bail early
|
||||
if output_path.exists():
|
||||
# Assuming backup was already done
|
||||
if use_try_print:
|
||||
show_data(
|
||||
f'{" "*8}Firefox (All)...', 'Backup already exists.',
|
||||
color='YELLOW', width=WIDTH,
|
||||
)
|
||||
return
|
||||
|
||||
# Backup data
|
||||
cmd = [
|
||||
*BACKUP_BROWSER_BASE_CMD, output_path,
|
||||
search_path.joinpath('Profiles'), search_path.joinpath('profiles.ini'),
|
||||
|
|
@ -974,7 +1021,14 @@ def backup_registry():
|
|||
"""Backup Registry."""
|
||||
backup_path = set_backup_path('Registry', date=True)
|
||||
backup_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
run_tool('Erunt', 'ERUNT', backup_path, 'sysreg', 'curuser', 'otherusers')
|
||||
|
||||
# Check if backup was already done today
|
||||
if backup_path.exists():
|
||||
raise GenericWarning('Backup already exists.')
|
||||
|
||||
# Backup registry
|
||||
extract_tool('ERUNT')
|
||||
run_tool('ERUNT', 'ERUNT', backup_path, 'sysreg', 'curuser', 'otherusers')
|
||||
|
||||
|
||||
def delete_registry_null_keys():
|
||||
|
|
@ -1033,8 +1087,8 @@ def run_bleachbit(cleaners, preview=True):
|
|||
proc = run_tool('BleachBit', 'bleachbit_console', *cmd_args, cbin=True)
|
||||
|
||||
# Save logs
|
||||
log_path.write_text(proc.stdout)
|
||||
log_path.with_suffix('.err').write_text(proc.stderr)
|
||||
log_path.write_text(proc.stdout, encoding='utf-8')
|
||||
log_path.with_suffix('.err').write_text(proc.stderr, encoding='utf-8')
|
||||
|
||||
|
||||
def run_emsisoft_cmd_scan():
|
||||
|
|
@ -1102,7 +1156,7 @@ def run_kvrt():
|
|||
download_tool('KVRT', 'KVRT')
|
||||
kvrt_path = get_tool_path('KVRT', 'KVRT')
|
||||
tmp_file = fr'{os.environ.get("TMP")}\run_kvrt.cmd'
|
||||
with open(tmp_file, 'w') as _f:
|
||||
with open(tmp_file, 'w', encoding='utf-8') as _f:
|
||||
_f.write('@echo off\n')
|
||||
_f.write(f'"{kvrt_path}" {" ".join(cmd_args)}\n')
|
||||
cmd = ('cmd', '/c', tmp_file, '-new_console:nb', '-new_console:s33V')
|
||||
|
|
@ -1113,7 +1167,7 @@ def run_kvrt():
|
|||
|
||||
# Run in background
|
||||
proc = run_tool('KVRT', 'KVRT', *cmd_args, download=True)
|
||||
log_path.write_text(proc.stdout)
|
||||
log_path.write_text(proc.stdout, encoding='utf-8')
|
||||
|
||||
|
||||
def run_mbam():
|
||||
|
|
@ -1166,7 +1220,7 @@ def run_microsoft_defender(full=True):
|
|||
# Run scan
|
||||
cmd = (defender_path, '-Scan', '-ScanType', '2' if full else '1')
|
||||
proc = run_program(cmd, check=False)
|
||||
log_path.write_text(proc.stdout)
|
||||
log_path.write_text(proc.stdout, encoding='utf-8')
|
||||
if proc.returncode > 0:
|
||||
raise GenericError('Failed to run scan or clean items.')
|
||||
|
||||
|
|
@ -1176,7 +1230,9 @@ def run_rkill():
|
|||
log_path = format_log_path(log_name='RKill', timestamp=True, tool=True)
|
||||
log_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
whitelist_path = log_path.with_suffix('.wl')
|
||||
whitelist_path.write_text('\n'.join(map(str, WHITELIST)))
|
||||
whitelist_path.write_text(
|
||||
'\n'.join(map(str, WHITELIST)), encoding='utf-8',
|
||||
)
|
||||
cmd_args = (
|
||||
'-l', log_path,
|
||||
'-w', whitelist_path,
|
||||
|
|
@ -1252,7 +1308,7 @@ def update_emsisoft_cmd():
|
|||
|
||||
|
||||
# OS Built-in Functions
|
||||
def create_custom_power_plan():
|
||||
def create_custom_power_plan(keep_display_on=False):
|
||||
"""Create new power plan and set as active."""
|
||||
custom_guid = POWER_PLANS['Custom']
|
||||
|
||||
|
|
@ -1272,9 +1328,10 @@ def create_custom_power_plan():
|
|||
run_program(cmd)
|
||||
|
||||
# Keep the display on
|
||||
for setting in ('monitor-timeout-ac', 'monitor-timeout-dc'):
|
||||
cmd = ['powercfg', '-Change', setting, '0']
|
||||
run_program(cmd)
|
||||
if keep_display_on:
|
||||
for setting in ('monitor-timeout-ac', 'monitor-timeout-dc'):
|
||||
cmd = ['powercfg', '-Change', setting, '0']
|
||||
run_program(cmd)
|
||||
|
||||
# Set CPU min state
|
||||
for arg in ('-SetacValueIndex', '-SetdcValueIndex'):
|
||||
|
|
@ -1321,6 +1378,12 @@ def enable_windows_updates():
|
|||
def export_power_plans():
|
||||
"""Export existing power plans."""
|
||||
backup_path = set_backup_path('Power Plans', date=True)
|
||||
|
||||
# Bail early
|
||||
if backup_path.exists():
|
||||
raise GenericWarning('Backup already exists.')
|
||||
|
||||
# Get powercfg data
|
||||
backup_path.mkdir(parents=True, exist_ok=True)
|
||||
cmd = ['powercfg', '/L']
|
||||
proc = run_program(cmd)
|
||||
|
|
@ -1530,9 +1593,9 @@ def run_sfc_scan():
|
|||
|
||||
# Save output
|
||||
os.makedirs(log_path.parent, exist_ok=True)
|
||||
with open(log_path, 'a') as _f:
|
||||
with open(log_path, 'a', encoding='utf-8') as _f:
|
||||
_f.write(proc.stdout)
|
||||
with open(err_path, 'a') as _f:
|
||||
with open(err_path, 'a', encoding='utf-8') as _f:
|
||||
_f.write(proc.stderr)
|
||||
|
||||
# Check result
|
||||
|
|
|
|||
8
scripts/wk/setup/__init__.py
Normal file
8
scripts/wk/setup/__init__.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
"""WizardKit: repairs module init"""
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
||||
import platform
|
||||
|
||||
#if platform.system() == 'Windows':
|
||||
# from . import win
|
||||
from . import win
|
||||
1094
scripts/wk/setup/win.py
Normal file
1094
scripts/wk/setup/win.py
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -442,10 +442,11 @@ class TryAndPrint():
|
|||
pass
|
||||
|
||||
# Prepend exception name
|
||||
try:
|
||||
message = f'{_exception.__class__.__name__}: {message}'
|
||||
except Exception: # pylint: disable=broad-except
|
||||
message = f'UNKNOWN ERROR: {message}'
|
||||
if _exception.__class__.__name__ not in ('GenericError', 'GenericWarning'):
|
||||
try:
|
||||
message = f'{_exception.__class__.__name__}: {message}'
|
||||
except Exception: # pylint: disable=broad-except
|
||||
message = f'UNKNOWN ERROR: {message}'
|
||||
|
||||
# Fix multi-line messages
|
||||
if '\n' in message:
|
||||
|
|
@ -525,8 +526,8 @@ class TryAndPrint():
|
|||
return obj
|
||||
|
||||
# Try all modules
|
||||
for _mod in sys.modules:
|
||||
obj = getattr(sys.modules[_mod], name, None)
|
||||
for _mod in sys.modules.values():
|
||||
obj = getattr(_mod, name, None)
|
||||
if obj:
|
||||
break
|
||||
|
||||
|
|
@ -588,11 +589,11 @@ class TryAndPrint():
|
|||
verbose,
|
||||
)
|
||||
f_exception = None
|
||||
catch_all = catch_all if catch_all else self.catch_all
|
||||
msg_good = msg_good if msg_good else self.msg_good
|
||||
catch_all = catch_all if catch_all is not None else self.catch_all
|
||||
msg_good = msg_good if msg_good is not None else self.msg_good
|
||||
output = None
|
||||
result_msg = 'UNKNOWN'
|
||||
verbose = verbose if verbose else self.verbose
|
||||
verbose = verbose if verbose is not None else self.verbose
|
||||
|
||||
# Build exception tuples
|
||||
e_exceptions = tuple(self._get_exception(e) for e in self.list_errors)
|
||||
|
|
@ -802,7 +803,7 @@ def generate_debug_report():
|
|||
if log_path:
|
||||
report.append('------ Start Log -------')
|
||||
report.append('')
|
||||
with open(log_path, 'r') as log_file:
|
||||
with open(log_path, 'r', encoding='utf-8') as log_file:
|
||||
report.extend(log_file.read().splitlines())
|
||||
report.append('')
|
||||
report.append('------- End Log --------')
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
"""WizardKit: sw module init"""
|
||||
35
setup/windows/cbin/_include/AIDA64/basic.rpf
Normal file
35
setup/windows/cbin/_include/AIDA64/basic.rpf
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
InfoPage="Computer;Summary"
|
||||
InfoPage="Computer;Computer Name"
|
||||
InfoPage="Computer;DMI"
|
||||
InfoPage="Computer;IPMI"
|
||||
InfoPage="Computer;Overclock"
|
||||
InfoPage="Computer;Power Management"
|
||||
InfoPage="Motherboard;CPU"
|
||||
InfoPage="Motherboard;Motherboard"
|
||||
InfoPage="Motherboard;Memory"
|
||||
InfoPage="Motherboard;SPD"
|
||||
InfoPage="Motherboard;Chipset"
|
||||
InfoPage="Motherboard;BIOS"
|
||||
InfoPage="Operating System;Operating System"
|
||||
InfoPage="Server;Users"
|
||||
InfoPage="Storage;Windows Storage"
|
||||
InfoPage="Storage;Logical Drives"
|
||||
InfoPage="Storage;Physical Drives"
|
||||
InfoPage="Storage;Optical Drives"
|
||||
InfoPage="Storage;ASPI"
|
||||
InfoPage="Storage;ATA"
|
||||
InfoPage="Storage;SMART"
|
||||
InfoPage="Network;Windows Network"
|
||||
InfoPage="Devices;Windows Devices"
|
||||
InfoPage="Devices;Physical Devices"
|
||||
InfoPage="Devices;PCI Devices"
|
||||
InfoPage="Software;Auto Start"
|
||||
InfoPage="Software;Scheduled"
|
||||
InfoPage="Software;Installed Programs"
|
||||
InfoPage="Software;Licenses"
|
||||
InfoPage="Security;Windows Security"
|
||||
InfoPage="Security;Windows Update"
|
||||
InfoPage="Security;Anti-Virus"
|
||||
InfoPage="Security;Firewall"
|
||||
InfoPage="Security;Anti-Spyware"
|
||||
InfoPage="Security;Anti-Trojan"
|
||||
|
|
@ -1,98 +0,0 @@
|
|||
InfoPage="Computer;Summary"
|
||||
InfoPage="Computer;Computer Name"
|
||||
InfoPage="Computer;DMI"
|
||||
InfoPage="Computer;IPMI"
|
||||
InfoPage="Computer;Overclock"
|
||||
InfoPage="Computer;Power Management"
|
||||
InfoPage="Computer;Portable Computer"
|
||||
InfoPage="Motherboard;CPU"
|
||||
InfoPage="Motherboard;CPUID"
|
||||
InfoPage="Motherboard;Motherboard"
|
||||
InfoPage="Motherboard;Memory"
|
||||
InfoPage="Motherboard;SPD"
|
||||
InfoPage="Motherboard;Chipset"
|
||||
InfoPage="Motherboard;BIOS"
|
||||
InfoPage="Motherboard;ACPI"
|
||||
InfoPage="Operating System;Operating System"
|
||||
InfoPage="Operating System;Processes"
|
||||
InfoPage="Operating System;System Drivers"
|
||||
InfoPage="Operating System;Services"
|
||||
InfoPage="Operating System;AX Files"
|
||||
InfoPage="Operating System;DLL Files"
|
||||
InfoPage="Operating System;Certificates"
|
||||
InfoPage="Operating System;UpTime"
|
||||
InfoPage="Server;Share"
|
||||
InfoPage="Server;Opened Files"
|
||||
InfoPage="Server;Account Security"
|
||||
InfoPage="Server;Logon"
|
||||
InfoPage="Server;Users"
|
||||
InfoPage="Server;Local Groups"
|
||||
InfoPage="Server;Global Groups"
|
||||
InfoPage="Display;Windows Video"
|
||||
InfoPage="Display;PCI / AGP Video"
|
||||
InfoPage="Display;GPU"
|
||||
InfoPage="Display;Monitor"
|
||||
InfoPage="Display;Desktop"
|
||||
InfoPage="Display;Multi-Monitor"
|
||||
InfoPage="Display;Video Modes"
|
||||
InfoPage="Display;OpenGL"
|
||||
InfoPage="Display;GPGPU"
|
||||
InfoPage="Display;Mantle"
|
||||
InfoPage="Display;Vulkan"
|
||||
InfoPage="Display;Fonts"
|
||||
InfoPage="Multimedia;Windows Audio"
|
||||
InfoPage="Multimedia;PCI / PnP Audio"
|
||||
InfoPage="Multimedia;HD Audio"
|
||||
InfoPage="Multimedia;OpenAL"
|
||||
InfoPage="Multimedia;Audio Codecs"
|
||||
InfoPage="Multimedia;Video Codecs"
|
||||
InfoPage="Multimedia;MCI"
|
||||
InfoPage="Multimedia;SAPI"
|
||||
InfoPage="Storage;Windows Storage"
|
||||
InfoPage="Storage;Logical Drives"
|
||||
InfoPage="Storage;Physical Drives"
|
||||
InfoPage="Storage;Optical Drives"
|
||||
InfoPage="Storage;ASPI"
|
||||
InfoPage="Storage;ATA"
|
||||
InfoPage="Storage;SMART"
|
||||
InfoPage="Network;Windows Network"
|
||||
InfoPage="Network;PCI / PnP Network"
|
||||
InfoPage="Network;RAS"
|
||||
InfoPage="Network;Net Resources"
|
||||
InfoPage="Network;IAM"
|
||||
InfoPage="Network;Internet"
|
||||
InfoPage="Network;Routes"
|
||||
InfoPage="Network;IE Cookie"
|
||||
InfoPage="Network;Browser History"
|
||||
InfoPage="DirectX;DirectX Files"
|
||||
InfoPage="DirectX;DirectX Video"
|
||||
InfoPage="DirectX;DirectX Sound"
|
||||
InfoPage="Devices;Windows Devices"
|
||||
InfoPage="Devices;Physical Devices"
|
||||
InfoPage="Devices;PCI Devices"
|
||||
InfoPage="Devices;USB Devices"
|
||||
InfoPage="Devices;Device Resources"
|
||||
InfoPage="Devices;Input"
|
||||
InfoPage="Devices;Printers"
|
||||
InfoPage="Software;Auto Start"
|
||||
InfoPage="Software;Scheduled"
|
||||
InfoPage="Software;Installed Programs"
|
||||
InfoPage="Software;Licenses"
|
||||
InfoPage="Software;File Types"
|
||||
InfoPage="Software;Desktop Gadgets"
|
||||
InfoPage="Security;Windows Security"
|
||||
InfoPage="Security;Windows Update"
|
||||
InfoPage="Security;Anti-Virus"
|
||||
InfoPage="Security;Firewall"
|
||||
InfoPage="Security;Anti-Spyware"
|
||||
InfoPage="Security;Anti-Trojan"
|
||||
InfoPage="Config;Regional"
|
||||
InfoPage="Config;Environment"
|
||||
InfoPage="Config;Control Panel"
|
||||
InfoPage="Config;Recycle Bin"
|
||||
InfoPage="Config;System Files"
|
||||
InfoPage="Config;System Folders"
|
||||
InfoPage="Database;Database Software"
|
||||
InfoPage="Database;BDE Drivers"
|
||||
InfoPage="Database;ODBC Drivers"
|
||||
InfoPage="Database;ODBC Data Sources"
|
||||
|
|
@ -1 +0,0 @@
|
|||
InfoPage="Software;Installed Programs"
|
||||
|
|
@ -1 +0,0 @@
|
|||
InfoPage="Software;Licenses"
|
||||
Loading…
Reference in a new issue