From b5021674eef71bf1e3d680124cbd75a5026e38d4 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 13 Oct 2021 18:31:29 -0600 Subject: [PATCH] Remove old code Finally --- scripts/Copy WizardKit.cmd | 152 -- scripts/activate.py | 31 - scripts/check_disk.py | 49 - scripts/safemode_enter.py | 37 - scripts/safemode_exit.py | 37 - scripts/sfc_scan.py | 35 - scripts/wk.prev/debug/hw_diags.py | 186 -- scripts/wk.prev/functions/activation.py | 73 - scripts/wk.prev/functions/backup.py | 219 -- scripts/wk.prev/functions/browsers.py | 470 ----- scripts/wk.prev/functions/cleanup.py | 144 -- scripts/wk.prev/functions/common.py | 434 ---- scripts/wk.prev/functions/data.py | 854 -------- scripts/wk.prev/functions/disk.py | 414 ---- scripts/wk.prev/functions/hw_diags.py | 1835 ----------------- scripts/wk.prev/functions/info.py | 500 ----- scripts/wk.prev/functions/json.py | 32 - scripts/wk.prev/functions/product_keys.py | 120 -- scripts/wk.prev/functions/repairs.py | 136 -- scripts/wk.prev/functions/safemode.py | 45 - scripts/wk.prev/functions/sensors.py | 243 --- scripts/wk.prev/functions/setup.py | 359 ---- scripts/wk.prev/functions/sw_diags.py | 244 --- scripts/wk.prev/functions/threading.py | 47 - scripts/wk.prev/functions/tmux.py | 187 -- scripts/wk.prev/functions/update.py | 1013 --------- scripts/wk.prev/functions/windows_setup.py | 220 -- scripts/wk.prev/functions/windows_updates.py | 143 -- scripts/wk.prev/functions/winpe_menus.py | 435 ---- scripts/wk.prev/settings/browsers.py | 99 - scripts/wk.prev/settings/cleanup.py | 37 - scripts/wk.prev/settings/data.py | 105 - scripts/wk.prev/settings/ddrescue.py | 61 - scripts/wk.prev/settings/hw_diags.py | 113 - scripts/wk.prev/settings/info.py | 58 - scripts/wk.prev/settings/launchers.py | 602 ------ scripts/wk.prev/settings/main.py | 90 - scripts/wk.prev/settings/music.py | 73 - scripts/wk.prev/settings/partition_uids.py | 326 --- scripts/wk.prev/settings/sensors.py | 21 - scripts/wk.prev/settings/setup.py | 194 -- scripts/wk.prev/settings/sources.py | 229 -- scripts/wk.prev/settings/sw_diags.py | 29 - scripts/wk.prev/settings/tools.py | 59 - scripts/wk.prev/settings/windows_builds.py | 258 --- scripts/wk.prev/settings/windows_setup.py | 39 - scripts/wk.prev/settings/winpe.py | 57 - setup/windows/cbin/BleachBit/BleachBit.ini | 77 - setup/windows/cbin/NotepadPlusPlus/config.xml | 56 - setup/windows/cbin/XMPlay/xmplay.ini | 139 -- setup/windows/launchers.json | 196 -- 51 files changed, 11612 deletions(-) delete mode 100644 scripts/Copy WizardKit.cmd delete mode 100644 scripts/activate.py delete mode 100644 scripts/check_disk.py delete mode 100644 scripts/safemode_enter.py delete mode 100644 scripts/safemode_exit.py delete mode 100644 scripts/sfc_scan.py delete mode 100644 scripts/wk.prev/debug/hw_diags.py delete mode 100644 scripts/wk.prev/functions/activation.py delete mode 100644 scripts/wk.prev/functions/backup.py delete mode 100644 scripts/wk.prev/functions/browsers.py delete mode 100644 scripts/wk.prev/functions/cleanup.py delete mode 100644 scripts/wk.prev/functions/common.py delete mode 100644 scripts/wk.prev/functions/data.py delete mode 100644 scripts/wk.prev/functions/disk.py delete mode 100644 scripts/wk.prev/functions/hw_diags.py delete mode 100644 scripts/wk.prev/functions/info.py delete mode 100644 scripts/wk.prev/functions/json.py delete mode 100644 scripts/wk.prev/functions/product_keys.py delete mode 100644 scripts/wk.prev/functions/repairs.py delete mode 100644 scripts/wk.prev/functions/safemode.py delete mode 100644 scripts/wk.prev/functions/sensors.py delete mode 100644 scripts/wk.prev/functions/setup.py delete mode 100644 scripts/wk.prev/functions/sw_diags.py delete mode 100644 scripts/wk.prev/functions/threading.py delete mode 100644 scripts/wk.prev/functions/tmux.py delete mode 100755 scripts/wk.prev/functions/update.py delete mode 100644 scripts/wk.prev/functions/windows_setup.py delete mode 100644 scripts/wk.prev/functions/windows_updates.py delete mode 100644 scripts/wk.prev/functions/winpe_menus.py delete mode 100644 scripts/wk.prev/settings/browsers.py delete mode 100644 scripts/wk.prev/settings/cleanup.py delete mode 100644 scripts/wk.prev/settings/data.py delete mode 100644 scripts/wk.prev/settings/ddrescue.py delete mode 100644 scripts/wk.prev/settings/hw_diags.py delete mode 100644 scripts/wk.prev/settings/info.py delete mode 100644 scripts/wk.prev/settings/launchers.py delete mode 100644 scripts/wk.prev/settings/main.py delete mode 100644 scripts/wk.prev/settings/music.py delete mode 100644 scripts/wk.prev/settings/partition_uids.py delete mode 100644 scripts/wk.prev/settings/sensors.py delete mode 100644 scripts/wk.prev/settings/setup.py delete mode 100644 scripts/wk.prev/settings/sources.py delete mode 100644 scripts/wk.prev/settings/sw_diags.py delete mode 100644 scripts/wk.prev/settings/tools.py delete mode 100644 scripts/wk.prev/settings/windows_builds.py delete mode 100644 scripts/wk.prev/settings/windows_setup.py delete mode 100644 scripts/wk.prev/settings/winpe.py delete mode 100644 setup/windows/cbin/BleachBit/BleachBit.ini delete mode 100644 setup/windows/cbin/NotepadPlusPlus/config.xml delete mode 100644 setup/windows/cbin/XMPlay/xmplay.ini delete mode 100644 setup/windows/launchers.json diff --git a/scripts/Copy WizardKit.cmd b/scripts/Copy WizardKit.cmd deleted file mode 100644 index d63588c6..00000000 --- a/scripts/Copy WizardKit.cmd +++ /dev/null @@ -1,152 +0,0 @@ -:: Wizard Kit: Copy Kit :: -@echo off - -:Init -setlocal EnableDelayedExpansion -title Wizard Kit: Tools Copier -color 1b -echo Initializing... -call :CheckFlags %* -call :FindBin -call :SetTitle Tools Copier - -:SetVariables -rem Set variables using settings\main.py file -set "SETTINGS=%bin%\Scripts\settings\main.py" -for %%v in (ARCHIVE_PASSWORD KIT_NAME_FULL) do ( - set "var=%%v" - for /f "tokens=* usebackq" %%f in (`findstr "!var!=" "%SETTINGS%"`) do ( - set "_v=%%f" - set "_v=!_v:*'=!" - set "%%v=!_v:~0,-1!" - ) -) -rem Set ARCH to 32 as a gross assumption and check for x86_64 status -set ARCH=32 -if /i "%PROCESSOR_ARCHITECTURE%" == "AMD64" set "ARCH=64" -set "SEVEN_ZIP=%bin%\7-Zip\7za.exe" -set "CON=%bin%\ConEmu\ConEmu.exe" -set "FASTCOPY=%bin%\FastCopy\FastCopy.exe" -if %ARCH% equ 64 ( - set "SEVEN_ZIP=%bin%\7-Zip\7za64.exe" - set "CON=%bin%\ConEmu\ConEmu64.exe" - set "FASTCOPY=%bin%\FastCopy\FastCopy64.exe" -) -set "fastcopy_args=/cmd=diff /no_ui /auto_close" -rem Set %client_dir% -call "%bin%\Scripts\init_client_dir.cmd" -pushd "%bin%\.." -set "source=%cd%" -popd -set "dest=%client_dir%\Tools" - -:RelaunchInConEmu -if not defined IN_CONEMU ( - if not defined L_NCMD ( - set "con_args=-new_console:n" - rem If in DEBUG state then force ConEmu to stay open - if defined DEBUG (set "con_args=!con_args! -new_console:c") - set IN_CONEMU=True - start "" "%CON%" -run ""%~0" %*" !con_args! || goto ErrorUnknown - exit /b 0 - ) -) -:CopyBin -echo Copying .bin... -mkdir "%dest%\.bin" >nul 2>&1 -attrib +h "%dest%\.bin" -set _sources="%bin%\7-Zip" -set _sources=%_sources% "%bin%\ConEmu" -set _sources=%_sources% "%bin%\FastCopy" -set _sources=%_sources% "%bin%\HWiNFO" -set _sources=%_sources% "%bin%\Python" -set _sources=%_sources% "%bin%\Scripts" -start "" /wait "%fastcopy%" %fastcopy_args% %_sources% /to="%dest%\.bin\" - -:CopyCBin -echo Copying .cbin... -mkdir "%dest%\.cbin" >nul 2>&1 -attrib +h "%dest%\.cbin" -start "" /wait "%fastcopy%" %fastcopy_args% "%cbin%"\* /to="%dest%\.cbin\" - -:CopyMainData -echo Copying Main Kit... -set _sources="%source%\Data Transfers" -set _sources=%_sources% "%source%\Diagnostics" -set _sources=%_sources% "%source%\Drivers" -set _sources=%_sources% "%source%\Installers" -set _sources=%_sources% "%source%\Misc" -set _sources=%_sources% "%source%\Repairs" -set _sources=%_sources% "%source%\Uninstallers" -set _sources=%_sources% "%source%\Activate Windows.cmd" -set _sources=%_sources% "%source%\Enter SafeMode.cmd" -set _sources=%_sources% "%source%\Exit SafeMode.cmd" -set _sources=%_sources% "%source%\LICENSE.txt" -set _sources=%_sources% "%source%\README.md" -set _sources=%_sources% "%source%\System Checklist.cmd" -set _sources=%_sources% "%source%\System Diagnostics.cmd" -set _sources=%_sources% "%source%\User Checklist.cmd" -start "" /wait "%fastcopy%" %fastcopy_args% /exclude="Snappy Driver Installer*;Update Kit*;*.exe" %_sources% /to="%dest%\" -start "" /wait "%fastcopy%" %fastcopy_args% "%source%\Installers\Extras\Office\Adobe Reader DC.exe" /to="%dest%\Installers\Extras\Office\" - -:Ninite -echo Extracting Ninite installers... -"%SEVEN_ZIP%" x "%cbin%\_Ninite.7z" -aos -bso0 -bse0 -bsp0 -p%ARCHIVE_PASSWORD% -o"%dest%\Installers\Extras" || goto Abort - -:OpenFolder -start "" explorer "%dest%" -goto Exit - -:: Functions :: -:CheckFlags -rem Loops through all arguments to check for accepted flags -set DEBUG= -for %%f in (%*) do ( - if /i "%%f" == "/DEBUG" (@echo on & set "DEBUG=/DEBUG") -) -@exit /b 0 - -:FindBin -rem Checks the current directory and all parents for the ".bin" folder -rem NOTE: Has not been tested for UNC paths -set bin= -pushd "%~dp0" -:FindBinInner -if exist ".bin" (goto FindBinDone) -if "%~d0\" == "%cd%" (popd & @exit /b 1) -cd .. -goto FindBinInner -:FindBinDone -set "bin=%cd%\.bin" -set "cbin=%cd%\.cbin" -popd -@exit /b 0 - -:SetTitle -rem Sets title using KIT_NAME_FULL from settings\main.py -set "window_title=%*" -if not defined window_title set "window_title=Launcher" -set "window_title=%KIT_NAME_FULL%: %window_title%" -title %window_title% -@exit /b 0 - -:: Errors :: -:ErrorNoBin -echo. -echo ERROR: ".bin" folder not found. -goto Abort - -:Abort -color 4e -echo Aborted. -echo Press any key to exit... -pause>nul -color -rem Set errorlevel to 1 by calling color incorrectly -color 00 -goto Exit - -:: Cleanup and exit :: -:Exit -endlocal -exit /b %errorlevel% diff --git a/scripts/activate.py b/scripts/activate.py deleted file mode 100644 index 0affc19a..00000000 --- a/scripts/activate.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Wizard Kit: Activate Windows using a BIOS key""" -# vim: sts=2 sw=2 ts=2 - -import wk - - -def main(): - """Attempt to activate Windows and show result.""" - title = f'{wk.cfg.main.KIT_NAME_FULL}: Activation Tool' - try_print = wk.std.TryAndPrint() - wk.std.clear_screen() - wk.std.set_title(title) - wk.std.print_info(title) - print('') - - # Attempt activation - try_print.run('Attempting activation...', wk.os.win.activate_with_bios) - - # Done - print('') - print('Done.') - wk.std.pause('Press Enter to exit...') - - -if __name__ == '__main__': - try: - main() - except SystemExit: - raise - except: #pylint: disable=bare-except - wk.std.major_exception() diff --git a/scripts/check_disk.py b/scripts/check_disk.py deleted file mode 100644 index 1682d94f..00000000 --- a/scripts/check_disk.py +++ /dev/null @@ -1,49 +0,0 @@ -"""Wizard Kit: Check or repair the %SYSTEMDRIVE% filesystem via CHKDSK""" -# vim: sts=2 sw=2 ts=2 - -import os -import wk - - -def main(): - """Run or schedule CHKDSK and show result.""" - title = f'{wk.cfg.main.KIT_NAME_FULL}: Check Disk Tool' - menu = wk.std.Menu(title=title) - try_print = wk.std.TryAndPrint() - wk.std.clear_screen() - wk.std.set_title(title) - print('') - - # Add menu entries - menu.add_option('Offline scan') - menu.add_option('Online scan') - - # Show menu and make selection - selection = menu.simple_select() - - # Run or schedule scan - if 'Offline' in selection[0]: - function = wk.repairs.win.run_chkdsk_offline - msg_good = 'Scheduled' - else: - function = wk.repairs.win.run_chkdsk_online - msg_good = 'No issues detected' - try_print.run( - message=f'CHKDSK ({os.environ.get("SYSTEMDRIVE")})...', - function=function, - msg_good=msg_good, - ) - - # Done - print('') - print('Done.') - wk.std.pause('Press Enter to exit...') - - -if __name__ == '__main__': - try: - main() - except SystemExit: - raise - except: #pylint: disable=bare-except - wk.std.major_exception() diff --git a/scripts/safemode_enter.py b/scripts/safemode_enter.py deleted file mode 100644 index fffa585e..00000000 --- a/scripts/safemode_enter.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Wizard Kit: Enter SafeMode by editing the BCD""" -# vim: sts=2 sw=2 ts=2 - -import wk - - -def main(): - """Prompt user to enter safe mode.""" - title = f'{wk.cfg.main.KIT_NAME_FULL}: SafeMode Tool' - try_print = wk.std.TryAndPrint() - wk.std.clear_screen() - wk.std.set_title(title) - wk.std.print_info(title) - print('') - - # Ask - if not wk.std.ask('Enable booting to SafeMode (with Networking)?'): - wk.std.abort() - print('') - - # Configure SafeMode - try_print.run('Set BCD option...', wk.os.win.enable_safemode) - try_print.run('Enable MSI in SafeMode...', wk.os.win.enable_safemode_msi) - - # Done - print('Done.') - wk.std.pause('Press Enter to reboot...') - wk.exe.run_program('shutdown -r -t 3'.split(), check=False) - - -if __name__ == '__main__': - try: - main() - except SystemExit: - raise - except: #pylint: disable=bare-except - wk.std.major_exception() diff --git a/scripts/safemode_exit.py b/scripts/safemode_exit.py deleted file mode 100644 index e46c9ade..00000000 --- a/scripts/safemode_exit.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Wizard Kit: Exit SafeMode by editing the BCD""" -# vim: sts=2 sw=2 ts=2 - -import wk - - -def main(): - """Prompt user to exit safe mode.""" - title = f'{wk.cfg.main.KIT_NAME_FULL}: SafeMode Tool' - try_print = wk.std.TryAndPrint() - wk.std.clear_screen() - wk.std.set_title(title) - wk.std.print_info(title) - print('') - - # Ask - if not wk.std.ask('Disable booting to SafeMode?'): - wk.std.abort() - print('') - - # Configure SafeMode - try_print.run('Remove BCD option...', wk.os.win.disable_safemode) - try_print.run('Disable MSI in SafeMode...', wk.os.win.disable_safemode_msi) - - # Done - print('Done.') - wk.std.pause('Press Enter to reboot...') - wk.exe.run_program('shutdown -r -t 3'.split(), check=False) - - -if __name__ == '__main__': - try: - main() - except SystemExit: - raise - except: #pylint: disable=bare-except - wk.std.major_exception() diff --git a/scripts/sfc_scan.py b/scripts/sfc_scan.py deleted file mode 100644 index b3132f1a..00000000 --- a/scripts/sfc_scan.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Wizard Kit: Check, and possibly repair, system file health via SFC""" -# vim: sts=2 sw=2 ts=2 - -import wk - - -def main(): - """Run SFC and report result.""" - title = f'{wk.cfg.main.KIT_NAME_FULL}: SFC Tool' - try_print = wk.std.TryAndPrint() - wk.std.clear_screen() - wk.std.set_title(title) - wk.std.print_info(title) - print('') - - # Ask - if not wk.std.ask('Run a SFC scan now?'): - wk.std.abort() - print('') - - # Run - try_print.run('SFC scan...', wk.repairs.win.run_sfc_scan) - - # Done - print('Done') - wk.std.pause('Press Enter to exit...') - - -if __name__ == '__main__': - try: - main() - except SystemExit: - raise - except: #pylint: disable=bare-except - wk.std.major_exception() diff --git a/scripts/wk.prev/debug/hw_diags.py b/scripts/wk.prev/debug/hw_diags.py deleted file mode 100644 index 44517fb4..00000000 --- a/scripts/wk.prev/debug/hw_diags.py +++ /dev/null @@ -1,186 +0,0 @@ -# Wizard Kit: Debug - HW Diagnostics - -import base64 -import requests - -from functions.common import * - -def debug_report_cpu(cpu_obj): - """Generate report for CpuObj, returns list.""" - report = [] - - # CPU Info - report.append('CPU: {}'.format(cpu_obj.name)) - report.append('lscpu:') - for k, v in sorted(cpu_obj.lscpu.items()): - report.append(' {}: {}'.format(k, v)) - - # Tests - report.append('Tests:') - for k, v in cpu_obj.tests.items(): - report.extend(debug_report_test(v, k)) - - # Done - return report - - -def debug_report_disk(disk_obj): - """Generate report for DiskObj, returns list.""" - report = [] - expand = [ - 'lsblk', - 'nvme_attributes', - 'nvme_smart_notes', - 'smart_attributes', - 'smart_self_test', - 'smartctl', - ] - skip = [ - 'add_nvme_smart_note', - 'calc_io_dd_values', - 'check_attributes', - 'check_smart_self_test', - 'description', - 'disable_test', - 'generate_attribute_report', - 'generate_disk_report', - 'get_details', - 'get_size', - 'get_smart_details', - 'name', - 'safety_check', - 'tests', - ] - - # Disk Info - report.append('Disk: {} {}'.format( - disk_obj.name, disk_obj.description)) - for a in dir(disk_obj): - if a.startswith('_') or a in skip: - continue - if a in expand: - report.append('{}:'.format(a)) - attr = getattr(disk_obj, a) - try: - for k, v in sorted(attr.items()): - report.append(' {}: {}'.format(k, v)) - except Exception: - # Ignore - pass - else: - report.append('{}: {}'.format(a, getattr(disk_obj, a))) - - # Tests - report.append('Tests:') - for k, v in disk_obj.tests.items(): - report.extend(debug_report_test(v, k)) - - # Done - return report - - -def debug_report_state(state): - """Generate report for State, returns list.""" - report = [] - - # Devs - report.append('CPU: {}'.format(state.cpu)) - report.append('Disks: {}'.format(state.disks)) - - # Settings - report.append('Progress Out: {}'.format(state.progress_out)) - report.append('Quick Mode: {}'.format(state.quick_mode)) - - # Tests - report.append('Tests:') - for k, v in state.tests.items(): - report.append(' {}:'.format(k)) - for k2, v2 in sorted(v.items()): - report.append(' {}: {}'.format(k2, v2)) - - # tmux - if hasattr(state, 'tmux_layout'): - report.append('tmux Layout:') - for k, v in state.tmux_layout.items(): - report.append(' {}: {}'.format(k, str(v))) - if hasattr(state, 'panes'): - report.append('tmux Panes:') - for k, v in state.panes.items(): - report.append(' {}: {}'.format(k, str(v))) - - # Done - return report - - -def debug_report_test(test_obj, test_name): - """Generate report for TestObj, returns list.""" - report = [' {}:'.format(test_name)] - skip = ['update_status'] - - # Attributes - for a in [a for a in dir(test_obj) if not a.startswith('_')]: - if a in skip: - continue - report.append(' {}: {}'.format(a, getattr(test_obj, a))) - - # Done - return report - - -def save_debug_reports(state, global_vars): - """Save debug reports if possible.""" - debug_dest = '{}/debug'.format(global_vars['LogDir']) - os.makedirs(debug_dest, exist_ok=True) - - # State - with open('{}/state.report'.format(debug_dest), 'a') as f: - for line in debug_report_state(state): - f.write('{}\n'.format(line)) - - # CPU - with open('{}/cpu.report'.format(debug_dest), 'a') as f: - for line in debug_report_cpu(state.cpu): - f.write('{}\n'.format(line)) - - # Disk(s) - for disk in state.disks: - with open('{}/disk_{}.report'.format(debug_dest, disk.name), 'a') as f: - for line in debug_report_disk(disk): - f.write('{}\n'.format(line)) - - -def upload_logdir(global_vars, reason='Crash'): - """Upload compressed LogDir to CRASH_SERVER.""" - source = global_vars['LogDir'] - source = source[source.rfind('/')+1:] - dest = 'HW-Diags_{reason}_{Date-Time}.txz'.format( - reason=reason, - **global_vars, - ) - data = None - - # Compress LogDir - os.chdir('{}/..'.format(global_vars['LogDir'])) - cmd = ['tar', 'caf', dest, source] - run_program(cmd) - - # Read file - with open(dest, 'rb') as f: - data = f.read() - - # Upload data - url = '{}/{}'.format(CRASH_SERVER['Url'], dest) - r = requests.put( - url, - data=data, - headers={'X-Requested-With': 'XMLHttpRequest'}, - auth=(CRASH_SERVER['User'], CRASH_SERVER['Pass'])) - # Raise exception if upload NS - if not r.ok: - raise GenericError - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/activation.py b/scripts/wk.prev/functions/activation.py deleted file mode 100644 index 52ea8ecd..00000000 --- a/scripts/wk.prev/functions/activation.py +++ /dev/null @@ -1,73 +0,0 @@ -# Wizard Kit: Functions - Activation - -import subprocess - -from borrowed import acpi -from functions.common import * -from os import environ - - -# STATIC VARIABLES -SLMGR = r'{}\System32\slmgr.vbs'.format(environ.get('SYSTEMROOT')) - - -def activate_with_bios(): - """Attempt to activate Windows with a key stored in the BIOS.""" - # Code borrowed from https://github.com/aeruder/get_win8key - ##################################################### - #script to query windows 8.x OEM key from PC firmware - #ACPI -> table MSDM -> raw content -> byte offset 56 to end - #ck, 03-Jan-2014 (christian@korneck.de) - ##################################################### - bios_key = None - table = b"MSDM" - if acpi.FindAcpiTable(table) is True: - rawtable = acpi.GetAcpiTable(table) - #http://msdn.microsoft.com/library/windows/hardware/hh673514 - #byte offset 36 from beginning \ - # = Microsoft 'software licensing data structure' \ - # / 36 + 20 bytes offset from beginning = Win Key - bios_key = rawtable[56:len(rawtable)].decode("utf-8") - if bios_key is None: - raise BIOSKeyNotFoundError - - # Install Key - cmd = ['cscript', '//nologo', SLMGR, '/ipk', bios_key] - subprocess.run(cmd, check=False) - sleep(5) - - # Attempt activation - cmd = ['cscript', '//nologo', SLMGR, '/ato'] - subprocess.run(cmd, check=False) - sleep(5) - - # Check status - if not windows_is_activated(): - raise Exception('Activation Failed') - - -def get_activation_string(): - """Get activation status, returns str.""" - act_str = subprocess.run( - ['cscript', '//nologo', SLMGR, '/xpr'], check=False, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - act_str = act_str.stdout.decode() - act_str = act_str.splitlines() - act_str = act_str[1].strip() - return act_str - - -def windows_is_activated(): - """Check if Windows is activated via slmgr.vbs and return bool.""" - activation_string = subprocess.run( - ['cscript', '//nologo', SLMGR, '/xpr'], check=False, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - activation_string = activation_string.stdout.decode() - - return bool(activation_string and 'permanent' in activation_string) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/backup.py b/scripts/wk.prev/functions/backup.py deleted file mode 100644 index ad03f822..00000000 --- a/scripts/wk.prev/functions/backup.py +++ /dev/null @@ -1,219 +0,0 @@ -# Wizard Kit: Functions - Backup - -import ctypes - -from functions.disk import * - - -# Regex -REGEX_BAD_PATH_NAMES = re.compile( - r'([<>:"/\|\?\*]' - r'|^(CON|PRN|AUX|NUL|COM\d*|LPT\d*)$)' - r'|^\s+' - r'|[\s\.]+$', - re.IGNORECASE) - - -def backup_partition(disk, par): - """Create a backup image of a partition.""" - if (par.get('Image Exists', False) - or par['Number'] in disk['Bad Partitions']): - raise GenericAbort - - cmd = [ - global_vars['Tools']['wimlib-imagex'], - 'capture', - '{}:\\'.format(par['Letter']), - par['Image Path'], - par['Image Name'], # Image name - par['Image Name'], # Image description - '--compress=none', - ] - dest_dir = re.sub(r'(.*)\\.*$', r'\1', par['Image Path'], re.IGNORECASE) - os.makedirs(dest_dir, exist_ok=True) - run_program(cmd) - - -def fix_path(path): - """Replace invalid filename characters with underscores.""" - local_drive = path[1:2] == ':' - new_path = REGEX_BAD_PATH_NAMES.sub('_', path) - if local_drive: - new_path = '{}:{}'.format(new_path[0:1], new_path[2:]) - return new_path - - -def get_volume_display_name(mountpoint): - """Get display name from volume mountpoint and label, returns str.""" - name = mountpoint - try: - kernel32 = ctypes.windll.kernel32 - vol_name_buffer = ctypes.create_unicode_buffer(1024) - fs_name_buffer = ctypes.create_unicode_buffer(1024) - serial_number = None - max_component_length = None - file_system_flags = None - - vol_info = kernel32.GetVolumeInformationW( - ctypes.c_wchar_p(mountpoint), - vol_name_buffer, - ctypes.sizeof(vol_name_buffer), - serial_number, - max_component_length, - file_system_flags, - fs_name_buffer, - ctypes.sizeof(fs_name_buffer) - ) - - name = '{} "{}"'.format(name, vol_name_buffer.value) - except: - pass - - return name - - -def prep_disk_for_backup(destination, disk, backup_prefix): - """Gather details about the disk and its partitions. - - This includes partitions that can't be backed up, - whether backups already exist on the BACKUP_SERVER, - partition names/sizes/used space, etc.""" - disk['Clobber Risk'] = [] - width = len(str(len(disk['Partitions']))) - - # Get partition totals - disk['Bad Partitions'] = [par['Number'] for par in disk['Partitions'] - if is_bad_partition(par)] - num_valid_partitions = len(disk['Partitions']) - len(disk['Bad Partitions']) - disk['Valid Partitions'] = num_valid_partitions - if disk['Valid Partitions'] <= 0: - print_error('ERROR: No partitions can be backed up for this disk') - raise GenericAbort - - # Prep partitions - for par in disk['Partitions']: - display = '{size} {fs}'.format( - num = par['Number'], - width = width, - size = par['Size'], - fs = par['FileSystem']) - - if par['Number'] in disk['Bad Partitions']: - # Set display string using partition description & OS type - display = '* {display}\t\t{q}{name}{q}\t{desc} ({os})'.format( - display = display, - q = '"' if par['Name'] != '' else '', - name = par['Name'], - desc = par['Description'], - os = par['OS']) - else: - # Update info for WIM capturing - par['Image Name'] = par['Name'] if par['Name'] else 'Unknown' - if 'IP' in destination: - par['Image Path'] = r'\\{}\{}\{}'.format( - destination['IP'], destination['Share'], backup_prefix) - else: - par['Image Path'] = r'{}:\{}'.format( - destination['Letter'], backup_prefix) - par['Image Path'] += r'\{}_{}.wim'.format( - par['Number'], par['Image Name']) - par['Image Path'] = fix_path(par['Image Path']) - - # Check for existing backups - par['Image Exists'] = os.path.exists(par['Image Path']) - if par['Image Exists']: - disk['Clobber Risk'].append(par['Number']) - display = '+ {}'.format(display) - else: - display = ' {}'.format(display) - - # Append rest of Display String for valid/clobber partitions - display += ' (Used: {used})\t{q}{name}{q}'.format( - used = par['Used Space'], - q = '"' if par['Name'] != '' else '', - name = par['Name']) - # For all partitions - par['Display String'] = display - - # Set description for bad partitions - warnings = '\n' - if disk['Bad Partitions']: - warnings += '{} * Unsupported filesystem{}\n'.format( - COLORS['YELLOW'], COLORS['CLEAR']) - if disk['Clobber Risk']: - warnings += '{} + Backup exists on {}{}\n'.format( - COLORS['BLUE'], destination['Name'], COLORS['CLEAR']) - if disk['Bad Partitions'] or disk['Clobber Risk']: - warnings += '\n{}Marked partition(s) will NOT be backed up.{}\n'.format( - COLORS['YELLOW'], COLORS['CLEAR']) - disk['Backup Warnings'] = warnings - - -def select_backup_destination(auto_select=True): - """Select a backup destination from a menu, returns server dict.""" - destinations = [s for s in BACKUP_SERVERS if s['Mounted']] - actions = [ - {'Name': 'Main Menu', 'Letter': 'M'}, - ] - - # Add local disks - for d in psutil.disk_partitions(): - if re.search( - r'^{}'.format(global_vars['Env']['SYSTEMDRIVE']), - d.mountpoint, - re.IGNORECASE): - # Skip current OS drive - pass - elif 'fixed' in d.opts: - # Skip DVD, etc - destinations.append({ - 'Name': 'Local Disk - {}'.format( - get_volume_display_name(d.mountpoint)), - 'Letter': re.sub(r'^(\w):\\.*$', r'\1', d.mountpoint), - }) - - # Size check - for dest in destinations: - if 'IP' in dest: - dest['Usage'] = shutil.disk_usage(r'\\{IP}\{Share}'.format(**dest)) - else: - dest['Usage'] = shutil.disk_usage('{}:\\'.format(dest['Letter'])) - dest['Free Space'] = human_readable_size(dest['Usage'].free) - dest['Display Name'] = '{Name} ({Free Space} available)'.format(**dest) - - # Bail - if not destinations: - print_warning('No backup destinations found.') - raise GenericAbort - - # Skip menu? - if len(destinations) == 1 and auto_select: - return destinations[0] - - selection = menu_select( - title = 'Where are we backing up to?', - main_entries = destinations, - action_entries = actions) - if selection == 'M': - raise GenericAbort - else: - return destinations[int(selection)-1] - - -def verify_wim_backup(partition): - """Verify WIM integrity.""" - if not os.path.exists(partition['Image Path']): - raise PathNotFoundError - cmd = [ - global_vars['Tools']['wimlib-imagex'], - 'verify', - partition['Image Path'], - '--nocheck', - ] - run_program(cmd) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/browsers.py b/scripts/wk.prev/functions/browsers.py deleted file mode 100644 index 8a1f4dcb..00000000 --- a/scripts/wk.prev/functions/browsers.py +++ /dev/null @@ -1,470 +0,0 @@ -# Wizard Kit: Functions - Browsers - -from functions.common import * -from operator import itemgetter -from settings.browsers import * - - -# Define other_results for later try_and_print -browser_data = {} -other_results = { - 'Error': { - 'MultipleInstallationsError': 'Multiple installations detected', - }, - 'Warning': { - 'NotInstalledError': 'Not installed', - 'NoProfilesError': 'No profiles found', - } - } - - -def archive_all_users(): - """Create backups for all browsers for all users.""" - users_root = r'{}\Users'.format(global_vars['Env']['SYSTEMDRIVE']) - user_envs = [] - - # Build list of valid users - for user_name in os.listdir(users_root): - valid_user = True - if user_name in ('Default', 'Default User'): - # Skip default users - continue - user_path = os.path.join(users_root, user_name) - appdata_local = os.path.join(user_path, r'AppData\Local') - appdata_roaming = os.path.join(user_path, r'AppData\Roaming') - valid_user = valid_user and os.path.exists(appdata_local) - valid_user = valid_user and os.path.exists(appdata_roaming) - if valid_user: - user_envs.append({ - 'USERNAME': user_name, - 'USERPROFILE': user_path, - 'APPDATA': appdata_roaming, - 'LOCALAPPDATA': appdata_local}) - - # Backup browsers for all valid users - print_info('Backing up browsers') - for fake_env in sorted(user_envs, key=itemgetter('USERPROFILE')): - print_standard(' {}'.format(fake_env['USERNAME'])) - for b_k, b_v in sorted(SUPPORTED_BROWSERS.items()): - if b_k == 'Mozilla Firefox Dev': - continue - source_path = b_v['user_data_path'].format(**fake_env) - if not os.path.exists(source_path): - continue - source_items = source_path + '*' - archive_path = r'{BackupDir}\Browsers ({USERNAME})\{Date}'.format( - **global_vars, **fake_env) - os.makedirs(archive_path, exist_ok=True) - archive_path += r'\{}.7z'.format(b_k) - cmd = [ - global_vars['Tools']['SevenZip'], - 'a', '-aoa', '-bso0', '-bse0', '-mx=1', - archive_path, source_items] - try_and_print(message='{}...'.format(b_k), - function=run_program, cmd=cmd) - print_standard(' ') - - -def archive_browser(name): - """Create backup of Browser saved in the BackupDir.""" - source = '{}*'.format(browser_data[name]['user_data_path']) - dest = r'{BackupDir}\Browsers ({USERNAME})\{Date}'.format( - **global_vars, **global_vars['Env']) - archive = r'{}\{}.7z'.format(dest, name) - os.makedirs(dest, exist_ok=True) - cmd = [ - global_vars['Tools']['SevenZip'], - 'a', '-aoa', '-bso0', '-bse0', '-mx=1', - '-mhe=on', '-p{}'.format(ARCHIVE_PASSWORD), - archive, source] - run_program(cmd) - - -def backup_browsers(): - """Create backup of all detected browser profiles.""" - for name in [k for k, v in sorted(browser_data.items()) if v['profiles']]: - try_and_print(message='{}...'.format(name), - function=archive_browser, name=name) - - -def clean_chromium_profile(profile): - """Recreate profile with only the essential user data. - - This is done by renaming the existing profile, creating a new folder - with the original name, then copying the essential files from the - backup folder. This way the original state is preserved in case - something goes wrong. - """ - if profile is None: - raise Exception - backup_path = '{path}_{Date}.bak'.format( - path=profile['path'], **global_vars) - backup_path = non_clobber_rename(backup_path) - shutil.move(profile['path'], backup_path) - os.makedirs(profile['path'], exist_ok=True) - - # Restore essential files from backup_path - for entry in os.scandir(backup_path): - if REGEX_CHROMIUM_ITEMS.search(entry.name): - shutil.copy(entry.path, r'{}\{}'.format( - profile['path'], entry.name)) - - -def clean_internet_explorer(**kwargs): - """Uses the built-in function to reset IE and sets the homepage. - - NOTE: kwargs set but unused as a workaround.""" - kill_process('iexplore.exe') - run_program(['rundll32.exe', 'inetcpl.cpl,ResetIEtoDefaults'], check=False) - key = r'Software\Microsoft\Internet Explorer\Main' - - # Set homepage - with winreg.OpenKey(HKCU, key, access=winreg.KEY_WRITE) as _key: - winreg.SetValueEx(_key, 'Start Page', 0, - winreg.REG_SZ, DEFAULT_HOMEPAGE) - try: - winreg.DeleteValue(_key, 'Secondary Start Pages') - except FileNotFoundError: - pass - - -def clean_mozilla_profile(profile): - """Recreate profile with only the essential user data. - - This is done by renaming the existing profile, creating a new folder - with the original name, then copying the essential files from the - backup folder. This way the original state is preserved in case - something goes wrong. - """ - if profile is None: - raise Exception - backup_path = '{path}_{Date}.bak'.format( - path=profile['path'], **global_vars) - backup_path = non_clobber_rename(backup_path) - shutil.move(profile['path'], backup_path) - homepages = [] - os.makedirs(profile['path'], exist_ok=True) - - # Restore essential files from backup_path - for entry in os.scandir(backup_path): - if REGEX_MOZILLA.search(entry.name): - if entry.is_dir(): - shutil.copytree(entry.path, r'{}\{}'.format( - profile['path'], entry.name)) - else: - shutil.copy(entry.path, r'{}\{}'.format( - profile['path'], entry.name)) - - # Set profile defaults - with open(r'{path}\prefs.js'.format(**profile), 'a', encoding='ascii') as f: - for k, v in MOZILLA_PREFS.items(): - f.write('user_pref("{}", {});\n'.format(k, v)) - - -def get_browser_details(name): - """Get installation and profile details for all supported browsers.""" - browser = SUPPORTED_BROWSERS[name].copy() - - # Update user_data_path - browser['user_data_path'] = browser['user_data_path'].format( - **global_vars['Env']) - - # Find executable (if multiple files are found, the last one is used) - exe_path = None - num_installs = 0 - for install_path in ['LOCALAPPDATA', 'PROGRAMFILES(X86)', 'PROGRAMFILES']: - test_path = r'{install_path}\{rel_install_path}\{exe_name}'.format( - install_path = global_vars['Env'].get(install_path, ''), - **browser) - if os.path.exists(test_path): - num_installs += 1 - exe_path = test_path - - # Find profile(s) - profiles = [] - if browser['base'] == 'ie': - profiles.append({'name': 'Default', 'path': None}) - elif 'Google Chrome' in name: - profiles.extend( - get_chromium_profiles( - search_path=browser['user_data_path'])) - elif browser['base'] == 'mozilla': - dev = 'Dev' in name - profiles.extend( - get_mozilla_profiles( - search_path=browser['user_data_path'], dev=dev)) - if exe_path and not dev and len(profiles) == 0: - # e.g. If Firefox is installed but no profiles were found. - ## Rename profiles.ini and create a new default profile - profiles_ini_path = browser['user_data_path'].replace( - 'Profiles', 'profiles.ini') - if os.path.exists(profiles_ini_path): - backup_path = '{path}_{Date}.bak'.format( - path=profiles_ini_path, **global_vars) - backup_path = non_clobber_rename(backup_path) - shutil.move(profiles_ini_path, backup_path) - run_program([exe_path, '-createprofile', 'default'], check=False) - profiles.extend( - get_mozilla_profiles( - search_path=browser['user_data_path'], dev=dev)) - - elif 'Opera' in name: - if os.path.exists(browser['user_data_path']): - profiles.append( - {'name': 'Default', 'path': browser['user_data_path']}) - - # Get homepages - if browser['base'] == 'ie': - # IE is set to only have one profile above - profiles[0]['homepages'] = get_ie_homepages() - elif browser['base'] == 'mozilla': - for profile in profiles: - prefs_path = r'{path}\prefs.js'.format(**profile) - profile['homepages'] = get_mozilla_homepages(prefs_path=prefs_path) - - # Add to browser_data - browser_data[name] = browser - browser_data[name].update({ - 'exe_path': exe_path, - 'profiles': profiles, - }) - - # Raise installation warnings (if any) - if num_installs == 0: - raise NotInstalledError - elif num_installs > 1 and browser['base'] != 'ie': - raise MultipleInstallationsError - - -def get_chromium_profiles(search_path): - """Find any chromium-style profiles and return as a list of dicts.""" - profiles = [] - try: - for entry in os.scandir(search_path): - if entry.is_dir() and REGEX_CHROMIUM_PROFILE.search(entry.name): - profiles.append(entry) - REGEX_PROFILE_BACKUP = r'\.\w+bak.*' - profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)] - # Convert os.DirEntries to dicts - profiles = [{'name': p.name, 'path': p.path} for p in profiles] - except Exception: - pass - - return profiles - - -def get_ie_homepages(): - """Read homepages from the registry and return as a list.""" - homepages = [] - main_page = '' - extra_pages = [] - key = r'Software\Microsoft\Internet Explorer\Main' - with winreg.OpenKey(HKCU, key) as _key: - try: - main_page = winreg.QueryValueEx(_key, 'Start Page')[0] - except FileNotFoundError: - pass - try: - extra_pages = winreg.QueryValueEx(_key, 'Secondary Start Pages')[0] - except FileNotFoundError: - pass - if main_page != '': - homepages.append(main_page) - if len(extra_pages) > 0: - homepages.extend(extra_pages) - - # Remove all curly braces - homepages = [h.replace('{', '').replace('}', '') for h in homepages] - return homepages - - -def get_mozilla_homepages(prefs_path): - """Read homepages from prefs.js and return as a list.""" - homepages = [] - try: - with open(prefs_path, 'r') as f: - search = re.search( - r'browser\.startup\.homepage", "([^"]*)"', - f.read(), re.IGNORECASE) - if search: - homepages = search.group(1).split('|') - except Exception: - pass - - return homepages - - -def get_mozilla_profiles(search_path, dev=False): - """Find any mozilla-style profiles and return as a list of dicts.""" - profiles = [] - try: - for entry in os.scandir(search_path): - if entry.is_dir(): - if 'dev-edition' in entry.name: - # NOTE: Not always present which can lead - # to Dev profiles being marked as non-Dev - ## NOTE 2: It is possible that a non-Dev profile - ## to be created with 'dev-edition' in the name. - ## (It wouldn't make sense, but possible) - if dev: - profiles.append(entry) - elif not dev: - profiles.append(entry) - profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)] - # Convert os.DirEntries to dicts - profiles = [{'name': p.name, 'path': p.path} for p in profiles] - except Exception: - pass - - return profiles - - -def install_adblock(indent=8, width=32, just_firefox=False): - """Install adblock for all supported browsers.""" - for browser in sorted(browser_data): - if just_firefox and browser_data[browser]['base'] != 'mozilla': - continue - exe_path = browser_data[browser].get('exe_path', None) - if not exe_path: - if browser_data[browser]['profiles']: - print_standard( - '{indent}{browser:<{width}}'.format( - indent=' '*indent, width=width, browser=browser+'...'), - end='', flush=True) - print_warning('Profile(s) detected but browser not installed', - timestamp=False) - else: - # Only warn if profile(s) are detected. - pass - else: - # Set urls to open - urls = [] - if browser_data[browser]['base'] == 'chromium': - if browser == 'Google Chrome': - # Check for system exensions - try: - winreg.QueryValue(HKLM, UBO_CHROME_REG) - except FileNotFoundError: - urls.append(UBO_CHROME) - try: - winreg.QueryValue(HKLM, UBO_EXTRA_CHROME_REG) - except FileNotFoundError: - urls.append(UBO_EXTRA_CHROME) - - if len(urls) == 0: - urls = ['chrome://extensions'] - elif 'Opera' in browser: - urls.append(UBO_OPERA) - else: - urls.append(UBO_CHROME) - urls.append(UBO_EXTRA_CHROME) - - elif browser_data[browser]['base'] == 'mozilla': - # Check for system extensions - try: - with winreg.OpenKey(HKLM, UBO_MOZILLA_REG) as key: - winreg.QueryValueEx(key, UBO_MOZILLA_REG_NAME) - except FileNotFoundError: - urls = [UBO_MOZILLA] - else: - if os.path.exists(UBO_MOZZILA_PATH): - urls = ['about:addons'] - else: - urls = [UBO_MOZILLA] - - elif browser_data[browser]['base'] == 'ie': - urls.append(IE_GALLERY) - - # By using check=False we're skipping any return codes so - # it should only fail if the program can't be run - # (or can't be found). - # In other words, this isn't tracking the addon/extension's - # installation status. - try_and_print(message='{}...'.format(browser), - indent=indent, width=width, - cs='Started', function=popen_program, - cmd=[exe_path, *urls], check=False) - - -def is_installed(browser_name): - """Checks if browser is installed based on exe_path, returns bool.""" - browser_name = browser_name.replace(' Chromium', '') - return bool(browser_data.get(browser_name, {}).get('exe_path', False)) - - -def list_homepages(indent=8, width=32): - """List current homepages for reference.""" - browser_list = [k for k, v in sorted(browser_data.items()) if v['exe_path']] - for browser in browser_list: - # Skip Chromium-based browsers - if browser_data[browser]['base'] == 'chromium': - print_info( - '{indent}{browser:<{width}}'.format( - indent=' '*indent, width=width, browser=browser+'...'), - end='', flush=True) - print_warning('Not implemented', timestamp=False) - continue - - # All other browsers - print_info('{indent}{browser:<{width}}'.format( - indent=' '*indent, width=width, browser=browser+'...')) - for profile in browser_data[browser].get('profiles', []): - name = profile.get('name', '?') - homepages = profile.get('homepages', []) - if len(homepages) == 0: - print_standard( - '{indent}{name:<{width}}'.format( - indent=' '*indent, width=width, name=name), - end='', flush=True) - print_warning('None found', timestamp=False) - else: - for page in homepages: - print_standard('{indent}{name:<{width}}{page}'.format( - indent=' '*indent, width=width, name=name, page=page)) - - -def profile_present(browser_name): - """Checks if a profile was detected for browser, returns bool.""" - browser_name = browser_name.replace(' Chromium', '') - return bool(browser_data.get(browser_name, {}).get('profiles', False)) - - -def reset_browsers(indent=8, width=32): - """Reset all detected browsers to safe defaults.""" - browser_list = [k for k, v in sorted(browser_data.items()) if v['profiles']] - for browser in browser_list: - print_info('{indent}{name}'.format(indent=' '*indent, name=browser)) - for profile in browser_data[browser]['profiles']: - if browser_data[browser]['base'] == 'chromium': - function = clean_chromium_profile - elif browser_data[browser]['base'] == 'ie': - function = clean_internet_explorer - elif browser_data[browser]['base'] == 'mozilla': - function = clean_mozilla_profile - try_and_print( - message='{}...'.format(profile['name']), - indent=indent, width=width, function=function, - other_results=other_results, profile=profile) - - -def scan_for_browsers(just_firefox=False, silent=False): - """Scan system for any supported browsers.""" - for name, details in sorted(SUPPORTED_BROWSERS.items()): - if just_firefox and details['base'] != 'mozilla': - continue - if silent: - try: - get_browser_details(name) - except Exception: - # Ignore errors in silent mode - pass - else: - try_and_print(message='{}...'.format(name), - function=get_browser_details, cs='Detected', - other_results=other_results, name=name) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/cleanup.py b/scripts/wk.prev/functions/cleanup.py deleted file mode 100644 index 744ee048..00000000 --- a/scripts/wk.prev/functions/cleanup.py +++ /dev/null @@ -1,144 +0,0 @@ -'''Wizard Kit: Functions - Cleanup''' -# pylint: disable=no-name-in-module,wildcard-import -# vim: sts=2 sw=2 ts=2 - -from functions.setup import * -from settings.cleanup import * - -def cleanup_adwcleaner(): - """Move AdwCleaner folders into the ClientDir.""" - source_path = r'{SYSTEMDRIVE}\AdwCleaner'.format(**global_vars['Env']) - source_quarantine = r'{}\Quarantine'.format(source_path) - - # Quarantine - if os.path.exists(source_quarantine): - os.makedirs(global_vars['QuarantineDir'], exist_ok=True) - dest_name = r'{QuarantineDir}\AdwCleaner_{Date-Time}'.format( - **global_vars) - dest_name = non_clobber_rename(dest_name) - shutil.move(source_quarantine, dest_name) - - # Delete source folder if empty - delete_empty_folders(source_path) - - # Main folder - if os.path.exists(source_path): - os.makedirs(global_vars['LogDir'], exist_ok=True) - dest_name = r'{LogDir}\Tools\AdwCleaner'.format( - **global_vars) - dest_name = non_clobber_rename(dest_name) - shutil.move(source_path, dest_name) - - -def cleanup_cbs(dest_folder): - """Safely cleanup a known CBS archive bug under Windows 7. - - If a CbsPersist file is larger than 2 Gb then the auto archive feature - continually fails and will fill up the system drive with temp files. - - This function moves the temp files and CbsPersist file to a temp folder, - compresses the CbsPersist files with 7-Zip, and then opens the temp folder - for the user to manually save the backup files and delete the temp files. - """ - backup_folder = r'{dest_folder}\CbsFix'.format(dest_folder=dest_folder) - temp_folder = r'{backup_folder}\Temp'.format(backup_folder=backup_folder) - os.makedirs(backup_folder, exist_ok=True) - os.makedirs(temp_folder, exist_ok=True) - - # Move files into temp folder - cbs_path = r'{SYSTEMROOT}\Logs\CBS'.format(**global_vars['Env']) - for entry in os.scandir(cbs_path): - # CbsPersist files - if entry.name.lower().startswith('cbspersist'): - dest_name = r'{}\{}'.format(temp_folder, entry.name) - dest_name = non_clobber_rename(dest_name) - shutil.move(entry.path, dest_name) - temp_path = r'{SYSTEMROOT}\Temp'.format(**global_vars['Env']) - for entry in os.scandir(temp_path): - # cab_ files - if entry.name.lower().startswith('cab_'): - dest_name = r'{}\{}'.format(temp_folder, entry.name) - dest_name = non_clobber_rename(dest_name) - shutil.move(entry.path, dest_name) - - # Compress CbsPersist files with 7-Zip - cmd = [ - global_vars['Tools']['SevenZip'], - 'a', '-t7z', '-mx=3', '-bso0', '-bse0', - r'{}\CbsPersists.7z'.format(backup_folder), - r'{}\CbsPersist*'.format(temp_folder)] - run_program(cmd) - - -def cleanup_desktop(): - """Move known backup files and reports into the ClientDir.""" - dest_folder = r'{LogDir}\Tools'.format(**global_vars) - os.makedirs(dest_folder, exist_ok=True) - - desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env']) - for entry in os.scandir(desktop_path): - if DESKTOP_ITEMS.search(entry.name): - dest_name = r'{}\{}'.format(dest_folder, entry.name) - dest_name = non_clobber_rename(dest_name) - shutil.move(entry.path, dest_name) - - # Remove dir if empty - delete_empty_folders(dest_folder) - - -def delete_empty_folders(folder_path): - """Delete all empty folders in path (depth first).""" - if not os.path.exists(folder_path) or not os.path.isdir(folder_path): - # Bail early (silently) - return - - # Delete empty subfolders first - for item in os.scandir(folder_path): - if item.is_dir(): - delete_empty_folders(item.path) - - # Remove top folder - try: - os.rmdir(folder_path) - except OSError: - pass - - -def delete_registry_key(hive, key, recurse=False): - """Delete a registry key and all it's subkeys.""" - access = winreg.KEY_ALL_ACCESS - - try: - if recurse: - # Delete all subkeys first - with winreg.OpenKeyEx(hive, key, 0, access) as k: - key_info = winreg.QueryInfoKey(k) - for x in range(key_info[0]): - subkey = r'{}\{}'.format(key, winreg.EnumKey(k, 0)) - delete_registry_key(hive, subkey) - - # Delete key - winreg.DeleteKey(hive, key) - except FileNotFoundError: - # Ignore - pass - - -def delete_registry_value(hive, key, value): - """Delete a registry value.""" - access = winreg.KEY_ALL_ACCESS - with winreg.OpenKeyEx(hive, key, 0, access) as k: - winreg.DeleteValue(k, value) - - -def restore_default_uac(): - """Restores default UAC settings via the registry.""" - if global_vars['OS']['Version'] == '10': - write_registry_settings(UAC_DEFAULTS_WIN10, all_users=True) - else: - # Haven't checked Win8 settings, only applying minimum set - write_registry_settings(UAC_DEFAULTS_WIN7, all_users=True) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") diff --git a/scripts/wk.prev/functions/common.py b/scripts/wk.prev/functions/common.py deleted file mode 100644 index f2e019d3..00000000 --- a/scripts/wk.prev/functions/common.py +++ /dev/null @@ -1,434 +0,0 @@ -# Wizard Kit: Functions - Common - -import os -import psutil -import re -import shutil -import subprocess -import sys -import time -import traceback -try: - import winreg -except ModuleNotFoundError: - if psutil.WINDOWS: - raise - -from settings.main import * -from settings.tools import * -from settings.windows_builds import * -from subprocess import CalledProcessError - - -# Global variables -global_vars = {} - - -# STATIC VARIABLES -COLORS = { - 'CLEAR': '\033[0m', - 'RED': '\033[31m', - 'ORANGE': '\033[31;1m', - 'GREEN': '\033[32m', - 'YELLOW': '\033[33m', - 'BLUE': '\033[34m', - 'PURPLE': '\033[35m', - 'CYAN': '\033[36m', - } -try: - HKU = winreg.HKEY_USERS - HKCR = winreg.HKEY_CLASSES_ROOT - HKCU = winreg.HKEY_CURRENT_USER - HKLM = winreg.HKEY_LOCAL_MACHINE -except NameError: - if psutil.WINDOWS: - raise - - -# Error Classes -class BIOSKeyNotFoundError(Exception): - pass - -class BinNotFoundError(Exception): - pass - -class GenericAbort(Exception): - pass - -class GenericError(Exception): - pass - -class GenericRepair(Exception): - pass - -class MultipleInstallationsError(Exception): - pass - -class NoProfilesError(Exception): - pass - -class Not4KAlignedError(Exception): - pass - -class NotInstalledError(Exception): - pass - -class OSInstalledLegacyError(Exception): - pass - -class PathNotFoundError(Exception): - pass - -class UnsupportedOSError(Exception): - pass - -class SecureBootDisabledError(Exception): - pass - -class SecureBootNotAvailError(Exception): - pass - -class SecureBootUnknownError(Exception): - pass - -class WindowsOutdatedError(Exception): - pass - -class WindowsUnsupportedError(Exception): - pass - - -# General functions -def exit_script(return_value=0): - """Exits the script after some cleanup and opens the log (if set).""" - # Remove dirs (if empty) - for dir in ['BackupDir', 'LogDir', 'TmpDir']: - try: - os.rmdir(global_vars[dir]) - except Exception: - pass - - # Open Log (if it exists) - log = global_vars.get('LogFile', '') - if log and os.path.exists(log) and psutil.WINDOWS and ENABLED_OPEN_LOGS: - try: - extract_item('NotepadPlusPlus', silent=True) - popen_program( - [global_vars['Tools']['NotepadPlusPlus'], - global_vars['LogFile']]) - except Exception: - print_error('ERROR: Failed to extract Notepad++ and open log.') - pause('Press Enter to exit...') - - # Kill Caffeine if still running - kill_process('caffeine.exe') - - # Exit - sys.exit(return_value) - - -def extract_item(item, filter='', silent=False): - """Extract item from .cbin into .bin.""" - cmd = [ - global_vars['Tools']['SevenZip'], 'x', '-aos', '-bso0', '-bse0', - '-p{ArchivePassword}'.format(**global_vars), - r'-o{BinDir}\{item}'.format(item=item, **global_vars), - r'{CBinDir}\{item}.7z'.format(item=item, **global_vars), - filter] - if not silent: - print_standard('Extracting "{item}"...'.format(item=item)) - try: - run_program(cmd) - except FileNotFoundError: - if not silent: - print_warning('WARNING: Archive not found') - except subprocess.CalledProcessError: - if not silent: - print_warning('WARNING: Errors encountered while exctracting data') - - -def get_process(name=None): - """Get process by name, returns psutil.Process obj.""" - proc = None - if not name: - raise GenericError - - for p in psutil.process_iter(): - try: - if p.name() == name: - proc = p - except psutil._exceptions.NoSuchProcess: - # Process finished during iteration? Going to ignore - pass - return proc - - -def get_ticket_number(): - """Get TicketNumber from user, save in LogDir, and return as str.""" - if not ENABLED_TICKET_NUMBERS: - return None - ticket_number = None - while ticket_number is None: - _input = input('Enter ticket number: ') - if re.match(r'^([0-9]+([-_]?\w+|))$', _input): - ticket_number = _input - out_file = r'{}\TicketNumber'.format(global_vars['LogDir']) - if not psutil.WINDOWS: - out_file = out_file.replace('\\', '/') - with open(out_file, 'w', encoding='utf-8') as f: - f.write(ticket_number) - return ticket_number - - -def kill_process(name): - """Kill any running caffeine.exe processes.""" - for proc in psutil.process_iter(): - if proc.name() == name: - proc.kill() - - -def stay_awake(): - """Prevent the system from sleeping or hibernating.""" - # DISABLED due to VCR2008 dependency - return - # Bail if caffeine is already running - for proc in psutil.process_iter(): - if proc.name() == 'caffeine.exe': - return - # Extract and run - extract_item('Caffeine', silent=True) - try: - popen_program([global_vars['Tools']['Caffeine']]) - except Exception: - print_error('ERROR: No caffeine available.') - print_warning('Please set the power setting to High Performance.') - - -def wait_for_process(name, poll_rate=3): - """Wait for process by name.""" - running = True - while running: - sleep(poll_rate) - running = False - for proc in psutil.process_iter(): - try: - if re.search(r'^{}'.format(name), proc.name(), re.IGNORECASE): - running = True - except psutil._exceptions.NoSuchProcess: - # Assuming process closed during iteration - pass - sleep(1) - - -# global_vars functions -def init_global_vars(silent=False): - """Sets global variables based on system info.""" - if not silent: - print_info('Initializing') - if psutil.WINDOWS: - os.system('title Wizard Kit') - if psutil.LINUX: - init_functions = [ - ['Checking environment...', set_linux_vars], - ['Clearing collisions...', clean_env_vars], - ] - else: - init_functions = [ - ['Checking .bin...', find_bin], - ['Checking environment...', set_common_vars], - ['Checking OS...', check_os], - ['Checking tools...', check_tools], - ['Creating folders...', make_tmp_dirs], - ['Clearing collisions...', clean_env_vars], - ] - try: - if silent: - for f in init_functions: - f[1]() - else: - for f in init_functions: - try_and_print( - message=f[0], function=f[1], - cs='Done', ns='Error', catch_all=False) - except: - major_exception() - - -def check_os(): - """Set OS specific variables.""" - tmp = {} - - # Query registry - path = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion' - with winreg.OpenKey(HKLM, path) as key: - for name in ['CurrentBuild', 'CurrentVersion', 'ProductName']: - try: - tmp[name] = winreg.QueryValueEx(key, name)[0] - except FileNotFoundError: - tmp[name] = 'Unknown' - - # Handle CurrentBuild collision - if tmp['CurrentBuild'] == '9200': - if tmp['CurrentVersion'] == '6.2': - # Windown 8, set to fake build number - tmp['CurrentBuild'] = '9199' - else: - # Windows 8.1, leave alone - pass - - # Check bit depth - tmp['Arch'] = 32 - if 'PROGRAMFILES(X86)' in global_vars['Env']: - tmp['Arch'] = 64 - - # Get Windows build info - build_info = WINDOWS_BUILDS.get(tmp['CurrentBuild'], None) - if build_info is None: - # Not in windows_builds.py - build_info = [ - 'Unknown', - 'Build {}'.format(tmp['CurrentBuild']), - None, - None, - 'unrecognized'] - else: - build_info = list(build_info) - tmp['Version'] = build_info.pop(0) - tmp['Release'] = build_info.pop(0) - tmp['Codename'] = build_info.pop(0) - tmp['Marketing Name'] = build_info.pop(0) - tmp['Notes'] = build_info.pop(0) - - # Set name - tmp['Name'] = tmp['ProductName'] - if tmp['Release']: - tmp['Name'] += ' {}'.format(tmp['Release']) - if tmp['Codename']: - tmp['Name'] += ' "{}"'.format(tmp['Codename']) - if tmp['Marketing Name']: - tmp['Name'] += ' / "{}"'.format(tmp['Marketing Name']) - tmp['Name'] = re.sub(r'\s+', ' ', tmp['Name']) - - # Set display name - tmp['DisplayName'] = '{} x{}'.format(tmp['Name'], tmp['Arch']) - if tmp['Notes']: - tmp['DisplayName'] += ' ({})'.format(tmp['Notes']) - - global_vars['OS'] = tmp - - -def check_tools(): - """Set tool variables based on OS bit-depth and tool availability.""" - if global_vars['OS'].get('Arch', 32) == 64: - global_vars['Tools'] = { - k: v.get('64', v.get('32')) for (k, v) in TOOLS.items()} - else: - global_vars['Tools'] = {k: v.get('32') for (k, v) in TOOLS.items()} - - # Fix paths - global_vars['Tools'] = {k: os.path.join(global_vars['BinDir'], v) - for (k, v) in global_vars['Tools'].items()} - - -def clean_env_vars(): - """Remove conflicting global_vars and env variables. - - This fixes an issue where both global_vars and - global_vars['Env'] are expanded at the same time.""" - for key in global_vars.keys(): - global_vars['Env'].pop(key, None) - - -def find_bin(): - """Find .bin folder in the cwd or it's parents.""" - wd = os.getcwd() - base = None - while base is None: - if os.path.exists('.bin'): - base = os.getcwd() - break - if re.fullmatch(r'\w:\\', os.getcwd()): - break - os.chdir('..') - os.chdir(wd) - if base is None: - raise BinNotFoundError - global_vars['BaseDir'] = base - - -def generate_global_vars_report(): - """Build readable string from global_vars, returns str.""" - report = ['global_vars: {'] - for k, v in sorted(global_vars.items()): - if k == 'Env': - continue - if isinstance(v, list): - report.append(' {}: ['.format(str(k))) - for item in v: - report.append(' {}'.format(str(v))) - report.append(' ]') - elif isinstance(v, dict): - report.append(' {}: {{'.format(str(k))) - for item_k, item_v in sorted(v.items()): - report.append(' {:<15} {}'.format( - str(item_k)+':', str(item_v))) - report.append(' }') - else: - report.append(' {:<18}{}'.format(str(k)+':', str(v))) - report.append(' Env:') - for k, v in sorted(global_vars.get('Env', {}).items()): - report.append(' {:<15} {}'.format( - str(k)+':', str(v))) - report.append('}') - - return '\n'.join(report) - - -def make_tmp_dirs(): - """Make temp directories.""" - os.makedirs(global_vars['BackupDir'], exist_ok=True) - os.makedirs(global_vars['LogDir'], exist_ok=True) - os.makedirs(r'{}\{}'.format( - global_vars['LogDir'], KIT_NAME_FULL), exist_ok=True) - os.makedirs(r'{}\Tools'.format(global_vars['LogDir']), exist_ok=True) - os.makedirs(global_vars['TmpDir'], exist_ok=True) - - -def set_common_vars(): - """Set common variables.""" - global_vars['Date'] = time.strftime("%Y-%m-%d") - global_vars['Date-Time'] = time.strftime("%Y-%m-%d_%H%M_%z") - global_vars['Env'] = os.environ.copy() - - global_vars['ArchivePassword'] = ARCHIVE_PASSWORD - global_vars['BinDir'] = r'{BaseDir}\.bin'.format(**global_vars) - global_vars['CBinDir'] = r'{BaseDir}\.cbin'.format(**global_vars) - global_vars['ClientDir'] = r'{SYSTEMDRIVE}\{prefix}'.format( - prefix=KIT_NAME_SHORT, **global_vars['Env']) - global_vars['BackupDir'] = r'{ClientDir}\Backups'.format(**global_vars) - global_vars['LogDir'] = r'{ClientDir}\Logs\{Date}'.format(**global_vars) - global_vars['QuarantineDir'] = r'{ClientDir}\Quarantine'.format(**global_vars) - global_vars['TmpDir'] = r'{BinDir}\tmp'.format(**global_vars) - - -def set_linux_vars(): - """Set common variables in a Linux environment. - - These assume we're running under a WK-Linux build.""" - result = run_program(['mktemp', '-d']) - global_vars['TmpDir'] = result.stdout.decode().strip() - global_vars['Date'] = time.strftime("%Y-%m-%d") - global_vars['Date-Time'] = time.strftime("%Y-%m-%d_%H%M_%z") - global_vars['Env'] = os.environ.copy() - global_vars['BinDir'] = '/usr/local/bin' - global_vars['LogDir'] = '{}/Logs'.format(global_vars['Env']['HOME']) - global_vars['Tools'] = { - 'wimlib-imagex': 'wimlib-imagex', - 'SevenZip': '7z', - } - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/data.py b/scripts/wk.prev/functions/data.py deleted file mode 100644 index bf091b37..00000000 --- a/scripts/wk.prev/functions/data.py +++ /dev/null @@ -1,854 +0,0 @@ -# Wizard Kit: Functions - Data - -import ctypes - -from functions.json import * -from operator import itemgetter -from settings.data import * - - -# Classes -class LocalDisk(): - def __init__(self, disk): - self.disk = disk - self.name = disk.mountpoint.upper() - self.path = self.name - def is_dir(self): - # Should always be true - return True - def is_file(self): - # Should always be false - return False - - -class SourceItem(): - def __init__(self, name, path): - self.name = name - self.path = path - - -# Functions -def cleanup_transfer(dest_path): - """Fix attributes and move excluded items to separate folder.""" - try: - # Remove dest_path if empty - os.rmdir(dest_path) - except OSError: - pass - if not os.path.exists(dest_path): - # Bail if dest_path was empty and removed - raise Exception - - # Fix attributes - cmd = ['attrib', '-a', '-h', '-r', '-s', dest_path] - run_program(cmd, check=False) - - for root, dirs, files in os.walk(dest_path, topdown=False): - for name in dirs: - # Remove empty directories and junction points - try: - os.rmdir(os.path.join(root, name)) - except OSError: - pass - for name in files: - # "Remove" files based on exclusion regex - if REGEX_EXCL_ITEMS.search(name): - # Make dest folder - dest_name = root.replace(dest_path, dest_path+'.Removed') - os.makedirs(dest_name, exist_ok=True) - # Set dest filename - dest_name = os.path.join(dest_name, name) - dest_name = non_clobber_rename(dest_name) - source_name = os.path.join(root, name) - try: - shutil.move(source_name, dest_name) - except Exception: - pass - - -def find_core_storage_volumes(device_path=None): - """Try to create block devices for any Apple CoreStorage volumes.""" - corestorage_uuid = '53746f72-6167-11aa-aa11-00306543ecac' - dmsetup_cmd_file = '{TmpDir}/dmsetup_command'.format(**global_vars) - - # Get CoreStorage devices - cmd = [ - 'lsblk', '--json', '--list', '--paths', - '--output', 'NAME,PARTTYPE'] - if device_path: - cmd.append(device_path) - json_data = get_json_from_command(cmd) - devs = json_data.get('blockdevices', []) - devs = [d for d in devs if d.get('parttype', '') == corestorage_uuid] - if devs: - print_standard(' ') - print_standard('Detected CoreStorage partition{}'.format( - '' if len(devs) == 1 else 's')) - print_standard(' Scanning for inner volume(s)....') - - # Search for inner volumes and setup dev mappers - for dev in devs: - dev_path = dev.get('name', '') - if not dev_path: - # Can't setup block device without the dev path - continue - dev_name = re.sub(r'.*/', '', dev_path) - log_path = '{LogDir}/testdisk_{dev_name}.log'.format( - dev_name=dev_name, **global_vars) - - # Run TestDisk - cmd = [ - 'sudo', 'testdisk', - '/logname', log_path, '/debug', '/log', - '/cmd', dev_path, 'partition_none,analyze'] - result = run_program(cmd, check=False) - if result.returncode: - # i.e. return code is non-zero - continue - if not os.path.exists(log_path): - # TestDisk failed to write log - continue - - # Check log for found volumes - cs_vols = {} - with open(log_path, 'r', encoding='utf-8', errors='ignore') as f: - for line in f.readlines(): - r = re.match( - r'^.*echo "([^"]+)" . dmsetup create test(\d)$', - line.strip(), - re.IGNORECASE) - if r: - cs_name = 'CoreStorage_{}_{}'.format(dev_name, r.group(2)) - cs_vols[cs_name] = r.group(1) - - # Create mapper device(s) - for name, dm_cmd in sorted(cs_vols.items()): - with open(dmsetup_cmd_file, 'w') as f: - f.write(dm_cmd) - cmd = ['sudo', 'dmsetup', 'create', name, dmsetup_cmd_file] - run_program(cmd, check=False) - - -def fix_path_sep(path_str): - """Replace non-native and duplicate dir separators, returns str.""" - return re.sub(r'(\\|/)+', lambda s: os.sep, path_str) - - -def is_valid_wim_file(item): - """Checks if the item is a valid WIM file, returns bool.""" - valid = bool(item.is_file() and REGEX_WIM_FILE.search(item.name)) - if valid: - extract_item('wimlib', silent=True) - cmd = [global_vars['Tools']['wimlib-imagex'], 'info', item.path] - try: - run_program(cmd) - except subprocess.CalledProcessError: - valid = False - print_log('WARNING: Image "{}" damaged.'.format(item.name)) - return valid - - -def get_mounted_volumes(): - """Get mounted volumes, returns dict.""" - cmd = [ - 'findmnt', - '--list', - '--json', - '--bytes', - '--invert', - '--types', ( - 'autofs,binfmt_misc,bpf,cgroup,cgroup2,configfs,debugfs,devpts,' - 'devtmpfs,hugetlbfs,mqueue,proc,pstore,securityfs,sysfs,tmpfs' - ), - '--output', 'SOURCE,TARGET,FSTYPE,LABEL,SIZE,AVAIL,USED'] - json_data = get_json_from_command(cmd) - mounted_volumes = [] - for item in json_data.get('filesystems', []): - mounted_volumes.append(item) - mounted_volumes.extend(item.get('children', [])) - return {item['source']: item for item in mounted_volumes} - - -def mount_volumes( - all_devices=True, device_path=None, - read_write=False, core_storage=True): - """Mount all detected filesystems.""" - report = {} - cmd = [ - 'lsblk', '--json', '--paths', - '--output', 'NAME,FSTYPE,LABEL,UUID,PARTTYPE,TYPE,SIZE'] - if not all_devices and device_path: - # Only mount volumes for specific device - cmd.append(device_path) - - # Check for Apple CoreStorage volumes first - if core_storage: - find_core_storage_volumes(device_path) - - # Get list of block devices - json_data = get_json_from_command(cmd) - devs = json_data.get('blockdevices', []) - - # Get list of volumes - volumes = {} - for dev in devs: - if not dev.get('children', []): - volumes.update({dev['name']: dev}) - for child in dev.get('children', []): - if not child.get('children', []): - volumes.update({child['name']: child}) - for grandchild in child.get('children', []): - volumes.update({grandchild['name']: grandchild}) - for great_grandchild in grandchild.get('children', []): - volumes.update({great_grandchild['name']: great_grandchild}) - - # Get list of mounted volumes - mounted_volumes = get_mounted_volumes() - - # Loop over volumes - for vol_path, vol_data in volumes.items(): - vol_data['show_data'] = { - 'message': vol_path.replace('/dev/mapper/', ''), - 'data': None, - } - if re.search(r'^loop\d', vol_path, re.IGNORECASE): - # Skip loopback devices - vol_data['show_data']['data'] = 'Skipped' - vol_data['show_data']['warning'] = True - report[vol_path] = vol_data - elif 'children' in vol_data: - # Skip LVM/RAID partitions (the real volume is mounted separately) - vol_data['show_data']['data'] = vol_data.get('fstype', 'Unknown') - if vol_data.get('label', None): - vol_data['show_data']['data'] += ' "{}"'.format(vol_data['label']) - vol_data['show_data']['info'] = True - report[vol_path] = vol_data - else: - if vol_path in mounted_volumes: - vol_data['show_data']['warning'] = True - else: - # Mount volume - cmd = ['udevil', 'mount', - '-o', 'rw' if read_write else 'ro', - vol_path] - try: - run_program(cmd) - except subprocess.CalledProcessError: - vol_data['show_data']['data'] = 'Failed to mount' - vol_data['show_data']['error'] = True - # Update mounted_volumes data - mounted_volumes = get_mounted_volumes() - - # Format pretty result string - if vol_data['show_data']['data'] == 'Failed to mount': - vol_data['mount_point'] = None - else: - fstype = vol_data.get('fstype', 'Unknown FS') - size_used = human_readable_size( - mounted_volumes[vol_path]['used'], - decimals=1, - ) - size_avail = human_readable_size( - mounted_volumes[vol_path]['avail'], - decimals=1, - ) - vol_data['size_avail'] = size_avail - vol_data['size_used'] = size_used - vol_data['mount_point'] = mounted_volumes[vol_path]['target'] - vol_data['show_data']['data'] = 'Mounted on {}'.format( - mounted_volumes[vol_path]['target']) - vol_data['show_data']['data'] = '{:40} ({}, {} used, {} free)'.format( - vol_data['show_data']['data'], - fstype, - size_used, - size_avail) - - # Update report - report[vol_path] = vol_data - - return report - - -def mount_backup_shares(read_write=False): - """Mount the backup shares unless labeled as already mounted.""" - if psutil.LINUX: - mounted_volumes = get_mounted_volumes() - for server in BACKUP_SERVERS: - if psutil.LINUX: - # Update mounted status - source = '//{IP}/{Share}'.format(**server) - dest = '/Backups/{Name}'.format(**server) - mounted_str = '(Already) Mounted {}'.format(dest) - data = mounted_volumes.get(source, {}) - if dest == data.get('target', ''): - server['Mounted'] = True - elif psutil.WINDOWS: - mounted_str = '(Already) Mounted {Name}'.format(**server) - if server['Mounted']: - print_warning(mounted_str) - continue - - mount_network_share(server, read_write) - - -def mount_network_share(server, read_write=False): - """Mount a network share defined by server.""" - uid = '1000' - - # Get UID - cmd = ['id', '--user', 'tech'] - result = run_program(cmd, check=False, encoding='utf-8', errors='ignore') - if result.stdout.strip().isnumeric(): - uid = result.stdout.strip() - - if read_write: - username = server['RW-User'] - password = server['RW-Pass'] - else: - username = server['User'] - password = server['Pass'] - if psutil.WINDOWS: - cmd = [ - 'net', 'use', r'\\{IP}\{Share}'.format(**server), - '/user:{}'.format(username), password] - warning = r'Failed to mount \\{Name}\{Share}, {IP} unreachable.'.format( - **server) - error = r'Failed to mount \\{Name}\{Share} ({IP})'.format(**server) - success = 'Mounted {Name}'.format(**server) - elif psutil.LINUX: - # Make mountpoint - cmd = [ - 'sudo', 'mkdir', '-p', - '/Backups/{Name}'.format(**server)] - run_program(cmd) - - # Set mount options - cmd_options = [ - # Assuming GID matches UID - 'gid={}'.format(uid), - 'uid={}'.format(uid), - ] - cmd_options.append('rw' if read_write else 'ro') - cmd_options.append('username={}'.format(username)) - if password: - cmd_options.append('password={}'.format(password)) - else: - # Skip password check - cmd_options.append('guest') - - # Set mount command - cmd = [ - 'sudo', 'mount', - '//{IP}/{Share}'.format(**server).replace('\\', '/'), - '/Backups/{Name}'.format(**server), - '-o', ','.join(cmd_options), - ] - - # Set result messages - warning = 'Failed to mount /Backups/{Name}, {IP} unreachable.'.format( - **server) - error = 'Failed to mount /Backups/{Name}'.format(**server) - success = 'Mounted /Backups/{Name}'.format(**server) - - # Test connection - try: - ping(server['IP']) - except subprocess.CalledProcessError: - print_warning(warning) - sleep(1) - return False - - # Mount - try: - run_program(cmd) - except Exception: - print_error(error) - sleep(1) - else: - print_info(success) - server['Mounted'] = True - - -def run_fast_copy(items, dest): - """Copy items to dest using FastCopy.""" - if not items: - raise Exception - - cmd = [global_vars['Tools']['FastCopy'], *FAST_COPY_ARGS] - cmd.append(r'/logfile={LogDir}\Tools\FastCopy.log'.format(**global_vars)) - cmd.extend(items) - cmd.append('/to={}\\'.format(dest)) - - run_program(cmd) - - -def run_wimextract(source, items, dest): - """Extract items from source WIM to dest folder.""" - if not items: - raise Exception - extract_item('wimlib', silent=True) - - # Write files.txt - with open(r'{}\wim_files.txt'.format(global_vars['TmpDir']), 'w', - encoding='utf-8') as f: - # Defaults - for item in items: - f.write('{}\n'.format(item)) - sleep(1) # For safety? - - # Extract files - cmd = [ - global_vars['Tools']['wimlib-imagex'], - 'extract', - source, '1', - r'@{}\wim_files.txt'.format(global_vars['TmpDir']), - '--dest-dir={}\\'.format(dest), - '--no-acls', - '--nullglob'] - run_program(cmd) - - -def list_source_items(source_obj, rel_path=None): - """List items in a dir or WIM, returns list of SourceItem objects.""" - items = [] - rel_path = '{}{}'.format(os.sep, rel_path) if rel_path else '' - if source_obj.is_dir(): - source_path = '{}{}'.format(source_obj.path, rel_path) - items = [SourceItem(name=item.name, path=item.path) - for item in os.scandir(source_path)] - else: - # Prep wimlib-imagex - if psutil.WINDOWS: - extract_item('wimlib', silent=True) - cmd = [ - global_vars['Tools']['wimlib-imagex'], 'dir', - source_obj.path, '1'] - if rel_path: - cmd.append('--path={}'.format(rel_path)) - - # Get item list - try: - items = run_program(cmd) - except subprocess.CalledProcessError: - print_error('ERROR: Failed to get file list.') - raise - - # Strip non-root items - items = [fix_path_sep(i.strip()) - for i in items.stdout.decode('utf-8', 'ignore').splitlines()] - if rel_path: - items = [i.replace(rel_path, '') for i in items] - items = [i for i in items - if i.count(os.sep) == 1 and i.strip() != os.sep] - items = [SourceItem(name=i[1:], path=rel_path+i) for i in items] - - # Done - return items - - -def scan_source(source_obj, dest_path, rel_path='', interactive=True): - """Scan source for files/folders to transfer, returns list. - - This will scan the root and (recursively) any Windows.old folders.""" - selected_items = [] - win_olds = [] - - # Root Items - root_items = [] - item_list = list_source_items(source_obj, rel_path) - for item in item_list: - if REGEX_WINDOWS_OLD.search(item.name): - item.name = '{}{}{}'.format( - rel_path, - os.sep if rel_path else '', - item.name) - win_olds.append(item) - elif REGEX_INCL_ROOT_ITEMS.search(item.name): - print_success('Auto-Selected: {}'.format(item.path)) - root_items.append('{}'.format(item.path)) - elif not REGEX_EXCL_ROOT_ITEMS.search(item.name): - if not interactive: - print_success('Auto-Selected: {}'.format(item.path)) - root_items.append('{}'.format(item.path)) - else: - prompt = 'Transfer: "{}{}{}" ?'.format( - rel_path, - os.sep if rel_path else '', - item.name) - choices = ['Yes', 'No', 'All', 'Quit'] - answer = choice(prompt=prompt, choices=choices) - if answer == 'Quit': - abort() - elif answer == 'All': - interactive = False - if answer in ['Yes', 'All']: - root_items.append('{}'.format(item.path)) - if root_items: - selected_items.append({ - 'Message': '{}{}Root Items...'.format( - rel_path, - ' ' if rel_path else ''), - 'Items': root_items.copy(), - 'Destination': dest_path}) - - # Fonts - font_obj = get_source_item_obj(source_obj, rel_path, 'Windows/Fonts') - if font_obj: - selected_items.append({ - 'Message': '{}{}Fonts...'.format( - rel_path, - ' ' if rel_path else ''), - 'Items': [font_obj.path], - 'Destination': '{}{}Windows'.format( - dest_path, os.sep)}) - - # Registry - registry_items = [] - for folder in ['config', 'OEM']: - folder_obj = get_source_item_obj( - source_obj, rel_path, 'Windows/System32/{}'.format(folder)) - if folder_obj: - registry_items.append(folder_obj.path) - if registry_items: - selected_items.append({ - 'Message': '{}{}Registry...'.format( - rel_path, - ' ' if rel_path else ''), - 'Items': registry_items.copy(), - 'Destination': '{}{}Windows{}System32'.format( - dest_path, os.sep, os.sep)}) - - # Windows.old(s) - for old in win_olds: - selected_items.extend(scan_source( - source_obj, - '{}{}{}'.format(dest_path, os.sep, old.name), - rel_path=old.name, - interactive=False)) - - # Done - return selected_items - - -def get_source_item_obj(source_obj, rel_path, item_path): - """Check if the item exists, returns SourceItem object or None.""" - item_obj = None - item_path = fix_path_sep(item_path) - if source_obj.is_dir(): - item_obj = SourceItem( - name = item_path, - path = '{}{}{}{}{}'.format( - source_obj.path, - os.sep, - rel_path, - os.sep if rel_path else '', - item_path)) - if not os.path.exists(item_obj.path): - item_obj = None - else: - # Assuming WIM file - if psutil.WINDOWS: - extract_item('wimlib', silent=True) - cmd = [ - global_vars['Tools']['wimlib-imagex'], 'dir', - source_obj.path, '1', - '--path={}'.format(item_path), - '--one-file-only'] - try: - run_program(cmd) - except subprocess.CalledProcessError: - # function will return None below - pass - else: - item_obj = SourceItem( - name = item_path, - path = '{}{}{}{}'.format( - os.sep, - rel_path, - os.sep if rel_path else '', - item_path)) - return item_obj - - -def select_destination(folder_path, prompt='Select destination'): - """Select destination drive, returns path as string.""" - disk = select_volume(prompt) - if 'fixed' not in disk['Disk'].opts: - folder_path = folder_path.replace('\\', '-') - path = '{disk}{folder_path}_{Date}'.format( - disk = disk['Disk'].mountpoint, - folder_path = folder_path, - **global_vars) - - # Avoid merging with existing folder - path = non_clobber_rename(path) - os.makedirs(path, exist_ok=True) - - return path - - -def select_source(backup_prefix): - """Select matching backup from BACKUP_SERVERS, returns obj.""" - selected_source = None - local_sources = [] - remote_sources = [] - sources = [] - mount_backup_shares(read_write=False) - - # Check for prefix folders on servers - for server in BACKUP_SERVERS: - if server['Mounted']: - print_standard('Scanning {}...'.format(server['Name'])) - for d in os.scandir(r'\\{IP}\{Share}'.format(**server)): - if (d.is_dir() - and d.name.lower().startswith(backup_prefix.lower())): - # Add folder to remote_sources - remote_sources.append({ - 'Name': '{:9}| File-Based: [DIR] {}'.format( - server['Name'], d.name), - 'Server': server, - 'Sort': d.name, - 'Source': d}) - - # Check for images and subfolders - for prefix_path in remote_sources.copy(): - for item in os.scandir(prefix_path['Source'].path): - if item.is_dir(): - # Add folder to remote_sources - remote_sources.append({ - 'Name': r'{:9}| File-Based: [DIR] {}\{}'.format( - prefix_path['Server']['Name'], # Server - prefix_path['Source'].name, # Prefix folder - item.name, # Sub-folder - ), - 'Server': prefix_path['Server'], - 'Sort': r'{}\{}'.format( - prefix_path['Source'].name, # Prefix folder - item.name, # Sub-folder - ), - 'Source': item}) - - # Check for images in folder - for subitem in os.scandir(item.path): - if REGEX_WIM_FILE.search(item.name): - # Add image to remote_sources - try: - size = human_readable_size(item.stat().st_size) - except Exception: - size = ' ? ?' # unknown - remote_sources.append({ - 'Disabled': bool(not is_valid_wim_file(subitem)), - 'Name': r'{:9}| Image-Based: {:>7} {}\{}\{}'.format( - prefix_path['Server']['Name'], # Server - size, # Size (duh) - prefix_path['Source'].name, # Prefix folder - item.name, # Sub-folder - subitem.name, # Image file - ), - 'Server': prefix_path['Server'], - 'Sort': r'{}\{}\{}'.format( - prefix_path['Source'].name, # Prefix folder - item.name, # Sub-folder - subitem.name, # Image file - ), - 'Source': subitem}) - elif REGEX_WIM_FILE.search(item.name): - # Add image to remote_sources - try: - size = human_readable_size(item.stat().st_size) - except Exception: - size = ' ? ?' # unknown - remote_sources.append({ - 'Disabled': bool(not is_valid_wim_file(item)), - 'Name': r'{:9}| Image-Based: {:>7} {}\{}'.format( - prefix_path['Server']['Name'], # Server - size, # Size (duh) - prefix_path['Source'].name, # Prefix folder - item.name, # Image file - ), - 'Server': prefix_path['Server'], - 'Sort': r'{}\{}'.format( - prefix_path['Source'].name, # Prefix folder - item.name, # Image file - ), - 'Source': item}) - - # Check for local sources - print_standard('Scanning for local sources...') - set_thread_error_mode(silent=True) # Prevents "No disk" popups - sys_drive = global_vars['Env']['SYSTEMDRIVE'] - for d in psutil.disk_partitions(): - if re.search(r'^{}'.format(sys_drive), d.mountpoint, re.IGNORECASE): - # Skip current OS drive - continue - if 'fixed' in d.opts: - # Skip DVD, etc - local_sources.append({ - 'Name': '{:9}| File-Based: [DISK] {}'.format( - ' Local', d.mountpoint), - 'Sort': d.mountpoint, - 'Source': LocalDisk(d)}) - # Check for images and subfolders - for item in os.scandir(d.mountpoint): - if REGEX_WIM_FILE.search(item.name): - try: - size = human_readable_size(item.stat().st_size) - except Exception: - size = ' ? ?' # unknown - local_sources.append({ - 'Disabled': bool(not is_valid_wim_file(item)), - 'Name': r'{:9}| Image-Based: {:>7} {}{}'.format( - ' Local', size, d.mountpoint, item.name), - 'Sort': r'{}{}'.format(d.mountpoint, item.name), - 'Source': item}) - elif REGEX_EXCL_ROOT_ITEMS.search(item.name): - pass - elif REGEX_EXCL_ITEMS.search(item.name): - pass - elif item.is_dir(): - # Add folder to local_sources - local_sources.append({ - 'Name': r'{:9}| File-Based: [DIR] {}{}'.format( - ' Local', d.mountpoint, item.name), - 'Sort': r'{}{}'.format(d.mountpoint, item.name), - 'Source': item}) - - set_thread_error_mode(silent=False) # Return to normal - - # Build Menu - local_sources.sort(key=itemgetter('Sort')) - remote_sources.sort(key=itemgetter('Sort')) - sources.extend(local_sources) - sources.extend(remote_sources) - actions = [{'Name': 'Quit', 'Letter': 'Q'}] - - # Select backup from sources - if len(sources) > 0: - selection = menu_select( - 'Which backup are we using?', - main_entries=sources, - action_entries=actions, - disabled_label='DAMAGED') - if selection == 'Q': - umount_backup_shares() - exit_script() - else: - selected_source = sources[int(selection)-1]['Source'] - else: - print_error('ERROR: No backups found using prefix: {}.'.format( - backup_prefix)) - umount_backup_shares() - pause("Press Enter to exit...") - exit_script() - - # Sanity check - if selected_source.is_file(): - # Image-Based - if not REGEX_WIM_FILE.search(selected_source.name): - print_error('ERROR: Unsupported image: {}'.format( - selected_source.path)) - raise GenericError - - # Done - return selected_source - - -def select_volume(title='Select disk', auto_select=True): - """Select disk from attached disks. returns dict.""" - actions = [{'Name': 'Quit', 'Letter': 'Q'}] - disks = [] - - # Build list of disks - set_thread_error_mode(silent=True) # Prevents "No disk" popups - for d in psutil.disk_partitions(): - info = { - 'Disk': d, - 'Name': d.mountpoint} - try: - usage = psutil.disk_usage(d.device) - free = '{free} / {total} available'.format( - free = human_readable_size(usage.free, 2), - total = human_readable_size(usage.total, 2)) - except Exception: - # Meh, leaving unsupported destinations out - pass - # free = 'Unknown' - # info['Disabled'] = True - else: - info['Display Name'] = '{} ({})'.format(info['Name'], free) - disks.append(info) - set_thread_error_mode(silent=False) # Return to normal - - # Skip menu? - if len(disks) == 1 and auto_select: - return disks[0] - - # Show menu - selection = menu_select(title, main_entries=disks, action_entries=actions) - if selection == 'Q': - exit_script() - else: - return disks[int(selection)-1] - - -def set_thread_error_mode(silent=True): - """Disable or Enable Windows error message dialogs. - - Disable when scanning disks to avoid popups for empty cardreaders, etc - """ - # Code borrowed from: https://stackoverflow.com/a/29075319 - kernel32 = ctypes.WinDLL('kernel32') - - if silent: - kernel32.SetThreadErrorMode(SEM_FAIL, ctypes.byref(SEM_NORMAL)) - else: - kernel32.SetThreadErrorMode(SEM_NORMAL, ctypes.byref(SEM_NORMAL)) - - -def transfer_source(source_obj, dest_path, selected_items): - """Transfer, or extract, files/folders from source to destination.""" - if source_obj.is_dir(): - # Run FastCopy for each selection "group" - for group in selected_items: - try_and_print(message=group['Message'], - function=run_fast_copy, cs='Done', - items=group['Items'], - dest=group['Destination']) - else: - if REGEX_WIM_FILE.search(source_obj.name): - # Extract files from WIM - for group in selected_items: - try_and_print(message=group['Message'], - function=run_wimextract, cs='Done', - source=source_obj.path, - items=group['Items'], - dest=dest_path) - else: - print_error('ERROR: Unsupported image: {}'.format(source_obj.path)) - raise GenericError - - -def umount_backup_shares(): - """Unmount the backup shares regardless of current status.""" - for server in BACKUP_SERVERS: - umount_network_share(server) - - -def umount_network_share(server): - """Unmount a network share defined by server.""" - cmd = r'net use \\{IP}\{Share} /delete'.format(**server) - cmd = cmd.split(' ') - try: - run_program(cmd) - except Exception: - print_error(r'Failed to umount \\{Name}\{Share}.'.format(**server)) - sleep(1) - else: - print_info('Umounted {Name}'.format(**server)) - server['Mounted'] = False - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/disk.py b/scripts/wk.prev/functions/disk.py deleted file mode 100644 index 31fe577d..00000000 --- a/scripts/wk.prev/functions/disk.py +++ /dev/null @@ -1,414 +0,0 @@ -# Wizard Kit: Functions - Disk - -from functions.common import * -from settings.partition_uids import * - - -# Regex -REGEX_BAD_PARTITION = re.compile(r'(RAW|Unknown)', re.IGNORECASE) -REGEX_DISK_GPT = re.compile( - r'Disk ID: {[A-Z0-9]+-[A-Z0-9]+-[A-Z0-9]+-[A-Z0-9]+-[A-Z0-9]+}', - re.IGNORECASE) -REGEX_DISK_MBR = re.compile(r'Disk ID: [A-Z0-9]+', re.IGNORECASE) -REGEX_DISK_RAW = re.compile(r'Disk ID: 00000000', re.IGNORECASE) - - -def assign_volume_letters(): - """Assign a volume letter to all available volumes.""" - remove_volume_letters() - - # Write script - script = [] - for vol in get_volumes(): - script.append('select volume {}'.format(vol['Number'])) - script.append('assign') - - # Run - run_diskpart(script) - - -def get_boot_mode(): - """Check if the boot mode was UEFI or legacy.""" - boot_mode = 'Legacy' - try: - reg_key = winreg.OpenKey( - winreg.HKEY_LOCAL_MACHINE, r'System\CurrentControlSet\Control') - reg_value = winreg.QueryValueEx(reg_key, 'PEFirmwareType')[0] - if reg_value == 2: - boot_mode = 'UEFI' - except: - boot_mode = 'Unknown' - - return boot_mode - - -def get_disk_details(disk): - """Get disk details using DiskPart.""" - details = {} - script = [ - 'select disk {}'.format(disk['Number']), - 'detail disk'] - - # Run - try: - result = run_diskpart(script) - except subprocess.CalledProcessError: - pass - else: - output = result.stdout.decode().strip() - # Remove empty lines - tmp = [s.strip() for s in output.splitlines() if s.strip() != ''] - # Set disk name - details['Name'] = tmp[4] - # Split each line on ':' skipping those without ':' - tmp = [s.split(':') for s in tmp if ':' in s] - # Add key/value pairs to the details variable and return dict - details.update({key.strip(): value.strip() for (key, value) in tmp}) - - return details - - -def get_disks(): - """Get list of attached disks using DiskPart.""" - disks = [] - - try: - # Run script - result = run_diskpart(['list disk']) - except subprocess.CalledProcessError: - pass - else: - # Append disk numbers - output = result.stdout.decode().strip() - for tmp in re.findall(r'Disk (\d+)\s+\w+\s+(\d+\s+\w+)', output): - num = tmp[0] - size = human_readable_size(tmp[1]) - disks.append({'Number': num, 'Size': size}) - - return disks - - -def get_partition_details(disk, partition): - """Get partition details using DiskPart and fsutil.""" - details = {} - script = [ - 'select disk {}'.format(disk['Number']), - 'select partition {}'.format(partition['Number']), - 'detail partition'] - - # Diskpart details - try: - # Run script - result = run_diskpart(script) - except subprocess.CalledProcessError: - pass - else: - # Get volume letter or RAW status - output = result.stdout.decode().strip() - tmp = re.search(r'Volume\s+\d+\s+(\w|RAW)\s+', output) - if tmp: - if tmp.group(1).upper() == 'RAW': - details['FileSystem'] = RAW - else: - details['Letter'] = tmp.group(1) - # Remove empty lines from output - tmp = [s.strip() for s in output.splitlines() if s.strip() != ''] - # Split each line on ':' skipping those without ':' - tmp = [s.split(':') for s in tmp if ':' in s] - # Add key/value pairs to the details variable and return dict - details.update({key.strip(): value.strip() for (key, value) in tmp}) - - # Get MBR type / GPT GUID for extra details on "Unknown" partitions - guid = PARTITION_UIDS.get(details.get('Type').upper(), {}) - if guid: - details.update({ - 'Description': guid.get('Description', '')[:29], - 'OS': guid.get('OS', 'Unknown')[:27]}) - - if 'Letter' in details: - # Disk usage - try: - tmp = psutil.disk_usage('{}:\\'.format(details['Letter'])) - except OSError as err: - details['FileSystem'] = 'Unknown' - details['Error'] = err.strerror - else: - details['Used Space'] = human_readable_size(tmp.used) - - # fsutil details - cmd = [ - 'fsutil', - 'fsinfo', - 'volumeinfo', - '{}:'.format(details['Letter']) - ] - try: - result = run_program(cmd) - except subprocess.CalledProcessError: - pass - else: - output = result.stdout.decode().strip() - # Remove empty lines from output - tmp = [s.strip() for s in output.splitlines() if s.strip() != ''] - # Add "Feature" lines - details['File System Features'] = [s.strip() for s in tmp - if ':' not in s] - # Split each line on ':' skipping those without ':' - tmp = [s.split(':') for s in tmp if ':' in s] - # Add key/value pairs to the details variable and return dict - details.update({key.strip(): value.strip() for (key, value) in tmp}) - - # Set Volume Name - details['Name'] = details.get('Volume Name', '') - - # Set FileSystem Type - if details.get('FileSystem', '') not in ['RAW', 'Unknown']: - details['FileSystem'] = details.get('File System Name', 'Unknown') - - return details - - -def get_partitions(disk): - """Get list of partition using DiskPart.""" - partitions = [] - script = [ - 'select disk {}'.format(disk['Number']), - 'list partition'] - - try: - # Run script - result = run_diskpart(script) - except subprocess.CalledProcessError: - pass - else: - # Append partition numbers - output = result.stdout.decode().strip() - regex = r'Partition\s+(\d+)\s+\w+\s+(\d+\s+\w+)\s+' - for tmp in re.findall(regex, output, re.IGNORECASE): - num = tmp[0] - size = human_readable_size(tmp[1]) - partitions.append({'Number': num, 'Size': size}) - - return partitions - - -def get_table_type(disk): - """Get disk partition table type using DiskPart.""" - part_type = 'Unknown' - script = [ - 'select disk {}'.format(disk['Number']), - 'uniqueid disk'] - - try: - result = run_diskpart(script) - except subprocess.CalledProcessError: - pass - else: - output = result.stdout.decode().strip() - if REGEX_DISK_GPT.search(output): - part_type = 'GPT' - elif REGEX_DISK_MBR.search(output): - part_type = 'MBR' - elif REGEX_DISK_RAW.search(output): - part_type = 'RAW' - - return part_type - - -def get_volumes(): - """Get list of volumes using DiskPart.""" - vols = [] - try: - result = run_diskpart(['list volume']) - except subprocess.CalledProcessError: - pass - else: - # Append volume numbers - output = result.stdout.decode().strip() - for tmp in re.findall(r'Volume (\d+)\s+([A-Za-z]?)\s+', output): - vols.append({'Number': tmp[0], 'Letter': tmp[1]}) - - return vols - - -def is_bad_partition(par): - """Check if the partition is accessible.""" - return 'Letter' not in par or REGEX_BAD_PARTITION.search(par['FileSystem']) - - -def prep_disk_for_formatting(disk=None): - """Gather details about the disk and its partitions.""" - disk['Format Warnings'] = '\n' - width = len(str(len(disk['Partitions']))) - - # Bail early - if disk is None: - raise Exception('Disk not provided.') - - # Set boot method and partition table type - disk['Use GPT'] = True - if (get_boot_mode() == 'UEFI'): - if (not ask("Setup Windows to use UEFI booting?")): - disk['Use GPT'] = False - else: - if (ask("Setup Windows to use BIOS/Legacy booting?")): - disk['Use GPT'] = False - - # Set Display and Warning Strings - if len(disk['Partitions']) == 0: - disk['Format Warnings'] += 'No partitions found\n' - for partition in disk['Partitions']: - display = '{size} {fs}'.format( - num = partition['Number'], - width = width, - size = partition['Size'], - fs = partition['FileSystem']) - - if is_bad_partition(partition): - # Set display string using partition description & OS type - display += '\t\t{q}{name}{q}\t{desc} ({os})'.format( - display = display, - q = '"' if partition['Name'] != '' else '', - name = partition['Name'], - desc = partition['Description'], - os = partition['OS']) - else: - # List space used instead of partition description & OS type - display += ' (Used: {used})\t{q}{name}{q}'.format( - used = partition['Used Space'], - q = '"' if partition['Name'] != '' else '', - name = partition['Name']) - # For all partitions - partition['Display String'] = display - - -def reassign_volume_letter(letter, new_letter='I'): - """Assign a new letter to a volume using DiskPart.""" - if not letter: - # Ignore - return None - script = [ - 'select volume {}'.format(letter), - 'remove noerr', - 'assign letter={}'.format(new_letter)] - try: - run_diskpart(script) - except subprocess.CalledProcessError: - pass - else: - return new_letter - - -def remove_volume_letters(keep=None): - """Remove all assigned volume letters using DiskPart.""" - if not keep: - keep = '' - - script = [] - for vol in get_volumes(): - if vol['Letter'].upper() != keep.upper(): - script.append('select volume {}'.format(vol['Number'])) - script.append('remove noerr') - - # Run script - try: - run_diskpart(script) - except subprocess.CalledProcessError: - pass - - -def run_diskpart(script): - """Run DiskPart script.""" - tempfile = r'{}\diskpart.script'.format(global_vars['Env']['TMP']) - - # Write script - with open(tempfile, 'w') as f: - for line in script: - f.write('{}\n'.format(line)) - - # Run script - cmd = [ - r'{}\Windows\System32\diskpart.exe'.format( - global_vars['Env']['SYSTEMDRIVE']), - '/s', tempfile] - result = run_program(cmd) - sleep(2) - return result - - -def scan_disks(): - """Get details about the attached disks""" - disks = get_disks() - - # Get disk details - for disk in disks: - # Get partition style - disk['Table'] = get_table_type(disk) - - # Get disk name/model and physical details - disk.update(get_disk_details(disk)) - - # Get partition info for disk - disk['Partitions'] = get_partitions(disk) - - for partition in disk['Partitions']: - # Get partition details - partition.update(get_partition_details(disk, partition)) - - # Done - return disks - - -def select_disk(title='Which disk?', disks=[]): - """Select a disk from the attached disks""" - # Build menu - disk_options = [] - for disk in disks: - display_name = '{}\t[{}] ({}) {}'.format( - disk.get('Size', ''), - disk.get('Table', ''), - disk.get('Type', ''), - disk.get('Name', 'Unknown'), - ) - pwidth=len(str(len(disk['Partitions']))) - for partition in disk['Partitions']: - # Main text - p_name = 'Partition {num:>{width}}: {size} ({fs})'.format( - num = partition['Number'], - width = pwidth, - size = partition['Size'], - fs = partition['FileSystem']) - if partition['Name']: - p_name += '\t"{}"'.format(partition['Name']) - - # Show unsupported partition(s) - if is_bad_partition(partition): - p_name = '{YELLOW}{p_name}{CLEAR}'.format( - p_name=p_name, **COLORS) - - display_name += '\n\t\t\t{}'.format(p_name) - if not disk['Partitions']: - display_name += '\n\t\t\t{}No partitions found.{}'.format( - COLORS['YELLOW'], COLORS['CLEAR']) - - disk_options.append({'Name': display_name, 'Disk': disk}) - actions = [ - {'Name': 'Main Menu', 'Letter': 'M'}, - ] - - # Menu loop - selection = menu_select( - title = title, - main_entries = disk_options, - action_entries = actions) - - if (selection.isnumeric()): - return disk_options[int(selection)-1]['Disk'] - elif (selection == 'M'): - raise GenericAbort - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/hw_diags.py b/scripts/wk.prev/functions/hw_diags.py deleted file mode 100644 index fe390e12..00000000 --- a/scripts/wk.prev/functions/hw_diags.py +++ /dev/null @@ -1,1835 +0,0 @@ -# Wizard Kit: Functions - HW Diagnostics - -import re -import time - -from collections import OrderedDict -from functions.json import * -from functions.sensors import * -from functions.threading import * -from functions.tmux import * -from settings.hw_diags import * -if DEBUG_MODE: - from debug.hw_diags import * - - -# Fix settings -OVERRIDES_FORCED = OVERRIDES_FORCED and not OVERRIDES_LIMITED -QUICK_LABEL = QUICK_LABEL.format(**COLORS) -TOP_PANE_TEXT = TOP_PANE_TEXT.format(**COLORS) - - -# Regex -REGEX_ERROR_STATUS = re.compile('|'.join(STATUSES['RED'])) - - -# Error Classes -class DeviceTooSmallError(Exception): - pass - - -# Classes -class CpuObj(): - """Object for tracking CPU specific data.""" - def __init__(self): - self.lscpu = {} - self.tests = OrderedDict() - self.get_details() - self.name = self.lscpu.get('Model name', 'Unknown CPU') - self.description = self.name - - def get_details(self): - """Get CPU details from lscpu.""" - cmd = ['lscpu', '--json'] - json_data = get_json_from_command(cmd) - for line in json_data.get('lscpu', [{}]): - _field = line.get('field', '').replace(':', '') - _data = line.get('data', '') - if not _field and not _data: - # Skip - print_warning(_field, _data) - pause() - continue - self.lscpu[_field] = _data - - # Get RAM details as well - ram_details = get_ram_details() - self.ram_total = human_readable_size(ram_details.pop('Total', 0)).strip() - self.ram_dimms = [ - '{}x {}'.format(v, k) for k, v in sorted(ram_details.items())] - - def generate_cpu_report(self): - """Generate CPU report with data from all tests.""" - report = [] - report.append('{BLUE}Device{CLEAR}'.format(**COLORS)) - report.append(' {}'.format(self.name)) - - # Include RAM details - report.append('{BLUE}RAM{CLEAR}'.format(**COLORS)) - report.append(' {} ({})'.format(self.ram_total, ', '.join(self.ram_dimms))) - - # Tests - for test in self.tests.values(): - report.extend(test.report) - - return report - - -class DiskObj(): - """Object for tracking disk specific data.""" - def __init__(self, disk_path): - self.attr_type = 'UNKNOWN' - self.disk_ok = True - self.labels = [] - self.lsblk = {} - self.name = re.sub(r'^.*/(.*)', r'\1', disk_path) - self.nvme_attributes = {} - self.nvme_smart_notes = {} - self.override_disabled = False - self.path = disk_path - self.smart_attributes = {} - self.smart_self_test = {} - self.smartctl = {} - self.tests = OrderedDict() - self.get_details() - self.get_size() - - # Try enabling SMART - run_program( - cmd=[ - 'sudo', - 'smartctl', - '--tolerance=permissive', - '--smart=on', - self.path, - ], - check=False) - - # Get NVMe/SMART data and set description - self.get_smart_details() - self.description = '{size} ({tran}) {model} {serial}'.format( - **self.lsblk) - - def add_nvme_smart_note(self, note): - """Add note that will be included in the NVMe / SMART report.""" - # A dict is used to avoid duplicate notes - self.nvme_smart_notes[note] = None - - def calc_io_dd_values(self): - """Calcualte I/O benchmark dd values. - - Calculations - The minimum dev size is 'Graph Horizontal Width' * 'Chunk Size' - (e.g. 1.25 GB for a width of 40 and a chunk size of 32MB) - If the device is smaller than the minimum dd_chunks would be set - to zero which would cause a divide by zero error. - If the device is below the minimum size an Exception will be raised - - dd_size is the area to be read in bytes - If the dev is < 10Gb then it's the whole dev - Otherwise it's the larger of 10Gb or 1% of the dev - - dd_chunks is the number of groups of "Chunk Size" in self.dd_size - This number is reduced to a multiple of the graph width in - order to allow for the data to be condensed cleanly - - dd_chunk_blocks is the chunk size in number of blocks - (e.g. 64 if block size is 512KB and chunk size is 32MB - - dd_skip_blocks is the number of "Block Size" groups not tested - dd_skip_count is the number of blocks to skip per self.dd_chunk - dd_skip_extra is how often to add an additional skip block - This is needed to ensure an even testing across the dev - This is calculated by using the fractional amount left off - of the dd_skip_count variable - """ - self.dd_size = min(IO_VARS['Minimum Test Size'], self.size_bytes) - self.dd_size = max( - self.dd_size, - self.size_bytes * IO_VARS['Alt Test Size Factor']) - self.dd_chunks = int(self.dd_size // IO_VARS['Chunk Size']) - self.dd_chunks -= self.dd_chunks % IO_VARS['Graph Horizontal Width'] - if self.dd_chunks < IO_VARS['Graph Horizontal Width']: - raise DeviceTooSmallError - self.dd_chunk_blocks = int(IO_VARS['Chunk Size'] / IO_VARS['Block Size']) - self.dd_size = self.dd_chunks * IO_VARS['Chunk Size'] - self.dd_skip_blocks = int( - (self.size_bytes - self.dd_size) // IO_VARS['Block Size']) - self.dd_skip_count = int((self.dd_skip_blocks / self.dd_chunks) // 1) - self.dd_skip_extra = 0 - try: - self.dd_skip_extra = 1 + int( - 1 / ((self.dd_skip_blocks / self.dd_chunks) % 1)) - except ZeroDivisionError: - # self.dd_skip_extra == 0 is fine - pass - - def check_attributes(self): - """Check NVMe / SMART attributes for errors, returns bool.""" - attr_type = self.attr_type - disk_ok = True - - # Get updated attributes - self.get_smart_details() - - # Check attributes - if self.nvme_attributes: - self.add_nvme_smart_note( - ' {YELLOW}NVMe disk support is still experimental{CLEAR}'.format( - **COLORS)) - items = self.nvme_attributes.items() - elif self.smart_attributes: - items = self.smart_attributes.items() - for k, v in items: - if k in ATTRIBUTES[attr_type]: - if not ATTRIBUTES[attr_type][k]['Error']: - # Informational attribute, skip - continue - if ATTRIBUTES[attr_type][k]['Ignore']: - # Attribute is non-failing, skip - continue - if v['raw'] >= ATTRIBUTES[attr_type][k]['Error']: - if (ATTRIBUTES[attr_type][k]['Maximum'] - and v['raw'] >= ATTRIBUTES[attr_type][k]['Maximum']): - # Non-standard value, skip - continue - else: - disk_ok = False - - # Disable override if necessary - if ATTRIBUTES[attr_type][k].get('Critical', False): - self.override_disabled = True - - # SMART overall assessment - ## NOTE: Only fail drives if the overall value exists and reports failed - if not self.smartctl.get('smart_status', {}).get('passed', True): - disk_ok = False - self.override_disabled = True - self.add_nvme_smart_note( - ' {RED}SMART overall self-assessment: Failed{CLEAR}'.format(**COLORS)) - - # Done - return disk_ok - - def check_smart_self_test(self, silent=False): - """Check if a SMART self-test is currently running, returns bool.""" - msg = 'SMART self-test in progress' - test_running = 'remaining_percent' in self.smart_self_test.get('status', '') - - if test_running: - # Ask to abort - if not silent: - print_warning('WARNING: {}'.format(msg)) - print_standard(' ') - if ask('Abort HW Diagnostics?'): - raise GenericAbort('Bail') - - # Add warning note - self.add_nvme_smart_note( - ' {YELLOW}WARNING: {msg}{CLEAR}'.format(msg=msg, **COLORS)) - - # Done - return test_running - - def disable_test(self, name, status, test_failed=False): - """Disable test by name and update status.""" - if name in self.tests: - self.tests[name].update_status(status) - self.tests[name].disabled = True - self.tests[name].failed = test_failed - - def generate_attribute_report( - self, description=False, timestamp=False): - """Generate NVMe / SMART report, returns list.""" - attr_type = self.attr_type - report = [] - if description: - report.append('{BLUE}Device ({name}){CLEAR}'.format( - name=self.name, **COLORS)) - report.append(' {}'.format(self.description)) - - # Skip attributes if they don't exist - if not (self.nvme_attributes or self.smart_attributes): - report.append( - ' {YELLOW}No NVMe or SMART data available{CLEAR}'.format( - **COLORS)) - return report - - # Attributes - report.append('{BLUE}{a} Attributes{YELLOW}{u:>23} {t}{CLEAR}'.format( - a=attr_type, - u='Updated:' if timestamp else '', - t=time.strftime('%Y-%m-%d %H:%M %Z') if timestamp else '', - **COLORS)) - if self.nvme_attributes: - attr_type = 'NVMe' - items = self.nvme_attributes.items() - elif self.smart_attributes: - attr_type = 'SMART' - items = self.smart_attributes.items() - for k, v in items: - if k in ATTRIBUTES[attr_type]: - _note = '' - _color = COLORS['GREEN'] - - # Attribute ID & Name - if attr_type == 'NVMe': - _line = ' {:38}'.format(k.replace('_', ' ').title()) - else: - _line = ' {i:>3} / {h}: {n:28}'.format( - i=k, - h=ATTRIBUTES[attr_type][k]['Hex'], - n=v['name'][:28]) - - # Set color - for _t, _c in ATTRIBUTE_COLORS: - if ATTRIBUTES[attr_type][k][_t]: - if v['raw'] >= ATTRIBUTES[attr_type][k][_t]: - _color = COLORS[_c] - if _t == 'Maximum': - _note = '(invalid?)' - - # 199/C7 warning - if str(k) == '199' and v['raw'] > 0: - _note = '(bad cable?)' - - # Attribute value - _line += '{c}{v} {YELLOW}{n}{CLEAR}'.format( - c=_color, - v=v['raw_str'], - n=_note, - **COLORS) - - # Add line to report - report.append(_line) - - # Done - return report - - def generate_disk_report(self): - """Generate disk report with data from all tests.""" - report = [] - - # Attributes - report.extend(self.generate_attribute_report(description=True)) - - # Notes - if self.nvme_smart_notes: - report.append('{BLUE}{attr_type} Notes{CLEAR}'.format( - attr_type=self.attr_type, **COLORS)) - report.extend(sorted(self.nvme_smart_notes.keys())) - - # 4K alignment check - if not self.is_4k_aligned(): - report.append('{YELLOW}Warning{CLEAR}'.format(**COLORS)) - report.append(' One or more partitions are not 4K aligned') - - # Tests - for test in self.tests.values(): - report.extend(test.report) - - return report - - def get_details(self): - """Get data from lsblk.""" - cmd = ['lsblk', '--json', '--output-all', '--paths', self.path] - json_data = get_json_from_command(cmd) - self.lsblk = json_data.get('blockdevices', [{}])[0] - - # Set necessary details - self.lsblk['model'] = self.lsblk.get('model', 'Unknown Model') - self.lsblk['name'] = self.lsblk.get('name', self.path) - self.lsblk['phy-sec'] = self.lsblk.get('phy-sec', -1) - self.lsblk['rota'] = self.lsblk.get('rota', True) - self.lsblk['serial'] = self.lsblk.get('serial', 'Unknown Serial') - self.lsblk['size'] = self.lsblk.get('size', '???b') - self.lsblk['tran'] = self.lsblk.get('tran', '???') - - # Ensure certain attributes types - for attr in ['model', 'name', 'rota', 'serial', 'size', 'tran']: - if not isinstance(self.lsblk[attr], str): - self.lsblk[attr] = str(self.lsblk[attr]) - for attr in ['phy-sec']: - if not isinstance(self.lsblk[attr], int): - self.lsblk[attr] = int(self.lsblk[attr]) - self.lsblk['tran'] = self.lsblk['tran'].upper().replace('NVME', 'NVMe') - - # Build list of labels - for disk in [self.lsblk, *self.lsblk.get('children', [])]: - self.labels.append(disk.get('label', '')) - self.labels.append(disk.get('partlabel', '')) - self.labels = [str(label) for label in self.labels if label] - - def get_size(self): - """Get real disk size.""" - cmd = ['lsblk', - '--bytes', '--nodeps', '--noheadings', - '--output', 'size', self.path] - try: - result = run_program(cmd) - self.size_bytes = int(result.stdout.decode().strip()) - except Exception: - # Setting to impossible value for now - self.size_bytes = -1 - - def get_smart_details(self): - """Get data from smartctl.""" - cmd = [ - 'sudo', - 'smartctl', - '--tolerance=verypermissive', - '--all', - '--json', - self.path, - ] - self.smartctl = get_json_from_command(cmd, check=False) - - # Check for attributes - if KEY_NVME in self.smartctl: - self.attr_type = 'NVMe' - self.nvme_attributes = {} - for k, v in self.smartctl[KEY_NVME].items(): - try: - self.nvme_attributes[k] = { - 'name': k, - 'raw': int(v), - 'raw_str': str(v), - } - except Exception: - # TODO: Limit this check - pass - elif KEY_SMART in self.smartctl: - self.attr_type = 'SMART' - for a in self.smartctl[KEY_SMART].get('table', {}): - try: - _id = int(a.get('id', -1)) - except ValueError: - # Ignoring invalid attribute - continue - _name = str(a.get('name', 'UNKNOWN')).replace('_', ' ').title() - _raw = int(a.get('raw', {}).get('value', -1)) - _raw_str = a.get('raw', {}).get('string', 'UNKNOWN') - - # Fix power-on time - _r = re.match(r'^(\d+)[Hh].*', _raw_str) - if _id == 9 and _r: - _raw = int(_r.group(1)) - - # Add to dict - self.smart_attributes[_id] = { - 'name': _name, 'raw': _raw, 'raw_str': _raw_str} - - # Self-test data - self.smart_self_test = {} - for k in ['polling_minutes', 'status']: - self.smart_self_test[k] = self.smartctl.get( - 'ata_smart_data', {}).get( - 'self_test', {}).get( - k, {}) - - def is_4k_aligned(self): - """Check if partitions are 4K aligned, returns bool.""" - cmd = [ - 'sudo', - 'sfdisk', - '--json', - self.path, - ] - aligned = True - - # Get partition details - json_data = get_json_from_command(cmd) - - # Check partitions - for part in json_data.get('partitiontable', {}).get('partitions', []): - aligned = aligned and part.get('start', -1) % 4096 == 0 - - # Done - return aligned - - def safety_check(self, silent=False): - """Run safety checks and disable tests if necessary.""" - test_running = False - if self.nvme_attributes or self.smart_attributes: - disk_ok = self.check_attributes() - test_running = self.check_smart_self_test(silent) - - # Show errors (unless a SMART self-test is running) - if not (silent or test_running): - if disk_ok: - # 199/C7 warning - if self.smart_attributes.get(199, {}).get('raw', 0) > 0: - print_warning('199/C7 error detected') - print_standard(' (Have you tried swapping the disk cable?)') - else: - # Override? - show_report( - self.generate_attribute_report(description=True), - log_report=True) - print_warning(' {} error(s) detected.'.format(self.attr_type)) - if self.override_disabled: - print_standard('Tests disabled for this device') - pause() - elif not (len(self.tests) == 3 and OVERRIDES_LIMITED): - if OVERRIDES_FORCED or ask('Run tests on this device anyway?'): - disk_ok = True - if 'NVMe / SMART' in self.tests: - self.disable_test('NVMe / SMART', 'OVERRIDE') - if not self.nvme_attributes and self.smart_attributes: - # Re-enable for SMART short-tests - self.tests['NVMe / SMART'].disabled = False - print_standard(' ') - else: - # No NVMe/SMART details - self.disable_test('NVMe / SMART', 'N/A') - if silent: - disk_ok = OVERRIDES_FORCED - else: - show_report( - self.generate_attribute_report(description=True), - log_report=True) - disk_ok = OVERRIDES_FORCED or ask('Run tests on this device anyway?') - print_standard(' ') - - # Disable tests if necessary (statuses won't be overwritten) - if test_running: - if not silent: - # silent is only True in quick_mode - self.disable_test('NVMe / SMART', 'Denied') - for t in ['badblocks', 'I/O Benchmark']: - self.disable_test(t, 'Denied') - elif not disk_ok: - self.disable_test('NVMe / SMART', 'NS', test_failed=True) - for t in ['badblocks', 'I/O Benchmark']: - self.disable_test(t, 'Denied') - - -class State(): - """Object to track device objects and overall state.""" - def __init__(self): - self.args = None - self.cpu = None - self.disks = [] - self.panes = {} - self.quick_mode = False - self.tests = OrderedDict({ - 'Prime95': { - 'Enabled': False, - 'Function': run_mprime_test, - 'Objects': [], - }, - 'NVMe / SMART': { - 'Enabled': False, - 'Function': run_nvme_smart_tests, - 'Objects': [], - }, - 'badblocks': { - 'Enabled': False, - 'Function': run_badblocks_test, - 'Objects': [], - }, - 'I/O Benchmark': { - 'Enabled': False, - 'Function': run_io_benchmark, - 'Objects': [], - }, - }) - - def build_outer_panes(self): - """Build top and side panes.""" - clear_screen() - - # Top - self.panes['Top'] = tmux_split_window( - behind=True, lines=2, vertical=True, - text=TOP_PANE_TEXT) - - # Started - self.panes['Started'] = tmux_split_window( - lines=SIDE_PANE_WIDTH, target_pane=self.panes['Top'], - text='{BLUE}Started{CLEAR}\n{s}'.format( - s=time.strftime("%Y-%m-%d %H:%M %Z"), - **COLORS)) - - # Progress - self.panes['Progress'] = tmux_split_window( - lines=SIDE_PANE_WIDTH, - watch=self.progress_out) - - def fix_tmux_panes(self): - """Fix pane sizes if the window has been resized.""" - needs_fixed = False - - # Bail? - if not self.panes: - return - - # Check layout - for k, v in self.tmux_layout.items(): - if not v.get('Check'): - # Not concerned with the size of this pane - continue - # Get target - target = None - if k != 'Current': - if k not in self.panes: - # Skip missing panes - continue - else: - target = self.panes[k] - - # Check pane size - x, y = tmux_get_pane_size(pane_id=target) - if v.get('x', False) and v['x'] != x: - needs_fixed = True - if v.get('y', False) and v['y'] != y: - needs_fixed = True - - # Bail? - if not needs_fixed: - return - - # Update layout - for k, v in self.tmux_layout.items(): - # Get target - target = None - if k != 'Current': - if k not in self.panes: - # Skip missing panes - continue - else: - target = self.panes[k] - - # Resize pane - tmux_resize_pane(pane_id=target, **v) - - def fix_tmux_panes_loop(self): - while True: - try: - self.fix_tmux_panes() - sleep(1) - except RuntimeError: - # Assuming layout definitions changes mid-run, ignoring - pass - - def init(self): - """Remove test objects, set log, and add devices.""" - self.disks = [] - for k, v in self.tests.items(): - v['Objects'] = [] - - # Update LogDir - if self.quick_mode: - global_vars['LogDir'] = '{}/Logs/{}'.format( - global_vars['Env']['HOME'], - time.strftime('%Y-%m-%d_%H%M_%z')) - else: - global_vars['LogDir'] = '{}/Logs/{}_{}'.format( - global_vars['Env']['HOME'], - get_ticket_number(), - time.strftime('%Y-%m-%d_%H%M_%z')) - os.makedirs(global_vars['LogDir'], exist_ok=True) - global_vars['LogFile'] = '{}/Hardware Diagnostics.log'.format( - global_vars['LogDir']) - self.progress_out = '{}/progress.out'.format(global_vars['LogDir']) - - # Add CPU - self.cpu = CpuObj() - - # Add block devices - cmd = ['lsblk', '--json', '--nodeps', '--paths'] - json_data = get_json_from_command(cmd) - for disk in json_data.get('blockdevices', []): - skip_disk = False - disk_obj = DiskObj(disk['name']) - - # Skip loopback devices, optical devices, etc - if disk_obj.lsblk['type'] != 'disk': - skip_disk = True - - # Skip WK disks - wk_label_regex = r'{}_(LINUX|UFD)'.format(KIT_NAME_SHORT) - for label in disk_obj.labels: - if re.search(wk_label_regex, label, re.IGNORECASE): - skip_disk = True - - # Add disk - if not skip_disk: - self.disks.append(disk_obj) - - # Start tmux thread - self.tmux_layout = TMUX_LAYOUT.copy() - start_thread(self.fix_tmux_panes_loop) - - def set_top_pane_text(self, text): - """Set top pane text using TOP_PANE_TEXT and provided text.""" - tmux_update_pane( - self.panes['Top'], - text='{}\n{}'.format(TOP_PANE_TEXT, text)) - - -class TestObj(): - """Object to track test data.""" - def __init__(self, dev, label=None, info_label=False): - self.aborted = False - self.dev = dev - self.label = label - self.info_label = info_label - self.disabled = False - self.failed = False - self.passed = False - self.report = [] - self.started = False - self.status = '' - self.update_status() - - def update_status(self, new_status=None): - """Update status strings.""" - if self.disabled or REGEX_ERROR_STATUS.search(self.status): - # Don't update error statuses if test is enabled - return - if new_status: - self.status = build_status_string( - self.label, new_status, self.info_label) - elif not self.status: - self.status = build_status_string( - self.label, 'Pending', self.info_label) - elif self.started and 'Pending' in self.status: - self.status = build_status_string( - self.label, 'Working', self.info_label) - - -# Functions -def build_status_string(label, status, info_label=False): - """Build status string with appropriate colors.""" - status_color = COLORS['CLEAR'] - for k, v in STATUSES.items(): - if status in v: - status_color = COLORS[k] - - return '{l_c}{l}{CLEAR}{s_c}{s:>{s_w}}{CLEAR}'.format( - l_c=COLORS['BLUE'] if info_label else '', - l=label, - s_c=status_color, - s=status, - s_w=SIDE_PANE_WIDTH-len(label), - **COLORS) - - -def generate_horizontal_graph(rates, oneline=False): - """Generate horizontal graph from rates, returns list.""" - graph = ['', '', '', ''] - for r in rates: - step = get_graph_step(r, scale=32) - if oneline: - step = get_graph_step(r, scale=8) - - # Set color - r_color = COLORS['CLEAR'] - if r < IO_VARS['Threshold Graph Fail']: - r_color = COLORS['RED'] - elif r < IO_VARS['Threshold Graph Warn']: - r_color = COLORS['YELLOW'] - elif r > IO_VARS['Threshold Graph Great']: - r_color = COLORS['GREEN'] - - # Build graph - full_block = '{}{}'.format(r_color, IO_VARS['Graph Horizontal'][-1]) - if step >= 24: - graph[0] += '{}{}'.format(r_color, IO_VARS['Graph Horizontal'][step-24]) - graph[1] += full_block - graph[2] += full_block - graph[3] += full_block - elif step >= 16: - graph[0] += ' ' - graph[1] += '{}{}'.format(r_color, IO_VARS['Graph Horizontal'][step-16]) - graph[2] += full_block - graph[3] += full_block - elif step >= 8: - graph[0] += ' ' - graph[1] += ' ' - graph[2] += '{}{}'.format(r_color, IO_VARS['Graph Horizontal'][step-8]) - graph[3] += full_block - else: - graph[0] += ' ' - graph[1] += ' ' - graph[2] += ' ' - graph[3] += '{}{}'.format(r_color, IO_VARS['Graph Horizontal'][step]) - graph = [line+COLORS['CLEAR'] for line in graph] - if oneline: - return graph[:-1] - else: - return graph - - -def get_graph_step(rate, scale=16): - """Get graph step based on rate and scale, returns int.""" - m_rate = rate / (1024**2) - step = 0 - scale_name = 'Scale {}'.format(scale) - for x in range(scale-1, -1, -1): - # Iterate over scale backwards - if m_rate >= IO_VARS[scale_name][x]: - step = x - break - return step - - -def get_ram_details(): - """Get RAM details via dmidecode, returns dict.""" - cmd = ['sudo', 'dmidecode', '--type', 'memory'] - manufacturer = 'UNKNOWN' - ram_details = {'Total': 0} - size = 0 - - # Get DMI data - result = run_program(cmd, encoding='utf-8', errors='ignore') - dmi_data = result.stdout.splitlines() - - # Parse data - for line in dmi_data: - line = line.strip() - if line == 'Memory Device': - # Reset vars - manufacturer = 'UNKNOWN' - size = 0 - elif line.startswith('Size:'): - size = convert_to_bytes(line.replace('Size: ', '')) - elif line.startswith('Manufacturer:'): - manufacturer = line.replace('Manufacturer: ', '') - if size > 0: - # Add RAM to list if slot populated - ram_str = '{} {}'.format( - human_readable_size(size).strip(), - manufacturer, - ) - ram_details['Total'] += size - if ram_str in ram_details: - ram_details[ram_str] += 1 - else: - ram_details[ram_str] = 1 - - # Done - return ram_details - - -def get_read_rate(s): - """Get read rate in bytes/s from dd progress output.""" - real_rate = None - if re.search(r'[KMGT]B/s', s): - human_rate = re.sub(r'^.*\s+(\d+\.?\d*)\s+(.B)/s\s*$', r'\1 \2', s) - real_rate = convert_to_bytes(human_rate) - return real_rate - - -def menu_diags(state, args): - """Main menu to select and run HW tests.""" - args = [a.lower() for a in args] - state.args = args - checkmark = '*' - if 'DISPLAY' in global_vars['Env']: - checkmark = '✓' - title = '{}\nMain Menu'.format(TOP_PANE_TEXT) - # NOTE: Changing the order of main_options will break everything - main_options = [ - {'Base Name': 'Full Diagnostic', 'Enabled': False}, - {'Base Name': 'Disk Diagnostic', 'Enabled': False}, - {'Base Name': 'Disk Diagnostic (Quick)', 'Enabled': False}, - {'Base Name': 'Prime95', 'Enabled': False, 'CRLF': True}, - {'Base Name': 'NVMe / SMART', 'Enabled': False}, - {'Base Name': 'badblocks', 'Enabled': False}, - {'Base Name': 'I/O Benchmark', 'Enabled': False}, - ] - actions = [ - {'Letter': 'A', 'Name': 'Audio Test'}, - {'Letter': 'K', 'Name': 'Keyboard Test'}, - {'Letter': 'N', 'Name': 'Network Test'}, - {'Letter': 'S', 'Name': 'Start', 'CRLF': True}, - {'Letter': 'Q', 'Name': 'Quit'}, - ] - secret_actions = ['M', 'T'] - - # Set initial selections - update_main_options(state, '1', main_options) - - # CLI mode check - if '--cli' in args or 'DISPLAY' not in global_vars['Env']: - actions.append({'Letter': 'R', 'Name': 'Reboot'}) - actions.append({'Letter': 'P', 'Name': 'Power Off'}) - - # Skip menu if running quick check - if '--quick' in args: - update_main_options(state, '3', main_options) - state.quick_mode = True - run_hw_tests(state) - return True - - while True: - # Set quick mode as necessary - if main_options[2]['Enabled'] and main_options[4]['Enabled']: - # Check if only Disk Diags (Quick) and NVMe/SMART are enabled - # If so, verify no other tests are enabled and set quick_mode - state.quick_mode = True - for opt in main_options[3:4] + main_options[5:]: - state.quick_mode = state.quick_mode and not opt['Enabled'] - else: - state.quick_mode = False - - # Deselect presets - slice_end = 3 - if state.quick_mode: - slice_end = 2 - for opt in main_options[:slice_end]: - opt['Enabled'] = False - - # Verify preset selections - num_tests_selected = 0 - for opt in main_options[3:]: - if opt['Enabled']: - num_tests_selected += 1 - if num_tests_selected == 4: - # Full - main_options[0]['Enabled'] = True - elif num_tests_selected == 3 and not main_options[3]['Enabled']: - # Disk - main_options[1]['Enabled'] = True - - # Update checkboxes - for opt in main_options: - _nvme_smart = opt['Base Name'] == 'NVMe / SMART' - opt['Name'] = '[{}] {} {}'.format( - checkmark if opt['Enabled'] else ' ', - opt['Base Name'], - QUICK_LABEL if state.quick_mode and _nvme_smart else '') - - # Show menu - selection = menu_select( - title=title, - main_entries=main_options, - action_entries=actions, - secret_actions=secret_actions, - spacer='───────────────────────────────') - - if selection.isnumeric(): - update_main_options(state, selection, main_options) - elif selection == 'A': - run_audio_test() - elif selection == 'K': - run_keyboard_test() - elif selection == 'N': - run_network_test() - elif selection == 'M': - secret_screensaver('matrix') - elif selection == 'T': - # Tubes is close to pipes right? - secret_screensaver('pipes') - elif selection == 'R': - run_program(['/usr/local/bin/wk-power-command', 'reboot']) - elif selection == 'P': - run_program(['/usr/local/bin/wk-power-command', 'poweroff']) - elif selection == 'Q': - break - elif selection == 'S': - run_hw_tests(state) - - -def run_audio_test(): - """Run audio test.""" - clear_screen() - run_program(['hw-diags-audio'], check=False, pipe=False) - pause('Press Enter to return to main menu... ') - - -def run_badblocks_test(state, test): - """Run a read-only surface scan with badblocks.""" - dev = test.dev - - # Bail early - if test.disabled: - return - - def _save_badblocks_output(read_all=False, timeout=0.1): - """Get badblocks output and append to both file and var.""" - _output = '' - while _output is not None: - _output = test.badblocks_nbsr.read(0.1) - if _output is not None: - test.badblocks_stderr += _output.decode() - with open(test.badblocks_out, 'a') as f: - f.write(_output.decode()) - if not read_all: - break - - # Prep - print_log('Starting badblocks test for {}'.format(dev.path)) - test.started = True - test.update_status() - update_progress_pane(state) - - # Update tmux layout - state.set_top_pane_text(dev.description) - - # Create monitor pane - test.badblocks_out = '{}/badblocks_{}.out'.format( - global_vars['LogDir'], dev.name) - state.panes['badblocks'] = tmux_split_window( - lines=5, vertical=True, watch=test.badblocks_out, watch_cmd='tail') - - # Show disk details - clear_screen() - show_report(dev.generate_attribute_report()) - print_standard(' ') - - # Set read block size - if dev.lsblk['phy-sec'] == 4096 or dev.size_bytes >= BADBLOCKS_LARGE_DISK: - block_size = '4096' - else: - # Use default value - block_size = '1024' - - # Start badblocks - print_standard('Running badblocks test...') - test.badblocks_proc = popen_program( - ['sudo', 'badblocks', '-sv', '-b', block_size, '-e', '1', dev.path], - pipe=True, bufsize=1) - test.badblocks_nbsr = NonBlockingStreamReader(test.badblocks_proc.stderr) - test.badblocks_stderr = '' - - # Update progress loop - try: - while test.badblocks_proc.poll() is None: - _save_badblocks_output() - except KeyboardInterrupt: - run_program(['killall', 'badblocks'], check=False) - test.aborted = True - - # Save remaining badblocks output - _save_badblocks_output(read_all=True) - - # Check result and build report - test.report.append('{BLUE}badblocks{CLEAR}'.format(**COLORS)) - for line in test.badblocks_stderr.splitlines(): - line = line.strip() - if not line or re.search(r'^Checking', line, re.IGNORECASE): - # Skip empty and progress lines - continue - if re.search(r'^Pass completed.*0.*0/0/0', line, re.IGNORECASE): - test.report.append(' {}'.format(line)) - if not test.aborted: - test.passed = True - else: - test.report.append(' {YELLOW}{line}{CLEAR}'.format( - line=line, **COLORS)) - if not test.aborted: - test.failed = True - if test.aborted: - test.report.append(' {YELLOW}Aborted{CLEAR}'.format(**COLORS)) - test.update_status('Aborted') - raise GenericAbort('Aborted') - - # Disable other drive tests if necessary - if not test.passed: - dev.disable_test('I/O Benchmark', 'Denied') - - # Update status - if test.failed: - test.update_status('NS') - elif test.passed: - test.update_status('CS') - else: - test.update_status('Unknown') - - # Done - update_progress_pane(state) - - # Cleanup - tmux_kill_pane(state.panes.pop('badblocks', None)) - - -def run_hw_tests(state): - """Run enabled hardware tests.""" - print_standard('Scanning devices...') - state.init() - tests_enabled = False - - # Build Panes - update_progress_pane(state) - state.build_outer_panes() - - # Show selected tests and create TestObj()s - print_info('Selected Tests:') - for k, v in state.tests.items(): - print_standard(' {:<15} {}{}{} {}'.format( - k, - COLORS['GREEN'] if v['Enabled'] else COLORS['RED'], - 'Enabled' if v['Enabled'] else 'Disabled', - COLORS['CLEAR'], - QUICK_LABEL if state.quick_mode and 'NVMe' in k else '')) - if v['Enabled']: - tests_enabled = True - - # Create TestObj and track under both CpuObj/DiskObj and State - if k in TESTS_CPU: - test_obj = TestObj( - dev=state.cpu, label='Prime95', info_label=True) - state.cpu.tests[k] = test_obj - v['Objects'].append(test_obj) - elif k in TESTS_DISK: - for disk in state.disks: - test_obj = TestObj(dev=disk, label=disk.name) - disk.tests[k] = test_obj - v['Objects'].append(test_obj) - print_standard('') - - # Bail if no tests selected - if not tests_enabled: - tmux_kill_pane(*state.panes.values()) - return - - # Run disk safety checks (if necessary) - _disk_tests_enabled = False - for k in TESTS_DISK: - if state.tests[k]['Enabled']: - _disk_tests_enabled = True - if _disk_tests_enabled: - for disk in state.disks: - try: - disk.safety_check(silent=state.quick_mode) - except GenericAbort: - tmux_kill_pane(*state.panes.values()) - state.panes.clear() - return - - # Run tests - ## Because state.tests is an OrderedDict and the disks were added - ## in order, the tests will be run in order. - try: - for k, v in state.tests.items(): - if v['Enabled']: - f = v['Function'] - for test_obj in v['Objects']: - f(state, test_obj) - if not v['Objects']: - # No devices available - v['Objects'].append(TestObj(dev=None, label='')) - v['Objects'][-1].update_status('N/A') - # Recheck attributes - if state.tests['NVMe / SMART']['Enabled']: - for test_obj in state.tests['NVMe / SMART']['Objects']: - if test_obj.dev is not None: - # dev == None for the 'N/A' lines set above - run_nvme_smart_tests(state, test_obj, update_mode=True) - - except GenericAbort: - # Cleanup - tmux_kill_pane(*state.panes.values()) - state.panes.clear() - state.tmux_layout.pop('Current', None) - - # Rebuild panes - update_progress_pane(state) - state.build_outer_panes() - - # Mark unfinished tests as aborted - for k, v in state.tests.items(): - if v['Enabled']: - for test_obj in v['Objects']: - if re.search(r'(Pending|Working)', test_obj.status): - test_obj.update_status('Aborted') - - # Update side pane - update_progress_pane(state) - - # Show results - show_results(state) - - # Upload for review - if (ENABLED_UPLOAD_DATA - and DEBUG_MODE - and ask('Upload results for review?')): - try_and_print( - message='Saving debug reports...', - function=save_debug_reports, - state=state, global_vars=global_vars) - try_and_print( - message='Uploading Data...', - function=upload_logdir, - global_vars=global_vars, - reason='Review') - - # Done - sleep(1) - if state.quick_mode: - pause('Press Enter to exit... ') - else: - pause('Press Enter to return to main menu... ') - - # Cleanup - tmux_kill_pane(*state.panes.values()) - state.panes.clear() - - -def run_io_benchmark(state, test): - """Run a read-only I/O benchmark using dd.""" - dev = test.dev - - # Bail early - if test.disabled: - return - - # Prep - print_log('Starting I/O benchmark test for {}'.format(dev.path)) - test.started = True - test.update_status() - update_progress_pane(state) - - # Update tmux layout - state.set_top_pane_text(dev.description) - state.tmux_layout['Current'] = {'y': 15, 'Check': True} - - # Create monitor pane - test.io_benchmark_out = '{}/io_benchmark_{}.out'.format( - global_vars['LogDir'], dev.name) - state.panes['io_benchmark'] = tmux_split_window( - percent=75, vertical=True, - watch=test.io_benchmark_out, watch_cmd='tail') - tmux_resize_pane(y=15) - - # Show disk details - clear_screen() - show_report(dev.generate_attribute_report()) - print_standard(' ') - - # Start I/O Benchmark - print_standard('Running I/O benchmark test...') - try: - test.merged_rates = [] - test.read_rates = [] - dev.calc_io_dd_values() - - # Run dd read tests - offset = 0 - for i in range(dev.dd_chunks): - # Build cmd - i += 1 - skip = dev.dd_skip_count - if dev.dd_skip_extra and i % dev.dd_skip_extra == 0: - skip += 1 - cmd = [ - 'sudo', 'dd', - 'bs={}'.format(IO_VARS['Block Size']), - 'skip={}'.format(offset+skip), - 'count={}'.format(dev.dd_chunk_blocks), - 'iflag=direct', - 'if={}'.format(dev.path), - 'of=/dev/null'] - - # Run cmd and get read rate - result = run_program(cmd) - result_str = result.stderr.decode().replace('\n', '') - cur_rate = get_read_rate(result_str) - - # Add rate to lists - test.read_rates.append(cur_rate) - - # Show progress - if i % IO_VARS['Progress Refresh Rate'] == 0: - update_io_progress( - percent=(i/dev.dd_chunks)*100, - rate=cur_rate, - progress_file=test.io_benchmark_out) - - # Update offset - offset += dev.dd_chunk_blocks + skip - - except DeviceTooSmallError: - # Device too small, skipping test - test.update_status('N/A') - except KeyboardInterrupt: - test.aborted = True - except (subprocess.CalledProcessError, TypeError, ValueError): - # Something went wrong, results unknown - test.update_status('ERROR') - - # Check result and build report - test.report.append('{BLUE}I/O Benchmark{CLEAR}'.format(**COLORS)) - if test.aborted: - test.report.append(' {YELLOW}Aborted{CLEAR}'.format(**COLORS)) - raise GenericAbort('Aborted') - elif not test.read_rates: - if 'ERROR' in test.status: - test.report.append(' {RED}Unknown error{CLEAR}'.format(**COLORS)) - elif 'N/A' in test.status: - # Device too small - test.report.append(' {YELLOW}Disk too small to test{CLEAR}'.format( - **COLORS)) - else: - # Merge rates for horizontal graph - offset = 0 - width = int(dev.dd_chunks / IO_VARS['Graph Horizontal Width']) - for i in range(IO_VARS['Graph Horizontal Width']): - test.merged_rates.append( - sum(test.read_rates[offset:offset+width])/width) - offset += width - - # Add horizontal graph to report - for line in generate_horizontal_graph(test.merged_rates): - if not re.match(r'^\s+$', strip_colors(line)): - test.report.append(line) - - # Add read speeds to report - avg_read = sum(test.read_rates) / len(test.read_rates) - min_read = min(test.read_rates) - max_read = max(test.read_rates) - avg_min_max = 'Read speeds avg: {:3.1f}'.format(avg_read/(1024**2)) - avg_min_max += ' min: {:3.1f}'.format(min_read/(1024**2)) - avg_min_max += ' max: {:3.1f}'.format(max_read/(1024**2)) - test.report.append(avg_min_max) - - # Compare read speeds to thresholds - if dev.lsblk['rota']: - # Use HDD scale - thresh_min = IO_VARS['Threshold HDD Min'] - thresh_high_avg = IO_VARS['Threshold HDD High Avg'] - thresh_low_avg = IO_VARS['Threshold HDD Low Avg'] - else: - # Use SSD scale - thresh_min = IO_VARS['Threshold SSD Min'] - thresh_high_avg = IO_VARS['Threshold SSD High Avg'] - thresh_low_avg = IO_VARS['Threshold SSD Low Avg'] - if min_read <= thresh_min and avg_read <= thresh_high_avg: - test.failed = True - elif avg_read <= thresh_low_avg: - test.failed = True - else: - test.passed = True - - # Update status - if test.failed: - test.update_status('NS') - elif test.passed: - test.update_status('CS') - elif not 'N/A' in test.status: - test.update_status('Unknown') - - # Done - update_progress_pane(state) - - # Cleanup - state.tmux_layout.pop('Current', None) - tmux_kill_pane(state.panes.pop('io_benchmark', None)) - - -def run_keyboard_test(): - """Run keyboard test.""" - clear_screen() - run_program(['xev', '-event', 'keyboard'], check=False, pipe=False) - - -def run_mprime_test(state, test): - """Test CPU with Prime95 and track temps.""" - dev = test.dev - - # Bail early - if test.disabled: - return - - # Prep - print_log('Starting Prime95 test') - test.started = True - test.update_status() - update_progress_pane(state) - test.sensor_data = get_sensor_data() - test.thermal_abort = False - - # Update tmux layout - state.set_top_pane_text(dev.name) - - # Start live sensor monitor - test.sensors_out = '{}/sensors.out'.format(global_vars['TmpDir']) - with open(test.sensors_out, 'w') as f: - f.write(' ') - f.flush() - sleep(0.5) - test.monitor_proc = popen_program( - ['hw-sensors-monitor', test.sensors_out], - pipe=True) - - # Create monitor and worker panes - state.panes['Prime95'] = tmux_split_window( - lines=10, vertical=True, text=' ') - state.panes['Temps'] = tmux_split_window( - behind=True, percent=80, vertical=True, watch=test.sensors_out) - tmux_resize_pane(global_vars['Env']['TMUX_PANE'], y=3) - state.tmux_layout['Current'] = {'y': 3, 'Check': True} - - # Get idle temps - clear_screen() - try_and_print( - message='Getting idle temps...', indent=0, - function=save_average_temp, cs='Done', - sensor_data=test.sensor_data, temp_label='Idle', - seconds=5) - - # Stress CPU - print_log('Starting Prime95') - test.abort_msg = 'If running too hot, press CTRL+c to abort the test' - run_program(['apple-fans', 'max'], check=False) - tmux_update_pane( - state.panes['Prime95'], - command=['hw-diags-prime95', global_vars['TmpDir']], - working_dir=global_vars['TmpDir']) - time_limit = MPRIME_LIMIT * 60 - try: - for i in range(time_limit): - clear_screen() - sec_left = (time_limit - i) % 60 - min_left = int( (time_limit - i) / 60) - _status_str = 'Running Prime95 (' - if min_left > 0: - _status_str += '{} minute{}, '.format( - min_left, - 's' if min_left != 1 else '') - _status_str += '{} second{} left)'.format( - sec_left, - 's' if sec_left != 1 else '') - # Not using print wrappers to avoid flooding the log - print(_status_str) - print('{YELLOW}{msg}{CLEAR}'.format(msg=test.abort_msg, **COLORS)) - update_sensor_data(test.sensor_data, THERMAL_LIMIT) - - # Wait - sleep(1) - except (KeyboardInterrupt, ThermalLimitReachedError) as err: - # CTRL+c pressed or thermal limit reached - test.aborted = True - if isinstance(err, KeyboardInterrupt): - test.update_status('Aborted') - elif isinstance(err, ThermalLimitReachedError): - test.failed = True - test.thermal_abort = True - test.update_status('NS') - update_progress_pane(state) - - # Restart live monitor - test.monitor_proc = popen_program( - ['hw-sensors-monitor', test.sensors_out], - pipe=True) - - # Stop Prime95 (twice for good measure) - run_program(['killall', '-s', 'INT', 'mprime'], check=False) - sleep(1) - tmux_kill_pane(state.panes.pop('Prime95', None)) - - # Get cooldown temp - run_program(['apple-fans', 'auto'], check=False) - clear_screen() - try_and_print( - message='Letting CPU cooldown for bit...', indent=0, - function=sleep, cs='Done', seconds=10) - try_and_print( - message='Getting cooldown temps...', indent=0, - function=save_average_temp, cs='Done', - sensor_data=test.sensor_data, temp_label='Cooldown', - seconds=5) - - # Move logs to Ticket folder - for item in os.scandir(global_vars['TmpDir']): - try: - shutil.move(item.path, global_vars['LogDir']) - except Exception: - print_error('ERROR: Failed to move "{}" to "{}"'.format( - item.path, - global_vars['LogDir'])) - - # Check results and build report - test.report.append('{BLUE}Prime95{CLEAR}'.format(**COLORS)) - test.logs = {} - for log in ['results.txt', 'prime.log']: - lines = [] - log_path = '{}/{}'.format(global_vars['LogDir'], log) - - # Read and save log - try: - with open(log_path, 'r') as f: - lines = f.read().splitlines() - test.logs[log] = lines - except FileNotFoundError: - # Ignore since files may be missing for slower CPUs - pass - - # results.txt (NS check) - if log == 'results.txt': - for line in lines: - line = line.strip() - if re.search(r'(error|fail)', line, re.IGNORECASE): - test.failed = True - test.update_status('NS') - test.report.append( - ' {YELLOW}{line}{CLEAR}'.format(line=line, **COLORS)) - - # prime.log (CS check) - if log == 'prime.log': - _tmp = {'Pass': {}, 'Warn': {}} - for line in lines: - line = line.strip() - _r = re.search( - r'(completed.*(\d+) errors, (\d+) warnings)', - line, - re.IGNORECASE) - if _r: - if int(_r.group(2)) + int(_r.group(3)) > 0: - # Encountered errors and/or warnings - _tmp['Warn'][_r.group(1)] = None - else: - # No errors - _tmp['Pass'][_r.group(1)] = None - if len(_tmp['Warn']) > 0: - # NS - test.failed = True - test.passed = False - test.update_status('NS') - elif len(_tmp['Pass']) > 0 and not test.aborted: - test.passed = True - test.update_status('CS') - for line in sorted(_tmp['Pass'].keys()): - test.report.append(' {}'.format(line)) - for line in sorted(_tmp['Warn'].keys()): - test.report.append( - ' {YELLOW}{line}{CLEAR}'.format(line=line, **COLORS)) - - # Unknown result - if not (test.aborted or test.failed or test.passed): - test.report.append(' {YELLOW}Unknown result{CLEAR}'.format(**COLORS)) - test.update_status('Unknown') - - # Add temps to report - test.report.append('{BLUE}Temps{CLEAR}'.format(**COLORS)) - for line in generate_sensor_report( - test.sensor_data, 'Idle', 'Max', 'Cooldown', cpu_only=True): - test.report.append(' {}'.format(line)) - - # Add abort message(s) - if test.aborted: - test.report.append( - ' {YELLOW}Aborted{CLEAR}'.format(**COLORS)) - if test.thermal_abort: - test.report.append( - ' {RED}CPU reached temperature limit of {temp}°C{CLEAR}'.format( - temp=THERMAL_LIMIT, - **COLORS)) - - # Done - update_progress_pane(state) - - # Cleanup - state.tmux_layout.pop('Current', None) - tmux_kill_pane( - state.panes.pop('Prime95', None), - state.panes.pop('Temps', None), - ) - test.monitor_proc.kill() - - -def run_network_test(): - """Run network test.""" - clear_screen() - run_program(['hw-diags-network'], check=False, pipe=False) - pause('Press Enter to return to main menu... ') - - -def run_nvme_smart_tests(state, test, update_mode=False): - """Run NVMe or SMART test for test.dev. - - Update mode is used to refresh the attributes and recheck them. - (i.e. no self-test and don't disable other tests)""" - dev = test.dev - - # Bail early - if test.disabled: - return - - # Prep - print_log('Starting NVMe/SMART test for {}'.format(dev.path)) - test.started = True - test.update_status() - update_progress_pane(state) - - # Update tmux layout - state.set_top_pane_text(dev.description) - - # SMART short self-test - if dev.smart_attributes and not (state.quick_mode or update_mode): - run_smart_short_test(state, test) - - # Attribute check - dev.check_attributes() - - # Check results - if dev.nvme_attributes or state.quick_mode: - if dev.disk_ok: - test.passed = True - test.update_status('CS') - else: - test.failed = True - test.update_status('NS') - elif dev.smart_attributes: - if dev.disk_ok and dev.self_test_passed and 'OVERRIDE' not in test.status: - test.passed = True - test.update_status('CS') - elif test.aborted: - test.update_status('Aborted') - raise GenericAbort('Aborted') - elif dev.self_test_timed_out: - test.failed = True - test.update_status('TimedOut') - elif dev.override_disabled or 'OVERRIDE' not in test.status: - # override_disabled is set to True if one or more critical attributes - # have exceeded the Error threshold. This overrules an override. - test.failed = True - test.update_status('NS') - else: - # This dev lacks both NVMe and SMART data. This test should've been - # disabled during the safety_check(). - pass - - # Disable other disk tests if necessary - if test.failed and not update_mode: - for t in ['badblocks', 'I/O Benchmark']: - dev.disable_test(t, 'Denied') - - # Done - update_progress_pane(state) - - -def run_smart_short_test(state, test): - """Run SMART short self-test for test.dev.""" - dev = test.dev - dev.self_test_started = False - dev.self_test_finished = False - dev.self_test_passed = False - dev.self_test_timed_out = False - test.timeout = dev.smart_self_test['polling_minutes'].get('short', 5) - test.timeout = int(test.timeout) + 5 - - # Create monitor pane - test.smart_out = '{}/smart_{}.out'.format(global_vars['LogDir'], dev.name) - with open(test.smart_out, 'w') as f: - f.write('SMART self-test status:\n Starting...') - state.panes['SMART'] = tmux_split_window( - lines=3, vertical=True, watch=test.smart_out) - - # Show attributes - clear_screen() - show_report(dev.generate_attribute_report()) - print_standard(' ') - - # Start short test - print_standard('Running self-test...') - cmd = [ - 'sudo', - 'smartctl', - '--tolerance=normal', - '--test=short', - dev.path, - ] - run_program(cmd, check=False) - - # Monitor progress - try: - for i in range(int(test.timeout*60/5)): - sleep(5) - - # Update SMART data - dev.get_smart_details() - - if dev.self_test_started: - # Update progress file - with open(test.smart_out, 'w') as f: - f.write('SMART self-test status:\n {}'.format( - dev.smart_self_test['status'].get( - 'string', 'UNKNOWN').capitalize())) - - # Check if test has finished - if 'remaining_percent' not in dev.smart_self_test['status']: - dev.self_test_finished = True - break - - else: - # Check if test has started - if 'remaining_percent' in dev.smart_self_test['status']: - dev.self_test_started = True - except KeyboardInterrupt: - # Will be handled in run_nvme_smart_tests() - test.aborted = True - - # Save report - test.report.append('{BLUE}SMART Short self-test{CLEAR}'.format(**COLORS)) - test.report.append(' {}'.format( - dev.smart_self_test['status'].get('string', 'UNKNOWN').capitalize())) - if dev.self_test_finished: - dev.self_test_passed = dev.smart_self_test['status'].get('passed', False) - elif test.aborted: - test.report.append(' {YELLOW}Aborted{CLEAR}'.format(**COLORS)) - else: - dev.self_test_timed_out = True - test.report.append(' {YELLOW}Timed out{CLEAR}'.format(**COLORS)) - - # Cleanup - tmux_kill_pane(state.panes.pop('SMART', None)) - - -def secret_screensaver(screensaver=None): - """Show screensaver.""" - if screensaver == 'matrix': - cmd = 'cmatrix -abs'.split() - elif screensaver == 'pipes': - cmd = 'pipes -t 0 -t 1 -t 2 -t 3 -p 5 -R -r 4000'.split() - else: - raise Exception('Invalid screensaver') - run_program(cmd, check=False, pipe=False) - - -def show_report(report, log_report=False): - """Show report on screen and optionally save to log w/out color.""" - for line in report: - print(line) - if log_report: - print_log(strip_colors(line)) - - -def show_results(state): - """Show results for all tests.""" - clear_screen() - state.set_top_pane_text('Results') - - # CPU tests - _enabled = False - for k in TESTS_CPU: - if state.tests[k]['Enabled']: - _enabled = True - if _enabled: - print_success('CPU:'.format(k)) - show_report(state.cpu.generate_cpu_report(), log_report=True) - print_standard(' ') - - # Disk tests - _enabled = False - for k in TESTS_DISK: - if state.tests[k]['Enabled']: - _enabled = True - if _enabled: - print_success('Disk{}:'.format( - '' if len(state.disks) == 1 else 's')) - for disk in state.disks: - show_report(disk.generate_disk_report(), log_report=True) - print_standard(' ') - if not state.disks: - print_warning('No devices') - print_standard(' ') - - # Update progress - update_progress_pane(state) - - -def update_main_options(state, selection, main_options): - """Update menu and state based on selection.""" - index = int(selection) - 1 - main_options[index]['Enabled'] = not main_options[index]['Enabled'] - - # Handle presets - if index == 0: - # Full - if main_options[index]['Enabled']: - for opt in main_options[1:3]: - opt['Enabled'] = False - for opt in main_options[3:]: - opt['Enabled'] = True - else: - for opt in main_options[3:]: - opt['Enabled'] = False - elif index == 1: - # Disk - if main_options[index]['Enabled']: - main_options[0]['Enabled'] = False - for opt in main_options[2:4]: - opt['Enabled'] = False - for opt in main_options[4:]: - opt['Enabled'] = True - else: - for opt in main_options[4:]: - opt['Enabled'] = False - elif index == 2: - # Disk (Quick) - if main_options[index]['Enabled']: - for opt in main_options[:2] + main_options[3:]: - opt['Enabled'] = False - main_options[4]['Enabled'] = True - else: - main_options[4]['Enabled'] = False - - # Update state - for opt in main_options[3:]: - state.tests[opt['Base Name']]['Enabled'] = opt['Enabled'] - - # Done - return main_options - - -def update_io_progress(percent, rate, progress_file): - """Update I/O progress file.""" - bar_color = COLORS['CLEAR'] - rate_color = COLORS['CLEAR'] - step = get_graph_step(rate, scale=32) - if rate < IO_VARS['Threshold Graph Fail']: - bar_color = COLORS['RED'] - rate_color = COLORS['YELLOW'] - elif rate < IO_VARS['Threshold Graph Warn']: - bar_color = COLORS['YELLOW'] - rate_color = COLORS['YELLOW'] - elif rate > IO_VARS['Threshold Graph Great']: - bar_color = COLORS['GREEN'] - rate_color = COLORS['GREEN'] - line = ' {p:5.1f}% {b_color}{b:<4} {r_color}{r:6.1f} Mb/s{c}\n'.format( - p=percent, - b_color=bar_color, - b=IO_VARS['Graph Vertical'][step], - r_color=rate_color, - r=rate/(1024**2), - c=COLORS['CLEAR']) - with open(progress_file, 'a') as f: - f.write(line) - - -def update_progress_pane(state): - """Update progress file for side pane.""" - output = [] - for k, v in state.tests.items(): - # Skip disabled sections - if not v['Enabled']: - continue - - # Add section name - if k != 'Prime95': - output.append('{BLUE}{name}{CLEAR}'.format(name=k, **COLORS)) - if 'SMART' in k and state.quick_mode: - output[-1] += ' {}'.format(QUICK_LABEL) - - # Add status from test object(s) - for test in v['Objects']: - output.append(test.status) - - # Add spacer before next section - output.append(' ') - - # Add line-endings - output = ['{}\n'.format(line) for line in output] - - with open(state.progress_out, 'w') as f: - f.writelines(output) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/info.py b/scripts/wk.prev/functions/info.py deleted file mode 100644 index b1959090..00000000 --- a/scripts/wk.prev/functions/info.py +++ /dev/null @@ -1,500 +0,0 @@ -# Wizard Kit: Functions - Information - -from borrowed import knownpaths -from functions.activation import * -from operator import itemgetter -from settings.info import * - - -def backup_file_list(): - """Export current file listing for the system.""" - extract_item('Everything', silent=True) - cmd = [ - global_vars['Tools']['Everything'], - '-nodb', - '-create-filelist', - r'{LogDir}\File List.txt'.format(**global_vars), - global_vars['Env']['SYSTEMDRIVE']] - run_program(cmd) - - -def backup_power_plans(): - """Export current power plans.""" - os.makedirs(r'{BackupDir}\Power Plans\{Date}'.format( - **global_vars), exist_ok=True) - plans = run_program(['powercfg', '/L']) - plans = plans.stdout.decode().splitlines() - plans = [p for p in plans if re.search(r'^Power Scheme', p)] - for p in plans: - guid = re.sub(r'Power Scheme GUID:\s+([0-9a-f\-]+).*', r'\1', p) - name = re.sub( - r'Power Scheme GUID:\s+[0-9a-f\-]+\s+\(([^\)]+)\).*', r'\1', p) - out = r'{BackupDir}\Power Plans\{Date}\{name}.pow'.format( - name=name, **global_vars) - if not os.path.exists(out): - cmd = ['powercfg', '-export', out, guid] - run_program(cmd, check=False) - - -def backup_registry(overwrite=False): - """Backup registry including user hives.""" - extract_item('erunt', silent=True) - cmd = [ - global_vars['Tools']['ERUNT'], - r'{BackupDir}\Registry\{Date}'.format(**global_vars), - 'sysreg', - 'curuser', - 'otherusers', - '/noprogresswindow'] - if overwrite: - cmd.append('/noconfirmdelete') - run_program(cmd) - - -def get_folder_size(path): - """Get (human-readable) size of folder passed, returns str.""" - size = 'Unknown' - cmd = [global_vars['Tools']['Du'], '-c', '-nobanner', '-q', path] - try: - out = run_program(cmd) - except FileNotFoundError: - # Failed to find folder - pass - except subprocess.CalledProcessError: - # Failed to get folder size - pass - else: - try: - size = out.stdout.decode().split(',')[-2] - except IndexError: - # Failed to parse csv data - pass - else: - size = human_readable_size(size) - return size - - -def get_installed_antivirus(): - """Get list of installed Antivirus programs.""" - programs = [] - cmd = ['WMIC', r'/namespace:\\root\SecurityCenter2', - 'path', 'AntivirusProduct', - 'get', 'displayName', '/value'] - out = run_program(cmd) - out = out.stdout.decode().strip() - products = out.splitlines() - products = [p.split('=')[1] for p in products if p] - for prod in sorted(products): - # Get product state and check if it's enabled - # credit: https://jdhitsolutions.com/blog/powershell/5187/get-antivirus-product-status-with-powershell/ - cmd = ['WMIC', r'/namespace:\\root\SecurityCenter2', - 'path', 'AntivirusProduct', - 'where', 'displayName="{}"'.format(prod), - 'get', 'productState', '/value'] - out = run_program(cmd) - out = out.stdout.decode().strip() - state = out.split('=')[1] - state = hex(int(state)) - if str(state)[3:5] not in ['10', '11']: - programs.append('[Disabled] {}'.format(prod)) - else: - programs.append(prod) - - if len(programs) == 0: - programs = ['No programs found'] - return programs - - -def get_installed_office(): - """Get list of installed Office programs.""" - programs = [] - log_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format( - **global_vars) - with open (log_file, 'r') as f: - for line in sorted(f.readlines()): - if REGEX_OFFICE.search(line): - programs.append(line[4:82].strip()) - - if len(programs) == 0: - programs = ['No programs found'] - return programs - - -def get_shell_path(folder, user='current'): - """Get shell path using knownpaths, returns str. - - NOTE: Only works for the current user. - Code based on https://gist.github.com/mkropat/7550097 - """ - path = None - folderid = None - if user.lower() == 'public': - user = 'common' - try: - folderid = getattr(knownpaths.FOLDERID, folder) - except AttributeError: - # Unknown folder ID, ignore and return None - pass - - if folderid: - try: - path = knownpaths.get_path( - folderid, getattr(knownpaths.UserHandle, user)) - except PathNotFoundError: - # Folder not found, ignore and return None - pass - - return path - - -def get_user_data_paths(user): - """Get user data paths for provided user, returns dict.""" - hive_path = user['SID'] - paths = { - 'Profile': { - 'Path': None, - }, - 'Shell Folders': {}, - 'Extra Folders': {}, - } - unload_hive = False - - if user['Name'] == global_vars['Env']['USERNAME']: - # We can use SHGetKnownFolderPath for the current user - paths['Profile']['Path'] = get_shell_path('Profile') - paths['Shell Folders'] = {f: {'Path': get_shell_path(f)} - for f in SHELL_FOLDERS.keys()} - else: - # We have to use the NTUSER.dat hives which isn't recommended by MS - try: - key_path = r'{}\{}'.format(REG_PROFILE_LIST, user['SID']) - with winreg.OpenKey(HKLM, key_path) as key: - paths['Profile']['Path'] = winreg.QueryValueEx( - key, 'ProfileImagePath')[0] - except Exception: - # Profile path not found, leaving as None. - pass - - # Shell folders (Prep) - if not reg_path_exists(HKU, hive_path) and paths['Profile']['Path']: - # User not logged-in, loading hive - # Also setting unload_hive so it will be unloaded later. - hive_path = TMP_HIVE_PATH - cmd = ['reg', 'load', r'HKU\{}'.format(TMP_HIVE_PATH), - r'{}\NTUSER.DAT'.format(paths['Profile']['Path'])] - unload_hive = True - try: - run_program(cmd) - except subprocess.CalledProcessError: - # Failed to load user hive - pass - - # Shell folders - shell_folders = r'{}\{}'.format(hive_path, REG_SHELL_FOLDERS) - if (reg_path_exists(HKU, hive_path) - and reg_path_exists(HKU, shell_folders)): - with winreg.OpenKey(HKU, shell_folders) as key: - for folder, values in SHELL_FOLDERS.items(): - for value in values: - try: - path = winreg.QueryValueEx(key, value)[0] - except FileNotFoundError: - # Skip missing values - pass - else: - paths['Shell Folders'][folder] = {'Path': path} - # Stop checking values for this folder - break - - # Shell folder (extra check) - if paths['Profile']['Path']: - for folder in SHELL_FOLDERS.keys(): - folder_path = r'{Path}\{folder}'.format( - folder=folder, **paths['Profile']) - if (folder not in paths['Shell Folders'] - and os.path.exists(folder_path)): - paths['Shell Folders'][folder] = {'Path': folder_path} - - # Extra folders - if paths['Profile']['Path']: - for folder in EXTRA_FOLDERS: - folder_path = r'{Path}\{folder}'.format( - folder=folder, **paths['Profile']) - if os.path.exists(folder_path): - paths['Extra Folders'][folder] = {'Path': folder_path} - - # Shell folders (cleanup) - if unload_hive: - cmd = ['reg', 'unload', r'HKU\{}'.format(TMP_HIVE_PATH)] - run_program(cmd, check=False) - - # Done - return paths - - -def get_user_folder_sizes(users): - """Update list(users) to include folder paths and sizes.""" - extract_item('du', filter='du*', silent=True) - # Configure Du - winreg.CreateKey(HKCU, r'Software\Sysinternals\Du') - with winreg.OpenKey(HKCU, - r'Software\Sysinternals\Du', access=winreg.KEY_WRITE) as key: - winreg.SetValueEx(key, 'EulaAccepted', 0, winreg.REG_DWORD, 1) - - for u in users: - u.update(get_user_data_paths(u)) - if u['Profile']['Path']: - u['Profile']['Size'] = get_folder_size(u['Profile']['Path']) - for folder in u['Shell Folders'].keys(): - u['Shell Folders'][folder]['Size'] = get_folder_size( - u['Shell Folders'][folder]['Path']) - for folder in u['Extra Folders'].keys(): - u['Extra Folders'][folder]['Size'] = get_folder_size( - u['Extra Folders'][folder]['Path']) - - -def get_user_list(): - """Get user list via WMIC, returns list of dicts.""" - users = [] - - # Get user info from WMI - cmd = ['wmic', 'useraccount', 'get', '/format:csv'] - try: - out = run_program(cmd) - except subprocess.CalledProcessError: - # Meh, return empty list to avoid a full crash - return users - - entries = out.stdout.decode().splitlines() - entries = [e.strip().split(',') for e in entries if e.strip()] - - # Add user(s) to dict - keys = entries[0] - for e in entries[1:]: - # Create dict using 1st line (keys) - e = dict(zip(keys, e)) - # Set Active status via 'Disabled' TRUE/FALSE str - e['Active'] = bool(e['Disabled'].upper() == 'FALSE') - # Assume SIDs ending with 1000+ are "Standard" and others are "System" - e['Type'] = 'Standard' if re.search(r'-1\d+$', e['SID']) else 'System' - users.append(e) - - # Sort list - users.sort(key=itemgetter('Name')) - - # Done - return users - - -def reg_path_exists(hive, path): - """Test if specified path exists, returns bool.""" - try: - winreg.QueryValue(hive, path) - except FileNotFoundError: - return False - else: - return True - - -def run_aida64(): - """Run AIDA64 to save system reports.""" - extract_item('AIDA64', silent=True) - # All system info - config = r'{BinDir}\AIDA64\full.rpf'.format(**global_vars) - report_file = r'{LogDir}\System Information (AIDA64).html'.format( - **global_vars) - if not os.path.exists(report_file): - cmd = [ - global_vars['Tools']['AIDA64'], - '/R', report_file, - '/CUSTOM', config, - '/HTML', '/SILENT', '/SAFEST'] - run_program(cmd, check=False) - - # Installed Programs - config = r'{BinDir}\AIDA64\installed_programs.rpf'.format(**global_vars) - report_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format( - **global_vars) - if not os.path.exists(report_file): - cmd = [ - global_vars['Tools']['AIDA64'], - '/R', report_file, - '/CUSTOM', config, - '/TEXT', '/SILENT', '/SAFEST'] - run_program(cmd, check=False) - - # Product Keys - config = r'{BinDir}\AIDA64\licenses.rpf'.format(**global_vars) - report_file = r'{LogDir}\Product Keys (AIDA64).txt'.format(**global_vars) - if not os.path.exists(report_file): - cmd = [ - global_vars['Tools']['AIDA64'], - '/R', report_file, - '/CUSTOM', config, - '/TEXT', '/SILENT', '/SAFEST'] - run_program(cmd, check=False) - - -def run_bleachbit(cleaners=None, preview=True): - """Run BleachBit preview and save log. - - If preview is True then no files should be deleted.""" - error_path = r'{}\Tools\BleachBit.err'.format(global_vars['LogDir']) - log_path = error_path.replace('err', 'log') - extract_item('BleachBit', silent=True) - - # Safety check - if not cleaners: - # Disable cleaning and use preset config - cleaners = ['--preset'] - preview = True - - # Run - cmd = [ - global_vars['Tools']['BleachBit'], - '--preview' if preview else '--clean'] - cmd.extend(cleaners) - out = run_program(cmd, check=False) - - # Save stderr - if out.stderr.decode().splitlines(): - with open(error_path, 'a', encoding='utf-8') as f: - for line in out.stderr.decode().splitlines(): - f.write(line.strip() + '\n') - - # Save stdout - with open(log_path, 'a', encoding='utf-8') as f: - for line in out.stdout.decode().splitlines(): - f.write(line.strip() + '\n') - - -def show_disk_usage(disk): - """Show free and used space for a specified disk.""" - print_standard('{:5}'.format(disk.device.replace('/', ' ')), - end='', flush=True, timestamp=False) - try: - usage = psutil.disk_usage(disk.device) - display_string = '{percent:>5.2f}% Free ({free} / {total})'.format( - percent = 100 - usage.percent, - free = human_readable_size(usage.free, 2), - total = human_readable_size(usage.total, 2)) - if usage.percent > 85: - print_error(display_string, timestamp=False) - elif usage.percent > 75: - print_warning(display_string, timestamp=False) - else: - print_standard(display_string, timestamp=False) - except Exception: - print_warning('Unknown', timestamp=False) - - -def show_free_space(indent=8, width=32): - """Show free space info for all fixed disks.""" - message = 'Free Space:' - for disk in psutil.disk_partitions(): - try: - if 'fixed' in disk.opts: - try_and_print(message=message, function=show_disk_usage, - ns='Unknown', silent_function=False, - indent=indent, width=width, disk=disk) - message = '' - except Exception: - pass - - -def show_installed_ram(): - """Show installed RAM.""" - mem = psutil.virtual_memory() - if mem.total > 5905580032: - # > 5.5 Gb so 6Gb or greater - print_standard(human_readable_size(mem.total).strip(), timestamp=False) - elif mem.total > 3758096384: - # > 3.5 Gb so 4Gb or greater - print_warning(human_readable_size(mem.total).strip(), timestamp=False) - else: - print_error(human_readable_size(mem.total).strip(), timestamp=False) - - -def show_os_activation(): - """Show OS activation info.""" - act_str = get_activation_string() - if windows_is_activated(): - print_standard(act_str, timestamp=False) - elif re.search(r'unavailable', act_str, re.IGNORECASE): - print_warning(act_str, timestamp=False) - else: - print_error(act_str, timestamp=False) - - -def show_os_name(): - """Show extended OS name (including warnings).""" - os_name = global_vars['OS']['DisplayName'] - if global_vars['OS']['Arch'] == 32: - # Show all 32-bit installs as an error message - print_error(os_name, timestamp=False) - else: - if re.search( - r'(preview build|unrecognized|unsupported)', - os_name, - re.IGNORECASE): - print_error(os_name, timestamp=False) - elif re.search(r'outdated', os_name, re.IGNORECASE): - print_warning(os_name, timestamp=False) - else: - print_standard(os_name, timestamp=False) - - -def show_temp_files_size(): - """Show total size of temp files identified by BleachBit.""" - size_str = None - total = 0 - with open(r'{LogDir}\Tools\BleachBit.log'.format(**global_vars), 'r') as f: - for line in f.readlines(): - if re.search(r'^Disk space (to be |)recovered:', line, re.IGNORECASE): - size = re.sub(r'.*: ', '', line.strip()) - size = re.sub(r'(\w)iB$', r' \1b', size) - total += convert_to_bytes(size) - size_str = human_readable_size(total, decimals=1) - if size_str is None: - print_warning('UNKNOWN', timestamp=False) - else: - print_standard(size_str, timestamp=False) - - -def show_user_data_summary(indent=8, width=32): - """Print user data folder sizes for all users.""" - users = get_user_list() - users = [u for u in users if u['Active']] - get_user_folder_sizes(users) - for user in users: - if ('Size' not in user['Profile'] - and not any(user['Shell Folders']) - and not any(user['Extra Folders'])): - # Skip empty users - continue - print_success('{indent}User: {user}'.format( - indent = ' '*int(indent/2), - user = user['Name'])) - for section in ['Profile', None, 'Shell Folders', 'Extra Folders']: - folders = [] - if section is None: - # Divider - print_standard('{}{}'.format(' '*indent, '-'*(width+6))) - elif section == 'Profile': - folders = {'Profile': user['Profile']} - else: - folders = user[section] - for folder in folders: - print_standard( - '{indent}{folder:<{width}}{size:>6} ({path})'.format( - indent = ' ' * indent, - width = width, - folder = folder, - size = folders[folder].get('Size', 'Unknown'), - path = folders[folder].get('Path', 'Unknown'))) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/json.py b/scripts/wk.prev/functions/json.py deleted file mode 100644 index 49481903..00000000 --- a/scripts/wk.prev/functions/json.py +++ /dev/null @@ -1,32 +0,0 @@ -# Wizard Kit: Functions - JSON - -import json - -from functions.common import * - -def get_json_from_command(cmd, check=True, ignore_errors=True): - """Capture JSON content from cmd output, returns dict. - - If the data can't be decoded then either an exception is raised - or an empty dict is returned depending on ignore_errors. - """ - errors = 'strict' - json_data = {} - - if ignore_errors: - errors = 'ignore' - - try: - result = run_program(cmd, check=check, encoding='utf-8', errors=errors) - json_data = json.loads(result.stdout) - except (subprocess.CalledProcessError, json.decoder.JSONDecodeError): - if not ignore_errors: - raise - - return json_data - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/product_keys.py b/scripts/wk.prev/functions/product_keys.py deleted file mode 100644 index 950e509b..00000000 --- a/scripts/wk.prev/functions/product_keys.py +++ /dev/null @@ -1,120 +0,0 @@ -# Wizard Kit: Functions - Product Keys - -from functions.common import * - - -# Regex -REGEX_REGISTRY_DIRS = re.compile( - r'^(config$|RegBack$|System32$|Transfer|Win)', - re.IGNORECASE) -REGEX_SOFTWARE_HIVE = re.compile(r'^Software$', re.IGNORECASE) - - -def extract_keys(): - """Extract keys from provided hives and return a dict.""" - keys = {} - - # Extract keys - extract_item('ProduKey', silent=True) - for hive in find_software_hives(): - cmd = [ - global_vars['Tools']['ProduKey'], - '/IEKeys', '0', - '/WindowsKeys', '1', - '/OfficeKeys', '1', - '/ExtractEdition', '1', - '/nosavereg', - '/regfile', hive, - '/scomma', ''] - try: - out = run_program(cmd) - except subprocess.CalledProcessError: - # Ignore and return empty dict - pass - else: - for line in out.stdout.decode().splitlines(): - # Add key to keys under product only if unique - tmp = line.split(',') - product = tmp[0] - key = tmp[2] - if product not in keys: - keys[product] = [] - if key not in keys[product]: - keys[product].append(key) - - # Done - return keys - - -def list_clientdir_keys(): - """List product keys found in hives inside the ClientDir.""" - keys = extract_keys() - key_list = [] - if keys: - for product in sorted(keys): - key_list.append(product) - for key in sorted(keys[product]): - key_list.append(' {key}'.format(key=key)) - else: - key_list.append('No keys found.') - - return key_list - - -def find_software_hives(): - """Search for transferred SW hives and return a list.""" - hives = [] - search_paths = [global_vars['ClientDir']] - - while len(search_paths) > 0: - for item in os.scandir(search_paths.pop(0)): - if item.is_dir() and REGEX_REGISTRY_DIRS.search(item.name): - search_paths.append(item.path) - if item.is_file() and REGEX_SOFTWARE_HIVE.search(item.name): - hives.append(item.path) - - return hives - - -def get_product_keys(): - """List product keys from saved report.""" - keys = [] - log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars) - with open (log_file, 'r') as f: - for line in f.readlines(): - if re.search(r'^Product Name', line): - line = re.sub(r'^Product Name\s+:\s+(.*)', r'\1', line.strip()) - keys.append(line) - - if keys: - return keys - else: - return ['No product keys found'] - - -def run_produkey(): - """Run ProduKey and save report in the ClientDir.""" - extract_item('ProduKey', silent=True) - log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars) - if not os.path.exists(log_file): - # Clear current configuration - for config in ['ProduKey.cfg', 'ProduKey64.cfg']: - config = r'{BinDir}\ProduKey\{config}'.format( - config=config, **global_vars) - try: - if os.path.exists(config): - os.remove(config) - except Exception: - pass - cmd = [ - global_vars['Tools']['ProduKey'], - '/nosavereg', - '/stext', - log_file] - run_program(cmd, check=False) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/repairs.py b/scripts/wk.prev/functions/repairs.py deleted file mode 100644 index f1e10a4a..00000000 --- a/scripts/wk.prev/functions/repairs.py +++ /dev/null @@ -1,136 +0,0 @@ -# Wizard Kit: Functions - Repairs - -from functions.common import * - - -def run_chkdsk(repair=False): - """Run CHKDSK scan or schedule offline repairs.""" - if repair: - run_chkdsk_offline() - else: - run_chkdsk_scan() - - -def run_chkdsk_scan(): - """Run CHKDSK in a "split window" and report errors.""" - if global_vars['OS']['Version'] in ('8', '8.1', '10'): - cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE'], '/scan', '/perf'] - else: - cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE']] - out = run_program(cmd, check=False) - # retcode == 0: no issues - # retcode == 1: fixed issues (also happens when chkdsk.exe is killed?) - # retcode == 2: issues - if int(out.returncode) > 0: - # print_error(' ERROR: CHKDSK encountered errors') - raise GenericError - - # Save stderr - with open(r'{LogDir}\Tools\CHKDSK.err'.format(**global_vars), 'a') as f: - for line in out.stderr.decode().splitlines(): - f.write(line.strip() + '\n') - # Save stdout - with open(r'{LogDir}\Tools\CHKDSK.log'.format(**global_vars), 'a') as f: - for line in out.stdout.decode().splitlines(): - f.write(line.strip() + '\n') - - -def run_chkdsk_offline(): - """Set filesystem 'dirty bit' to force a chkdsk during next boot.""" - cmd = [ - 'fsutil', 'dirty', - 'set', - global_vars['Env']['SYSTEMDRIVE']] - out = run_program(cmd, check=False) - if int(out.returncode) > 0: - raise GenericError - - -def run_dism(repair=False): - """Run DISM to either scan or repair component store health.""" - if global_vars['OS']['Version'] in ('8', '8.1', '10'): - if repair: - # Restore Health - cmd = [ - 'DISM', '/Online', - '/Cleanup-Image', '/RestoreHealth', - r'/LogPath:"{LogDir}\Tools\DISM_RestoreHealth.log"'.format( - **global_vars), - '-new_console:n', '-new_console:s33V'] - else: - # Scan Health - cmd = [ - 'DISM', '/Online', - '/Cleanup-Image', '/ScanHealth', - r'/LogPath:"{LogDir}\Tools\DISM_ScanHealth.log"'.format( - **global_vars), - '-new_console:n', '-new_console:s33V'] - run_program(cmd, pipe=False, check=False, shell=True) - wait_for_process('dism') - # Now check health - cmd = [ - 'DISM', '/Online', - '/Cleanup-Image', '/CheckHealth', - r'/LogPath:"{LogDir}\Tools\DISM_CheckHealth.log"'.format(**global_vars)] - result = run_program(cmd, shell=True).stdout.decode() - # Check result - if 'no component store corruption detected' not in result.lower(): - raise GenericError - else: - raise UnsupportedOSError - - -def run_kvrt(): - """Run KVRT.""" - extract_item('KVRT', silent=True) - os.makedirs(global_vars['QuarantineDir'], exist_ok=True) - cmd = [ - global_vars['Tools']['KVRT'], - '-accepteula', '-dontcryptsupportinfo', '-fixednames', - '-d', global_vars['QuarantineDir'], - '-processlevel', '3'] - popen_program(cmd, pipe=False) - - -def run_sfc_scan(): - """Run SFC in a "split window" and report errors.""" - cmd = [ - r'{SYSTEMROOT}\System32\sfc.exe'.format(**global_vars['Env']), - '/scannow'] - out = run_program(cmd, check=False) - # Save stderr - with open(r'{LogDir}\Tools\SFC.err'.format(**global_vars), 'a') as f: - for line in out.stderr.decode('utf-8', 'ignore').splitlines(): - f.write(line.strip() + '\n') - # Save stdout - with open(r'{LogDir}\Tools\SFC.log'.format(**global_vars), 'a') as f: - for line in out.stdout.decode('utf-8', 'ignore').splitlines(): - f.write(line.strip() + '\n') - # Check result - log_text = out.stdout.decode('utf-8', 'ignore').replace('\0', '') - if re.findall(r'did\s+not\s+find\s+any\s+integrity\s+violations', log_text): - pass - elif re.findall(r'successfully\s+repaired\s+them', log_text): - raise GenericRepair - else: - raise GenericError - - -def run_tdsskiller(): - """Run TDSSKiller.""" - extract_item('TDSSKiller', silent=True) - os.makedirs(r'{QuarantineDir}\TDSSKiller'.format( - **global_vars), exist_ok=True) - cmd = [ - global_vars['Tools']['TDSSKiller'], - '-l', r'{LogDir}\Tools\TDSSKiller.log'.format(**global_vars), - '-qpath', r'{QuarantineDir}\TDSSKiller'.format(**global_vars), - '-accepteula', '-accepteulaksn', - '-dcexact', '-tdlfs'] - run_program(cmd, pipe=False) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/safemode.py b/scripts/wk.prev/functions/safemode.py deleted file mode 100644 index 041cd506..00000000 --- a/scripts/wk.prev/functions/safemode.py +++ /dev/null @@ -1,45 +0,0 @@ -# Wizard Kit: Functions - SafeMode - -from functions.common import * - - -# STATIC VARIABLES -REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer' - - -def disable_safemode_msi(): - """Disable MSI access under safemode.""" - cmd = ['reg', 'delete', REG_MSISERVER, '/f'] - run_program(cmd) - - -def disable_safemode(): - """Edit BCD to remove safeboot value.""" - cmd = ['bcdedit', '/deletevalue', '{default}', 'safeboot'] - run_program(cmd) - - -def enable_safemode_msi(): - """Enable MSI access under safemode.""" - cmd = ['reg', 'add', REG_MSISERVER, '/f'] - run_program(cmd) - cmd = ['reg', 'add', REG_MSISERVER, '/ve', - '/t', 'REG_SZ', '/d', 'Service', '/f'] - run_program(cmd) - - -def enable_safemode(): - """Edit BCD to set safeboot as default.""" - cmd = ['bcdedit', '/set', '{default}', 'safeboot', 'network'] - run_program(cmd) - - -def reboot(delay=3): - cmd = ['shutdown', '-r', '-t', '{}'.format(delay)] - run_program(cmd, check=False) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/sensors.py b/scripts/wk.prev/functions/sensors.py deleted file mode 100644 index 49a7472c..00000000 --- a/scripts/wk.prev/functions/sensors.py +++ /dev/null @@ -1,243 +0,0 @@ -'''Wizard Kit: Functions - Sensors''' -# pylint: disable=no-name-in-module,wildcard-import -# vim: sts=2 sw=2 ts=2 - -import json -import re - -from functions.tmux import * -from settings.sensors import * - - -# Error Classes -class ThermalLimitReachedError(Exception): - '''Thermal limit reached error.''' - - -def clear_temps(sensor_data): - """Clear saved temps but keep structure, returns dict.""" - for _section, _adapters in sensor_data.items(): - for _adapter, _sources in _adapters.items(): - for _source, _data in _sources.items(): - _data['Temps'] = [] - - -def fix_sensor_str(_s): - """Cleanup string and return str.""" - _s = re.sub(r'^(\w+)-(\w+)-(\w+)', r'\1 (\2 \3)', _s, re.IGNORECASE) - _s = _s.title() - _s = _s.replace('Coretemp', 'CPUTemp') - _s = _s.replace('Acpi', 'ACPI') - _s = _s.replace('ACPItz', 'ACPI TZ') - _s = _s.replace('Isa ', 'ISA ') - _s = _s.replace('Pci ', 'PCI ') - _s = _s.replace('Id ', 'ID ') - _s = re.sub(r'(\D+)(\d+)', r'\1 \2', _s, re.IGNORECASE) - _s = re.sub(r'^K (\d+)Temp', r'AMD K\1 Temps', _s, re.IGNORECASE) - _s = re.sub(r'T(ctl|die)', r'CPU (T\1)', _s, re.IGNORECASE) - return _s - - -def generate_sensor_report( - sensor_data, *temp_labels, - colors=True, cpu_only=False): - """Generate report based on temp_labels, returns list if str.""" - report = [] - for _section, _adapters in sorted(sensor_data.items()): - # CPU temps then Other temps - if cpu_only and 'CPU' not in _section: - continue - for _adapter, _sources in sorted(_adapters.items()): - # Adapter - report.append(fix_sensor_str(_adapter)) - for _source, _data in sorted(_sources.items()): - # Source - _line = '{:18} '.format(fix_sensor_str(_source)) - # Temps (skip label for Current) - for _label in temp_labels: - _line += '{}{}{} '.format( - _label.lower() if _label != 'Current' else '', - ': ' if _label != 'Current' else '', - get_temp_str(_data.get(_label, '???'), colors=colors)) - report.append(_line) - if not cpu_only: - report.append(' ') - - # Handle empty reports (i.e. no sensors detected) - if not report: - report = [ - '{}WARNING: No sensors found{}'.format( - COLORS['YELLOW'] if colors else '', - COLORS['CLEAR'] if colors else ''), - ' ', - 'Please monitor temps manually'] - - # Done - return report - - -def get_colored_temp_str(temp): - """Get colored string based on temp, returns str.""" - try: - temp = float(temp) - except ValueError: - return '{YELLOW}{temp}{CLEAR}'.format(temp=temp, **COLORS) - if temp > TEMP_LIMITS['RED']: - color = COLORS['RED'] - elif temp > TEMP_LIMITS['ORANGE']: - color = COLORS['ORANGE'] - elif temp > TEMP_LIMITS['YELLOW']: - color = COLORS['YELLOW'] - elif temp > TEMP_LIMITS['GREEN']: - color = COLORS['GREEN'] - elif temp > 0: - color = COLORS['BLUE'] - else: - color = COLORS['CLEAR'] - return '{color}{prefix}{temp:2.0f}°C{CLEAR}'.format( - color=color, - prefix='-' if temp < 0 else '', - temp=temp, - **COLORS) - - -def get_raw_sensor_data(): - """Read sensor data and return dict.""" - json_data = {} - cmd = ['sensors', '-j'] - - # Get raw data - try: - result = run_program(cmd) - result = result.stdout.decode('utf-8', errors='ignore').splitlines() - except subprocess.CalledProcessError: - # Assuming no sensors available, set to empty list - result = [] - - # Workaround for bad sensors - raw_data = [] - for line in result: - if line.strip() == ',': - # Assuming malformatted line caused by missing data - continue - raw_data.append(line) - - # Parse JSON data - try: - json_data = json.loads('\n'.join(raw_data)) - except json.JSONDecodeError: - # Still broken, just return the empty dict - pass - - # Done - return json_data - - -def get_sensor_data(): - """Parse raw sensor data and return new dict.""" - json_data = get_raw_sensor_data() - sensor_data = {'CPUTemps': {}, 'Other': {}} - for _adapter, _sources in json_data.items(): - if is_cpu_adapter(_adapter): - _section = 'CPUTemps' - else: - _section = 'Other' - sensor_data[_section][_adapter] = {} - _sources.pop('Adapter', None) - - # Find current temp and add to dict - ## current temp is labeled xxxx_input - for _source, _labels in _sources.items(): - for _label, _temp in _labels.items(): - if _label.startswith('fan'): - # Skip fan RPMs - continue - if 'input' in _label: - sensor_data[_section][_adapter][_source] = { - 'Current': _temp, - 'Label': _label, - 'Max': _temp, - 'Temps': [_temp], - } - - # Remove empty sections - for _k, _v in sensor_data.items(): - _v = {_k2: _v2 for _k2, _v2 in _v.items() if _v2} - - # Done - return sensor_data - - -def get_temp_str(temp, colors=True): - """Get temp string, returns str.""" - if colors: - return get_colored_temp_str(temp) - try: - temp = float(temp) - except ValueError: - return '{}'.format(temp) - else: - return '{}{:2.0f}°C'.format( - '-' if temp < 0 else '', - temp) - - -def is_cpu_adapter(adapter): - """Checks if adapter is a known CPU adapter, returns bool.""" - is_cpu = re.search(r'(core|k\d+)temp', adapter, re.IGNORECASE) - return bool(is_cpu) - - -def monitor_sensors(monitor_pane, monitor_file): - """Continually update sensor data and report to screen.""" - sensor_data = get_sensor_data() - while True: - update_sensor_data(sensor_data) - with open(monitor_file, 'w') as _f: - report = generate_sensor_report(sensor_data, 'Current', 'Max') - _f.write('\n'.join(report)) - sleep(1) - if monitor_pane and not tmux_poll_pane(monitor_pane): - break - - -def save_average_temp(sensor_data, temp_label, seconds=10): - """Save average temps under temp_label, returns dict.""" - clear_temps(sensor_data) - - # Get temps - for _i in range(seconds): # pylint: disable=unused-variable - update_sensor_data(sensor_data) - sleep(1) - - # Calculate averages - for _section, _adapters in sensor_data.items(): - for _adapter, _sources in _adapters.items(): - for _source, _data in _sources.items(): - _data[temp_label] = sum(_data['Temps']) / len(_data['Temps']) - - -def update_sensor_data(sensor_data, thermal_limit=None): - """Read sensors and update existing sensor_data, returns dict.""" - json_data = get_raw_sensor_data() - for _section, _adapters in sensor_data.items(): - for _adapter, _sources in _adapters.items(): - for _source, _data in _sources.items(): - try: - _label = _data['Label'] - _temp = json_data[_adapter][_source][_label] - _data['Current'] = _temp - _data['Max'] = max(_temp, _data['Max']) - _data['Temps'].append(_temp) - except Exception: # pylint: disable=broad-except - # Dumb workound for Dell sensors with changing source names - pass - - # Check if thermal limit reached - if thermal_limit and _section == 'CPUTemps': - if max(_data['Current'], _data['Max']) >= thermal_limit: - raise ThermalLimitReachedError('CPU temps reached limit') - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") diff --git a/scripts/wk.prev/functions/setup.py b/scripts/wk.prev/functions/setup.py deleted file mode 100644 index f9f864e9..00000000 --- a/scripts/wk.prev/functions/setup.py +++ /dev/null @@ -1,359 +0,0 @@ -# Wizard Kit: Functions - Setup - -from functions.browsers import * -from functions.json import * -from functions.update import * -from settings.setup import * -from settings.sources import * - - -# Configuration -def config_classicstart(): - """Configure ClassicStart.""" - # User level, not system level - cs_exe = r'{PROGRAMFILES}\Classic Shell\ClassicStartMenu.exe'.format( - **global_vars['Env']) - skin = r'{PROGRAMFILES}\Classic Shell\Skins\Metro-Win10-Black.skin7'.format( - **global_vars['Env']) - extract_item('ClassicStartSkin', silent=True) - - # Stop Classic Start - run_program([cs_exe, '-exit'], check=False) - sleep(1) - kill_process('ClassicStartMenu.exe') - - # Configure - write_registry_settings(SETTINGS_CLASSIC_START, all_users=False) - if global_vars['OS']['Version'] == '10' and os.path.exists(skin): - # Enable Win10 theme if on Win10 - key_path = r'Software\IvoSoft\ClassicStartMenu\Settings' - with winreg.OpenKey(HKCU, key_path, access=winreg.KEY_WRITE) as key: - winreg.SetValueEx( - key, 'SkinW7', 0, winreg.REG_SZ, 'Metro-Win10-Black') - winreg.SetValueEx(key, 'SkinVariationW7', 0, winreg.REG_SZ, '') - - # Pin Browser to Start Menu (Classic) - firefox = r'{PROGRAMDATA}\Start Menu\Programs\Mozilla Firefox.lnk'.format( - **global_vars['Env']) - chrome = r'{PROGRAMDATA}\Start Menu\Programs\Google Chrome.lnk'.format( - **global_vars['Env']) - dest_path = r'{APPDATA}\ClassicShell\Pinned'.format(**global_vars['Env']) - source = None - dest = None - if os.path.exists(firefox): - source = firefox - dest = r'{}\Mozilla Firefox.lnk'.format(dest_path) - elif os.path.exists(chrome): - source = chrome - dest = r'{}\Google Chrome.lnk'.format(dest_path) - if source: - try: - os.makedirs(dest_path, exist_ok=True) - shutil.copy(source, dest) - except Exception: - pass # Meh, it's fine without - - # (Re)start Classic Start - run_program([cs_exe, '-exit'], check=False) - sleep(1) - kill_process('ClassicStartMenu.exe') - sleep(1) - popen_program(cs_exe) - - -def config_explorer_system(): - """Configure Windows Explorer for all users.""" - write_registry_settings(SETTINGS_EXPLORER_SYSTEM, all_users=True) - - -def config_explorer_user(setup_mode='All'): - """Configure Windows Explorer for current user per setup_mode.""" - settings_explorer_user = { - k: v for k, v in SETTINGS_EXPLORER_USER.items() - if setup_mode not in v.get('Invalid modes', []) - } - write_registry_settings(settings_explorer_user, all_users=False) - - -def config_windows_updates(): - """Configure Windows updates.""" - write_registry_settings(SETTINGS_WINDOWS_UPDATES, all_users=True) - - -def update_clock(): - """Set Timezone and sync clock.""" - run_program(['tzutil', '/s', WINDOWS_TIME_ZONE], check=False) - run_program(['net', 'stop', 'w32ime'], check=False) - run_program( - ['w32tm', '/config', '/syncfromflags:manual', - '/manualpeerlist:"us.pool.ntp.org time.nist.gov time.windows.com"', - ], - check=False) - run_program(['net', 'start', 'w32ime'], check=False) - run_program(['w32tm', '/resync', '/nowait'], check=False) - - -def write_registry_settings(settings, all_users=False): - """Write registry values from custom dict of dicts.""" - hive = HKCU - if all_users: - hive = HKLM - for k, v in settings.items(): - # CreateKey - access = winreg.KEY_WRITE - if 'WOW64_32' in v: - access = access | winreg.KEY_WOW64_32KEY - winreg.CreateKeyEx(hive, k, 0, access) - - # Create values - with winreg.OpenKeyEx(hive, k, 0, access) as key: - for name, value in v.get('DWORD Items', {}).items(): - winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value) - for name, value in v.get('SZ Items', {}).items(): - winreg.SetValueEx(key, name, 0, winreg.REG_SZ, value) - - -# Installations -def find_current_software(): - """Find currently installed software, returns list.""" - ninite_extras_path = r'{BaseDir}\Installers\Extras'.format(**global_vars) - installers = [] - - # Browsers - scan_for_browsers(silent=True) - for browser in ('Google Chrome', 'Mozilla Firefox', 'Opera Chromium'): - if is_installed(browser): - installers.append( - r'{}\Web Browsers\{}.exe'.format(ninite_extras_path, browser)) - - # TODO: Add more sections - - return installers - -def find_missing_software(): - """Find missing software based on dirs/files present, returns list.""" - ninite_extras_path = r'{BaseDir}\Installers\Extras'.format(**global_vars) - installers = [] - - # Browsers - scan_for_browsers(silent=True) - for browser in ('Google Chrome', 'Mozilla Firefox', 'Opera Chromium'): - if profile_present(browser): - installers.append( - r'{}\Web Browsers\{}.exe'.format(ninite_extras_path, browser)) - - # TODO: Add more sections - - return installers - - -def install_adobe_reader(): - """Install Adobe Reader.""" - cmd = [ - r'{BaseDir}\Installers\Extras\Office\Adobe Reader DC.exe'.format( - **global_vars), - '/sAll', - '/msi', '/norestart', '/quiet', - 'ALLUSERS=1', - 'EULA_ACCEPT=YES'] - run_program(cmd) - - -def install_chrome_extensions(): - """Install Google Chrome extensions for all users.""" - write_registry_settings(SETTINGS_GOOGLE_CHROME, all_users=True) - - -def install_classicstart_skin(): - """Extract ClassicStart skin to installation folder.""" - if global_vars['OS']['Version'] not in ('8', '8.1', '10'): - raise UnsupportedOSError - extract_item('ClassicStartSkin', silent=True) - source = r'{BinDir}\ClassicStartSkin\Metro-Win10-Black.skin7'.format( - **global_vars) - dest_path = r'{PROGRAMFILES}\Classic Shell\Skins'.format( - **global_vars['Env']) - dest = r'{}\Metro-Win10-Black.skin7'.format(dest_path) - os.makedirs(dest_path, exist_ok=True) - shutil.copy(source, dest) - - -def install_firefox_extensions(): - """Install Firefox extensions for all users.""" - dist_path = r'{PROGRAMFILES}\Mozilla Firefox\distribution\extensions'.format( - **global_vars['Env']) - source_path = r'{CBinDir}\FirefoxExtensions.7z'.format(**global_vars) - if not os.path.exists(source_path): - raise FileNotFoundError - - # Update registry - write_registry_settings(SETTINGS_MOZILLA_FIREFOX_32, all_users=True) - write_registry_settings(SETTINGS_MOZILLA_FIREFOX_64, all_users=True) - - # Extract extension(s) to distribution folder - cmd = [ - global_vars['Tools']['SevenZip'], 'e', '-aos', '-bso0', '-bse0', - '-p{ArchivePassword}'.format(**global_vars), - '-o{dist_path}'.format(dist_path=dist_path), - source_path] - run_program(cmd) - - -def install_libreoffice( - quickstart=True, register_mso_types=True, - use_mso_formats=False, vcredist=False): - """Install LibreOffice using specified settings.""" - cmd = [ - 'msiexec', '/passive', '/norestart', - '/i', r'{}\Installers\Extras\Office\LibreOffice.msi'.format( - global_vars['BaseDir']), - 'REBOOTYESNO=No', - 'ISCHECKFORPRODUCTUPDATES=0', - 'QUICKSTART={}'.format(1 if quickstart else 0), - 'UI_LANGS=en_US', - 'VC_REDIST={}'.format(1 if vcredist else 0), - ] - if register_mso_types: - cmd.append('REGISTER_ALL_MSO_TYPES=1') - else: - cmd.append('REGISTER_NO_MSO_TYPES=1') - xcu_dir = r'{APPDATA}\LibreOffice\4\user'.format(**global_vars['Env']) - xcu_file = r'{}\registrymodifications.xcu'.format(xcu_dir) - - # Set default save format - if use_mso_formats and not os.path.exists(xcu_file): - os.makedirs(xcu_dir, exist_ok=True) - with open(xcu_file, 'w', encoding='utf-8', newline='\n') as f: - f.write(LIBREOFFICE_XCU_DATA) - - # Install LibreOffice - run_program(cmd, check=True) - -def install_ninite_bundle( - # pylint: disable=too-many-arguments,too-many-branches - base=True, - browsers_only=False, - libreoffice=False, - missing=False, - mse=False, - standard=True, - ): - """Run Ninite installer(s), returns list of Popen objects.""" - popen_objects = [] - if browsers_only: - # This option is deprecated - installer_path = r'{BaseDir}\Installers\Extras\Web Browsers'.format( - **global_vars) - scan_for_browsers(silent=True) - for browser in ('Google Chrome', 'Mozilla Firefox', 'Opera Chromium'): - if is_installed(browser): - cmd = r'{}\{}.exe'.format(installer_path, browser) - popen_objects.append(popen_program(cmd)) - - # Bail - return popen_objects - - # Main selections - main_selections = [] - if base: - main_selections.append('base') - if standard: - if global_vars['OS']['Version'] in ('8', '8.1', '10'): - main_selections.append('standard') - else: - main_selections.append('standard7') - if main_selections: - # Only run if base and/or standard are enabled - cmd = r'{}\Installers\Extras\Bundles\{}.exe'.format( - global_vars['BaseDir'], - '-'.join(main_selections), - ) - popen_objects.append(popen_program([cmd])) - - # Extra selections - extra_selections = {} - for cmd in find_current_software(): - extra_selections[cmd] = True - if missing: - for cmd in find_missing_software(): - extra_selections[cmd] = True - - # Remove overlapping selections - regex = [] - for n_name, n_group in NINITE_REGEX.items(): - if n_name in main_selections: - regex.extend(n_group) - regex = '({})'.format('|'.join(regex)) - extra_selections = { - cmd: True for cmd in extra_selections - if not re.search(regex, cmd, re.IGNORECASE) - } - - # Start extra selections - for cmd in extra_selections: - popen_objects.append(popen_program([cmd])) - - # Microsoft Security Essentials - if mse: - cmd = r'{}\Installers\Extras\Security\{}'.format( - global_vars['BaseDir'], - 'Microsoft Security Essentials.exe', - ) - popen_objects.append(popen_program([cmd])) - - # LibreOffice - if libreoffice: - cmd = r'{}\Installers\Extras\Office\{}'.format( - global_vars['BaseDir'], - 'LibreOffice.exe', - ) - popen_objects.append(popen_program([cmd])) - - # Done - return popen_objects - - -def install_vcredists(): - """Install all supported Visual C++ runtimes.""" - extract_item('_vcredists', silent=True) - prev_dir = os.getcwd() - try: - os.chdir(r'{BinDir}\_vcredists'.format(**global_vars)) - except FileNotFoundError: - # Ignored since the loop below will report the errors - pass - for vcr in VCR_REDISTS: - try_and_print(message=vcr['Name'], function=run_program, - cmd=vcr['Cmd'], other_results=OTHER_RESULTS) - - os.chdir(prev_dir) - - -# Misc -def open_device_manager(): - popen_program(['mmc', 'devmgmt.msc']) - - -def open_speedtest(): - popen_program(['start', '', 'https://fast.com'], shell=True) - - -def open_windows_activation(): - popen_program(['slui']) - - -def open_windows_updates(): - popen_program(['control', '/name', 'Microsoft.WindowsUpdate']) - - -def restart_explorer(): - """Restart Explorer.""" - kill_process('explorer.exe') - sleep(2) - kill_process('explorer.exe') - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/sw_diags.py b/scripts/wk.prev/functions/sw_diags.py deleted file mode 100644 index 1c5b943f..00000000 --- a/scripts/wk.prev/functions/sw_diags.py +++ /dev/null @@ -1,244 +0,0 @@ -# Wizard Kit: Functions - SW Diagnostics - -import ctypes - -from functions.common import * -from settings.sw_diags import * - - -def check_4k_alignment(show_alert=False): - """Check that all partitions are 4K aligned.""" - aligned = True - cmd = ['WMIC', 'partition', 'get', 'StartingOffset'] - offsets = [] - - # Get offsets - result = run_program(cmd, encoding='utf-8', errors='ignore', check=False) - offsets = result.stdout.splitlines() - - # Check offsets - for off in offsets: - off = off.strip() - if not off.isnumeric(): - # Skip - continue - - try: - aligned = aligned and int(off) % 4096 == 0 - except ValueError: - # Ignore, this check is low priority - pass - - # Show alert - if show_alert: - show_alert_box('One or more partitions are not 4K aligned') - raise Not4KAlignedError - - -def check_connection(): - """Check if the system is online and optionally abort the script.""" - while True: - result = try_and_print(message='Ping test...', function=ping, cs='OK') - if result['CS']: - break - if not ask('ERROR: System appears offline, try again?'): - if ask('Continue anyway?'): - break - else: - abort() - - -def check_os_support_status(): - """Check if current OS is supported.""" - msg = '' - outdated = False - unsupported = False - - # Check OS version/notes - os_info = global_vars['OS'].copy() - if os_info['Notes'] == 'unsupported': - msg = 'The installed version of Windows is no longer supported' - unsupported = True - elif os_info['Notes'] == 'preview build': - msg = 'Preview builds are not officially supported' - unsupported = True - elif os_info['Version'] == '10' and os_info['Notes'] == 'outdated': - msg = 'The installed version of Windows is outdated' - outdated = True - if 'Preview' not in msg: - msg += '\n\nPlease consider upgrading before continuing setup.' - - # Show alert - if outdated or unsupported: - show_alert_box(msg) - - # Raise exception if necessary - if outdated: - raise WindowsOutdatedError - if unsupported: - raise WindowsUnsupportedError - - -def check_secure_boot_status(show_alert=False): - """Checks UEFI Secure Boot status via PowerShell.""" - boot_mode = get_boot_mode() - cmd = ['PowerShell', '-Command', 'Confirm-SecureBootUEFI'] - result = run_program(cmd, check=False) - - # Check results - if result.returncode == 0: - out = result.stdout.decode() - if 'True' in out: - # It's on, do nothing - return - elif 'False' in out: - if show_alert: - show_alert_box('Secure Boot DISABLED') - raise SecureBootDisabledError - else: - if show_alert: - show_alert_box('Secure Boot status UNKNOWN') - raise SecureBootUnknownError - else: - if boot_mode != 'UEFI': - if (show_alert and - global_vars['OS']['Version'] in ('8', '8.1', '10')): - # OS supports Secure Boot - show_alert_box('Secure Boot DISABLED\n\nOS installed LEGACY') - raise OSInstalledLegacyError - else: - # Check error message - err = result.stderr.decode() - if 'Cmdlet not supported' in err: - if show_alert: - show_alert_box('Secure Boot UNAVAILABLE?') - raise SecureBootNotAvailError - else: - if show_alert: - show_alert_box('Secure Boot ERROR') - raise GenericError - - -def get_boot_mode(): - """Check if Windows is booted in UEFI or Legacy mode, returns str.""" - kernel = ctypes.windll.kernel32 - firmware_type = ctypes.c_uint() - - # Get value from kernel32 API - try: - kernel.GetFirmwareType(ctypes.byref(firmware_type)) - except: - # Just set to zero - firmware_type = ctypes.c_uint(0) - - # Set return value - type_str = 'Unknown' - if firmware_type.value == 1: - type_str = 'Legacy' - elif firmware_type.value == 2: - type_str = 'UEFI' - - return type_str - - -def run_autoruns(): - """Run AutoRuns in the background with VirusTotal checks enabled.""" - extract_item('Autoruns', filter='autoruns*', silent=True) - # Update AutoRuns settings before running - for path, settings in AUTORUNS_SETTINGS.items(): - winreg.CreateKey(HKCU, path) - with winreg.OpenKey(HKCU, path, access=winreg.KEY_WRITE) as key: - for name, value in settings.items(): - winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value) - popen_program(global_vars['Tools']['AutoRuns'], minimized=True) - - -def run_hwinfo_sensors(): - """Run HWiNFO sensors.""" - path = r'{BinDir}\HWiNFO'.format(**global_vars) - for bit in [32, 64]: - # Configure - source = r'{}\general.ini'.format(path) - dest = r'{}\HWiNFO{}.ini'.format(path, bit) - shutil.copy(source, dest) - with open(dest, 'a') as f: - f.write('SensorsOnly=1\n') - f.write('SummaryOnly=0\n') - popen_program(global_vars['Tools']['HWiNFO']) - - -def run_nircmd(*cmd): - """Run custom NirCmd.""" - extract_item('NirCmd', silent=True) - cmd = [global_vars['Tools']['NirCmd'], *cmd] - run_program(cmd, check=False) - - -def run_xmplay(): - """Run XMPlay to test audio.""" - extract_item('XMPlay', silent=True) - cmd = [global_vars['Tools']['XMPlay'], - r'{BinDir}\XMPlay\music.7z'.format(**global_vars)] - - # Unmute audio first - extract_item('NirCmd', silent=True) - run_nircmd('mutesysvolume', '0') - - # Open XMPlay - popen_program(cmd) - - -def run_hitmanpro(): - """Run HitmanPro in the background.""" - extract_item('HitmanPro', silent=True) - cmd = [ - global_vars['Tools']['HitmanPro'], - '/quiet', '/noinstall', '/noupload', - r'/log={LogDir}\Tools\HitmanPro.txt'.format(**global_vars)] - popen_program(cmd) - - -def run_process_killer(): - """Kill most running processes skipping those in the whitelist.txt.""" - # borrowed from TronScript (reddit.com/r/TronScript) - # credit to /u/cuddlychops06 - prev_dir = os.getcwd() - extract_item('ProcessKiller', silent=True) - os.chdir(r'{BinDir}\ProcessKiller'.format(**global_vars)) - run_program(['ProcessKiller.exe', '/silent'], check=False) - os.chdir(prev_dir) - - -def run_rkill(): - """Run RKill and cleanup afterwards.""" - extract_item('RKill', silent=True) - cmd = [ - global_vars['Tools']['RKill'], - '-s', '-l', r'{LogDir}\Tools\RKill.log'.format(**global_vars), - '-new_console:n', '-new_console:s33V'] - run_program(cmd, check=False) - wait_for_process('RKill') - - # RKill cleanup - desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env']) - if os.path.exists(desktop_path): - for item in os.scandir(desktop_path): - if re.search(r'^RKill', item.name, re.IGNORECASE): - dest = r'{LogDir}\Tools\{name}'.format( - name=dest, **global_vars) - dest = non_clobber_rename(dest) - shutil.move(item.path, dest) - - -def show_alert_box(message, title=None): - """Show Windows alert box with message.""" - if not title: - title = '{} Warning'.format(KIT_NAME_FULL) - message_box = ctypes.windll.user32.MessageBoxW - message_box(None, message, title, 0x00001030) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/threading.py b/scripts/wk.prev/functions/threading.py deleted file mode 100644 index dfac69c7..00000000 --- a/scripts/wk.prev/functions/threading.py +++ /dev/null @@ -1,47 +0,0 @@ -# Wizard Kit: Functions - Threading - -from threading import Thread -from queue import Queue, Empty - -# Classes -class NonBlockingStreamReader(): - """Class to allow non-blocking reads from a stream.""" - # Credits: - ## https://gist.github.com/EyalAr/7915597 - ## https://stackoverflow.com/a/4896288 - - def __init__(self, stream): - self.stream = stream - self.queue = Queue() - - def populate_queue(stream, queue): - """Collect lines from stream and put them in queue.""" - while True: - line = stream.read(1) - if line: - queue.put(line) - - self.thread = start_thread( - populate_queue, - args=(self.stream, self.queue)) - - def read(self, timeout=None): - try: - return self.queue.get(block = timeout is not None, - timeout = timeout) - except Empty: - return None - - -# Functions -def start_thread(function, args=[], daemon=True): - """Run function as thread in background, returns Thread object.""" - thread = Thread(target=function, args=args, daemon=daemon) - thread.start() - return thread - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/tmux.py b/scripts/wk.prev/functions/tmux.py deleted file mode 100644 index 8c6ad327..00000000 --- a/scripts/wk.prev/functions/tmux.py +++ /dev/null @@ -1,187 +0,0 @@ -# Wizard Kit: Functions - tmux - -from functions.common import * - - -def create_file(filepath): - """Create file if it doesn't exist.""" - if not os.path.exists(filepath): - with open(filepath, 'w') as f: - f.write('') - - -def tmux_capture_pane(pane_id=None): - """Capture text from target, or current, pane, returns str.""" - cmd = ['tmux', 'capture-pane', '-p'] - if pane_id: - cmd.extend(['-t', pane_id]) - text = '' - - # Capture - result = run_program(cmd, check=False, encoding='utf-8', errors='ignore') - text = result.stdout - - # Done - return str(text) - - -def tmux_get_pane_size(pane_id=None): - """Get target, or current, pane size, returns tuple.""" - x = -1 - y = -1 - cmd = ['tmux', 'display', '-p'] - if pane_id: - cmd.extend(['-t', pane_id]) - cmd.append('#{pane_width} #{pane_height}') - - # Run cmd and set x & y - result = run_program(cmd, check=False) - try: - x, y = result.stdout.decode().strip().split() - x = int(x) - y = int(y) - except Exception: - # Ignore and return unrealistic values - pass - - return (x, y) - - -def tmux_kill_all_panes(pane_id=None): - """Kill all tmux panes except the active pane or pane_id if specified.""" - cmd = ['tmux', 'kill-pane', '-a'] - if pane_id: - cmd.extend(['-t', pane_id]) - run_program(cmd, check=False) - - -def tmux_kill_pane(*panes): - """Kill tmux pane by id.""" - cmd = ['tmux', 'kill-pane', '-t'] - for pane_id in panes: - if not pane_id: - # Skip empty strings, None values, etc - continue - run_program(cmd+[pane_id], check=False) - - -def tmux_poll_pane(pane_id): - """Check if pane exists, returns bool.""" - cmd = ['tmux', 'list-panes', '-F', '#D'] - result = run_program(cmd, check=False) - panes = result.stdout.decode().splitlines() - return pane_id in panes - - -def tmux_resize_pane(pane_id=None, x=None, y=None, **kwargs): - """Resize pane to specific hieght or width.""" - if not x and not y: - raise Exception('Neither height nor width specified.') - - cmd = ['tmux', 'resize-pane'] - if pane_id: - # NOTE: If pane_id not specified then the current pane will be resized - cmd.extend(['-t', pane_id]) - if x: - cmd.extend(['-x', str(x)]) - elif y: - cmd.extend(['-y', str(y)]) - - run_program(cmd, check=False) - - -def tmux_split_window( - lines=None, percent=None, - behind=False, vertical=False, - follow=False, target_pane=None, - command=None, working_dir=None, - text=None, watch=None, watch_cmd='cat'): - """Run tmux split-window command and return pane_id as str.""" - # Bail early - if not lines and not percent: - raise Exception('Neither lines nor percent specified.') - if not command and not text and not watch: - raise Exception('No command, text, or watch file specified.') - - # Build cmd - cmd = ['tmux', 'split-window', '-PF', '#D'] - if behind: - cmd.append('-b') - if vertical: - cmd.append('-v') - else: - cmd.append('-h') - if not follow: - cmd.append('-d') - if lines is not None: - cmd.extend(['-l', str(lines)]) - elif percent is not None: - cmd.extend(['-p', str(percent)]) - if target_pane: - cmd.extend(['-t', str(target_pane)]) - - if working_dir: - cmd.extend(['-c', working_dir]) - if command: - cmd.extend(command) - elif text: - cmd.extend(['echo-and-hold "{}"'.format(text)]) - elif watch: - create_file(watch) - if watch_cmd == 'cat': - cmd.extend([ - 'watch', '--color', '--no-title', - '--interval', '1', - 'cat', watch]) - elif watch_cmd == 'tail': - cmd.extend(['tail', '-f', watch]) - - # Run and return pane_id - result = run_program(cmd) - return result.stdout.decode().strip() - - -def tmux_switch_client(target_session=None): - """Switch to target tmux session, or previous if none specified.""" - cmd = ['tmux', 'switch-client'] - if target_session: - cmd.extend(['-t', target_session]) - else: - # Switch to previous instead - cmd.append('-p') - - run_program(cmd, check=False) - - -def tmux_update_pane( - pane_id, command=None, working_dir=None, - text=None, watch=None, watch_cmd='cat'): - """Respawn with either a new command or new text.""" - # Bail early - if not command and not text and not watch: - raise Exception('No command, text, or watch file specified.') - - cmd = ['tmux', 'respawn-pane', '-k', '-t', pane_id] - if working_dir: - cmd.extend(['-c', working_dir]) - if command: - cmd.extend(command) - elif text: - cmd.extend(['echo-and-hold "{}"'.format(text)]) - elif watch: - create_file(watch) - if watch_cmd == 'cat': - cmd.extend([ - 'watch', '--color', '--no-title', - '--interval', '1', - 'cat', watch]) - elif watch_cmd == 'tail': - cmd.extend(['tail', '-f', watch]) - - run_program(cmd) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/update.py b/scripts/wk.prev/functions/update.py deleted file mode 100755 index 38f881d5..00000000 --- a/scripts/wk.prev/functions/update.py +++ /dev/null @@ -1,1013 +0,0 @@ -# Wizard Kit: Functions - Build / Update - -import requests - -from functions.data import * -from settings.launchers import * -from settings.music import * -from settings.sources import * - - -def compress_and_remove_item(item): - """Compress and delete an item unless an error is encountered.""" - try: - compress_item(item) - except: - raise GenericError - else: - remove_item(item.path) - - -def compress_item(item): - """Compress an item in a 7-Zip archive using the ARCHIVE_PASSWORD.""" - # Prep - prev_dir = os.getcwd() - dest = '{}.7z'.format(item.path) - wd = item.path - include_str = '*' - if os.path.isfile(wd): - wd = os.path.abspath(r'{}\{}'.format(wd, os.path.pardir)) - include_str = item.name - os.chdir(wd) - - # Compress - cmd = [ - global_vars['Tools']['SevenZip'], - 'a', dest, - '-t7z', '-mx=7', '-myx=7', '-ms=on', '-mhe', '-bso0', '-bse0', - '-p{}'.format(ARCHIVE_PASSWORD), - include_str, - ] - run_program(cmd) - - # Done - os.chdir(prev_dir) - - -def download_generic(out_dir, out_name, source_url): - """Downloads a file using requests.""" - ## Code based on this Q&A: https://stackoverflow.com/q/16694907 - ### Asked by: https://stackoverflow.com/users/427457/roman-podlinov - ### Edited by: https://stackoverflow.com/users/657427/christophe-roussy - ### Using answer: https://stackoverflow.com/a/39217788 - ### Answer from: https://stackoverflow.com/users/4323/john-zwinck - os.makedirs(out_dir, exist_ok=True) - out_path = '{}/{}'.format(out_dir, out_name) - try: - r = requests.get(source_url, stream=True) - with open(out_path, 'wb') as f: - shutil.copyfileobj(r.raw, f) - r.close() - except: - raise GenericError('Failed to download file.') - - -def download_to_temp(out_name, source_url): - """Download a file to the TmpDir.""" - download_generic(global_vars['TmpDir'], out_name, source_url) - - -def download_windows_updates(): - """Download stand alone Windows Update installers.""" - # Prep - dest = r'{}\Installers\Extras\Windows Updates'.format( - global_vars['BaseDir']) - - - # Download - for kb, v in WINDOWS_UPDATE_SOURCES.items(): - for winver, v2 in v.items(): - for arch, url in v2.items(): - name = 'KB{}-Windows{}-x{}.msu'.format(kb, winver, arch) - if not os.path.exists(r'{}\{}'.format(dest, name)): - download_generic(dest, name, url) - - -def extract_generic(source, dest, mode='x', sz_args=[]): - """Extract a file to a destination.""" - cmd = [ - global_vars['Tools']['SevenZip'], - mode, source, r'-o{}'.format(dest), - '-aoa', '-bso0', '-bse0', - ] - cmd.extend(sz_args) - run_program(cmd) - - -def extract_temp_to_bin(source, item, mode='x', sz_args=[]): - """Extract a file to the .bin folder.""" - source = r'{}\{}'.format(global_vars['TmpDir'], source) - dest = r'{}\{}'.format(global_vars['BinDir'], item) - extract_generic(source, dest, mode, sz_args) - - -def extract_temp_to_cbin(source, item, mode='x', sz_args=[]): - """Extract a file to the .cbin folder.""" - source = r'{}\{}'.format(global_vars['TmpDir'], source) - dest = r'{}\{}'.format(global_vars['CBinDir'], item) - include_path = r'{}\_include\{}'.format(global_vars['CBinDir'], item) - if os.path.exists(include_path): - shutil.copytree(include_path, dest) - extract_generic(source, dest, mode, sz_args) - - -def generate_launcher(section, name, options): - """Generate a launcher script.""" - # Prep - dest = r'{}\{}'.format(global_vars['BaseDir'], section) - if section == '(Root)': - dest = global_vars['BaseDir'] - full_path = r'{}\{}.cmd'.format(dest, name) - template = r'{}\Scripts\Launcher_Template.cmd'.format(global_vars['BinDir']) - - # Format options - f_options = {} - for opt in options.keys(): - # Values need to be a list to support the multi-line extra code sections - if opt == 'Extra Code': - f_options['rem EXTRA_CODE'] = options['Extra Code'] - elif re.search(r'^L_\w+', opt, re.IGNORECASE): - new_opt = 'set {}='.format(opt) - f_options[new_opt] = ['set {}={}'.format(opt, options[opt])] - - # Read template and update using f_options - out_text = [] - with open(template, 'r') as f: - for line in f.readlines(): - # Strip all lines to let Python handle/correct the CRLF endings - line = line.strip() - if line in f_options: - # Extend instead of append to support extra code sections - out_text.extend(f_options[line]) - else: - out_text.append(line) - - # Write file - os.makedirs(dest, exist_ok=True) - with open(full_path, 'w') as f: - # f.writelines(out_text) - f.write('\n'.join(out_text)) - - -def remove_item(item_path): - """Delete a file or folder.""" - if os.path.exists(item_path): - if os.path.isdir(item_path): - shutil.rmtree(item_path, ignore_errors=True) - else: - os.remove(item_path) - - -def remove_from_kit(item): - """Delete a file or folder from the .bin/.cbin folders.""" - item_locations = [] - for p in [global_vars['BinDir'], global_vars['CBinDir']]: - item_locations.append(r'{}\{}'.format(p, item)) - item_locations.append(r'{}\{}.7z'.format(p, item)) - item_locations.append(r'{}\_Drivers\{}'.format(p, item)) - item_locations.append(r'{}\_Drivers\{}.7z'.format(p, item)) - for item_path in item_locations: - remove_item(item_path) - - -def remove_from_temp(item): - """Delete a file or folder from the TmpDir folder.""" - item_path = r'{}\{}'.format(global_vars['TmpDir'], item) - remove_item(item_path) - - -def resolve_dynamic_url(source_url, regex): - """Scan source_url for a url using the regex provided; returns str.""" - # Load the download page - try: - download_page = requests.get(source_url) - except Exception: - # "Fail silently as the download_to_temp() function will catch it - return None - - # Scan for the url using the regex provided - url = None - for line in download_page.content.decode().splitlines(): - if re.search(regex, line): - url = line.strip() - url = re.sub(r'.*(a |)href="([^"]+)".*', r'\2', url) - url = re.sub(r".*(a |)href='([^']+)'.*", r'\2', url) - break - - # Return - return url - - -# Data Recovery -def update_testdisk(): - # Stop running processes - for exe in ['fidentify_win.exe', 'photorec_win.exe', - 'qphotorec_win.exe', 'testdisk_win.exe']: - kill_process(exe) - - # Remove existing folders - remove_from_kit('TestDisk') - - # Download - download_to_temp('testdisk_wip.zip', SOURCE_URLS['TestDisk']) - - # Extract files - extract_temp_to_cbin('testdisk_wip.zip', 'TestDisk') - dest = r'{}\TestDisk'.format(global_vars['CBinDir']) - for item in os.scandir(r'{}\testdisk-7.1-WIP'.format(dest)): - dest_item = '{}\{}'.format(dest, item.name) - if not os.path.exists(dest_item): - shutil.move(item.path, dest_item) - shutil.rmtree( - r'{}\TestDisk\testdisk-7.1-WIP'.format(global_vars['CBinDir'])) - - # Cleanup - remove_from_temp('testdisk_wip.zip') - - -# Data Transfers -def update_fastcopy(): - ## NOTE: Lives in .bin uncompressed - # Stop running processes - for process in ['FastCopy.exe', 'FastCopy64.exe']: - kill_process(process) - - # Remove existing folders - remove_from_kit('FastCopy') - - # Download installer - download_to_temp('FastCopy.exe', SOURCE_URLS['FastCopy']) - _installer = r'{}\FastCopy.exe'.format(global_vars['TmpDir']) - - # Extract 32-bit - _path32 = r'{}\FastCopy'.format(global_vars['BinDir']) - cmd = [ - _installer, - '/NOSUBDIR', '/DIR={}'.format(_path32), - '/EXTRACT32'] - run_program(cmd) - - # Extract 64-bit - _path64 = r'{}\FastCopyTmp'.format(global_vars['TmpDir']) - cmd = [ - _installer, - '/NOSUBDIR', '/DIR={}'.format(_path64), - '/EXTRACT64'] - run_program(cmd) - shutil.move( - r'{}\FastCopy.exe'.format(_path64), - r'{}\FastCopy64.exe'.format(_path32)) - - # Cleanup - remove_item(r'{}\setup.exe'.format(_path32)) - remove_item(_path64) - remove_from_temp('FastCopy.exe') - - -def update_wimlib(): - # Stop running processes - kill_process('wimlib-imagex.exe') - - # Remove existing folders - remove_from_kit('wimlib') - - # Download - download_to_temp('wimlib32.zip', SOURCE_URLS['wimlib32']) - download_to_temp('wimlib64.zip', SOURCE_URLS['wimlib64']) - - # Extract - extract_generic( - r'{}\wimlib32.zip'.format(global_vars['TmpDir']), - r'{}\wimlib\x32'.format(global_vars['CBinDir'])) - extract_generic( - r'{}\wimlib64.zip'.format(global_vars['TmpDir']), - r'{}\wimlib\x64'.format(global_vars['CBinDir'])) - - # Cleanup - remove_from_temp('wimlib32.zip') - remove_from_temp('wimlib64.zip') - - -def update_xyplorer(): - # Stop running processes - kill_process('XYplorerFree.exe') - - # Remove existing folders - remove_from_kit('XYplorerFree') - - # Download - download_to_temp('xyplorer_free.zip', SOURCE_URLS['XYplorerFree']) - - # Extract files - extract_temp_to_cbin('xyplorer_free.zip', 'XYplorerFree') - - # Cleanup - remove_from_temp('xyplorer_free.zip') - - -# Diagnostics -def update_aida64(): - # Stop running processes - kill_process('notepadplusplus.exe') - - # Remove existing folders - remove_from_kit('AIDA64') - - # Download - download_to_temp('aida64.zip', SOURCE_URLS['AIDA64']) - - # Extract files - extract_temp_to_cbin('aida64.zip', 'AIDA64') - - # Cleanup - remove_from_temp('aida64.zip') - - -def update_autoruns(): - # Stop running processes - kill_process('Autoruns.exe') - kill_process('Autoruns64.exe') - - # Remove existing folders - remove_from_kit('Autoruns') - - # Download - download_to_temp('Autoruns.zip', SOURCE_URLS['Autoruns']) - - # Extract files - extract_temp_to_cbin('Autoruns.zip', 'Autoruns') - - # Cleanup - remove_from_temp('Autoruns.zip') - - -def update_bleachbit(): - # Stop running processes - kill_process('bleachbit.exe') - - # Remove existing folders - remove_from_kit('BleachBit') - - # Download - download_to_temp('bleachbit.zip', SOURCE_URLS['BleachBit']) - download_to_temp('Winapp2.zip', SOURCE_URLS['Winapp2']) - - # Extract files - extract_temp_to_cbin('bleachbit.zip', 'BleachBit') - extract_generic( - r'{}\Winapp2.zip'.format(global_vars['TmpDir']), - r'{}\BleachBit\cleaners'.format(global_vars['CBinDir']), - mode='e', sz_args=[r'Winapp2-master\Non-CCleaner\Winapp2.ini']) - - # Move files into place - dest = r'{}\BleachBit'.format(global_vars['CBinDir']) - for item in os.scandir(r'{}\BleachBit-Portable'.format(dest)): - dest_item = '{}\{}'.format(dest, item.name) - if not os.path.exists(dest_item): - shutil.move(item.path, dest_item) - shutil.rmtree( - r'{}\BleachBit\BleachBit-Portable'.format(global_vars['CBinDir'])) - - # Cleanup - remove_from_temp('bleachbit.zip') - remove_from_temp('Winapp2.zip') - - -def update_bluescreenview(): - # Stop running processes - for exe in ['BlueScreenView.exe', 'BlueScreenView64.exe']: - kill_process(exe) - - # Remove existing folders - remove_from_kit('BlueScreenView') - - # Download - download_to_temp('bluescreenview32.zip', SOURCE_URLS['BlueScreenView32']) - download_to_temp('bluescreenview64.zip', SOURCE_URLS['BlueScreenView64']) - - # Extract files - extract_temp_to_cbin( - 'bluescreenview64.zip', 'BlueScreenView', sz_args=['BlueScreenView.exe']) - shutil.move( - r'{}\BlueScreenView\BlueScreenView.exe'.format(global_vars['CBinDir']), - r'{}\BlueScreenView\BlueScreenView64.exe'.format(global_vars['CBinDir'])) - extract_temp_to_cbin('bluescreenview32.zip', 'BlueScreenView') - - # Cleanup - remove_from_temp('bluescreenview32.zip') - remove_from_temp('bluescreenview64.zip') - - -def update_erunt(): - # Stop running processes - kill_process('ERUNT.EXE') - - # Remove existing folders - remove_from_kit('ERUNT') - - # Download - download_to_temp('erunt.zip', SOURCE_URLS['ERUNT']) - - # Extract files - extract_temp_to_cbin('erunt.zip', 'ERUNT') - - # Cleanup - remove_from_temp('erunt.zip') - - -def update_hitmanpro(): - # Stop running processes - for exe in ['HitmanPro.exe', 'HitmanPro64.exe']: - kill_process(exe) - - # Remove existing folders - remove_from_kit('HitmanPro') - - # Download - dest = r'{}\HitmanPro'.format(global_vars['CBinDir']) - download_generic(dest, 'HitmanPro.exe', SOURCE_URLS['HitmanPro32']) - download_generic(dest, 'HitmanPro64.exe', SOURCE_URLS['HitmanPro64']) - - -def update_hwinfo(): - ## NOTE: Lives in .bin uncompressed - # Stop running processes - for exe in ['HWiNFO32.exe', 'HWiNFO64.exe']: - kill_process(exe) - - # Download - download_to_temp('HWiNFO.zip', SOURCE_URLS['HWiNFO']) - - # Extract files - extract_temp_to_bin('HWiNFO.zip', 'HWiNFO') - - # Cleanup - remove_from_temp('HWiNFO.zip') - - -def update_nircmd(): - # Stop running processes - for exe in ['nircmdc.exe', 'nircmdc64.exe']: - kill_process(exe) - - # Remove existing folders - remove_from_kit('NirCmd') - - # Download - download_to_temp('nircmd32.zip', SOURCE_URLS['NirCmd32']) - download_to_temp('nircmd64.zip', SOURCE_URLS['NirCmd64']) - - # Extract files - extract_temp_to_cbin('nircmd64.zip', 'NirCmd', sz_args=['nircmdc.exe']) - shutil.move( - r'{}\NirCmd\nircmdc.exe'.format(global_vars['CBinDir']), - r'{}\NirCmd\nircmdc64.exe'.format(global_vars['CBinDir'])) - extract_temp_to_cbin('nircmd32.zip', 'NirCmd', sz_args=['nircmdc.exe']) - - # Cleanup - remove_from_temp('nircmd32.zip') - remove_from_temp('nircmd64.zip') - - -def update_produkey(): - # Stop running processes - for exe in ['ProduKey.exe', 'ProduKey64.exe']: - kill_process(exe) - - # Remove existing folders - remove_from_kit('ProduKey') - - # Download - download_to_temp('produkey32.zip', SOURCE_URLS['ProduKey32']) - download_to_temp('produkey64.zip', SOURCE_URLS['ProduKey64']) - - # Extract files - extract_temp_to_cbin('produkey64.zip', 'ProduKey', sz_args=['ProduKey.exe']) - shutil.move( - r'{}\ProduKey\ProduKey.exe'.format(global_vars['CBinDir']), - r'{}\ProduKey\ProduKey64.exe'.format(global_vars['CBinDir'])) - extract_temp_to_cbin('produkey32.zip', 'ProduKey') - - # Cleanup - remove_from_temp('produkey32.zip') - remove_from_temp('produkey64.zip') - - -# Drivers -def update_intel_rst(): - # Remove existing folders - remove_from_kit('Intel RST') - - # Prep - dest = r'{}\_Drivers\Intel RST'.format(global_vars['CBinDir']) - include_path = r'{}\_include\_Drivers\Intel RST'.format( - global_vars['CBinDir']) - if os.path.exists(include_path): - shutil.copytree(include_path, dest) - - # Download - for name, url in RST_SOURCES.items(): - download_generic(dest, name, url) - - -def update_intel_ssd_toolbox(): - # Remove existing folders - remove_from_kit('Intel SSD Toolbox.exe') - - # Download - download_generic( - r'{}\_Drivers\Intel SSD Toolbox'.format(global_vars['CBinDir']), - 'Intel SSD Toolbox.exe', - SOURCE_URLS['Intel SSD Toolbox']) - - -def update_samsung_magician(): - # Remove existing folders - remove_from_kit('Samsung Magician.exe') - - # Download - download_to_temp('Samsung Magician.zip', SOURCE_URLS['Samsung Magician']) - - # Extract - extract_temp_to_cbin('Samsung Magician.zip', '_Drivers\Samsung Magician') - shutil.move( - r'{}\_Drivers\Samsung Magician\Samsung_Magician_Installer.exe'.format( - global_vars['CBinDir']), - r'{}\_Drivers\Samsung Magician\Samsung Magician.exe'.format( - global_vars['CBinDir'])) - - # Cleanup - remove_from_temp('Samsung Magician.zip') - - -def update_sdi_origin(): - # Download aria2 - download_to_temp('aria2.zip', SOURCE_URLS['aria2']) - aria_source = r'{}\aria2.zip'.format(global_vars['TmpDir']) - aria_dest = r'{}\aria2'.format(global_vars['TmpDir']) - aria = r'{}\aria2c.exe'.format(aria_dest) - extract_generic(aria_source, aria_dest, mode='e') - - # Prep for torrent download - download_to_temp('sdio.torrent', SOURCE_URLS['SDIO Torrent']) - sdio_torrent = r'{}\sdio.torrent'.format(global_vars['TmpDir']) - out = run_program([aria, sdio_torrent, '-S']) - indexes = [] - for line in out.stdout.decode().splitlines(): - r = re.search(r'^\s*(\d+)\|(.*)', line) - if (r and not re.search( - r'(\.(bat|inf)|Video|Server|Printer|XP)', line, re.IGNORECASE)): - indexes.append(int(r.group(1))) - indexes = [str(i) for i in sorted(indexes)] - - # Download SDI Origin - cmd = [ - aria, - '--select-file={}'.format(','.join(indexes)), - '-d', aria_dest, - '--seed-time=0', - sdio_torrent, - '-new_console:n', '-new_console:s33V', - ] - run_program(cmd, pipe=False, check=False, shell=True) - sleep(1) - wait_for_process('aria2c') - - # Download SDI Origin extra themes - download_to_temp('sdio_themes.zip', SOURCE_URLS['SDIO Themes']) - theme_source = r'{}\sdio_themes.zip'.format(global_vars['TmpDir']) - theme_dest = r'{}\SDIO_Update\tools\SDI\themes'.format(aria_dest) - extract_generic(theme_source, theme_dest) - - # Move files into place - for item in os.scandir(r'{}\SDIO_Update'.format(aria_dest)): - dest_item = '{}\_Drivers\SDIO\{}'.format( - global_vars['BinDir'], item.name) - r = re.search(r'^SDIO_x?(64|)_?R.*exe$', item.name, re.IGNORECASE) - if r: - dest_item = dest_item.replace(item.name, 'SDIO{}.exe'.format( - r.group(1))) - if (not os.path.exists(dest_item) - and not re.search(r'\.(inf|bat)$', item.name, re.IGNORECASE)): - shutil.move(item.path, dest_item) - - # Cleanup - remove_from_temp('aria2') - remove_from_temp('aria2.zip') - remove_from_temp('sdio.torrent') - remove_from_temp('sdio_themes.zip') - - -# Installers -def update_adobe_reader_dc(): - # Prep - dest = r'{}\Installers\Extras\Office'.format( - global_vars['BaseDir']) - - # Remove existing installer - try: - os.remove(r'{}\Adobe Reader DC.exe'.format(dest)) - except FileNotFoundError: - pass - - # Download - download_generic( - dest, 'Adobe Reader DC.exe', SOURCE_URLS['Adobe Reader DC']) - - -def update_libreoffice(): - # Prep - dest = r'{}\Installers\Extras\Office'.format( - global_vars['BaseDir']) - - # Remove existing installer - try: - os.remove(r'{}\LibreOffice.msi'.format(dest)) - except FileNotFoundError: - pass - - # Download - download_generic( - dest, 'LibreOffice.msi', SOURCE_URLS['LibreOffice']) - - -def update_macs_fan_control(): - # Prep - dest = r'{}\Installers'.format( - global_vars['BaseDir']) - - # Remove existing installer - try: - os.remove(r'{}\Macs Fan Control.exe'.format(dest)) - except FileNotFoundError: - pass - - # Download - download_generic( - dest, 'Macs Fan Control.exe', SOURCE_URLS['Macs Fan Control']) - - -def update_office(): - # Remove existing folders - remove_from_kit('_Office') - - # Prep - dest = r'{}\_Office'.format(global_vars['CBinDir']) - include_path = r'{}\_include\_Office'.format(global_vars['CBinDir']) - if os.path.exists(include_path): - shutil.copytree(include_path, dest) - - # Download and extract - _out_path = r'{}\odt'.format(global_vars['TmpDir']) - download_to_temp('odt.exe', SOURCE_URLS['Office Deployment Tool']) - cmd = [ - r'{}\odt.exe'.format(global_vars['TmpDir']), - r'/extract:{}'.format(_out_path), - '/quiet', - ] - run_program(cmd) - shutil.move( - r'{}\setup.exe'.format(_out_path), - r'{}\_Office'.format(global_vars['CBinDir'])) - - # Cleanup - remove_from_temp('odt') - remove_from_temp('odt.exe') - - -def update_classic_start_skin(): - # Remove existing folders - remove_from_kit('ClassicStartSkin') - - # Download - download_generic( - r'{}\ClassicStartSkin'.format(global_vars['CBinDir']), - 'Metro-Win10-Black.skin7', - SOURCE_URLS['ClassicStartSkin']) - - -def update_vcredists(): - # Remove existing folders - remove_from_kit('_vcredists') - - # Prep - dest = r'{}\_vcredists'.format(global_vars['CBinDir']) - include_path = r'{}\_include\_vcredists'.format(global_vars['CBinDir']) - if os.path.exists(include_path): - shutil.copytree(include_path, dest) - - # Download - for year in VCREDIST_SOURCES.keys(): - for bit in ['32', '64']: - dest = r'{}\_vcredists\{}\x{}'.format( - global_vars['CBinDir'], year, bit) - download_generic( - dest, - 'vcredist.exe', - VCREDIST_SOURCES[year][bit]) - - -def update_one_ninite(section, dest, name, url, indent=8, width=40): - # Prep - url = 'https://ninite.com/{}/ninite.exe'.format(url) - - # Download - download_generic(out_dir=dest, out_name=name, source_url=url) - - # Copy to Installers folder - installer_parent = r'{}\Installers\Extras\{}'.format( - global_vars['BaseDir'], section) - installer_dest = r'{}\{}'.format(installer_parent, name) - os.makedirs(installer_parent, exist_ok=True) - if os.path.exists(installer_dest): - remove_item(installer_dest) - shutil.copy(r'{}\{}'.format(dest, name), installer_dest) - - -def update_all_ninite(indent=8, width=40, other_results={}): - print_info('{}Ninite'.format(' '*int(indent/2))) - for section in sorted(NINITE_SOURCES.keys()): - print_success('{}{}'.format(' '*int(indent/4*3), section)) - dest = r'{}\_Ninite\{}'.format(global_vars['CBinDir'], section) - for name, url in sorted(NINITE_SOURCES[section].items()): - try_and_print(message=name, function=update_one_ninite, - other_results=other_results, indent=indent, width=width, - section=section, dest=dest, name=name, url=url) - - -# Misc -def update_caffeine(): - # Stop running processes - kill_process('caffeine.exe') - - # Remove existing folders - remove_from_kit('Caffeine') - - # Download - download_to_temp('caffeine.zip', SOURCE_URLS['Caffeine']) - - # Extract files - extract_temp_to_cbin('caffeine.zip', 'Caffeine') - - # Cleanup - remove_from_temp('caffeine.zip') - - -def update_du(): - # Stop running processes - kill_process('du.exe') - kill_process('du64.exe') - - # Remove existing folders - remove_from_kit('Du') - - # Download - download_to_temp('du.zip', SOURCE_URLS['Du']) - - # Extract files - extract_temp_to_cbin('du.zip', 'Du') - - # Cleanup - remove_from_temp('du.zip') - - -def update_everything(): - # Stop running processes - for exe in ['Everything.exe', 'Everything64.exe']: - kill_process(exe) - - # Remove existing folders - remove_from_kit('Everything') - - # Download - download_to_temp('everything32.zip', SOURCE_URLS['Everything32']) - download_to_temp('everything64.zip', SOURCE_URLS['Everything64']) - - # Extract files - extract_temp_to_cbin( - 'everything64.zip', 'Everything', sz_args=['Everything.exe']) - shutil.move( - r'{}\Everything\Everything.exe'.format(global_vars['CBinDir']), - r'{}\Everything\Everything64.exe'.format(global_vars['CBinDir'])) - extract_temp_to_cbin('everything32.zip', 'Everything') - - # Cleanup - remove_from_temp('everything32.zip') - remove_from_temp('everything64.zip') - - -def update_firefox_ublock_origin(): - # Remove existing folders - remove_from_kit('FirefoxExtensions') - - # Download - download_generic( - r'{}\FirefoxExtensions'.format(global_vars['CBinDir']), - 'ublock_origin.xpi', - SOURCE_URLS['Firefox uBO']) - - -def update_notepadplusplus(): - # Stop running processes - kill_process('notepadplusplus.exe') - - # Remove existing folders - remove_from_kit('NotepadPlusPlus') - - # Download - download_to_temp('npp.7z', SOURCE_URLS['NotepadPlusPlus']) - - # Extract files - extract_temp_to_cbin('npp.7z', 'NotepadPlusPlus') - shutil.move( - r'{}\NotepadPlusPlus\notepad++.exe'.format(global_vars['CBinDir']), - r'{}\NotepadPlusPlus\notepadplusplus.exe'.format(global_vars['CBinDir']) - ) - - # Cleanup - remove_from_temp('npp.7z') - - -def update_putty(): - # Stop running processes - kill_process('PUTTY.EXE') - - # Remove existing folders - remove_from_kit('PuTTY') - - # Download - download_to_temp('putty.zip', SOURCE_URLS['PuTTY']) - - # Extract files - extract_temp_to_cbin('putty.zip', 'PuTTY') - - # Cleanup - remove_from_temp('putty.zip') - - -def update_wiztree(): - # Stop running processes - for process in ['WizTree.exe', 'WizTree64.exe']: - kill_process(process) - - # Remove existing folders - remove_from_kit('WizTree') - - # Download - download_to_temp( - 'wiztree.zip', SOURCE_URLS['WizTree']) - - # Extract files - extract_temp_to_cbin('wiztree.zip', 'WizTree') - ## NOTE: It's double-zipped for some reason? - extract_generic( - r'{}\WizTree\wiztree'.format(global_vars['CBinDir']), - r'{}\WizTree'.format(global_vars['CBinDir'])) - - # Cleanup - remove_item(r'{}\WizTree\wiztree'.format(global_vars['CBinDir'])) - remove_from_temp('wiztree.zip') - - -def update_xmplay(): - # Stop running processes - kill_process('xmplay.exe') - - # Remove existing folders - remove_from_kit('XMPlay') - - # Download - download_to_temp('xmplay.zip', SOURCE_URLS['XMPlay']) - download_to_temp('xmp-7z.zip', SOURCE_URLS['XMPlay 7z']) - download_to_temp('xmp-gme.zip', SOURCE_URLS['XMPlay Game']) - download_to_temp('xmp-rar.zip', SOURCE_URLS['XMPlay RAR']) - download_to_temp('WAModern.zip', SOURCE_URLS['XMPlay WAModern']) - - # Extract files - extract_temp_to_cbin('xmplay.zip', 'XMPlay', - mode='e', sz_args=['xmplay.exe', 'xmplay.txt']) - for item in ['xmp-7z', 'xmp-gme', 'xmp-rar', 'WAModern']: - filter = [] - if item == 'WAModern': - filter.append('WAModern NightVision.xmpskin') - extract_generic( - r'{}\{}.zip'.format(global_vars['TmpDir'], item), - r'{}\XMPlay\plugins'.format(global_vars['CBinDir']), - mode='e', sz_args=filter) - - # Download Music - dest = r'{}\XMPlay\music_tmp\MOD'.format(global_vars['CBinDir']) - for mod in MUSIC_MOD: - name = mod.split('#')[-1] - url = 'https://api.modarchive.org/downloads.php?moduleid={}'.format(mod) - download_generic(dest, name, url) - dest = r'{}\XMPlay\music_tmp\SNES'.format(global_vars['CBinDir']) - for game in MUSIC_SNES: - name = '{}.rsn'.format(game) - url = 'http://snesmusic.org/v2/download.php?spcNow={}'.format(game) - download_generic(dest, name, url) - - # Compress Music - cmd = [ - global_vars['Tools']['SevenZip'], - 'a', r'{}\XMPlay\music.7z'.format(global_vars['CBinDir']), - '-t7z', '-mx=9', '-bso0', '-bse0', - r'{}\XMPlay\music_tmp\*'.format(global_vars['CBinDir']), - ] - run_program(cmd) - - # Cleanup - remove_item(r'{}\XMPlay\music_tmp'.format(global_vars['CBinDir'])) - remove_from_temp('xmplay.zip') - remove_from_temp('xmp-7z.zip') - remove_from_temp('xmp-gme.zip') - remove_from_temp('xmp-rar.zip') - remove_from_temp('WAModern.zip') - - -# Repairs -def update_adwcleaner(): - # Stop running processes - kill_process('AdwCleaner.exe') - - # Remove existing folders - remove_from_kit('AdwCleaner') - - # Download - download_generic( - r'{}\AdwCleaner'.format(global_vars['CBinDir']), - 'AdwCleaner.exe', - SOURCE_URLS['AdwCleaner']) - - -def update_kvrt(): - # Stop running processes - kill_process('KVRT.exe') - - # Remove existing folders - remove_from_kit('KVRT') - - # Download - download_generic( - r'{}\KVRT'.format(global_vars['CBinDir']), - 'KVRT.exe', - SOURCE_URLS['KVRT']) - - -def update_rkill(): - # Stop running processes - kill_process('RKill.exe') - - # Remove existing folders - remove_from_kit('RKill') - - # Download - url = resolve_dynamic_url( - SOURCE_URLS['RKill'], - 'href.*rkill\.exe') - download_generic( - r'{}\RKill'.format(global_vars['CBinDir']), 'RKill.exe', url) - - -def update_tdsskiller(): - # Stop running processes - kill_process('TDSSKiller.exe') - - # Remove existing folders - remove_from_kit('TDSSKiller') - - # Download - download_generic( - r'{}\TDSSKiller'.format(global_vars['CBinDir']), - 'TDSSKiller.exe', - SOURCE_URLS['TDSSKiller']) - - -# Uninstallers -def update_iobit_uninstaller(): - # Stop running processes - kill_process('IObitUninstallerPortable.exe') - - # Remove existing folders - remove_from_kit('IObitUninstallerPortable') - - # Download - download_generic( - global_vars['CBinDir'], - 'IObitUninstallerPortable.exe', - SOURCE_URLS['IOBit_Uninstaller']) - - # "Install" - cmd = r'{}\IObitUninstallerPortable.exe'.format(global_vars['CBinDir']) - popen_program(cmd) - sleep(1) - wait_for_process('IObitUninstallerPortable') - - # Cleanup - remove_from_kit('IObitUninstallerPortable.exe') - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/windows_setup.py b/scripts/wk.prev/functions/windows_setup.py deleted file mode 100644 index eabaac40..00000000 --- a/scripts/wk.prev/functions/windows_setup.py +++ /dev/null @@ -1,220 +0,0 @@ -# Wizard Kit: Functions - Windows Setup - -from functions.data import * -from functions.disk import * -from settings.windows_setup import * - - -def find_windows_image(windows_version): - """Search for a Windows source image file, returns dict. - - Searches on local disks and then the WINDOWS_SERVER share.""" - image = {} - imagefile = windows_version['Image File'] - imagename = windows_version['Image Name'] - - # Search local source - set_thread_error_mode(silent=True) # Prevents "No disk" popups - for d in psutil.disk_partitions(): - for ext in ['esd', 'wim', 'swm']: - path = '{}images\{}.{}'.format(d.mountpoint, imagefile, ext) - if os.path.isfile(path) and wim_contains_image(path, imagename): - image['Path'] = path - image['Letter'] = d.mountpoint[:1].upper() - image['Local'] = True - if ext == 'swm': - image['Glob'] = '--ref="{}*.swm"'.format(image['Path'][:-4]) - break - set_thread_error_mode(silent=False) # Return to normal - - # Check for network source - if not image: - mount_windows_share() - if WINDOWS_SERVER['Mounted']: - for ext in ['esd', 'wim', 'swm']: - path = r'\\{}\{}\images\{}.{}'.format( - WINDOWS_SERVER['IP'], - WINDOWS_SERVER['Share'], - imagefile, - ext) - if os.path.isfile(path) and wim_contains_image(path, imagename): - image['Path'] = path - image['Letter'] = None - image['Local'] = False - if ext == 'swm': - image['Glob'] = '--ref="{}*.swm"'.format( - image['Path'][:-4]) - break - - # Display image to be used (if any) and return - if image: - print_info('Using image: {}'.format(image['Path'])) - return image - else: - print_error('Failed to find Windows source image for {}'.format( - windows_version['Name'])) - raise GenericAbort - - -def format_disk(disk, use_gpt): - """Format disk for use as a Windows OS disk.""" - if use_gpt: - format_gpt(disk) - else: - format_mbr(disk) - - -def format_gpt(disk): - """Format disk for use as a Windows OS disk using the GPT layout.""" - script = [ - # Partition table - 'select disk {}'.format(disk['Number']), - 'clean', - 'convert gpt', - - # System partition - # NOTE: ESP needs to be >= 260 for Advanced Format 4K disks - 'create partition efi size=500', - 'format quick fs=fat32 label="System"', - 'assign letter="S"', - - # Microsoft Reserved (MSR) partition - 'create partition msr size=128', - - # Windows partition - 'create partition primary', - 'format quick fs=ntfs label="Windows"', - 'assign letter="W"', - - # Recovery Tools partition - 'shrink minimum=500', - 'create partition primary', - 'format quick fs=ntfs label="Recovery Tools"', - 'assign letter="T"', - 'set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"', - 'gpt attributes=0x8000000000000001', - ] - - # Run - run_diskpart(script) - - -def format_mbr(disk): - """Format disk for use as a Windows OS disk using the MBR layout.""" - script = [ - # Partition table - 'select disk {}'.format(disk['Number']), - 'clean', - - # System partition - 'create partition primary size=100', - 'format fs=ntfs quick label="System Reserved"', - 'active', - 'assign letter="S"', - - # Windows partition - 'create partition primary', - 'format fs=ntfs quick label="Windows"', - 'assign letter="W"', - - # Recovery Tools partition - 'shrink minimum=500', - 'create partition primary', - 'format quick fs=ntfs label="Recovery"', - 'assign letter="T"', - 'set id=27', - ] - - # Run - run_diskpart(script) - - -def mount_windows_share(): - """Mount the Windows images share unless already mounted.""" - if not WINDOWS_SERVER['Mounted']: - # Mounting read-write in case a backup was done in the same session - # and the server was left mounted read-write. This avoids throwing an - # error by trying to mount the same server with multiple credentials. - mount_network_share(WINDOWS_SERVER, read_write=True) - - -def select_windows_version(): - """Select Windows version from a menu, returns dict.""" - actions = [ - {'Name': 'Main Menu', 'Letter': 'M'}, - ] - - # Menu loop - selection = menu_select( - title = 'Which version of Windows are we installing?', - main_entries = WINDOWS_VERSIONS, - action_entries = actions) - - if selection.isnumeric(): - return WINDOWS_VERSIONS[int(selection)-1] - elif selection == 'M': - raise GenericAbort - - -def setup_windows(windows_image, windows_version): - """Apply a Windows image to W:""" - cmd = [ - global_vars['Tools']['wimlib-imagex'], - 'apply', - windows_image['Path'], - windows_version['Image Name'], - 'W:\\'] - if 'Glob' in windows_image: - cmd.extend(windows_image['Glob']) - run_program(cmd) - - -def setup_windows_re(windows_version, windows_letter='W', tools_letter='T'): - """Setup the WinRE partition.""" - win = r'{}:\Windows'.format(windows_letter) - winre = r'{}\System32\Recovery\WinRE.wim'.format(win) - dest = r'{}:\Recovery\WindowsRE'.format(tools_letter) - - # Copy WinRE.wim - os.makedirs(dest, exist_ok=True) - shutil.copy(winre, r'{}\WinRE.wim'.format(dest)) - - # Set location - cmd = [ - r'{}\System32\ReAgentc.exe'.format(win), - '/setreimage', - '/path', dest, - '/target', win] - run_program(cmd) - - -def update_boot_partition(system_letter='S', windows_letter='W', mode='ALL'): - """Setup the Windows boot partition.""" - cmd = [ - r'{}\Windows\System32\bcdboot.exe'.format( - global_vars['Env']['SYSTEMDRIVE']), - r'{}:\Windows'.format(windows_letter), - '/s', '{}:'.format(system_letter), - '/f', mode] - run_program(cmd) - - -def wim_contains_image(filename, imagename): - """Check if an ESD/WIM contains the specified image, returns bool.""" - cmd = [ - global_vars['Tools']['wimlib-imagex'], - 'info', - filename, - imagename] - try: - run_program(cmd) - except subprocess.CalledProcessError: - return False - - return True - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/windows_updates.py b/scripts/wk.prev/functions/windows_updates.py deleted file mode 100644 index 3618fbb2..00000000 --- a/scripts/wk.prev/functions/windows_updates.py +++ /dev/null @@ -1,143 +0,0 @@ -# Wizard Kit: Functions - Windows updates - -from functions.common import * - - -# Functions -def delete_folder(folder_path): - """Near-useless wrapper for shutil.rmtree.""" - shutil.rmtree(folder_path) - - -def disable_service(service_name): - """Set service startup to disabled.""" - run_program(['sc', 'config', service_name, 'start=', 'disabled']) - - # Verify service was disabled - start_type = get_service_start_type(service_name) - if not start_type.lower().startswith('disabled'): - raise GenericError('Failed to disable service {}'.format(service_name)) - - -def disable_windows_updates(): - """Disable windows updates and clear SoftwareDistribution folder.""" - indent=2 - width=52 - update_folders = [ - r'{WINDIR}\SoftwareDistribution'.format(**global_vars['Env']), - r'{SYSTEMDRIVE}\$WINDOWS.~BT'.format(**global_vars['Env']), - ] - - for service in ('wuauserv', 'bits'): - # Stop service - result = try_and_print( - 'Stopping service {}...'.format(service), - indent=indent, width=width, - function=stop_service, service_name=service) - if not result['CS']: - result = try_and_print( - 'Stopping service {}...'.format(service), - indent=indent, width=width, - function=stop_service, service_name=service) - if not result['CS']: - raise GenericError('Service {} could not be stopped.'.format(service)) - - # Disable service - result = try_and_print( - 'Disabling service {}...'.format(service), - indent=indent, width=width, - function=disable_service, service_name=service) - if not result['CS']: - result = try_and_print( - 'Disabling service {}...'.format(service), - indent=indent, width=width, - function=disable_service, service_name=service) - if not result['CS']: - raise GenericError('Service {} could not be disabled.'.format(service)) - - # Delete update folders - for folder_path in update_folders: - if os.path.exists(folder_path): - result = try_and_print( - 'Deleting folder {}...'.format(folder_path), - indent=indent, width=width, - function=delete_folder, folder_path=folder_path) - if not result['CS']: - raise GenericError('Failed to remove folder {}'.format(folder_path)) - - -def enable_service(service_name, start_type='auto'): - """Enable service by setting start type.""" - run_program(['sc', 'config', service_name, 'start=', start_type]) - - -def enable_windows_updates(silent=False): - """Enable windows updates""" - indent=2 - width=52 - - for service in ('bits', 'wuauserv'): - # Enable service - start_type = 'auto' - if service == 'wuauserv': - start_type = 'demand' - if silent: - try: - enable_service(service, start_type=start_type) - except Exception: - # Try again - enable_service(service, start_type=start_type) - else: - result = try_and_print( - 'Enabling service {}...'.format(service), - indent=indent, width=width, - function=enable_service, service_name=service, start_type=start_type) - if not result['CS']: - result = try_and_print( - 'Enabling service {}...'.format(service), - indent=indent, width=width, - function=enable_service, service_name=service, start_type=start_type) - if not result['CS']: - raise GenericError('Service {} could not be enabled.'.format(service)) - - -def get_service_status(service_name): - """Get service status using psutil, returns str.""" - status = 'Unknown' - try: - service = psutil.win_service_get(service_name) - status = service.status() - except psutil.NoSuchProcess: - # Ignore and return 'Unknown' below - pass - - return status - - -def get_service_start_type(service_name): - """Get service startup type using psutil, returns str.""" - start_type = 'Unknown' - try: - service = psutil.win_service_get(service_name) - start_type = service.start_type() - except psutil.NoSuchProcess: - # Ignore and return 'Unknown' below - pass - - return start_type - - -def stop_service(service_name): - """Stop service.""" - run_program(['net', 'stop', service_name], check=False) - - # Verify service was stopped - status = get_service_status(service_name) - if not status.lower().startswith('stopped'): - raise GenericError('Failed to stop service {}'.format(service_name)) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/functions/winpe_menus.py b/scripts/wk.prev/functions/winpe_menus.py deleted file mode 100644 index 08622e4e..00000000 --- a/scripts/wk.prev/functions/winpe_menus.py +++ /dev/null @@ -1,435 +0,0 @@ -# Wizard Kit: WinPE Menus - -from functions.backup import * -from functions.disk import * -from functions.windows_setup import * -from settings.winpe import * - - -def check_pe_tools(): - """Fix tool paths for WinPE layout.""" - for k in PE_TOOLS.keys(): - PE_TOOLS[k]['Path'] = r'{}\{}'.format( - global_vars['BinDir'], PE_TOOLS[k]['Path']) - global_vars['Tools']['wimlib-imagex'] = re.sub( - r'\\x(32|64)', - r'', - global_vars['Tools']['wimlib-imagex'], - re.IGNORECASE) - - -def menu_backup(): - """Take backup images of partition(s) in the WIM format.""" - errors = False - other_results = { - 'Error': { - 'CalledProcessError': 'Unknown Error', - 'PathNotFoundError': 'Missing', - }, - 'Warning': { - 'GenericAbort': 'Skipped', - 'GenericRepair': 'Repaired', - }} - set_title('{}: Backup Menu'.format(KIT_NAME_FULL)) - - # Set backup prefix - clear_screen() - print_standard('{}\n'.format(global_vars['Title'])) - 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(' ', '_') - - # Assign drive letters - try_and_print( - message = 'Assigning letters...', - function = assign_volume_letters, - other_results = other_results) - - # Mount backup shares - mount_backup_shares(read_write=True) - - # Select destination - destination = select_backup_destination(auto_select=False) - - # Scan disks - result = try_and_print( - message = 'Getting disk info...', - function = scan_disks, - other_results = other_results) - if result['CS']: - disks = result['Out'] - else: - print_error('ERROR: No disks found.') - raise GenericAbort - - # Select disk to backup - disk = select_disk('For which disk are we creating backups?', disks) - if not disk: - raise GenericAbort - - # "Prep" disk - prep_disk_for_backup(destination, disk, backup_prefix) - - # Display details for backup task - clear_screen() - print_info('Create Backup - Details:\n') - if ENABLED_TICKET_NUMBERS: - show_data(message='Ticket:', data=ticket_number) - show_data( - message = 'Source:', - data = '[{}] ({}) {} {}'.format( - disk.get('Table', ''), - disk.get('Type', ''), - disk.get('Name', 'Unknown'), - disk.get('Size', ''), - ), - ) - show_data( - message = 'Destination:', - data = destination.get('Display Name', destination['Name']), - ) - for par in disk['Partitions']: - message = 'Partition {}:'.format(par['Number']) - data = par['Display String'] - if par['Number'] in disk['Bad Partitions']: - show_data(message=message, data=data, width=30, warning=True) - if 'Error' in par: - show_data(message='', data=par['Error'], error=True) - elif par['Image Exists']: - show_data(message=message, data=data, width=30, info=True) - else: - show_data(message=message, data=data, width=30) - print_standard(disk['Backup Warnings']) - - # Ask to proceed - if (not ask('Proceed with backup?')): - raise GenericAbort - - # Backup partition(s) - print_info('\n\nStarting task.\n') - for par in disk['Partitions']: - result = try_and_print( - message = 'Partition {} Backup...'.format(par['Number']), - function = backup_partition, - other_results = other_results, - disk = disk, - par = par) - if not result['CS'] and not isinstance(result['Error'], GenericAbort): - errors = True - par['Error'] = result['Error'] - - # Verify backup(s) - if disk['Valid Partitions']: - print_info('\n\nVerifying backup images(s)\n') - for par in disk['Partitions']: - if par['Number'] in disk['Bad Partitions']: - continue # Skip verification - result = try_and_print( - message = 'Partition {} Image...'.format(par['Number']), - function = verify_wim_backup, - other_results = other_results, - partition = par) - if not result['CS']: - errors = True - par['Error'] = result['Error'] - - # Print summary - if errors: - print_warning('\nErrors were encountered and are detailed below.') - for par in [p for p in disk['Partitions'] if 'Error' in p]: - print_standard(' Partition {} Error:'.format(par['Number'])) - if hasattr(par['Error'], 'stderr'): - try: - par['Error'] = par['Error'].stderr.decode() - except: - # Deal with badly formatted error message - pass - try: - par['Error'] = par['Error'].splitlines() - par['Error'] = [line.strip() for line in par['Error']] - par['Error'] = [line for line in par['Error'] if line] - for line in par['Error']: - print_error('\t{}'.format(line)) - except: - print_error('\t{}'.format(par['Error'])) - else: - print_success('\nNo errors were encountered during imaging.') - if 'LogFile' in global_vars and ask('\nReview log?'): - cmd = [ - global_vars['Tools']['NotepadPlusPlus'], - global_vars['LogFile']] - try: - popen_program(cmd) - except Exception: - print_error('ERROR: Failed to open log.') - sleep(30) - pause('\nPress Enter to return to main menu... ') - - -def menu_root(): - """Main WinPE menu.""" - check_pe_tools() - menus = [ - {'Name': 'Create Backups', 'Menu': menu_backup}, - {'Name': 'Setup Windows', 'Menu': menu_setup}, - {'Name': 'Misc Tools', 'Menu': menu_tools}, - ] - actions = [ - {'Name': 'Command Prompt', 'Letter': 'C'}, - {'Name': 'Reboot', 'Letter': 'R'}, - {'Name': 'Shutdown', 'Letter': 'S'}, - ] - - # Main loop - while True: - set_title(KIT_NAME_FULL) - selection = menu_select( - title = 'Main Menu', - main_entries = menus, - action_entries = actions, - secret_exit = True) - - if (selection.isnumeric()): - try: - menus[int(selection)-1]['Menu']() - except GenericAbort: - print_warning('\nAborted\n') - pause('Press Enter to return to main menu... ') - elif (selection == 'C'): - run_program(['cmd', '-new_console:n'], check=False) - elif (selection == 'R'): - run_program(['wpeutil', 'reboot']) - elif (selection == 'S'): - run_program(['wpeutil', 'shutdown']) - else: - sys.exit() - - -def menu_setup(): - """Format a disk, apply a Windows image, and create boot files.""" - errors = False - other_results = { - 'Error': { - 'CalledProcessError': 'Unknown Error', - 'PathNotFoundError': 'Missing', - }, - 'Warning': { - 'GenericAbort': 'Skipped', - 'GenericRepair': 'Repaired', - }} - set_title('{}: Setup Menu'.format(KIT_NAME_FULL)) - - # Set ticket ID - clear_screen() - print_standard('{}\n'.format(global_vars['Title'])) - ticket_number = get_ticket_number() - - # Select the version of Windows to apply - windows_version = select_windows_version() - - # Find Windows image - # NOTE: Reassign volume letters to ensure all devices are scanned - try_and_print( - message = 'Assigning volume letters...', - function = assign_volume_letters, - other_results = other_results) - windows_image = find_windows_image(windows_version) - - # Scan disks - result = try_and_print( - message = 'Getting disk info...', - function = scan_disks, - other_results = other_results) - if result['CS']: - disks = result['Out'] - else: - print_error('ERROR: No disks found.') - raise GenericAbort - - # Select disk to use as the OS disk - dest_disk = select_disk('To which disk are we installing Windows?', disks) - if not dest_disk: - raise GenericAbort - - # "Prep" disk - prep_disk_for_formatting(dest_disk) - - # Display details for setup task - clear_screen() - print_info('Setup Windows - Details:\n') - if ENABLED_TICKET_NUMBERS: - show_data(message='Ticket:', data=ticket_number) - show_data(message='Installing:', data=windows_version['Name']) - show_data( - message = 'Boot Method:', - data = 'UEFI (GPT)' if dest_disk['Use GPT'] else 'Legacy (MBR)') - show_data(message='Using Image:', data=windows_image['Path']) - show_data( - message = 'ERASING:', - data = '[{}] ({}) {} {}\n'.format( - dest_disk.get('Table', ''), - dest_disk.get('Type', ''), - dest_disk.get('Name', 'Unknown'), - dest_disk.get('Size', ''), - ), - warning = True) - for par in dest_disk['Partitions']: - show_data( - message = 'Partition {}:'.format(par['Number']), - data = par['Display String'], - warning = True) - print_warning(dest_disk['Format Warnings']) - - if (not ask('Is this correct?')): - raise GenericAbort - - # Safety check - print_standard('\nSAFETY CHECK') - print_warning('All data will be DELETED from the ' - 'disk and partition(s) listed above.') - print_warning('This is irreversible and will lead ' - 'to {CLEAR}{RED}DATA LOSS.'.format(**COLORS)) - if (not ask('Asking again to confirm, is this correct?')): - raise GenericAbort - - # Remove volume letters so S, T, & W can be used below - try_and_print( - message = 'Removing volume letters...', - function = remove_volume_letters, - other_results = other_results, - keep=windows_image['Letter']) - - # Assign new letter for local source if necessary - if windows_image['Local'] and windows_image['Letter'] in ['S', 'T', 'W']: - new_letter = try_and_print( - message = 'Reassigning source volume letter...', - function = reassign_volume_letter, - other_results = other_results, - letter=windows_image['Letter']) - windows_image['Path'] = '{}{}'.format( - new_letter, windows_image['Path'][1:]) - windows_image['Letter'] = new_letter - - # Format and partition disk - result = try_and_print( - message = 'Formatting disk...', - function = format_disk, - other_results = other_results, - disk = dest_disk, - use_gpt = dest_disk['Use GPT']) - if not result['CS']: - # We need to crash as the disk is in an unknown state - print_error('ERROR: Failed to format disk.') - raise GenericAbort - - # Apply Image - result = try_and_print( - message = 'Applying image...', - function = setup_windows, - other_results = other_results, - windows_image = windows_image, - windows_version = windows_version) - if not result['CS']: - # We need to crash as the disk is in an unknown state - print_error('ERROR: Failed to apply image.') - raise GenericAbort - - # Create Boot files - try_and_print( - message = 'Updating boot files...', - function = update_boot_partition, - other_results = other_results) - - # Setup WinRE - try_and_print( - message = 'Updating recovery tools...', - function = setup_windows_re, - other_results = other_results, - windows_version = windows_version) - - # Copy WinPE log(s) - source = r'{}\Logs'.format(global_vars['ClientDir']) - dest = r'W:\{}\Logs\WinPE'.format(KIT_NAME_SHORT) - shutil.copytree(source, dest) - - # Print summary - print_standard('\nDone.') - if 'LogFile' in global_vars and ask('\nReview log?'): - cmd = [ - global_vars['Tools']['NotepadPlusPlus'], - global_vars['LogFile']] - try: - popen_program(cmd) - except Exception: - print_error('ERROR: Failed to open log.') - sleep(30) - pause('\nPress Enter to return to main menu... ') - - -def menu_tools(): - """Tool launcher menu.""" - tools = [{'Name': k} for k in sorted(PE_TOOLS.keys())] - actions = [{'Name': 'Main Menu', 'Letter': 'M'},] - set_title(KIT_NAME_FULL) - - # Menu loop - while True: - selection = menu_select( - title = 'Tools Menu', - main_entries = tools, - action_entries = actions) - if (selection.isnumeric()): - name = tools[int(selection)-1]['Name'] - cmd = [PE_TOOLS[name]['Path']] + PE_TOOLS[name].get('Args', []) - if name == 'Blue Screen View': - # Select path to scan - minidump_path = select_minidump_path() - if minidump_path: - cmd.extend(['/MiniDumpFolder', minidump_path]) - try: - popen_program(cmd) - except Exception: - print_error('Failed to run {}'.format(name)) - sleep(2) - pause() - elif (selection == 'M'): - break - - -def select_minidump_path(): - """Select BSOD minidump path from a menu.""" - dumps = [] - - # Assign volume letters first - assign_volume_letters() - - # Search for minidumps - set_thread_error_mode(silent=True) # Prevents "No disk" popups - for d in psutil.disk_partitions(): - if global_vars['Env']['SYSTEMDRIVE'].upper() in d.mountpoint: - # Skip RAMDisk - continue - if os.path.exists(r'{}Windows\MiniDump'.format(d.mountpoint)): - dumps.append({'Name': r'{}Windows\MiniDump'.format(d.mountpoint)}) - set_thread_error_mode(silent=False) # Return to normal - - # Check results before showing menu - if len(dumps) == 0: - print_error('ERROR: No BSoD / MiniDump paths found') - sleep(2) - return None - - # Menu - selection = menu_select( - title = 'Which BSoD / MiniDump path are we scanning?', - main_entries = dumps) - return dumps[int(selection) - 1]['Name'] - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/settings/browsers.py b/scripts/wk.prev/settings/browsers.py deleted file mode 100644 index dc394342..00000000 --- a/scripts/wk.prev/settings/browsers.py +++ /dev/null @@ -1,99 +0,0 @@ -# Wizard Kit: Settings - Browsers - -import os -import re - -# General -DEFAULT_HOMEPAGE = 'https://www.google.com/' -IE_GALLERY = 'https://www.microsoft.com/en-us/iegallery' -MOZILLA_PREFS = { - 'browser.search.defaultenginename': '"Google"', - 'browser.search.defaultenginename.US': '"Google"', - 'browser.search.geoSpecificDefaults': 'false', - 'browser.startup.homepage': '"{}"'.format(DEFAULT_HOMEPAGE), - 'extensions.ui.lastCategory': '"addons://list/extension"', - } -SUPPORTED_BROWSERS = { - 'Internet Explorer': { - 'base': 'ie', - 'exe_name': 'iexplore.exe', - 'rel_install_path': 'Internet Explorer', - 'user_data_path': r'{USERPROFILE}\Favorites', - }, - 'Google Chrome': { - 'base': 'chromium', - 'exe_name': 'chrome.exe', - 'rel_install_path': r'Google\Chrome\Application', - 'user_data_path': r'{LOCALAPPDATA}\Google\Chrome\User Data', - }, - 'Google Chrome Canary': { - 'base': 'chromium', - 'exe_name': 'chrome.exe', - 'rel_install_path': r'Google\Chrome SxS\Application', - 'user_data_path': r'{LOCALAPPDATA}\Google\Chrome SxS\User Data', - }, - 'Mozilla Firefox': { - 'base': 'mozilla', - 'exe_name': 'firefox.exe', - 'rel_install_path': 'Mozilla Firefox', - 'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles', - }, - 'Mozilla Firefox Dev': { - 'base': 'mozilla', - 'exe_name': 'firefox.exe', - 'rel_install_path': 'Firefox Developer Edition', - 'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles', - }, - 'Opera': { - 'base': 'chromium', - 'exe_name': 'launcher.exe', - 'rel_install_path': 'Opera', - 'user_data_path': r'{APPDATA}\Opera Software\Opera Stable', - }, - 'Opera Beta': { - 'base': 'chromium', - 'exe_name': 'launcher.exe', - 'rel_install_path': 'Opera beta', - 'user_data_path': r'{APPDATA}\Opera Software\Opera Next', - }, - 'Opera Dev': { - 'base': 'chromium', - 'exe_name': 'launcher.exe', - 'rel_install_path': 'Opera developer', - 'user_data_path': r'{APPDATA}\Opera Software\Opera Developer', - }, - } - -# Regex -REGEX_BACKUP = re.compile( - r'\.\w*bak.*', - re.IGNORECASE) -REGEX_CHROMIUM_PROFILE = re.compile( - r'^(Default|Profile)', - re.IGNORECASE) -REGEX_CHROMIUM_ITEMS = re.compile( - r'^(Bookmarks|Cookies|Favicons|Google Profile' - r'|History|Login Data|Top Sites|TransportSecurity' - r'|Visited Links|Web Data)', - re.IGNORECASE) -REGEX_MOZILLA = re.compile( - r'^(bookmarkbackups|(cookies|formhistory|places).sqlite' - r'|key3.db|logins.json|persdict.dat)$', - re.IGNORECASE) - -# uBlock Origin -UBO_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en' -UBO_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm' -UBO_EXTRA_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin-extra/pgdnlhfefecpicbbihgmbmffkjpaplco?hl=en' -UBO_EXTRA_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco' -UBO_MOZILLA = 'https://addons.mozilla.org/en-us/firefox/addon/ublock-origin/' -UBO_MOZZILA_PATH = r'{}\Mozilla Firefox\distribution\extensions\ublock_origin.xpi'.format(os.environ.get('PROGRAMFILES')) -UBO_MOZILLA_REG = r'Software\Mozilla\Firefox\Extensions' -UBO_MOZILLA_REG_NAME = 'uBlock0@raymondhill.net' -UBO_OPERA = 'https://addons.opera.com/en/extensions/details/ublock/?display=en' - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 tw=0 diff --git a/scripts/wk.prev/settings/cleanup.py b/scripts/wk.prev/settings/cleanup.py deleted file mode 100644 index 2188fc6b..00000000 --- a/scripts/wk.prev/settings/cleanup.py +++ /dev/null @@ -1,37 +0,0 @@ -'''Wizard Kit: Settings - Cleanup''' -# vim: sts=2 sw=2 ts=2 - -import re - -# Regex -DESKTOP_ITEMS = re.compile( - r'^(JRT|RKill|sc-cleaner)', - re.IGNORECASE, - ) - -# Registry -UAC_DEFAULTS_WIN7 = { - r'Software\Microsoft\Windows\CurrentVersion\Policies\System': { - 'DWORD Items': { - 'ConsentPromptBehaviorAdmin': 5, - 'EnableLUA': 1, - 'PromptOnSecureDesktop': 1, - }, - }, - } -UAC_DEFAULTS_WIN10 = { - r'Software\Microsoft\Windows\CurrentVersion\Policies\System': { - 'DWORD Items': { - 'ConsentPromptBehaviorAdmin': 5, - 'ConsentPromptBehaviorUser': 3, - 'EnableInstallerDetection': 1, - 'EnableLUA': 1, - 'EnableVirtualization': 1, - 'PromptOnSecureDesktop': 1, - }, - }, - } - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") diff --git a/scripts/wk.prev/settings/data.py b/scripts/wk.prev/settings/data.py deleted file mode 100644 index 4dd29d03..00000000 --- a/scripts/wk.prev/settings/data.py +++ /dev/null @@ -1,105 +0,0 @@ -# Wizard Kit: Settings - Data - -import ctypes -import re - -from settings.main import * - -# FastCopy -FAST_COPY_EXCLUDES = [ - r'\*.esd', - r'\*.swm', - r'\*.wim', - r'\*.dd', - r'\*.dd.tgz', - r'\*.dd.txz', - r'\*.map', - r'\*.dmg', - r'\*.image', - r'$RECYCLE.BIN', - r'$Recycle.Bin', - r'.AppleDB', - r'.AppleDesktop', - r'.AppleDouble', - r'.com.apple.timemachine.supported', - r'.dbfseventsd', - r'.DocumentRevisions-V100*', - r'.DS_Store', - r'.fseventsd', - r'.PKInstallSandboxManager', - r'.Spotlight*', - r'.SymAV*', - r'.symSchedScanLockxz', - r'.TemporaryItems', - r'.Trash*', - r'.vol', - r'.VolumeIcon.icns', - r'desktop.ini', - r'Desktop?DB', - r'Desktop?DF', - r'hiberfil.sys', - r'lost+found', - r'Network?Trash?Folder', - r'pagefile.sys', - r'Recycled', - r'RECYCLER', - r'System?Volume?Information', - r'Temporary?Items', - r'Thumbs.db', - ] -FAST_COPY_ARGS = [ - '/cmd=noexist_only', - '/utf8', - '/skip_empty_dir', - '/linkdest', - '/no_ui', - '/auto_close', - '/exclude={}'.format(';'.join(FAST_COPY_EXCLUDES)), - ] - -# Regex -REGEX_EXCL_ITEMS = re.compile( - r'^(\.(AppleDB|AppleDesktop|AppleDouble' - r'|com\.apple\.timemachine\.supported|dbfseventsd' - r'|DocumentRevisions-V100.*|DS_Store|fseventsd|PKInstallSandboxManager' - r'|Spotlight.*|SymAV.*|symSchedScanLockxz|TemporaryItems|Trash.*' - r'|vol|VolumeIcon\.icns)|desktop\.(ini|.*DB|.*DF)' - r'|(hiberfil|pagefile)\.sys|lost\+found|Network\.*Trash\.*Folder' - r'|Recycle[dr]|System\.*Volume\.*Information|Temporary\.*Items' - r'|Thumbs\.db)$', - re.IGNORECASE) -REGEX_EXCL_ROOT_ITEMS = re.compile( - r'^(boot(mgr|nxt)$|Config.msi' - r'|(eula|globdata|install|vc_?red)' - r'|.*.sys$|System Volume Information|RECYCLER?|\$Recycle\.bin' - r'|\$?Win(dows(.old.*|\. BT|)$|RE_)|\$GetCurrent|Windows10Upgrade' - r'|PerfLogs|Program Files|SYSTEM.SAV' - r'|.*\.(esd|swm|wim|dd|map|dmg|image)$)', - re.IGNORECASE) -REGEX_INCL_ROOT_ITEMS = re.compile( - r'^(AdwCleaner|(My\s*|)(Doc(uments?( and Settings|)|s?)|Downloads' - r'|Media|Music|Pic(ture|)s?|Vid(eo|)s?)' - r'|{prefix}(-?Info|-?Transfer|)' - r'|(ProgramData|Recovery|Temp.*|Users)$' - r'|.*\.(log|txt|rtf|qb\w*|avi|m4a|m4v|mp4|mkv|jpg|png|tiff?)$)' - r''.format(prefix=KIT_NAME_SHORT), - re.IGNORECASE) -REGEX_WIM_FILE = re.compile( - r'\.wim$', - re.IGNORECASE) -REGEX_WINDOWS_OLD = re.compile( - r'^Win(dows|)\.old', - re.IGNORECASE) - -# Thread error modes -## Code borrowed from: https://stackoverflow.com/a/29075319 -SEM_NORMAL = ctypes.c_uint() -SEM_FAILCRITICALERRORS = 1 -SEM_NOOPENFILEERRORBOX = 0x8000 -SEM_FAIL = SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/settings/ddrescue.py b/scripts/wk.prev/settings/ddrescue.py deleted file mode 100644 index ffe6e215..00000000 --- a/scripts/wk.prev/settings/ddrescue.py +++ /dev/null @@ -1,61 +0,0 @@ -# Wizard Kit: Settings - ddrescue-tui - -import re - -from collections import OrderedDict - -# General -MAP_DIR = '/Backups/ddrescue-tui' -RECOMMENDED_FSTYPES = ['ext3', 'ext4', 'xfs'] -RECOMMENDED_MAP_FSTYPES = ['cifs', 'ext2', 'ext3', 'ext4', 'vfat', 'xfs'] -USAGE = """ {script_name} clone [source [destination]] - {script_name} image [source [destination]] - (e.g. {script_name} clone /dev/sda /dev/sdb) -""" - -# Layout -SIDE_PANE_WIDTH = 21 -TMUX_LAYOUT = OrderedDict({ - 'Source': {'y': 2, 'Check': True}, - 'Started': {'x': SIDE_PANE_WIDTH, 'Check': True}, - 'Progress': {'x': SIDE_PANE_WIDTH, 'Check': True}, -}) - -# ddrescue -AUTO_PASS_1_THRESHOLD = 95 -AUTO_PASS_2_THRESHOLD = 98 -DDRESCUE_SETTINGS = { - '--binary-prefixes': {'Enabled': True, 'Hidden': True, }, - '--data-preview': {'Enabled': True, 'Value': '5', 'Hidden': True, }, - '--idirect': {'Enabled': True, }, - '--odirect': {'Enabled': True, }, - '--max-read-rate': {'Enabled': False, 'Value': '1MiB', }, - '--min-read-rate': {'Enabled': True, 'Value': '64KiB', }, - '--reopen-on-error': {'Enabled': True, }, - '--retry-passes': {'Enabled': True, 'Value': '0', }, - '--test-mode': {'Enabled': False, 'Value': 'test.map', }, - '--timeout': {'Enabled': True, 'Value': '5m', }, - '-vvvv': {'Enabled': True, 'Hidden': True, }, - } -ETOC_REFRESH_RATE = 30 # in seconds -REGEX_DDRESCUE_LOG = re.compile( - r'^\s*(?P\S+):\s+' - r'(?P\d+)\s+' - r'(?P[PTGMKB])i?B?', - re.IGNORECASE, - ) -REGEX_REMAINING_TIME = re.compile( - r'remaining time:' - r'\s*((?P\d+)d)?' - r'\s*((?P\d+)h)?' - r'\s*((?P\d+)m)?' - r'\s*((?P\d+)s)?' - r'\s*(?Pn/a)?', - re.IGNORECASE - ) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/settings/hw_diags.py b/scripts/wk.prev/settings/hw_diags.py deleted file mode 100644 index 7957fda2..00000000 --- a/scripts/wk.prev/settings/hw_diags.py +++ /dev/null @@ -1,113 +0,0 @@ -# Wizard Kit: Settings - HW Diagnostics - -from collections import OrderedDict - -# General -DEBUG_MODE = False -OVERRIDES_FORCED = False -OVERRIDES_LIMITED = True # If True this disables OVERRIDE_FORCED -STATUSES = { - 'RED': ['Denied', 'ERROR', 'NS', 'TimedOut'], - 'YELLOW': ['Aborted', 'N/A', 'OVERRIDE', 'Unknown', 'Working'], - 'GREEN': ['CS'], -} -TESTS_CPU = ['Prime95'] -TESTS_DISK = [ - 'I/O Benchmark', - 'NVMe / SMART', - 'badblocks', - ] - -# Layout -## NOTE: Colors will be applied in functions/hw_diags.py -QUICK_LABEL = '{YELLOW}(Quick){CLEAR}' -SIDE_PANE_WIDTH = 20 -TOP_PANE_TEXT = '{GREEN}Hardware Diagnostics{CLEAR}' -TMUX_LAYOUT = OrderedDict({ - 'Top': {'y': 2, 'Check': True}, - 'Started': {'x': SIDE_PANE_WIDTH, 'Check': True}, - 'Progress': {'x': SIDE_PANE_WIDTH, 'Check': True}, - # Testing panes - 'Prime95': {'y': 11, 'Check': False}, - 'Temps': {'y': 1000, 'Check': False}, - 'SMART': {'y': 3, 'Check': True}, - 'badblocks': {'y': 5, 'Check': True}, - 'I/O Benchmark': {'y': 1000, 'Check': False}, -}) - -# Tests: badblocks -## NOTE: Force 4K read block size for disks >= to 3TB -BADBLOCKS_LARGE_DISK = 3*1024**4 - -# Tests: I/O Benchmark -IO_VARS = { - 'Block Size': 512*1024, - 'Chunk Size': 32*1024**2, - 'Minimum Test Size': 10*1024**3, - 'Alt Test Size Factor': 0.01, - 'Progress Refresh Rate': 5, - 'Scale 8': [2**(0.56*(x+1))+(16*(x+1)) for x in range(8)], - 'Scale 16': [2**(0.56*(x+1))+(16*(x+1)) for x in range(16)], - 'Scale 32': [2**(0.56*(x+1)/2)+(16*(x+1)/2) for x in range(32)], - 'Threshold Graph Fail': 65*1024**2, - 'Threshold Graph Warn': 135*1024**2, - 'Threshold Graph Great': 750*1024**2, - 'Threshold HDD Min': 50*1024**2, - 'Threshold HDD High Avg': 75*1024**2, - 'Threshold HDD Low Avg': 65*1024**2, - 'Threshold SSD Min': 90*1024**2, - 'Threshold SSD High Avg': 135*1024**2, - 'Threshold SSD Low Avg': 100*1024**2, - 'Graph Horizontal': ('▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'), - 'Graph Horizontal Width': 40, - 'Graph Vertical': ( - '▏', '▎', '▍', '▌', - '▋', '▊', '▉', '█', - '█▏', '█▎', '█▍', '█▌', - '█▋', '█▊', '█▉', '██', - '██▏', '██▎', '██▍', '██▌', - '██▋', '██▊', '██▉', '███', - '███▏', '███▎', '███▍', '███▌', - '███▋', '███▊', '███▉', '████'), - } - -# Tests: NVMe/SMART -ATTRIBUTES = { - 'NVMe': { - 'critical_warning': {'Critical': True, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': None, }, - 'media_errors': {'Critical': True, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': None, }, - 'power_on_hours': {'Critical': False, 'Ignore': True, 'Warning': 17532, 'Error': 26298, 'Maximum': None, }, - 'unsafe_shutdowns': {'Critical': False, 'Ignore': True, 'Warning': 1, 'Error': None, 'Maximum': None, }, - }, - 'SMART': { - 5: {'Hex': '05', 'Critical': True, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': None, }, - 9: {'Hex': '09', 'Critical': False, 'Ignore': True, 'Warning': 17532, 'Error': 26298, 'Maximum': None, }, - 10: {'Hex': '10', 'Critical': False, 'Ignore': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, }, - 184: {'Hex': 'B8', 'Critical': False, 'Ignore': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, }, - 187: {'Hex': 'BB', 'Critical': False, 'Ignore': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, }, - 188: {'Hex': 'BC', 'Critical': False, 'Ignore': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, }, - 196: {'Hex': 'C4', 'Critical': False, 'Ignore': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, }, - 197: {'Hex': 'C5', 'Critical': True, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': None, }, - 198: {'Hex': 'C6', 'Critical': True, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': None, }, - 199: {'Hex': 'C7', 'Critical': False, 'Ignore': True, 'Warning': None, 'Error': 1, 'Maximum': None, }, - 201: {'Hex': 'C9', 'Critical': False, 'Ignore': False, 'Warning': None, 'Error': 1, 'Maximum': 10000, }, - }, - } -ATTRIBUTE_COLORS = ( - # NOTE: The order here is important; least important to most important. - ('Warning', 'YELLOW'), - ('Error', 'RED'), - ('Maximum', 'PURPLE'), - ) -KEY_NVME = 'nvme_smart_health_information_log' -KEY_SMART = 'ata_smart_attributes' - -# Tests: Prime95 -MPRIME_LIMIT = 7 # of minutes to run Prime95 -THERMAL_LIMIT = 95 # Abort temperature in Celsius - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 tw=0 diff --git a/scripts/wk.prev/settings/info.py b/scripts/wk.prev/settings/info.py deleted file mode 100644 index bb1f1421..00000000 --- a/scripts/wk.prev/settings/info.py +++ /dev/null @@ -1,58 +0,0 @@ -# Wizard Kit: Settings - Information - -import re - -# General -REG_PROFILE_LIST = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' -REG_SHELL_FOLDERS = r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders' -TMP_HIVE_PATH = 'TEMP_HIVE_MOUNT' -EXTRA_FOLDERS = [ - 'Dropbox', - 'Google Drive', - 'OneDrive', - 'SkyDrive', -] -SHELL_FOLDERS = { - #GUIDs from: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx - 'Desktop': ( - '{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}', - ), - 'Documents': ( - 'Personal', - '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}', - ), - 'Downloads': ( - '{374DE290-123F-4565-9164-39C4925E467B}', - ), - 'Favorites': ( - '{1777F761-68AD-4D8A-87BD-30B759FA33DD}', - ), - 'Music': ( - 'My Music', - '{4BD8D571-6D19-48D3-BE97-422220080E43}', - ), - 'Pictures': ( - 'My Pictures', - '{33E28130-4E1E-4676-835A-98395C3BC3BB}', - ), - 'Videos': ( - 'My Video', - '{18989B1D-99B5-455B-841C-AB7C74E4DDFC}', - ), -} - -# Regex -REGEX_OFFICE = re.compile( - r'(Microsoft (Office\s+' - r'(365|Enterprise|Home|Pro(\s|fessional)' - r'|Single|Small|Standard|Starter|Ultimate|system)' - r'|Works[-\s\d]+\d)' - r'|(Libre|Open|Star)\s*Office' - r'|WordPerfect|Gnumeric|Abiword)', - re.IGNORECASE) - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/settings/launchers.py b/scripts/wk.prev/settings/launchers.py deleted file mode 100644 index 7161c98e..00000000 --- a/scripts/wk.prev/settings/launchers.py +++ /dev/null @@ -1,602 +0,0 @@ -'''Wizard Kit: Settings - Launchers''' -# pylint: disable=line-too-long -# vim: sts=2 sw=2 ts=2 - -LAUNCHERS = { - r'(Root)': { - 'System Diagnostics': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'system_diagnostics.py', - 'L_ELEV': 'True', - }, - 'System Setup': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'system_setup.py', - 'L_ELEV': 'True', - }, - }, - r'Data Recovery': { - 'PhotoRec (CLI)': { - 'L_TYPE': 'Executable', - 'L_PATH': 'TestDisk', - 'L_ITEM': 'photorec_win.exe', - 'L_ELEV': 'True', - 'L__CLI': 'True', - }, - 'PhotoRec': { - 'L_TYPE': 'Executable', - 'L_PATH': 'TestDisk', - 'L_ITEM': 'qphotorec_win.exe', - 'L_ELEV': 'True', - }, - 'TestDisk': { - 'L_TYPE': 'Executable', - 'L_PATH': 'TestDisk', - 'L_ITEM': 'testdisk_win.exe', - 'L_ELEV': 'True', - 'L__CLI': 'True', - }, - }, - r'Data Transfers': { - # pylint: disable=bad-continuation - 'FastCopy (as ADMIN)': { - 'L_TYPE': 'Executable', - 'L_PATH': 'FastCopy', - 'L_ITEM': 'FastCopy.exe', - 'L_ARGS': ( - r' /logfile=%log_dir%\Tools\FastCopy.log' - r' /cmd=noexist_only' - r' /utf8' - r' /skip_empty_dir' - r' /linkdest' - r' /exclude=' - r'$RECYCLE.BIN;' - r'$Recycle.Bin;' - r'.AppleDB;' - r'.AppleDesktop;' - r'.AppleDouble;' - r'.com.apple.timemachine.supported;' - r'.dbfseventsd;' - r'.DocumentRevisions-V100*;' - r'.DS_Store;' - r'.fseventsd;' - r'.PKInstallSandboxManager;' - r'.Spotlight*;' - r'.SymAV*;' - r'.symSchedScanLockxz;' - r'.TemporaryItems;' - r'.Trash*;' - r'.vol;' - r'.VolumeIcon.icns;' - r'desktop.ini;' - r'Desktop?DB;' - r'Desktop?DF;' - r'hiberfil.sys;' - r'lost+found;' - r'Network?Trash?Folder;' - r'pagefile.sys;' - r'Recycled;' - r'RECYCLER;' - r'System?Volume?Information;' - r'Temporary?Items;' - r'Thumbs.db' - r' /to=%client_dir%\Transfer_%iso_date%\ ' - ), - 'L_ELEV': 'True', - 'Extra Code': [ - r'call "%bin%\Scripts\init_client_dir.cmd" /Logs /Transfer', - ], - }, - 'FastCopy': { - 'L_TYPE': 'Executable', - 'L_PATH': 'FastCopy', - 'L_ITEM': 'FastCopy.exe', - 'L_ARGS': ( - r' /logfile=%log_dir%\Tools\FastCopy.log' - r' /cmd=noexist_only' - r' /utf8' - r' /skip_empty_dir' - r' /linkdest' - r' /exclude=' - r'$RECYCLE.BIN;' - r'$Recycle.Bin;' - r'.AppleDB;' - r'.AppleDesktop;' - r'.AppleDouble;' - r'.com.apple.timemachine.supported;' - r'.dbfseventsd;' - r'.DocumentRevisions-V100*;' - r'.DS_Store;' - r'.fseventsd;' - r'.PKInstallSandboxManager;' - r'.Spotlight*;' - r'.SymAV*;' - r'.symSchedScanLockxz;' - r'.TemporaryItems;' - r'.Trash*;' - r'.vol;' - r'.VolumeIcon.icns;' - r'desktop.ini;' - r'Desktop?DB;' - r'Desktop?DF;' - r'hiberfil.sys;' - r'lost+found;' - r'Network?Trash?Folder;' - r'pagefile.sys;' - r'Recycled;' - r'RECYCLER;' - r'System?Volume?Information;' - r'Temporary?Items;' - r'Thumbs.db' - r' /to=%client_dir%\Transfer_%iso_date%\ ' - ), - 'Extra Code': [ - r'call "%bin%\Scripts\init_client_dir.cmd" /Logs /Transfer', - ], - }, - 'KVRT': { - 'L_TYPE': 'Executable', - 'L_PATH': 'KVRT', - 'L_ITEM': 'KVRT.exe', - 'L_ARGS': ( - r' -accepteula' - r' -d %q_dir%' - r' -processlevel 3' - r' -dontcryptsupportinfo' - r' -fixednames' - ), - 'Extra Code': [ - r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine', - r'set "q_dir=%client_dir%\Quarantine\KVRT"', - r'mkdir "%q_dir%">nul 2>&1', - ], - }, - 'Transferred Keys': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'transferred_keys.py', - 'L_ELEV': 'True', - }, - 'User Data Transfer': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'user_data_transfer.py', - 'L_ELEV': 'True', - }, - 'XYplorer (as ADMIN)': { - 'L_TYPE': 'Executable', - 'L_PATH': 'XYplorerFree', - 'L_ITEM': 'XYplorerFree.exe', - 'L_ARGS': r'/exp /win=max %userprofile%', - 'L_ELEV': 'True', - }, - 'XYplorer': { - 'L_TYPE': 'Executable', - 'L_PATH': 'XYplorerFree', - 'L_ITEM': 'XYplorerFree.exe', - 'L_ARGS': r'/exp /win=max %userprofile%', - }, - }, - r'Diagnostics': { - 'HWiNFO': { - 'L_TYPE': 'Executable', - 'L_PATH': 'HWiNFO', - 'L_ITEM': 'HWiNFO.exe', - 'Extra Code': [ - r'for %%a in (32 64) do (', - r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"', - r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"', - r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"', - r')', - ], - }, - 'ProduKey': { - 'L_TYPE': 'Executable', - 'L_PATH': 'ProduKey', - 'L_ITEM': 'ProduKey.exe', - 'L_ELEV': 'True', - 'Extra Code': [ - r'if exist "%bin%\ProduKey" (', - r' del "%bin%\ProduKey\ProduKey.cfg" 2>nul', - r' del "%bin%\ProduKey\ProduKey64.cfg" 2>nul', - r')', - ], - }, - }, - r'Diagnostics\Extras': { - 'AIDA64': { - 'L_TYPE': 'Executable', - 'L_PATH': 'AIDA64', - 'L_ITEM': 'aida64.exe', - }, - 'Autoruns (with VirusTotal Scan)': { - 'L_TYPE': 'Executable', - 'L_PATH': 'Autoruns', - 'L_ITEM': 'Autoruns.exe', - 'L_ARGS': '-e', - 'Extra Code': [ - r'reg add HKCU\Software\Sysinternals\AutoRuns /v checkvirustotal /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v EulaAccepted /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownomicrosoft /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownowindows /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v showonlyvirustotal /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v submitvirustotal /t REG_DWORD /d 0 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v verifysignatures /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns\SigCheck /v EulaAccepted /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns\Streams /v EulaAccepted /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns\VirusTotal /v VirusTotalTermsAccepted /t REG_DWORD /d 1 /f >nul', - ], - }, - 'BleachBit': { - 'L_TYPE': 'Executable', - 'L_PATH': 'BleachBit', - 'L_ITEM': 'bleachbit.exe', - }, - 'BlueScreenView': { - 'L_TYPE': 'Executable', - 'L_PATH': 'BlueScreenView', - 'L_ITEM': 'BlueScreenView.exe', - }, - 'ERUNT': { - 'L_TYPE': 'Executable', - 'L_PATH': 'erunt', - 'L_ITEM': 'ERUNT.EXE', - 'L_ARGS': r'%client_dir%\Backups\Registry\%iso_date% sysreg curuser otherusers', - 'L_ELEV': 'True', - 'Extra Code': [ - r'call "%bin%\Scripts\init_client_dir.cmd" /Logs', - ], - }, - 'HitmanPro': { - 'L_TYPE': 'Executable', - 'L_PATH': 'HitmanPro', - 'L_ITEM': 'HitmanPro.exe', - 'Extra Code': [ - r'call "%bin%\Scripts\init_client_dir.cmd" /Logs', - ], - }, - 'HWiNFO (Sensors)': { - 'L_TYPE': 'Executable', - 'L_PATH': 'HWiNFO', - 'L_ITEM': 'HWiNFO.exe', - 'Extra Code': [ - r'for %%a in (32 64) do (', - r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"', - r' (echo SensorsOnly=1)>>"%bin%\HWiNFO\HWiNFO%%a.ini"', - r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"', - r')', - ], - }, - }, - r'Drivers': { - 'Intel RST (Current Release)': { - 'L_TYPE': 'Executable', - 'L_PATH': r'_Drivers\Intel RST', - 'L_ITEM': 'SetupRST_17.2.exe', - 'L_7ZIP': 'SetupRST_17.2.exe', - }, - 'Intel RST (Previous Releases)': { - 'L_TYPE': 'Folder', - 'L_PATH': r'_Drivers\Intel RST', - 'L_ITEM': '.', - 'L_NCMD': 'True', - }, - 'Intel SSD Toolbox': { - 'L_TYPE': 'Executable', - 'L_PATH': r'_Drivers\Intel SSD Toolbox', - 'L_ITEM': 'Intel SSD Toolbox.exe', - }, - 'Samsing Magician': { - 'L_TYPE': 'Executable', - 'L_PATH': r'_Drivers\Samsung Magician', - 'L_ITEM': 'Samsung Magician.exe', - }, - 'Snappy Driver Installer Origin': { - 'L_TYPE': 'Executable', - 'L_PATH': r'_Drivers\SDIO', - 'L_ITEM': 'SDIO.exe', - }, - }, - r'Drivers\Extras': { - 'Acer': { - 'L_TYPE': 'Executable', - 'L_PATH': 'HWiNFO', - 'L_ITEM': 'HWiNFO.exe', - 'Extra Code': [ - r'for %%a in (32 64) do (', - r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"', - r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"', - r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"', - r')', - r'start "" "http://us.acer.com/ac/en/US/content/drivers"', - ], - }, - 'Lenovo': { - 'L_TYPE': 'Executable', - 'L_PATH': 'HWiNFO', - 'L_ITEM': 'HWiNFO.exe', - 'Extra Code': [ - r'for %%a in (32 64) do (', - r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"', - r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"', - r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"', - r')', - r'start "" "https://pcsupport.lenovo.com/us/en/"', - ], - }, - 'Toshiba': { - 'L_TYPE': 'Executable', - 'L_PATH': 'HWiNFO', - 'L_ITEM': 'HWiNFO.exe', - 'Extra Code': [ - r'for %%a in (32 64) do (', - r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"', - r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"', - r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"', - r')', - r'start "" "http://support.toshiba.com/drivers"', - ], - }, - }, - r'Installers': { - 'SW Bundle': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'install_sw_bundle.py', - 'L_ELEV': 'True', - }, - }, - r'Installers\Extras\Office\2016': { - 'Home and Business (x32)': { - 'L_TYPE': 'Office', - 'L_PATH': '2016', - 'L_ITEM': '2016_hb_32.xml', - 'L_NCMD': 'True', - }, - 'Home and Business (x64)': { - 'L_TYPE': 'Office', - 'L_PATH': '2016', - 'L_ITEM': '2016_hb_64.xml', - 'L_NCMD': 'True', - }, - 'Home and Student (x32)': { - 'L_TYPE': 'Office', - 'L_PATH': '2016', - 'L_ITEM': '2016_hs_32.xml', - 'L_NCMD': 'True', - }, - 'Home and Student (x64)': { - 'L_TYPE': 'Office', - 'L_PATH': '2016', - 'L_ITEM': '2016_hs_64.xml', - 'L_NCMD': 'True', - }, - }, - r'Installers\Extras\Office\2019': { - 'Home and Business (x32)': { - 'L_TYPE': 'Office', - 'L_PATH': '2019', - 'L_ITEM': '2019_hb_32.xml', - 'L_NCMD': 'True', - }, - 'Home and Business (x64)': { - 'L_TYPE': 'Office', - 'L_PATH': '2019', - 'L_ITEM': '2019_hb_64.xml', - 'L_NCMD': 'True', - }, - 'Home and Student (x32)': { - 'L_TYPE': 'Office', - 'L_PATH': '2019', - 'L_ITEM': '2019_hs_32.xml', - 'L_NCMD': 'True', - }, - 'Home and Student (x64)': { - 'L_TYPE': 'Office', - 'L_PATH': '2019', - 'L_ITEM': '2019_hs_64.xml', - 'L_NCMD': 'True', - }, - 'Office 365 (x32)': { - 'L_TYPE': 'Office', - 'L_PATH': '2019', - 'L_ITEM': '365_32.xml', - 'L_NCMD': 'True', - }, - 'Office 365 (x64)': { - 'L_TYPE': 'Office', - 'L_PATH': '2019', - 'L_ITEM': '365_64.xml', - 'L_NCMD': 'True', - }, - }, - r'Installers\Extras\Runtimes': { - 'Visual C++ Runtimes': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'install_vcredists.py', - 'L_ELEV': 'True', - }, - }, - r'Misc': { - 'Activate Windows': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'activate.py', - 'L_ELEV': 'True', - }, - 'Cleanup CBS Temp Files': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'cbs_fix.py', - 'L_ELEV': 'True', - }, - 'ConEmu (as ADMIN)': { - 'L_TYPE': 'Executable', - 'L_PATH': 'ConEmu', - 'L_ITEM': 'ConEmu.exe', - 'L_ELEV': 'True', - }, - 'ConEmu': { - 'L_TYPE': 'Executable', - 'L_PATH': 'ConEmu', - 'L_ITEM': 'ConEmu.exe', - }, - 'Disable Windows Updates': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'windows_updates.py', - 'L_ARGS': '--disable', - 'L_ELEV': 'True', - }, - 'Enable Windows Updates': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'windows_updates.py', - 'L_ARGS': '--enable', - 'L_ELEV': 'True', - }, - 'Enter SafeMode': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'safemode_enter.py', - 'L_ELEV': 'True', - }, - 'Everything': { - 'L_TYPE': 'Executable', - 'L_PATH': 'Everything', - 'L_ITEM': 'Everything.exe', - 'L_ARGS': '-nodb', - 'L_ELEV': 'True', - }, - 'Exit SafeMode': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'safemode_exit.py', - 'L_ELEV': 'True', - }, - 'Notepad++': { - 'L_TYPE': 'Executable', - 'L_PATH': 'notepadplusplus', - 'L_ITEM': 'notepadplusplus.exe', - }, - 'PuTTY': { - 'L_TYPE': 'Executable', - 'L_PATH': 'PuTTY', - 'L_ITEM': 'PUTTY.EXE', - }, - 'WizTree': { - 'L_TYPE': 'Executable', - 'L_PATH': 'WizTree', - 'L_ITEM': 'WizTree.exe', - 'L_ELEV': 'True', - }, - 'XMPlay': { - 'L_TYPE': 'Executable', - 'L_PATH': 'XMPlay', - 'L_ITEM': 'xmplay.exe', - 'L_ARGS': r'"%bin%\XMPlay\music.7z"', - }, - }, - r'Repairs': { - 'AdwCleaner': { - 'L_TYPE': 'Executable', - 'L_PATH': 'AdwCleaner', - 'L_ITEM': 'AdwCleaner.exe', - }, - 'Autoruns': { - 'L_TYPE': 'Executable', - 'L_PATH': 'Autoruns', - 'L_ITEM': 'Autoruns.exe', - 'L_ARGS': '-e', - 'Extra Code': [ - r'reg add HKCU\Software\Sysinternals\AutoRuns /v checkvirustotal /t REG_DWORD /d 0 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v EulaAccepted /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownomicrosoft /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownowindows /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v showonlyvirustotal /t REG_DWORD /d 0 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v submitvirustotal /t REG_DWORD /d 0 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns /v verifysignatures /t REG_DWORD /d 0 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns\SigCheck /v EulaAccepted /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns\Streams /v EulaAccepted /t REG_DWORD /d 1 /f >nul', - r'reg add HKCU\Software\Sysinternals\AutoRuns\VirusTotal /v VirusTotalTermsAccepted /t REG_DWORD /d 1 /f >nul', - ], - }, - 'CHKDSK': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'check_disk.py', - 'L_ELEV': 'True', - }, - 'DISM': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'dism.py', - 'L_ELEV': 'True', - }, - 'KVRT': { - 'L_TYPE': 'Executable', - 'L_PATH': 'KVRT', - 'L_ITEM': 'KVRT.exe', - 'L_ARGS': ( - r' -accepteula' - r' -d %q_dir%' - r' -processlevel 3' - r' -dontcryptsupportinfo' - r' -fixednames' - ), - 'Extra Code': [ - r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine', - r'set "q_dir=%client_dir%\Quarantine\KVRT"', - r'mkdir "%q_dir%">nul 2>&1', - ], - }, - 'RKill': { - 'L_TYPE': 'Executable', - 'L_PATH': 'RKill', - 'L_ITEM': 'RKill.exe', - 'L_ARGS': r'-s -l %log_dir%\Tools\RKill.log', - 'L_ELEV': 'True', - 'Extra Code': [ - r'call "%bin%\Scripts\init_client_dir.cmd" /Logs', - ], - }, - 'SFC Scan': { - 'L_TYPE': 'PyScript', - 'L_PATH': 'Scripts', - 'L_ITEM': 'sfc_scan.py', - 'L_ELEV': 'True', - }, - 'TDSSKiller': { - 'L_TYPE': 'Executable', - 'L_PATH': 'TDSSKiller', - 'L_ITEM': 'TDSSKiller.exe', - 'L_ARGS': ( - r' -l %log_dir%\Tools\TDSSKiller.log' - r' -qpath %q_dir%' - r' -accepteula' - r' -accepteulaksn' - r' -dcexact' - r' -tdlfs' - ), - 'Extra Code': [ - r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine', - r'set "q_dir=%client_dir%\Quarantine\TDSSKiller"', - r'mkdir "%q_dir%">nul 2>&1', - ], - }, - }, - r'Uninstallers': { - 'IObit Uninstaller': { - 'L_TYPE': 'Executable', - 'L_PATH': 'IObitUninstallerPortable', - 'L_ITEM': 'IObitUninstallerPortable.exe', - }, - }, - } - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") diff --git a/scripts/wk.prev/settings/main.py b/scripts/wk.prev/settings/main.py deleted file mode 100644 index 9b478feb..00000000 --- a/scripts/wk.prev/settings/main.py +++ /dev/null @@ -1,90 +0,0 @@ -# Wizard Kit: Settings - Main / Branding - -# Features -ENABLED_OPEN_LOGS = False -ENABLED_TICKET_NUMBERS = False -ENABLED_UPLOAD_DATA = False - -# STATIC VARIABLES (also used by BASH and BATCH files) -## NOTE: There are no spaces around the = for easier parsing in BASH and BATCH -# Main Kit -ARCHIVE_PASSWORD='Abracadabra' -KIT_NAME_FULL='WizardKit' -KIT_NAME_SHORT='WK' -SUPPORT_MESSAGE='Please let 2Shirt know by opening an issue on GitHub' -# Live Linux -ROOT_PASSWORD='Abracadabra' -TECH_PASSWORD='Abracadabra' -# Server IP addresses -OFFICE_SERVER_IP='10.0.0.10' -QUICKBOOKS_SERVER_IP='10.0.0.10' -# Time Zones -LINUX_TIME_ZONE='America/Denver' # See 'timedatectl list-timezones' for valid values -WINDOWS_TIME_ZONE='Mountain Standard Time' # See 'tzutil /l' for valid values - -# SERVER VARIABLES -## NOTE: Windows can only use one user per server. This means that if -## one server serves multiple shares then you have to use the same -## user/password for all of those shares. -BACKUP_SERVERS = [ - { 'IP': '10.0.0.10', - 'Name': 'ServerOne', - 'Mounted': False, - 'Share': 'Backups', - 'User': 'restore', - 'Pass': 'Abracadabra', - 'RW-User': 'backup', - 'RW-Pass': 'Abracadabra', - }, - { 'IP': '10.0.0.11', - 'Name': 'ServerTwo', - 'Mounted': False, - 'Share': 'Backups', - 'User': 'restore', - 'Pass': 'Abracadabra', - 'RW-User': 'backup', - 'RW-Pass': 'Abracadabra', - }, - ] -CRASH_SERVER = { - 'Name': 'CrashServer', - 'Url': '', - 'User': '', - 'Pass': '', - } -OFFICE_SERVER = { - 'IP': OFFICE_SERVER_IP, - 'Name': 'ServerOne', - 'Mounted': False, - 'Share': 'Office', - 'User': 'restore', - 'Pass': 'Abracadabra', - 'RW-User': 'backup', - 'RW-Pass': 'Abracadabra', - } -QUICKBOOKS_SERVER = { - 'IP': QUICKBOOKS_SERVER_IP, - 'Name': 'ServerOne', - 'Mounted': False, - 'Share': 'QuickBooks', - 'User': 'restore', - 'Pass': 'Abracadabra', - 'RW-User': 'backup', - 'RW-Pass': 'Abracadabra', - } -WINDOWS_SERVER = { - 'IP': '10.0.0.10', - 'Name': 'ServerOne', - 'Mounted': False, - 'Share': 'Windows', - 'User': 'restore', - 'Pass': 'Abracadabra', - 'RW-User': 'backup', - 'RW-Pass': 'Abracadabra', - } - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/settings/music.py b/scripts/wk.prev/settings/music.py deleted file mode 100644 index 63163a40..00000000 --- a/scripts/wk.prev/settings/music.py +++ /dev/null @@ -1,73 +0,0 @@ -# Wizard Kit: Settings - Music - -MUSIC_MOD = [ - '104208#banana_boat.mod', - '114971#tilbury_fair.mod', - '132563#ufo_tune.mod', - '135906#magnetik_girl.xm', - '140628#autumn_in_budapest.xm', - '143198#summer_memories_3.xm', - '144405#hillbilly_billyboy.xm', - '154795#4mat_-_eternity.xm', - '155845#bookworm.mo3', - '155914#battleofsteel.xm', - '158975#1_channel_moog.it', - '165495#trans.s3m', - '168513#necros_-_introspection.s3m', - '169628#radix_-_feng_shui_schematics.xm', - '175238#unknown48_-_twilight.mod', - '33432#ambrozia.xm', - '33460#amigatre.mod', - '34594#CHARIOT.S3M', - '34596#BUTTERFL.XM', - '34654#CTGOBLIN.S3M', - '35151#bananasplit.mod', - '35280#DEADLOCK.XM', - '38591#compo_liam.xm', - '39987#crystald.s3m', - '40475#ELYSIUM.MOD', - '42146#enigma.mod', - '42519#GHOST2.MOD', - '42560#GSLINGER.MOD', - '42872#existing.xm', - '50427#nf-stven.xm', - '51549#overture.mod', - '54250#SATELL.S3M', - '54313#realmk.s3m', - '55789#scrambld.mod', - '57934#spacedeb.mod', - '59344#stardstm.mod', - '60395#2ND_PM.S3M', - '66187#external.xm', - '66343#beek-substitutionology.it', - '67561#radix-unreal_superhero.xm', - '70829#inside_out.s3m', - '83779#beyond_music.mod', - ] - -MUSIC_SNES = [ - 'actr', - 'crock', - 'ct', - 'dkc', - 'dkq', - 'ff6', - 'fz', - 'loz3', - 'mmx', - 'ptws', - 'scv4', - 'sf', - 'sf2', - 'sgng', - 'smk', - 'smw', - 'yi', - 'zamn' - ] - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/settings/partition_uids.py b/scripts/wk.prev/settings/partition_uids.py deleted file mode 100644 index 29817b2c..00000000 --- a/scripts/wk.prev/settings/partition_uids.py +++ /dev/null @@ -1,326 +0,0 @@ -# Wizard Kit: Settings - Partition UIDs -# sources: https://en.wikipedia.org/wiki/GUID_Partition_Table -# https://en.wikipedia.org/wiki/Partition_type -# NOTE: Info has been trimmed for brevity. As such, there may be some inaccuracy. - -PARTITION_UIDS = { - '00': {'OS': 'All','Description': 'Empty partition entry'}, - '01': {'OS': 'DOS','Description': 'FAT12 as primary partition'}, - '02': {'OS': 'XENIX','Description': 'XENIX root'}, - '03': {'OS': 'XENIX','Description': 'XENIX usr'}, - '04': {'OS': 'DOS','Description': 'FAT16 with less than 32 MB'}, - '05': {'OS': 'DOS / SpeedStor','Description': 'Extended partition'}, - '06': {'OS': 'DOS1+','Description': 'FAT16B [over 65K sectors]'}, - '07': {'OS': 'Windows / OS/2 / QNX 2','Description': 'NTFS/exFAT/HPFS/IFS/QNX'}, - '08': {'OS': 'CBM / DOS / OS/2 / AIX /QNX','Description': 'FAT12-16/AIX/QNY/SplitDrive'}, - '09': {'OS': 'AIX / QNX / Coherent / OS-9','Description': 'AIX/QNZ/Coherent/RBF'}, - '0A': {'OS': 'OS/2 / Coherent','Description': 'Boot Manager / Swap'}, - '0B': {'OS': 'DOS','Description': 'FAT32 with CHS addressing'}, - '0C': {'OS': 'DOS','Description': 'FAT32 with LBA'}, - '0D': {'OS': 'Silicon Safe','Description': 'Reserved'}, - '0E': {'OS': 'DOS','Description': 'FAT16B with LBA'}, - '0F': {'OS': 'DOS','Description': 'Extended partition with LBA'}, - '10': {'OS': 'OPUS','Description': 'Unknown'}, - '11': {'OS': 'Leading Edge MS-DOS / OS/2','Description': 'FAT12/FAT16'}, - '12': {'OS': 'Compaq Contura','Description': 'conf/diag/hiber/rescue/serv'}, - '14': {'OS': 'AST DOS / OS/2 / MaverickOS','Description': 'FAT12/FAT16/Omega'}, - '15': {'OS': 'OS/2 / Maverick OS','Description': 'Hidden extended / Swap'}, - '16': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16B'}, - '17': {'OS': 'OS/2 Boot Manager','Description': 'Hidden IFS/HPFS/NTFS/exFAT'}, - '18': {'OS': 'AST Windows','Description': '0-Volt Suspend/SmartSleep'}, - '19': {'OS': 'Willowtech Photon coS','Description': 'Willowtech Photon coS'}, - '1B': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32'}, - '1C': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32 with LBA'}, - '1E': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16 with LBA'}, - '1F': {'OS': 'OS/2 Boot Manager','Description': 'Hidden extended with LBA'}, - '20': {'OS': 'Windows Mobile','Description': 'update XIP/Willowsoft OFS1'}, - '21': {'OS': 'Oxygen','Description': 'SpeedStor / FSo2'}, - '22': {'OS': 'Oxygen','Description': 'Oxygen Extended Partition'}, - '23': {'OS': 'Windows Mobile','Description': 'Reserved / boot XIP'}, - '24': {'OS': 'NEC MS-DOS0','Description': 'Logical FAT12 or FAT16'}, - '25': {'OS': 'Windows Mobile','Description': 'IMGFS[citation needed]'}, - '26': {'OS': 'Microsoft, IBM','Description': 'Reserved'}, - '27': {'OS': 'Win/PQserv/MirOS/RooterBOOT','Description': 'WinRE/Rescue/MirOS/RooterBOOT'}, - '2A': {'OS': 'AtheOS','Description': 'AthFS/AFS/Reserved'}, - '2B': {'OS': 'SyllableOS','Description': 'SyllableSecure (SylStor)'}, - '31': {'OS': 'Microsoft, IBM','Description': 'Reserved'}, - '32': {'OS': 'NOS','Description': 'Unknown'}, - '33': {'OS': 'Microsoft, IBM','Description': 'Reserved'}, - '34': {'OS': 'Microsoft, IBM','Description': 'Reserved'}, - '35': {'OS': 'OS/2 Server /eComStation','Description': 'JFS'}, - '36': {'OS': 'Microsoft, IBM','Description': 'Reserved'}, - '38': {'OS': 'THEOS','Description': 'THEOS version 3.2, 2 GB'}, - '39': {'OS': 'Plan 9 / THEOS','Description': 'Plan 9 edition 3 / THEOS v4'}, - '3A': {'OS': 'THEOS','Description': 'THEOS v4, 4 GB'}, - '3B': {'OS': 'THEOS','Description': 'THEOS v4 extended'}, - '3C': {'OS': 'PartitionMagic','Description': 'PqRP (image in progress)'}, - '3D': {'OS': 'PartitionMagic','Description': 'Hidden NetWare'}, - '3F': {'OS': 'OS/32','Description': 'Unknown'}, - '40': {'OS': 'PICK / Venix','Description': 'PICK R83 / Venix 80286'}, - '41': {'OS': 'RISC / Linux / PowerPC','Description': 'Boot / Old Linux/Minix'}, - '42': {'OS': 'SFS / Linux / Win2K/XP/etc','Description': 'SFS / Old Linux Swap'}, - '43': {'OS': 'Linux','Description': 'Old Linux native'}, - '44': {'OS': 'GoBack','Description': 'Norton/WildFire/Adaptec/Roxio'}, - '45': {'OS': 'Boot-US / EUMEL/ELAN','Description': 'Priam/Boot/EUMEL/ELAN (L2)'}, - '46': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'}, - '47': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'}, - '48': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2), ERGOS L3'}, - '4A': {'OS': 'AdaOS / ALFS/THIN','Description': 'Aquila / ALFS/THIN'}, - '4C': {'OS': 'ETH Oberon','Description': 'Aos (A2) file system (76)'}, - '4D': {'OS': 'QNX Neutrino','Description': 'Primary QNX POSIX volume'}, - '4E': {'OS': 'QNX Neutrino','Description': 'Secondary QNX POSIX volume'}, - '4F': {'OS': 'QNX Neutrino / ETH Oberon','Description': '3rd QNX POSIX/Boot/Native'}, - '50': {'OS': 'DiskMan4/ETH/LynxOS/Novell','Description': 'Alt FS/Read-only/Lynx RTOS'}, - '51': {'OS': 'Disk Manager 4-6','Description': 'R/W partition (Aux 1)'}, - '52': {'OS': 'CP/M-80/ System V/AT, V/386','Description': 'CP/M-80'}, - '53': {'OS': 'Disk Manager 6','Description': 'Auxiliary 3 (WO)'}, - '54': {'OS': 'Disk Manager 6','Description': 'Dynamic Drive Overlay (DDO)'}, - '55': {'OS': 'EZ-Drive','Description': 'Maxtor/MaxBlast/DriveGuide'}, - '56': {'OS': 'AT&T DOS/EZ-Drive/VFeature','Description': 'FAT12 16/EZ-BIOS/VFeature'}, - '57': {'OS': 'DrivePro','Description': 'VNDI partition'}, - '5C': {'OS': 'EDISK','Description': 'Priam EDisk Volume'}, - '61': {'OS': 'SpeedStor','Description': 'Unknown'}, - '63': {'OS': 'Unix','Description': 'Unix,ISC,SysV,ix,BSD,HURD'}, - '64': {'OS': 'SpeedStor / NetWare','Description': 'NetWare FS 286/2,PC-ARMOUR'}, - '65': {'OS': 'NetWare','Description': 'NetWare File System 386'}, - '66': {'OS': 'NetWare / NetWare','Description': 'NetWare FS 386 / SMS'}, - '67': {'OS': 'NetWare','Description': 'Wolf Mountain'}, - '68': {'OS': 'NetWare','Description': 'Unknown'}, - '69': {'OS': 'NetWare 5 / NetWare','Description': 'Novell Storage Services'}, - '6E': {'Description': 'Unknown'}, - '70': {'OS': 'DiskSecure','Description': 'DiskSecure multiboot'}, - '71': {'OS': 'Microsoft, IBM','Description': 'Reserved'}, - '72': {'OS': 'APTI systems / Unix V7/x86','Description': 'APTI altFAT12 / V7 / x86'}, - '73': {'OS': 'Microsoft, IBM','Description': 'Reserved'}, - '74': {'OS': 'Microsoft, IBM','Description': 'Reserved / Scramdisk'}, - '75': {'OS': 'PC/IX','Description': 'Unknown'}, - '76': {'OS': 'Microsoft, IBM','Description': 'Reserved'}, - '77': {'OS': 'Novell','Description': 'VNDI, M2FS, M2CS'}, - '78': {'OS': 'Geurt Vos','Description': 'XOSL bootloader file system'}, - '79': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (CHS, SFN)'}, - '7A': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (LBA, SFN)'}, - '7B': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16B (CHS, SFN)'}, - '7C': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (LBA, SFN)'}, - '7D': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (CHS, SFN)'}, - '7E': {'OS': 'F.I.X. (claim) / PrimoCache','Description': 'Level 2 cache'}, - '7F': {'OS': 'Varies','Description': 'AltOS DevPartition Standard'}, - '80': {'OS': 'Minix 1.1-1.4a','Description': 'Minix file system (old)'}, - '81': {'OS': 'Minix 1.4b+ / Linux','Description': 'MINIX FS/Mitac AdvDiskManager'}, - '82': {'OS': 'Linux / Sun Microsystems','Description': 'Swap / Solaris x86 / Prime'}, - '83': {'OS': 'GNU/Linux','Description': 'Any native Linux FS'}, - '84': {'OS': 'OS/2 / Windows 7','Description': 'Hibernat/HiddenC/RapidStart'}, - '85': {'OS': 'GNU/Linux','Description': 'Linux extended'}, - '86': {'OS': 'Windows NT 4 Server / Linux','Description': 'FAT16B mirror/LinuxRAID-old'}, - '87': {'OS': 'Windows NT 4 Server','Description': 'HPFS/NTFS mirrored volume'}, - '88': {'OS': 'GNU/Linux','Description': 'Plaintext partition table'}, - '8A': {'OS': 'AiR-BOOT','Description': 'Linux kernel image'}, - '8B': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'}, - '8C': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'}, - '8D': {'OS': 'Free FDISK','Description': 'Hidden FAT12'}, - '8E': {'OS': 'Linux','Description': 'Linux LVM'}, - '90': {'OS': 'Free FDISK','Description': 'Hidden FAT16'}, - '91': {'OS': 'Free FDISK','Description': 'Hidden extended partition'}, - '92': {'OS': 'Free FDISK','Description': 'Hidden FAT16B'}, - '93': {'OS': 'Amoeba / Linux','Description': 'Amoeba native/Hidden Linux'}, - '94': {'OS': 'Amoeba','Description': 'Amoeba bad block table'}, - '95': {'OS': 'EXOPC','Description': 'EXOPC native'}, - '96': {'OS': 'CHRP','Description': 'ISO-9660 file system'}, - '97': {'OS': 'Free FDISK','Description': 'Hidden FAT32'}, - '98': {'OS': 'Free FDISK / ROM-DOS','Description': 'Hidden FAT32 / service part'}, - '99': {'OS': 'early Unix','Description': 'Unknown'}, - '9A': {'OS': 'Free FDISK','Description': 'Hidden FAT16'}, - '9B': {'OS': 'Free FDISK','Description': 'Hidden extended partition'}, - '9E': {'OS': 'VSTA / ForthOS','Description': 'ForthOS (eForth port)'}, - '9F': {'OS': 'BSD/OS 3.0+, BSDI','Description': 'Unknown'}, - 'A0': {'OS': 'HP/Phoenix/IBM/Toshiba/Sony','Description': 'Diagnostic for HP/Hibernate'}, - 'A1': {'OS': 'HP / Phoenix, NEC','Description': 'HP Vol Expansion/Hibernate'}, - 'A2': {'OS': 'Cyclone V','Description': 'Hard Processor System (HPS)'}, - 'A3': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'}, - 'A4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'}, - 'A5': {'OS': 'BSD','Description': 'BSD slice'}, - 'A6': {'OS': 'OpenBSD','Description': 'HP Vol Expansion/BSD slice'}, - 'A7': {'OS': 'NeXT','Description': 'NeXTSTEP'}, - 'A8': {'OS': 'Darwin, Mac OS X','Description': 'Apple Darwin, Mac OS X UFS'}, - 'A9': {'OS': 'NetBSD','Description': 'NetBSD slice'}, - 'AA': {'OS': 'MS-DOS','Description': 'Olivetti DOS FAT12(1.44 MB)'}, - 'AB': {'OS': 'Darwin, Mac OS X / GO! OS','Description': 'Apple Darwin/OS X boot/GO!'}, - 'AD': {'OS': 'RISC OS','Description': 'ADFS / FileCore format'}, - 'AE': {'OS': 'ShagOS','Description': 'ShagOS file system'}, - 'AF': {'OS': 'ShagOS','Description': 'OS X HFS & HFS+/ShagOS Swap'}, - 'B0': {'OS': 'Boot-Star','Description': 'Boot-Star dummy partition'}, - 'B1': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'}, - 'B2': {'OS': 'QNX 6.x','Description': 'QNX Neutrino power-safe FS'}, - 'B3': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'}, - 'B4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'}, - 'B6': {'OS': 'Windows NT 4 Server','Description': 'HPVolExpansion/FAT16Bmirror'}, - 'B7': {'OS': 'BSDI / Windows NT 4 Server','Description': 'BSDI,Swap,HPFS/NTFS mirror'}, - 'B8': {'OS': 'BSDI (before 3.0)','Description': 'BSDI Swap / native FS'}, - 'BB': {'OS': 'Acronis/BootWizard/WinNT 4','Description': 'BootWizard/OEM/FAT32 mirror'}, - 'BC': {'OS': 'Acronis/WinNT/BackupCapsule','Description': 'FAT32RAID/SecureZone/Backup'}, - 'BD': {'OS': 'BonnyDOS/286','Description': 'Unknown'}, - 'BE': {'OS': 'Solaris 8','Description': 'Solaris 8 boot'}, - 'BF': {'OS': 'Solaris','Description': 'Solaris x86'}, - 'C0': {'OS': 'DR-DOS,MultiuserDOS,REAL/32','Description': 'Secured FAT (under 32 MB)'}, - 'C1': {'OS': 'DR DOS','Description': 'Secured FAT12'}, - 'C2': {'OS': 'Power Boot','Description': 'Hidden Linux native FS'}, - 'C3': {'OS': 'Power Boot','Description': 'Hidden Linux Swap'}, - 'C4': {'OS': 'DR DOS','Description': 'Secured FAT16'}, - 'C5': {'OS': 'DR DOS','Description': 'Secured extended partition'}, - 'C6': {'OS': 'DR DOS / WinNT 4 Server','Description': 'Secured FAT16B/FAT16Bmirror'}, - 'C7': {'OS': 'Syrinx / WinNT 4 Server','Description': 'Syrinx boot/HPFS/NTFSmirror'}, - 'C8': {'Description': "DR-DOS Reserved (since '97)"}, - 'C9': {'Description': "DR-DOS Reserved (since '97)"}, - 'CA': {'Description': "DR-DOS Reserved (since '97)"}, - 'CB': {'OS': 'DR-DOSx / WinNT 4 Server','Description': 'Secured FAT32/FAT32 mirror'}, - 'CC': {'OS': 'DR-DOSx / WinNT 4 Server','Description': 'Secured FAT32/FAT32 mirror'}, - 'CD': {'OS': 'CTOS','Description': 'Memory dump'}, - 'CE': {'OS': 'DR-DOSx','Description': 'Secured FAT16B'}, - 'CF': {'OS': 'DR-DOSx','Description': 'Secured extended partition'}, - 'D0': {'OS': 'Multiuser DOS, REAL/32','Description': 'Secured FAT (over 32 MB)'}, - 'D1': {'OS': 'Multiuser DOS','Description': 'Secured FAT12'}, - 'D4': {'OS': 'Multiuser DOS','Description': 'Secured FAT16'}, - 'D5': {'OS': 'Multiuser DOS','Description': 'Secured extended partition'}, - 'D6': {'OS': 'Multiuser DOS','Description': 'Secured FAT16B'}, - 'D8': {'OS': 'Digital Research','Description': 'CP/M-86 [citation needed]'}, - 'DA': {'OS': 'Powercopy Backup','Description': 'Non-FS data / Shielded disk'}, - 'DB': {'OS': 'CP/M-86/CDOS/CTOS/D800/DRMK','Description': 'CP/M-86/ConcDOS/Boot/FAT32'}, - 'DD': {'OS': 'CTOS','Description': 'Hidden memory dump'}, - 'DE': {'OS': 'Dell','Description': 'FAT16 utility/diagnostic'}, - 'DF': {'OS': 'DG/UX / BootIt / Aviion','Description': 'DG/UX Virt DiskMan / EMBRM'}, - 'E0': {'OS': 'STMicroelectronics','Description': 'ST AVFS'}, - 'E1': {'OS': 'SpeedStor','Description': 'ExtendedFAT12 >1023cylinder'}, - 'E2': {'Description': 'DOS read-only (XFDISK)'}, - 'E3': {'OS': 'SpeedStor','Description': 'DOS read-only'}, - 'E4': {'OS': 'SpeedStor','Description': 'ExtendedFAT16 <1024cylinder'}, - 'E5': {'OS': 'Tandy MS-DOS','Description': 'Logical FAT12 or FAT16'}, - 'E6': {'OS': 'SpeedStor','Description': 'Unknown'}, - 'E8': {'OS': 'LUKS','Description': 'Linux Unified Key Setup'}, - 'EB': {'OS': 'BeOS, Haiku','Description': 'BFS'}, - 'EC': {'OS': 'SkyOS','Description': 'SkyFS'}, - 'ED': {'OS': 'Sprytix / EDD 4','Description': 'EDC loader / GPT hybrid MBR'}, - 'EE': {'OS': 'EFI','Description': 'GPT protective MBR'}, - 'EF': {'OS': 'EFI','Description': 'EFI system partition'}, - 'F0': {'OS': 'Linux / OS/32','Description': 'PA-RISC Linux boot loader.'}, - 'F1': {'OS': 'SpeedStor','Description': 'Unknown'}, - 'F2': {'OS': 'SperryIT DOS/Unisys DOS','Description': 'Logical FAT12/FAT16'}, - 'F3': {'OS': 'SpeedStor','Description': 'Unknown'}, - 'F4': {'OS': 'SpeedStor / Prologue','Description': '"large"DOS part/NGF/TwinFS'}, - 'F5': {'OS': 'Prologue','Description': 'MD0-MD9 part for NGF/TwinFS'}, - 'F6': {'OS': 'SpeedStor','Description': 'Unknown'}, - 'F7': {'OS': 'O.S.G. / X1','Description': 'EFAT / Solid State FS'}, - 'F9': {'OS': 'Linux','Description': 'pCache ext2/ext3 cache'}, - 'FA': {'OS': 'Bochs','Description': 'x86 emulator'}, - 'FB': {'OS': 'VMware','Description': 'VMware VMFS partition'}, - 'FC': {'OS': 'VMware','Description': 'Swap / VMKCORE kernel dump'}, - 'FD': {'OS': 'Linux / FreeDOS','Description': 'LinuxRAID/Reserved4FreeDOS'}, - 'FE': {'OS': 'SpeedStor/LANstep/NT/Linux','Description': 'PS/2/DiskAdmin/old LinuxLVM'}, - 'FF': {'OS': 'XENIX','Description': 'XENIX bad block table'}, - '00000000-0000-0000-0000-000000000000': {'Description': 'Unused entry'}, - '024DEE41-33E7-11D3-9D69-0008C781F39F': {'Description': 'MBR partition scheme'}, - 'C12A7328-F81F-11D2-BA4B-00A0C93EC93B': {'Description': 'EFI System partition'}, - '21686148-6449-6E6F-744E-656564454649': {'Description': 'BIOS Boot partition'}, - 'D3BFE2DE-3DAF-11DF-BA40-E3A556D89593': {'Description': 'Intel Fast Flash (iFFS) partition (for Intel Rapid Start technology)'}, - 'F4019732-066E-4E12-8273-346C5641494F': {'Description': 'Sony boot partition'}, - 'BFBFAFE7-A34F-448A-9A5B-6213EB736C22': {'Description': 'Lenovo boot partition'}, - 'E3C9E316-0B5C-4DB8-817D-F92DF00215AE': {'OS': 'Windows', 'Description': 'Microsoft Reserved Partition (MSR)'}, - 'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7': {'OS': 'Windows', 'Description': 'Basic data partition'}, - '5808C8AA-7E8F-42E0-85D2-E1E90434CFB3': {'OS': 'Windows', 'Description': 'Logical Disk Manager (LDM) metadata partition'}, - 'AF9B60A0-1431-4F62-BC68-3311714A69AD': {'OS': 'Windows', 'Description': 'Logical Disk Manager data partition'}, - 'DE94BBA4-06D1-4D40-A16A-BFD50179D6AC': {'OS': 'Windows', 'Description': 'Windows Recovery Environment'}, - '37AFFC90-EF7D-4E96-91C3-2D7AE055B174': {'OS': 'Windows', 'Description': 'IBM General Parallel File System (GPFS) partition'}, - 'E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D': {'OS': 'Windows', 'Description': 'Storage Spaces partition'}, - '75894C1E-3AEB-11D3-B7C1-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Data partition'}, - 'E2A1E728-32E3-11D6-A682-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Service Partition'}, - '0FC63DAF-8483-4772-8E79-3D69D8477DE4': {'OS': 'Linux', 'Description': 'Linux filesystem data'}, - 'A19D880F-05FC-4D3B-A006-743F0F84911E': {'OS': 'Linux', 'Description': 'RAID partition'}, - '44479540-F297-41B2-9AF7-D131D5F0458A': {'OS': 'Linux', 'Description': 'Root partition (x86)'}, - '4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709': {'OS': 'Linux', 'Description': 'Root partition (x86-64)'}, - '69DAD710-2CE4-4E3C-B16C-21A1D49ABED3': {'OS': 'Linux', 'Description': 'Root partition (32-bit ARM)'}, - 'B921B045-1DF0-41C3-AF44-4C6F280D3FAE': {'OS': 'Linux', 'Description': 'Root partition (64-bit ARM)/AArch64)'}, - '0657FD6D-A4AB-43C4-84E5-0933C84B4F4F': {'OS': 'Linux', 'Description': 'Swap partition'}, - 'E6D6D379-F507-44C2-A23C-238F2A3DF928': {'OS': 'Linux', 'Description': 'Logical Volume Manager (LVM) partition'}, - '933AC7E1-2EB4-4F13-B844-0E14E2AEF915': {'OS': 'Linux', 'Description': '/home partition'}, - '3B8F8425-20E0-4F3B-907F-1A25A76F98E8': {'OS': 'Linux', 'Description': '/srv (server data) partition'}, - '7FFEC5C9-2D00-49B7-8941-3EA10A5586B7': {'OS': 'Linux', 'Description': 'Plain dm-crypt partition'}, - 'CA7D7CCB-63ED-4C53-861C-1742536059CC': {'OS': 'Linux', 'Description': 'LUKS partition'}, - '8DA63339-0007-60C0-C436-083AC8230908': {'OS': 'Linux', 'Description': 'Reserved'}, - '83BD6B9D-7F41-11DC-BE0B-001560B84F0F': {'OS': 'FreeBSD', 'Description': 'Boot partition'}, - '516E7CB4-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Data partition'}, - '516E7CB5-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Swap partition'}, - '516E7CB6-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Unix File System (UFS) partition'}, - '516E7CB8-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Vinum volume manager partition'}, - '516E7CBA-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'ZFS partition'}, - '48465300-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Hierarchical File System Plus (HFS+) partition'}, - '55465300-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple UFS'}, - '6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'OS X Darwin', 'Description': 'ZFS'}, - '52414944-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple RAID partition'}, - '52414944-5F4F-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple RAID partition, offline'}, - '426F6F74-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Boot partition (Recovery HD)'}, - '4C616265-6C00-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Label'}, - '5265636F-7665-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple TV Recovery partition'}, - '53746F72-6167-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Core Storage (i.e. Lion FileVault) partition'}, - '6A82CB45-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Boot partition'}, - '6A85CF4D-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Root partition'}, - '6A87C46F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Swap partition'}, - '6A8B642B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Backup partition'}, - '6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/usr partition'}, - '6A8EF2E9-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/var partition'}, - '6A90BA39-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/home partition'}, - '6A9283A5-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Alternate sector'}, - '6A945A3B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Reserved partition'}, - '6A9630D1-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'}, - '6A980767-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'}, - '6A96237F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'}, - '6A8D2AC7-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'}, - '49F48D32-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Swap partition'}, - '49F48D5A-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'FFS partition'}, - '49F48D82-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'LFS partition'}, - '49F48DAA-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'RAID partition'}, - '2DB519C4-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Concatenated partition'}, - '2DB519EC-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Encrypted partition'}, - 'FE3A2A5D-4F32-41A7-B725-ACCC3285A309': {'OS': 'ChromeOS', 'Description': 'ChromeOS kernel'}, - '3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC': {'OS': 'ChromeOS', 'Description': 'ChromeOS rootfs'}, - '2E0A753D-9E48-43B0-8337-B15192CB1B5E': {'OS': 'ChromeOS', 'Description': 'ChromeOS future use'}, - '42465331-3BA3-10F1-802A-4861696B7521': {'OS': 'Haiku', 'Description': 'Haiku BFS'}, - '85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Boot partition'}, - '85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Data partition'}, - '85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Swap partition'}, - '0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Unix File System (UFS) partition'}, - '85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Vinum volume manager partition'}, - '85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'ZFS partition'}, - '45B0969E-9B03-4F30-B4C6-B4B80CEFF106': {'OS': 'Ceph', 'Description': 'Ceph Journal'}, - '45B0969E-9B03-4F30-B4C6-5EC00CEFF106': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt Encrypted Journal'}, - '4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph OSD'}, - '4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt OSD'}, - '89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph disk in creation'}, - '89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt disk in creation'}, - '824CC7A0-36A8-11E3-890A-952519AD3F61': {'OS': 'OpenBSD', 'Description': 'Data partition'}, - 'CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1': {'OS': 'QNX', 'Description': 'Power-safe (QNX6) file system'}, - 'C91818F9-8025-47AF-89D2-F030D7000C2C': {'OS': 'Plan 9', 'Description': 'Plan 9 partition'}, - '9D275380-40AD-11DB-BF97-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'vmkcore (coredump partition)'}, - 'AA31E02A-400F-11DB-9590-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMFS filesystem partition'}, - '9198EFFC-31C0-11DB-8F78-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMware Reserved'}, - '2568845D-2332-4675-BC39-8FA5A4748D15': {'OS': 'Android-IA', 'Description': 'Bootloader'}, - '114EAFFE-1552-4022-B26E-9B053604CF84': {'OS': 'Android-IA', 'Description': 'Bootloader2'}, - '49A4D17F-93A3-45C1-A0DE-F50B2EBE2599': {'OS': 'Android-IA', 'Description': 'Boot'}, - '4177C722-9E92-4AAB-8644-43502BFD5506': {'OS': 'Android-IA', 'Description': 'Recovery'}, - 'EF32A33B-A409-486C-9141-9FFB711F6266': {'OS': 'Android-IA', 'Description': 'Misc'}, - '20AC26BE-20B7-11E3-84C5-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Metadata'}, - '38F428E6-D326-425D-9140-6E0EA133647C': {'OS': 'Android-IA', 'Description': 'System'}, - 'A893EF21-E428-470A-9E55-0668FD91A2D9': {'OS': 'Android-IA', 'Description': 'Cache'}, - 'DC76DDA9-5AC1-491C-AF42-A82591580C0D': {'OS': 'Android-IA', 'Description': 'Data'}, - 'EBC597D0-2053-4B15-8B64-E0AAC75F4DB1': {'OS': 'Android-IA', 'Description': 'Persistent'}, - '8F68CC74-C5E5-48DA-BE91-A0C8C15E9C80': {'OS': 'Android-IA', 'Description': 'Factory'}, - '767941D0-2085-11E3-AD3B-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Fastboot / Tertiary'}, - 'AC6D7924-EB71-4DF8-B48D-E267B27148FF': {'OS': 'Android-IA', 'Description': 'OEM'}, - '7412F7D5-A156-4B13-81DC-867174929325': {'OS': 'ONIE', 'Description': 'Boot'}, - 'D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149': {'OS': 'ONIE', 'Description': 'Config'}, - '9E1A2D38-C612-4316-AA26-8B49521E5A8B': {'OS': 'PowerPC', 'Description': 'PReP boot'}, - 'BC13C2FF-59E6-4262-A352-B275FD6F7172': {'OS': 'Freedesktop', 'Description': 'Extended Boot Partition ($BOOT)'}, -} - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/settings/sensors.py b/scripts/wk.prev/settings/sensors.py deleted file mode 100644 index cdfdf708..00000000 --- a/scripts/wk.prev/settings/sensors.py +++ /dev/null @@ -1,21 +0,0 @@ -# Wizard Kit: Settings - Sensors - -import re - -# General -TEMP_LIMITS = { - 'GREEN': 60, - 'YELLOW': 70, - 'ORANGE': 80, - 'RED': 90, - } - - -# Regex -REGEX_COLORS = re.compile(r'\033\[\d+;?1?m') - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/settings/setup.py b/scripts/wk.prev/settings/setup.py deleted file mode 100644 index ec3219a2..00000000 --- a/scripts/wk.prev/settings/setup.py +++ /dev/null @@ -1,194 +0,0 @@ -'''Wizard Kit: Settings - Setup''' -# pylint: disable=bad-continuation,line-too-long -# vim: sts=2 sw=2 ts=2 - -import os -try: - import winreg - HKU = winreg.HKEY_USERS - HKCR = winreg.HKEY_CLASSES_ROOT - HKCU = winreg.HKEY_CURRENT_USER - HKLM = winreg.HKEY_LOCAL_MACHINE -except ImportError: - if os.name != 'posix': - raise - -# General -OTHER_RESULTS = { - 'Error': { - 'CalledProcessError': 'Unknown Error', - 'FileNotFoundError': 'File not found', - }, - 'Warning': {}, - } - -# Browsers -MOZILLA_FIREFOX_UBO_PATH = r'{}\{}\ublock_origin.xpi'.format( - os.environ.get('PROGRAMFILES'), - r'Mozilla Firefox\distribution\extensions') -SETTINGS_GOOGLE_CHROME = { - r'Software\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm': { - 'SZ Items': { - 'update_url': 'https://clients2.google.com/service/update2/crx'}, - 'WOW64_32': True, - }, - r'Software\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco': { - 'SZ Items': { - 'update_url': 'https://clients2.google.com/service/update2/crx'}, - 'WOW64_32': True, - }, - } -SETTINGS_MOZILLA_FIREFOX_32 = { - r'Software\Mozilla\Firefox\Extensions': { - 'SZ Items': { - 'uBlock0@raymondhill.net': MOZILLA_FIREFOX_UBO_PATH}, - 'WOW64_32': True, - }, - } -SETTINGS_MOZILLA_FIREFOX_64 = { - r'Software\Mozilla\Firefox\Extensions': { - 'SZ Items': { - 'uBlock0@raymondhill.net': MOZILLA_FIREFOX_UBO_PATH}, - }, - } - -# Classic Start -SETTINGS_CLASSIC_START = { - r'Software\IvoSoft\ClassicShell\Settings': {}, - r'Software\IvoSoft\ClassicStartMenu': { - 'DWORD Items': {'ShowedStyle2': 1}, - }, - r'Software\IvoSoft\ClassicStartMenu\MRU': {}, - r'Software\IvoSoft\ClassicStartMenu\Settings': { - 'DWORD Items': {'SkipMetro': 1}, - 'SZ Items': { - 'MenuStyle': 'Win7', - 'RecentPrograms': 'Recent', - }, - }, - } - -# Explorer -SETTINGS_EXPLORER_SYSTEM = { - # Disable Location Tracking - r'Software\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}': { - 'DWORD Items': {'SensorPermissionState': 0}, - }, - r'System\CurrentControlSet\Services\lfsvc\Service\Configuration': { - 'Status': {'Value': 0}, - }, - # Disable Telemetry - r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': { - # Using SOFTWARE in all caps to avoid collision with 32-bit setting below - 'DWORD Items': {'AllowTelemetry': 0}, - }, - r'Software\Microsoft\Windows\CurrentVersion\Policies\DataCollection': { - 'DWORD Items': {'AllowTelemetry': 0}, - 'WOW64_32': True, - }, - r'Software\Policies\Microsoft\Windows\DataCollection': { - 'DWORD Items': {'AllowTelemetry': 0}, - }, - # Disable Wi-Fi Sense - r'Software\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting': { - 'DWORD Items': {'Value': 0}, - }, - r'Software\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots': { - 'DWORD Items': {'Value': 0}, - }, - } -SETTINGS_EXPLORER_USER = { - # Desktop theme - r'Software\Microsoft\Windows\CurrentVersion\Themes\Personalize': { - 'Invalid modes': ['Cur'], - 'DWORD Items': { - # <= v1809 default - 'AppsUseLightTheme': 1, - 'SystemUsesLightTheme': 0, - }, - }, - # Disable features - r'Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager': { - 'DWORD Items': { - # Silently installed apps - 'SilentInstalledAppsEnabled': 0, - # Tips and Tricks - 'SoftLandingEnabled ': 0, - 'SubscribedContent-338389Enabled': 0, - }, - }, - # File Explorer - r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced': { - 'Invalid modes': ['Cur'], - 'DWORD Items': { - # Change default Explorer view to "Computer" - 'LaunchTo': 1, - }, - }, - r'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced': { - # Dup path so it Will be applied to all modes - 'DWORD Items': { - # Launch Folder Windows in a Separate Process - 'SeparateProcess': 1, - }, - }, - # Hide People bar - r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\People': { - 'Invalid modes': ['Cur'], - 'DWORD Items': {'PeopleBand': 0}, - }, - # Hide Search button / box - r'Software\Microsoft\Windows\CurrentVersion\Search': { - 'Invalid modes': ['Cur'], - 'DWORD Items': {'SearchboxTaskbarMode': 0}, - }, - } - -# LibreOffice -LIBREOFFICE_XCU_DATA = ''' - -Impress MS PowerPoint 2007 XML -Calc MS Excel 2007 XML -MS Word 2007 XML -false - -''' - -# Visual C++ Runtimes -VCR_REDISTS = [ - {'Name': 'Visual C++ 2010 x32...', - 'Cmd': [r'2010sp1\x32\vcredist.exe', '/passive', '/norestart']}, - {'Name': 'Visual C++ 2010 x64...', - 'Cmd': [r'2010sp1\x64\vcredist.exe', '/passive', '/norestart']}, - {'Name': 'Visual C++ 2012 Update 4 x32...', - 'Cmd': [r'2012u4\x32\vcredist.exe', '/passive', '/norestart']}, - {'Name': 'Visual C++ 2012 Update 4 x64...', - 'Cmd': [r'2012u4\x64\vcredist.exe', '/passive', '/norestart']}, - {'Name': 'Visual C++ 2013 x32...', - 'Cmd': [r'2013\x32\vcredist.exe', '/install', - '/passive', '/norestart']}, - {'Name': 'Visual C++ 2013 x64...', - 'Cmd': [r'2013\x64\vcredist.exe', '/install', - '/passive', '/norestart']}, - {'Name': 'Visual C++ 2017 x32...', - 'Cmd': [r'2017\x32\vcredist.exe', '/install', - '/passive', '/norestart']}, - {'Name': 'Visual C++ 2017 x64...', - 'Cmd': [r'2017\x64\vcredist.exe', '/install', - '/passive', '/norestart']}, - ] - -# Windows Updates -SETTINGS_WINDOWS_UPDATES = { - r'Software\Microsoft\WindowsUpdate\UX\Settings': { - 'DWORD Items': { - # Set to non-targeted readiness level - 'BranchReadinessLevel': 32, - 'DeferFeatureUpdatesPeriodInDays': 60, - }, - } - } - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") diff --git a/scripts/wk.prev/settings/sources.py b/scripts/wk.prev/settings/sources.py deleted file mode 100644 index 1605d5f2..00000000 --- a/scripts/wk.prev/settings/sources.py +++ /dev/null @@ -1,229 +0,0 @@ -'''Wizard Kit: Settings - Sources''' -# pylint: disable=line-too-long -# vim: sts=2 sw=2 ts=2 tw=0 - -SOURCE_URLS = { - 'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1901020098/AcroRdrDC1901020098_en_US.exe', - 'AdwCleaner': 'https://downloads.malwarebytes.com/file/adwcleaner', - 'AIDA64': 'http://download.aida64.com/aida64engineer599.zip', - 'aria2': 'https://github.com/aria2/aria2/releases/download/release-1.34.0/aria2-1.34.0-win-32bit-build1.zip', - 'Autoruns': 'https://download.sysinternals.com/files/Autoruns.zip', - 'BleachBit': 'https://download.bleachbit.org/BleachBit-2.0-portable.zip', - 'BlueScreenView32': 'http://www.nirsoft.net/utils/bluescreenview.zip', - 'BlueScreenView64': 'http://www.nirsoft.net/utils/bluescreenview-x64.zip', - 'Caffeine': 'http://www.zhornsoftware.co.uk/caffeine/caffeine.zip', - 'ClassicStartSkin': 'https://coddec.github.io/Classic-Shell/www.classicshell.net/forum/download/fileb1ba.php?id=3001', - 'Du': 'https://download.sysinternals.com/files/DU.zip', - 'ERUNT': 'http://www.aumha.org/downloads/erunt.zip', - 'Everything32': 'https://www.voidtools.com/Everything-1.4.1.935.x86.en-US.zip', - 'Everything64': 'https://www.voidtools.com/Everything-1.4.1.935.x64.en-US.zip', - 'FastCopy': 'https://fastcopy.jp/archive/FastCopy380_installer.exe', - 'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/1709472/ublock_origin-1.18.6-an+fx.xpi', - 'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe', - 'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe', - 'HWiNFO': 'http://files2.majorgeeks.com/377527622c5325acc1cb937fb149d0de922320c0/systeminfo/hwi_602.zip', - 'Intel SSD Toolbox': r'https://downloadmirror.intel.com/28593/eng/Intel%20SSD%20Toolbox%20-%20v3.5.9.exe', - 'IOBit_Uninstaller': r'https://portableapps.com/redirect/?a=IObitUninstallerPortable&s=s&d=pa&f=IObitUninstallerPortable_7.5.0.7.paf.exe', - 'KVRT': 'http://devbuilds.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe', - 'LibreOffice': 'https://download.documentfoundation.org/libreoffice/stable/6.2.4/win/x86_64/LibreOffice_6.2.4_Win_x64.msi', - 'Macs Fan Control': 'https://www.crystalidea.com/downloads/macsfancontrol_setup.exe', - 'NirCmd32': 'https://www.nirsoft.net/utils/nircmd.zip', - 'NirCmd64': 'https://www.nirsoft.net/utils/nircmd-x64.zip', - 'NotepadPlusPlus': 'https://notepad-plus-plus.org/repository/7.x/7.6.4/npp.7.6.4.bin.minimalist.7z', - 'Office Deployment Tool': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_11509-33604.exe', - 'ProduKey32': 'http://www.nirsoft.net/utils/produkey.zip', - 'ProduKey64': 'http://www.nirsoft.net/utils/produkey-x64.zip', - 'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip', - 'RKill': 'https://www.bleepingcomputer.com/download/rkill/dl/10/', - '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', - 'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe', - 'TestDisk': 'https://www.cgsecurity.org/testdisk-7.1-WIP.win.zip', - 'wimlib32': 'https://wimlib.net/downloads/wimlib-1.13.1-windows-i686-bin.zip', - 'wimlib64': 'https://wimlib.net/downloads/wimlib-1.13.1-windows-x86_64-bin.zip', - 'Winapp2': 'https://github.com/MoscaDotTo/Winapp2/archive/master.zip', - 'WizTree': 'https://antibody-software.com/files/wiztree_3_28_portable.zip', - 'XMPlay 7z': 'https://support.xmplay.com/files/16/xmp-7z.zip?v=800962', - 'XMPlay Game': 'https://support.xmplay.com/files/12/xmp-gme.zip?v=515637', - 'XMPlay RAR': 'https://support.xmplay.com/files/16/xmp-rar.zip?v=409646', - 'XMPlay WAModern': 'https://support.xmplay.com/files/10/WAModern.zip?v=207099', - 'XMPlay': 'https://support.xmplay.com/files/20/xmplay383.zip?v=298195', - 'XYplorerFree': 'https://www.xyplorer.com/download/xyplorer_free_noinstall.zip', - } -VCREDIST_SOURCES = { - '2010sp1': { - '32': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe', - '64': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe', - }, - '2012u4': { - '32': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe', - '64': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe', - }, - '2013': { - '32': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x86.exe', - '64': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x64.exe', - }, - '2017': { - '32': 'https://aka.ms/vs/15/release/vc_redist.x86.exe', - '64': 'https://aka.ms/vs/15/release/vc_redist.x64.exe', - }, - } -NINITE_REGEX = { - 'base': ['7-Zip', 'VLC'], - 'standard': ['Google Chrome', 'Mozilla Firefox', 'SumatraPDF'], - 'standard7': ['Google Chrome', 'Mozilla Firefox', 'SumatraPDF'], - } -NINITE_SOURCES = { - 'Bundles': { - 'base.exe': '.net4.7.2-7zip-vlc', - 'base-standard.exe': '.net4.7.2-7zip-chrome-classicstart-firefox-sumatrapdf-vlc', - 'base-standard7.exe': '.net4.7.2-7zip-chrome-firefox-sumatrapdf-vlc', - 'standard.exe': 'chrome-classicstart-firefox-sumatrapdf', - 'standard7.exe': 'chrome-firefox-sumatrapdf', - }, - 'Audio-Video': { - 'AIMP.exe': 'aimp', - 'Audacity.exe': 'audacity', - 'CCCP.exe': 'cccp', - 'Foobar2000.exe': 'foobar', - 'GOM.exe': 'gom', - 'HandBrake.exe': 'handbrake', - 'iTunes.exe': 'itunes', - 'K-Lite Codecs.exe': 'klitecodecs', - 'MediaMonkey.exe': 'mediamonkey', - 'MusicBee.exe': 'musicbee', - 'Spotify.exe': 'spotify', - 'VLC.exe': 'vlc', - 'Winamp.exe': 'winamp', - }, - 'Cloud Storage': { - 'Dropbox.exe': 'dropbox', - 'Google Backup & Sync.exe': 'googlebackupandsync', - 'Mozy.exe': 'mozy', - 'OneDrive.exe': 'onedrive', - 'SugarSync.exe': 'sugarsync', - }, - 'Communication': { - 'Discord.exe': 'discord', - 'Pidgin.exe': 'pidgin', - 'Skype.exe': 'skype', - 'Trillian.exe': 'trillian', - }, - 'Compression': { - '7-Zip.exe': '7zip', - 'PeaZip.exe': 'peazip', - 'WinRAR.exe': 'winrar', - }, - 'Developer': { - 'Eclipse.exe': 'eclipse', - 'Notepad++.exe': 'notepadplusplus', - 'PuTTY.exe': 'putty', - 'Python 2.exe': 'python', - 'Visual Studio Code.exe': 'vscode', - 'WinMerge.exe': 'winmerge', - 'WinSCP.exe': 'winscp', - }, - 'File Sharing': { - 'qBittorrent.exe': 'qbittorrent', - }, - 'Image-Photo': { - 'Blender.exe': 'blender', - 'FastStone.exe': 'faststone', - 'GIMP.exe': 'gimp', - 'Greenshot.exe': 'greenshot', - 'Inkscape.exe': 'inkscape', - 'IrfanView.exe': 'irfanview', - 'Krita.exe': 'krita', - 'Paint.NET.exe': 'paint.net', - 'ShareX.exe': 'sharex', - 'XnView.exe': 'xnview', - }, - 'Misc': { - 'Evernote.exe': 'evernote', - 'Everything.exe': 'everything', - 'KeePass 2.exe': 'keepass2', - 'Google Earth.exe': 'googleearth', - 'NV Access.exe': 'nvda', - 'Steam.exe': 'steam', - }, - 'Office': { - 'CutePDF.exe': 'cutepdf', - 'Foxit Reader.exe': 'foxit', - 'LibreOffice.exe': 'libreoffice', - 'OpenOffice.exe': 'openoffice', - 'PDFCreator.exe': 'pdfcreator', - 'SumatraPDF.exe': 'sumatrapdf', - 'Thunderbird.exe': 'thunderbird', - }, - 'Runtimes': { - 'Adobe Air.exe': 'air', - 'dotNET.exe': '.net4.7.2', - 'Shockwave.exe': 'shockwave', - 'Silverlight.exe': 'silverlight', - }, - 'Security': { - 'Avast.exe': 'avast', - 'AVG.exe': 'avg', - 'Avira.exe': 'avira', - 'Microsoft Security Essentials.exe': 'essentials', - 'Malwarebytes Anti-Malware.exe': 'malwarebytes', - 'Spybot 2.exe': 'spybot2', - 'SUPERAntiSpyware.exe': 'super', - }, - 'Utilities': { - 'CDBurnerXP.exe': 'cdburnerxp', - 'Classic Start.exe': 'classicstart', - 'Glary Utilities.exe': 'glary', - 'ImgBurn.exe': 'imgburn', - 'InfraRecorder.exe': 'infrarecorder', - 'Launchy.exe': 'launchy', - 'RealVNC.exe': 'realvnc', - 'Revo Uninstaller.exe': 'revo', - 'TeamViewer 14.exe': 'teamviewer14', - 'TeraCopy.exe': 'teracopy', - 'WinDirStat.exe': 'windirstat', - }, - 'Web Browsers': { - 'Google Chrome.exe': 'chrome', - 'Mozilla Firefox.exe': 'firefox', - 'Opera Chromium.exe': 'operaChromium', - }, - } -RST_SOURCES = { - #SetupRST_12.0.exe : Removed from download center? - #SetupRST_12.5.exe : Removed from download center? - #SetupRST_12.8.exe : Removed from download center? - 'SetupRST_12.9.exe': 'https://downloadmirror.intel.com/23496/eng/SetupRST.exe', - #SetupRST_13.x.exe : Broken, doesn't support > .NET 4.5 - 'SetupRST_14.0.exe': 'https://downloadmirror.intel.com/25091/eng/SetupRST.exe', - 'SetupRST_14.8.exe': 'https://downloadmirror.intel.com/26759/eng/setuprst.exe', - 'SetupRST_15.8.exe': 'https://downloadmirror.intel.com/27442/eng/SetupRST.exe', - 'SetupRST_15.9.exe': 'https://downloadmirror.intel.com/28656/eng/SetupRST.exe', - #SetupRST_16.0.exe : Deprecated by Intel - #SetupRST_16.5.exe : Deprecated by Intel - #SetupRST_16.7.exe : Deprecated by Intel - 'SetupRST_16.8.exe': 'https://downloadmirror.intel.com/28653/eng/SetupRST.exe', - 'SetupRST_17.2.exe': 'https://downloadmirror.intel.com/28650/eng/SetupRST.exe', - } -WINDOWS_UPDATE_SOURCES = { - '2999226': { - # https://support.microsoft.com/en-us/help/2999226/update-for-universal-c-runtime-in-windows - '7': { - '32': 'https://download.microsoft.com/download/4/F/E/4FE73868-5EDD-4B47-8B33-CE1BB7B2B16A/Windows6.1-KB2999226-x86.msu', - '64': 'https://download.microsoft.com/download/1/1/5/11565A9A-EA09-4F0A-A57E-520D5D138140/Windows6.1-KB2999226-x64.msu', - }, - '8': { - '32': 'https://download.microsoft.com/download/1/E/8/1E8AFE90-5217-464D-9292-7D0B95A56CE4/Windows8-RT-KB2999226-x86.msu', - '64': 'https://download.microsoft.com/download/A/C/1/AC15393F-A6E6-469B-B222-C44B3BB6ECCC/Windows8-RT-KB2999226-x64.msu', - }, - '8.1': { - '32': 'https://download.microsoft.com/download/E/4/6/E4694323-8290-4A08-82DB-81F2EB9452C2/Windows8.1-KB2999226-x86.msu', - '64': 'https://download.microsoft.com/download/9/6/F/96FD0525-3DDF-423D-8845-5F92F4A6883E/Windows8.1-KB2999226-x64.msu', - }, - }, - } - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") diff --git a/scripts/wk.prev/settings/sw_diags.py b/scripts/wk.prev/settings/sw_diags.py deleted file mode 100644 index 00892943..00000000 --- a/scripts/wk.prev/settings/sw_diags.py +++ /dev/null @@ -1,29 +0,0 @@ -# Wizard Kit: Settings - SW Diagnostics - -# General -AUTORUNS_SETTINGS = { - r'Software\Sysinternals\AutoRuns': { - 'checkvirustotal': 1, - 'EulaAccepted': 1, - 'shownomicrosoft': 1, - 'shownowindows': 1, - 'showonlyvirustotal': 1, - 'submitvirustotal': 0, - 'verifysignatures': 1, - }, - r'Software\Sysinternals\AutoRuns\SigCheck': { - 'EulaAccepted': 1, - }, - r'Software\Sysinternals\AutoRuns\Streams': { - 'EulaAccepted': 1, - }, - r'Software\Sysinternals\AutoRuns\VirusTotal': { - 'VirusTotalTermsAccepted': 1, - }, - } - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/settings/tools.py b/scripts/wk.prev/settings/tools.py deleted file mode 100644 index dd3812e1..00000000 --- a/scripts/wk.prev/settings/tools.py +++ /dev/null @@ -1,59 +0,0 @@ -# Wizard Kit: Settings - Tools - -TOOLS = { - # NOTE: BinDir will be prepended to these paths at runtime - 'AIDA64': { - '32': r'AIDA64\aida64.exe'}, - 'AutoRuns': { - '32': r'Autoruns\autoruns.exe', - '64': r'Autoruns\autoruns64.exe'}, - 'BleachBit': { - '32': r'BleachBit\bleachbit_console.exe'}, - 'Caffeine': { - '32': r'Caffeine\caffeine.exe'}, - 'Du': { - '32': r'Du\du.exe', - '64': r'Du\du64.exe'}, - 'ERUNT': { - '32': r'ERUNT\ERUNT.EXE'}, - 'Everything': { - '32': r'Everything\Everything.exe', - '64': r'Everything\Everything64.exe'}, - 'FastCopy': { - '32': r'FastCopy\FastCopy.exe', - '64': r'FastCopy\FastCopy64.exe'}, - 'HitmanPro': { - '32': r'HitmanPro\HitmanPro.exe', - '64': r'HitmanPro\HitmanPro64.exe'}, - 'HWiNFO': { - '32': r'HWiNFO\HWiNFO.exe', - '64': r'HWiNFO\HWiNFO64.exe'}, - 'KVRT': { - '32': r'KVRT\KVRT.exe'}, - 'NirCmd': { - '32': r'NirCmd\nircmdc.exe', - '64': r'NirCmd\nircmdc64.exe'}, - 'NotepadPlusPlus': { - '32': r'NotepadPlusPlus\notepadplusplus.exe'}, - 'ProduKey': { - '32': r'ProduKey\ProduKey.exe', - '64': r'ProduKey\ProduKey64.exe'}, - 'RKill': { - '32': r'RKill\RKill.exe'}, - 'SevenZip': { - '32': r'7-Zip\7za.exe', - '64': r'7-Zip\7za64.exe'}, - 'TDSSKiller': { - '32': r'TDSSKiller\TDSSKiller.exe'}, - 'wimlib-imagex': { - '32': r'wimlib\x32\wimlib-imagex.exe', - '64': r'wimlib\x64\wimlib-imagex.exe'}, - 'XMPlay': { - '32': r'XMPlay\xmplay.exe'}, - } - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/settings/windows_builds.py b/scripts/wk.prev/settings/windows_builds.py deleted file mode 100644 index 68b09bfe..00000000 --- a/scripts/wk.prev/settings/windows_builds.py +++ /dev/null @@ -1,258 +0,0 @@ -'''Wizard Kit: Settings - Windows Builds''' -# pylint: disable=bad-continuation,bad-whitespace -# vim: sts=2 sw=2 ts=2 -## NOTE: Data from here: https://en.wikipedia.org/wiki/Windows_10_version_history - -WINDOWS_BUILDS = { - # Build, Version, Release, Codename, Marketing Name, Notes - '6000': ('Vista', 'RTM', 'Longhorn', None, 'unsupported'), - '6001': ('Vista', 'SP1', 'Longhorn', None, 'unsupported'), - '6002': ('Vista', 'SP2', 'Longhorn', None, 'unsupported'), - - '7600': ('7', 'RTM', 'Vienna', None, 'unsupported'), - '7601': ('7', 'SP1', 'Vienna', None, 'outdated'), - - #9199 is a fake build since Win 8 is 6.2.9200 but that collides with Win 8.1 (6.3.9200) - '9199': ('8', 'RTM', None, None, 'unsupported'), - - '9200': ('8.1', None, 'Blue', None, 'outdated'), - '9600': ('8.1', None, 'Update', None, None), - - '9841': ('10', None, 'Threshold 1', None, 'preview build'), - '9860': ('10', None, 'Threshold 1', None, 'preview build'), - '9879': ('10', None, 'Threshold 1', None, 'preview build'), - '9926': ('10', None, 'Threshold 1', None, 'preview build'), - '10041': ('10', None, 'Threshold 1', None, 'preview build'), - '10049': ('10', None, 'Threshold 1', None, 'preview build'), - '10061': ('10', None, 'Threshold 1', None, 'preview build'), - '10074': ('10', None, 'Threshold 1', None, 'preview build'), - '10122': ('10', None, 'Threshold 1', None, 'preview build'), - '10130': ('10', None, 'Threshold 1', None, 'preview build'), - '10158': ('10', None, 'Threshold 1', None, 'preview build'), - '10159': ('10', None, 'Threshold 1', None, 'preview build'), - '10162': ('10', None, 'Threshold 1', None, 'preview build'), - '10166': ('10', None, 'Threshold 1', None, 'preview build'), - '10240': ('10', 'v1507', 'Threshold 1', None, 'unsupported'), - '10525': ('10', None, 'Threshold 2', None, 'preview build'), - '10532': ('10', None, 'Threshold 2', None, 'preview build'), - '10547': ('10', None, 'Threshold 2', None, 'preview build'), - '10565': ('10', None, 'Threshold 2', None, 'preview build'), - '10576': ('10', None, 'Threshold 2', None, 'preview build'), - '10586': ('10', 'v1511', 'Threshold 2', 'November Update', 'unsupported'), - '11082': ('10', None, 'Redstone 1', None, 'preview build'), - '11099': ('10', None, 'Redstone 1', None, 'preview build'), - '11102': ('10', None, 'Redstone 1', None, 'preview build'), - '14251': ('10', None, 'Redstone 1', None, 'preview build'), - '14257': ('10', None, 'Redstone 1', None, 'preview build'), - '14271': ('10', None, 'Redstone 1', None, 'preview build'), - '14279': ('10', None, 'Redstone 1', None, 'preview build'), - '14291': ('10', None, 'Redstone 1', None, 'preview build'), - '14295': ('10', None, 'Redstone 1', None, 'preview build'), - '14316': ('10', None, 'Redstone 1', None, 'preview build'), - '14328': ('10', None, 'Redstone 1', None, 'preview build'), - '14332': ('10', None, 'Redstone 1', None, 'preview build'), - '14342': ('10', None, 'Redstone 1', None, 'preview build'), - '14352': ('10', None, 'Redstone 1', None, 'preview build'), - '14361': ('10', None, 'Redstone 1', None, 'preview build'), - '14366': ('10', None, 'Redstone 1', None, 'preview build'), - '14367': ('10', None, 'Redstone 1', None, 'preview build'), - '14371': ('10', None, 'Redstone 1', None, 'preview build'), - '14372': ('10', None, 'Redstone 1', None, 'preview build'), - '14376': ('10', None, 'Redstone 1', None, 'preview build'), - '14379': ('10', None, 'Redstone 1', None, 'preview build'), - '14383': ('10', None, 'Redstone 1', None, 'preview build'), - '14385': ('10', None, 'Redstone 1', None, 'preview build'), - '14388': ('10', None, 'Redstone 1', None, 'preview build'), - '14390': ('10', None, 'Redstone 1', None, 'preview build'), - '14393': ('10', 'v1607', 'Redstone 1', 'Anniversary Update', 'unsupported'), - '14901': ('10', None, 'Redstone 2', None, 'preview build'), - '14905': ('10', None, 'Redstone 2', None, 'preview build'), - '14915': ('10', None, 'Redstone 2', None, 'preview build'), - '14926': ('10', None, 'Redstone 2', None, 'preview build'), - '14931': ('10', None, 'Redstone 2', None, 'preview build'), - '14936': ('10', None, 'Redstone 2', None, 'preview build'), - '14942': ('10', None, 'Redstone 2', None, 'preview build'), - '14946': ('10', None, 'Redstone 2', None, 'preview build'), - '14951': ('10', None, 'Redstone 2', None, 'preview build'), - '14955': ('10', None, 'Redstone 2', None, 'preview build'), - '14959': ('10', None, 'Redstone 2', None, 'preview build'), - '14965': ('10', None, 'Redstone 2', None, 'preview build'), - '14971': ('10', None, 'Redstone 2', None, 'preview build'), - '14986': ('10', None, 'Redstone 2', None, 'preview build'), - '15002': ('10', None, 'Redstone 2', None, 'preview build'), - '15007': ('10', None, 'Redstone 2', None, 'preview build'), - '15014': ('10', None, 'Redstone 2', None, 'preview build'), - '15019': ('10', None, 'Redstone 2', None, 'preview build'), - '15025': ('10', None, 'Redstone 2', None, 'preview build'), - '15031': ('10', None, 'Redstone 2', None, 'preview build'), - '15042': ('10', None, 'Redstone 2', None, 'preview build'), - '15046': ('10', None, 'Redstone 2', None, 'preview build'), - '15048': ('10', None, 'Redstone 2', None, 'preview build'), - '15055': ('10', None, 'Redstone 2', None, 'preview build'), - '15058': ('10', None, 'Redstone 2', None, 'preview build'), - '15060': ('10', None, 'Redstone 2', None, 'preview build'), - '15061': ('10', None, 'Redstone 2', None, 'preview build'), - '15063': ('10', 'v1703', 'Redstone 2', 'Creators Update', 'unsupported'), - '16170': ('10', None, 'Redstone 3', None, 'preview build'), - '16176': ('10', None, 'Redstone 3', None, 'preview build'), - '16179': ('10', None, 'Redstone 3', None, 'preview build'), - '16184': ('10', None, 'Redstone 3', None, 'preview build'), - '16188': ('10', None, 'Redstone 3', None, 'preview build'), - '16193': ('10', None, 'Redstone 3', None, 'preview build'), - '16199': ('10', None, 'Redstone 3', None, 'preview build'), - '16212': ('10', None, 'Redstone 3', None, 'preview build'), - '16215': ('10', None, 'Redstone 3', None, 'preview build'), - '16226': ('10', None, 'Redstone 3', None, 'preview build'), - '16232': ('10', None, 'Redstone 3', None, 'preview build'), - '16237': ('10', None, 'Redstone 3', None, 'preview build'), - '16241': ('10', None, 'Redstone 3', None, 'preview build'), - '16251': ('10', None, 'Redstone 3', None, 'preview build'), - '16257': ('10', None, 'Redstone 3', None, 'preview build'), - '16273': ('10', None, 'Redstone 3', None, 'preview build'), - '16275': ('10', None, 'Redstone 3', None, 'preview build'), - '16278': ('10', None, 'Redstone 3', None, 'preview build'), - '16281': ('10', None, 'Redstone 3', None, 'preview build'), - '16288': ('10', None, 'Redstone 3', None, 'preview build'), - '16291': ('10', None, 'Redstone 3', None, 'preview build'), - '16294': ('10', None, 'Redstone 3', None, 'preview build'), - '16296': ('10', None, 'Redstone 3', None, 'preview build'), - '16299': ('10', 'v1709', 'Redstone 3', 'Fall Creators Update', 'outdated'), - '16353': ('10', None, 'Redstone 4', None, 'preview build'), - '16362': ('10', None, 'Redstone 4', None, 'preview build'), - '17004': ('10', None, 'Redstone 4', None, 'preview build'), - '17017': ('10', None, 'Redstone 4', None, 'preview build'), - '17025': ('10', None, 'Redstone 4', None, 'preview build'), - '17035': ('10', None, 'Redstone 4', None, 'preview build'), - '17040': ('10', None, 'Redstone 4', None, 'preview build'), - '17046': ('10', None, 'Redstone 4', None, 'preview build'), - '17063': ('10', None, 'Redstone 4', None, 'preview build'), - '17074': ('10', None, 'Redstone 4', None, 'preview build'), - '17083': ('10', None, 'Redstone 4', None, 'preview build'), - '17093': ('10', None, 'Redstone 4', None, 'preview build'), - '17101': ('10', None, 'Redstone 4', None, 'preview build'), - '17107': ('10', None, 'Redstone 4', None, 'preview build'), - '17110': ('10', None, 'Redstone 4', None, 'preview build'), - '17112': ('10', None, 'Redstone 4', None, 'preview build'), - '17115': ('10', None, 'Redstone 4', None, 'preview build'), - '17120': ('10', None, 'Redstone 4', None, 'preview build'), - '17123': ('10', None, 'Redstone 4', None, 'preview build'), - '17127': ('10', None, 'Redstone 4', None, 'preview build'), - '17128': ('10', None, 'Redstone 4', None, 'preview build'), - '17133': ('10', None, 'Redstone 4', None, 'preview build'), - '17134': ('10', 'v1803', 'Redstone 4', 'April 2018 Update', 'outdated'), - '17604': ('10', None, 'Redstone 5', None, 'preview build'), - '17618': ('10', None, 'Redstone 5', None, 'preview build'), - '17623': ('10', None, 'Redstone 5', None, 'preview build'), - '17627': ('10', None, 'Redstone 5', None, 'preview build'), - '17634': ('10', None, 'Redstone 5', None, 'preview build'), - '17639': ('10', None, 'Redstone 5', None, 'preview build'), - '17643': ('10', None, 'Redstone 5', None, 'preview build'), - '17650': ('10', None, 'Redstone 5', None, 'preview build'), - '17655': ('10', None, 'Redstone 5', None, 'preview build'), - '17661': ('10', None, 'Redstone 5', None, 'preview build'), - '17666': ('10', None, 'Redstone 5', None, 'preview build'), - '17677': ('10', None, 'Redstone 5', None, 'preview build'), - '17682': ('10', None, 'Redstone 5', None, 'preview build'), - '17686': ('10', None, 'Redstone 5', None, 'preview build'), - '17692': ('10', None, 'Redstone 5', None, 'preview build'), - '17704': ('10', None, 'Redstone 5', None, 'preview build'), - '17711': ('10', None, 'Redstone 5', None, 'preview build'), - '17713': ('10', None, 'Redstone 5', None, 'preview build'), - '17723': ('10', None, 'Redstone 5', None, 'preview build'), - '17728': ('10', None, 'Redstone 5', None, 'preview build'), - '17730': ('10', None, 'Redstone 5', None, 'preview build'), - '17733': ('10', None, 'Redstone 5', None, 'preview build'), - '17735': ('10', None, 'Redstone 5', None, 'preview build'), - '17738': ('10', None, 'Redstone 5', None, 'preview build'), - '17741': ('10', None, 'Redstone 5', None, 'preview build'), - '17744': ('10', None, 'Redstone 5', None, 'preview build'), - '17746': ('10', None, 'Redstone 5', None, 'preview build'), - '17751': ('10', None, 'Redstone 5', None, 'preview build'), - '17754': ('10', None, 'Redstone 5', None, 'preview build'), - '17755': ('10', None, 'Redstone 5', None, 'preview build'), - '17758': ('10', None, 'Redstone 5', None, 'preview build'), - '17760': ('10', None, 'Redstone 5', None, 'preview build'), - '17763': ('10', 'v1809', 'Redstone 5', 'October 2018 Update', None), - '18204': ('10', None, '19H1', None, 'preview build'), - '18214': ('10', None, '19H1', None, 'preview build'), - '18219': ('10', None, '19H1', None, 'preview build'), - '18234': ('10', None, '19H1', None, 'preview build'), - '18237': ('10', None, '19H1', None, 'preview build'), - '18242': ('10', None, '19H1', None, 'preview build'), - '18247': ('10', None, '19H1', None, 'preview build'), - '18252': ('10', None, '19H1', None, 'preview build'), - '18262': ('10', None, '19H1', None, 'preview build'), - '18267': ('10', None, '19H1', None, 'preview build'), - '18272': ('10', None, '19H1', None, 'preview build'), - '18277': ('10', None, '19H1', None, 'preview build'), - '18282': ('10', None, '19H1', None, 'preview build'), - '18290': ('10', None, '19H1', None, 'preview build'), - '18298': ('10', None, '19H1', None, 'preview build'), - '18305': ('10', None, '19H1', None, 'preview build'), - '18309': ('10', None, '19H1', None, 'preview build'), - '18312': ('10', None, '19H1', None, 'preview build'), - '18317': ('10', None, '19H1', None, 'preview build'), - '18323': ('10', None, '19H1', None, 'preview build'), - '18329': ('10', None, '19H1', None, 'preview build'), - '18334': ('10', None, '19H1', None, 'preview build'), - '18342': ('10', None, '19H1', None, 'preview build'), - '18343': ('10', None, '19H1', None, 'preview build'), - '18346': ('10', None, '19H1', None, 'preview build'), - '18348': ('10', None, '19H1', None, 'preview build'), - '18351': ('10', None, '19H1', None, 'preview build'), - '18353': ('10', None, '19H1', None, 'preview build'), - '18356': ('10', None, '19H1', None, 'preview build'), - '18358': ('10', None, '19H1', None, 'preview build'), - '18361': ('10', None, '19H1', None, 'preview build'), - '18362': ('10', 'v1903', '19H1', 'May 2019 Update', None), - '18363': ('10', 'v1909', '19H2', 'November 2019 Update', None), - '18836': ('10', None, '20H1', None, 'preview build'), - '18841': ('10', None, '20H1', None, 'preview build'), - '18845': ('10', None, '20H1', None, 'preview build'), - '18850': ('10', None, '20H1', None, 'preview build'), - '18855': ('10', None, '20H1', None, 'preview build'), - '18860': ('10', None, '20H1', None, 'preview build'), - '18865': ('10', None, '20H1', None, 'preview build'), - '18875': ('10', None, '20H1', None, 'preview build'), - '18885': ('10', None, '20H1', None, 'preview build'), - '18890': ('10', None, '20H1', None, 'preview build'), - '18894': ('10', None, '20H1', None, 'preview build'), - '18895': ('10', None, '20H1', None, 'preview build'), - '18898': ('10', None, '20H1', None, 'preview build'), - '18908': ('10', None, '20H1', None, 'preview build'), - '18912': ('10', None, '20H1', None, 'preview build'), - '18917': ('10', None, '20H1', None, 'preview build'), - '18922': ('10', None, '20H1', None, 'preview build'), - '18932': ('10', None, '20H1', None, 'preview build'), - '18936': ('10', None, '20H1', None, 'preview build'), - '18941': ('10', None, '20H1', None, 'preview build'), - '18945': ('10', None, '20H1', None, 'preview build'), - '18950': ('10', None, '20H1', None, 'preview build'), - '18956': ('10', None, '20H1', None, 'preview build'), - '18963': ('10', None, '20H1', None, 'preview build'), - '18965': ('10', None, '20H1', None, 'preview build'), - '18970': ('10', None, '20H1', None, 'preview build'), - '18975': ('10', None, '20H1', None, 'preview build'), - '18980': ('10', None, '20H1', None, 'preview build'), - '18985': ('10', None, '20H1', None, 'preview build'), - '18990': ('10', None, '20H1', None, 'preview build'), - '18995': ('10', None, '20H1', None, 'preview build'), - '18999': ('10', None, '20H1', None, 'preview build'), - '19002': ('10', None, '20H1', None, 'preview build'), - '19008': ('10', None, '20H1', None, 'preview build'), - '19013': ('10', None, '20H1', None, 'preview build'), - '19018': ('10', None, '20H1', None, 'preview build'), - '19023': ('10', None, '20H1', None, 'preview build'), - '19025': ('10', None, '20H1', None, 'preview build'), - '19028': ('10', None, '20H1', None, 'preview build'), - '19030': ('10', None, '20H1', None, 'preview build'), - '19033': ('10', None, '20H1', None, 'preview build'), - '19035': ('10', None, '20H1', None, 'preview build'), - '19037': ('10', None, '20H1', None, 'preview build'), - '19041': ('10', 'v2004', '20H1', 'May 2020 Update', None), - '19042': ('10', 'v20H2', '20H2', 'October 2020 Update', None), -} - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") diff --git a/scripts/wk.prev/settings/windows_setup.py b/scripts/wk.prev/settings/windows_setup.py deleted file mode 100644 index 2f01c506..00000000 --- a/scripts/wk.prev/settings/windows_setup.py +++ /dev/null @@ -1,39 +0,0 @@ -# Wizard Kit: Settings - Windows Setup - -# General -WINDOWS_VERSIONS = [ - {'Name': 'Windows 7 Home Basic', - 'Image File': 'Win7', - 'Image Name': 'Windows 7 HOMEBASIC'}, - {'Name': 'Windows 7 Home Premium', - 'Image File': 'Win7', - 'Image Name': 'Windows 7 HOMEPREMIUM'}, - {'Name': 'Windows 7 Professional', - 'Image File': 'Win7', - 'Image Name': 'Windows 7 PROFESSIONAL'}, - {'Name': 'Windows 7 Ultimate', - 'Image File': 'Win7', - 'Image Name': 'Windows 7 ULTIMATE'}, - - {'Name': 'Windows 8.1', - 'Image File': 'Win8', - 'Image Name': 'Windows 8.1', - 'CRLF': True}, - {'Name': 'Windows 8.1 Pro', - 'Image File': 'Win8', - 'Image Name': 'Windows 8.1 Pro'}, - - {'Name': 'Windows 10 Home', - 'Image File': 'Win10', - 'Image Name': 'Windows 10 Home', - 'CRLF': True}, - {'Name': 'Windows 10 Pro', - 'Image File': 'Win10', - 'Image Name': 'Windows 10 Pro'}, - ] - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk.prev/settings/winpe.py b/scripts/wk.prev/settings/winpe.py deleted file mode 100644 index 2d52353b..00000000 --- a/scripts/wk.prev/settings/winpe.py +++ /dev/null @@ -1,57 +0,0 @@ -# Wizard Kit: Settings - WinPE - -from settings.data import * - -# FastCopy -FAST_COPY_PE_ARGS = [ - '/cmd=noexist_only', - '/utf8', - '/skip_empty_dir', - '/linkdest', - '/no_ui', - '/auto_close', - '/exclude={}'.format(';'.join(FAST_COPY_EXCLUDES)), - ] - -# General -PE_TOOLS = { - 'BlueScreenView': { - 'Path': r'BlueScreenView\BlueScreenView.exe', - }, - 'FastCopy': { - 'Path': r'FastCopy\FastCopy.exe', - 'Args': FAST_COPY_PE_ARGS, - }, - 'HWiNFO': { - 'Path': r'HWiNFO\HWiNFO.exe', - }, - 'NT Password Editor': { - 'Path': r'NT Password Editor\ntpwedit.exe', - }, - 'Notepad++': { - 'Path': r'NotepadPlusPlus\NotepadPlusPlus.exe', - }, - 'PhotoRec': { - 'Path': r'TestDisk\photorec_win.exe', - 'Args': ['-new_console:n'], - }, - 'Prime95': { - 'Path': r'Prime95\prime95.exe', - }, - 'ProduKey': { - 'Path': r'ProduKey\ProduKey.exe', - }, - 'Q-Dir': { - 'Path': r'Q-Dir\Q-Dir.exe', - }, - 'TestDisk': { - 'Path': r'TestDisk\testdisk_win.exe', - 'Args': ['-new_console:n'], - }, - } - - -if __name__ == '__main__': - print("This file is not meant to be called directly.") - -# vim: sts=2 sw=2 ts=2 diff --git a/setup/windows/cbin/BleachBit/BleachBit.ini b/setup/windows/cbin/BleachBit/BleachBit.ini deleted file mode 100644 index 6c8e3992..00000000 --- a/setup/windows/cbin/BleachBit/BleachBit.ini +++ /dev/null @@ -1,77 +0,0 @@ -[Portable] - -[bleachbit] -auto_hide = False -auto_start = False -check_beta = False -check_online_updates = False -shred = False -exit_done = False -delete_confirmation = True -units_iec = True -update_winapp2 = False -first_start = True -version = 1.17 - -[hashpath] - -[list/shred_drives] - -[preserve_languages] -en = True - -[tree] -adobe_reader = True -adobe_reader.cache = True -adobe_reader.tmp = True -amule = True -amule.tmp = True -chromium = True -chromium.cache = True -firefox = True -firefox.cache = True -gimp = True -gimp.tmp = True -google_chrome = True -google_chrome.cache = True -google_earth = True -google_earth.temporary_files = True -hippo_opensim_viewer = True -hippo_opensim_viewer.cache = True -internet_explorer = True -internet_explorer.temporary_files = True -java = True -java.cache = True -libreoffice = True -libreoffice.cache = True -liferea = True -liferea.cache = True -miro = True -miro.cache = True -openofficeorg = True -openofficeorg.cache = True -opera = True -opera.cache = True -pidgin = True -pidgin.cache = True -safari = True -safari.cache = True -seamonkey = True -seamonkey.cache = True -secondlife_viewer = True -secondlife_viewer.Cache = True -system = True -system.recycle_bin = True -system.tmp = True -thunderbird = True -thunderbird.cache = True -vuze = True -vuze.cache = True -vuze.tmp = True -yahoo_messenger = True -yahoo_messenger.cache = True -winapp2_windows = True -winapp2_windows.cbs_logs = True -winapp2_windows.cbs_logs_more = True -winapp2_windows.windows_cbs_logs_more = True - diff --git a/setup/windows/cbin/NotepadPlusPlus/config.xml b/setup/windows/cbin/NotepadPlusPlus/config.xml deleted file mode 100644 index 1975e9a7..00000000 --- a/setup/windows/cbin/NotepadPlusPlus/config.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - standard - show - - vertical - hide - - no - yes - no - no - yes - yes - no - yes - - - - - yes - yes - 2 - - - - - - show - - - - - - - - - - yes - - - - - - - - - - - - - - diff --git a/setup/windows/cbin/XMPlay/xmplay.ini b/setup/windows/cbin/XMPlay/xmplay.ini deleted file mode 100644 index be182837..00000000 --- a/setup/windows/cbin/XMPlay/xmplay.ini +++ /dev/null @@ -1,139 +0,0 @@ -[XMPlay] -MixMode=56 -AutoName=0 -WriteSource=0 -WriteSourceRes=1 -WriteSepInst=0 -WriteNoExt=0 -WriteTitle=0 -AutoAmp=1 -RGain=0 -RGainAmp=0 -RGainLimit=0 -Time=1 -ShowTenths=1 -TimeHours=1 -Volume=90 -LogVolume=1 -Balance=50 -Amplify=-1074017600 -AmpReset=1 -PanSep=50 -Loop=0 -LoopLimit=1 -LoopLimitTime=0 -DecayEnd=5 -LoopList=1 -ListTotal=0 -UnloadLast=0 -AutoAdvance=1 -ListSort=0 -FollowList=0 -AutoRemove=0 -Trim=0 -NoMute=0 -Fade=0 -NetBuffer=5 -NetPreBuffer=3 -NetTimeout=10 -RestrictRate=0 -AutoReconnect=0 -Proxy=1 -ProxyConfig= -Dither=0 -CrossFadeLen=0 -CrossFadeChange=0 -MODmode=0 -MODtimeinfo=1 -MODxfx=0 -MODloop=1 -MODloopreset=0 -MODvirtchans=256 -Mini=0 -InTray=0 -OnTop=259 -MultiInstance=0 -SaveClosePos=0 -Bubbles=3 -FadeBubbles=1 -InfoMove=0 -WindowLock=0 -PanelPos=-268374016 -ListFilenames=0 -ListQueue=0 -ListClick=1793 -AutoSave=0 -ListCols=-2146959349 -Verify=1 -NoDuplicates=0 -ScanHTML=1 -ArchiveLevel=2 -SearchDrives=0 -Random=3 -DeadStop=0 -Queue=0 -QueueStop=0 -QueuePlay=0 -QueueToggle=1 -SubDir=0 -TitleNoExt=0 -TitleSpaces=0 -TitleSubsongs=0 -TitleCUE=1 -TitleScroll=1 -TitleTray=3 -Clipboard=0 -AutoSet=0 -InfoResize=1 -InfoResizeLimit=500 -InfoTextSize=0 -InfoWidth=80 -InfoList=15 -InfoPaty=234 -InfoPatmc=20 -RestrictVis=0 -RestrictVisW=290 -RestrictVisH=218 -SpectrumSpeed=1 -VisSync=0 -VisTextSize=0 -VisRefresh=40 -HelpTextSize=0 -PanelOpen=0 -InfoPos=00020000000200005D0300003E030000 -VisSize=22010000DA000000 -FindSize=0000000000000000C8000000 -LibWidth=600 -LibSort=2 -LibMode=0 -LibCols=0000000000000000010000000000E04102000000000050410300000000005041040000000000E040050000000000E04006000000000040410700000000000000080000000000C04009000000000000000A0000000000E0400B0000000000E0400C000000000000000D000000000000000E000000000000000F00000000000000 -LibParseList=0 -LibFilePath=0 -LibAbrSize=1 -LibInlineText=1 -LibInfoTags=1 -LibKeepOverridden=1 -LibPlayTime=0 -LibAvgCount=0 -LibPlayReplace=0 -UpdateCheck=0 -UpdateTime=0 -IgnoreTypes=avi mpg mpeg -FilePath= -WritePath=X:\ -TitleForm=%?2{%2 - }%?1{%1|%0} -TitleFormList= -Find= -FindPlay=0 -FindAutoList=0 -FindIn=3 -NoCheckDead=0 -CurTrack=64 -Info=197379 -Skin=plugins\WAModern NightVision -External=464C414300666C6163202D54205449544C453D2531202D54204152544953543D2532202D5420414C42554D3D2533202D5420444154453D2534202D5420545241434B4E554D4245523D2535202D542047454E52453D2536202D5420434F4D4D454E543D2537202D6F20256F202D00666C616300404C414D45006C616D65202D2D616C742D707265736574207374616E64617264202D2D69676E6F72652D7461672D6572726F7273202D2D7474202531202D2D7461202532202D2D746C202533202D2D7479202534202D2D746E202535202D2D7467202536202D2D7463202537202D20256F006D703300864F4747454E43006F6767656E63202D74202531202D61202532202D6C202533202D64202534202D4E202535202D47202536202D6320636F6D6D656E743D2537202D6F20256F202D006F676700C800 -DSP=FF000200100000000000000040410000004100008041000100280000000000000000000000000000000000000000000000000000000000000000000000000000000000 -PluginTypes= -Shortcuts=060000004F0018020C0000004F04180250000000500019025100000050041902500000001300450251000000130445025200000027004D035300000025004B0354000000240047035600000027044D035500000025044B03810000002100490380000000220051038200000023004F03700100002D005203710100002D045203900100005A022C027B0100005100100277010000BF0435025001000026004803580100002604480351010000280050035901000028045003540100002602480354010000280250035501000041021E02560100004902170260010000460221026401000046012102610100004600210262010000460421026301000046062102740100000D001C02750100002000390276010000BF0035027E010000BF023502720100002E005303730100002E045303000200006B004E02010200006D004A02070200006F003503080200006A003702010000004D003202020000004E003102030000004E0431020A00000073013E020B00000073053E0205000000780043020101000070003B020201000071003C020301000072003D020401000073003E020501000074003F0260020000750040020801000043022E02060100006800480207010000620050022101000064004B022201000066004D022301000065004C0224010000670047022501000069004902040000007B005802 -DeviceMode=0000000080BB000002000000020000008A0200000000000003000000 -Track1=0 diff --git a/setup/windows/launchers.json b/setup/windows/launchers.json deleted file mode 100644 index 646cb8a4..00000000 --- a/setup/windows/launchers.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "(Root)": { - "Auto Repairs": { - "L_TYPE": "PyScript", - "L_PATH": "Scripts", - "L_ITEM": "auto_repairs.py", - "L_ELEV": "True" - }, - "Auto Setup": { - "L_TYPE": "PyScript", - "L_PATH": "Scripts", - "L_ITEM": "auto_setup.py", - "L_ELEV": "True" - } - }, - "Data Recovery": { - "PhotoRec (CLI)": { - "L_TYPE": "Executable", - "L_PATH": "TestDisk", - "L_ITEM": "photorec_win.exe", - "L_ELEV": "True", - "L__CLI": "True" - }, - "PhotoRec": { - "L_TYPE": "Executable", - "L_PATH": "TestDisk", - "L_ITEM": "qphotorec_win.exe", - "L_ELEV": "True" - }, - "TestDisk": { - "L_TYPE": "Executable", - "L_PATH": "TestDisk", - "L_ITEM": "testdisk_win.exe", - "L_ELEV": "True", - "L__CLI": "True" - } - }, - "Data Transfers": { - "FastCopy (as ADMIN)": { - "L_TYPE": "Executable", - "L_PATH": "FastCopy", - "L_ITEM": "FastCopy.exe", - "L_ARGS": " /logfile=%log_dir%\\Tools\\FastCopy.log /cmd=noexist_only /utf8 /skip_empty_dir /linkdest /exclude=$RECYCLE.BIN;$Recycle.Bin;.AppleDB;.AppleDesktop;.AppleDouble;.com.apple.timemachine.supported;.dbfseventsd;.DocumentRevisions-V100*;.DS_Store;.fseventsd;.PKInstallSandboxManager;.Spotlight*;.SymAV*;.symSchedScanLockxz;.TemporaryItems;.Trash*;.vol;.VolumeIcon.icns;desktop.ini;Desktop?DB;Desktop?DF;hiberfil.sys;lost+found;Network?Trash?Folder;pagefile.sys;Recycled;RECYCLER;System?Volume?Information;Temporary?Items;Thumbs.db /to=%client_dir%\\Transfer_%iso_date%\\ ", - "L_ELEV": "True", - "Extra Code": [ - "call \"%bin%\\Scripts\\init_client_dir.cmd\" /Logs /Transfer" - ] - }, - "FastCopy": { - "L_TYPE": "Executable", - "L_PATH": "FastCopy", - "L_ITEM": "FastCopy.exe", - "L_ARGS": " /logfile=%log_dir%\\Tools\\FastCopy.log /cmd=noexist_only /utf8 /skip_empty_dir /linkdest /exclude=$RECYCLE.BIN;$Recycle.Bin;.AppleDB;.AppleDesktop;.AppleDouble;.com.apple.timemachine.supported;.dbfseventsd;.DocumentRevisions-V100*;.DS_Store;.fseventsd;.PKInstallSandboxManager;.Spotlight*;.SymAV*;.symSchedScanLockxz;.TemporaryItems;.Trash*;.vol;.VolumeIcon.icns;desktop.ini;Desktop?DB;Desktop?DF;hiberfil.sys;lost+found;Network?Trash?Folder;pagefile.sys;Recycled;RECYCLER;System?Volume?Information;Temporary?Items;Thumbs.db /to=%client_dir%\\Transfer_%iso_date%\\ ", - "Extra Code": [ - "call \"%bin%\\Scripts\\init_client_dir.cmd\" /Logs /Transfer" - ] - } - }, - "Diagnostics": { - "AIDA64": { - "L_TYPE": "Executable", - "L_PATH": "AIDA64", - "L_ITEM": "aida64.exe" - }, - "Autoruns (with VirusTotal Scan)": { - "L_TYPE": "Executable", - "L_PATH": "Autoruns", - "L_ITEM": "Autoruns.exe", - "L_ARGS": "-e", - "Extra Code": [ - "reg add HKCU\\Software\\Sysinternals\\AutoRuns /v checkvirustotal /t REG_DWORD /d 1 /f >nul", - "reg add HKCU\\Software\\Sysinternals\\AutoRuns /v EulaAccepted /t REG_DWORD /d 1 /f >nul", - "reg add HKCU\\Software\\Sysinternals\\AutoRuns /v shownomicrosoft /t REG_DWORD /d 1 /f >nul", - "reg add HKCU\\Software\\Sysinternals\\AutoRuns /v shownowindows /t REG_DWORD /d 1 /f >nul", - "reg add HKCU\\Software\\Sysinternals\\AutoRuns /v showonlyvirustotal /t REG_DWORD /d 1 /f >nul", - "reg add HKCU\\Software\\Sysinternals\\AutoRuns /v submitvirustotal /t REG_DWORD /d 0 /f >nul", - "reg add HKCU\\Software\\Sysinternals\\AutoRuns /v verifysignatures /t REG_DWORD /d 1 /f >nul", - "reg add HKCU\\Software\\Sysinternals\\AutoRuns\\SigCheck /v EulaAccepted /t REG_DWORD /d 1 /f >nul", - "reg add HKCU\\Software\\Sysinternals\\AutoRuns\\Streams /v EulaAccepted /t REG_DWORD /d 1 /f >nul", - "reg add HKCU\\Software\\Sysinternals\\AutoRuns\\VirusTotal /v VirusTotalTermsAccepted /t REG_DWORD /d 1 /f >nul" - ] - }, - "BleachBit": { - "L_TYPE": "Executable", - "L_PATH": "BleachBit", - "L_ITEM": "bleachbit.exe" - }, - "BlueScreenView": { - "L_TYPE": "Executable", - "L_PATH": "BlueScreenView", - "L_ITEM": "BlueScreenView.exe" - }, - "ERUNT": { - "L_TYPE": "Executable", - "L_PATH": "erunt", - "L_ITEM": "ERUNT.EXE", - "L_ARGS": "%client_dir%\\Backups\\Registry\\%iso_date% sysreg curuser otherusers", - "L_ELEV": "True", - "Extra Code": [ - "call \"%bin%\\Scripts\\init_client_dir.cmd\" /Logs" - ] - }, - "HitmanPro": { - "L_TYPE": "Executable", - "L_PATH": "HitmanPro", - "L_ITEM": "HitmanPro.exe", - "Extra Code": [ - "call \"%bin%\\Scripts\\init_client_dir.cmd\" /Logs" - ] - }, - "HWiNFO": { - "L_TYPE": "Executable", - "L_PATH": "HWiNFO", - "L_ITEM": "HWiNFO.exe", - "Extra Code": [ - "for %%a in (32 64) do (", - " copy /y \"%bin%\\HWiNFO\\general.ini\" \"%bin%\\HWiNFO\\HWiNFO%%a.ini\"", - " (echo SensorsOnly=0)>>\"%bin%\\HWiNFO\\HWiNFO%%a.ini\"", - " (echo SummaryOnly=0)>>\"%bin%\\HWiNFO\\HWiNFO%%a.ini\"", - ")" - ] - }, - "HWiNFO (Sensors)": { - "L_TYPE": "Executable", - "L_PATH": "HWiNFO", - "L_ITEM": "HWiNFO.exe", - "Extra Code": [ - "for %%a in (32 64) do (", - " copy /y \"%bin%\\HWiNFO\\general.ini\" \"%bin%\\HWiNFO\\HWiNFO%%a.ini\"", - " (echo SensorsOnly=1)>>\"%bin%\\HWiNFO\\HWiNFO%%a.ini\"", - " (echo SummaryOnly=0)>>\"%bin%\\HWiNFO\\HWiNFO%%a.ini\"", - ")" - ] - }, - "ProduKey": { - "L_TYPE": "Executable", - "L_PATH": "ProduKey", - "L_ITEM": "ProduKey.exe", - "L_ELEV": "True", - "Extra Code": [ - "if exist \"%bin%\\ProduKey\" (", - " del \"%bin%\\ProduKey\\ProduKey.cfg\" 2>nul", - " del \"%bin%\\ProduKey\\ProduKey64.cfg\" 2>nul", - ")" - ] - }, - "Snappy Driver Installer Origin": { - "L_TYPE": "Executable", - "L_PATH": "SDIO", - "L_ITEM": "SDIO.exe" - } - }, - "Misc": { - "ConEmu (as ADMIN)": { - "L_TYPE": "Executable", - "L_PATH": "ConEmu", - "L_ITEM": "ConEmu.exe", - "L_ELEV": "True" - }, - "ConEmu": { - "L_TYPE": "Executable", - "L_PATH": "ConEmu", - "L_ITEM": "ConEmu.exe" - }, - "Everything": { - "L_TYPE": "Executable", - "L_PATH": "Everything", - "L_ITEM": "Everything.exe", - "L_ARGS": "-nodb", - "L_ELEV": "True" - }, - "Notepad++": { - "L_TYPE": "Executable", - "L_PATH": "notepadplusplus", - "L_ITEM": "notepadplusplus.exe" - }, - "PuTTY": { - "L_TYPE": "Executable", - "L_PATH": "PuTTY", - "L_ITEM": "PUTTY.EXE" - }, - "WizTree": { - "L_TYPE": "Executable", - "L_PATH": "WizTree", - "L_ITEM": "WizTree.exe", - "L_ELEV": "True" - } - }, - "Uninstallers": { - "IObit Uninstaller": { - "L_TYPE": "Executable", - "L_PATH": "IObitUninstallerPortable", - "L_ITEM": "IObitUninstallerPortable.exe" - } - } -} \ No newline at end of file