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$)
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