From ba4edcf6f37d8903d2935a5c44672373b85a5516 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sat, 2 Oct 2021 18:58:16 -0600 Subject: [PATCH 01/20] Cleanup wk/setup/windows dir --- setup/windows/Drivers/Extras/AMD.url | 2 -- .../Dell (FTP - Browse for Drivers).url | 2 -- .../Extras/Dell (Simplified Interface).url | 2 -- .../Drivers/Extras/Dell (Support Site).url | 6 ------ .../windows/Drivers/Extras/Device Remover.url | 5 ----- .../Extras/Display Driver Uninstaller.url | 5 ----- setup/windows/Drivers/Extras/HP.url | 2 -- .../Intel Driver & Support Assistant.url | 5 ----- setup/windows/Drivers/Extras/NVIDIA.url | 2 -- .../Extras/Samsung Tools & Software.url | 5 ----- setup/windows/Installers/BackBlaze.url | 5 ----- .../Misc/Fix Missing Optical Drive.reg | 6 ------ .../Misc/Nirsoft Utilities - Outlook.url | 6 ------ .../Misc/Nirsoft Utilities - Passwords.url | 6 ------ .../Misc/Sysinternals Suite (Live).url | 5 ----- .../AV Removal Tools/AV Removal Tools.url | 5 ----- .../Uninstallers/AV Removal Tools/AVG.url | 5 ----- .../Uninstallers/AV Removal Tools/Avast.url | 6 ------ .../Uninstallers/AV Removal Tools/Avira.url | 6 ------ .../Uninstallers/AV Removal Tools/ESET.url | 6 ------ .../AV Removal Tools/Kaspersky.url | 6 ------ .../Uninstallers/AV Removal Tools/MBAM.url | 5 ----- .../Uninstallers/AV Removal Tools/McAfee.url | 5 ----- .../Uninstallers/AV Removal Tools/Norton.url | 5 ----- .../{cbin/_include => bin}/AIDA64/basic.rpf | 0 setup/windows/bin/{_Drivers => }/SDIO/sdi.cfg | 0 .../{_include => }/BleachBit/BleachBit.ini | 0 .../{_include => }/NotepadPlusPlus/config.xml | 0 .../cbin/{_include => }/XMPlay/xmplay.ini | 0 .../XYplorerFree/Data/XYplorer.ini | 0 .../_Drivers/Intel RST/SetupRST_13.x.txt | 1 - .../cbin/_include/_Office/2016_hb_32.xml | 7 ------- .../cbin/_include/_Office/2016_hb_64.xml | 7 ------- .../cbin/_include/_Office/2016_hs_32.xml | 7 ------- .../cbin/_include/_Office/2016_hs_64.xml | 7 ------- .../cbin/_include/_Office/2019_hb_32.xml | 7 ------- .../cbin/_include/_Office/2019_hb_64.xml | 7 ------- .../cbin/_include/_Office/2019_hs_32.xml | 7 ------- .../cbin/_include/_Office/2019_hs_64.xml | 7 ------- .../windows/cbin/_include/_Office/365_32.xml | 7 ------- .../windows/cbin/_include/_Office/365_64.xml | 7 ------- .../cbin/_include/_vcredists/InstallAll.bat | 19 ------------------- 42 files changed, 203 deletions(-) delete mode 100644 setup/windows/Drivers/Extras/AMD.url delete mode 100644 setup/windows/Drivers/Extras/Dell (FTP - Browse for Drivers).url delete mode 100644 setup/windows/Drivers/Extras/Dell (Simplified Interface).url delete mode 100644 setup/windows/Drivers/Extras/Dell (Support Site).url delete mode 100644 setup/windows/Drivers/Extras/Device Remover.url delete mode 100644 setup/windows/Drivers/Extras/Display Driver Uninstaller.url delete mode 100644 setup/windows/Drivers/Extras/HP.url delete mode 100644 setup/windows/Drivers/Extras/Intel Driver & Support Assistant.url delete mode 100644 setup/windows/Drivers/Extras/NVIDIA.url delete mode 100644 setup/windows/Drivers/Extras/Samsung Tools & Software.url delete mode 100644 setup/windows/Installers/BackBlaze.url delete mode 100644 setup/windows/Misc/Fix Missing Optical Drive.reg delete mode 100644 setup/windows/Misc/Nirsoft Utilities - Outlook.url delete mode 100644 setup/windows/Misc/Nirsoft Utilities - Passwords.url delete mode 100644 setup/windows/Misc/Sysinternals Suite (Live).url delete mode 100644 setup/windows/Uninstallers/AV Removal Tools/AV Removal Tools.url delete mode 100644 setup/windows/Uninstallers/AV Removal Tools/AVG.url delete mode 100644 setup/windows/Uninstallers/AV Removal Tools/Avast.url delete mode 100644 setup/windows/Uninstallers/AV Removal Tools/Avira.url delete mode 100644 setup/windows/Uninstallers/AV Removal Tools/ESET.url delete mode 100644 setup/windows/Uninstallers/AV Removal Tools/Kaspersky.url delete mode 100644 setup/windows/Uninstallers/AV Removal Tools/MBAM.url delete mode 100644 setup/windows/Uninstallers/AV Removal Tools/McAfee.url delete mode 100644 setup/windows/Uninstallers/AV Removal Tools/Norton.url rename setup/windows/{cbin/_include => bin}/AIDA64/basic.rpf (100%) rename setup/windows/bin/{_Drivers => }/SDIO/sdi.cfg (100%) rename setup/windows/cbin/{_include => }/BleachBit/BleachBit.ini (100%) rename setup/windows/cbin/{_include => }/NotepadPlusPlus/config.xml (100%) rename setup/windows/cbin/{_include => }/XMPlay/xmplay.ini (100%) rename setup/windows/cbin/{_include => }/XYplorerFree/Data/XYplorer.ini (100%) delete mode 100644 setup/windows/cbin/_include/_Drivers/Intel RST/SetupRST_13.x.txt delete mode 100644 setup/windows/cbin/_include/_Office/2016_hb_32.xml delete mode 100644 setup/windows/cbin/_include/_Office/2016_hb_64.xml delete mode 100644 setup/windows/cbin/_include/_Office/2016_hs_32.xml delete mode 100644 setup/windows/cbin/_include/_Office/2016_hs_64.xml delete mode 100644 setup/windows/cbin/_include/_Office/2019_hb_32.xml delete mode 100644 setup/windows/cbin/_include/_Office/2019_hb_64.xml delete mode 100644 setup/windows/cbin/_include/_Office/2019_hs_32.xml delete mode 100644 setup/windows/cbin/_include/_Office/2019_hs_64.xml delete mode 100644 setup/windows/cbin/_include/_Office/365_32.xml delete mode 100644 setup/windows/cbin/_include/_Office/365_64.xml delete mode 100644 setup/windows/cbin/_include/_vcredists/InstallAll.bat diff --git a/setup/windows/Drivers/Extras/AMD.url b/setup/windows/Drivers/Extras/AMD.url deleted file mode 100644 index 0c691d79..00000000 --- a/setup/windows/Drivers/Extras/AMD.url +++ /dev/null @@ -1,2 +0,0 @@ -[InternetShortcut] -URL=https://support.amd.com/en-us/download diff --git a/setup/windows/Drivers/Extras/Dell (FTP - Browse for Drivers).url b/setup/windows/Drivers/Extras/Dell (FTP - Browse for Drivers).url deleted file mode 100644 index 9c50bf4c..00000000 --- a/setup/windows/Drivers/Extras/Dell (FTP - Browse for Drivers).url +++ /dev/null @@ -1,2 +0,0 @@ -[InternetShortcut] -URL=https://ftp.dell.com/browse_for_drivers/ diff --git a/setup/windows/Drivers/Extras/Dell (Simplified Interface).url b/setup/windows/Drivers/Extras/Dell (Simplified Interface).url deleted file mode 100644 index 02eed53f..00000000 --- a/setup/windows/Drivers/Extras/Dell (Simplified Interface).url +++ /dev/null @@ -1,2 +0,0 @@ -[InternetShortcut] -URL=https://downloads.dell.com/published/Pages/index.html diff --git a/setup/windows/Drivers/Extras/Dell (Support Site).url b/setup/windows/Drivers/Extras/Dell (Support Site).url deleted file mode 100644 index 870d5a6c..00000000 --- a/setup/windows/Drivers/Extras/Dell (Support Site).url +++ /dev/null @@ -1,6 +0,0 @@ -[InternetShortcut] -URL=http://support.dell.com/ -IDList= -HotKey=0 -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 diff --git a/setup/windows/Drivers/Extras/Device Remover.url b/setup/windows/Drivers/Extras/Device Remover.url deleted file mode 100644 index 2da40e96..00000000 --- a/setup/windows/Drivers/Extras/Device Remover.url +++ /dev/null @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -IDList= -URL=http://www.majorgeeks.com/files/details/device_remover_543c.html diff --git a/setup/windows/Drivers/Extras/Display Driver Uninstaller.url b/setup/windows/Drivers/Extras/Display Driver Uninstaller.url deleted file mode 100644 index 9669192c..00000000 --- a/setup/windows/Drivers/Extras/Display Driver Uninstaller.url +++ /dev/null @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,11 -[InternetShortcut] -IDList= -URL=https://www.wagnardsoft.com/ diff --git a/setup/windows/Drivers/Extras/HP.url b/setup/windows/Drivers/Extras/HP.url deleted file mode 100644 index 02deee1e..00000000 --- a/setup/windows/Drivers/Extras/HP.url +++ /dev/null @@ -1,2 +0,0 @@ -[InternetShortcut] -URL=http://support.hp.com/us-en/drivers diff --git a/setup/windows/Drivers/Extras/Intel Driver & Support Assistant.url b/setup/windows/Drivers/Extras/Intel Driver & Support Assistant.url deleted file mode 100644 index 1a2fa711..00000000 --- a/setup/windows/Drivers/Extras/Intel Driver & Support Assistant.url +++ /dev/null @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,11 -[InternetShortcut] -IDList= -URL=https://www.intel.com/content/www/us/en/support/detect.html diff --git a/setup/windows/Drivers/Extras/NVIDIA.url b/setup/windows/Drivers/Extras/NVIDIA.url deleted file mode 100644 index 1d54f978..00000000 --- a/setup/windows/Drivers/Extras/NVIDIA.url +++ /dev/null @@ -1,2 +0,0 @@ -[InternetShortcut] -URL=https://www.nvidia.com/Download/index.aspx?lang=en-us diff --git a/setup/windows/Drivers/Extras/Samsung Tools & Software.url b/setup/windows/Drivers/Extras/Samsung Tools & Software.url deleted file mode 100644 index 4e78090b..00000000 --- a/setup/windows/Drivers/Extras/Samsung Tools & Software.url +++ /dev/null @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -IDList= -URL=http://www.samsung.com/semiconductor/minisite/ssd/download/tools.html diff --git a/setup/windows/Installers/BackBlaze.url b/setup/windows/Installers/BackBlaze.url deleted file mode 100644 index 117de4e4..00000000 --- a/setup/windows/Installers/BackBlaze.url +++ /dev/null @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,11 -[InternetShortcut] -URL=https://www.backblaze.com/gen/install_backblaze-af9duk -IDList= diff --git a/setup/windows/Misc/Fix Missing Optical Drive.reg b/setup/windows/Misc/Fix Missing Optical Drive.reg deleted file mode 100644 index 75920302..00000000 --- a/setup/windows/Misc/Fix Missing Optical Drive.reg +++ /dev/null @@ -1,6 +0,0 @@ -Windows Registry Editor Version 5.00 - -;Delete entries acording to http://support.microsoft.com/kb/314060 -[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318}] -"UpperFilters"=- -"LowerFilters"=- \ No newline at end of file diff --git a/setup/windows/Misc/Nirsoft Utilities - Outlook.url b/setup/windows/Misc/Nirsoft Utilities - Outlook.url deleted file mode 100644 index 4c29ee45..00000000 --- a/setup/windows/Misc/Nirsoft Utilities - Outlook.url +++ /dev/null @@ -1,6 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -IDList= -URL=http://www.nirsoft.net/outlook_office_software.html -HotKey=0 diff --git a/setup/windows/Misc/Nirsoft Utilities - Passwords.url b/setup/windows/Misc/Nirsoft Utilities - Passwords.url deleted file mode 100644 index 9a94bfcb..00000000 --- a/setup/windows/Misc/Nirsoft Utilities - Passwords.url +++ /dev/null @@ -1,6 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -IDList= -URL=http://www.nirsoft.net/password_recovery_tools.html -HotKey=0 diff --git a/setup/windows/Misc/Sysinternals Suite (Live).url b/setup/windows/Misc/Sysinternals Suite (Live).url deleted file mode 100644 index 8c05d050..00000000 --- a/setup/windows/Misc/Sysinternals Suite (Live).url +++ /dev/null @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -IDList= -URL=http://live.sysinternals.com/ diff --git a/setup/windows/Uninstallers/AV Removal Tools/AV Removal Tools.url b/setup/windows/Uninstallers/AV Removal Tools/AV Removal Tools.url deleted file mode 100644 index 2e7c0cdd..00000000 --- a/setup/windows/Uninstallers/AV Removal Tools/AV Removal Tools.url +++ /dev/null @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -URL=http://kb.eset.com/esetkb/index?page=content&id=SOLN146 -IDList= diff --git a/setup/windows/Uninstallers/AV Removal Tools/AVG.url b/setup/windows/Uninstallers/AV Removal Tools/AVG.url deleted file mode 100644 index 11225565..00000000 --- a/setup/windows/Uninstallers/AV Removal Tools/AVG.url +++ /dev/null @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -URL=http://www.avg.com/us-en/utilities -IDList= diff --git a/setup/windows/Uninstallers/AV Removal Tools/Avast.url b/setup/windows/Uninstallers/AV Removal Tools/Avast.url deleted file mode 100644 index 9b75b640..00000000 --- a/setup/windows/Uninstallers/AV Removal Tools/Avast.url +++ /dev/null @@ -1,6 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -URL=http://files.avast.com/iavs9x/avastclear.exe -IDList= -HotKey=0 diff --git a/setup/windows/Uninstallers/AV Removal Tools/Avira.url b/setup/windows/Uninstallers/AV Removal Tools/Avira.url deleted file mode 100644 index 7d78f29e..00000000 --- a/setup/windows/Uninstallers/AV Removal Tools/Avira.url +++ /dev/null @@ -1,6 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -URL=http://dlpro.antivir.com/package/regcleaner/win32/en/avira_registry_cleaner_en.zip -IDList= -HotKey=0 diff --git a/setup/windows/Uninstallers/AV Removal Tools/ESET.url b/setup/windows/Uninstallers/AV Removal Tools/ESET.url deleted file mode 100644 index a7d04ad8..00000000 --- a/setup/windows/Uninstallers/AV Removal Tools/ESET.url +++ /dev/null @@ -1,6 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -URL=http://download.eset.com/special/ESETUninstaller.exe -IDList= -HotKey=0 diff --git a/setup/windows/Uninstallers/AV Removal Tools/Kaspersky.url b/setup/windows/Uninstallers/AV Removal Tools/Kaspersky.url deleted file mode 100644 index 9edc0ea8..00000000 --- a/setup/windows/Uninstallers/AV Removal Tools/Kaspersky.url +++ /dev/null @@ -1,6 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -URL=http://media.kaspersky.com/utilities/ConsumerUtilities/kavremvr.exe -IDList= -HotKey=0 diff --git a/setup/windows/Uninstallers/AV Removal Tools/MBAM.url b/setup/windows/Uninstallers/AV Removal Tools/MBAM.url deleted file mode 100644 index e29e24c4..00000000 --- a/setup/windows/Uninstallers/AV Removal Tools/MBAM.url +++ /dev/null @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -URL=http://www.malwarebytes.org/mbam-clean.exe -IDList= diff --git a/setup/windows/Uninstallers/AV Removal Tools/McAfee.url b/setup/windows/Uninstallers/AV Removal Tools/McAfee.url deleted file mode 100644 index b18f3fba..00000000 --- a/setup/windows/Uninstallers/AV Removal Tools/McAfee.url +++ /dev/null @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -URL=http://download.mcafee.com/products/licensed/cust_support_patches/MCPR.exe -IDList= diff --git a/setup/windows/Uninstallers/AV Removal Tools/Norton.url b/setup/windows/Uninstallers/AV Removal Tools/Norton.url deleted file mode 100644 index 0eec5fff..00000000 --- a/setup/windows/Uninstallers/AV Removal Tools/Norton.url +++ /dev/null @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,1 -[InternetShortcut] -URL=ftp://ftp.symantec.com/public/english_us_canada/removal_tools/Norton_Removal_Tool.exe -IDList= diff --git a/setup/windows/cbin/_include/AIDA64/basic.rpf b/setup/windows/bin/AIDA64/basic.rpf similarity index 100% rename from setup/windows/cbin/_include/AIDA64/basic.rpf rename to setup/windows/bin/AIDA64/basic.rpf diff --git a/setup/windows/bin/_Drivers/SDIO/sdi.cfg b/setup/windows/bin/SDIO/sdi.cfg similarity index 100% rename from setup/windows/bin/_Drivers/SDIO/sdi.cfg rename to setup/windows/bin/SDIO/sdi.cfg diff --git a/setup/windows/cbin/_include/BleachBit/BleachBit.ini b/setup/windows/cbin/BleachBit/BleachBit.ini similarity index 100% rename from setup/windows/cbin/_include/BleachBit/BleachBit.ini rename to setup/windows/cbin/BleachBit/BleachBit.ini diff --git a/setup/windows/cbin/_include/NotepadPlusPlus/config.xml b/setup/windows/cbin/NotepadPlusPlus/config.xml similarity index 100% rename from setup/windows/cbin/_include/NotepadPlusPlus/config.xml rename to setup/windows/cbin/NotepadPlusPlus/config.xml diff --git a/setup/windows/cbin/_include/XMPlay/xmplay.ini b/setup/windows/cbin/XMPlay/xmplay.ini similarity index 100% rename from setup/windows/cbin/_include/XMPlay/xmplay.ini rename to setup/windows/cbin/XMPlay/xmplay.ini diff --git a/setup/windows/cbin/_include/XYplorerFree/Data/XYplorer.ini b/setup/windows/cbin/XYplorerFree/Data/XYplorer.ini similarity index 100% rename from setup/windows/cbin/_include/XYplorerFree/Data/XYplorer.ini rename to setup/windows/cbin/XYplorerFree/Data/XYplorer.ini diff --git a/setup/windows/cbin/_include/_Drivers/Intel RST/SetupRST_13.x.txt b/setup/windows/cbin/_include/_Drivers/Intel RST/SetupRST_13.x.txt deleted file mode 100644 index 4f6d46da..00000000 --- a/setup/windows/cbin/_include/_Drivers/Intel RST/SetupRST_13.x.txt +++ /dev/null @@ -1 +0,0 @@ -Broken. "requires" .NET 4.5 but fails to accept .NET 4.6 or newer (which we install). \ No newline at end of file diff --git a/setup/windows/cbin/_include/_Office/2016_hb_32.xml b/setup/windows/cbin/_include/_Office/2016_hb_32.xml deleted file mode 100644 index 7e95c225..00000000 --- a/setup/windows/cbin/_include/_Office/2016_hb_32.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/setup/windows/cbin/_include/_Office/2016_hb_64.xml b/setup/windows/cbin/_include/_Office/2016_hb_64.xml deleted file mode 100644 index 6482438b..00000000 --- a/setup/windows/cbin/_include/_Office/2016_hb_64.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/setup/windows/cbin/_include/_Office/2016_hs_32.xml b/setup/windows/cbin/_include/_Office/2016_hs_32.xml deleted file mode 100644 index 1d034da0..00000000 --- a/setup/windows/cbin/_include/_Office/2016_hs_32.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/setup/windows/cbin/_include/_Office/2016_hs_64.xml b/setup/windows/cbin/_include/_Office/2016_hs_64.xml deleted file mode 100644 index 4c636636..00000000 --- a/setup/windows/cbin/_include/_Office/2016_hs_64.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/setup/windows/cbin/_include/_Office/2019_hb_32.xml b/setup/windows/cbin/_include/_Office/2019_hb_32.xml deleted file mode 100644 index d98dd66a..00000000 --- a/setup/windows/cbin/_include/_Office/2019_hb_32.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/setup/windows/cbin/_include/_Office/2019_hb_64.xml b/setup/windows/cbin/_include/_Office/2019_hb_64.xml deleted file mode 100644 index 29e10c4f..00000000 --- a/setup/windows/cbin/_include/_Office/2019_hb_64.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/setup/windows/cbin/_include/_Office/2019_hs_32.xml b/setup/windows/cbin/_include/_Office/2019_hs_32.xml deleted file mode 100644 index 3fc1606a..00000000 --- a/setup/windows/cbin/_include/_Office/2019_hs_32.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/setup/windows/cbin/_include/_Office/2019_hs_64.xml b/setup/windows/cbin/_include/_Office/2019_hs_64.xml deleted file mode 100644 index 3d2956fd..00000000 --- a/setup/windows/cbin/_include/_Office/2019_hs_64.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/setup/windows/cbin/_include/_Office/365_32.xml b/setup/windows/cbin/_include/_Office/365_32.xml deleted file mode 100644 index 093542a6..00000000 --- a/setup/windows/cbin/_include/_Office/365_32.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/setup/windows/cbin/_include/_Office/365_64.xml b/setup/windows/cbin/_include/_Office/365_64.xml deleted file mode 100644 index d2b6862a..00000000 --- a/setup/windows/cbin/_include/_Office/365_64.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/setup/windows/cbin/_include/_vcredists/InstallAll.bat b/setup/windows/cbin/_include/_vcredists/InstallAll.bat deleted file mode 100644 index 5d935b34..00000000 --- a/setup/windows/cbin/_include/_vcredists/InstallAll.bat +++ /dev/null @@ -1,19 +0,0 @@ -@echo off -setlocal - -start "" /wait "2010\x32\vcredist.exe" /passive /norestart -start "" /wait "2010\x64\vcredist.exe" /passive /norestart - -start "" /wait "2012u4\x32\vcredist.exe" /passive /norestart -start "" /wait "2012u4\x64\vcredist.exe" /passive /norestart - -start "" /wait "2013\x32\vcredist.exe" /install /passive /norestart -start "" /wait "2013\x64\vcredist.exe" /install /passive /norestart - -start "" /wait "2015u3\x32\vcredist.exe" /install /passive /norestart -start "" /wait "2015u3\x64\vcredist.exe" /install /passive /norestart - -start "" /wait "2017\x32\vcredist.exe" /install /passive /norestart -start "" /wait "2017\x64\vcredist.exe" /install /passive /norestart - -endlocal From 659d71c0ebcebd1c7f3f0430e0fa36f13bb71b48 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sat, 2 Oct 2021 19:19:24 -0600 Subject: [PATCH 02/20] Move repair and setup settings to wk/cfg --- scripts/wk/cfg/__init__.py | 2 + scripts/wk/cfg/repairs.py | 64 +++++++++++++++ scripts/wk/cfg/setup.py | 154 ++++++++++++++++++++++++++++++++++++ scripts/wk/cfg/sources.py | 2 +- scripts/wk/repairs/win.py | 62 ++------------- scripts/wk/setup/win.py | 158 +++---------------------------------- 6 files changed, 240 insertions(+), 202 deletions(-) create mode 100644 scripts/wk/cfg/repairs.py create mode 100644 scripts/wk/cfg/setup.py diff --git a/scripts/wk/cfg/__init__.py b/scripts/wk/cfg/__init__.py index f79d77ef..c30f4e29 100644 --- a/scripts/wk/cfg/__init__.py +++ b/scripts/wk/cfg/__init__.py @@ -5,6 +5,8 @@ from . import hw from . import log from . import main from . import net +from . import repairs +from . import setup from . import sources from . import ufd from . import windows_builds diff --git a/scripts/wk/cfg/repairs.py b/scripts/wk/cfg/repairs.py new file mode 100644 index 00000000..4875b0a9 --- /dev/null +++ b/scripts/wk/cfg/repairs.py @@ -0,0 +1,64 @@ +"""WizardKit: Config - Repairs""" +# vim: sts=2 sw=2 ts=2 + +from wk.cfg.main import KIT_NAME_FULL + +AUTO_REPAIR_DELAY_IN_SECONDS = 30 +AUTO_REPAIR_KEY = fr'Software\{KIT_NAME_FULL}\Auto Repairs' +BLEACH_BIT_CLEANERS = ( + # Applications + 'adobe_reader.cache', + 'adobe_reader.tmp', + 'flash.cache', + 'gimp.tmp', + 'hippo_opensim_viewer.cache', + 'java.cache', + 'miro.cache', + 'openofficeorg.cache', + 'pidgin.cache', + 'secondlife_viewer.Cache', + 'thunderbird.cache', + 'vuze.cache', + 'yahoo_messenger.cache', + # Browsers + 'chromium.cache', + 'chromium.session', + 'firefox.cache', + 'firefox.session_restore', + 'google_chrome.cache', + 'google_chrome.session', + 'google_earth.temporary_files', + 'opera.cache', + 'opera.session', + 'safari.cache', + 'seamonkey.cache', + # System + 'system.clipboard', + 'system.tmp', + 'winapp2_windows.jump_lists', + 'winapp2_windows.ms_search', + 'windows_explorer.run', + 'windows_explorer.search_history', + 'windows_explorer.thumbnails', + ) +POWER_PLANS = { + 'Balanced': '381b4222-f694-41f0-9685-ff5bb260df2e', + 'Custom': '01189998-8199-9119-725c-ccccccccccc3', + 'High Performance': '8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c', + } +REG_UAC_DEFAULT_SETTINGS = { + 'HKLM': { + r'Software\Microsoft\Windows\CurrentVersion\Policies\System': ( + ('ConsentPromptBehaviorAdmin', 5, 'DWORD'), + ('ConsentPromptBehaviorUser', 3, 'DWORD'), + ('EnableLUA', 1, 'DWORD'), + ('PromptOnSecureDesktop', 1, 'DWORD'), + ), + }, + } +WIDTH = 50 + + + +if __name__ == '__main__': + print("This file is not meant to be called directly.") diff --git a/scripts/wk/cfg/setup.py b/scripts/wk/cfg/setup.py new file mode 100644 index 00000000..c9af5b92 --- /dev/null +++ b/scripts/wk/cfg/setup.py @@ -0,0 +1,154 @@ +"""WizardKit: Config - Setup""" +# pylint: disable=line-too-long +# vim: sts=2 sw=2 ts=2 + + +BROWSER_PATHS = { + # Relative to PROGRAMFILES_64, PROGRAMFILES_32, LOCALAPPDATA (in that order) + 'Google Chrome': 'Google/Chrome/Application/chrome.exe', + 'Mozilla Firefox': 'Mozilla Firefox/firefox.exe', + 'Microsoft Edge': 'Microsoft/Edge/Application/msedge.exe', + 'Opera': 'Opera/launcher.exe', + } +LIBREOFFICE_XCU_DATA = ''' +fal + +''' +REG_CHROME_UBLOCK_ORIGIN = { + 'HKLM': { + r'Software\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm': ( + ('update_url', 'https://clients2.google.com/service/update2/crx', 'SZ', '32'), + ) + }, + } +REG_WINDOWS_EXPLORER = { + # pylint: disable=line-too-long + 'HKLM': { + # Disable Location Tracking + r'Software\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}': ( + ('SensorPermissionState', 0, 'DWORD'), + ), + r'System\CurrentControlSet\Services\lfsvc\Service\Configuration': ( + ('Status', 0, 'DWORD'), + ), + # Disable Telemetry + r'Software\Microsoft\Windows\CurrentVersion\Policies\DataCollection': ( + ('AllowTelemetry', 0, 'DWORD'), + ('AllowTelemetry', 0, 'DWORD', '32'), + ), + r'Software\Policies\Microsoft\Windows\DataCollection': ( + ('AllowTelemetry', 0, 'DWORD'), + ), + # Disable Wi-Fi Sense + r'Software\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting': ( + ('Value', 0, 'DWORD'), + ), + r'Software\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots': ( + ('Value', 0, 'DWORD'), + ), + }, + 'HKCU': { + # Desktop theme (<= v1809 default) + r'Software\Microsoft\Windows\CurrentVersion\Themes\Personalize': ( + ('AppsUseLightTheme', 1, 'DWORD'), + ('SystemUsesLightTheme', 0, 'DWORD'), + ), + # Disable features + r'Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager': ( + ('SilentInstalledAppsEnabled', 0, 'DWORD'), + # Tips and Tricks + ('SoftLandingEnabled ', 0, 'DWORD'), + ('SubscribedContent-338389Enabled', 0, 'DWORD'), + ), + # Disable news and interests from opening on hover + r'Software\Microsoft\Windows\CurrentVersion\Feeds': ( + ('ShellFeedsTaskbarOpenOnHover', 0, 'DWORD'), + ), + # File Explorer + r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced': ( + # Change default Explorer view to "Computer" + ('LaunchTo', 1, 'DWORD'), + ('SeparateProcess', 1, 'DWORD'), + ), + # Hide People bar + r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\People': ( + ('PeopleBand', 0, 'DWORD'), + ), + # Hide Search button / box + r'Software\Microsoft\Windows\CurrentVersion\Search': ( + ('SearchboxTaskbarMode', 1, 'DWORD'), + ), + }, + } +REG_OPEN_SHELL_SETTINGS = { + 'HKCU': { + r'Software\OpenShell\StartMenu': ( + ('ShowedStyle2', 1, 'DWORD'), + ), + r'Software\OpenShell\StartMenu\Settings': ( + ('MenuStyle', 'Win7', 'SZ'), + ('RecentPrograms', 'Recent', 'SZ'), + ('SkinW7', 'Fluent-Metro', 'SZ'), + ('SkinVariationW7', '', 'SZ'), + ('SkipMetro', 1, 'DWORD'), + ( + 'SkinOptionsW7', + [ + # NOTE: Seems to need all options specified to work? + 'DARK_MAIN=1', 'METRO_MAIN=0', 'LIGHT_MAIN=0', 'AUTOMODE_MAIN=0', + 'DARK_SUBMENU=0', 'METRO_SUBMENU=0', 'LIGHT_SUBMENU=0', 'AUTOMODE_SUBMENU=1', + 'SUBMENU_SEPARATORS=1', 'DARK_SEARCH=0', 'METRO_SEARCH=0', 'LIGHT_SEARCH=1', + 'AUTOMODE_SEARCH=0', 'SEARCH_FRAME=1', 'SEARCH_COLOR=0', 'SMALL_SEARCH=0', + 'MODERN_SEARCH=1', 'SEARCH_ITALICS=0', 'NONE=0', 'SEPARATOR=0', + 'TWO_TONE=1', 'CLASSIC_SELECTOR=1', 'HALF_SELECTOR=0', 'CURVED_MENUSEL=1', + 'CURVED_SUBMENU=0', 'SELECTOR_REVEAL=0', 'TRANSPARENT=0', 'OPAQUE_SUBMENU=1', + 'OPAQUE_MENU=0', 'OPAQUE=0', 'STANDARD=1', 'SMALL_MAIN2=0', + 'SMALL_ICONS=0', 'COMPACT_SUBMENU=0', 'PRESERVE_MAIN2=0', 'LESS_PADDING=0', + 'EXTRA_PADDING=1', '24_PADDING=0', 'LARGE_PROGRAMS=0', 'TRANSPARENT_SHUTDOWN=0', + 'OUTLINE_SHUTDOWN=0', 'BUTTON_SHUTDOWN=1', 'EXPERIMENTAL_SHUTDOWN=0', 'LARGE_FONT=0', + 'CONNECTED_BORDER=1', 'FLOATING_BORDER=0', 'LARGE_SUBMENU=0', 'LARGE_LISTS=0', + 'THIN_MAIN2=0', 'EXPERIMENTAL_MAIN2=1', 'USER_IMAGE=1', 'USER_OUTSIDE=0', + 'SCALING_USER=1', '56=0', '64=0', 'TRANSPARENT_USER=0', + 'UWP_SCROLLBAR=1', 'MODERN_SCROLLBAR=0', 'OLD_ICONS=0', 'NEW_ICONS=1', + 'SMALL_ARROWS=0', 'ICON_FRAME=0', 'SEARCH_SEPARATOR=0', 'NO_PROGRAMS_BUTTON=0', + ], + 'MULTI_SZ', + ), + ), + }, + } +REG_UAC_DEFAULTS_WIN7 = { + 'HKLM': { + r'Software\Microsoft\Windows\CurrentVersion\Policies\System': ( + ('ConsentPromptBehaviorAdmin', 5, 'DWORD'), + ('EnableLUA', 1, 'DWORD'), + ('PromptOnSecureDesktop', 1, 'DWORD'), + ), + }, + } +REG_UAC_DEFAULTS_WIN10 = { + 'HKLM': { + r'Software\Microsoft\Windows\CurrentVersion\Policies\System': ( + ('ConsentPromptBehaviorAdmin', 5, 'DWORD'), + ('ConsentPromptBehaviorUser', 3, 'DWORD'), + ('EnableInstallerDetection', 1, 'DWORD'), + ('EnableLUA', 1, 'DWORD'), + ('EnableVirtualization', 1, 'DWORD'), + ('PromptOnSecureDesktop', 1, 'DWORD'), + ), + }, + } +UBLOCK_ORIGIN_URLS = { + 'Google Chrome': 'https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm', + 'Microsoft Edge': 'https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak', + 'Mozilla Firefox': 'https://addons.mozilla.org/addon/ublock-origin/', + 'Opera': 'https://addons.opera.com/extensions/details/ublock/', + } + + +if __name__ == '__main__': + print("This file is not meant to be called directly.") diff --git a/scripts/wk/cfg/sources.py b/scripts/wk/cfg/sources.py index 518b18e6..cf76d635 100644 --- a/scripts/wk/cfg/sources.py +++ b/scripts/wk/cfg/sources.py @@ -1,4 +1,4 @@ -"""WizardKit: Config - Tools""" +"""WizardKit: Config - Sources""" # pylint: disable=line-too-long # vim: sts=2 sw=2 ts=2 diff --git a/scripts/wk/repairs/win.py b/scripts/wk/repairs/win.py index 9a197d5e..0f6d8f46 100644 --- a/scripts/wk/repairs/win.py +++ b/scripts/wk/repairs/win.py @@ -13,6 +13,14 @@ import time from subprocess import CalledProcessError, DEVNULL from wk.cfg.main import KIT_NAME_FULL, KIT_NAME_SHORT, WINDOWS_TIME_ZONE +from wk.cfg.repairs import ( + AUTO_REPAIR_DELAY_IN_SECONDS, + AUTO_REPAIR_KEY, + BLEACH_BIT_CLEANERS, + POWER_PLANS, + REG_UAC_DEFAULT_SETTINGS, + WIDTH, + ) from wk.exe import ( get_procs, run_program, @@ -82,48 +90,10 @@ else: # STATIC VARIABLES LOG = logging.getLogger(__name__) -AUTO_REPAIR_DELAY_IN_SECONDS = 30 -AUTO_REPAIR_KEY = fr'Software\{KIT_NAME_FULL}\Auto Repairs' BACKUP_BROWSER_BASE_CMD = ( get_tool_path('7-Zip', '7za'), 'a', '-t7z', '-mx=1', '-bso0', '-bse0', '-bsp0', ) -BLEACH_BIT_CLEANERS = ( - # Applications - 'adobe_reader.cache', - 'adobe_reader.tmp', - 'flash.cache', - 'gimp.tmp', - 'hippo_opensim_viewer.cache', - 'java.cache', - 'miro.cache', - 'openofficeorg.cache', - 'pidgin.cache', - 'secondlife_viewer.Cache', - 'thunderbird.cache', - 'vuze.cache', - 'yahoo_messenger.cache', - # Browsers - 'chromium.cache', - 'chromium.session', - 'firefox.cache', - 'firefox.session_restore', - 'google_chrome.cache', - 'google_chrome.session', - 'google_earth.temporary_files', - 'opera.cache', - 'opera.session', - 'safari.cache', - 'seamonkey.cache', - # System - 'system.clipboard', - 'system.tmp', - 'winapp2_windows.jump_lists', - 'winapp2_windows.ms_search', - 'windows_explorer.run', - 'windows_explorer.search_history', - 'windows_explorer.thumbnails', - ) CONEMU_EXE = get_tool_path('ConEmu', 'ConEmu', check=False) GPUPDATE_SUCCESS_STRINGS = ( 'Computer Policy update has completed successfully.', @@ -135,21 +105,6 @@ PROGRAMFILES_32 = os.environ.get( 'PROGRAMFILES', r'C:\Program Files (x86)', ), ) -POWER_PLANS = { - 'Balanced': '381b4222-f694-41f0-9685-ff5bb260df2e', - 'Custom': '01189998-8199-9119-725c-ccccccccccc3', - 'High Performance': '8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c', - } -REG_UAC_DEFAULT_SETTINGS = { - 'HKLM': { - r'Software\Microsoft\Windows\CurrentVersion\Policies\System': ( - ('ConsentPromptBehaviorAdmin', 5, 'DWORD'), - ('ConsentPromptBehaviorUser', 3, 'DWORD'), - ('EnableLUA', 1, 'DWORD'), - ('PromptOnSecureDesktop', 1, 'DWORD'), - ), - }, - } SYSTEMDRIVE = os.environ.get('SYSTEMDRIVE', 'C:') WHITELIST = '\n'.join(( str(CONEMU_EXE), @@ -161,7 +116,6 @@ WHITELIST = '\n'.join(( fr'{PROGRAMFILES_32}\TeamViewer\tv_x64.exe', sys.executable, )) -WIDTH = 50 TRY_PRINT = TryAndPrint() TRY_PRINT.width = WIDTH TRY_PRINT.verbose = True diff --git a/scripts/wk/setup/win.py b/scripts/wk/setup/win.py index e319bfb3..5b2e5760 100644 --- a/scripts/wk/setup/win.py +++ b/scripts/wk/setup/win.py @@ -11,6 +11,16 @@ import re import sys from wk.cfg.main import KIT_NAME_FULL +from wk.cfg.setup import ( + BROWSER_PATHS, + LIBREOFFICE_XCU_DATA, + REG_CHROME_UBLOCK_ORIGIN, + REG_WINDOWS_EXPLORER, + REG_OPEN_SHELL_SETTINGS, + REG_UAC_DEFAULTS_WIN7, + REG_UAC_DEFAULTS_WIN10, + UBLOCK_ORIGIN_URLS, + ) from wk.exe import kill_procs, run_program, popen_program from wk.io import case_insensitive_path, get_path_obj from wk.kit.tools import ( @@ -59,6 +69,7 @@ if platform.system() == 'Windows': reg_write_settings, ) from wk.repairs.win import ( + WIDTH, backup_all_browser_profiles, backup_registry, create_custom_power_plan, @@ -100,23 +111,8 @@ else: # STATIC VARIABLES LOG = logging.getLogger(__name__) -BROWSER_PATHS = { - # Relative to PROGRAMFILES_64, PROGRAMFILES_32, LOCALAPPDATA (in that order) - 'Google Chrome': 'Google/Chrome/Application/chrome.exe', - 'Mozilla Firefox': 'Mozilla Firefox/firefox.exe', - 'Microsoft Edge': 'Microsoft/Edge/Application/msedge.exe', - 'Opera': 'Opera/launcher.exe', - } CONEMU_EXE = get_tool_path('ConEmu', 'ConEmu', check=False) IN_CONEMU = 'ConEmuPID' in os.environ -LIBREOFFICE_XCU_DATA = ''' - -Impress MS PowerPoint 2007 XML -Calc MS Excel 2007 XML -MS Word 2007 XML -false - -''' MENU_PRESETS = Menu() PROGRAMFILES_32 = os.environ.get( 'PROGRAMFILES(X86)', os.environ.get( @@ -128,144 +124,12 @@ PROGRAMFILES_64 = os.environ.get( 'PROGRAMFILES', r'C:\Program Files', ), ) -REG_CHROME_UBLOCK_ORIGIN = { - 'HKLM': { - r'Software\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm': ( - ('update_url', 'https://clients2.google.com/service/update2/crx', 'SZ', '32'), - ) - }, - } -REG_WINDOWS_EXPLORER = { - # pylint: disable=line-too-long - 'HKLM': { - # Disable Location Tracking - r'Software\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}': ( - ('SensorPermissionState', 0, 'DWORD'), - ), - r'System\CurrentControlSet\Services\lfsvc\Service\Configuration': ( - ('Status', 0, 'DWORD'), - ), - # Disable Telemetry - r'Software\Microsoft\Windows\CurrentVersion\Policies\DataCollection': ( - ('AllowTelemetry', 0, 'DWORD'), - ('AllowTelemetry', 0, 'DWORD', '32'), - ), - r'Software\Policies\Microsoft\Windows\DataCollection': ( - ('AllowTelemetry', 0, 'DWORD'), - ), - # Disable Wi-Fi Sense - r'Software\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting': ( - ('Value', 0, 'DWORD'), - ), - r'Software\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots': ( - ('Value', 0, 'DWORD'), - ), - }, - 'HKCU': { - # Desktop theme (<= v1809 default) - r'Software\Microsoft\Windows\CurrentVersion\Themes\Personalize': ( - ('AppsUseLightTheme', 1, 'DWORD'), - ('SystemUsesLightTheme', 0, 'DWORD'), - ), - # Disable features - r'Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager': ( - ('SilentInstalledAppsEnabled', 0, 'DWORD'), - # Tips and Tricks - ('SoftLandingEnabled ', 0, 'DWORD'), - ('SubscribedContent-338389Enabled', 0, 'DWORD'), - ), - # Disable news and interests from opening on hover - r'Software\Microsoft\Windows\CurrentVersion\Feeds': ( - ('ShellFeedsTaskbarOpenOnHover', 0, 'DWORD'), - ), - # File Explorer - r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced': ( - # Change default Explorer view to "Computer" - ('LaunchTo', 1, 'DWORD'), - ('SeparateProcess', 1, 'DWORD'), - ), - # Hide People bar - r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\People': ( - ('PeopleBand', 0, 'DWORD'), - ), - # Hide Search button / box - r'Software\Microsoft\Windows\CurrentVersion\Search': ( - ('SearchboxTaskbarMode', 1, 'DWORD'), - ), - }, - } -REG_OPEN_SHELL_SETTINGS = { - 'HKCU': { - r'Software\OpenShell\StartMenu': ( - ('ShowedStyle2', 1, 'DWORD'), - ), - r'Software\OpenShell\StartMenu\Settings': ( - ('MenuStyle', 'Win7', 'SZ'), - ('RecentPrograms', 'Recent', 'SZ'), - ('SkinW7', 'Fluent-Metro', 'SZ'), - ('SkinVariationW7', '', 'SZ'), - ('SkipMetro', 1, 'DWORD'), - ( - 'SkinOptionsW7', - [ - # NOTE: Seems to need all options specified to work? - 'DARK_MAIN=1', 'METRO_MAIN=0', 'LIGHT_MAIN=0', 'AUTOMODE_MAIN=0', - 'DARK_SUBMENU=0', 'METRO_SUBMENU=0', 'LIGHT_SUBMENU=0', 'AUTOMODE_SUBMENU=1', - 'SUBMENU_SEPARATORS=1', 'DARK_SEARCH=0', 'METRO_SEARCH=0', 'LIGHT_SEARCH=1', - 'AUTOMODE_SEARCH=0', 'SEARCH_FRAME=1', 'SEARCH_COLOR=0', 'SMALL_SEARCH=0', - 'MODERN_SEARCH=1', 'SEARCH_ITALICS=0', 'NONE=0', 'SEPARATOR=0', - 'TWO_TONE=1', 'CLASSIC_SELECTOR=1', 'HALF_SELECTOR=0', 'CURVED_MENUSEL=1', - 'CURVED_SUBMENU=0', 'SELECTOR_REVEAL=0', 'TRANSPARENT=0', 'OPAQUE_SUBMENU=1', - 'OPAQUE_MENU=0', 'OPAQUE=0', 'STANDARD=1', 'SMALL_MAIN2=0', - 'SMALL_ICONS=0', 'COMPACT_SUBMENU=0', 'PRESERVE_MAIN2=0', 'LESS_PADDING=0', - 'EXTRA_PADDING=1', '24_PADDING=0', 'LARGE_PROGRAMS=0', 'TRANSPARENT_SHUTDOWN=0', - 'OUTLINE_SHUTDOWN=0', 'BUTTON_SHUTDOWN=1', 'EXPERIMENTAL_SHUTDOWN=0', 'LARGE_FONT=0', - 'CONNECTED_BORDER=1', 'FLOATING_BORDER=0', 'LARGE_SUBMENU=0', 'LARGE_LISTS=0', - 'THIN_MAIN2=0', 'EXPERIMENTAL_MAIN2=1', 'USER_IMAGE=1', 'USER_OUTSIDE=0', - 'SCALING_USER=1', '56=0', '64=0', 'TRANSPARENT_USER=0', - 'UWP_SCROLLBAR=1', 'MODERN_SCROLLBAR=0', 'OLD_ICONS=0', 'NEW_ICONS=1', - 'SMALL_ARROWS=0', 'ICON_FRAME=0', 'SEARCH_SEPARATOR=0', 'NO_PROGRAMS_BUTTON=0', - ], - 'MULTI_SZ', - ), - ), - }, - } -REG_UAC_DEFAULTS_WIN7 = { - 'HKLM': { - r'Software\Microsoft\Windows\CurrentVersion\Policies\System': ( - ('ConsentPromptBehaviorAdmin', 5, 'DWORD'), - ('EnableLUA', 1, 'DWORD'), - ('PromptOnSecureDesktop', 1, 'DWORD'), - ), - }, - } -REG_UAC_DEFAULTS_WIN10 = { - 'HKLM': { - r'Software\Microsoft\Windows\CurrentVersion\Policies\System': ( - ('ConsentPromptBehaviorAdmin', 5, 'DWORD'), - ('ConsentPromptBehaviorUser', 3, 'DWORD'), - ('EnableInstallerDetection', 1, 'DWORD'), - ('EnableLUA', 1, 'DWORD'), - ('EnableVirtualization', 1, 'DWORD'), - ('PromptOnSecureDesktop', 1, 'DWORD'), - ), - }, - } SYSTEMDRIVE = os.environ.get('SYSTEMDRIVE', 'C:') -WIDTH = 50 TRY_PRINT = TryAndPrint() TRY_PRINT.width = WIDTH TRY_PRINT.verbose = True for error in ('CalledProcessError', 'FileNotFoundError'): TRY_PRINT.add_error(error) -UBLOCK_ORIGIN_URLS = { - # pylint: disable=line-too-long - 'Google Chrome': 'https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm', - 'Microsoft Edge': 'https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak', - 'Mozilla Firefox': 'https://addons.mozilla.org/addon/ublock-origin/', - 'Opera': 'https://addons.opera.com/extensions/details/ublock/', - } # Auto Setup From f7e6f88b9c2b847ea802f0c28924c4ef95a0f62c Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sat, 2 Oct 2021 19:30:59 -0600 Subject: [PATCH 03/20] Merge duplicate efforts to restore UAC defaults --- scripts/auto_setup.py | 1 - scripts/wk/cfg/repairs.py | 13 ++++++++++++- scripts/wk/cfg/setup.py | 21 --------------------- scripts/wk/repairs/win.py | 9 +++++++-- scripts/wk/setup/win.py | 16 ---------------- 5 files changed, 19 insertions(+), 41 deletions(-) diff --git a/scripts/auto_setup.py b/scripts/auto_setup.py index 68950f29..b8118bc0 100644 --- a/scripts/auto_setup.py +++ b/scripts/auto_setup.py @@ -123,7 +123,6 @@ BASE_MENUS = { MenuEntry('Enable System Restore', 'auto_system_restore_enable'), MenuEntry('Set System Restore Size', 'auto_system_restore_set_size'), MenuEntry('Enable Windows Updates', 'auto_windows_updates_enable'), - MenuEntry('User Account Control', 'auto_restore_default_uac'), MenuEntry('Windows Activation', 'auto_activate_windows'), MenuEntry('Windows Explorer', 'auto_config_explorer'), MenuEntry(r'Windows\Temp Fix', 'auto_windows_temp_fix'), diff --git a/scripts/wk/cfg/repairs.py b/scripts/wk/cfg/repairs.py index 4875b0a9..657559d1 100644 --- a/scripts/wk/cfg/repairs.py +++ b/scripts/wk/cfg/repairs.py @@ -46,12 +46,23 @@ POWER_PLANS = { 'Custom': '01189998-8199-9119-725c-ccccccccccc3', 'High Performance': '8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c', } -REG_UAC_DEFAULT_SETTINGS = { +REG_UAC_DEFAULTS_WIN7 = { + 'HKLM': { + r'Software\Microsoft\Windows\CurrentVersion\Policies\System': ( + ('ConsentPromptBehaviorAdmin', 5, 'DWORD'), + ('EnableLUA', 1, 'DWORD'), + ('PromptOnSecureDesktop', 1, 'DWORD'), + ), + }, + } +REG_UAC_DEFAULTS_WIN10 = { 'HKLM': { r'Software\Microsoft\Windows\CurrentVersion\Policies\System': ( ('ConsentPromptBehaviorAdmin', 5, 'DWORD'), ('ConsentPromptBehaviorUser', 3, 'DWORD'), + ('EnableInstallerDetection', 1, 'DWORD'), ('EnableLUA', 1, 'DWORD'), + ('EnableVirtualization', 1, 'DWORD'), ('PromptOnSecureDesktop', 1, 'DWORD'), ), }, diff --git a/scripts/wk/cfg/setup.py b/scripts/wk/cfg/setup.py index c9af5b92..887cda9f 100644 --- a/scripts/wk/cfg/setup.py +++ b/scripts/wk/cfg/setup.py @@ -121,27 +121,6 @@ REG_OPEN_SHELL_SETTINGS = { ), }, } -REG_UAC_DEFAULTS_WIN7 = { - 'HKLM': { - r'Software\Microsoft\Windows\CurrentVersion\Policies\System': ( - ('ConsentPromptBehaviorAdmin', 5, 'DWORD'), - ('EnableLUA', 1, 'DWORD'), - ('PromptOnSecureDesktop', 1, 'DWORD'), - ), - }, - } -REG_UAC_DEFAULTS_WIN10 = { - 'HKLM': { - r'Software\Microsoft\Windows\CurrentVersion\Policies\System': ( - ('ConsentPromptBehaviorAdmin', 5, 'DWORD'), - ('ConsentPromptBehaviorUser', 3, 'DWORD'), - ('EnableInstallerDetection', 1, 'DWORD'), - ('EnableLUA', 1, 'DWORD'), - ('EnableVirtualization', 1, 'DWORD'), - ('PromptOnSecureDesktop', 1, 'DWORD'), - ), - }, - } UBLOCK_ORIGIN_URLS = { 'Google Chrome': 'https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm', 'Microsoft Edge': 'https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak', diff --git a/scripts/wk/repairs/win.py b/scripts/wk/repairs/win.py index 0f6d8f46..870a1df6 100644 --- a/scripts/wk/repairs/win.py +++ b/scripts/wk/repairs/win.py @@ -18,7 +18,8 @@ from wk.cfg.repairs import ( AUTO_REPAIR_KEY, BLEACH_BIT_CLEANERS, POWER_PLANS, - REG_UAC_DEFAULT_SETTINGS, + REG_UAC_DEFAULTS_WIN7, + REG_UAC_DEFAULTS_WIN10, WIDTH, ) from wk.exe import ( @@ -1265,7 +1266,11 @@ def reset_windows_updates(): def restore_uac_defaults(): """Restore UAC default settings.""" - reg_write_settings(REG_UAC_DEFAULT_SETTINGS) + settings = REG_UAC_DEFAULTS_WIN10 + if OS_VERSION != 10: + settings = REG_UAC_DEFAULTS_WIN7 + + reg_write_settings(settings) def run_chkdsk_offline(): diff --git a/scripts/wk/setup/win.py b/scripts/wk/setup/win.py index 5b2e5760..8579ca40 100644 --- a/scripts/wk/setup/win.py +++ b/scripts/wk/setup/win.py @@ -17,8 +17,6 @@ from wk.cfg.setup import ( REG_CHROME_UBLOCK_ORIGIN, REG_WINDOWS_EXPLORER, REG_OPEN_SHELL_SETTINGS, - REG_UAC_DEFAULTS_WIN7, - REG_UAC_DEFAULTS_WIN10, UBLOCK_ORIGIN_URLS, ) from wk.exe import kill_procs, run_program, popen_program @@ -510,11 +508,6 @@ def auto_open_xmplay(): TRY_PRINT.run('XMPlay...', open_xmplay) -def auto_restore_default_uac(): - """Restore default UAC settings.""" - TRY_PRINT.run('User Account Control...', restore_default_uac) - - def auto_show_4k_alignment_check(): """Display 4K alignment check.""" TRY_PRINT.run('4K alignment Check...', check_4k_alignment, show_alert=True) @@ -658,15 +651,6 @@ def fix_windows_temp(): run_program(cmd) -def restore_default_uac(): - """Restore default UAC settings.""" - settings = REG_UAC_DEFAULTS_WIN10 - if OS_VERSION != 10: - settings = REG_UAC_DEFAULTS_WIN7 - - reg_write_settings(settings) - - # Install Functions def install_firefox(): """Install Firefox. From 7db0ece6870f81af6279ada816e6398910c5a71e Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sat, 2 Oct 2021 19:32:24 -0600 Subject: [PATCH 04/20] Move msword-search back to scripts/ --- scripts/{outer_scripts_to_review => }/msword-search | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/{outer_scripts_to_review => }/msword-search (100%) diff --git a/scripts/outer_scripts_to_review/msword-search b/scripts/msword-search similarity index 100% rename from scripts/outer_scripts_to_review/msword-search rename to scripts/msword-search From e57b859bd32cd37864b2e67562165f063cdebda7 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sat, 2 Oct 2021 20:02:04 -0600 Subject: [PATCH 05/20] Remove unused sources --- scripts/wk/cfg/sources.py | 52 ++++----------------------------------- 1 file changed, 5 insertions(+), 47 deletions(-) diff --git a/scripts/wk/cfg/sources.py b/scripts/wk/cfg/sources.py index cf76d635..36a67b37 100644 --- a/scripts/wk/cfg/sources.py +++ b/scripts/wk/cfg/sources.py @@ -9,75 +9,33 @@ DOWNLOAD_FREQUENCY = 7 # Sources SOURCES = { - 'Adobe Reader DC': 'https://ardownload2.adobe.com/pub/adobe/reader/win/AcrobatDC/2100120145/AcroRdrDC2100120145_en_US.exe', - 'AdwCleaner': 'https://downloads.malwarebytes.com/file/adwcleaner', 'AIDA64': 'https://download.aida64.com/aida64engineer633.zip', - 'aria2': 'https://github.com/aria2/aria2/releases/download/release-1.35.0/aria2-1.35.0-win-32bit-build1.zip', - 'Autologon32': 'http://live.sysinternals.com/Autologon.exe', - 'Autologon64': 'http://live.sysinternals.com/Autologon64.exe', - 'Autoruns': 'https://download.sysinternals.com/files/Autoruns.zip', 'AVRemover32': 'https://download.eset.com/com/eset/tools/installers/av_remover/latest/avremover_nt32_enu.exe', 'AVRemover64': 'https://download.eset.com/com/eset/tools/installers/av_remover/latest/avremover_nt64_enu.exe', + 'AdwCleaner': 'https://downloads.malwarebytes.com/file/adwcleaner', + 'Autologon32': 'http://live.sysinternals.com/Autologon.exe', + 'Autologon64': 'http://live.sysinternals.com/Autologon64.exe', 'BleachBit': 'https://download.bleachbit.org/BleachBit-4.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': 'http://www.classicshell.net/forum/download/file.php?id=3001&sid=9a195960d98fd754867dcb63d9315335', - 'Du': 'https://download.sysinternals.com/files/DU.zip', - 'ERUNT': 'http://www.aumha.org/downloads/erunt.zip', - 'ESET NOD32 AV': 'https://download.eset.com/com/eset/apps/home/eav/windows/latest/eav_nt64.exe', - 'ESET Online Scanner': 'https://download.eset.com/com/eset/tools/online_scanner/latest/esetonlinescanner_enu.exe', - 'Everything32': 'https://www.voidtools.com/Everything-1.4.1.1005.x86.en-US.zip', - 'Everything64': 'https://www.voidtools.com/Everything-1.4.1.1005.x64.en-US.zip', - 'FastCopy': 'https://ftp.vector.co.jp/73/10/2323/FastCopy392_installer.exe', - 'Fluent-Metro': 'https://github.com/bonzibudd/Fluent-Metro/releases/download/v1.5.2/Fluent-Metro_1.5.2.zip', - 'FurMark': 'https://geeks3d.com/dl/get/569', 'Firefox32': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win&lang=en-US', 'Firefox64': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US', - 'HitmanPro': 'https://dl.surfright.nl/HitmanPro.exe', + 'Fluent-Metro': 'https://github.com/bonzibudd/Fluent-Metro/releases/download/v1.5.2/Fluent-Metro_1.5.2.zip', + 'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe', 'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe', - 'HWiNFO': 'https://files1.majorgeeks.com/c8a055180587599139f8f454712dcc618cd1740e/systeminfo/hwi_702.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': 'https://devbuilds.s.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe', 'LibreOffice': 'https://download.documentfoundation.org/libreoffice/stable/7.1.2/win/x86_64/LibreOffice_7.1.2_Win_x64.msi', - 'Linux Reader': 'https://www.diskinternals.com/download/Linux_Reader.exe', - '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://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v7.9.5/npp.7.9.5.portable.minimalist.7z', 'OpenShell': 'https://github.com/Open-Shell/Open-Shell-Menu/releases/download/v4.4.160/OpenShellSetup_4_4_160.exe', - 'Office Deployment Tool': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_11617-33601.exe', - 'ProduKey32': 'http://www.nirsoft.net/utils/produkey.zip', - 'ProduKey64': 'http://www.nirsoft.net/utils/produkey-x64.zip', - 'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip', 'RegDelNull': 'https://download.sysinternals.com/files/Regdelnull.zip', 'RKill': 'https://download.bleepingcomputer.com/grinler/rkill.exe', - 'Samsung Magician': 'https://s3.ap-northeast-2.amazonaws.com/global.semi.static/SAMSUNG_SSD_v5_3_0_181121/CD0C7CC1BE00525FAC4675B9E502899B41D5C3909ECE3AA2FB6B74A766B2A1EA/Samsung_Magician_Installer.zip', - 'SDIO Themes': 'http://snappy-driver-installer.org/downloads/SDIO_Themes.zip', - 'SDIO Torrent': 'http://snappy-driver-installer.org/downloads/SDIO_Update.torrent', 'Software Bundle': 'https://ninite.com/.net4.8-7zip-chrome-edge-vlc/ninite.exe', - 'ShutUp10': 'https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe', - 'smartmontools': 'https://1278-105252244-gh.circle-artifacts.com/0/builds/smartmontools-win32-setup-7.3-r5216.exe', 'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe', - 'TestDisk': 'https://www.cgsecurity.org/testdisk-7.2-WIP.win.zip', 'VCRedist_2012_x32': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe', 'VCRedist_2012_x64': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe', 'VCRedist_2013_x32': 'https://aka.ms/highdpimfc2013x86enu', 'VCRedist_2013_x64': 'https://aka.ms/highdpimfc2013x64enu', 'VCRedist_2019_x32': 'https://aka.ms/vs/16/release/vc_redist.x86.exe', 'VCRedist_2019_x64': 'https://aka.ms/vs/16/release/vc_redist.x64.exe', - 'wimlib32': 'https://wimlib.net/downloads/wimlib-1.13.3-windows-i686-bin.zip', - 'wimlib64': 'https://wimlib.net/downloads/wimlib-1.13.3-windows-x86_64-bin.zip', - 'WinAIO Repair': 'http://www.tweaking.com/files/setups/tweaking.com_windows_repair_aio.zip', - 'Winapp2': 'https://github.com/MoscaDotTo/Winapp2/archive/master.zip', - 'WizTree': 'https://wiztreefree.com/files/wiztree_3_39_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', } From 24269f801cb6c12d61af7d5f7065e9c084ad33b2 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sat, 2 Oct 2021 20:02:17 -0600 Subject: [PATCH 06/20] Update RegDelNull section --- scripts/wk/cfg/sources.py | 3 ++- scripts/wk/repairs/win.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/wk/cfg/sources.py b/scripts/wk/cfg/sources.py index 36a67b37..975019f7 100644 --- a/scripts/wk/cfg/sources.py +++ b/scripts/wk/cfg/sources.py @@ -26,8 +26,9 @@ SOURCES = { 'KVRT': 'https://devbuilds.s.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe', 'LibreOffice': 'https://download.documentfoundation.org/libreoffice/stable/7.1.2/win/x86_64/LibreOffice_7.1.2_Win_x64.msi', 'OpenShell': 'https://github.com/Open-Shell/Open-Shell-Menu/releases/download/v4.4.160/OpenShellSetup_4_4_160.exe', - 'RegDelNull': 'https://download.sysinternals.com/files/Regdelnull.zip', 'RKill': 'https://download.bleepingcomputer.com/grinler/rkill.exe', + 'RegDelNull': 'https://live.sysinternals.com/RegDelNull.exe', + 'RegDelNull64': 'https://live.sysinternals.com/RegDelNull64.exe', 'Software Bundle': 'https://ninite.com/.net4.8-7zip-chrome-edge-vlc/ninite.exe', 'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe', 'VCRedist_2012_x32': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe', diff --git a/scripts/wk/repairs/win.py b/scripts/wk/repairs/win.py index 870a1df6..699af3e1 100644 --- a/scripts/wk/repairs/win.py +++ b/scripts/wk/repairs/win.py @@ -939,7 +939,7 @@ def backup_registry(): def delete_registry_null_keys(): """Delete registry keys with embedded null characters.""" - run_tool('RegDelNull', 'RegDelNull', '-s', '-y', cbin=True) + run_tool('RegDelNull', 'RegDelNull', '-s', '-y', download=True) def run_adwcleaner(): From a7779a9c1f33adb58605f17d4e5ad6ee631c0992 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Fri, 8 Oct 2021 20:05:08 -0600 Subject: [PATCH 07/20] Refactor Windows kit build process for new layout --- scripts/borrowed/set-eol.ps1 | 45 - setup/build_linux | 2 +- setup/build_windows.cmd | 46 +- {scripts => setup/pe}/build_pe.ps1 | 0 .../build_kit.ps1 => setup/windows/build.ps1 | 94 +- .../cbin/XYplorerFree/Data/XYplorer.ini | 1920 ----------------- setup/windows/docopt/LICENSE-MIT | 19 + .../docopt/docopt-0.6.2-py2.py3-none-any.whl | Bin 0 -> 13724 bytes setup/windows/launchers.json | 196 ++ setup/windows/sources.json | 48 + 10 files changed, 320 insertions(+), 2050 deletions(-) delete mode 100644 scripts/borrowed/set-eol.ps1 rename {scripts => setup/pe}/build_pe.ps1 (100%) rename scripts/build_kit.ps1 => setup/windows/build.ps1 (60%) delete mode 100644 setup/windows/cbin/XYplorerFree/Data/XYplorer.ini create mode 100644 setup/windows/docopt/LICENSE-MIT create mode 100644 setup/windows/docopt/docopt-0.6.2-py2.py3-none-any.whl create mode 100644 setup/windows/launchers.json create mode 100644 setup/windows/sources.json diff --git a/scripts/borrowed/set-eol.ps1 b/scripts/borrowed/set-eol.ps1 deleted file mode 100644 index ef98a91d..00000000 --- a/scripts/borrowed/set-eol.ps1 +++ /dev/null @@ -1,45 +0,0 @@ -## Borrowed from https://ss64.com/ps/syntax-set-eol.html -# -# set-eol.ps1 -# Change the line endings of a text file to: Windows (CR/LF), Unix (LF) or Mac (CR) -# Requires PowerShell 3.0 or greater - -# Syntax -# ./set-eol.ps1 -lineEnding {mac|unix|win} -file FullFilename - -# mac, unix or win : The file endings desired. -# FullFilename : The full pathname of the file to be modified. - -# ./set-eol win "c:\demo\data.txt" - -[CmdletBinding()] -Param( - [Parameter(Mandatory=$True,Position=1)] - [ValidateSet("mac","unix","win")] - [string]$lineEnding, - [Parameter(Mandatory=$True)] - [string]$file -) - -# Convert the friendly name into a PowerShell EOL character -Switch ($lineEnding) { - "mac" { $eol="`r" } - "unix" { $eol="`n" } - "win" { $eol="`r`n" } -} - -# Replace CR+LF with LF -$text = [IO.File]::ReadAllText($file) -replace "`r`n", "`n" -[IO.File]::WriteAllText($file, $text) - -# Replace CR with LF -$text = [IO.File]::ReadAllText($file) -replace "`r", "`n" -[IO.File]::WriteAllText($file, $text) - -# At this point all line-endings should be LF. - -# Replace LF with intended EOL char -if ($eol -ne "`n") { - $text = [IO.File]::ReadAllText($file) -replace "`n", $eol - [IO.File]::WriteAllText($file, $text) -} diff --git a/setup/build_linux b/setup/build_linux index 2b0bb620..2c87d84d 100755 --- a/setup/build_linux +++ b/setup/build_linux @@ -13,7 +13,7 @@ DATETIME="$(date +%Y-%m-%d_%H%M)" ROOT_DIR="$(realpath $(dirname "$0")/..)" BUILD_DIR="$ROOT_DIR/setup/BUILD" LOG_DIR="$BUILD_DIR/logs" -OUT_DIR="$ROOT_DIR/setup/OUT" +OUT_DIR="$ROOT_DIR/setup/OUT_LINUX" PROFILE_DIR="$BUILD_DIR/archiso-profile" REPO_DIR="$BUILD_DIR/repo" SKEL_DIR="$PROFILE_DIR/airootfs/etc/skel" diff --git a/setup/build_windows.cmd b/setup/build_windows.cmd index 292ad6c3..c6a1740a 100644 --- a/setup/build_windows.cmd +++ b/setup/build_windows.cmd @@ -3,31 +3,38 @@ @echo off :Init -setlocal +setlocal EnableDelayedExpansion +pushd "%~dp0" title Wizard Kit: Build Tool call :CheckFlags %* -:PrepNewKit -rem Copy base files to a new folder OUT_KIT -robocopy /e .kit_items OUT_KIT -robocopy /e .bin OUT_KIT\.bin -robocopy /e .cbin OUT_KIT\.cbin -copy LICENSE.txt OUT_KIT\LICENSE.txt -copy README.md OUT_KIT\README.md -copy Images\ConEmu.png OUT_KIT\.bin\ConEmu\ -mkdir OUT_KIT\.cbin >nul 2>&1 -attrib +h OUT_KIT\.bin >nul 2>&1 -attrib +h OUT_KIT\.cbin >nul 2>&1 +:SetVariables +rem Set variables using settings\main.py file +set "SETTINGS=..\scripts\wk\cfg\main.py" +for %%v in (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!" + ) +) +set "OUT_DIR=OUT_KIT\%KIT_NAME_FULL%" -:EnsureCRLF -rem Rewrite main.py using PowerShell to have CRLF/`r`n lineendings -set "script=OUT_KIT\.bin\Scripts\borrowed\set-eol.ps1" -set "main=OUT_KIT\.bin\Scripts\settings\main.py" -powershell -executionpolicy bypass -noprofile -file %script% -lineEnding win -file %main% || goto ErrorUnknown +:PrepNewKit +rem Copy base files to a new folder %OUT_DIR% +mkdir %OUT_DIR% >nul 2>&1 +robocopy /e windows/bin %OUT_DIR%\.bin +robocopy /e windows/cbin %OUT_DIR%\.cbin +copy ..\LICENSE.txt %OUT_DIR%\LICENSE.txt +copy ..\README.md %OUT_DIR%\README.md +copy ..\images\ConEmu.png %OUT_DIR%\.bin\ConEmu\ +attrib +h %OUT_DIR%\.bin >nul 2>&1 +attrib +h %OUT_DIR%\.cbin >nul 2>&1 :Launch -set "script=OUT_KIT\.bin\Scripts\build_kit.ps1" -powershell -executionpolicy bypass -noprofile -file %script% || goto ErrorUnknown +set "script=windows\build.ps1" +powershell -executionpolicy bypass -noprofile -file %script% "%OUT_DIR%" || goto ErrorUnknown goto Exit :: Functions :: @@ -58,5 +65,6 @@ goto Exit :: Cleanup and exit :: :Exit +popd endlocal exit /b %errorlevel% diff --git a/scripts/build_pe.ps1 b/setup/pe/build_pe.ps1 similarity index 100% rename from scripts/build_pe.ps1 rename to setup/pe/build_pe.ps1 diff --git a/scripts/build_kit.ps1 b/setup/windows/build.ps1 similarity index 60% rename from scripts/build_kit.ps1 rename to setup/windows/build.ps1 index a8316913..e73d7ec5 100644 --- a/scripts/build_kit.ps1 +++ b/setup/windows/build.ps1 @@ -1,14 +1,19 @@ -# Wizard Kit: Download kit components +# Wizard Kit: Build base kit ## Init ## #Requires -Version 3.0 +[CmdletBinding()] +Param( + [Parameter(Mandatory=$True)] + [string]$KitPath +) if (Test-Path Env:\DEBUG) { Set-PSDebug -Trace 1 } $Host.UI.RawUI.WindowTitle = "Wizard Kit: Build Tool" -$WD = $(Split-Path $MyInvocation.MyCommand.Path) -$Bin = (Get-Item $WD).Parent.FullName -$Root = (Get-Item $Bin -Force).Parent.FullName +$WD = Split-Path $MyInvocation.MyCommand.Path | Get-Item +$Root = Get-Item "$KitPath" +$Bin = Get-Item "$($Root.FullName)\.bin" -Force $Temp = "$Bin\tmp" $System32 = "{0}\System32" -f $Env:SystemRoot $SysWOW64 = "{0}\SysWOW64" -f $Env:SystemRoot @@ -74,65 +79,50 @@ if ($MyInvocation.InvocationName -ne ".") { Clear-Host Write-Host "Wizard Kit: Build Tool`n`n`n`n`n" + ## Sources ## + $Sources = Get-Content -Path "$WD\sources.json" | ConvertFrom-JSON + ## Download ## $DownloadErrors = 0 - $Path = $Temp # 7-Zip - DownloadFile -Path $Path -Name "7z-installer.msi" -Url "https://www.7-zip.org/a/7z1900.msi" - DownloadFile -Path $Path -Name "7z-extra.7z" -Url "https://www.7-zip.org/a/7z1900-extra.7z" + DownloadFile -Path $Temp -Name "7z-installer.msi" -Url $Sources.'7-Zip Installer' + DownloadFile -Path $Temp -Name "7z-extra.7z" -Url $Sources.'7-Zip Extra' # ConEmu - $Url = "https://github.com/Maximus5/ConEmu/releases/download/v19.03.10/ConEmuPack.190310.7z" - DownloadFile -Path $Path -Name "ConEmuPack.7z" -Url $Url - - # Notepad++ - $Url = "https://notepad-plus-plus.org/repository/7.x/7.6.4/npp.7.6.4.bin.minimalist.7z" - DownloadFile -Path $Path -Name "npp.7z" -Url $Url + DownloadFile -Path $Temp -Name "ConEmuPack.7z" -Url $Sources.'ConEmu' # Python - $Url = "https://www.python.org/ftp/python/3.7.2/python-3.7.2.post1-embed-win32.zip" - DownloadFile -Path $Path -Name "python32.zip" -Url $Url - $Url = "https://www.python.org/ftp/python/3.7.2/python-3.7.2.post1-embed-amd64.zip" - DownloadFile -Path $Path -Name "python64.zip" -Url $Url + DownloadFile -Path $Temp -Name "python32.zip" -Url $Sources.'Python x32' + DownloadFile -Path $Temp -Name "python64.zip" -Url $Sources.'Python x64' + + # Python: docopt + Copy-Item -Path "$WD\docopt\docopt-0.6.2-py2.py3-none-any.whl" -Destination "$Temp\docopt.whl" # Python: psutil $DownloadPage = "https://pypi.org/project/psutil/" - $RegEx = "href=.*-cp37-cp37m-win32.whl" + $RegEx = "href=.*-cp38-cp38-win32.whl" $Url = FindDynamicUrl $DownloadPage $RegEx - DownloadFile -Path $Path -Name "psutil32.whl" -Url $Url - $RegEx = "href=.*-cp37-cp37m-win_amd64.whl" + DownloadFile -Path $Temp -Name "psutil32.whl" -Url $Url + $RegEx = "href=.*-cp38-cp38-win_amd64.whl" $Url = FindDynamicUrl $DownloadPage $RegEx - DownloadFile -Path $Path -Name "psutil64.whl" -Url $Url + DownloadFile -Path $Temp -Name "psutil64.whl" -Url $Url - # Python: requests & dependancies + # Python: pytz, requests, & dependancies $RegEx = "href=.*.py3-none-any.whl" - foreach ($Module in @("chardet", "certifi", "idna", "urllib3", "requests")) { + foreach ($Module in @("chardet", "certifi", "idna", "pytz", "urllib3", "requests")) { $DownloadPage = "https://pypi.org/project/$Module/" $Name = "$Module.whl" $Url = FindDynamicUrl -SourcePage $DownloadPage -RegEx $RegEx - DownloadFile -Path $Path -Name $Name -Url $Url + DownloadFile -Path $Temp -Name $Name -Url $Url } - # Visual C++ Runtimes - $Url = "https://aka.ms/vs/15/release/vc_redist.x86.exe" - DownloadFile -Path $Path -Name "vcredist_x86.exe" -Url $Url - $Url = "https://aka.ms/vs/15/release/vc_redist.x64.exe" - DownloadFile -Path $Path -Name "vcredist_x64.exe" -Url $Url - ## Bail ## # If errors were encountered during downloads if ($DownloadErrors -gt 0) { Abort } - ## Install ## - # Visual C++ Runtimes - $ArgumentList = @("/install", "/passive", "/norestart") - Start-Process -FilePath "$Temp\vcredist_x86.exe" -ArgumentList $ArgumentList -Wait - Start-Process -FilePath "$Temp\vcredist_x64.exe" -ArgumentList $ArgumentList -Wait - Remove-Item "$Temp\vcredist*.exe" - ## Extract ## # 7-Zip Write-Host "Extracting: 7-Zip" @@ -155,20 +145,6 @@ if ($MyInvocation.InvocationName -ne ".") { Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red" } - # Notepad++ - Write-Host "Extracting: Notepad++" - try { - $ArgumentList = @( - "x", "$Temp\npp.7z", "-o$Bin\NotepadPlusPlus", - "-aoa", "-bso0", "-bse0", "-bsp0") - Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait - Remove-Item "$Temp\npp.7z" - Move-Item "$Bin\NotepadPlusPlus\notepad++.exe" "$Bin\NotepadPlusPlus\notepadplusplus.exe" - } - catch { - Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red" - } - # ConEmu Write-Host "Extracting: ConEmu" try { @@ -189,7 +165,9 @@ if ($MyInvocation.InvocationName -ne ".") { "python$Arch.zip", "certifi.whl", "chardet.whl", + "docopt.whl", "idna.whl", + "pytz.whl", "psutil$Arch.whl", "requests.whl", "urllib3.whl" @@ -206,23 +184,9 @@ if ($MyInvocation.InvocationName -ne ".") { Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red" } } - try { - Copy-Item -Path "$System32\vcruntime140.dll" -Destination "$Bin\Python\x64\vcruntime140.dll" -Force - Copy-Item -Path "$SysWOW64\vcruntime140.dll" -Destination "$Bin\Python\x32\vcruntime140.dll" -Force - } - catch { - Write-Host (" ERROR: Failed to copy Visual C++ Runtime DLLs." ) -ForegroundColor "Red" - } Remove-Item "$Temp\python*.zip" Remove-Item "$Temp\*.whl" - ## Configure ## - Write-Host "Configuring kit" - WKPause "Press Enter to open settings..." - $Cmd = "$Bin\NotepadPlusPlus\notepadplusplus.exe" - Start-Process -FilePath $Cmd -ArgumentList @("$Bin\Scripts\settings\main.py") -Wait - Start-Sleep 1 - ## Done ## Pop-Location $ArgumentList = @("-run", "$Bin\Python\x32\python.exe", "$Bin\Scripts\update_kit.py", "-new_console:n") diff --git a/setup/windows/cbin/XYplorerFree/Data/XYplorer.ini b/setup/windows/cbin/XYplorerFree/Data/XYplorer.ini deleted file mode 100644 index a9d06a08..00000000 --- a/setup/windows/cbin/XYplorerFree/Data/XYplorer.ini +++ /dev/null @@ -1,1920 +0,0 @@ -; XYplorerFree 17.40.0100 configuration file -; Windows 10, 64-bit -; 2017-11-01 13:16:33 - -[General] -LastVer=17.40.0100 -WinState=2 -WinStatePrev=2 -WinOnTray=0 -StartPath=This PC -StartPathExpanded=1 -Tabset1= -Tabset2= -Goto= -NewPath= -PathBackupSettings= -LastFocus=L -LastTab=0 -LastTabFind=0 -LastTabRep=0 -LastLabel=0 -LastFindLabel=0 -LastTags= -LastView=1 -LastVisualFilter=""Today|Modified Today" ageM: d" -InstantColorFilter="" -InstantColorFilterLast="" -LockTree=0 -ACMessageStatusBar=0 -LogToFile=0 -HideMainMenuToggleByAlt=0 -CatalogPerm= -Pane=0 -SelSpecLeft=0 -SelSpecTop=0 -SelSpecWidth=0 -SelSpecHeight=0 -SelSpecLastCmd=0 -SelSpecOnBothPanes=0 -SelSpecIgnoreExtensions=0 -SelSpecHonorRelativePaths=1 -AutoSyncSelect=0 -Toolbar=back,fore,up,-,myco,find,-,newfolder,copy,cut,paste,del,-,undo,redo,-,fp -ToolbarLarge=1 -ToolbarScrolls=0 -ToolbarWraps=0 -; Tweak: zoom factor for main toolbar (0.5 - 8) -ToolbarZoom=1 -ToolbarNoScale=0 -; Tweak: factor of separator width (2 - 10) -ToolbarSepFac=0 -; Tweak: min width reserved for the element (e.g. addressbar) next to the toolbar -ToolbarKeepOff=400 -; Tweak: RRGGBB -ToolbarBackColor= -AddressBarWidth=0 -ToolbarLFBAvailable= -ToolbarLFBCurrent= -ToolbarStyleMinor=1 -GoToRecentPathOnDrive=0 -clrMarkedText=13463312 -clrMarkedTextWindow=13463312 -clrLineNumText=9474192 -clrLineNumBack=16316664 -clrTreeSelNoFocusText=0 -clrTreeSelNoFocusBack=15129552 -clrTreePathTracking=5695926 -clrTreeLocked=15790320 -clrListSelNoFocusBack=15129552 -clrSelectionBox=14120960 -clrPreviewPane=0 -; Tweak: 1-255 -TSBTransparency=70 -SelectionStyle=0 -UseClrTreeSelNoFocusBack=0 -UseClrListSelNoFocusBack=0 -PostfixNum="-01" -PostfixDate="*-" -DroppedMessageFormat="___" -DroppedMessageReplChar="" -LowAsciiReplacementChar="∙" -; Tweak: png (default), jpg, bmp, gif, or tif -ImageFromClipFormat= -; Tweak: -StatusBar1TotalBytes=0 -; Tweak: E.g. , mod -StatusBar3OnFile="" -TermSearchResults= -; Tweak: Recycle Bin caption -TermRecycleBin= -; Tweak: Network caption -TermNetwork= -LoadLanguageAfterDownload=1 -SplitterWidth=4 -CustomColorsList=0,1118481,2236962,3355443,4473924,5592405,6710886,7829367,8947848,10066329,11184810,12303291,13421772,14540253,15658734,16777215 -MoveTo= -CopyTo= -BackupTo= -; Tweak: Set to b|r|s|k|e to open Batch[Default]|RegExp|SearchReplace|KeepChars|SetExtension when calling Rename on multiple files. -MultipleRenameDefault= -; Tweak: Separator between RegExpPattern and ReplaceWith, Default = " > " -RegExpRenameSep=" > " -; Tweak: RRGGBB -RenamePreviewZebraColor= -RenamePreviewColorOK= -RenamePreviewColorWarn= -RPLeft=0 -RPTop=0 -RPWidth=0 -RPHeight=0 -LMLeft=0 -LMTop=0 -LMWidth=0 -LMHeight=0 -LMIndexPrev=0 -ALLeft=0 -ALTop=0 -ALWidth=0 -ALHeight=0 -CCWidth=0 -CCHeight=0 -SVLeft=0 -SVTop=0 -SVWidth=0 -SVHeight=0 -BJDLeft=0 -BJDTop=0 -BJDWidth=0 -BJDHeight=0 -PDLeft=0 -PDTop=0 -ProgressOffset=0 -KIPLeft=0 -KIPTop=0 -KIPWidth=0 -KIPHeight=0 -FlatViewType=0 -FlatPersistAcrossFolders=0 -FlatToggleOnSame=0 -FlatAutoRefresh=1 -FlatLevelIndent=1 -FlatLevelIndentWidth=12 -FlatTreeLikeSort=1 -FlatFoldersPassAllFilters=1 -FlatMBVShowTopFolders=1 -FlatInheritColumns=1 -VFApplyToFilesOnly=0 -VFPersistAcrossFolders=1 -VFToggleOnSame=1 -VFMatchCase=0 -VFIgnoreDiacritics=1 -VFFilterWarning=1 -VFFilterWarningInTabs=0 -VFGlobal="" -VFGlobalLast=""Year|Modified This Year" ageM: y" -TypeStatsSort=1 -SelFilter= -LiveFilterDelay=0 -LiveFilterBoxes= -PowerFiltersVirgin=1 -GlobalPowerFiltersVirgin=1 -ColorFiltersInstantVirgin=1 -SearchResultsTab=2 -OpenWithArguments= -QFVWrap=0 -QFVLeft=0 -QFVTop=0 -QFVWidth=0 -QFVWidthHex=0 -QFVHeight=0 -HRLeft=0 -HRTop=0 -HRWidth=0 -HRHeight=0 -; Tweak: max items in recent locations button dropdown menu -RecLocMenuMax=0 -CKSCategoryLast=0 -CKSCommandLast=0 -CKSCommandTopLast=0 -CheatSheetIncludeCommandIDs=0 -UDCCategoryLast=0 -UDCCommandLast=0 -UDCCommandTopLast=0 -ScriptTryLeft=0 -ScriptTryTop=0 -ScriptTryWidth=0 -ScriptTryHeight=0 -ScriptTryWrap=0 -StepScripts=0 -StepWinLeft=0 -StepWinTop=0 -RunScript="" -TitlebarTemplate=" - " -; Tweak: disable WOW64 redirection on 64-bit platforms (NOT recommended with file operations!) -WOW64DisableRedirection=0 -RealSystem32=1 -ContextMenu64=0 -ShellDrag=1 -; Tweak: Fix focus loss of modal popups on taskbar activation -FixFocusLoss=0 -; Tweak: -AllowMultiLocShellMenu=0 -; Tweak: bypass the shell when opening files; faster on some systems -NoShellOpen=0 - -[Layout] -DP=1 -DPHorizontal=0 -ShowMainMenu=1 -ShowAddressBar=0 -ShowToolbar=1 -ShowTabs=0 -ShowCrumb=1 -ShowFilter=0 -ShowStatusbar=1 -ShowStatusbarButtons=1 -ShowNav=1 -ShowTree=1 -ShowCatalog=0 -ShowPreviewPane=0 -ShowInfoPanel=0 -ABTBStacked=1 -ToolbarFirst=1 -TreeCatalogStacked=1 -CatalogFirst=0 -ListPosition=0 -TabsWide=1 -InfoPanelWide=0 -NavWidthLeft=210 -NavWidthRight=280 -CatalogWidth=200 -CatalogHeight=156 -Pane1Width=448 -Pane2Width=448 -Pane1Height=327 -Pane2Height=327 -PreviewPaneWidth=280 -InfoPanelHeight=0 -InfoPanelHeightJump=0 -TabsWideNoCrumb=0 - -[Settings] -LastTab=24 -LastFileTypes=0 -ConfigLeft=7830 -ConfigTop=1800 -ShowSpecFolderDesktop=1 -ShowSpecFolderDocuments=1 -ShowSpecFolderDownloads=1 -ShowSpecFolderLinks=1 -ShowSpecFolderUser=1 -ShowFloppies=0 -ShowHiddenDrives=0 -ShowHiddenItems=1 -ShowSystemItems=1 -HideProtectedOperatingSystemFiles=1 -ShowJunctions=1 -ShowNethood=1 -ShowRecycleBin=1 -ShowPortableDevices=0 -HideFoldersInList=0 -; Tweak: show only available drives in Go | Drives... -PopupAvailableDrivesOnly=0 -ResolveNestedJunctions=1 -GFHideItems=0 -GFPatternList=".*" -GFIgnoreDiacritics=0 -CustomDnDMenu=1 -CustomItemsCtxMenu=1 -CustomItemsCtxMenuSelect=1195 -CustomItemsCtxMenuTreeSelect=8973 -CtxMenuDefaultOnly=0 -GoCommandsInContextMenu=0 -FindCommandsInContextMenu=0 -KSInMenu=1 -IDinMenu=0 -AutoComplete=1 -; Tweak: match from beginning (start else matching is anywhere) -AutoCompleteMatchFromBeginning=0 -AutoCompletePathABar=1 -AutoCompleteFilter=2 -AutoCompletePathLocation=1 -; Tweak: 1 = autocomplete in Address Bar includes UNC paths -AutoCompleteOnUNC=0 -MoveLastUsedToTop=1 -DCHoverSelect=1 -DCSelectionLite=0 -DCSelectAllOnFocusByKey=1 -DCSelectAllOnFocusByMouse=1 -DCSelectAllOnItemChange=1 -DCSelectMatchOnDropDown=0 -; Tweak: skip icon retrieval in dropdowns -NoIconsInDropDowns=0 -; Tweak: allow shell autocomplete -AllowShellAutoComplete=0 -TreeExpansionIcon=1 -; Tweak: min font height in pixels for large collapse/expand icons -LargePlusMinus=21 -; Tweak: Tree Path Tracing width -TPTWidth=0 -MainControlsBorderStyle=5 -ApplyBoxColorToList=1 -SetListStyleGlobally=1 -GridStyle=1 -GridSemiTransparent=0 -; Tweak: group date and size by displayed data -GridGroupByDisplay=0 -UnderlineSelectedRow=0 -TranslucentSelectionBox=1 -FocusRect=0 -FlatLook=1 -TPTWide=0 -TPTMarkNodes=0 -RememberListSettingsPerTab=1 -RememberListSettingsPerTabApply=3 -RenameExcludeExt=1 -ResortAfterRename=0 -SerialRenameByUpDown=1 -AllowMoveOnRename=1 -NewItemsToEnd=0 -AutoSelectAfterDeleteOrMove=0 -RenameUseDialog=0 -RenameAutoReplaceInvalidChars=0 -; Tweak: on inline rename only -RenameAllowLeadingSpaces=0 -; Tweak: no overwrite prompt on inline rename -RenameOverwriteNoConfirm=0 -RenamePreviewHideUnchanged=0 -; Tweak: no prompt on opening items with overlong filenames -OpenOverlongNoConfirm=0 -; Tweak: display new List contents only after all items have been retrieved and sorted -NoDisplayBeforeSort=0 -PreviewRenameSpecial=0 -; Tweak: natively extract embedded thumbs in PSD files -PreviewPSDEmbeddedThumb=0 -; Tweak: fall back to shell preview -PreviewShellIfNoneBetter=1 -; Tweak: keep Raw Viewed file open and locked until unselected -RawViewKeepOpen=0 -QuickFileViewNonmodal=1 -; Tweak: open Quick File View etc unfocused -OpenViewsUnfocused=0 -NukeNoConfirm=0 -NukeNoRecycle=0 -NukeSkipLocked=0 -NukeWipe=0 -EnableColorFilters=1 -ApplyColorFilterList=1 -ApplyColorFilterTree=1 -ColorFilterIgnoreDiacritics=1 -ColorFilterShapes=0 -; Tweak: e.g. FFEF00,7FFF00,FF40FF,00DFFF -SpotColorsList= -ShowMilliSeconds=0 -ShowMilliSecondsPrecision=0 -ShowMilliSecondsCropNulls=0 -SortFoldersApart=1 -SortMixedOnDates=0 -SortMixedOnTags=0 -SortMixedOnPaths=1 -KeepFoldersOnTop=0 -SortFoldersAscending=0 -SortNatural=1 -SortByBase=0 -SortSecondaryByExactDate=0 -; Tweak: e.g. a;an;the -SortLeadingWordsToIgnore=a;an;the -DefaultSortDesc=6 -KeepFocusedPosAfterSort=1 -ScrollToTopAfterSort=1 -SortHeadersInAllViews=1 -TAFEnabled=1 -TAFUsesSortedCol=0 -TAFMatchAnywhere=0 -TAFIgnoreDiacritics=0 -TAFHighLight=1 -TAFPasteAndFind=1 -TAFTimeout=750 -TAFNoRepeatCharCycle=0 -TAFLast= -SingleClickOnIconOpens=0 -LineNumberSelection=0 -DblClickGoesUp=1 -MiddleClickOpensFolderInNewTab=1 -MiddleClickOpensFileInNewTab=1 -; Tweak: set to 1 to omit the Time part in the Accessed column -NoAccessedTime=0 -ZuluFileTimes=0 -; Tweak: set to 1 to not append Z to UTC filetimes -ZuluNoSuffix=0 -AutosizeColumnsMaxWidth=0 -; Tweak: -AutoSizeColumnsSkips=0 -SynchTreeToFind=1 -ExpandOnBrowse=0 -ExpandOnClick=0 -ExpandLinks=0 -MiniTree=1 -MiniTreePaths= -; Tweak: size of Mini Tree from Recent -MiniTreeHistoryDepth=4 -MiniTreePathsFavorite= -MiniTreeAllowZombies=1 -; Tweak: set to 1 to enable e.g. logon dialogs in MT -MiniTreeVerifyOnSelect=0 -; Tweak: set to 1 to skip checking for existence/availability -TreeSkipVerifyOnSelect=0 -; Tweak: set to 1 to skip network and removable drives on refresh -TreeRefreshSkipSlow=0 -; Tweak: set to 1 to show icon overlay on unavailable drives -TreeOverlayUnavailable=0 -AutoOptimizeTree=0 -; Tweak: set to 1 to optimize the tree on each location change -AutoOptimizeTreeRadical=0 -RestoreMaxiTree=0 -MaxiTreePaths= -MiniTreeTopIndex=0 -MaxiTreeTopIndex=0 -CheckSubfoldersExist=0 -CheckSubfoldersExistOnNetwork=0 -TreeShowLocalizedNames=0 -TreeSelectParentOfDeleted=1 -TreeSelectParentOfMoved=1 -DisallowDragging=0 -DisallowDraggingDrives=0 -; Tweak: 0 = System Default (Move), 1 = Copy, 2 = Move -DragOpIntraVolume=0 -; Tweak: 0 = System Default (Copy), 1 = Copy, 2 = Move -DragOpCrossVolume=0 -; Tweak: -SimpleDrag=0 -ConfirmDrop=0 -ConfirmFileOp=0 -ConfirmFileDelete=0 -PortableDevicesReadOnly=0 -PortableDevicesCopyByShell=0 -DeleteOnKeyUp=0 -CaretPositioningLikeExplorer=0 -SettingsWarnReadonly=0 -DFCProtection=0 -; Tweak: -DropOnRarSpecial=0 -ClickSBToggleIP=0 -StatusBarShowVersion=0 -SundayFirst=0 -; Tweak: 1=Sunday ... 7=Saturday -DPFirstDayOfWeek=0 -AgeLimitHours= -; Tweak: number of decimal places used by 'Show Age'; -1, -2 for special formats -AgeDecimalPlaces=0 -TimestampToleranceSecs=2 -; Tweak: -HideEmptyUserMenus=1 -; Tweak: -HideUnderscoredUDCs=0 -; Tweak: set to 1 to detect script in AB without :: -ScriptSmartDetect=1 -; Tweak: set to 1 to turn off the recursion checker -ScriptRecursionWarningOff=0 -ScriptRetainPVs=0 -ScriptUnindent=0 -ScriptAllowMinimizeApp=0 -ScriptStrictSyntax=0 -; Tweak: absolute or relative to app path -ScriptsPath= -; Tweak: no Click, Edit, Customize Toolbar -CTBNoRClickDefaultCommands=0 -FolderSpecificSettings=0 -AssumeServersExist=0 -NetworkPrecheckServers=0 -NetworkCapsCheck=0 -SupportOverlongFilenames=1 -VolumeLabelsInPaths=0 -CheckServerMethod=0 -CheckServer3=0 -; Tweak: -NetworkNetServerEnum=0 -; Tweak: -NetworkDriveSkipPollingBytes=0 -NetworkReconnectMappedDrivesOnStartup=0 -; Tweak: -ShowAllServers=0 -; Tweak: 1 = always show all hidden shares -ShowHiddenShares=0 -HistoryNoDupes=0 -HistoryPerTab=1 -HistoryRetainsSelections=0 -HistoryRetainsSortOrder=0 -; Tweak: 1 = show oldest item as number one -HistoryFirstIsOne=0 -; Tweak: 1 = notify system of opened docs, 2 = of opened locations, 3 = both -AddToRecentDocs=0 -AutoSelectMRUSubfolder=1 -; Tweak: -GoUpIsBack=0 -ABPathsSlashed=0 -ABRelativeToAppPath=0 -ABOpenFiles=0 -; Tweak: 1 = show dropdown button on the left -ABButtonLeft=0 -FavFilesDirectOpen=0 -ListShowMessageOnEmpty=1 -PasteToSelectedFolder=0 -; Tweak: -CreateSymlinkPrefix="" -; Tweak: -CreateJunctionPrefix="" -CreateSymlinkPrompt=1 -CreateJunctionPrompt=1 -RelPath=1 -FindCacheResults=1 -FindCacheMaxCount=1000 -; Tweak: set to 1 to level-indent search results -FindLevelIndent=0 -; Tweak: set to 1 to force slightly faster mixed original sort -FindMixedSortPerLevel=0 -FindFollowJunctions=0 -FindNameSearchInCurrentTab=1 -FindWarning=1 -FindInheritColumns=1 -FindNoIFilters=0 -; Tweak: set to 1 to parse !a OR b as !(a OR b) -FindAllowMasterInvert=0 -FindNoExtendedPatternMatching=1 -; Tweak: set to 0 to detect Boolean terms without : -FindBoolNoSmartDetect=0 -FindContentTextAllTypes=0 -FindSilent=0 -PaperPath= -PFAllowZombies=0 -PFForcePathColumn=1 -PFDeleteRemoves=1 -PFWarning=1 -ShowFolderSize=0 -ShowFolderSizeInList=0 -ShowFolderSizeInListOnNetwork=0 -ShowItemCount=0 -ShowFolderSizesExclude= -ShowSpaceUsed=0 -AutoRefresh=1 -WatchNetwork=0 -WatchRemovable=1 -; Tweak: |-separated list of locations to watch or not to watch: -%user%\Downloads|C:\*|-N:\* -WatchIt= -WatchDuringFileOp=0 -; Tweak: set to 1 to disable auto-refresh on removable drives and non-current folders -DisableSHChangeNotifyRegister=0 -; Tweak: -RefreshTreeOnTabChange=0 -; Tweak: refresh only the list if the list is focused -RefreshListOnly=0 -DimSelectedIcons=0 -CacheSpecificIcons=1 -GenericIcons=0 -GenericIconsNetworkOnly=0 -GenericIconsForAllControls=0 -; Tweak: fast generic icons for net locs anywhere in the interface -GenericIconsForNetworkLocations=0 -; Tweak: fast generic icons for Catalog items -GenericIconsForCatalog=0 -ShowIconOverlays=0 -ShowIconOverlaysOnNetwork=0 -; Tweak: set to 1 to hide the shared folder icon overlays -NoSharedFolderOverlays=0 -ExtractEmbeddedIcons=0 -EnableCustomFileIcons=0 -; Tweak: absolute or relative to app path -IconsPath= -LinenumDigits=3 -; Tweak: auto-focus the list after left-clicking a catalog item -SetFocusToListAfterCatalog=0 -; Tweak: auto-collapse non-current categories -AutoOptimizeCatalog=0 -; Tweak: no open/openwith overlays for Catalog items -CatalogNoActionOverlays=0 -; Tweak: popup full favorites menu on right-click in tree -PopupFullFavMenu=0 -; Tweak: popup menus at selected control or item -PopupMenusAtSelection=1 -; Tweak: auto-position of selected list item after auto-scrolling into view -ListRowForAutoScroll=1 -; Tweak: auto-position of selected tree node after auto-scrolling into view -TreeRowForAutoScroll=5 -; Tweak: position of selected tree node after double click in the white -TreeRowForDblClickScroll=0 -; Tweak: increase tree node indent in pixels -TreeNodeIndent=0 -; Tweak: tree white space on the left -TreePaddingLeft=5 -TreeItemDistY=0 -CatalogItemDistY=0 -ListItemDistY=0 -ZoomByWheel=1 -ListHideExtInDetailsOnly=0 -ListHideExtShortcutsOnly=0 -; Tweak: don't scroll half-visible items into view -ListNoAutoHoriScroll=0 -; Tweak: don't scroll pasted items into view -ListNoAutoScrollOnPaste=0 -; Tweak: click whole Name column to select -ListFullNameSelect=0 -ListCheckboxSelectionMode=0 -ListCellsFirstLinesOnly=0 -ListAutoSelectFirst=0 -; Tweak: right-padding of columns -ListDetailsColumnsSpacing=2 -; Tweak: left-padding of columns -ListDetailsColumnsSpacingLeft=2 -; Tweak: lists line height extra pixels -ListsLineSpacing=2 -; Tweak: OBSOLETE -WinVistaExtraLineSpacing=0 -OpenAllSelectedInMultipleInstances=0 -OpenManyMaxCount=0 -StartPathPerm= -StartPathPermExpand=0 -OpenStartPathInNewTab=0 -StartPanePerm=0 -AllowMultipleInstances=1 -AlwaysNewInstance=0 -; Tweak: set to 1 if mouse button 4 & 5 do not work -XButtonSupport=1 -NoNetworkOnStartup=1 -; Tweak: set to 1 to suppress filling the info panel on startup and tab switch -NoPropertiesStartup=0 -; Tweak: set to 1 to allow start with a preview (can be slow!) -AllowPreviewOnStartup=0 -StartupMinimized=0 -MinimizeToTray=0 -MinimizeToTrayOnXClose=0 -; Tweak: set to 1 to keep the tray icon visible always -StayOnTray=0 -; Tweak: set to 1 to get nagged by an 'Exit XYplorer now?' prompt. -PromptOnXClose=0 -; Tweak: custom app icon -IconFile= -UseCustomCLI=0 -CustomCLI= -CustomCLIArgs= -CheckForUpdates=0 -CacheServers=0 -PrivateHistory=0 -; Tweak: -KeepLastPaths=0 -SaveMRULists=1 -SavedMRULists=2047 -; Tweak: one char (A-Z, 0-9) used for hotkey Win+[ ] to show app -HotKeyShowApp= -; Tweak: e.g. AB to hide drives A and B -HideDrivesByLetter= -AutoSaveSettings=0 -AutoSaveMins=10 -SaveSettingsOnExit=0 -AutoBackupConfig=1 -MTNoPerformanceTip=0 -ClrBackTree=16777215 -ClrTextTree=0 -ClrHilite=8454143 -ClrBoxed=16250871 -ClrTabCurrent=0 -ClrTabOther=0 -ClrTabCurrentBack=16777215 -ClrTabOtherBack=15790320 -ClrBtnfacePrev=15790320 -ShadeInactivePane=1 -ClrInactivePane=16185078 -TabKeyPanes=2 -PaneRubberStyle=2 -AlwaysKeepFirstPane=0 -ShowTags=0 -TagColClick=0 -TagColClickRight=1 -TagColClickRightSelected=1 -TagSortKeepTagsOnTop=1 -TagStorage=0 -TagDatCustom= -TagCopyTagsOnCopy=1 -TagCopyTagsOnBackup=0 -TagCopyTagsConfirm=0 -TagSearchHere=0 -TagsMatchAll=0 -; Tweak: separator between item tags; one character only; not <>|*? -TagsSeparator= -CommentWrap=0 -LabelSearchHere=0 -TagStyle=1 -TagsList= -TagsAddNew=0 -TagsFindLast= -TagsFindWildcardMatching=0 -; Tweak: 0 = whole tag, 1 = any words in tag, 2 = any part of tag -TagsFindPartialMatch=0 -TagsDBCheckFixedDrivesOnly=0 -TagsModeOnIP=0 -TagsApplyLabel=1 -TagsApplyTags=1 -TagsApplyComment=1 -; Tweak: 0=Default, 1=ShellContextMenu -CEA_ABRightClickIcon=0 -; Tweak: 0=Default, 1=Top, 2=Up, 3=Back, 4=ScrollInView, 5=Refresh -CEA_TreeListDoubleClickOnWhite=0 -; Tweak: 0=Favs, 1=Favs Full, 2=Drives, 3=Drives+Special, 4=Tabs, 5=FavFiles, 6=Script -CEA_TreeRightClickOnWhite=0 -CEA_TreeRightClickOnWhite_Script= -; Tweak: 0=Edit menu, 1=Folder's shell menu, 2=Favorites, 3=reserved, 4=Tabs, 5=FavFiles, 6=Script -CEA_ListRightClickOnWhite=0 -CEA_ListRightClickOnWhite_Script= -; Tweak: 0=Default, 1=OpenInNewTab, 2=FloatingPreview, 3=FullScreenPreview -CEA_ListMiddleClickOnFile=0 -; Tweak: 0=Back, 1=Up -CEA_MouseBack=0 -; Tweak: 0=Forward, 1=Down -CEA_MouseForward=0 -FopInBackground=0 -BackgroundedFileOps=7 -FopAutoQueue=0 -UseCustomCopy=0 -UseCustomCopyForCopy=1 -UseCustomCopyForMove=1 -UseCustomCopyForMoveCrossVolumeOnly=0 -CustomCopyDuplicateNoProgress=0 -CustomMoveIntraNoProgress=1 -CustomCopyFlags=0 -CustomCopyNoDoEvents=0 -; Tweak: no log is created if this or more files -CustomCopyNoLog=0 -Copier= -CopierLast= -CopierList= -BJHideCompleted=0 -; Tweak: allow backgrounding drops from outside -BJAllowDropFromOutside=0 -; Tweak: time (in ms) between consecutive background jobs -MsecDelayNextQueuedJob=0 -BJSoundAllDone= -BJSoundAllDuration=0 -BJSoundJobDone= -BJSoundJobDuration=0 -FileOpProgressModeless=1 -NoDeleteConfirmation=0 -PreservePermissionsOnMove=1 -; Tweak: 0 = ask, 1 = always, 2 = never -AutoRichFileOps=0 -; Tweak: turn off safety check on move up -NoCheckMoveUp=0 -RepOFCur=0 -RepOFDate=0 -RepOFAppend=0 -RepLFOnOversized=0 -BackupOnNameCollision=0 -BackupOnNameCollisionAsk=0 -BackupOnFailure=0 -BackupOnFailureAsk=0 -BackupOnScarceSpace=-1 -BackupRenameFoldersOnCollision=0 -BackupAskBeforeMergingFolders=0 -BackupAskOnReadonly=0 -BackupRemoveReadonly=0 -BackupPreserveItemDates=1 -BackupShowProgress=1 -BackupKeepProgressOpen=1 -BackupLogging=0 -BackupLogToDefaultLocation=1 -BackupLog=\Log\Backup_.txt -BackupPopStats=0 -BackupSkipJunctions=1 -BackupSafeOverwrite=1 -BackupVerify=0 -BackupSkipVerificationOnHDs=1 -PreviewDelayMsecs=0 -ShowImageInfos=1 -ShowTextInfos=1 -ShowRawViewInfos=1 -Tail=0 -Zoom=0 -Bord=3 -HighQualityImageResampling=1 -HighQualityImageResamplingInterpolationMode=0 -; Tweak: e.g. 2 = low quality on >= 2x zoom -LowQualityImageResamplingOnZoom=0 -AutoRotate=1 -Grid=1 -; Tweak: max area of previewed images, 0 = unlimited -PreviewMaxArea=0 -LoopMedia=0 -AutoPlay=0 -PlayFirstSecs=0 -CountFirstSecs=3 -KeepPlayingOnPanelDown=0 -AudioPreviewWithPanelDown=0 -; Tweak: use native audio preview in PP -AudioPreviewPPNative=0 -PreviewStaticFrame=0 -SkipIntroMilliSeconds=0 -ShrinkToFit=0 -ShrinkToFitNoMove=0 -MDBUFullScreen=1 -MDBUBorder=0 -MDBUCentered=0 -MDBUonIcons=0 -MDBUBmovement=0 -FullZoom=0 -FullName=1 -FullTopAlignCropped=0 -FullMDBU=1 -FullBackground=1 -FullLockZoom=0 -FullLockZoomPosition=0 -FPSnap=0 -FPLeft=0 -FPTop=0 -FPWidth=0 -FPHeight=0 -FPWindowState=0 -FPFit=0 -FPColorLightGray=777777,CCCCCC -FPEnableCKS=0 -FPCyclicNavigation=0 -FPNavigateByClick=0 -FPNavigateByGroup=1 -FPWhiteBorder=1 -FPWhiteBorderPixels=0 -FPWhiteBorderPercent=7 -FPWhiteBorderShadow=1 -FPPhotoData=1 -FPHistogram=0 -FPHistogramOriginal=0 -FPHistogramType=0 -FPInvert=0 -FPGrayscale=0 -FPZoomPosX=0 -FPZoomPosY=0 -FPZoom=0 -FPZoomOrig=0 -FPShowTags=0 -FPShowScriptButton=0 -FPScript="" -ShellPreviewMaxWidth=0 -ShellPreviewMaxHeight=0 -ShellPreviewPdfMaxWidth=0 -ShellPreviewPdfMaxHeight=0 -FontSample= -FontSampleSize=0 -EnSrvMap=0 -MapFrom= -MapTo=http://localhost/ -; Tweak: show HTML doc title in preview -ShowWebPreviewInfoBars=0 -HTMLShowTitle=0 -TPWrap=0 -TextPreviewCodePage=0 -; Tweak: e.g.: IBM 437 (DOS-US)=437;IBM 850 (DOS-Latin-1)=850; ... -UserCodePages= -ReplaceTabsBySpaces=0 -CheckForBOMlessUTF8=1 -DisableMediaPreviewShortcuts=0 -PreviewTexts=1 -PreviewOffice=1 -PreviewWeb=1 -PreviewFonts=1 -PreviewImages=1 -PreviewAudio=1 -PreviewVideo=1 -NoPrevImages= -NoPrevAudio= -NoPrevVideo= -NoPrevOffice= -NoPrevWeb= -NoPrevText=.htm.html.mht.mhtm.mhtml.msg. -NoPrevFont= -; Tweak: force file types to be shell previewed, eg: xyz.abc -DoPrevShell= -; Tweak: exclude file types from shell preview, eg: mht.url -NoPrevShell= -; Tweak: exclude file types from Raw View -NoPrevRaw= -; Tweak: add (bim, bum)/remove (bam) extensions to/from factory defaults: bim.-bam.bum -TextPreviewCustomExtensions=. -TextUTF8CheckCustomExtensions= -FontPreviewCustomExtensions=. -ImagePreviewCustomExtensions=. -OfficePreviewCustomExtensions=. -WebPreviewCustomExtensions=. -AudioPreviewCustomExtensions=. -VideoPreviewCustomExtensions=. -VectorPreviewCustomExtensions= -ArchivePreviewCustomExtensions= -ZipFldrCustomExtensions= -ZipViewCustomExtensions= -ExePreviewCustomExtensions= -SpecificIconsCustom= -ThumbFromIconCustom= -IFilterCustom= -ClosePreviewBeforeRename= -DropTargetCustomExtensions= -FullScreenCustomExtensions= -AudioMCICustomExtensions= -InputShowTipsByDefault=0 -; Tweak: default start location for a new tab -StartPathNewTab= -NewTabNextToCurrent=1 -ActivateLeftTabOnClosing=1 -TabCycleMRU=0 -MaxNumTabs=0 -DelaySelectHoveredTab=1000 -TabAutoSelectInactivePane=0 -TabHiliteSelOnInactivePane=0 -TabWidthMax=250 -TabWidthMin=0 -TabFlatBack=1 -TabUseCustomColors=0 -TabUseCustomColorsIncludePlus=0 -TabIPUseCustomColors=0 -TabIcons=1 -TabSelBold=1 -FlexyTabs=1 -TabShowPlusButton=1 -TabShowListButton=1 -; Tweak: 0 = flexible, 1 = left, 2 = right -TabShowListButtonPos=0 -TabPromptOnCloseLocked=0 -TabCapDisplay=0 -TabCapCustom=: -TabXClose=1 -TabOnDblClick=0 -TabOnMiddleClick=4 -TabVisualStyle=0 -; Tweak: IP tabs: 0 = shadow style, 1 = classic style, 2 = flat style -TabIPVisualStyle=2 -TabYellow=0 -; Tweak: -TabsetsNoPaneActivation=1 -AutoSaveTabsets=0 -GoHomeRestoresListLayout=0 -ShellScope=0 -; Tweak: store paths relative to app path: 1 = on removable drives, 2 = on any drive, 4 = relative to app drive -PortableTabs=0 -; Tweak: autoselect first tab with a matching locked homezone when current tab is locked -TabBinding=0 -; Tweak: reuse existing tabs when changing locations; bit field: 1 = via various MRU lists, 2 = via tree -TabReuseTabs=0 -CrumbVisualStyle=1 -CrumbPathStyle=0 -CrumbFontMilliSize=9000 -CrumbBold=1 -CrumbNav=0 -CrumbNavSep=0 -CrumbIcon=1 -CrumbDriveLabels=1 -CrumbDown=1 -CrumbCheckSubs=1 -CrumbDropdownStyle=2 -CrumbShowBorder=0 -CrumbHeightAdd=0 -clrCrumb1ActiveBack=14454094 -clrCrumb1ActiveText=16777215 -clrCrumb1InactiveBack=12367281 -clrCrumb1InactiveText=16777215 -clrCrumb2ActiveBack=4616373 -clrCrumb2ActiveText=16777215 -clrCrumb2InactiveBack=11646136 -clrCrumb2InactiveText=16777215 - -[CustomCopy1] -OnNameCollision=-1 -OnNameCollisionAsk=0 -OnFailure=0 -OnFailureAsk=0 -OnScarceSpace=-1 -RenameFoldersOnCollision=0 -AskBeforeMergingFolders=1 -AskOnReadonly=1 -RemoveReadonly=0 -PreserveItemDates=0 -ShowProgress=1 -KeepProgressOpen=0 -Logging=0 -LogToDefaultLocation=1 -Log=\Log\CustomCopy_.txt -PopStats=0 -SkipJunctions=1 -SafeOverwrite=1 -Verify=0 -SkipVerificationOnHDs=1 - -[FileInfoTips] -ShowInfoTip=1 -ShowInfoTipCustom=0 -FileInfoTipNetwork=0 -FileInfoTipAudio=1 -FileInfoTipHoverIcon=0 -; Tweak: set to 1 to show File Info Tips only if the Shift key is held -FileInfoTipHoldShift=0 -InplaceTips=1 -InfoTipVisList=1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -InfoTipVisListExtra=111111111 -InfoTipDelayInitial=800 -InfoTipVisibleTime=10000 - -[Thumbs] -; Tweak: comma-separated list of values used for width and height in pixels -ThumbSizes=32,64,128,200,300,192,450,512,675 -Width=64 -Height=64 -Width1=192 -Height1=192 -Width2=300 -Height2=200 -ColumnWidthMin=120 -SymbolCaptionLines=2 -Padding=5 -Style=4 -Cache=0 -CacheReadOnly=0 -CacheFind=0 -CacheRemovable=1 -CreateAllAtOnce=0 -; Tweak: max area of thumbed images, 0 = unlimited -MaxArea=0 -; Tweak: max file size of thumbed images in bytes, 0 = unlimited -MaxFileSize=0 -CacheDir=Thumbnails\ -FolderThumbs=0 -FolderThumbsShell=0 -FolderThumbsDesktopIni=1 -ThumbsAutoRotate=1 -ThumbsGrid=0 -ShowFilmStripOverlay=1 -ShowIcon=0 -ShowPicSize=0 -ShowCaptions=1 -clrThumbsBack=14936294 -clrThumbsText=0 -UseClrThumbsBack=1 -ThumbsShell=1 -ThumbsRAWfiles=0 -ThumbsMDBU=1 -ThumbsMDBUr=0 -ThumbsMDBUrStayUp=0 -ThumbsMDBUrFitScreen=0 -ThumbsQuality=0 -ThumbsVAlign=1 -ThumbsZoomToFill=0 -ThumbsOnTiles=1 -TilesSmallSize=64 -TilesLargeSize=192 -TilesLargeExtraPhotoData=0 -; Tweak: make no thumbs: ext.ext -NoThumb= - -[Undo] -Log=1 -Remember=1 -MaxLog=256 -DateFormat=1 -PromptUndo=1 -; Tweak: -PromptUndoAfterMinutes=10 -; Tweak: -PromptNonEmpty=1 -PromptBeforeDelete=1 -DeleteToRecycler=1 -ToolbarPopsActions=1 -ToolbarMenu=0 -OptionsInMenu=1 -ReverseNumbers=0 - -[FileView] -Font=1 -LineNum=0 -Wrap=0 -Hex=0 -Extract=0 -Inter=0 - -[Report] -CopyRecurse=0 -CopyOnlySel=0 -InclDate=0 -IncludeHeaders=0 -InclSpecs=0 -InclVer=0 -optRepFtype=0 -optSep=0 -Sep=", " -Path= -File= -ClassicDumpTableWidth=80 - -[Font] -Name=Segoe UI -MilliSize=9000 -Bold=0 -Italic=0 -DialogFont=Segoe UI -InterfaceFont=Segoe UI -InterfaceFontMilliSize=9000 -MonospaceFont=Courier New -MonospaceFontMilliSize=8250 -EditorFont=Courier New -EditorFontMilliSize=9750 -ApplyFontMain=31 - -[NewTemplates] -; Tweak: 3 templates for New Folder default names -Version=1 -Folder0=\N\e\w \F\o\l\d\e\r -Folder1=yyyymmdd -Folder2=yyyy-mm-dd -; Tweak: 3 templates for New File default names -File0=\N\e\w \T\e\x\t \F\i\l\e -File1=yyyymmdd -File2=yyyy-mm-dd -NewFolderTemplateIndex=0 - -[ListDateFormats] -Version=1 -; Tweak: edit the following as you need -3="dd/mm/yy" -4="dd/mm/yyyy" -5="mm/dd/yy" -6="mm/dd/yyyy" -7="dd-mmm-yy" -8="dd-mmm-yyyy" - -[ListTimeFormats] -Version=1 -; Tweak: edit the following as you need -3="hh:nn am/pm" -4="hh:nn AM/PM" - -[FilenameToID3] -1= -2= -3= -4= - -[ID3toFilename] -1= -2= -3= -4= - -[Styles] -TreeStyle=727 - -[ListBrowse] -ClrBack=16777215 -ClrText=0 -ClrGrid=16710133 -ClrSortCol=16645629 -ClrFocRow=15720447 -ClrSelRow=15395562 - -[ListFind] -ClrBack=16775924 -ClrText=0 -ClrGrid=16639705 -ClrSortCol=16774634 -ClrFocRow=14796031 -ClrSelRow=16767664 - -[ListDrives] -ClrBack=16777215 -ClrText=0 -ClrGrid=16710133 -ClrSortCol=16645629 -ClrFocRow=15720447 -ClrSelRow=15395562 - -[ListNetwork] -ClrBack=16777215 -ClrText=0 -ClrGrid=16710133 -ClrSortCol=16645629 -ClrFocRow=15720447 -ClrSelRow=15395562 - -[ListRecycler] -ClrBack=16777215 -ClrText=0 -ClrGrid=16710133 -ClrSortCol=16645629 -ClrFocRow=15720447 -ClrSelRow=15395562 - -[ListBrowsePD] -ClrBack=16777215 -ClrText=0 -ClrGrid=16710133 -ClrSortCol=16645629 -ClrFocRow=15720447 -ClrSelRow=15395562 - -[ListFindPD] -ClrBack=16775924 -ClrText=0 -ClrGrid=16639705 -ClrSortCol=16774634 -ClrFocRow=14796031 -ClrSelRow=16767664 - -[ListDrivesPD] -ClrBack=16777215 -ClrText=0 -ClrGrid=16710133 -ClrSortCol=16645629 -ClrFocRow=15720447 -ClrSelRow=15395562 - -[Find] -Version=3 -Mode=0 -FullPath=0 -Case=0 -InclSubs=1 -Inverted=0 -FollowFolderLinks=0 -SelectedLocations=0 -WholeWords=0 -AutoSync=1 -IgnoreDiacritics=1 -TypeFilter=0 -RangeNot=0 -StartOfUnit=0 -SizeFolders=0 -Date=1 -DateRange=0 -DateNum="1" -DateUnit=3 -DateFrom="" -DateTo="" -LeaveEmpty=0 -SizeMin="" -SizeMax="" -SizeUnit=1 -AttrFindCheck=0 -AttrFindNotCheck=0 -TagsLabelsText= -TagsTagsText= -TagsCommentText= -TagsLabels=0 -TagsTags=0 -TagsComment=0 -TagsSearchEverywhere=0 -ContText= -CaseSens=0 -Hex=0 -ContTextInvert=0 -ContMode=0 -ContType=0 -DupesName=1 -DupesDate=1 -DupesSize=1 -DupesContent=1 -DupesInvert=0 -DupeComparison=1 -DupeExtension=0 -Mind0=1 -Mind1=0 -Mind2=0 -Mind3=0 -Mind4=0 -Mind5=0 -Mind6=0 -Mind7=0 - -[ExcludeFolders2] -Count=0 - -[Named] -Count=0 -Named0="" - -[LookIn] -Count=0 -LookIn0=This PC - -[FindTemplates] -LastTemplate=0 -LoadResults=0 -RunAtOnce=0 -Location=0 -ExcludedFolders=0 -SaveResults=0 - -[CustomColumns] -Version=2 -Count=64 -Caption1= -Type1=0 -Definition1="" -Format1=0 -Trigger1=0 -ItemType1=0 -ItemFilter1="" -Caption2= -Type2=0 -Definition2="" -Format2=0 -Trigger2=0 -ItemType2=0 -ItemFilter2="" -Caption3= -Type3=0 -Definition3="" -Format3=0 -Trigger3=0 -ItemType3=0 -ItemFilter3="" -Caption4= -Type4=0 -Definition4="" -Format4=0 -Trigger4=0 -ItemType4=0 -ItemFilter4="" -Caption5= -Type5=0 -Definition5="" -Format5=0 -Trigger5=0 -ItemType5=0 -ItemFilter5="" -Caption6= -Type6=0 -Definition6="" -Format6=0 -Trigger6=0 -ItemType6=0 -ItemFilter6="" -Caption7= -Type7=0 -Definition7="" -Format7=0 -Trigger7=0 -ItemType7=0 -ItemFilter7="" -Caption8= -Type8=0 -Definition8="" -Format8=0 -Trigger8=0 -ItemType8=0 -ItemFilter8="" -Caption9= -Type9=0 -Definition9="" -Format9=0 -Trigger9=0 -ItemType9=0 -ItemFilter9="" -Caption10= -Type10=0 -Definition10="" -Format10=0 -Trigger10=0 -ItemType10=0 -ItemFilter10="" -Caption11= -Type11=0 -Definition11="" -Format11=0 -Trigger11=0 -ItemType11=0 -ItemFilter11="" -Caption12= -Type12=0 -Definition12="" -Format12=0 -Trigger12=0 -ItemType12=0 -ItemFilter12="" -Caption13= -Type13=0 -Definition13="" -Format13=0 -Trigger13=0 -ItemType13=0 -ItemFilter13="" -Caption14= -Type14=0 -Definition14="" -Format14=0 -Trigger14=0 -ItemType14=0 -ItemFilter14="" -Caption15= -Type15=0 -Definition15="" -Format15=0 -Trigger15=0 -ItemType15=0 -ItemFilter15="" -Caption16= -Type16=0 -Definition16="" -Format16=0 -Trigger16=0 -ItemType16=0 -ItemFilter16="" -Caption17= -Type17=0 -Definition17="" -Format17=0 -Trigger17=0 -ItemType17=0 -ItemFilter17="" -Caption18= -Type18=0 -Definition18="" -Format18=0 -Trigger18=0 -ItemType18=0 -ItemFilter18="" -Caption19= -Type19=0 -Definition19="" -Format19=0 -Trigger19=0 -ItemType19=0 -ItemFilter19="" -Caption20= -Type20=0 -Definition20="" -Format20=0 -Trigger20=0 -ItemType20=0 -ItemFilter20="" -Caption21= -Type21=0 -Definition21="" -Format21=0 -Trigger21=0 -ItemType21=0 -ItemFilter21="" -Caption22= -Type22=0 -Definition22="" -Format22=0 -Trigger22=0 -ItemType22=0 -ItemFilter22="" -Caption23= -Type23=0 -Definition23="" -Format23=0 -Trigger23=0 -ItemType23=0 -ItemFilter23="" -Caption24= -Type24=0 -Definition24="" -Format24=0 -Trigger24=0 -ItemType24=0 -ItemFilter24="" -Caption25= -Type25=0 -Definition25="" -Format25=0 -Trigger25=0 -ItemType25=0 -ItemFilter25="" -Caption26= -Type26=0 -Definition26="" -Format26=0 -Trigger26=0 -ItemType26=0 -ItemFilter26="" -Caption27= -Type27=0 -Definition27="" -Format27=0 -Trigger27=0 -ItemType27=0 -ItemFilter27="" -Caption28= -Type28=0 -Definition28="" -Format28=0 -Trigger28=0 -ItemType28=0 -ItemFilter28="" -Caption29= -Type29=0 -Definition29="" -Format29=0 -Trigger29=0 -ItemType29=0 -ItemFilter29="" -Caption30= -Type30=0 -Definition30="" -Format30=0 -Trigger30=0 -ItemType30=0 -ItemFilter30="" -Caption31= -Type31=0 -Definition31="" -Format31=0 -Trigger31=0 -ItemType31=0 -ItemFilter31="" -Caption32= -Type32=0 -Definition32="" -Format32=0 -Trigger32=0 -ItemType32=0 -ItemFilter32="" -Caption33= -Type33=0 -Definition33="" -Format33=0 -Trigger33=0 -ItemType33=0 -ItemFilter33="" -Caption34= -Type34=0 -Definition34="" -Format34=0 -Trigger34=0 -ItemType34=0 -ItemFilter34="" -Caption35= -Type35=0 -Definition35="" -Format35=0 -Trigger35=0 -ItemType35=0 -ItemFilter35="" -Caption36= -Type36=0 -Definition36="" -Format36=0 -Trigger36=0 -ItemType36=0 -ItemFilter36="" -Caption37= -Type37=0 -Definition37="" -Format37=0 -Trigger37=0 -ItemType37=0 -ItemFilter37="" -Caption38= -Type38=0 -Definition38="" -Format38=0 -Trigger38=0 -ItemType38=0 -ItemFilter38="" -Caption39= -Type39=0 -Definition39="" -Format39=0 -Trigger39=0 -ItemType39=0 -ItemFilter39="" -Caption40= -Type40=0 -Definition40="" -Format40=0 -Trigger40=0 -ItemType40=0 -ItemFilter40="" -Caption41= -Type41=0 -Definition41="" -Format41=0 -Trigger41=0 -ItemType41=0 -ItemFilter41="" -Caption42= -Type42=0 -Definition42="" -Format42=0 -Trigger42=0 -ItemType42=0 -ItemFilter42="" -Caption43= -Type43=0 -Definition43="" -Format43=0 -Trigger43=0 -ItemType43=0 -ItemFilter43="" -Caption44= -Type44=0 -Definition44="" -Format44=0 -Trigger44=0 -ItemType44=0 -ItemFilter44="" -Caption45= -Type45=0 -Definition45="" -Format45=0 -Trigger45=0 -ItemType45=0 -ItemFilter45="" -Caption46= -Type46=0 -Definition46="" -Format46=0 -Trigger46=0 -ItemType46=0 -ItemFilter46="" -Caption47= -Type47=0 -Definition47="" -Format47=0 -Trigger47=0 -ItemType47=0 -ItemFilter47="" -Caption48= -Type48=0 -Definition48="" -Format48=0 -Trigger48=0 -ItemType48=0 -ItemFilter48="" -Caption49= -Type49=0 -Definition49="" -Format49=0 -Trigger49=0 -ItemType49=0 -ItemFilter49="" -Caption50= -Type50=0 -Definition50="" -Format50=0 -Trigger50=0 -ItemType50=0 -ItemFilter50="" -Caption51= -Type51=0 -Definition51="" -Format51=0 -Trigger51=0 -ItemType51=0 -ItemFilter51="" -Caption52= -Type52=0 -Definition52="" -Format52=0 -Trigger52=0 -ItemType52=0 -ItemFilter52="" -Caption53= -Type53=0 -Definition53="" -Format53=0 -Trigger53=0 -ItemType53=0 -ItemFilter53="" -Caption54= -Type54=0 -Definition54="" -Format54=0 -Trigger54=0 -ItemType54=0 -ItemFilter54="" -Caption55= -Type55=0 -Definition55="" -Format55=0 -Trigger55=0 -ItemType55=0 -ItemFilter55="" -Caption56= -Type56=0 -Definition56="" -Format56=0 -Trigger56=0 -ItemType56=0 -ItemFilter56="" -Caption57= -Type57=0 -Definition57="" -Format57=0 -Trigger57=0 -ItemType57=0 -ItemFilter57="" -Caption58= -Type58=0 -Definition58="" -Format58=0 -Trigger58=0 -ItemType58=0 -ItemFilter58="" -Caption59= -Type59=0 -Definition59="" -Format59=0 -Trigger59=0 -ItemType59=0 -ItemFilter59="" -Caption60= -Type60=0 -Definition60="" -Format60=0 -Trigger60=0 -ItemType60=0 -ItemFilter60="" -Caption61= -Type61=0 -Definition61="" -Format61=0 -Trigger61=0 -ItemType61=0 -ItemFilter61="" -Caption62= -Type62=0 -Definition62="" -Format62=0 -Trigger62=0 -ItemType62=0 -ItemFilter62="" -Caption63= -Type63=0 -Definition63="" -Format63=0 -Trigger63=0 -ItemType63=0 -ItemFilter63="" -Caption64= -Type64=0 -Definition64="" -Format64=0 -Trigger64=0 -ItemType64=0 -ItemFilter64="" - -[CustomButtons] -Version=1 -Count=0 - -[mruBrowse] -Latest=0 -Count=0 - -[mruGoto] -Count=3 -1="This PC" -2="Desktop" -3="C:\Program Files (x86)" - -[mruQNS] -Count=0 - -[mruSelectionFilter] -Count=0 - -[mruVisualFilter] -Count=4 -1=""Today|Modified Today" ageM: d" -2="*.png;*.gif;*.jpg" -3="*.mp3;*.wav" -4="*.txt" - -[mruVisualFilterPower] -Count=21 -1=""Text|Text Files" {:Text}" -2=""Image|Image Files" {:Image}" -3=""Audio|Audio Files" {:Audio}" -4=""Video|Video Files" {:Video}" -5=""Office|Office Files" {:Office}" -6="-" -7=""30 Mins|Modified In The Last 30 Mins" ageM: <= 30 n" -8=""3 Hours|Modified In The Last 3 Hours" ageM: <= 3 h" -9=""7 Days|Modified In The Last 7 Days" ageM: <= 7 d" -10=""Today|Modified Today" ageM: d" -11=""Week|Modified This Week" ageM: w" -12=""Year|Modified This Year" ageM: y" -13="-" -14=""Empty|Empty Files" size: 0" -15=""> 1 MB|Files Larger 1 MB" size: >= 1 MB" -16=""> 10 MB|Files Larger 10 MB" size: >= 10 MB" -17=""> 100 MB|Files Larger 100 MB" size: >= 100 MB" -18=""> 1,000 MB|Files Larger 1,000 MB" size: >= 1000 MB" -19="-" -20=""Files|Files Only" !attr: d" -21=""Folders|Folders Only" attr: d" - -[mruGlobalVisualFilter] -Count=1 -1=""Year|Modified This Year" ageM: y" - -[mruGlobalVisualFilterPower] -Count=21 -1=""Text|Text Files" {:Text}" -2=""Image|Image Files" {:Image}" -3=""Audio|Audio Files" {:Audio}" -4=""Video|Video Files" {:Video}" -5=""Office|Office Files" {:Office}" -6="-" -7=""30 Mins|Modified In The Last 30 Mins" ageM: <= 30 n" -8=""3 Hours|Modified In The Last 3 Hours" ageM: <= 3 h" -9=""7 Days|Modified In The Last 7 Days" ageM: <= 7 d" -10=""Today|Modified Today" ageM: d" -11=""Week|Modified This Week" ageM: w" -12=""Year|Modified This Year" ageM: y" -13="-" -14=""Empty|Empty Files" size: 0" -15=""> 1 MB|Files Larger 1 MB" size: >= 1 MB" -16=""> 10 MB|Files Larger 10 MB" size: >= 10 MB" -17=""> 100 MB|Files Larger 100 MB" size: >= 100 MB" -18=""> 1,000 MB|Files Larger 1,000 MB" size: >= 1000 MB" -19="-" -20=""Files|Files Only" !attr: d" -21=""Folders|Folders Only" attr: d" - -[mruKeepParticularChars] -Count=0 - -[mruSearchReplace] -Count=0 - -[mruRegExpRename] -Count=0 - -[mruBatchRename] -Count=0 - -[RenameSpecial] -KeepParticularChars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 _-.()" -RemoveParticularChars="" -RegExpRename="" -SetExtension="" -BatchRename="" - -[mruOpenedItems] -Count=0 - -[mruCatalogs] -Count=0 - -[mruCatalogsIncluded] -Count=0 - -[mruCatalogsIncludedNow] -Count=0 - -[mruTabset1] -Count=1 -1=1 - -[mruTabset2] -Count=1 -1=2 - -[Favorites] -Count=0 - -[FavFiles] -Count=0 - -[FileAssoc] -Count=0 - -[FileIcons] -Count=0 - -[FileOpTo] -Count=0 - -[ColorFilter] -Count=16 -1=+len:>=260 //overlong filenames>FFFFFF,FB4F04 -2=+attr:junction>D500D5, -3=+attr:system>FF0000,FFFF80 -4=+attr:encrypted>008000, -5=+attr:compressed>0000FF, -6=+ageM: <= 30 n //modified in the last 30 mins>FFFF80,5C9E1B -7=+ageM: d //modified today>FFFFFF,74C622 -8=attr:d>5E738C, -9=+size:0>4199E0,E0E2ED -10=+*.exe;*.bat>D24257, -11=+*.htm;*.html;*.php>4287D2, -12=+*.txt;*.ini>38A050, -13=+*.png;*.jpg;*.gif;*.bmp>933968, -14=+*.zip;*.rar>CC6600, -15=+*.dll;*.ocx>7800F0, -16=+*.mp3;*.wav>FF8000, - -[ColorFilterInstant] -Count=19 -1="Created or Modified Today" ageC: d;ageM: d>FFFFFF,70B926 -2="Created or Modified This Week" ageC: w;ageM: w>FFFFFF,B97026 -3="Folders Created Recently" ageC d: <= 3 h //folders created last 3 hours>FFFF00,0073E6||ageC d: d //folders created today>FFFF80,379BFF||ageC d: w //folders created this week>FFFFFF,71B8FF -4="Files Modified Recently" ageM f: <= 5 n //files modified last 5 min>FFFF00,4F831B||ageM f: <= 1 h //files modified last hour>FFFF00,63A521||ageM f: <= 24 h //files modified last 24 hours>FFFFFF,70B926 -5=- -6="Empty Files" size: 0>96ABB8,ECEDF2 -7="Files Shaded By Size" size: >= 1 GB>000000,8A939F||size: >= 100 MB>003080,8EA4C4||size: >= 10 MB>004080,A9BAD3||size: >= 1 MB>0053A6,BCCCDE||size: >= 1 KB>0E80DC,D1DAE9||size: > 0>4F91D2,E2E3EB||size: 0>96ABB8,ECEDF2 -8=- -9="Overlong Filenames" len: >= 260>FFFF80,FB4F04 -10=- -11="Read Only Files" attr f:readonly>47A905,FFFF80 -12="System Files" attr f:system>FF0080,FFFF00 -13=- -14="Common Executables" name f:*.exe;*.bat;*.cmd;*.com;*.scr;*.msi>804000,FFFFAA -15="Common Image Files" name f:*.gif;*.jpg;*.png;*.tif>36530F,E6F786 -16=- -17="Image Aspect Ratio 16:9" prop:#AspectRatio: 16:9>5A4F36,F7E686 -18=- -19="Black Out" name: *>222222,222222 - -[HiliteFolder] -Count=0 - -[HiliteBranch] -Count=0 - -[Aliases] -Count=0 diff --git a/setup/windows/docopt/LICENSE-MIT b/setup/windows/docopt/LICENSE-MIT new file mode 100644 index 00000000..3b2eb5ce --- /dev/null +++ b/setup/windows/docopt/LICENSE-MIT @@ -0,0 +1,19 @@ +Copyright (c) 2012 Vladimir Keleshev, + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/setup/windows/docopt/docopt-0.6.2-py2.py3-none-any.whl b/setup/windows/docopt/docopt-0.6.2-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..f8911324032df55c7d7cad62dc49ee27190bd90e GIT binary patch literal 13724 zcmaKz1#IQqmZfi)nVFff!kko?vBJ#EH_V(=D$Gz}t}rt*Gjnd3xiWuGYr3bO=8df_ z%a-@&BWrE>_$+N@IS5Eh0000B=+~K*Fz-+4k--80Knef=+&@>%98Dda+?bubr}WNU zH>7@j)%2KKNfldE^~WJ-?td=Y0+{nM374{{sz%i=wkh`}O{0nhTIt z8QVTikCsHXX!mLN@m~-`AtWaL+i0yRnM+Mhw|vfHm}_RuESdSOzC8+qZoIX^oGMde zGm^zRHOl=%CR$-G8kl3@;_E~jKU85oKDJ`W5>rH*<*c%0vgf0N?Y@q=Bn8kltMChQJbZGmk5zY}eqUQ73vi1E1nvb{Gvx&KuFcC^&R#54WT@%L{w_R3&ML z`ug_v_C(v6V=B-dOO_28yq%otvZp%^V#Bl`JumaG#OLU!FgN^fHT^fWqp zEBpKvPu$av8!ws$>KZCxIL}dx1XgGYB7QeusSl73$R4BTB{mqo@j3RkR-W~#Tz|1v z2>v8{vNOo)#Hpy}%?$aiho)tjO4$S^?#@{Y_-r`=wpfxO#Q#M^Msz?6)SB;eBfO^UiN9sV4 zYY5lYXHu_l^Nd?bSSf(kJu^0WY*Pp8qzmkWX?1W9^PsNuQFmwr=3UM739op z+^VTMI%A)mc*e!%m5GA{0+eY)+y1PYx6>KhZ1U7{(hnyOemAq;61k@~BQkS_;Ew+( zq#ay6j}p&*SLh+sy`qJ^1x7`d6ailLx0% z?O&U_;eWwzn!Q7`{g|hZ{p<@&9c1ywVY?1e=EDK1inj@n<(w;{Y*w*WPu6rm7x{|W zZEn4U#ozS7{>LFHW)_176_iNrL?Bm^e$YlMGe_X{Y2sDSaTG9bn_@Z#S)YP+P65ph-TKFmakBUhZ4ClrFkH zyUjjg_uoJ@#lFk|`o&g9EB?kLA>IQ`I9^nYtQp03gBsnRtH&?{L=BN|incHAMy9Jo zDF*xX$*=6$RIad4h{*0Yn1}ue%eAClYunGVT5FZhnY&5vwQGo0z1J8)l{J?}7t{WC zW$_I}pNwuPU2o-ZLT!1OQ~sZeP0yDnmA(VNmcE*EfBgEId3!Tu4yf8D`*C?{!we?- zXWCzLi860nW6El#8w66cOc;tGA|i(O2dHx``Ezi=u@Q!ia0s#wnBuKTgWF8m8{FWR zpB{>QJ~lwGoR5+n6FJi^#--EE_MPN=eH;kSs!@NskC`ggaoNJ=F6}kgQ08i=kmkZ6 zYvUlG`~3-Y9JTs`t8+{dkwbuKQZ}j2Lp^eKzb_**(j`!ODiWkda_L5BI5253T6;jP zL-&@^8RX4HSC5De(RNWWCXhdt*w3T3KXhHP%E=T19IVP`a&HJn{g#Aakq}$WQ6yWj z$Exu7`i{%@BVDODzl`h>(v(CeSc=(Zk_ycXkG)mws^P8MzUewBOm)Uw$Adpf{+{ZB^kMq> zy=CqJlzhaax?O~7r4!gRd7*rd4ufmvAb`u!t#CBw2~+}4{qMe+)@MlCmAT(cYI!gw zU5!Qh;zpzAP|-jdQLdmnSdp=5WIjX0E$e=+Xc!UfFT%Y9TO_N6{L z)OSeEI5*_Cw5>nI6%>&1r-mtcDljYP=-I_*NY$(1cDCu#(ao}Yr<$kGYA;Bk0O!;& z(U&{W-OI*3E$h-2t5||Y%g_=c&yfAHyabO>e9dvm8EnpObFSFsH^En(ve}G)AT&^{ zH)`{&ys4#!qK9~Ov7n`UCc6K1<6oFos6~b*p6LhnYz`fg`5!KNuw<1a^GGuoFKyv& zFAK~8YS4S>z;k8LYLNk!28TJjPU22QEzr*d*gj=sLp9B4wu=d$GQ)>ZCSfQkCru&_ z&)je5udiTxNU(+7@CqXs0*-%BY9#h6O;a~E@~|r&;gXGq*Ik>@JV(8J8;uowH9odo zl|E4lWH^fmXSU964BHqOB~Fz2r~@*8VjB&QNi^C5>IpWUQCSi55M_FBJIh?YxWtBc1V?FXMxZ1sT{QCLsKw!hjayV$&1$WfQPptx%U;WqXfkN_k?c~Hm zgmXWaNahb@aSYh@Q0vgS<__!+6Ep zWp(ixUx<{BcttHk>>y2BhQ;k05bsaa$!gO2slMM@S_zP`=|$d)`_s8va{XJ zcae!IHR1Cnd}9$_DWLS2B9v2Rf&gMm*oiYgn)(#Rb=1DBI2Y_YSZ4R>dUA?kDoZL# zTZ~e62DOF!fwsM>-Hp` z@9{kp6xbPwXLEGWCS4^QR)J49MU&ix%;vwgivn3$>*qI`t!!!iZnJOagMG0|^BG!7 zjc=-!N8nBPT)}}%4BkoGN`nn=x{(^5Lq%j+n>AZnqaya8#7o+$D zUDX_En9AZ%D;{XQ7F1n?3xR1cx*G~t5Ni~hjUD{fgcG(avL9x%1*H#xNtKGwc4N!Q zz2yg#fabb}@$bYf2N&TTfS`C*UnldJ`>Kt0m572Xr=$LCk6zA*tv=a#rD*-_0pIEZ z&L_zZr4>6g^~=N+eyGJfQNX)G_dzW=mTg&3z`zDnoiwBjXS}tqDSPnUga5Du;H+uIAcv9<~(?@|PC;vCb1Qplfr76$}h$ ziY_-ES)|@L%a*g;7TP!%t<%=wun=md;>jwVH1f5;X2?x-hxw`espR+pSuIwz_!l^m*MEmlGHE97vGEZ>opDgzES;M{-U z`LiSLeo&nCCz#)p28i$>$TBgBz>oT;R#djlFosIPTH}D77whE`&iB?6r4+^Q&~KVPDP# zUe--Lf+#18`^W-G1h1KRr?lJKrhcS2lrHNf(8(vcXpa77?lZWMFW|a=i`Fs(qPCcR zTF|&BwBqMz3!vxdt0c^%Hk#s;rZJbYO>$Ly5RTu@l46y*BQ$tmJ-tp(&S5FlN_jdI z6=t0#!Ea%28&x}8w|}x4Vt=#N__pm0hN~fLEdB-m8!yz8H3fSqJ?(gV^Ch&CD~=yL zNXJrOhK-G5@f3%t`8CXyYw**-k?O6EL=uH7Jn7Hpeyn}^#jE{F>1k*d8~Y53r|&5! zUeO6nG6r*bijX_u0%R+-@I7K8mryV7YM5+m+9Tr{Up)L1`|I^{{9NkEe|D4X2qk|6 z+{PWX069&v5YZ`AEZOZHXMPdqKzN~en{wE`3_b09>MYb#xaafc_%e%xnFn>y-CgLc zcjCHFgE{^dcJ1DAhD7lOWtx3-wCJOKs!C{pA(!Pvd2|i7Cm8cfe&T1vBy|!FE7R>W z$45c$AhBo$n?%AZX&fK8^od;h*sKa_iL+VFGbvv6^e0>wXJ~RR5+`1N4c4NXeK`G8 z)(c+}Li@&B*2T^7weZKw-~Go*Ic`X_9}km3c(XH?z8*R=mbLq@7uPNKYhl?+jVf;P zLC$63;4AdqXUA0HX=x$iHe9@zWCmOOGWYm|Z1(f~V}A~j4tFP<>vHB^b7N2AB^sh# zJCVse>Xs(uKP=UqQw*0zw0ISB=-pi?MW18If6O0YD35D;#V}1L7x0CvNipcgMtpn+ zeuEz?)LCPXl$@xbjr*u60&`dtXz?a8T7i&%JoItWOsClOF4>U^!=d+(Y>8~LG4VVzFk@=K5kUkCO>eV2r#kd zVNQbd$?w*9=Nh^@dlsi%49gW?tt$%H8nUk2EsbfZzj3-^iGF!Umg5Q{IcLtM3t zQx8iF=^Pi50=|_Z8;#DX_C}mz@07N-;52m@hUMWh?p4Wv3doTVgJoIL&pk!#sB|w+ z@@`k4+UA8S-VWIj;Ad@`m>+4eJ;4S9M(u|(7E7stoZx2?2?bt17VOn}W^DmrnNK{w zRW40AOV-L)Y0zE8jGWUF^|NVPPG;rnm5{+#r-Vx^BT`p7{D4{^9p3HUEG*Mho^|RG zoD1u8PN45kl>xPpO?MkvORqSJSBh4bO`yY_361lGOTc9B$vaCp;Qe(q4#G?Op=0!* zXyf|@kKqdy3R|Cq&X~kL0&DEaTE=D#a)~ML@G|RU?Lx72>?-HtPa>n7Z3Y-0CDwiK zG>=$(zCa_h&p?0jKAR9^7SUBD7qtZhJXF%NOPbt{v#c-dN2kd?)Z~MWKRlE<1~^Ru zltCzlV#qyw!h~}y{x|?MmNpaG&HTcYK>D5=1gGnsgJL| zW!6lUn24rX`XiSvZ|uT(*Gd$SI|0fyN`{k^;!R67K`9?*T=PvsM-?yN6$AD(0PXUc z;{$$WJ9mmC)Gwr+8{g`>i14p-rBV=nxF%*rJSvo-2t<3|*xSWW-bm@q4&L9F3A&k` z3ZIvQtOcVh&{kHsSJel49c7;c|Wal`jKg8k9nX!9B0D%JCaDsOBZt8ZBJ1UG@%UHR6Ow`aE$9ic!Be@K zU*LN|reK!t<6GYS!HK4Ek=NegKR7nHGdtTRIr{rE5e$vw7JGNFoKQD+yCR;bGeE+_uvEK3hZ8e3TUa zhNS}(Ugv!r!h@lrGp@RF9(r@B!K3dMo}GZ6v{p%h;pcsXvK09OSN^Z{RwOVPHTI;p zrC@LXKn4;3ApfuRRwhC=#r?QC72GuNlB^kx4*@q82% z@cnxSn9*NLZ@}A?@mz0uqY8CoalIV5ZfmZ(eDy&+1o9A^#9sFCSUu)fYVjbMU%O-U zJI~@@pn;kR75N|?3oZ=z3SlAuy07yOCBmX`TjH4K?ZHTQ4aX8YA! z#?v~%y9+Laf1rO4ARcmtHrP)l{sqE&;8jkya)%D1dU637`RJG1X)vi@&0w6`&m;Tt z?*TaXwLR96Zp@8p!j9Ie-OW!Q#;K`(gb~DCkD=DHxeZCjEc!n5b02daIbEvl>rZh7 z%2&3iw00>eesgM>8?Qd+a~D$(M0i`tgk?nc0NY$ByDC&n}g1?qe3r0CWEvs zP&Lt~U<%2Wp(@nxr#$4(u!Q;!!FE?dt}mCor<+?rHEx3R!XcEuT1T1D2;MvZaH+>N ze-(`$i3?Up9VColh~HkN-}}ZiiA5!ECmy+$DtHH%LWVT_yKQaPf1nhfp8bQIsy_Lb zgiZyekT@d!lHr8`rT`?hq$t161mY{iI-OX36jTsh&)jVH-hhr%=ypeNPe&B5+|Me~ zo8&utAl?Vq|5UI%ZWbas9soco1ptuzdj%^3aU-BlwThS}~wtdc%T# zd9hbY=epbRF7u@}C1y_&k`Voo;gpFL2^57$PM`Yw{8>>!fMalROW0LKOo=YyskQQ0 z2@2lM68qjhyH`uy;+&dWcF?EdRDN;_BzPNY9XxGZF>2ZQ+W+{D7G>6K&$`;zVkTSnrG9 z$;f8tU+AykhBTkey$9sq~H;RA!2z68X%jb~7&2$xU zy+Az;d{W3$w8RAG@L940Ynz*#ki3HEMwhG`+t}S})SK7q)!l$&T3@AvE`gE>#J)jR zu}nRb<8%A0r1jER)SG4)$h0(42a!D5r{_+c{H_*kW3V>Cd-r#!(i zCDaf6@6^Ae?iuMvs*EK|fP!QdEBq=0l}ikIpD&6;B*a8{Wm@v)Nux$EiLBWs#~GfW zNl0q-U|+|3(tNFGbA@U5JD{tP%+ zs;d+;ehp76=(6B0Idj|Bs=ZcZmA$2p8>xVS_Fu`Ld1YCSiUvEVk|*b4r~ihaS{Vsj zPtT5_PaXCHRK#iECUG>n7%CP_I?bGKQ^0lO%V|LMhY1?w%Sv>kx)d+m#;dfrYh>XP zA`JCOMdz5;PQ0E-meUPtRUtxj&3Z?Ba#BLa7mq6$*8Jt~==P>ltjZl#+5iroR4@l1 z9%VeJY8)H4)hkF>=@QJTS@g>kEQ(L^=?ZF}BtC@8`SBcS>Y9nQ8lP3v=wueD3DrDu zusFpSev_(0s58j(o3u?e#@7N`beIJ^a&UV7ls86O1c-;9e&RSJL6= zFD7SuYB ztUmiS8WajbP>dmD$I2I@AD23)58L>snwf&#3$) zMyN|M_AEEHQjhEpW=A0z*hf}qi(-Fw$r2Exn9}Jo1Q602jL3Fk+1G(K5@mN*qA06{ zdV`5ce~77u6Vc~O-oV%>7441PAeA!P6LsJPsWUT^LyZ%dU$IEsWIL~duH8fTz*4W} z0P6RM+eO>!HK?l`>%(IeFd+np>3fmw2=Uy7;XXb-Y52?%U42!GT*Bx&GzOBVS6iW1 z%$lqdUSJ*qWeb@3w?js(tDort;Ie5_IYQmarIk1!HQavPtka7JAwTC1AI3?NiZdyD zKRZSKt(KA(j&F?;Ep5XB6E2Y#N?744#7gj|4^Kl+19-xcAD0e(a8PFaKCW+XQ4MhLd-YK*X-U=XaN`4mC^53Rh2<ni#okyM0WnPi_0mT;luD~z4r%K*-(Hn|~oa#rs?CtiwkR|>}VutnL zoD5=7LGb41barstp-ch?SJjf(bLgp77Td_{lT*~z)BLB10YNr&D1=o4CM9f{E3uQo`#^D@qDy&W?MQDk+MkXY_dhyyyfA{+l!MK=Q_DD3hP48Izrs0WcUMY<_mxm5VjgX4)8BQ)osgw2 zjYD11soC|^^1K?33gPFR)^|yD_Mq0`_L2yOtRDTQ<>&kWOYp_GcSHfWk!9**pVvB+ zK0M}#*9A*H%Cpc5HJ+qbbVhWhWirYH$XAPqp+ge}B6DJ(6y^GjQ=hFo`;EVzuC!F~ zX;m`xGqTh&=f=ith|gL2&OCulckH56zTd^Ns^?*a?)hFi9!e41^vp$ZZE3pbh`3kt z1uuUZ3?C|4f9+{4TdounwEq9Gs%0wd=b$d+Hh4-fOl&qSeC z6YIZu#3hS%6=w%Jm4XKhKaUI87?5VoT6hVyl+NrSo$#Ji@}C^iPWr=Ja;rHq`wR6H z1L9v3%|Gc9U6XY}Dsj@ZNE}D^w)r5pV!M_j4BE`;3dKTbh1z>Y%W;@xkj$x~cwjpZ zyy{(^hZ-}ZP%|d-y%-@yyyihh#l3p$72m(Ll(zaC#YZxtsQ=-%8u+45v!caI_S7?b zMTtw!$IA}9wyvdoYeI`d9bw&w`1SdyS19+Af8d`h``g{&c^IfPzR{!*Tg5=}dbIX|3<)8c4Tf2k&n zi`_A*0-K@#1b4Hm^MQHs6B8mK-`~y|Xq>f9N>6$5BbgrMPtH3sxXR&B(m7g%m@Q@b zw1A`9p>g12sCjN4@%F~PLMLI>Wm3{$g4cie=R;=9xnr~H!8_~G8)b(=@TE;|w5ip_ zsp`p1b+WruPuZ{P@*^N{yss10CyYo<#eeIl<_m9w{;BsnGF+xvVAZg4?2{Ggj|&>kv7O`WoK=z>WF#^!3K>CUr&wK zk3cC?;gpQ1s~;eZ)DSPYm92ix;7zWb5f4Pjs$)q7E|~!^DuaOH=~}xYJC3<7X+Bak zqF}J+bHUBTsE#rp0rc*~Lq@!5Nb$%hOLO-F^nyY_Vn|9xV}&dv#;csxg8)8v^i5us zs&c>fxdO)4c5-j4@A7qz*#ZcKPAPrnk7b8@wkV#e_jSAs*WhXV-)HzAt5kbeeb;Zh z1zll0n*Nrl|8RO#8@aD_jd7AE)TelUxP__>@Y2TUZBXqqH{DJV`1q*1?-9Le#&e{) z^{J1|=lYgkCmCvvNxX_m%)|sX(oOm2M2iFTrQeUh+j5v!V_bI|Bl#->lKJknh!?F zZF;J7Wm8?OAf*w$gfZ}Y@$#lfSd!;ifps*{wIY~~mHBnpK!X?Nhh8lspCkDUEY+9= z&YeFx?;WuS`}qd=d%JF(gZ*A~XDn;{UN$N5k9Cf?`8~yR9?}7_46x3(mi8^3yA$Yr zubKZ%c&g1d7s6S}471n!tWn;rMyic?hhVmiZGq1GoHTkm#)1X*V@|4nR#LifLn}JN z&fvTHs+K`3bn6UPZ_Vs^egh9wzvfFSTjpK#p9s9+XP*>wWqCz~bX*f)4w?D}N<%uj zJn!sdU}PeDIXaE(jht~+KUFmZR}IY`lqFE7G|k_jgk4ee5U*S$WpJ?K4fF>~KP3j@ zk=uu~K4r12sQ0)26`9wv&rlddeYKbkhB6wWt2Y#lx`f%fL@;rZDz(UN6j?^zPR%@{ z{#3*KINgCLc>ZthAmkio+?t@D;nG;4^Bqj)+cmU-Bf2*hO^e9BT} zLDd3ki410_Vcpw+6e(}&Z+1h56;+b#kx*5JSST5GT3X-5XZJ1EGW^VvQ<87hSI(f1 zIvO3*dSu5M?0d{sB@N;coJHcRkvzpaUy2<1!u=e@_4V$&X=;3M0QUPY?GDEI;B!8& z9SA!EWHW8G?VL2IVA+0YWc8S!b&l@P!uQ&K|6kDedARB>S66gJy1fEA8V~2!MYLwF z!u;mHwMsFY&miRqeK)F>Bd)G-H_YF+)2f_nEBN`!ugPRGr^`}BXqwdF6YB+5KpWOs z3%$Y_!nggXp2y}YHh~}Xl#Qzo7y{d3szbjzXnGA9MG52AYQ0977C2AJ+hXE;3YAs^ znm#F;1r_UWKgAKL$PbV1-rj7qw)8qJzj_}aD-;q(VIPWgVc}a)A)QU)qf3yY10gUt z&~Vc+Tphcf!#N|pM-%p;_OTflt1~##ZT?)9ECaQ8=U!=FJvew6=J>3wQOVh0Oob@-E*!<-1pIT_KZh)fT)uxA z-%Va8p0Q3ZseJ{0+a{te5b`#Oi~?<52HEKA_|NE+YEqS2E{YYEbDt@mOj2;c=$!QN zeub+`plT4nMumg`!!Fz14PnazwkC|vX=S_srnHldo|~9Deq~zX*faz#Xx`1S6eQ&Y zmCAYr99XyUe;;HV!lwdJX-|yWhWgcv@(Jg$`($g{ip#dVgZ)Br5gic~pmd+1L66uh z3gIJIaJ?yfHaE=rX){msQTGuwC2TMP3(wT{km{^=;AG4Rv{a+G_)JAOp|)g?s(jJ- z>g^`3S;ft5cxw|}lLc*QGmb-|x|XH`1x$rJSe^`1)-?m*!zH{i=nHnLdWqf)f9zp$ zG}H-k3Y+PQ`895e4kQer+(G+5$CutDc>df0vJ(qp(ZDJRr4B4U%hkVOMeZ`w)@S}K zj&1vi+#j;s#A&dBro0Q**`HpaG>X{VN+}J2Gk6!Jimex%@2%kjru&CQe8lnz8B>9JE2q+_6(nkvKt#HPD4R@zY6mbP13P+q{X)^ojg1prE8t9L0J4@}4BvaOC*jk}Is&1>aT9%Htcu0Z zn4R7TZtvYpP(3gQo-|Xiq8hL4+}^NVu*&=To17k~tZdAX zhJkZ+4QWD#n<+O_;E?^miMLQ=S?$Te1uwHxmM7%vb?L}ip%q6!BHg9PY6nRZOCa3s zyOp*jfyXVce#ecEcWp2lk!K5QgHwrDWm{g+>NZA_4&z>$$k57)vnYgB7yu*Gc(^z- zTCPTT=0b82`$Jr3pv*+Ug>-Vj9MT;$|9AFxF3#X>f|k}vPiU=yLEg6zH3|a{{7_D1 zSW{Gwp9HLfP^T8X?l5iLV$+yUOSBLxMFEj+F!)#ytkZhL3a;}<6_Vj7-Bv-t)5mL% zI&dw`+GO0ClJYe2hBiEv2uVN5qN0)g(x1Ae9j@imX$MSC=-$Uuz&cMJ2G0L91eg5U zn^mvb!%xd`d49+CAH{^yV$u&$nP1$sAxNq3ejb_*s%WgM@K}5T@V=m>v`gB$*DTL` zQ_xrUX`D1LB-5Z=BYtP%K_%z>yc+rIiO0cvPOYXpAJP88ZzYHZevG=2u65_VdvdCE zj?Tfd%vGuFDS}Mh^4oqPt=lk(KJ zJi~mJ*F|JUIW~HB$(;!>U$>h$9V^Lq1IzfYz%T)^=I>o7l?^L6J+$r$`rJ!Rn)aW| zY&AhyCe9k}EVUwto)_W0SQ#F!0yF}Bzz)A9`xz*^vDRK~kb=V$kye+$MSGGLQYGyb z>xc&S15U4r_KdI85LrLVd76VK126R~9SOiLzT%%5Ai##e|cj#l;vtq@1xU?ef2S`ydvKzB$??T zCPGL2AnpC`T*N8u*r;Z2?hZmYmJff6Ulfnf$_Tg7Dtbqt$1!)w7dalmy@M>L;Dlk! z!+6E-21PmuIg|-NT*%eMnCwFIYdfTk`TINs_)lS&a}!E6xdZ%XxY9?9qs52h5+Rhc z=p*C}AHD?UcBSEI_a0g9^}r$_Eu7!(V={)fa{{Go1dZ28f-@lH?>ORTXqG7Urx$~% z6lp5%??Hwgpd*}}sp{{LL4&+nOXfhiAkHQW!IVyj+0CHixN)8+NFEtc-OC_DpLwY} zWzWQ$t%xb^guu~U0&tyo_a*#bA8&URjp4S)ts_KV8$HP#A}^;Fqk4E^`6#^(k1zK(muK+1<j$e4tHy8tdo#VD-L2V7n7NoE&O{Dv)grc6hCo z!#;K}50=NI>%<5irTZyE%|O4WYz*LX=z97otn=BubB}6>@su@)n9FaWZ<4t9Kcplv z>A9cK(-D)nIQUMqa#tOsRj%~!HN+E7FW`i%Xs_*{A1vILBL0Tq26&0t7Rn2@hexff$D&R6nX8d9g|K^D1w8)kXbTOzDHVKB5p6{+4hyOHeL86SG(LzN9mw$f5B2tvxr)p3S@8ch?5l>*= zUS{xLmL4X~&_?<&w-|zW$S_H__Ii?kW9@tv#zMbF9)_^h){hOQ+df@>?XR+-I3ENs zKlbo2(lrsdK0bjA2^-Rxv=jUpV=7cuyX;T#=e9sgbBhuz91h&iE`HQ->^bvJNtW@p zo86~|T5c?q>YrKas$)}wPJIm?N$XwJ_v|;<`4PZOi{v*K2Y^C}IoYX-3{z^i!%2zb z42G}u$*Q}!V~$MgBv?<5C_Vcq%d`doWr^?5btCoK!`Nb1!BNd@Q8@NC3)M7F%{;Y0 zMr%uzfnMSYG`O|-m~r!_O5dm?(3Ec5r`4B}hmf$sFYBKl?(VlpEc6v5d88RLG<&r7 z-~?~V2W*@xeQ6e(oiJQ5g;KQenqcyYUroqWGo9iX<2_Z%13MPby_G=m2+6-9D~vHA zCTaW>xUHh!K_f1FQ6!%wpN|6yj79W}5^E~8Eq`q|KKTQ+baLh3+CNqA^|n1y6;Zy1 ztIgmvf#$_3x~T#2M*+9js2w`Upw#J3`UkZf*@O`)qtY5z8OHu=?|Z$SAeN2h7oz1= zO>ANnl`)!8KucT*Df<-&H(D%In7=#$!s^(O?cUvVRH)9NrO<#CCP>J}pK=CG^26ai z?41R{VJ{KTI>Y!;S9)v+bcU!~v{m$SKJ^F=$T;knX2!t(DI%jxjPvvA~q8%(BjMaIbL89>R~$u*^L&E+f%0$xe;Q*Q?Uf(JLIm z%gDE=(w1?~Pfg6oEh$V^hDPC1NVNXTz+AV|bpE3w1m>Th{PzQMb96GaGxspJV|Md$ zlN(c-W})2!{}5Ydzgzh(ih(ml5ksaWBM>R*gNQ}a~IiDN~P`%m6ZzElgZL@+%BmSz$JF@%nY z`L<}s>8-SaFvkKD{sSd965<;R*g;ZU{!&!?s52Pv(y(Z4LQM;5PaxO=AEgWY@ zOZ}@$jSunfdhwEo(Nf=@Ep_jqp&foUu4i8$4(KeJO(zF8H_f{;@$wmD8SFW921#_- z><#sR1u7M?=&-)3k+oR-GM;<~sXQ`z{~GeIK#9ns6-rjrp?iorC=V78t7a@NX2Prq zH46eJVG?C5Ar%x5iRBm@`2S5f93tFL-^l3cHDo<`#*l+zry~tKK>gP#P)At|GQfLmGrNI{%;aK t`@bdq4|)G9@n3cQe~67>=Kr4fpDI_DgM$8#+oAv2JN_w)36B3b`(OL|**O3J literal 0 HcmV?d00001 diff --git a/setup/windows/launchers.json b/setup/windows/launchers.json new file mode 100644 index 00000000..646cb8a4 --- /dev/null +++ b/setup/windows/launchers.json @@ -0,0 +1,196 @@ +{ + "(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 diff --git a/setup/windows/sources.json b/setup/windows/sources.json new file mode 100644 index 00000000..041dee59 --- /dev/null +++ b/setup/windows/sources.json @@ -0,0 +1,48 @@ +{ + "7-Zip Extra": "https://www.7-zip.org/a/7z1900-extra.7z", + "7-Zip Installer": "https://www.7-zip.org/a/7z1900.msi", + "ConEmu": "https://github.com/Maximus5/ConEmu/releases/download/v21.09.12/ConEmuPack.210912.7z", + "Python x32": "https://www.python.org/ftp/python/3.8.10/python-3.8.10-embed-win32.zip", + "Python x64": "https://www.python.org/ftp/python/3.8.10/python-3.8.10-embed-amd64.zip", + + "Notepad++": "https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.1.5/npp.8.1.5.portable.minimalist.7z", + + "Adobe Reader DC": "https://ardownload2.adobe.com/pub/adobe/reader/win/AcrobatDC/2100120145/AcroRdrDC2100120145_en_US.exe", + "Autoruns": "https://download.sysinternals.com/files/Autoruns.zip", + "ERUNT": "http://www.aumha.org/downloads/erunt.zip", + "ESET NOD32 AV": "https://download.eset.com/com/eset/apps/home/eav/windows/latest/eav_nt64.exe", + "ESET Online Scanner": "https://download.eset.com/com/eset/tools/online_scanner/latest/esetonlinescanner_enu.exe", + "Everything32": "https://www.voidtools.com/Everything-1.4.1.1005.x86.en-US.zip", + "Everything64": "https://www.voidtools.com/Everything-1.4.1.1005.x64.en-US.zip", + "FastCopy": "https://ftp.vector.co.jp/73/10/2323/FastCopy392_installer.exe", + "FurMark": "https://geeks3d.com/dl/get/569", + "HWiNFO": "https://files1.majorgeeks.com/c8a055180587599139f8f454712dcc618cd1740e/systeminfo/hwi_702.zip", + "IOBit_Uninstaller": "https://portableapps.com/redirect/?a=IObitUninstallerPortable&s=s&d=pa&f=IObitUninstallerPortable_7.5.0.7.paf.exe", + "Intel SSD Toolbox": "https://downloadmirror.intel.com/28593/eng/Intel%20SSD%20Toolbox%20-%20v3.5.9.exe", + "Linux Reader": "https://www.diskinternals.com/download/Linux_Reader.exe", + "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", + "Office Deployment Tool": "https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_11617-33601.exe", + "ProduKey32": "http://www.nirsoft.net/utils/produkey.zip", + "ProduKey64": "http://www.nirsoft.net/utils/produkey-x64.zip", + "PuTTY": "https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip", + "SDIO Themes": "http://snappy-driver-installer.org/downloads/SDIO_Themes.zip", + "SDIO Torrent": "http://snappy-driver-installer.org/downloads/SDIO_Update.torrent", + "Samsung Magician": "https://s3.ap-northeast-2.amazonaws.com/global.semi.static/SAMSUNG_SSD_v5_3_0_181121/CD0C7CC1BE00525FAC4675B9E502899B41D5C3909ECE3AA2FB6B74A766B2A1EA/Samsung_Magician_Installer.zip", + "ShutUp10": "https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe", + "TestDisk": "https://www.cgsecurity.org/testdisk-7.2-WIP.win.zip", + "WinAIO Repair": "http://www.tweaking.com/files/setups/tweaking.com_windows_repair_aio.zip", + "Winapp2": "https://github.com/MoscaDotTo/Winapp2/archive/master.zip", + "WizTree": "https://wiztreefree.com/files/wiztree_3_39_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", + "aria2": "https://github.com/aria2/aria2/releases/download/release-1.35.0/aria2-1.35.0-win-32bit-build1.zip", + "smartmontools": "https://1278-105252244-gh.circle-artifacts.com/0/builds/smartmontools-win32-setup-7.3-r5216.exe", + "wimlib32": "https://wimlib.net/downloads/wimlib-1.13.3-windows-i686-bin.zip", + "wimlib64": "https://wimlib.net/downloads/wimlib-1.13.3-windows-x86_64-bin.zip" +} From 2b2f371482eba36fc56c96355a18b37289eb005a Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Fri, 8 Oct 2021 20:36:46 -0600 Subject: [PATCH 08/20] Use run_tool to extract ERUNT --- scripts/wk/repairs/win.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/scripts/wk/repairs/win.py b/scripts/wk/repairs/win.py index 699af3e1..f06aa121 100644 --- a/scripts/wk/repairs/win.py +++ b/scripts/wk/repairs/win.py @@ -34,12 +34,7 @@ from wk.io import ( non_clobber_path, rename_item, ) -from wk.kit.tools import ( - download_tool, - extract_tool, - get_tool_path, - run_tool, - ) +from wk.kit.tools import (download_tool, get_tool_path, run_tool) from wk.log import format_log_path, update_log_path from wk.std import ( GenericError, @@ -933,8 +928,10 @@ def backup_registry(): raise GenericWarning('Backup already exists.') # Backup registry - extract_tool('ERUNT') - run_tool('ERUNT', 'ERUNT', backup_path, 'sysreg', 'curuser', 'otherusers') + run_tool( + 'ERUNT', 'ERUNT', backup_path, 'sysreg', 'curuser', 'otherusers', + cbin=True, + ) def delete_registry_null_keys(): From bc0a358ac0cc9c3f7437cd085351309e57632bf4 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Fri, 8 Oct 2021 20:53:21 -0600 Subject: [PATCH 09/20] Update source URLs --- scripts/wk/cfg/sources.py | 83 +++++++++++++++++++++++++------------- setup/windows/sources.json | 43 +------------------- 2 files changed, 56 insertions(+), 70 deletions(-) diff --git a/scripts/wk/cfg/sources.py b/scripts/wk/cfg/sources.py index 975019f7..208baad2 100644 --- a/scripts/wk/cfg/sources.py +++ b/scripts/wk/cfg/sources.py @@ -9,34 +9,61 @@ DOWNLOAD_FREQUENCY = 7 # Sources SOURCES = { - 'AIDA64': 'https://download.aida64.com/aida64engineer633.zip', - 'AVRemover32': 'https://download.eset.com/com/eset/tools/installers/av_remover/latest/avremover_nt32_enu.exe', - 'AVRemover64': 'https://download.eset.com/com/eset/tools/installers/av_remover/latest/avremover_nt64_enu.exe', - 'AdwCleaner': 'https://downloads.malwarebytes.com/file/adwcleaner', - 'Autologon32': 'http://live.sysinternals.com/Autologon.exe', - 'Autologon64': 'http://live.sysinternals.com/Autologon64.exe', - 'BleachBit': 'https://download.bleachbit.org/BleachBit-4.2.0-portable.zip', - 'BlueScreenView32': 'http://www.nirsoft.net/utils/bluescreenview.zip', - 'BlueScreenView64': 'http://www.nirsoft.net/utils/bluescreenview-x64.zip', - 'Firefox32': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win&lang=en-US', - 'Firefox64': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US', - 'Fluent-Metro': 'https://github.com/bonzibudd/Fluent-Metro/releases/download/v1.5.2/Fluent-Metro_1.5.2.zip', - 'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe', - 'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe', - 'KVRT': 'https://devbuilds.s.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe', - 'LibreOffice': 'https://download.documentfoundation.org/libreoffice/stable/7.1.2/win/x86_64/LibreOffice_7.1.2_Win_x64.msi', - 'OpenShell': 'https://github.com/Open-Shell/Open-Shell-Menu/releases/download/v4.4.160/OpenShellSetup_4_4_160.exe', - 'RKill': 'https://download.bleepingcomputer.com/grinler/rkill.exe', - 'RegDelNull': 'https://live.sysinternals.com/RegDelNull.exe', - 'RegDelNull64': 'https://live.sysinternals.com/RegDelNull64.exe', - 'Software Bundle': 'https://ninite.com/.net4.8-7zip-chrome-edge-vlc/ninite.exe', - 'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe', - 'VCRedist_2012_x32': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe', - 'VCRedist_2012_x64': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe', - 'VCRedist_2013_x32': 'https://aka.ms/highdpimfc2013x86enu', - 'VCRedist_2013_x64': 'https://aka.ms/highdpimfc2013x64enu', - 'VCRedist_2019_x32': 'https://aka.ms/vs/16/release/vc_redist.x86.exe', - 'VCRedist_2019_x64': 'https://aka.ms/vs/16/release/vc_redist.x64.exe', + # Main + 'AVRemover32': 'https://download.eset.com/com/eset/tools/installers/av_remover/latest/avremover_nt32_enu.exe', + 'AVRemover64': 'https://download.eset.com/com/eset/tools/installers/av_remover/latest/avremover_nt64_enu.exe', + 'AdwCleaner': 'https://downloads.malwarebytes.com/file/adwcleaner', + 'Autologon32': 'http://live.sysinternals.com/Autologon.exe', + 'Autologon64': 'http://live.sysinternals.com/Autologon64.exe', + 'Autoruns32': 'http://live.sysinternals.com/Autoruns.exe', + 'Autoruns64': 'http://live.sysinternals.com/Autoruns64.exe', + 'Firefox32': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win&lang=en-US', + 'Firefox64': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US', + 'Fluent-Metro': 'https://github.com/bonzibudd/Fluent-Metro/releases/download/v1.5.2/Fluent-Metro_1.5.2.zip', + 'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe', + 'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe', + 'KVRT': 'https://devbuilds.s.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe', + 'LibreOffice': 'https://download.documentfoundation.org/libreoffice/stable/7.1.2/win/x86_64/LibreOffice_7.1.2_Win_x64.msi', + 'OpenShell': 'https://github.com/Open-Shell/Open-Shell-Menu/releases/download/v4.4.160/OpenShellSetup_4_4_160.exe', + 'RKill': 'https://download.bleepingcomputer.com/grinler/rkill.exe', + 'RegDelNull': 'https://live.sysinternals.com/RegDelNull.exe', + 'RegDelNull64': 'https://live.sysinternals.com/RegDelNull64.exe', + 'Software Bundle': 'https://ninite.com/.net4.8-7zip-chrome-edge-vlc/ninite.exe', + 'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe', + 'VCRedist_2012_x32': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe', + 'VCRedist_2012_x64': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe', + 'VCRedist_2013_x32': 'https://aka.ms/highdpimfc2013x86enu', + 'VCRedist_2013_x64': 'https://aka.ms/highdpimfc2013x64enu', + 'VCRedist_2019_x32': 'https://aka.ms/vs/16/release/vc_redist.x86.exe', + 'VCRedist_2019_x64': 'https://aka.ms/vs/16/release/vc_redist.x64.exe', + + # Build Kit + 'AIDA64': 'https://download.aida64.com/aida64engineer633.zip', + 'Adobe Reader DC': 'https://ardownload2.adobe.com/pub/adobe/reader/win/AcrobatDC/2100720091/AcroRdrDC2100720091_en_US.exe', + 'Aria2': 'https://github.com/aria2/aria2/releases/download/release-1.36.0/aria2-1.36.0-win-32bit-build1.zip', + 'BleachBit': 'https://download.bleachbit.org/BleachBit-4.4.0-portable.zip', + 'BlueScreenView32': 'http://www.nirsoft.net/utils/bluescreenview.zip', + 'BlueScreenView64': 'http://www.nirsoft.net/utils/bluescreenview-x64.zip', + 'ERUNT': 'http://www.aumha.org/downloads/erunt.zip', + 'Everything32': 'https://www.voidtools.com/Everything-1.4.1.1009.x86.en-US.zip', + 'Everything64': 'https://www.voidtools.com/Everything-1.4.1.1009.x64.en-US.zip', + 'FastCopy': 'https://ftp.vector.co.jp/73/10/2323/FastCopy392_installer.exe', + 'FurMark': 'https://geeks3d.com/dl/get/569', + 'HWiNFO': 'https://files2.majorgeeks.com/1847e0d1291483b8a3c98d75a637ef33bae928f7/systeminfo/hwi_712.zip', + 'IOBit_Uninstaller': 'https://portableapps.com/redirect/?a=IObitUninstallerPortable&s=s&d=pa&f=IObitUninstallerPortable_7.5.0.7.paf.exe', + 'Macs Fan Control': 'https://www.crystalidea.com/downloads/macsfancontrol_setup.exe', + 'Notepad++': 'https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.1.5/npp.8.1.5.portable.minimalist.7z', + 'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip', + 'SDIO Themes': 'http://snappy-driver-installer.org/downloads/SDIO_Themes.zip', + 'SDIO Torrent': 'http://snappy-driver-installer.org/downloads/SDIO_Update.torrent', + 'TestDisk': 'https://www.cgsecurity.org/testdisk-7.2-WIP.win.zip', + 'Winapp2': 'https://github.com/MoscaDotTo/Winapp2/archive/master.zip', + 'WizTree': 'https://wiztreefree.com/files/wiztree_3_39_portable.zip', + 'XMPlay': 'https://support.xmplay.com/files/20/xmplay385.zip?v=47090', + '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', } diff --git a/setup/windows/sources.json b/setup/windows/sources.json index 041dee59..3f7ade77 100644 --- a/setup/windows/sources.json +++ b/setup/windows/sources.json @@ -3,46 +3,5 @@ "7-Zip Installer": "https://www.7-zip.org/a/7z1900.msi", "ConEmu": "https://github.com/Maximus5/ConEmu/releases/download/v21.09.12/ConEmuPack.210912.7z", "Python x32": "https://www.python.org/ftp/python/3.8.10/python-3.8.10-embed-win32.zip", - "Python x64": "https://www.python.org/ftp/python/3.8.10/python-3.8.10-embed-amd64.zip", - - "Notepad++": "https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.1.5/npp.8.1.5.portable.minimalist.7z", - - "Adobe Reader DC": "https://ardownload2.adobe.com/pub/adobe/reader/win/AcrobatDC/2100120145/AcroRdrDC2100120145_en_US.exe", - "Autoruns": "https://download.sysinternals.com/files/Autoruns.zip", - "ERUNT": "http://www.aumha.org/downloads/erunt.zip", - "ESET NOD32 AV": "https://download.eset.com/com/eset/apps/home/eav/windows/latest/eav_nt64.exe", - "ESET Online Scanner": "https://download.eset.com/com/eset/tools/online_scanner/latest/esetonlinescanner_enu.exe", - "Everything32": "https://www.voidtools.com/Everything-1.4.1.1005.x86.en-US.zip", - "Everything64": "https://www.voidtools.com/Everything-1.4.1.1005.x64.en-US.zip", - "FastCopy": "https://ftp.vector.co.jp/73/10/2323/FastCopy392_installer.exe", - "FurMark": "https://geeks3d.com/dl/get/569", - "HWiNFO": "https://files1.majorgeeks.com/c8a055180587599139f8f454712dcc618cd1740e/systeminfo/hwi_702.zip", - "IOBit_Uninstaller": "https://portableapps.com/redirect/?a=IObitUninstallerPortable&s=s&d=pa&f=IObitUninstallerPortable_7.5.0.7.paf.exe", - "Intel SSD Toolbox": "https://downloadmirror.intel.com/28593/eng/Intel%20SSD%20Toolbox%20-%20v3.5.9.exe", - "Linux Reader": "https://www.diskinternals.com/download/Linux_Reader.exe", - "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", - "Office Deployment Tool": "https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_11617-33601.exe", - "ProduKey32": "http://www.nirsoft.net/utils/produkey.zip", - "ProduKey64": "http://www.nirsoft.net/utils/produkey-x64.zip", - "PuTTY": "https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip", - "SDIO Themes": "http://snappy-driver-installer.org/downloads/SDIO_Themes.zip", - "SDIO Torrent": "http://snappy-driver-installer.org/downloads/SDIO_Update.torrent", - "Samsung Magician": "https://s3.ap-northeast-2.amazonaws.com/global.semi.static/SAMSUNG_SSD_v5_3_0_181121/CD0C7CC1BE00525FAC4675B9E502899B41D5C3909ECE3AA2FB6B74A766B2A1EA/Samsung_Magician_Installer.zip", - "ShutUp10": "https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe", - "TestDisk": "https://www.cgsecurity.org/testdisk-7.2-WIP.win.zip", - "WinAIO Repair": "http://www.tweaking.com/files/setups/tweaking.com_windows_repair_aio.zip", - "Winapp2": "https://github.com/MoscaDotTo/Winapp2/archive/master.zip", - "WizTree": "https://wiztreefree.com/files/wiztree_3_39_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", - "aria2": "https://github.com/aria2/aria2/releases/download/release-1.35.0/aria2-1.35.0-win-32bit-build1.zip", - "smartmontools": "https://1278-105252244-gh.circle-artifacts.com/0/builds/smartmontools-win32-setup-7.3-r5216.exe", - "wimlib32": "https://wimlib.net/downloads/wimlib-1.13.3-windows-i686-bin.zip", - "wimlib64": "https://wimlib.net/downloads/wimlib-1.13.3-windows-x86_64-bin.zip" + "Python x64": "https://www.python.org/ftp/python/3.8.10/python-3.8.10-embed-amd64.zip" } From d4392b7285c34d34eff01788b4ff24b108868eaa Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sat, 9 Oct 2021 17:16:46 -0600 Subject: [PATCH 10/20] Cleanup imports --- scripts/wk/repairs/win.py | 41 ++++++------------ scripts/wk/setup/__init__.py | 5 +-- scripts/wk/setup/win.py | 82 ++++++++++++------------------------ 3 files changed, 40 insertions(+), 88 deletions(-) diff --git a/scripts/wk/repairs/win.py b/scripts/wk/repairs/win.py index f06aa121..4bdde228 100644 --- a/scripts/wk/repairs/win.py +++ b/scripts/wk/repairs/win.py @@ -5,7 +5,6 @@ import atexit import logging import os -import platform import re import sys import time @@ -36,6 +35,18 @@ from wk.io import ( ) from wk.kit.tools import (download_tool, get_tool_path, run_tool) from wk.log import format_log_path, update_log_path +from wk.os.win import ( + OS_VERSION, + get_timezone, + set_timezone, + reg_delete_value, + reg_read_value, + reg_set_value, + reg_write_settings, + disable_service, + enable_service, + stop_service, + ) from wk.std import ( GenericError, GenericWarning, @@ -54,34 +65,6 @@ from wk.std import ( sleep, strip_colors, ) -if platform.system() == 'Windows': - from wk.os.win import ( - OS_VERSION, - get_timezone, - set_timezone, - reg_delete_value, - reg_read_value, - reg_set_value, - reg_write_settings, - disable_service, - enable_service, - stop_service, - ) -else: - # Workaround to allow basic testing under non-Windows environments - OS_VERSION = -1 - def no_op(*args, **kwargs): # pylint: disable=unused-argument - """No-op function.""" - # wk.os.win - get_timezone = no_op - set_timezone = no_op - reg_delete_value = no_op - reg_read_value = no_op - reg_set_value = no_op - reg_write_settings = no_op - disable_service = no_op - enable_service = no_op - stop_service = no_op # STATIC VARIABLES diff --git a/scripts/wk/setup/__init__.py b/scripts/wk/setup/__init__.py index 3e5683bb..724c52c0 100644 --- a/scripts/wk/setup/__init__.py +++ b/scripts/wk/setup/__init__.py @@ -3,6 +3,5 @@ import platform -#if platform.system() == 'Windows': -# from . import win -from . import win +if platform.system() == 'Windows': + from . import win diff --git a/scripts/wk/setup/win.py b/scripts/wk/setup/win.py index 8579ca40..54d486c9 100644 --- a/scripts/wk/setup/win.py +++ b/scripts/wk/setup/win.py @@ -6,7 +6,6 @@ import configparser import logging import json import os -import platform import re import sys @@ -31,6 +30,32 @@ from wk.kit.tools import ( run_tool, ) from wk.log import format_log_path, update_log_path +from wk.os.win import ( + OS_VERSION, + activate_with_bios, + check_4k_alignment, + get_installed_antivirus, + get_installed_ram, + get_os_activation, + get_os_name, + get_raw_disks, + get_volume_usage, + is_activated, + is_secure_boot_enabled, + reg_set_value, + reg_write_settings, + ) +from wk.repairs.win import ( + WIDTH, + backup_all_browser_profiles, + backup_registry, + create_custom_power_plan, + create_system_restore_point, + enable_windows_updates, + export_power_plans, + reset_power_plans, + set_system_restore_size, + ) from wk.std import ( GenericError, GenericWarning, @@ -50,61 +75,6 @@ from wk.std import ( sleep, strip_colors, ) -if platform.system() == 'Windows': - from wk.os.win import ( - OS_VERSION, - activate_with_bios, - check_4k_alignment, - get_installed_antivirus, - get_installed_ram, - get_os_activation, - get_os_name, - get_raw_disks, - get_volume_usage, - is_activated, - is_secure_boot_enabled, - reg_set_value, - reg_write_settings, - ) - from wk.repairs.win import ( - WIDTH, - backup_all_browser_profiles, - backup_registry, - create_custom_power_plan, - create_system_restore_point, - enable_windows_updates, - export_power_plans, - reset_power_plans, - set_system_restore_size, - ) -else: - # Workaround to allow basic testing under non-Windows environments - OS_VERSION = -1 - def no_op(*args, **kwargs): # pylint: disable=unused-argument - """No-op function.""" - # wk.os.win - activate_with_bios = no_op - check_4k_alignment = no_op - get_installed_antivirus = no_op - get_installed_ram = no_op - get_os_activation = no_op - get_os_name = no_op - get_raw_disks = no_op - get_volume_usage = no_op - is_activated = no_op - is_secure_boot_enabled = no_op - reg_read_value = no_op - reg_set_value = no_op - reg_write_settings = no_op - # wk.repairs.win - backup_all_browser_profiles = no_op - backup_registry = no_op - create_custom_power_plan = no_op - create_system_restore_point = no_op - enable_windows_updates = no_op - export_power_plans = no_op - reset_power_plans = no_op - set_system_restore_size = no_op # STATIC VARIABLES From d1b32a786cd43d659271e3f298df20ffb478b6fd Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sat, 9 Oct 2021 19:42:38 -0600 Subject: [PATCH 11/20] Add arch-install-scripts to live image --- setup/linux/packages/base | 1 + 1 file changed, 1 insertion(+) diff --git a/setup/linux/packages/base b/setup/linux/packages/base index eab576d6..4f5eb086 100644 --- a/setup/linux/packages/base +++ b/setup/linux/packages/base @@ -2,6 +2,7 @@ aic94xx-firmware alsa-utils amd-ucode antiword +arch-install-scripts base bc bind From 0725674a3b921d66235b60cb1eeb877af4660ec7 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 13 Oct 2021 17:51:55 -0600 Subject: [PATCH 12/20] Update Windows kit layout and update tool configs Going forward cbin/.cbin will only be used if necessary and not by default. This removes a step for most tools when used and better aligns with the new auto_repairs and auto_setup scripts. --- scripts/Launcher_Template.cmd | 4 +- scripts/init_client_dir.cmd | 2 +- scripts/wk/cfg/__init__.py | 2 + scripts/wk/cfg/launchers.py | 254 +++++++++++++++++++ scripts/wk/cfg/music.py | 73 ++++++ scripts/wk/cfg/repairs.py | 28 +- scripts/wk/cfg/sources.py | 18 +- scripts/wk/repairs/win.py | 10 +- scripts/wk/setup/win.py | 7 +- setup/build_windows.cmd | 4 +- setup/windows/bin/BleachBit/BleachBit.ini | 110 ++++++++ setup/windows/bin/Everything/Everything.ini | 6 + setup/windows/bin/Neutron/Neutron.ini | 27 ++ setup/windows/bin/NotepadPlusPlus/config.xml | 65 +++++ setup/windows/bin/SDIO/sdi.cfg | 4 +- setup/windows/bin/XMPlay/xmplay.ini | 154 +++++++++++ setup/windows/build.ps1 | 2 +- 17 files changed, 739 insertions(+), 31 deletions(-) create mode 100644 scripts/wk/cfg/launchers.py create mode 100644 scripts/wk/cfg/music.py create mode 100644 setup/windows/bin/BleachBit/BleachBit.ini create mode 100644 setup/windows/bin/Everything/Everything.ini create mode 100644 setup/windows/bin/Neutron/Neutron.ini create mode 100644 setup/windows/bin/NotepadPlusPlus/config.xml create mode 100644 setup/windows/bin/XMPlay/xmplay.ini diff --git a/scripts/Launcher_Template.cmd b/scripts/Launcher_Template.cmd index 9bb03a97..86ddd9be 100644 --- a/scripts/Launcher_Template.cmd +++ b/scripts/Launcher_Template.cmd @@ -67,8 +67,8 @@ popd @exit /b 0 :SetTitle -rem Sets title using KIT_NAME_FULL from settings\main.py -set "SETTINGS=%bin%\Scripts\settings\main.py" +rem Sets title using KIT_NAME_FULL from wk\cfg\main.py +set "SETTINGS=%bin%\Scripts\wk\cfg\main.py" for /f "tokens=* usebackq" %%f in (`findstr KIT_NAME_FULL "%SETTINGS%"`) do ( set "_v=%%f" set "_v=!_v:*'=!" diff --git a/scripts/init_client_dir.cmd b/scripts/init_client_dir.cmd index 6c99fbdf..5e94469b 100644 --- a/scripts/init_client_dir.cmd +++ b/scripts/init_client_dir.cmd @@ -26,7 +26,7 @@ set _minute=%_minute:~-2% set iso_date=%_yyyy%-%_mm%-%_dd% :SetVars -set "SETTINGS=%bin%\Scripts\settings\main.py" +set "SETTINGS=%bin%\Scripts\wk\cfg\main.py" for /f "tokens=* usebackq" %%f in (`findstr KIT_NAME_SHORT "%SETTINGS%"`) do ( set "_v=%%f" set "_v=!_v:*'=!" diff --git a/scripts/wk/cfg/__init__.py b/scripts/wk/cfg/__init__.py index c30f4e29..d79a6eb6 100644 --- a/scripts/wk/cfg/__init__.py +++ b/scripts/wk/cfg/__init__.py @@ -2,8 +2,10 @@ from . import ddrescue from . import hw +from . import launchers from . import log from . import main +from . import music from . import net from . import repairs from . import setup diff --git a/scripts/wk/cfg/launchers.py b/scripts/wk/cfg/launchers.py new file mode 100644 index 00000000..6722bb3d --- /dev/null +++ b/scripts/wk/cfg/launchers.py @@ -0,0 +1,254 @@ +"""WizardKit: Config - Launchers (Windows)""" +# pylint: disable=line-too-long +# vim: sts=2 sw=2 ts=2 + +LAUNCHERS = { + r'': { # Root Dir + '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', + }, + }, + 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': { + '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', + ], + }, + }, + r'Diagnostics': { + 'AIDA64': { + 'L_TYPE': 'Executable', + 'L_PATH': 'AIDA64', + 'L_ITEM': 'aida64.exe', + }, + 'Autoruns (with VirusTotal Scan)': { + 'L_TYPE': 'Executable', + 'L_PATH': 'Sysinternals', + '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', + ], + }, + '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')', + ], + }, + 'Snappy Driver Installer Origin': { + 'L_TYPE': 'Executable', + 'L_PATH': 'SDIO', + 'L_ITEM': 'SDIO.exe', + }, + }, + r'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', + }, + 'XMPlay': { + 'L_TYPE': 'Executable', + 'L_PATH': 'XMPlay', + 'L_ITEM': 'xmplay.exe', + 'L_ARGS': r'"%bin%\XMPlay\music.7z"', + }, + }, + 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/cfg/music.py b/scripts/wk/cfg/music.py new file mode 100644 index 00000000..aa16ddfd --- /dev/null +++ b/scripts/wk/cfg/music.py @@ -0,0 +1,73 @@ +"""WizardKit: Config - Music Sources""" +# vim: sts=2 sw=2 ts=2 + +MUSIC_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'), + ('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'), + ) +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/cfg/repairs.py b/scripts/wk/cfg/repairs.py index 657559d1..03693dae 100644 --- a/scripts/wk/cfg/repairs.py +++ b/scripts/wk/cfg/repairs.py @@ -9,36 +9,54 @@ BLEACH_BIT_CLEANERS = ( # Applications 'adobe_reader.cache', 'adobe_reader.tmp', + 'amule.temp', + 'discord.cache', 'flash.cache', 'gimp.tmp', + 'google_earth.temporary_files', + 'gpodder.cache', 'hippo_opensim_viewer.cache', 'java.cache', 'miro.cache', 'openofficeorg.cache', 'pidgin.cache', + 'seamonkey.cache', 'secondlife_viewer.Cache', + 'silverlight.temp', + 'slack.cache', + 'smartftp.cache', 'thunderbird.cache', 'vuze.cache', + 'vuze.temp', + 'windows_media_player.cache', + 'winrar.temp', 'yahoo_messenger.cache', + 'zoom.cache', # Browsers + 'brave.cache', + 'brave.session', 'chromium.cache', + 'chromium.search_engines', 'chromium.session', 'firefox.cache', 'firefox.session_restore', 'google_chrome.cache', 'google_chrome.session', - 'google_earth.temporary_files', + 'internet_explorer.cache', + 'microsoft_edge.cache', + 'microsoft_edge.session', 'opera.cache', 'opera.session', + 'palemoon.cache', + 'palemoon.session_restore', 'safari.cache', - 'seamonkey.cache', + 'waterfox.cache', + 'waterfox.session_restore', # System 'system.clipboard', 'system.tmp', - 'winapp2_windows.jump_lists', - 'winapp2_windows.ms_search', + 'windows_defender.temp', 'windows_explorer.run', - 'windows_explorer.search_history', 'windows_explorer.thumbnails', ) POWER_PLANS = { diff --git a/scripts/wk/cfg/sources.py b/scripts/wk/cfg/sources.py index 208baad2..f8f13b53 100644 --- a/scripts/wk/cfg/sources.py +++ b/scripts/wk/cfg/sources.py @@ -1,4 +1,4 @@ -"""WizardKit: Config - Sources""" +"""WizardKit: Config - Tool Sources""" # pylint: disable=line-too-long # vim: sts=2 sw=2 ts=2 @@ -15,15 +15,12 @@ SOURCES = { 'AdwCleaner': 'https://downloads.malwarebytes.com/file/adwcleaner', 'Autologon32': 'http://live.sysinternals.com/Autologon.exe', 'Autologon64': 'http://live.sysinternals.com/Autologon64.exe', - 'Autoruns32': 'http://live.sysinternals.com/Autoruns.exe', - 'Autoruns64': 'http://live.sysinternals.com/Autoruns64.exe', 'Firefox32': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win&lang=en-US', 'Firefox64': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US', 'Fluent-Metro': 'https://github.com/bonzibudd/Fluent-Metro/releases/download/v1.5.2/Fluent-Metro_1.5.2.zip', 'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe', 'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe', 'KVRT': 'https://devbuilds.s.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe', - 'LibreOffice': 'https://download.documentfoundation.org/libreoffice/stable/7.1.2/win/x86_64/LibreOffice_7.1.2_Win_x64.msi', 'OpenShell': 'https://github.com/Open-Shell/Open-Shell-Menu/releases/download/v4.4.160/OpenShellSetup_4_4_160.exe', 'RKill': 'https://download.bleepingcomputer.com/grinler/rkill.exe', 'RegDelNull': 'https://live.sysinternals.com/RegDelNull.exe', @@ -40,6 +37,8 @@ SOURCES = { # Build Kit 'AIDA64': 'https://download.aida64.com/aida64engineer633.zip', 'Adobe Reader DC': 'https://ardownload2.adobe.com/pub/adobe/reader/win/AcrobatDC/2100720091/AcroRdrDC2100720091_en_US.exe', + 'Autoruns32': 'http://live.sysinternals.com/Autoruns.exe', + 'Autoruns64': 'http://live.sysinternals.com/Autoruns64.exe', 'Aria2': 'https://github.com/aria2/aria2/releases/download/release-1.36.0/aria2-1.36.0-win-32bit-build1.zip', 'BleachBit': 'https://download.bleachbit.org/BleachBit-4.4.0-portable.zip', 'BlueScreenView32': 'http://www.nirsoft.net/utils/bluescreenview.zip', @@ -49,21 +48,22 @@ SOURCES = { 'Everything64': 'https://www.voidtools.com/Everything-1.4.1.1009.x64.en-US.zip', 'FastCopy': 'https://ftp.vector.co.jp/73/10/2323/FastCopy392_installer.exe', 'FurMark': 'https://geeks3d.com/dl/get/569', - 'HWiNFO': 'https://files2.majorgeeks.com/1847e0d1291483b8a3c98d75a637ef33bae928f7/systeminfo/hwi_712.zip', - 'IOBit_Uninstaller': 'https://portableapps.com/redirect/?a=IObitUninstallerPortable&s=s&d=pa&f=IObitUninstallerPortable_7.5.0.7.paf.exe', + 'HWiNFO': 'https://www.sac.sk/download/utildiag/hwi_712.zip', + 'IOBit Uninstaller': 'https://portableapps.com/redirect/?a=IObitUninstallerPortable&s=s&d=pa&f=IObitUninstallerPortable_7.5.0.7.paf.exe', + 'LibreOffice32': 'https://download.documentfoundation.org/libreoffice/stable/7.2.1/win/x86/LibreOffice_7.2.1_Win_x86.msi', + 'LibreOffice64': 'https://download.documentfoundation.org/libreoffice/stable/7.2.1/win/x86_64/LibreOffice_7.2.1_Win_x64.msi', 'Macs Fan Control': 'https://www.crystalidea.com/downloads/macsfancontrol_setup.exe', + 'Neutron': 'http://keir.net/download/neutron.zip', 'Notepad++': 'https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.1.5/npp.8.1.5.portable.minimalist.7z', 'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip', - 'SDIO Themes': 'http://snappy-driver-installer.org/downloads/SDIO_Themes.zip', 'SDIO Torrent': 'http://snappy-driver-installer.org/downloads/SDIO_Update.torrent', 'TestDisk': 'https://www.cgsecurity.org/testdisk-7.2-WIP.win.zip', - 'Winapp2': 'https://github.com/MoscaDotTo/Winapp2/archive/master.zip', 'WizTree': 'https://wiztreefree.com/files/wiztree_3_39_portable.zip', 'XMPlay': 'https://support.xmplay.com/files/20/xmplay385.zip?v=47090', '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 Innocuous': 'https://support.xmplay.com/files/10/Innocuous%20(v1.4).zip?v=594785', } diff --git a/scripts/wk/repairs/win.py b/scripts/wk/repairs/win.py index 4bdde228..a297a52d 100644 --- a/scripts/wk/repairs/win.py +++ b/scripts/wk/repairs/win.py @@ -251,8 +251,7 @@ def init_run(options): ) if options['Sync Clock']['Selected']: TRY_PRINT.run( - 'Syncing Clock...', run_tool, 'Neutron', 'Neutron', - cbin=True, msg_good='DONE', + 'Syncing Clock...', run_tool, 'Neutron', 'Neutron', msg_good='DONE', ) if options['Run RKill']['Selected']: TRY_PRINT.run('Running RKill...', run_rkill, msg_good='DONE') @@ -911,10 +910,7 @@ def backup_registry(): raise GenericWarning('Backup already exists.') # Backup registry - run_tool( - 'ERUNT', 'ERUNT', backup_path, 'sysreg', 'curuser', 'otherusers', - cbin=True, - ) + run_tool('ERUNT', 'ERUNT', backup_path, 'sysreg', 'curuser', 'otherusers') def delete_registry_null_keys(): @@ -935,7 +931,7 @@ def run_bleachbit(cleaners, preview=True): ) log_path = format_log_path(log_name='BleachBit', timestamp=True, tool=True) log_path.parent.mkdir(parents=True, exist_ok=True) - proc = run_tool('BleachBit', 'bleachbit_console', *cmd_args, cbin=True) + proc = run_tool('BleachBit', 'bleachbit_console', *cmd_args) # Save logs log_path.write_text(proc.stdout, encoding='utf-8') diff --git a/scripts/wk/setup/win.py b/scripts/wk/setup/win.py index 54d486c9..eac9b0f7 100644 --- a/scripts/wk/setup/win.py +++ b/scripts/wk/setup/win.py @@ -696,7 +696,7 @@ def install_firefox(): def install_libreoffice( register_mso_types=True, use_mso_formats=False, vcredist=True): """Install LibreOffice.""" - installer = find_kit_dir('Installers').joinpath('LibreOffice.msi') + installer = find_kit_dir('Installers').joinpath(f'LibreOffice{ARCH}.msi') xcu_dir = get_path_obj(f'{os.environ.get("APPDATA")}/LibreOffice/4/user') xcu_file = xcu_dir.joinpath('registrymodifications.xcu') @@ -875,7 +875,8 @@ def export_aida64_report(): '/R', report_path, '/CUSTOM', 'basic.rpf', '/HTML', '/SILENT', '/SAFEST', - cbin=True, cwd=True) + cwd=True, + ) if proc.returncode: raise GenericError('Error(s) encountered exporting report.') @@ -914,7 +915,7 @@ def open_windows_updates(): def open_xmplay(): """Open XMPlay.""" sleep(2) - run_tool('XMPlay', 'XMPlay', 'music.7z', cbin=True, cwd=True, popen=True) + run_tool('XMPlay', 'XMPlay', 'music.7z', cwd=True, popen=True) if __name__ == '__main__': diff --git a/setup/build_windows.cmd b/setup/build_windows.cmd index c6a1740a..15fad071 100644 --- a/setup/build_windows.cmd +++ b/setup/build_windows.cmd @@ -25,7 +25,9 @@ set "OUT_DIR=OUT_KIT\%KIT_NAME_FULL%" rem Copy base files to a new folder %OUT_DIR% mkdir %OUT_DIR% >nul 2>&1 robocopy /e windows/bin %OUT_DIR%\.bin -robocopy /e windows/cbin %OUT_DIR%\.cbin +robocopy /e ..\scripts %OUT_DIR%\.bin\Scripts +rem robocopy /e windows/cbin %OUT_DIR%\.cbin +mkdir %OUT_DIR%\.cbin copy ..\LICENSE.txt %OUT_DIR%\LICENSE.txt copy ..\README.md %OUT_DIR%\README.md copy ..\images\ConEmu.png %OUT_DIR%\.bin\ConEmu\ diff --git a/setup/windows/bin/BleachBit/BleachBit.ini b/setup/windows/bin/BleachBit/BleachBit.ini new file mode 100644 index 00000000..7174f04b --- /dev/null +++ b/setup/windows/bin/BleachBit/BleachBit.ini @@ -0,0 +1,110 @@ +[Portable] + +[bleachbit] +auto_hide = False +check_beta = False +check_online_updates = False +dark_mode = True +debug = False +delete_confirmation = True +exit_done = False +remember_geometry = False +shred = False +units_iec = True +window_fullscreen = False +window_maximized = False +update_winapp2 = False +win10_theme = False +first_start = True +version = 4.4.0 + +[preserve_languages] +en = True + +[tree] +adobe_reader = True +adobe_reader.cache = True +adobe_reader.tmp = True +amule = True +amule.temp = True +brave = True +brave.cache = True +brave.session = True +chromium = True +chromium.cache = True +chromium.search_engines = True +chromium.session = True +discord = True +discord.cache = True +firefox = True +firefox.cache = True +firefox.session_restore = True +flash = True +flash.cache = True +gimp = True +gimp.tmp = True +google_chrome = True +google_chrome.cache = True +google_chrome.session = True +google_earth = True +google_earth.temporary_files = True +gpodder = True +gpodder.cache = True +hippo_opensim_viewer = True +hippo_opensim_viewer.cache = True +internet_explorer = True +internet_explorer.cache = True +java = True +java.cache = True +microsoft_edge = True +microsoft_edge.cache = True +microsoft_edge.session = True +miro = True +miro.cache = True +openofficeorg = True +openofficeorg.cache = True +opera = True +opera.cache = True +opera.session = True +palemoon = True +palemoon.cache = True +palemoon.session_restore = True +pidgin = True +pidgin.cache = True +safari = True +safari.cache = True +seamonkey = True +seamonkey.cache = True +secondlife_viewer = True +secondlife_viewer.Cache = True +silverlight = True +silverlight.temp = True +slack = True +slack.cache = True +smartftp = True +smartftp.cache = True +system = True +system.clipboard = True +system.tmp = True +thunderbird = True +thunderbird.cache = True +vuze = True +vuze.cache = True +vuze.temp = True +waterfox = True +waterfox.cache = True +waterfox.session_restore = True +windows_defender = True +windows_defender.temp = True +windows_explorer = True +windows_explorer.run = True +windows_explorer.thumbnails = True +windows_media_player = True +windows_media_player.cache = True +winrar = True +winrar.temp = True +yahoo_messenger = True +yahoo_messenger.cache = True +zoom = True +zoom.cache = True + diff --git a/setup/windows/bin/Everything/Everything.ini b/setup/windows/bin/Everything/Everything.ini new file mode 100644 index 00000000..674fe6d3 --- /dev/null +++ b/setup/windows/bin/Everything/Everything.ini @@ -0,0 +1,6 @@ +[Everything] +run_as_admin=1 +run_in_background=0 +show_in_taskbar=1 +show_tray_icon=1 + diff --git a/setup/windows/bin/Neutron/Neutron.ini b/setup/windows/bin/Neutron/Neutron.ini new file mode 100644 index 00000000..970207e2 --- /dev/null +++ b/setup/windows/bin/Neutron/Neutron.ini @@ -0,0 +1,27 @@ +[Options] +AutoSync=1 +AutoExit=1 +Retry=1 +Server=0 + +[Servers] +0="time-a.nist.gov" +1="time-a.timefreq.bldrdoc.gov" +2="time-b.nist.gov" +3="time-b.timefreq.bldrdoc.gov" +4="time-c.timefreq.bldrdoc.gov" +5="us.pool.ntp.org" +6="1.us.pool.ntp.org" +7="2.us.pool.ntp.org" +8="3.us.pool.ntp.org" +9="pubts1-sj.witime.net" +10="pubts2-sj.witime.net" +11="rolex.usg.edu" +12="timekeeper.isi.edu" +13="nist1.symmetricom.com" +14="clock.via.net" +15="nist1.aol-ca.truetime.com" +16="nist.expertsmi.com" +17="nist1-dc.WiTime.net" +18="nist1-sj.WiTime.net" +19="utcnist.colorado.edu" diff --git a/setup/windows/bin/NotepadPlusPlus/config.xml b/setup/windows/bin/NotepadPlusPlus/config.xml new file mode 100644 index 00000000..957340b8 --- /dev/null +++ b/setup/windows/bin/NotepadPlusPlus/config.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + standard + show + + vertical + hide + + + + no + yes + no + no + yes + yes + no + yes + yes + + + + + no + no + 2 + svn:// cvs:// git:// imap:// irc:// irc6:// ircs:// ldap:// ldaps:// news: telnet:// gopher:// ssh:// sftp:// smb:// skype: snmp:// spotify: steam:// sms: slack:// chrome:// bitcoin: + + + + + + show + + + + + + + + + + + + + yes + + + + + + + + + + + diff --git a/setup/windows/bin/SDIO/sdi.cfg b/setup/windows/bin/SDIO/sdi.cfg index d1bd67fb..7c830b93 100644 --- a/setup/windows/bin/SDIO/sdi.cfg +++ b/setup/windows/bin/SDIO/sdi.cfg @@ -9,7 +9,7 @@ "-finish_upd_cmd:" "-lang:English" -"-theme:YetAnotherSDI" +"-theme:Coax" -hintdelay:250 -license:1 -scale:256 @@ -21,4 +21,4 @@ -uplimit:1 -connections:0 --expertmode -norestorepnt -showdrpnames2 -onlyupdates -preservecfg -novirusalerts \ No newline at end of file +-expertmode -novirusalerts -onlyupdates -preservecfg -showdrpnames2 diff --git a/setup/windows/bin/XMPlay/xmplay.ini b/setup/windows/bin/XMPlay/xmplay.ini new file mode 100644 index 00000000..c001c44d --- /dev/null +++ b/setup/windows/bin/XMPlay/xmplay.ini @@ -0,0 +1,154 @@ +[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=0 +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=0 +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=B0010000190100006305000009030000 +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}%?3{ [%3]} +TitleFormList= +Find= +FindPlay=0 +FindAutoList=0 +FindIn=3 +NoCheckDead=0 +CurTrack=64 +Info=197635 +Skin=plugins\Innocuous (Dark Skies - Purple-80) [L1] +External=464C414300666C6163202D54205449544C453D2531202D54204152544953543D2532202D5420414C42554D3D2533202D5420444154453D2534202D5420545241434B4E554D4245523D2535202D542047454E52453D2536202D5420434F4D4D454E543D2537202D6F20256F202D00666C616300404C414D45006C616D65202D2D616C742D707265736574207374616E64617264202D2D69676E6F72652D7461672D6572726F7273202D2D7474202531202D2D7461202532202D2D746C202533202D2D7479202534202D2D746E202535202D2D7467202536202D2D7463202537202D20256F006D703300864F4747454E43006F6767656E63202D74202531202D61202532202D6C202533202D64202534202D4E202535202D47202536202D6320636F6D6D656E743D2537202D6F20256F202D006F676700C800 +DSP=FF000200100000000000000040410000004100008041000100280000000000000000000000000000000000000000000000000000000000000000000000000000000000 +PluginTypes= +Shortcuts=060000004F0018020C0000004F04180250000000500019025100000050041902500000001300450251000000130445025200000027004D035300000025004B0354000000240047035600000027044D035500000025044B03810000002100490380000000220051038200000023004F03700100002D005203710100002D045203900100005A022C027B0100005100100277010000BF0435025001000026004803580100002604480351010000280050035901000028045003540100002602480354010000280250035501000041021E02560100004902170260010000460221026401000046012102610100004600210262010000460421026301000046062102740100000D001C02750100002000390276010000BF0035027E010000BF023502720100002E005303730100002E045303000200006B004E02010200006D004A02070200006F003503080200006A003702010000004D003202020000004E003102030000004E0431020A00000073013E020B00000073053E0205000000780043020101000070003B020201000071003C020301000072003D020401000073003E020501000074003F0260020000750040020801000043022E02060100006800480207010000620050022101000064004B022201000066004D022301000065004C0224010000670047022501000069004902040000007B005802 +DeviceMode=0000000080BB000002000000020000008A0200000000000003000000 +Track1=0 +CrossFade=1 +MODadlib=0 +WindowX=311 +WindowY=262 +ListSaveOpt=2 +TagCase=1 +UpdateStuff=0 +FindSelect=1 +Big=0 +BringToFore=1 +NoHistory=1 +NoSaveList=1 +NoScanList=1 +NoUserConfig=1 + diff --git a/setup/windows/build.ps1 b/setup/windows/build.ps1 index e73d7ec5..deadf518 100644 --- a/setup/windows/build.ps1 +++ b/setup/windows/build.ps1 @@ -189,6 +189,6 @@ if ($MyInvocation.InvocationName -ne ".") { ## Done ## Pop-Location - $ArgumentList = @("-run", "$Bin\Python\x32\python.exe", "$Bin\Scripts\update_kit.py", "-new_console:n") + $ArgumentList = @("-run", "$Bin\Python\x32\python.exe", "$Bin\Scripts\build_kit_windows.py", "-new_console:n") Start-Process -FilePath "$Bin\ConEmu\ConEmu.exe" -ArgumentList $ArgumentList -verb RunAs } From aa0e35cbaa72e02fa9454f125dcad325dd729fb5 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 13 Oct 2021 17:56:47 -0600 Subject: [PATCH 13/20] Add copy_file() function to wk.io --- scripts/wk/io.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/wk/io.py b/scripts/wk/io.py index 3e2c8d04..8e398da4 100644 --- a/scripts/wk/io.py +++ b/scripts/wk/io.py @@ -61,6 +61,17 @@ def case_insensitive_search(path, item): return real_path +def copy_file(source, dest, overwrite=False): + """Copy file and optionally overwrite the destination.""" + source = case_insensitive_path(source) + dest = pathlib.Path(dest).resolve() + if dest.exists(): + if not overwrite: + raise FileExistsError(f'Refusing to delete file: {dest}') + os.remove(dest) + shutil.copy2(source, dest) + + def delete_empty_folders(path): """Recursively delete all empty folders in path.""" LOG.debug('path: %s', path) From b7d54e1469fc83ee8e5c6ab6d1456b3f520995fd Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 13 Oct 2021 17:57:19 -0600 Subject: [PATCH 14/20] Apply bugfixes --- scripts/wk/os/win.py | 12 ++++++++---- scripts/wk/setup/win.py | 8 +++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/scripts/wk/os/win.py b/scripts/wk/os/win.py index 4d73c21e..92d91525 100644 --- a/scripts/wk/os/win.py +++ b/scripts/wk/os/win.py @@ -219,7 +219,7 @@ def get_installed_ram(as_list=False, raise_exceptions=False): if raise_exceptions: if RAM_OK > mem.total >= RAM_WARNING: raise GenericWarning(mem_str) - if mem.total > RAM_WARNING: + if mem.total < RAM_WARNING: raise GenericError(mem_str) # Done @@ -276,6 +276,11 @@ def get_raw_disks(): json_data = get_json_from_command(cmd) raw_disks = [] + # Bail early + if not json_data: + # No RAW disks detected + return raw_disks + # Fix JSON if only one disk was detected if isinstance(json_data, dict): json_data = [json_data] @@ -595,7 +600,7 @@ def is_secure_boot_enabled(raise_exceptions=False, show_alert=False): # Command completed enabled = 'True' in proc.stdout if 'False' in proc.stdout: - msg_error = 'ERROR' + msg_error = 'DISABLED' else: msg_warning = 'UNKNOWN' @@ -603,9 +608,8 @@ def is_secure_boot_enabled(raise_exceptions=False, show_alert=False): for msg, exc in ((msg_error, GenericError), (msg_warning, GenericWarning)): if not msg: continue - msg = f'Secure Boot {msg}' if show_alert: - show_alert_box(msg) + show_alert_box(f'Secure Boot {msg}') if raise_exceptions: raise exc(msg) break diff --git a/scripts/wk/setup/win.py b/scripts/wk/setup/win.py index eac9b0f7..bfe076fb 100644 --- a/scripts/wk/setup/win.py +++ b/scripts/wk/setup/win.py @@ -645,8 +645,10 @@ def install_firefox(): profile then it is reverted so the original existing profile instead. """ current_default_profile = None - firefox_exe = f'{os.environ["PROGRAMFILES"]}/Mozilla Firefox/firefox.exe' - profiles_ini = case_insensitive_path( + firefox_exe = get_path_obj( + f'{os.environ["PROGRAMFILES"]}/Mozilla Firefox/firefox.exe', + ) + profiles_ini = get_path_obj( f'{os.environ["APPDATA"]}/Mozilla/Firefox/profiles.ini', ) program_path_32bit_exists = False @@ -673,7 +675,7 @@ def install_firefox(): run_tool('Firefox', 'Firefox', '/S', download=True) # Open Firefox to force profiles.ini update - popen_program(firefox_exe) + popen_program([firefox_exe]) sleep(5) kill_procs('firefox.exe', force=True) From ccd6933f51bf114bc2800f03f20b80708e72976d Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 13 Oct 2021 17:59:46 -0600 Subject: [PATCH 15/20] Add Windows Kit build sections --- scripts/build_kit_windows.py | 20 ++ scripts/wk/cfg/music.py | 3 + scripts/wk/kit/__init__.py | 3 + scripts/wk/kit/build_win.py | 518 +++++++++++++++++++++++++++++++++++ setup/windows/build.ps1 | 3 + 5 files changed, 547 insertions(+) create mode 100644 scripts/build_kit_windows.py create mode 100644 scripts/wk/kit/build_win.py diff --git a/scripts/build_kit_windows.py b/scripts/build_kit_windows.py new file mode 100644 index 00000000..42eafc38 --- /dev/null +++ b/scripts/build_kit_windows.py @@ -0,0 +1,20 @@ +"""Wizard Kit: Build Kit (Windows).""" +# vim: sts=2 sw=2 ts=2 + +import os +import sys + +os.chdir(os.path.dirname(os.path.realpath(__file__))) +sys.path.append(os.getcwd()) +import wk # pylint: disable=wrong-import-position + + +if __name__ == '__main__': + try: + wk.kit.build.build_kit() + except KeyboardInterrupt: + wk.std.abort() + except SystemExit: + raise + except: #pylint: disable=bare-except + wk.std.major_exception() diff --git a/scripts/wk/cfg/music.py b/scripts/wk/cfg/music.py index aa16ddfd..9faedbd4 100644 --- a/scripts/wk/cfg/music.py +++ b/scripts/wk/cfg/music.py @@ -65,6 +65,9 @@ MUSIC_SNES = ( 'yi', 'zamn', ) +MUSIC_SNES_BAD = { + 'ct': ['ct-s*', 'ct-v*'], + } if __name__ == '__main__': diff --git a/scripts/wk/kit/__init__.py b/scripts/wk/kit/__init__.py index c6eedd73..38cc97fb 100644 --- a/scripts/wk/kit/__init__.py +++ b/scripts/wk/kit/__init__.py @@ -7,3 +7,6 @@ from . import tools if platform.system() == 'Linux': from . import ufd + +if platform.system() == 'Windows': + from . import build_win as build diff --git a/scripts/wk/kit/build_win.py b/scripts/wk/kit/build_win.py new file mode 100644 index 00000000..f2dea53c --- /dev/null +++ b/scripts/wk/kit/build_win.py @@ -0,0 +1,518 @@ +"""WizardKit: Build Kit Functions (Windows) + +NOTE: This script is meant to be called from within a new kit in ConEmu. +""" +# vim: sts=2 sw=2 ts=2 + +import logging +import os +import re + +from wk.cfg.launchers import LAUNCHERS +from wk.cfg.main import ARCHIVE_PASSWORD, KIT_NAME_FULL +from wk.cfg.music import MUSIC_MOD, MUSIC_SNES, MUSIC_SNES_BAD +from wk.cfg.sources import SOURCES +from wk.exe import popen_program, run_program, wait_for_procs +from wk.io import copy_file, delete_item, recursive_copy, rename_item +from wk.kit.tools import ( + download_file, + extract_archive, + find_kit_dir, + get_tool_path, + ) +from wk.log import update_log_path +from wk.std import ( + GenericError, + TryAndPrint, + clear_screen, + pause, + print_info, + print_success, + set_title, + sleep, + ) + + +# STATIC VARIABLES +LOG = logging.getLogger(__name__) +BIN_DIR = find_kit_dir('.bin') +CBIN_DIR = find_kit_dir('.cbin') +INSTALLERS_DIR = BIN_DIR.parent.joinpath('Installers') +ROOT_DIR = BIN_DIR.parent +TMP_DIR = BIN_DIR.joinpath('tmp') +IN_CONEMU = 'ConEmuPID' in os.environ +LAUNCHER_TEMPLATE = BIN_DIR.joinpath('Scripts/Launcher_Template.cmd') +REGEX_SDIO_NETWORK_DRIVERS = re.compile( + r'DP_(WLAN|LAN_(Intel|Others|Realtek-NT))', + re.IGNORECASE, + ) +REGEX_TORRENT_INDICES = re.compile(r'^(?P\d+)\|(?P.*)') +SEVEN_ZIP = get_tool_path('7-Zip', '7za') +SEVEN_ZIP_FULL = get_tool_path('7-Zip', '7z') # TODO: Replace with unrar from Pypi? +WIDTH = 50 + + +# Functions +def compress_cbin_dirs(): + """Compress CBIN_DIR items using ARCHIVE_PASSWORD.""" + current_dir = os.getcwd() + for item in CBIN_DIR.iterdir(): + os.chdir(item) + cmd = [ + SEVEN_ZIP, + 'a', '-t7z', '-mx=9', + f'-p{ARCHIVE_PASSWORD}', + '-bso0', '-bse0', '-bsp0', + CBIN_DIR.joinpath(f'{item.name}.7z'), + '*', + ] + run_program(cmd) + os.chdir(current_dir) + delete_item(item, force=True, ignore_errors=True) + + +def delete_from_temp(item_path): + """Delete item from temp.""" + delete_item(TMP_DIR.joinpath(item_path), force=True, ignore_errors=True) + + +def download_to_temp(filename, source_url): + """Download file to temp dir, returns pathlib.Path.""" + out_path = TMP_DIR.joinpath(filename) + download_file(out_path, source_url) + return out_path + + +def extract_to_bin(archive, folder): + """Extract archive to folder under BIN_DIR.""" + out_path = BIN_DIR.joinpath(folder) + extract_archive(archive, out_path) + + +def generate_launcher(section, name, options): + """Generate launcher script.""" + dest = ROOT_DIR.joinpath(f'{section+"/" if section else ""}{name}.cmd') + out_text = [] + to_update = {} + + # Build list of updates + for key, value in options.items(): + if key == 'Extra Code': + to_update['rem EXTRA_CODE'] = '\n'.join(value) + elif key.startswith('L_'): + to_update[f'set {key}='] = f'set {key}={value}' + + # Build launcher script + for line in LAUNCHER_TEMPLATE.read_text(encoding='utf-8').splitlines(): + line = line.strip() # We'll let Python handle CRLF endings + if line in to_update: + out_text.append(to_update[line]) + else: + out_text.append(line) + + # Write file + dest.parent.mkdir(exist_ok=True) + dest.write_text('\n'.join(out_text), encoding='utf-8') + + +# Download functions +def download_adobe_reader(): + """Download Adobe Reader.""" + out_path = INSTALLERS_DIR.joinpath('Adobe Reader DC.exe') + download_file(out_path, SOURCES['Adobe Reader DC']) + + +def download_aida64(): + """Download AIDA64.""" + archive = download_to_temp('AIDA64.zip', SOURCES['AIDA64']) + extract_to_bin(archive, 'AIDA64') + delete_from_temp('AIDA64.zip') + + +def download_autoruns(): + """Download Autoruns.""" + for item in ('Autoruns32', 'Autoruns64'): + out_path = BIN_DIR.joinpath(f'Sysinternals/{item}.exe') + download_file(out_path, SOURCES[item]) + + +def download_bleachbit(): + """Download BleachBit.""" + out_path = BIN_DIR.joinpath('BleachBit') + archive = download_to_temp('BleachBit.zip', SOURCES['BleachBit']) + extract_archive(archive, TMP_DIR) + for item in TMP_DIR.joinpath('BleachBit-Portable').iterdir(): + try: + rename_item(item, out_path.joinpath(item.name)) + except FileExistsError: + # Ignore and use our defaults + pass + delete_from_temp('BleachBit-Portable') + delete_from_temp('BleachBit.zip') + + +def download_bluescreenview(): + """Download BlueScreenView.""" + archive_32 = download_to_temp( + 'bluescreenview32.zip', SOURCES['BlueScreenView32'], + ) + archive_64 = download_to_temp( + 'bluescreenview64.zip', SOURCES['BlueScreenView64'], + ) + out_path = BIN_DIR.joinpath('BlueScreenView') + extract_archive(archive_64, out_path, 'BlueScreenView.exe') + rename_item( + out_path.joinpath('BlueScreenView.exe'), + out_path.joinpath('BlueScreenView64.exe'), + ) + extract_archive(archive_32, out_path) + delete_from_temp('bluescreenview32.zip') + delete_from_temp('bluescreenview64.zip') + + +def download_erunt(): + """Download ERUNT.""" + archive = download_to_temp('erunt.zip', SOURCES['ERUNT']) + extract_to_bin(archive, 'ERUNT') + delete_from_temp('erunt.zip') + + +def download_everything(): + """Download Everything.""" + archive_32 = download_to_temp('everything32.zip', SOURCES['Everything32']) + archive_64 = download_to_temp('everything64.zip', SOURCES['Everything64']) + out_path = BIN_DIR.joinpath('Everything') + extract_archive(archive_64, out_path, 'Everything.exe') + rename_item( + out_path.joinpath('Everything.exe'), + out_path.joinpath('Everything64.exe'), + ) + extract_archive(archive_32, out_path) + delete_from_temp('everything32.zip') + delete_from_temp('everything64.zip') + + +def download_fastcopy(): + """Download FastCopy.""" + installer = download_to_temp('FastCopyInstaller.exe', SOURCES['FastCopy']) + out_path = BIN_DIR.joinpath('FastCopy') + tmp_path = TMP_DIR.joinpath('FastCopy64') + run_program([installer, '/NOSUBDIR', f'/DIR={out_path}', '/EXTRACT32']) + run_program([installer, '/NOSUBDIR', f'/DIR={tmp_path}', '/EXTRACT64']) + rename_item( + tmp_path.joinpath('FastCopy.exe'), + out_path.joinpath('FastCopy64.exe'), + ) + delete_from_temp('FastCopy64') + delete_from_temp('FastCopyInstaller.exe') + + +def download_furmark(): + """Download FurMark.""" + installer = download_to_temp('FurMark_Setup.exe', SOURCES['FurMark']) + out_path = BIN_DIR.joinpath('FurMark') + tmp_path = TMP_DIR.joinpath('FurMarkInstall') + run_program([installer, f'/DIR={tmp_path}', '/SILENT']) + recursive_copy(f'{tmp_path}/', f'{out_path}/') + delete_from_temp('FurMark_Setup.exe') + try: + uninstaller = list(tmp_path.glob('unins*exe'))[0] + run_program([uninstaller, '/SILENT']) + except IndexError as _e: + raise GenericError('Failed to remove temporary FurMark install') from _e + delete_from_temp('FurMarkInstall') + + +def download_hwinfo(): + """Download HWiNFO.""" + archive = download_to_temp('HWiNFO.zip', SOURCES['HWiNFO']) + extract_to_bin(archive, 'HWiNFO') + delete_from_temp('HWiNFO.zip') + + +def download_iobit_uninstaller(): + """Download IOBit Uninstaller.""" + installer = CBIN_DIR.joinpath('IObitUninstallerPortable.exe') + download_file(installer, SOURCES['IOBit Uninstaller']) + popen_program([installer]) + sleep(1) + wait_for_procs('IObitUninstallerPortable.exe') + delete_item(installer) + + +def download_macs_fan_control(): + """Download Macs Fan Control.""" + out_path = INSTALLERS_DIR.joinpath('Macs Fan Control.exe') + download_file(out_path, SOURCES['Macs Fan Control']) + + +def download_libreoffice(): + """Download LibreOffice.""" + for arch in 32, 64: + out_path = INSTALLERS_DIR.joinpath(f'LibreOffice{arch}.msi') + download_file(out_path, SOURCES[f'LibreOffice{arch}']) + + +def download_neutron(): + """Download Neutron.""" + archive = download_to_temp('neutron.zip', SOURCES['Neutron']) + out_path = BIN_DIR.joinpath('Neutron') + extract_archive(archive, out_path, '-aos', mode='e') + delete_from_temp('neutron.zip') + + +def download_notepad_plus_plus(): + """Download Notepad++.""" + archive = download_to_temp('npp.7z', SOURCES['Notepad++']) + extract_to_bin(archive, 'NotepadPlusPlus') + out_path = BIN_DIR.joinpath('NotepadPlusPlus') + rename_item( + out_path.joinpath('notepad++.exe'), + out_path.joinpath('notepadplusplus.exe'), + ) + delete_from_temp('npp.7z') + + +def download_putty(): + """Download PuTTY.""" + archive = download_to_temp('putty.zip', SOURCES['PuTTY']) + extract_to_bin(archive, 'PuTTY') + delete_from_temp('putty.zip') + + +def download_snappy_driver_installer_origin(): + """Download Snappy Driver Installer Origin.""" + archive = download_to_temp('aria2.zip', SOURCES['Aria2']) + aria2c = TMP_DIR.joinpath('aria2/aria2c.exe') + extract_archive(archive, aria2c.parent, mode='e') + index_list = [] + tmp_path = TMP_DIR.joinpath('SDIO') + out_path = BIN_DIR.joinpath('SDIO') + torrent_file = download_to_temp('SDIO.torrent', SOURCES['SDIO Torrent']) + + # Build file selection list + proc = run_program([aria2c, '--show-files', torrent_file]) + for line in proc.stdout.splitlines(): + match = REGEX_TORRENT_INDICES.match(line.strip()) + if not match: + continue + if 'drivers' not in match.group('path').lower(): + index_list.append(match.group('index')) + elif REGEX_SDIO_NETWORK_DRIVERS.search(match.group('path')): + index_list.append(match.group('index')) + + # Download + cmd = [ + aria2c, + f'--select-file={",".join(index_list)}', + f'--dir={tmp_path}', + '--seed-time=0', + torrent_file, + ] + if IN_CONEMU: + cmd.append('-new_console:n') + cmd.append('-new_console:s33V') + popen_program(cmd, cwd=aria2c.parent) + sleep(1) + wait_for_procs('aria2c.exe') + else: + run_program(cmd) + + # Move into place + placeholder_archive = TMP_DIR.joinpath('fake.7z') + placeholder_archive.with_name('fake').touch() + cmd = [ + SEVEN_ZIP, + 'a', '-t7z', '-mx=9', + '-bso0', '-bse0', '-bsp0', + placeholder_archive, + placeholder_archive.with_name('fake'), + ] + run_program(cmd) + for item in tmp_path.joinpath('SDIO_Update').iterdir(): + name = item.name + if name.startswith('SDIO_') and name.endswith('.exe'): + name = f'SDIO{"64" if "64" in name else ""}.exe' + rename_item(item, out_path.joinpath(name)) + + # Create placeholder archives (except for network drivers) + for item in out_path.joinpath('indexes/SDI').glob('*bin'): + archive = out_path.joinpath(f'drivers/{item.stem}.7z') + if not REGEX_SDIO_NETWORK_DRIVERS.search(archive.name): + copy_file(placeholder_archive, archive, overwrite=True) + + # Cleanup + delete_from_temp('SDIO') + delete_from_temp('SDIO.torrent') + delete_from_temp('aria2') + delete_from_temp('aria2.zip') + delete_from_temp('fake') + delete_from_temp('fake.7z') + + +def download_testdisk(): + """Download TestDisk.""" + archive = download_to_temp('testdisk_wip.zip', SOURCES['TestDisk']) + out_path = BIN_DIR.joinpath('TestDisk') + tmp_path = TMP_DIR.joinpath('TestDisk') + extract_archive(archive, tmp_path) + rename_item(tmp_path.joinpath('testdisk-7.2-WIP'), out_path) + delete_from_temp('testdisk_wip.zip') + + +def download_wiztree(): + """Download WizTree.""" + archive = download_to_temp('wiztree.zip', SOURCES['WizTree']) + extract_to_bin(archive, 'WizTree') + delete_from_temp('wiztree.zip') + + +def download_xmplay(): + """Download XMPlay.""" + archives = [ + download_to_temp('xmplay.zip', SOURCES['XMPlay']), + download_to_temp('xmp-7z.zip', SOURCES['XMPlay 7z']), + download_to_temp('xmp-gme.zip', SOURCES['XMPlay Game']), + download_to_temp('xmp-rar.zip', SOURCES['XMPlay RAR']), + download_to_temp('Innocuous.zip', SOURCES['XMPlay Innocuous']), + ] + + # Extract XMPlay and plugins + extract_to_bin(archives.pop(0), 'XMPlay') + for archive in archives: + args = [archive, BIN_DIR.joinpath('XMPlay/plugins')] + if archive.name == 'Innocuous.zip': + args.append( + 'Innocuous (v1.4)/Innocuous (Hue Shifted)/' + 'Innocuous (Dark Skies - Purple-80) [L1].xmpskin' + ) + extract_archive(*args, mode='e') + + # Cleanup + delete_from_temp('xmplay.zip') + delete_from_temp('xmp-7z.zip') + delete_from_temp('xmp-gme.zip') + delete_from_temp('xmp-rar.zip') + delete_from_temp('Innocuous.zip') + +def download_xmplay_music(): + """Download XMPlay Music.""" + music_tmp = TMP_DIR.joinpath('music') + music_tmp.mkdir(exist_ok=True) + current_dir = os.getcwd() + os.chdir(music_tmp) + url_mod = 'https://api.modarchive.org/downloads.php' + url_rsn = 'http://snesmusic.org/v2/download.php' + + # Download music + for song_id, song_name in MUSIC_MOD: + download_file( + music_tmp.joinpath(f'MOD/{song_name}'), + f'{url_mod}?moduleid={song_id}#{song_name}', + ) + for game in MUSIC_SNES: + download_file( + music_tmp.joinpath(f'SNES/{game}.rsn'), + f'{url_rsn}?spcNow={game}', + ) + + # Extract SNES archives + for item in music_tmp.joinpath('SNES').iterdir(): + cmd = [ + SEVEN_ZIP_FULL, + 'x', item, f'-oSNES\\{item.stem}', + '-bso0', '-bse0', '-bsp0', + ] + run_program(cmd) + delete_item(item) + + # Remove 7-Zip (Full) from kit + delete_item(SEVEN_ZIP_FULL) + delete_item(SEVEN_ZIP_FULL.with_name('7z.dll')) + + # Remove bad songs + for game, globs in MUSIC_SNES_BAD.items(): + for glob in globs: + for item in music_tmp.joinpath(f'SNES/{game}').glob(glob): + delete_item(item) + + # Compress music + cmd = [ + SEVEN_ZIP, + 'a', '-t7z', '-mx=9', + '-bso0', '-bse0', '-bsp0', + BIN_DIR.joinpath('XMPlay/music.7z'), + 'MOD', 'SNES', + ] + run_program(cmd) + os.chdir(current_dir) + + # Cleanup + delete_from_temp('music') + + +# "Main" Function +def build_kit(): + """Build Kit.""" + update_log_path(dest_name='Build Tool', timestamp=True) + title = f'{KIT_NAME_FULL}: Build Tool' + clear_screen() + set_title(title) + print_info(title) + print('') + + # Set up TryAndPrint + try_print = TryAndPrint() + try_print.width = WIDTH + try_print.verbose = True + for error in ('CalledProcessError', 'FileNotFoundError'): + try_print.add_error(error) + + # Download + try_print.run('Adobe Reader...', download_adobe_reader) + try_print.run('AIDA64...', download_aida64) + try_print.run('Autoruns...', download_autoruns) + try_print.run('BleachBit...', download_bleachbit) + try_print.run('BlueScreenView...', download_bluescreenview) + try_print.run('ERUNT...', download_erunt) + try_print.run('Everything...', download_everything) + try_print.run('FastCopy...', download_fastcopy) + try_print.run('FurMark...', download_furmark) + try_print.run('HWiNFO...', download_hwinfo) + try_print.run('IOBit Uninstaller...', download_iobit_uninstaller) + try_print.run('LibreOffice...', download_libreoffice) + try_print.run('Macs Fan Control...', download_macs_fan_control) + try_print.run('Neutron...', download_neutron) + try_print.run('Notepad++...', download_notepad_plus_plus) + try_print.run('PuTTY...', download_putty) + try_print.run('Snappy Driver Installer...', download_snappy_driver_installer_origin) + try_print.run('TestDisk...', download_testdisk) + try_print.run('WizTree...', download_wiztree) + try_print.run('XMPlay...', download_xmplay) + try_print.run('XMPlay Music...', download_xmplay_music) + + # Pause + print('', flush=True) + pause('Please review and press Enter to continue...') + + # Compress .cbin + try_print.run('Compress cbin...', compress_cbin_dirs) + + # Generate launcher scripts + print_success('Generating launchers') + for section, launchers in sorted(LAUNCHERS.items()): + print_info(f' {section if section else "(Root)"}') + for name, options in sorted(launchers.items()): + try_print.run( + f' {name}...', generate_launcher, + section, name, options, + ) + + # Done + print('') + print('Done.') + pause('Press Enter to exit...') + + +if __name__ == '__main__': + print("This file is not meant to be called directly.") diff --git a/setup/windows/build.ps1 b/setup/windows/build.ps1 index deadf518..1d7492d5 100644 --- a/setup/windows/build.ps1 +++ b/setup/windows/build.ps1 @@ -125,6 +125,7 @@ if ($MyInvocation.InvocationName -ne ".") { ## Extract ## # 7-Zip + ## NOTE: 7z.exe & 7z.dll are left for build_kit_windows.py, they'll be removed by it Write-Host "Extracting: 7-Zip" try { $ArgumentList = @("/a", "$Temp\7z-installer.msi", "TARGETDIR=$Temp\7zi", "/qn") @@ -136,6 +137,8 @@ if ($MyInvocation.InvocationName -ne ".") { "-x!x64\*.dll", "-x!Far", "-x!*.dll") Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait Start-Sleep 1 + Move-Item "$Temp\7zi\Files\7-Zip\7z.exe" "$Bin\7-Zip\7z.exe" + Move-Item "$Temp\7zi\Files\7-Zip\7z.dll" "$Bin\7-Zip\7z.dll" Move-Item "$Bin\7-Zip\x64\7za.exe" "$Bin\7-Zip\7za64.exe" Remove-Item "$Bin\7-Zip\x64" -Recurse Remove-Item "$Temp\7z*" -Recurse 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 16/20] 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 From fa6183379e7a3c7c4d5db8fedb2f8ae618550ea1 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 13 Oct 2021 20:48:41 -0600 Subject: [PATCH 17/20] Update macOS build script and move to setup dir --- setup/build_linux | 2 +- .../{macos/update-base-image => build_macos} | 58 +++++++++++++------ 2 files changed, 42 insertions(+), 18 deletions(-) rename setup/{macos/update-base-image => build_macos} (67%) diff --git a/setup/build_linux b/setup/build_linux index 2c87d84d..5c9b6432 100755 --- a/setup/build_linux +++ b/setup/build_linux @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # ## Wizard Kit: Live Linux Build Tool diff --git a/setup/macos/update-base-image b/setup/build_macos similarity index 67% rename from setup/macos/update-base-image rename to setup/build_macos index b62f75d6..55bdc127 100755 --- a/setup/macos/update-base-image +++ b/setup/build_macos @@ -1,12 +1,36 @@ #!/usr/bin/env bash # -## Update BaseImage for use as WK +## WizardKit: Live macOS Build Tool set -o errexit set -o errtrace set -o nounset set -o pipefail +# Show usage if necessary +if [[ "${1:-}" =~ "-h|--help" || ! -e "${1:-}" ]]; then + echo "Usage: build_macos [OPTIONS] " + echo "" + echo "Options:" + echo " -h --help Show usage" + exit +fi + +# Safety Check +LINUX_DIR="linux" +MACOS_DIR="macos" +ROOT_DIR=".." +TOOLS_TO_CHECK=(memtest mprime smc sysbench) +for tool in "${TOOLS_TO_CHECK[@]}"; do + if [[ ! -e "/usr/local/bin/$tool" ]]; then + echo "Missing tool(s) detected" + echo " Installing dependencies in 30 seconds, enter CTRL+c to abort." + sleep 30 + "${MACOS_DIR}/install-deps" + exit + fi +done + # Prep echo "Initializing..." BASE_IMAGE="$1" @@ -14,7 +38,7 @@ IMAGE_DEV="$(hdiutil attach -mountpoint /Volumes/BaseSystem "${BASE_IMAGE}" -nob OS_NAME="$(ls /Volumes/BaseSystem | grep -E 'OS X|macOS' | sed -E 's/Install (OS X|macOS) (.*)\.app/\2/')" OS_VERSION="$(defaults read /Volumes/BaseSystem/System/Library/CoreServices/SystemVersion ProductVersion)" OUT_NAME="${HOME}/Desktop/WK ${OS_NAME} ($(date +"%Y-%m-%d"))" -TIMEZONE="$(fgrep LINUX_TIME_ZONE ../../scripts/wk/cfg/main.py | cut -d '=' -f 2 | sed "s/'//g")" +TIMEZONE="$(fgrep LINUX_TIME_ZONE "${ROOT_DIR}/scripts/wk/cfg/main.py" | cut -d '=' -f 2 | sed "s/'//g")" WK_PATH="/Volumes/1201_UFD" # Convert to a 4 GB R/W image @@ -34,11 +58,11 @@ rm -R "${WK_PATH}"/Install*.app # Update Utilities menu echo "Updating Utilities menu..." if [[ "${OS_VERSION:0:5}" == "10.11" ]]; then - cp -a "El Capitan/Utilities.plist" "${WK_PATH}/System/Installation/CDIS/OS X Utilities.app/Contents/Resources/Utilities.plist" + cp -a "${MACOS_DIR}/El Capitan/Utilities.plist" "${WK_PATH}/System/Installation/CDIS/OS X Utilities.app/Contents/Resources/Utilities.plist" elif [[ "${OS_VERSION:0:5}" == "10.13" ]]; then - cp -a "High Sierra/Utilities.plist" "${WK_PATH}/System/Installation/CDIS/macOS Utilities.app/Contents/Resources/Utilities.plist" + cp -a "${MACOS_DIR}/High Sierra/Utilities.plist" "${WK_PATH}/System/Installation/CDIS/macOS Utilities.app/Contents/Resources/Utilities.plist" elif [[ "${OS_VERSION:0:5}" == "10.15" ]]; then - cp -a "Catalina/Utilities.plist" "${WK_PATH}/System/Installation/CDIS/macOS Utilities.app/Contents/Resources/Utilities.plist" + cp -a "${MACOS_DIR}/Catalina/Utilities.plist" "${WK_PATH}/System/Installation/CDIS/macOS Utilities.app/Contents/Resources/Utilities.plist" fi # Dropbear (SSH) @@ -48,7 +72,7 @@ for t in rsa dss ecdsa ed25519; do dropbearkey -t "${t}" -f "${WK_PATH}/etc/dropbear/dropbear_${t}_host_key" done ln -s /Volumes/RAM_Disk/.ssh "${WK_PATH}/var/root"/ -cp -a ../linux/authorized_keys "${WK_PATH}/.authorized_keys" +cp -a "${LINUX_DIR}/authorized_keys" "${WK_PATH}/.authorized_keys" # Homebrew echo "Installing Hombrew..." @@ -70,7 +94,7 @@ cp -a /usr/bin/tput "${WK_PATH}/usr/bin"/ # Terminal echo "Installing Terminal Preferences..." -rsync -aS com.apple.Terminal.plist "${WK_PATH}/var/root/Library/Preferences"/ +cp -a "${MACOS_DIR}/com.apple.Terminal.plist" "${WK_PATH}/var/root/Library/Preferences"/ # Timezones echo "Installing timezones..." @@ -86,7 +110,7 @@ fi # zsh echo "Installing zsh..." cp -a /bin/zsh "${WK_PATH}/bin"/ -cp -a zshenv "${WK_PATH}/etc"/ +cp -a "${MACOS_DIR}/zshenv" "${WK_PATH}/etc"/ rsync -aS /usr/lib/zsh "${WK_PATH}/usr/lib"/ rsync -aS /usr/share/zsh "${WK_PATH}/usr/share"/ rsync -aS /usr/local/share/zsh "${WK_PATH}/usr/local/share"/ @@ -98,12 +122,12 @@ sudo chown 0:0 "${WK_PATH}/usr/sbin/memtest" sudo chmod 755 "${WK_PATH}/usr/sbin/memtest" # Misc -cp -a ../linux/known_networks "${WK_PATH}/.known_networks" +cp -a "${LINUX_DIR}/known_networks" "${WK_PATH}/.known_networks" cp -a /usr/bin/rsync "${WK_PATH}/usr/bin"/ cp -a /usr/sbin/networksetup "${WK_PATH}/usr/sbin"/ -cp -a aliases "${WK_PATH}/.aliases" -cp -a bashrc "${WK_PATH}/etc/profile" -cp -a vimrc "${WK_PATH}/.vimrc" +cp -a "${MACOS_DIR}/aliases" "${WK_PATH}/.aliases" +cp -a "${MACOS_DIR}/bashrc" "${WK_PATH}/etc/profile" +cp -a "${MACOS_DIR}/vimrc" "${WK_PATH}/.vimrc" if [[ "${OS_VERSION:3:2}" == "11" ]]; then cp -a /usr/bin/fgrep "${WK_PATH}/usr/bin"/ cp -a /usr/bin/locale "${WK_PATH}/usr/bin"/ @@ -116,13 +140,13 @@ fi echo "Installing WizardKit env..." touch "${WK_PATH}/.wk-live-macos" ln -s /Volumes/RAM_Disk/Logs "${WK_PATH}/var/root/Logs" -cp -a ../linux/profile_base/airootfs/etc/skel/.tmux.conf "${WK_PATH}/etc/tmux.conf" +cp -a "${LINUX_DIR}/profile_base/airootfs/etc/skel/.tmux.conf" "${WK_PATH}/etc/tmux.conf" rsync -aS /usr/bin/{env,killall} "${WK_PATH}/usr/bin"/ -rsync -aS live-macos-startup ../../scripts/ "${WK_PATH}/usr/local/bin"/ -if [[ -f "../../images/macOS-${OS_VERSION:0:5}.png" ]]; then - cp -a "../../images/macOS-${OS_VERSION:0:5}.png" "${WK_PATH}/usr/local/wallpaper.png" +rsync -aS "${MACOS_DIR}/live-macos-startup" "${ROOT_DIR}/scripts/" "${WK_PATH}/usr/local/bin"/ +if [[ -f "${ROOT_DIR}/images/macOS-${OS_VERSION:0:5}.png" ]]; then + cp -a "${ROOT_DIR}/images/macOS-${OS_VERSION:0:5}.png" "${WK_PATH}/usr/local/wallpaper.png" else - cp -a ../../images/macOS.png "${WK_PATH}/usr/local/wallpaper.png" + cp -a "${ROOT_DIR}/images/macOS.png" "${WK_PATH}/usr/local/wallpaper.png" fi # Unmount sparsebundle From e750a9c66d590e667ab9d15347e9c3ca0d3de55f Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 13 Oct 2021 20:50:40 -0600 Subject: [PATCH 18/20] Update script descriptions for consistency --- scripts/Launch.cmd | 4 ++-- scripts/Launcher_Template.cmd | 4 ++-- scripts/apple-fans | 2 +- scripts/auto_repairs.py | 2 +- scripts/auto_setup.py | 2 +- scripts/build-ufd | 2 +- scripts/build_kit_windows.py | 2 +- scripts/ddrescue-tui | 2 +- scripts/ddrescue-tui.py | 2 +- scripts/echo-and-hold | 2 +- scripts/get_raw_disks.ps1 | 2 +- scripts/hw-diags | 2 +- scripts/hw-diags.py | 2 +- scripts/hw-sensors | 2 +- scripts/init_client_dir.cmd | 2 +- scripts/launch-in-tmux | 2 +- scripts/mount-all-volumes | 2 +- scripts/mount-backup-shares | 2 +- scripts/mount-raw-image | 2 +- scripts/msword-search | 2 +- scripts/pacinit | 2 +- scripts/remount-rw | 2 +- scripts/unmount-backup-shares | 2 +- scripts/upload-logs | 2 +- setup/build_linux | 2 +- setup/build_pe.cmd | 4 ++-- setup/build_windows.cmd | 4 ++-- setup/linux/profile_base/airootfs/etc/skel/.zshrc | 2 +- setup/windows/build.ps1 | 6 +++--- 29 files changed, 35 insertions(+), 35 deletions(-) diff --git a/scripts/Launch.cmd b/scripts/Launch.cmd index ade2f35a..42c8dd76 100644 --- a/scripts/Launch.cmd +++ b/scripts/Launch.cmd @@ -1,4 +1,4 @@ -:: Wizard Kit: Wrapper for launching programs and scripts. +:: WizardKit: Wrapper for launching programs and scripts. :: :: Some features: :: * If the OS is 64-bit then the WorkingDir is scanned for a 64-bit version of the programs @@ -10,7 +10,7 @@ if defined DEBUG (@echo on) :Init setlocal EnableDelayedExpansion -title Wizard Kit: Launcher +title WizardKit: Launcher pushd "%~dp0" call :FindBin call :DeQuote L_ITEM diff --git a/scripts/Launcher_Template.cmd b/scripts/Launcher_Template.cmd index 86ddd9be..dd200542 100644 --- a/scripts/Launcher_Template.cmd +++ b/scripts/Launcher_Template.cmd @@ -1,4 +1,4 @@ -:: Wizard Kit: Launcher Script :: +:: WizardKit: Launcher Script :: :: :: This script works by setting env variables and then calling Launch.cmd :: which inherits the variables. This bypasses batch file argument parsing @@ -7,7 +7,7 @@ :Init setlocal EnableDelayedExpansion -title Wizard Kit: Launcher +title WizardKit: Launcher call :CheckFlags %* call :FindBin call :SetTitle Launcher diff --git a/scripts/apple-fans b/scripts/apple-fans index de8e56e6..9f58557a 100755 --- a/scripts/apple-fans +++ b/scripts/apple-fans @@ -1,6 +1,6 @@ #!/bin/bash # -## Wizard Kit: Apple fan speed tool +## WizardKit: Apple fan speed tool SMCPATH="/sys/devices/platform/applesmc.768" SET_MAX="True" diff --git a/scripts/auto_repairs.py b/scripts/auto_repairs.py index c4cdb339..66db3732 100644 --- a/scripts/auto_repairs.py +++ b/scripts/auto_repairs.py @@ -1,4 +1,4 @@ -"""Wizard Kit: Auto Repair Tool""" +"""WizardKit: Auto Repair Tool""" # vim: sts=2 sw=2 ts=2 import os diff --git a/scripts/auto_setup.py b/scripts/auto_setup.py index b8118bc0..7a676f94 100644 --- a/scripts/auto_setup.py +++ b/scripts/auto_setup.py @@ -1,4 +1,4 @@ -"""Wizard Kit: Auto System Setup Tool""" +"""WizardKit: Auto System Setup Tool""" # vim: sts=2 sw=2 ts=2 import os diff --git a/scripts/build-ufd b/scripts/build-ufd index 237c6691..0159a3be 100755 --- a/scripts/build-ufd +++ b/scripts/build-ufd @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Wizard Kit: Build UFD Tool""" +"""WizardKit: Build UFD Tool""" # vim: sts=2 sw=2 ts=2 import wk diff --git a/scripts/build_kit_windows.py b/scripts/build_kit_windows.py index 42eafc38..e726dfef 100644 --- a/scripts/build_kit_windows.py +++ b/scripts/build_kit_windows.py @@ -1,4 +1,4 @@ -"""Wizard Kit: Build Kit (Windows).""" +"""WizardKit: Build Kit (Windows).""" # vim: sts=2 sw=2 ts=2 import os diff --git a/scripts/ddrescue-tui b/scripts/ddrescue-tui index c5fbbc4b..5232cf0a 100755 --- a/scripts/ddrescue-tui +++ b/scripts/ddrescue-tui @@ -1,6 +1,6 @@ #!/bin/bash # -## Wizard Kit: ddrescue TUI Launcher +## WizardKit: ddrescue TUI Launcher __OS_NAME="$(uname -s)" if [[ "$__OS_NAME" == "Darwin" ]]; then diff --git a/scripts/ddrescue-tui.py b/scripts/ddrescue-tui.py index 413e81e6..2857053c 100755 --- a/scripts/ddrescue-tui.py +++ b/scripts/ddrescue-tui.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Wizard Kit: ddrescue TUI""" +"""WizardKit: ddrescue TUI""" # pylint: disable=invalid-name # vim: sts=2 sw=2 ts=2 diff --git a/scripts/echo-and-hold b/scripts/echo-and-hold index 97c69830..5abd7a53 100755 --- a/scripts/echo-and-hold +++ b/scripts/echo-and-hold @@ -1,6 +1,6 @@ #!/bin/bash # -## Wizard Kit: "echo" text to screen and "hold" by waiting for user input +## WizardKit: "echo" text to screen and "hold" by waiting for user input function usage { echo "Usage: $(basename "$0") \"text\"" diff --git a/scripts/get_raw_disks.ps1 b/scripts/get_raw_disks.ps1 index afdb9300..3e415197 100644 --- a/scripts/get_raw_disks.ps1 +++ b/scripts/get_raw_disks.ps1 @@ -1,3 +1,3 @@ -# Wizard Kit: Get RAW disks +# WizardKit: Get RAW disks Get-Disk | Where-Object {$_.PartitionStyle -eq "RAW"} | Select FriendlyName,Size,PartitionStyle | ConvertTo-JSON \ No newline at end of file diff --git a/scripts/hw-diags b/scripts/hw-diags index 16684630..cf5436da 100755 --- a/scripts/hw-diags +++ b/scripts/hw-diags @@ -1,6 +1,6 @@ #!/bin/bash # -## Wizard Kit: HW Diagnostics Launcher +## WizardKit: HW Diagnostics Launcher source launch-in-tmux diff --git a/scripts/hw-diags.py b/scripts/hw-diags.py index c72fd91f..858477fb 100755 --- a/scripts/hw-diags.py +++ b/scripts/hw-diags.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Wizard Kit: Hardware Diagnostics""" +"""WizardKit: Hardware Diagnostics""" # pylint: disable=invalid-name # vim: sts=2 sw=2 ts=2 diff --git a/scripts/hw-sensors b/scripts/hw-sensors index d4665466..3879cf2a 100755 --- a/scripts/hw-sensors +++ b/scripts/hw-sensors @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Wizard Kit: Hardware Sensors""" +"""WizardKit: Hardware Sensors""" # vim: sts=2 sw=2 ts=2 import platform diff --git a/scripts/init_client_dir.cmd b/scripts/init_client_dir.cmd index 5e94469b..6bf297b0 100644 --- a/scripts/init_client_dir.cmd +++ b/scripts/init_client_dir.cmd @@ -1,4 +1,4 @@ -:: Wizard Kit: Create client_dir folder(s) +:: WizardKit: Create client_dir folder(s) @echo off if defined DEBUG (@echo on) diff --git a/scripts/launch-in-tmux b/scripts/launch-in-tmux index de9483a8..65628d8a 100755 --- a/scripts/launch-in-tmux +++ b/scripts/launch-in-tmux @@ -1,6 +1,6 @@ #!/bin/bash # -## Wizard Kit: TMUX Launcher +## WizardKit: TMUX Launcher # Live macOS env workaround tmux_args=() diff --git a/scripts/mount-all-volumes b/scripts/mount-all-volumes index 1e8b3353..89f3edb8 100755 --- a/scripts/mount-all-volumes +++ b/scripts/mount-all-volumes @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Wizard Kit: Mount all volumes""" +"""WizardKit: Mount all volumes""" # vim: sts=2 sw=2 ts=2 import sys diff --git a/scripts/mount-backup-shares b/scripts/mount-backup-shares index 69ae4a58..c88312a6 100755 --- a/scripts/mount-backup-shares +++ b/scripts/mount-backup-shares @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Wizard Kit: Mount Backup Shares""" +"""WizardKit: Mount Backup Shares""" # pylint: disable=invalid-name # vim: sts=2 sw=2 ts=2 diff --git a/scripts/mount-raw-image b/scripts/mount-raw-image index 6a183859..13bdaed1 100755 --- a/scripts/mount-raw-image +++ b/scripts/mount-raw-image @@ -1,6 +1,6 @@ #!/bin/bash # -## Wizard Kit: RAW image mounting tool +## WizardKit: RAW image mounting tool set -o errexit set -o errtrace diff --git a/scripts/msword-search b/scripts/msword-search index 879e6b8d..33e1a7c7 100755 --- a/scripts/msword-search +++ b/scripts/msword-search @@ -1,6 +1,6 @@ #!/bin/python3 # -## Wizard Kit: MS Word content search tool +## WizardKit: MS Word content search tool import os import re diff --git a/scripts/pacinit b/scripts/pacinit index 63797ab9..aaf52459 100755 --- a/scripts/pacinit +++ b/scripts/pacinit @@ -1,6 +1,6 @@ #!/bin/bash # -## Wizard Kit: Update pacman settings to usage in live sessions +## WizardKit: Update pacman settings to usage in live sessions # Disable custom repo (used at build-time) sudo sed -i -r "s/^(\[custom\])/#\1/" /etc/pacman.conf diff --git a/scripts/remount-rw b/scripts/remount-rw index 1ba4b41d..2c275635 100755 --- a/scripts/remount-rw +++ b/scripts/remount-rw @@ -1,6 +1,6 @@ #!/bin/bash # -## Wizard Kit: Volume remount tool +## WizardKit: Volume remount tool if ! mount | grep -q "$1"; then echo "ERROR: Can't remount $1" diff --git a/scripts/unmount-backup-shares b/scripts/unmount-backup-shares index a71a5c7b..44ad5f71 100755 --- a/scripts/unmount-backup-shares +++ b/scripts/unmount-backup-shares @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Wizard Kit: Unmount Backup Shares""" +"""WizardKit: Unmount Backup Shares""" # pylint: disable=invalid-name # vim: sts=2 sw=2 ts=2 diff --git a/scripts/upload-logs b/scripts/upload-logs index c31b6014..6921c5bc 100755 --- a/scripts/upload-logs +++ b/scripts/upload-logs @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # vim: sts=2 sw=2 ts=2 -"""Wizard Kit: Upload Logs""" +"""WizardKit: Upload Logs""" import datetime import os diff --git a/setup/build_linux b/setup/build_linux index 5c9b6432..83e4ca33 100755 --- a/setup/build_linux +++ b/setup/build_linux @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -## Wizard Kit: Live Linux Build Tool +## WizardKit: Live Linux Build Tool set -o errexit set -o errtrace diff --git a/setup/build_pe.cmd b/setup/build_pe.cmd index 60de9829..ab3d4da4 100644 --- a/setup/build_pe.cmd +++ b/setup/build_pe.cmd @@ -1,10 +1,10 @@ -:: Wizard Kit: Windows PE Build Tool Launcher :: +:: WizardKit: Windows PE Build Tool :: @echo off :Init setlocal EnableDelayedExpansion -title Wizard Kit: Windows PE Build Tool +title WizardKit: Windows PE Build Tool call :CheckFlags %* call :CheckElevation || goto Exit call :FindKitsRoot || goto ErrorKitNotFound diff --git a/setup/build_windows.cmd b/setup/build_windows.cmd index 15fad071..536474af 100644 --- a/setup/build_windows.cmd +++ b/setup/build_windows.cmd @@ -1,11 +1,11 @@ -:: Wizard Kit: Build Tool Launcher :: +:: WizardKit: Windows Kit Build Tool :: @echo off :Init setlocal EnableDelayedExpansion pushd "%~dp0" -title Wizard Kit: Build Tool +title WizardKit: Build Tool call :CheckFlags %* :SetVariables diff --git a/setup/linux/profile_base/airootfs/etc/skel/.zshrc b/setup/linux/profile_base/airootfs/etc/skel/.zshrc index a5a2298b..e20852c7 100644 --- a/setup/linux/profile_base/airootfs/etc/skel/.zshrc +++ b/setup/linux/profile_base/airootfs/etc/skel/.zshrc @@ -6,7 +6,7 @@ HIST_STAMPS="yyyy-mm-dd" plugins=(archlinux git sudo systemd tmux) source $ZSH/oh-my-zsh.sh -# Wizard Kit +# WizardKit . $HOME/.aliases eval $(dircolors ~/.dircolors) export PYTHONPATH="/usr/local/bin" diff --git a/setup/windows/build.ps1 b/setup/windows/build.ps1 index 1d7492d5..11a06069 100644 --- a/setup/windows/build.ps1 +++ b/setup/windows/build.ps1 @@ -1,4 +1,4 @@ -# Wizard Kit: Build base kit +# WizardKit: Build base kit ## Init ## #Requires -Version 3.0 @@ -10,7 +10,7 @@ Param( if (Test-Path Env:\DEBUG) { Set-PSDebug -Trace 1 } -$Host.UI.RawUI.WindowTitle = "Wizard Kit: Build Tool" +$Host.UI.RawUI.WindowTitle = "WizardKit: Build Tool" $WD = Split-Path $MyInvocation.MyCommand.Path | Get-Item $Root = Get-Item "$KitPath" $Bin = Get-Item "$($Root.FullName)\.bin" -Force @@ -77,7 +77,7 @@ if ($PSVersionTable.PSVersion.Major -eq 6 -and $PSVersionTable.OS -imatch "Windo # Answer by: https://stackoverflow.com/users/696808/bacon-bits if ($MyInvocation.InvocationName -ne ".") { Clear-Host - Write-Host "Wizard Kit: Build Tool`n`n`n`n`n" + Write-Host "WizardKit: Build Tool`n`n`n`n`n" ## Sources ## $Sources = Get-Content -Path "$WD\sources.json" | ConvertFrom-JSON From a417cc0c64a556b27f07508c25db7bc1f8dab394 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 13 Oct 2021 20:52:12 -0600 Subject: [PATCH 19/20] Update README files --- README.md | 174 +++++++++++------------------------------------- setup/README.md | 28 ++++++++ 2 files changed, 67 insertions(+), 135 deletions(-) create mode 100644 setup/README.md diff --git a/README.md b/README.md index 84e9a6cb..4cf8b0b6 100644 --- a/README.md +++ b/README.md @@ -1,135 +1,39 @@ -# Wizard Kit # - -A collection of scripts to help technicians service Windows systems. - -## Main Kit ## - -### Build Requirements ### - -* PowerShell 3.0 or newer1 -* 10 Gb disk space - -### Initial Setup ### - -* Replace artwork as desired -* Run `Build Kit.cmd` which will do the following: - * Download 7-Zip, ConEmu, Notepad++, and Python (including wheel packages) - * Open `main.py` in Notepad++ for configuration - * Update the rest of the tools with the `.bin\Scripts\update_kit.py` script - -### Layout ### - -* Root - * Main script launchers: -* `.bin` - * Extracted programs: As compressed tools are run they will be extracted here. - * `Scripts` - * "Real" scripts live here and are run via their respective launchers. -* `.cbin` - * This folder holds the compressed and encrypted tool archives. - * They are extracted at runtime as needed. -* `Data Recovery` - * This folder is not copied by `Copy WizardKit.cmd` to help discourage - * recovering data to the same drive. -* `Data Transfers` -* `Diagnostics` -* `Drivers` -* `Installers` -* `Misc` -* `Repairs` -* `Uninstallers` - -## Live Linux ## - -### Build Requirements ### - -* Arch Linux -* 6 Gb disk space - -### Initial Setup ### - -* Replace artwork as desired -* Install Arch Linux in a virtual machine ([VirtualBox](https://www.virtualbox.org/) is a good option for Windows systems). - * See the [installation guide](https://wiki.archlinux.org/index.php/Installation_guide) for details. -* Add a standard user to the Arch Linux installation. - * See the [wiki page](https://wiki.archlinux.org/index.php/Users_and_groups#User_management) for details. -* Install git # `pacman -Syu git` -* _(Recommended)_ Install and configure `sudo` - * See the [wiki page](https://wiki.archlinux.org/index.php/Sudo) for details. -* Login to the user added above -* Download the Github repo $ `git clone https://github.com/2Shirt/WizardKit.git` -* Run the build script - * $ `cd WizardKit` - * $ `./Build\ Linux -b` - * The build script does the following: - * Installs missing dependencies via `pacman` - * Opens `main.py` in `nano` for configuration - * Downloads, builds, and adds AUR packages to a local repo - * Builds the Live Linux ISO - -### Notes ### - -* The WinPE boot options require files to be copied from a completed WinPE build. - * This is done below for the Combined UFD - -## Windows PE ## - -### Build Requirements ### - -* Windows Assessment and Deployment Kit for Windows 10 - * Deployment Tools - * Windows Preinstallation Environment (Windows PE) - * _All other features are not required_ -* PowerShell 3.0 or newer -* 8 Gb disk space - -### Initial Setup ### - -* Replace artwork as desired -* Run `Build PE.cmd` which will do the following: - * Load the WADK environment - * Open `main.py` in notepad for configuration - * Download all tools - * Build both 32-bit & 64-bit PE images (exported as ISO files) - -## Combined Wizard Kit ## - -### Build Requirements ### - -* 64-bit system or virtual machine -* 4 Gb RAM -* 8 Gb USB flash drive _(16 Gb or larger recommended)_ - -### Overview ### - -There's a `build-ufd` script which does the following: - -* Checks for the presence if the Linux ISO and the (64-bit) WinPE ISO. -* Formats the selected UFD using FAT32. - * All data will be deleted from the UFD resulting in **DATA LOSS**. -* Copies the required files from the Linux ISO, WinPE ISO, and Main Kit folder to the UFD. -* Installs Syslinux to the UFD making it bootable on legacy systems. -* Sets the boot files/folders to be hidden under Windows. - -### Setup ### - -* Boot to a Live Linux ISO built following the instructions above. - * You can apply it to a UFD using [rufus](https://rufus.akeo.ie/) for physical systems. - * Virtual machines should be able to use the Linux ISO directly. -* Mount the device(s) or network share(s) that contain the Linux ISO, WinPE ISO, and Main Kit folder. -* Connect the UFD but don't mount it. -* Get the device name of the UFD. - * You can use $ `hw-drive-info` to help. -* $ `sudo build-ufd --ufd-device [device] --linux-iso [path] --main-kit [path] --winpe-iso [path]` - * **2nd Warning**: All data will be erased from the UFD resulting in **DATA LOSS**. - * NOTE: The Main Kit folder will be renamed on the UFD using `$KIT_NAME_FULL` - * `$KIT_NAME_FULL` defaults to "Wizard Kit" but can be changed in `main.py` - * You can include extra items by using the `--extra-dir` option - * _(e.g. $ `sudo build-ufd --ufd-device [device] --linux-iso [path] --main-kit [path] --winpe-iso [path] --extra-dir [path]`)_ - * To include images for the WinPE Setup section, put the files in "Extras/images". - * WinPE Setup will recognize ESD, WIM, and SWM2 images. - * The filenames should be "Win7", "Win8", or "Win10" - -## Notes ## -1. PowerShell 6.0 on Windows 7 is not supported by the build script. -2. See [wimlib-imagex](https://wimlib.net/) for details about split WIM images. +# WizardKit # + +A collection of scripts to help technicians service computers. + +## Overview ## + +There are a few main parts to this project and their uses: + +* Live Linux image + * Hardware diagnostics + * CPU stress tests with temperature monitoring + * Health checks/tests for storage drives + * Misc other diagnostics + * Data recovery + * General data transfers from many possible filesystems + * Bit-level drive duplication based on ddrescue +* Live macOS image + * Hardware diagnostics + * CPU stress tests with temperature monitoring + * Health checks/tests for storage drives + * Data recovery + * _(Currently under development)_ +* Live WinPE image + * _(Currently under development)_ +* Windows Kit _(intended for UFDs)_ + * Automated repairs + * AV scans + * Windows health checks + * Automated setup + * Install software + * System configuration + +## Combined UFD ## + +All parts can be combined onto a single UFD! + +* Compatible with most legacy and UEFI bootloaders +* Custom boot menus +* To get started run `build-ufd` under the live Linux image diff --git a/setup/README.md b/setup/README.md new file mode 100644 index 00000000..6fe86ae3 --- /dev/null +++ b/setup/README.md @@ -0,0 +1,28 @@ +# WizardKit: Setup # + +Build the various parts of the project. + +## Requirements ## + +* Linux + * 8 GB of RAM1 + * 10 GB of free storage space2 + * Arch Linux installed with internet access enabled + * The [Arch Linux Wiki](https://wiki.archlinux.org/) is a great resource +* macOS + * 10 GB of free storage space + * El Capitan, High Sierra, or Catalina installed +* WinPE + * _(Currently under development)_ +* Windows Kit + * 10 GB of free storage space + * A recent version of Windows 103 + +## Setup ## + +Run the build script in this directory for the part you're looking for + +## Notes ## +1. The Linux image is built under a tmpfs, overriding that may allow a lower RAM requirement. +2. Required free storage space can _probably_ be lower but 10 GB should be a safe starting point. +3. Building the Windows Kit under an older OS is not supported by these scripts From d664100c50b8f19b34640034128f56b83ad342ca Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Wed, 13 Oct 2021 20:56:42 -0600 Subject: [PATCH 20/20] Remove unused folder --- docs/TODO | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/TODO diff --git a/docs/TODO b/docs/TODO deleted file mode 100644 index e69de29b..00000000