Compare commits
451 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 569a77edf2 | |||
| 91d8185ede | |||
| 18daa41e2a | |||
| 747277b121 | |||
| b8e09e83ce | |||
| e798503f6f | |||
| 063ebc947e | |||
| 5b5c99e6f8 | |||
| c50627867e | |||
| e30e52e880 | |||
| 90f5285067 | |||
| 441a6ad66f | |||
| 87668c6ad0 | |||
| d1af82e114 | |||
| dba39dd9c4 | |||
| df5a3081b9 | |||
| eb3624e9ad | |||
| b95586a590 | |||
| 3007c22c41 | |||
| f30d195cc4 | |||
| c537a01fbf | |||
| 86f17757db | |||
| 70823d2cd8 | |||
| ec5591453e | |||
| 606efac3fe | |||
| 28bedc0873 | |||
| 52e4415b43 | |||
| 248e321438 | |||
| c4ad9055d4 | |||
| 7a67e68308 | |||
| 434bb97765 | |||
| 6a821de0b5 | |||
| 576cb29281 | |||
| b83f2b0c5f | |||
| 2d3ccac369 | |||
| 7816602685 | |||
| 214df52723 | |||
| 35890d6bb3 | |||
| 7ccd4c6055 | |||
| 5ccd628259 | |||
| b9276aa0d7 | |||
| 798876eb10 | |||
| 617bb1484a | |||
| d51538aac3 | |||
| b554cfebe0 | |||
| f8773e1736 | |||
| d8024be2c3 | |||
| dac20b12f1 | |||
| 5ae8ea3be1 | |||
| 1d2d79eceb | |||
| 896f9e4a05 | |||
| b737696f7f | |||
| 2fb9b36959 | |||
| 5756d14292 | |||
| 2ce8c66fc8 | |||
| 9502ea0bbc | |||
| 8b4b0c40ce | |||
| a83dcdd06a | |||
| 731a281805 | |||
| e2d788e265 | |||
| 0080539575 | |||
| 19799bb1f4 | |||
| 72c0e75156 | |||
| 27eb7975ef | |||
| b05057d743 | |||
| 8edf164522 | |||
| f062f3ce71 | |||
| 153cda7cf8 | |||
| 050bef7f85 | |||
| e07c019fb2 | |||
| 21a587ee0f | |||
| 427243c933 | |||
| cd4ea75862 | |||
| 949efa4de6 | |||
| a9461311bc | |||
| 4215a2fd78 | |||
| 9652aa4623 | |||
| 091c31d33a | |||
| 89ac824d82 | |||
| 4115f3cfe1 | |||
| c66b2facbf | |||
| c16e97e49a | |||
| 95f4877862 | |||
| fc9de61269 | |||
| 26aca0df9f | |||
| 7ee04060d8 | |||
| d769b1ad4e | |||
| 996b01bb34 | |||
| 807c94e2ce | |||
| af757c5582 | |||
| c8944e5a14 | |||
| 2230ea1eea | |||
| e098d40c2f | |||
| 72cc33cb7e | |||
| 3310e3d253 | |||
| 164fd4c646 | |||
| 0e6be3ad08 | |||
| 1b312658e9 | |||
| cf1d11eb78 | |||
| cc1a318e3d | |||
| 6734460d42 | |||
| fde9be6b3f | |||
| d62a647fa9 | |||
| 5a1f7b1829 | |||
| b2528b90f8 | |||
| 0883b099fd | |||
| 23add7e276 | |||
| 56ca605257 | |||
| c3ebdee5d0 | |||
| d113d710a7 | |||
| c4755124a0 | |||
| ceb6a9e294 | |||
| a8afd793e0 | |||
| d33f78960d | |||
| 1a8b6705e0 | |||
| 415f56863d | |||
| 4d9ab2215b | |||
| 14ebc23b81 | |||
| b43309be75 | |||
| 8cdb834499 | |||
| 5fe37b62b2 | |||
| 4c33c110b7 | |||
| b166172d10 | |||
| e420074c83 | |||
| 50cb765108 | |||
| b6c6fc9aa9 | |||
| cd0a9456cb | |||
| c4d00a2073 | |||
| 575126eaa2 | |||
| 3ff0bcd3c9 | |||
| 639a338cca | |||
| a22e6f552f | |||
| e1cfe6d2d3 | |||
| e089dd99a3 | |||
| 52e3e24a3a | |||
| c5364a65a2 | |||
| 0b31fa271d | |||
| c022d3f9c6 | |||
| 28cea9697e | |||
| fa05c93bf8 | |||
| c96ffc5f59 | |||
| 95338f1df7 | |||
| 877db91cb6 | |||
| 826edc0c33 | |||
| 723f1ad4ad | |||
| 089cdba4f9 | |||
| f98c106080 | |||
| 48c0cf0b1b | |||
| 4cb14c6429 | |||
| b84d4eb6b8 | |||
| 1235269da0 | |||
| 2e679dbf5e | |||
| 84deb49beb | |||
| ec74b06282 | |||
| f9b35b9a3d | |||
| c5b4446133 | |||
| 86f81f2720 | |||
| 70b8d2536a | |||
| 34ef0bfae6 | |||
| 648787913e | |||
| 75df9777b3 | |||
| 122bbfb157 | |||
| 7381547b27 | |||
| 480222c1f2 | |||
| 3fa6521c51 | |||
| 459f95394a | |||
| 22b1452168 | |||
| 1d10503b91 | |||
| e7d31c21c3 | |||
| 7f6509d235 | |||
| 7701418e55 | |||
| 7078efe9e7 | |||
| a3d2de92bc | |||
| 607d4b1e57 | |||
| 6edfcc9766 | |||
| 40f269aabd | |||
| a5852d1caa | |||
| 95aa063a69 | |||
| e60bfaca48 | |||
| 858c2e1bd5 | |||
| b0e2b01e00 | |||
| d5dc453ffa | |||
| 68a3b6d0c7 | |||
| 197a5a9160 | |||
| 62f2ec8a4d | |||
| 4197fc9e0b | |||
| 8d8399c9aa | |||
| af5281626b | |||
| 8add6f634c | |||
| 058a52961d | |||
| d03772666d | |||
| 974e20df05 | |||
| 34f4bca97d | |||
| e2c83aad6e | |||
| cd4bb7c867 | |||
| 0398ea7e51 | |||
| fa2aa04b53 | |||
| 27eb984e73 | |||
| 017c0e3385 | |||
| 82377bc1ab | |||
| 7132d971f6 | |||
| dc6de9cab0 | |||
| a28a754be1 | |||
| 3c35a75c92 | |||
| f8404f3c16 | |||
| 56fa227686 | |||
| 5efdf05274 | |||
| 7c7d8e41e2 | |||
| 046208cfb6 | |||
| 814ada0ac0 | |||
| fcd8d67f51 | |||
| 5b9e91f8af | |||
| bece9837b2 | |||
| 6c47650c2d | |||
| fd8358a899 | |||
| cb072366e0 | |||
| 4a96736592 | |||
| ad1d7d71f2 | |||
| 6246393894 | |||
| c1324548ce | |||
| 969011f3f5 | |||
| 6488101cdc | |||
| e088ba134e | |||
| f2bd2a6e75 | |||
| 6ea4791dc9 | |||
| 63f9c1c193 | |||
| ed70d1ab18 | |||
| f8adbe074d | |||
| 4bd0cd1598 | |||
| beb36dfc97 | |||
| ebcd38ef50 | |||
| ae92eea76e | |||
| 50da682d76 | |||
| 7a9474a6a8 | |||
| 68bbee66d5 | |||
| e40b0b98e4 | |||
| 4a04e92caf | |||
| aa4c6a1434 | |||
| 3d69fe773d | |||
| 141fe422db | |||
| 3122a75f64 | |||
| 6340bceb11 | |||
| a9c5c1c274 | |||
| 8f9bae9a6f | |||
| 575fa17425 | |||
| 91649f5ee7 | |||
| 1095e15643 | |||
| 453ce9cf44 | |||
| b6e9e447c5 | |||
| 6df88ec021 | |||
| f321dee54f | |||
| 3e733e65e9 | |||
| 7b8b1ab111 | |||
| 922d632afb | |||
| 5af0996259 | |||
| c96e2f252c | |||
| d0c49240d8 | |||
| 3b4668e61b | |||
| c7706a115f | |||
| b1786e088c | |||
| c501c8b23f | |||
| 387062074a | |||
| 4ddce7cfbe | |||
| a9ebeee748 | |||
| 25bacb9892 | |||
| 5664765f6e | |||
| c3ca58879c | |||
| ec0341027e | |||
| fa424a4576 | |||
| a47707447c | |||
| cfd4eebcd4 | |||
| deb9d9add1 | |||
| 82a2d6b74d | |||
| 72eac47524 | |||
| 07e43307c5 | |||
| 018aba2fe6 | |||
| 097fae866a | |||
| 166a293864 | |||
| ffd07e07fd | |||
| 0a899539c9 | |||
| 10e978d4c5 | |||
| 4049272cbb | |||
| c74e2c7667 | |||
| 327c5b8a33 | |||
| 6a3e225192 | |||
| a269859b17 | |||
| 36e419bca0 | |||
| 765673db66 | |||
| 28e2ce90df | |||
| a124236def | |||
| 4b956d5eea | |||
| a39c62eabc | |||
| dcc2e5cd6a | |||
| 98c0c34bf8 | |||
| 96d34ceb50 | |||
| 6e37736146 | |||
| c15eb85a5e | |||
| 6d9f50629c | |||
| d37923a31c | |||
| d930bdddbd | |||
| d60aab9584 | |||
| eed8a1e40c | |||
| c6eb7cdfd6 | |||
| f022d0ca76 | |||
| 42407f0eca | |||
| 44fe888230 | |||
| 62b8e51705 | |||
| ad15cdad56 | |||
| 04cfdff2bf | |||
| e1834d5179 | |||
| ad9662c120 | |||
| fad65b8df6 | |||
| e5f0ccb5d5 | |||
| 91a77bb14e | |||
| 7ac035c578 | |||
| 932669844b | |||
| 10ae59be19 | |||
| 0c0f8e8950 | |||
| 41c9a4d23f | |||
| 8c5820d5aa | |||
| ec8c78197b | |||
| 385bdd7dbf | |||
| a25a10e616 | |||
| c820d2ac6d | |||
| baaf1994e3 | |||
| e0a2993c36 | |||
| d8123a71ec | |||
| 4c0bb1c9b7 | |||
| 503e6f2b42 | |||
| a4896a55f6 | |||
| 8993b483a6 | |||
| ef42b596d9 | |||
| 8b936f5413 | |||
| e96ac5c156 | |||
| dc8416b5f7 | |||
| a5d92537f5 | |||
| f2a519b7ec | |||
| 37b8676b9c | |||
| 99984603ed | |||
| cee8252455 | |||
| 81f05fa79f | |||
| 5b74879805 | |||
| b5c93317dc | |||
| 47084efe17 | |||
| 62a60ff3fd | |||
| a967a5c425 | |||
| a3f7e5ad89 | |||
| 6c06a67fdf | |||
| d9554314d5 | |||
| a2ef06e6db | |||
| 2b43cdf9e2 | |||
| 30d4acd986 | |||
| 8a8a63eb66 | |||
| a00105f718 | |||
| bb93386fa0 | |||
| 465a3b42fb | |||
| d88a9f39f2 | |||
| 668c7c4c6a | |||
| 941a553766 | |||
| 49471663f5 | |||
| 0390290f10 | |||
| 6a3ef60881 | |||
| 12ff99eb32 | |||
| a910f2cb03 | |||
| ca4234b1c3 | |||
| dc606a8780 | |||
| 30ba651674 | |||
| 74bb31e795 | |||
| 5550cce8db | |||
| c777d49091 | |||
| 5405b97eb1 | |||
| 46080b4363 | |||
| 0e5fab0104 | |||
| 95b0d1e3f4 | |||
| 328d6eb294 | |||
| 2eccc236a9 | |||
| 7140f38ba4 | |||
| cb67f7e3c3 | |||
| 5dd8fa8416 | |||
| 163f64dda7 | |||
| 372f80bf38 | |||
| 7c163a8110 | |||
| d025b8dc9e | |||
| 2d69d93154 | |||
| 43b9645c69 | |||
| 4bb1402ac5 | |||
| 8fb1620c94 | |||
| 597a236089 | |||
| 1489ad4237 | |||
| 62c9d82fd2 | |||
| 5701b53026 | |||
| 6014a8fb70 | |||
| 70a742e69c | |||
| 2df4d48bb3 | |||
| 560929e2fa | |||
| 18fc97293e | |||
| 3fdd8c629c | |||
| 10f2fca2bf | |||
| ac866be092 | |||
| 83dda97ff6 | |||
| c42c764789 | |||
| f802ea860d | |||
| bb23d49833 | |||
| b3b821a868 | |||
| 8a86edb5bb | |||
| 972d91a4b8 | |||
| e3076152ba | |||
| 566e1474a5 | |||
| 2d9de7b69e | |||
| 5da9d4e36b | |||
| 7e960df2d6 | |||
| 832ef993e6 | |||
| 1cac083916 | |||
| 7f37bc8802 | |||
| 1839edf84d | |||
| 7f7c220073 | |||
| 18b13cf506 | |||
| 923ddd7cd3 | |||
| 8064fc4a17 | |||
| 63fcaed8cd | |||
| 5e1daf36df | |||
| 5380d133e4 | |||
| 509620707c | |||
| bf354edeae | |||
| 1cb7de08f3 | |||
| 95c8de0a21 | |||
| 6a67052d83 | |||
|
|
087500c9b7 | ||
|
|
85e7813539 | ||
|
|
7e17a93d42 | ||
| 6f5a25d65d | |||
| ecb9364bd2 | |||
| c7da54d86a | |||
| e6d7d8699a | |||
| 10f1982c23 | |||
| 1e6f486865 | |||
| 79b64e4f23 | |||
| c43ba34cbf | |||
| 26eadebf21 | |||
| 7da01be7ab | |||
| 3b27d05fd6 | |||
| a3c82023e8 | |||
| 5e73583e00 | |||
| 4b16ec6095 | |||
| d4f24eafb6 | |||
| 6c4381c3a5 | |||
| 4979fbe927 | |||
| 9689f5aa15 | |||
| a4d559f406 | |||
| 883305ca6b | |||
| 48f789c5b4 |
175 changed files with 14718 additions and 11045 deletions
|
|
@ -151,6 +151,7 @@ goto Exit
|
||||||
call "%bin%\Scripts\init_client_dir.cmd" /Office
|
call "%bin%\Scripts\init_client_dir.cmd" /Office
|
||||||
set "_odt=False"
|
set "_odt=False"
|
||||||
if %L_PATH% equ 2016 (set "_odt=True")
|
if %L_PATH% equ 2016 (set "_odt=True")
|
||||||
|
if %L_PATH% equ 2019 (set "_odt=True")
|
||||||
if "%_odt%" == "True" (
|
if "%_odt%" == "True" (
|
||||||
goto LaunchOfficeODT
|
goto LaunchOfficeODT
|
||||||
) else (
|
) else (
|
||||||
|
|
@ -161,8 +162,8 @@ if "%_odt%" == "True" (
|
||||||
rem Prep
|
rem Prep
|
||||||
set "args=-aoa -bso0 -bse0 -bsp0 -p%ARCHIVE_PASSWORD%"
|
set "args=-aoa -bso0 -bse0 -bsp0 -p%ARCHIVE_PASSWORD%"
|
||||||
set "config=%L_ITEM%"
|
set "config=%L_ITEM%"
|
||||||
set "dest=%client_dir%\Office\%L_PATH%"
|
set "dest=%client_dir%\Office\ODT"
|
||||||
set "odt_exe=%L_PATH%\setup.exe"
|
set "odt_exe=setup.exe"
|
||||||
set "source=%cbin%\_Office.7z"
|
set "source=%cbin%\_Office.7z"
|
||||||
|
|
||||||
rem Extract
|
rem Extract
|
||||||
|
|
@ -262,6 +263,7 @@ call :ExtractOrFindPath || goto ErrorProgramNotFound
|
||||||
set "script=%_path%\%L_ITEM%"
|
set "script=%_path%\%L_ITEM%"
|
||||||
|
|
||||||
rem Verify
|
rem Verify
|
||||||
|
"%PYTHON%" --version >nul || goto ErrorPythonUnsupported
|
||||||
if not exist "%script%" goto ErrorScriptNotFound
|
if not exist "%script%" goto ErrorScriptNotFound
|
||||||
|
|
||||||
rem Run
|
rem Run
|
||||||
|
|
@ -279,9 +281,9 @@ rem Create VB script
|
||||||
mkdir "%bin%\tmp" 2>nul
|
mkdir "%bin%\tmp" 2>nul
|
||||||
echo Set UAC = CreateObject^("Shell.Application"^) > "%bin%\tmp\Elevate.vbs"
|
echo Set UAC = CreateObject^("Shell.Application"^) > "%bin%\tmp\Elevate.vbs"
|
||||||
if defined L_NCMD (
|
if defined L_NCMD (
|
||||||
echo UAC.ShellExecute "%PYTHON%", """%script%""", "", "runas", 3 >> "%bin%\tmp\Elevate.vbs"
|
echo UAC.ShellExecute "%PYTHON%", """%script%"" %L_ARGS%", "", "runas", 3 >> "%bin%\tmp\Elevate.vbs"
|
||||||
) else (
|
) else (
|
||||||
echo UAC.ShellExecute "%CON%", "-run ""%PYTHON%"" ""%script%"" -new_console:n", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
|
echo UAC.ShellExecute "%CON%", "-run ""%PYTHON%"" ""%script%"" %L_ARGS% -new_console:n", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
|
||||||
)
|
)
|
||||||
|
|
||||||
rem Run
|
rem Run
|
||||||
|
|
@ -290,9 +292,9 @@ goto Exit
|
||||||
|
|
||||||
:LaunchPyScriptUser
|
:LaunchPyScriptUser
|
||||||
if defined L_NCMD (
|
if defined L_NCMD (
|
||||||
start "" "%PYTHON%" "%script%" || goto ErrorUnknown
|
start "" "%PYTHON%" "%script%" %L_ARGS% || goto ErrorUnknown
|
||||||
) else (
|
) else (
|
||||||
start "" "%CON%" -run "%PYTHON%" "%script%" -new_console:n || goto ErrorUnknown
|
start "" "%CON%" -run "%PYTHON%" "%script%" %L_ARGS% -new_console:n || goto ErrorUnknown
|
||||||
)
|
)
|
||||||
goto Exit
|
goto Exit
|
||||||
|
|
||||||
|
|
@ -332,7 +334,7 @@ echo. Executable Working Dir Program Args [L_7ZIP] [L_ELEV] [L__CLI]
|
||||||
echo. Folder Folder '.' [L_7ZIP]
|
echo. Folder Folder '.' [L_7ZIP]
|
||||||
echo. Office Year Product [L_7ZIP]
|
echo. Office Year Product [L_7ZIP]
|
||||||
echo. PSScript Scripts Script [L_7ZIP] [L_ELEV] [L_NCMD]
|
echo. PSScript Scripts Script [L_7ZIP] [L_ELEV] [L_NCMD]
|
||||||
echo. PyScript Scripts Script [L_7ZIP] [L_ELEV] [L_NCMD]
|
echo. PyScript Scripts Script Args [L_7ZIP] [L_ELEV] [L_NCMD]
|
||||||
echo. QuickBooks Year Product [L_7ZIP]
|
echo. QuickBooks Year Product [L_7ZIP]
|
||||||
echo.
|
echo.
|
||||||
echo.L_7ZIP: Extra arguments for 7-Zip (in the :ExtractCBin label)
|
echo.L_7ZIP: Extra arguments for 7-Zip (in the :ExtractCBin label)
|
||||||
|
|
@ -434,6 +436,16 @@ echo ERROR: Office version not supported by this script.
|
||||||
start "" "explorer.exe" "%client_dir%\Office"
|
start "" "explorer.exe" "%client_dir%\Office"
|
||||||
goto Abort
|
goto Abort
|
||||||
|
|
||||||
|
:ErrorPythonUnsupported
|
||||||
|
rem The Windows installation lacks Windows update KB2999226 needed to run Python
|
||||||
|
echo.
|
||||||
|
echo ERROR: Failed to run Python, try installing Windows update KB2999226.
|
||||||
|
echo NOTE: That update is from October 2015 so this system is SEVERELY outdated
|
||||||
|
if exist "%bin%\..\Installers\Extras\Windows Updates" (
|
||||||
|
start "" "explorer.exe" "%bin%\..\Installers\Extras\Windows Updates"
|
||||||
|
)
|
||||||
|
goto Abort
|
||||||
|
|
||||||
:ErrorQuickBooksSourceNotFound
|
:ErrorQuickBooksSourceNotFound
|
||||||
echo.
|
echo.
|
||||||
echo ERROR: QuickBooks source "%L_ITEM%" not found.
|
echo ERROR: QuickBooks source "%L_ITEM%" not found.
|
||||||
|
|
@ -485,7 +497,7 @@ echo Press any key to exit...
|
||||||
pause>nul
|
pause>nul
|
||||||
rem reset color and reset errorlevel to 0
|
rem reset color and reset errorlevel to 0
|
||||||
rem NOTE: This is done to avoid causing a ErrorLaunchCMD in the launcher.cmd
|
rem NOTE: This is done to avoid causing a ErrorLaunchCMD in the launcher.cmd
|
||||||
color
|
color 07
|
||||||
goto Exit
|
goto Exit
|
||||||
|
|
||||||
:: Cleanup and exit ::
|
:: Cleanup and exit ::
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ call :SetTitle Launcher
|
||||||
rem EXTRA_CODE
|
rem EXTRA_CODE
|
||||||
|
|
||||||
:DefineLaunch
|
:DefineLaunch
|
||||||
:: See %bin%\SCripts\Launch.cmd for details under :Usage label
|
:: See %bin%\Scripts\Launch.cmd for details under :Usage label
|
||||||
set L_TYPE=
|
set L_TYPE=
|
||||||
set L_PATH=
|
set L_PATH=
|
||||||
set L_ITEM=
|
set L_ITEM=
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.activation import *
|
from functions.activation import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: Windows Activation Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: Windows Activation Tool'.format(KIT_NAME_FULL))
|
||||||
|
|
@ -56,7 +55,9 @@ if __name__ == '__main__':
|
||||||
print_success('\nDone.')
|
print_success('\nDone.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
81
.bin/Scripts/add-known-networks
Normal file
81
.bin/Scripts/add-known-networks
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
#!/bin/env python3
|
||||||
|
#
|
||||||
|
## Convert saved WiFi connections for NetworkManager
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
KNOWN_NETWORKS = '/root/known_networks'
|
||||||
|
TEMPLATE = '''[connection]
|
||||||
|
id={ssid}
|
||||||
|
uuid={uuid}
|
||||||
|
type=wifi
|
||||||
|
permissions=user:{user}:;
|
||||||
|
|
||||||
|
[wifi]
|
||||||
|
mac-address-blacklist=
|
||||||
|
mode=infrastructure
|
||||||
|
ssid={ssid}
|
||||||
|
|
||||||
|
[wifi-security]
|
||||||
|
auth-alg=open
|
||||||
|
key-mgmt=wpa-psk
|
||||||
|
psk={password}
|
||||||
|
|
||||||
|
[ipv4]
|
||||||
|
dns-search=
|
||||||
|
method=auto
|
||||||
|
|
||||||
|
[ipv6]
|
||||||
|
addr-gen-mode=stable-privacy
|
||||||
|
dns-search=
|
||||||
|
method=auto
|
||||||
|
'''
|
||||||
|
|
||||||
|
def get_user_name():
|
||||||
|
"""Get user name, returns str."""
|
||||||
|
user = None
|
||||||
|
|
||||||
|
# Get running user
|
||||||
|
if 'SUDO_USER' in os.environ:
|
||||||
|
user = os.environ.get('SUDO_USER')
|
||||||
|
else:
|
||||||
|
user = os.environ.get('USER')
|
||||||
|
|
||||||
|
# Check if user manually specified
|
||||||
|
for a in sys.argv:
|
||||||
|
a = a.strip().lower()
|
||||||
|
if a.startswith('--user='):
|
||||||
|
user = a.replace('--user=', '')
|
||||||
|
|
||||||
|
return user
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
known_networks = {}
|
||||||
|
#try:
|
||||||
|
with open('/root/known_networks', 'r') as f:
|
||||||
|
for line in f.readlines():
|
||||||
|
r = re.search(r"^'(.*)':\s+'(.*)'", line.strip())
|
||||||
|
if r:
|
||||||
|
known_networks[r.group(1)] = r.group(2)
|
||||||
|
for ssid, password in known_networks.items():
|
||||||
|
out_path = '{}/{}.nmconnection'.format(
|
||||||
|
'/etc/NetworkManager/system-connections',
|
||||||
|
ssid,
|
||||||
|
)
|
||||||
|
if not os.path.exists(out_path):
|
||||||
|
with open(out_path, 'w') as f:
|
||||||
|
f.write(TEMPLATE.format(
|
||||||
|
user=get_user_name(),
|
||||||
|
ssid=ssid,
|
||||||
|
password=password,
|
||||||
|
uuid=uuid.uuid4(),
|
||||||
|
))
|
||||||
|
os.chmod(out_path, 0o600)
|
||||||
|
#except:
|
||||||
|
# # Meh
|
||||||
|
# pass
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
sensors.py
|
|
||||||
==========
|
|
||||||
python bindings using ctypes for libsensors3 of the [lm-sensors project](https://github.com/groeck/lm-sensors). The code was written against libsensors 3.3.4.
|
|
||||||
|
|
||||||
For documentation of the low level API see [sensors.h](https://github.com/groeck/lm-sensors/blob/master/lib/sensors.h). For an example of the high level API see [example.py](example.py).
|
|
||||||
|
|
||||||
For a GUI application that displays the sensor readings and is based on this library, take a look at [sensors-unity](https://launchpad.net/sensors-unity).
|
|
||||||
|
|
||||||
Features
|
|
||||||
--------
|
|
||||||
* Full access to low level libsensors3 API
|
|
||||||
* High level iterator API
|
|
||||||
* unicode handling
|
|
||||||
* Python2 and Python3 compatible
|
|
||||||
|
|
||||||
Licensing
|
|
||||||
---------
|
|
||||||
LGPLv2 (same as libsensors3)
|
|
||||||
|
|
||||||
Usage Notes
|
|
||||||
-----------
|
|
||||||
As Python does not support call by reference for primitive types some of the libsensors API had to be adapted:
|
|
||||||
|
|
||||||
```python
|
|
||||||
# nr is changed by refrence in the C API
|
|
||||||
chip_name, nr = sensors.get_detected_chips(None, nr)
|
|
||||||
|
|
||||||
# returns the value. throws on error
|
|
||||||
val = sensors.get_value(chip, subfeature_nr)
|
|
||||||
```
|
|
||||||
|
|
||||||
Missing Features (pull requests are welcome):
|
|
||||||
* `sensors_subfeature_type` enum
|
|
||||||
* `sensors_get_subfeature`
|
|
||||||
* Error handlers
|
|
||||||
|
|
@ -1,236 +0,0 @@
|
||||||
"""
|
|
||||||
@package sensors.py
|
|
||||||
Python Bindings for libsensors3
|
|
||||||
|
|
||||||
use the documentation of libsensors for the low level API.
|
|
||||||
see example.py for high level API usage.
|
|
||||||
|
|
||||||
@author: Pavel Rojtberg (http://www.rojtberg.net)
|
|
||||||
@see: https://github.com/paroj/sensors.py
|
|
||||||
@copyright: LGPLv2 (same as libsensors) <http://opensource.org/licenses/LGPL-2.1>
|
|
||||||
"""
|
|
||||||
|
|
||||||
from ctypes import *
|
|
||||||
import ctypes.util
|
|
||||||
|
|
||||||
_libc = cdll.LoadLibrary(ctypes.util.find_library("c"))
|
|
||||||
# see https://github.com/paroj/sensors.py/issues/1
|
|
||||||
_libc.free.argtypes = [c_void_p]
|
|
||||||
|
|
||||||
_hdl = cdll.LoadLibrary(ctypes.util.find_library("sensors"))
|
|
||||||
|
|
||||||
version = c_char_p.in_dll(_hdl, "libsensors_version").value.decode("ascii")
|
|
||||||
|
|
||||||
class bus_id(Structure):
|
|
||||||
_fields_ = [("type", c_short),
|
|
||||||
("nr", c_short)]
|
|
||||||
|
|
||||||
class chip_name(Structure):
|
|
||||||
_fields_ = [("prefix", c_char_p),
|
|
||||||
("bus", bus_id),
|
|
||||||
("addr", c_int),
|
|
||||||
("path", c_char_p)]
|
|
||||||
|
|
||||||
class feature(Structure):
|
|
||||||
_fields_ = [("name", c_char_p),
|
|
||||||
("number", c_int),
|
|
||||||
("type", c_int)]
|
|
||||||
|
|
||||||
# sensors_feature_type
|
|
||||||
IN = 0x00
|
|
||||||
FAN = 0x01
|
|
||||||
TEMP = 0x02
|
|
||||||
POWER = 0x03
|
|
||||||
ENERGY = 0x04
|
|
||||||
CURR = 0x05
|
|
||||||
HUMIDITY = 0x06
|
|
||||||
MAX_MAIN = 0x7
|
|
||||||
VID = 0x10
|
|
||||||
INTRUSION = 0x11
|
|
||||||
MAX_OTHER = 0x12
|
|
||||||
BEEP_ENABLE = 0x18
|
|
||||||
|
|
||||||
class subfeature(Structure):
|
|
||||||
_fields_ = [("name", c_char_p),
|
|
||||||
("number", c_int),
|
|
||||||
("type", c_int),
|
|
||||||
("mapping", c_int),
|
|
||||||
("flags", c_uint)]
|
|
||||||
|
|
||||||
_hdl.sensors_get_detected_chips.restype = POINTER(chip_name)
|
|
||||||
_hdl.sensors_get_features.restype = POINTER(feature)
|
|
||||||
_hdl.sensors_get_all_subfeatures.restype = POINTER(subfeature)
|
|
||||||
_hdl.sensors_get_label.restype = c_void_p # return pointer instead of str so we can free it
|
|
||||||
_hdl.sensors_get_adapter_name.restype = c_char_p # docs do not say whether to free this or not
|
|
||||||
_hdl.sensors_strerror.restype = c_char_p
|
|
||||||
|
|
||||||
### RAW API ###
|
|
||||||
MODE_R = 1
|
|
||||||
MODE_W = 2
|
|
||||||
COMPUTE_MAPPING = 4
|
|
||||||
|
|
||||||
def init(cfg_file = None):
|
|
||||||
file = _libc.fopen(cfg_file.encode("utf-8"), "r") if cfg_file is not None else None
|
|
||||||
|
|
||||||
if _hdl.sensors_init(file) != 0:
|
|
||||||
raise Exception("sensors_init failed")
|
|
||||||
|
|
||||||
if file is not None:
|
|
||||||
_libc.fclose(file)
|
|
||||||
|
|
||||||
def cleanup():
|
|
||||||
_hdl.sensors_cleanup()
|
|
||||||
|
|
||||||
def parse_chip_name(orig_name):
|
|
||||||
ret = chip_name()
|
|
||||||
err= _hdl.sensors_parse_chip_name(orig_name.encode("utf-8"), byref(ret))
|
|
||||||
|
|
||||||
if err < 0:
|
|
||||||
raise Exception(strerror(err))
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def strerror(errnum):
|
|
||||||
return _hdl.sensors_strerror(errnum).decode("utf-8")
|
|
||||||
|
|
||||||
def free_chip_name(chip):
|
|
||||||
_hdl.sensors_free_chip_name(byref(chip))
|
|
||||||
|
|
||||||
def get_detected_chips(match, nr):
|
|
||||||
"""
|
|
||||||
@return: (chip, next nr to query)
|
|
||||||
"""
|
|
||||||
_nr = c_int(nr)
|
|
||||||
|
|
||||||
if match is not None:
|
|
||||||
match = byref(match)
|
|
||||||
|
|
||||||
chip = _hdl.sensors_get_detected_chips(match, byref(_nr))
|
|
||||||
chip = chip.contents if bool(chip) else None
|
|
||||||
return chip, _nr.value
|
|
||||||
|
|
||||||
def chip_snprintf_name(chip, buffer_size=200):
|
|
||||||
"""
|
|
||||||
@param buffer_size defaults to the size used in the sensors utility
|
|
||||||
"""
|
|
||||||
ret = create_string_buffer(buffer_size)
|
|
||||||
err = _hdl.sensors_snprintf_chip_name(ret, buffer_size, byref(chip))
|
|
||||||
|
|
||||||
if err < 0:
|
|
||||||
raise Exception(strerror(err))
|
|
||||||
|
|
||||||
return ret.value.decode("utf-8")
|
|
||||||
|
|
||||||
def do_chip_sets(chip):
|
|
||||||
"""
|
|
||||||
@attention this function was not tested
|
|
||||||
"""
|
|
||||||
err = _hdl.sensors_do_chip_sets(byref(chip))
|
|
||||||
if err < 0:
|
|
||||||
raise Exception(strerror(err))
|
|
||||||
|
|
||||||
def get_adapter_name(bus):
|
|
||||||
return _hdl.sensors_get_adapter_name(byref(bus)).decode("utf-8")
|
|
||||||
|
|
||||||
def get_features(chip, nr):
|
|
||||||
"""
|
|
||||||
@return: (feature, next nr to query)
|
|
||||||
"""
|
|
||||||
_nr = c_int(nr)
|
|
||||||
feature = _hdl.sensors_get_features(byref(chip), byref(_nr))
|
|
||||||
feature = feature.contents if bool(feature) else None
|
|
||||||
return feature, _nr.value
|
|
||||||
|
|
||||||
def get_label(chip, feature):
|
|
||||||
ptr = _hdl.sensors_get_label(byref(chip), byref(feature))
|
|
||||||
val = cast(ptr, c_char_p).value.decode("utf-8")
|
|
||||||
_libc.free(ptr)
|
|
||||||
return val
|
|
||||||
|
|
||||||
def get_all_subfeatures(chip, feature, nr):
|
|
||||||
"""
|
|
||||||
@return: (subfeature, next nr to query)
|
|
||||||
"""
|
|
||||||
_nr = c_int(nr)
|
|
||||||
subfeature = _hdl.sensors_get_all_subfeatures(byref(chip), byref(feature), byref(_nr))
|
|
||||||
subfeature = subfeature.contents if bool(subfeature) else None
|
|
||||||
return subfeature, _nr.value
|
|
||||||
|
|
||||||
def get_value(chip, subfeature_nr):
|
|
||||||
val = c_double()
|
|
||||||
err = _hdl.sensors_get_value(byref(chip), subfeature_nr, byref(val))
|
|
||||||
if err < 0:
|
|
||||||
raise Exception(strerror(err))
|
|
||||||
return val.value
|
|
||||||
|
|
||||||
def set_value(chip, subfeature_nr, value):
|
|
||||||
"""
|
|
||||||
@attention this function was not tested
|
|
||||||
"""
|
|
||||||
val = c_double(value)
|
|
||||||
err = _hdl.sensors_set_value(byref(chip), subfeature_nr, byref(val))
|
|
||||||
if err < 0:
|
|
||||||
raise Exception(strerror(err))
|
|
||||||
|
|
||||||
### Convenience API ###
|
|
||||||
class ChipIterator:
|
|
||||||
def __init__(self, match = None):
|
|
||||||
self.match = parse_chip_name(match) if match is not None else None
|
|
||||||
self.nr = 0
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __next__(self):
|
|
||||||
chip, self.nr = get_detected_chips(self.match, self.nr)
|
|
||||||
|
|
||||||
if chip is None:
|
|
||||||
raise StopIteration
|
|
||||||
|
|
||||||
return chip
|
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
if self.match is not None:
|
|
||||||
free_chip_name(self.match)
|
|
||||||
|
|
||||||
def next(self): # python2 compability
|
|
||||||
return self.__next__()
|
|
||||||
|
|
||||||
class FeatureIterator:
|
|
||||||
def __init__(self, chip):
|
|
||||||
self.chip = chip
|
|
||||||
self.nr = 0
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __next__(self):
|
|
||||||
feature, self.nr = get_features(self.chip, self.nr)
|
|
||||||
|
|
||||||
if feature is None:
|
|
||||||
raise StopIteration
|
|
||||||
|
|
||||||
return feature
|
|
||||||
|
|
||||||
def next(self): # python2 compability
|
|
||||||
return self.__next__()
|
|
||||||
|
|
||||||
class SubFeatureIterator:
|
|
||||||
def __init__(self, chip, feature):
|
|
||||||
self.chip = chip
|
|
||||||
self.feature = feature
|
|
||||||
self.nr = 0
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __next__(self):
|
|
||||||
subfeature, self.nr = get_all_subfeatures(self.chip, self.feature, self.nr)
|
|
||||||
|
|
||||||
if subfeature is None:
|
|
||||||
raise StopIteration
|
|
||||||
|
|
||||||
return subfeature
|
|
||||||
|
|
||||||
def next(self): # python2 compability
|
|
||||||
return self.__next__()
|
|
||||||
|
|
@ -1,619 +1,149 @@
|
||||||
#!/usr/bin/env bash
|
#!/bin/env python3
|
||||||
#
|
#
|
||||||
## Wizard Kit: UFD Build Tool
|
# pylint: disable=no-name-in-module,wildcard-import,wrong-import-position
|
||||||
#
|
# vim: sts=2 sw=2 ts=2
|
||||||
# Based on a template by BASH3 Boilerplate v2.3.0
|
"""Wizard Kit: UFD build tool"""
|
||||||
# http://bash3boilerplate.sh/#authors
|
|
||||||
#
|
import os
|
||||||
# The MIT License (MIT)
|
import sys
|
||||||
# Copyright (c) 2013 Kevin van Zonneveld and contributors
|
|
||||||
# You are not obligated to bundle the LICENSE file with your b3bp projects as long
|
# Init
|
||||||
# as you leave these references intact in the header comments of your source files.
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
from docopt import docopt
|
||||||
# Exit on error. Append "|| true" if you expect an error.
|
from functions.common import *
|
||||||
set -o errexit
|
from functions.ufd import *
|
||||||
# Exit on error inside any functions or subshells.
|
from settings.ufd import *
|
||||||
set -o errtrace
|
init_global_vars(silent=True)
|
||||||
# Do not allow use of undefined vars. Use ${VAR:-} to use an undefined VAR
|
|
||||||
set -o nounset
|
# Main section
|
||||||
# Catch the error in case mysqldump fails (but gzip succeeds) in `mysqldump |gzip`
|
if __name__ == '__main__':
|
||||||
set -o pipefail
|
# pylint: disable=invalid-name
|
||||||
# Turn on traces, useful while debugging but commented out by default
|
# Set log
|
||||||
# set -o xtrace
|
try:
|
||||||
|
global_vars['LogDir'] = '{}/Logs'.format(
|
||||||
if [[ "${BASH_SOURCE[0]}" != "${0}" ]]; then
|
get_user_home(get_user_name()))
|
||||||
__i_am_main_script="0" # false
|
set_log_file('Build UFD ({Date-Time}).log'.format(**global_vars))
|
||||||
|
except: # pylint: disable=bare-except
|
||||||
if [[ "${__usage+x}" ]]; then
|
major_exception()
|
||||||
if [[ "${BASH_SOURCE[1]}" = "${0}" ]]; then
|
|
||||||
__i_am_main_script="1" # true
|
# Header
|
||||||
fi
|
print_success(KIT_NAME_FULL)
|
||||||
|
print_standard('UFD Build Tool')
|
||||||
__b3bp_external_usage="true"
|
print_standard(' ')
|
||||||
__b3bp_tmp_source_idx=1
|
|
||||||
fi
|
# Check if running as root
|
||||||
else
|
if not running_as_root():
|
||||||
__i_am_main_script="1" # true
|
print_error('ERROR: This script is meant to be run as root.')
|
||||||
[[ "${__usage+x}" ]] && unset -v __usage
|
abort(False)
|
||||||
[[ "${__helptext+x}" ]] && unset -v __helptext
|
|
||||||
fi
|
# Docopt
|
||||||
|
try:
|
||||||
# Set magic variables for current file, directory, os, etc.
|
args = docopt(DOCSTRING)
|
||||||
__dir="$(cd "$(dirname "${BASH_SOURCE[${__b3bp_tmp_source_idx:-0}]}")" && pwd)"
|
except SystemExit as sys_exit:
|
||||||
__file="${__dir}/$(basename "${BASH_SOURCE[${__b3bp_tmp_source_idx:-0}]}")"
|
# Catch docopt exits
|
||||||
__base="$(basename "${__file}" .sh)"
|
exit_script(sys_exit.code)
|
||||||
__wd="$(pwd)"
|
except: # pylint: disable=bare-except
|
||||||
__usage_example="Usage: sudo $(basename "${0}") --ufd-device [device] --linux-iso [path] --main-kit [path] --winpe-iso [path]"
|
major_exception()
|
||||||
__all_args=""
|
|
||||||
for a in "${@}"; do
|
try:
|
||||||
if [[ "${a:0:1}" == "-" ]]; then
|
# Verify selections
|
||||||
__all_args="${__all_args} ${a}"
|
ufd_dev = verify_ufd(args['--ufd-device'])
|
||||||
else
|
sources = verify_sources(args, UFD_SOURCES)
|
||||||
__all_args="${__all_args} \"${a}\""
|
show_selections(args, sources, ufd_dev, UFD_SOURCES)
|
||||||
fi
|
if not args['--force']:
|
||||||
done
|
confirm_selections(args)
|
||||||
|
|
||||||
|
# Prep UFD
|
||||||
# Define the environment variables (and their defaults) that this script depends on
|
if not args['--update']:
|
||||||
LOG_LEVEL="${LOG_LEVEL:-6}" # 7 = debug -> 0 = emergency
|
print_info('Prep UFD')
|
||||||
NO_COLOR="${NO_COLOR:-}" # true = disable color. otherwise autodetected
|
prep_device(ufd_dev, UFD_LABEL, use_mbr=args['--use-mbr'])
|
||||||
|
|
||||||
|
# Mount UFD
|
||||||
### Functions
|
try_and_print(
|
||||||
##############################################################################
|
indent=2,
|
||||||
|
message='Mounting UFD...',
|
||||||
function __b3bp_log () {
|
function=mount,
|
||||||
local log_level="${1}"
|
mount_source=find_first_partition(ufd_dev),
|
||||||
shift
|
mount_point='/mnt/UFD',
|
||||||
|
read_write=True,
|
||||||
# shellcheck disable=SC2034
|
)
|
||||||
local color_debug="\x1b[35m"
|
|
||||||
# shellcheck disable=SC2034
|
# Remove Arch folder
|
||||||
local color_info="\x1b[32m"
|
if args['--update']:
|
||||||
# shellcheck disable=SC2034
|
try_and_print(
|
||||||
local color_notice="\x1b[34m"
|
indent=2,
|
||||||
# shellcheck disable=SC2034
|
message='Removing Linux...',
|
||||||
local color_warning="\x1b[33m"
|
function=remove_arch,
|
||||||
# shellcheck disable=SC2034
|
)
|
||||||
local color_error="\x1b[31m"
|
|
||||||
# shellcheck disable=SC2034
|
# Copy sources
|
||||||
local color_critical="\x1b[1;31m"
|
print_standard(' ')
|
||||||
# shellcheck disable=SC2034
|
print_info('Copy Sources')
|
||||||
local color_alert="\x1b[1;33;41m"
|
for s_label, s_path in sources.items():
|
||||||
# shellcheck disable=SC2034
|
try_and_print(
|
||||||
local color_emergency="\x1b[1;4;5;33;41m"
|
indent=2,
|
||||||
|
message='Copying {}...'.format(s_label),
|
||||||
local colorvar="color_${log_level}"
|
function=copy_source,
|
||||||
|
source=s_path,
|
||||||
local color="${!colorvar:-${color_error}}"
|
items=ITEMS[s_label],
|
||||||
local color_reset="\x1b[0m"
|
overwrite=True,
|
||||||
|
)
|
||||||
if [[ "${NO_COLOR:-}" = "true" ]] || ( [[ "${TERM:-}" != *"256color"* ]] && [[ "${TERM:-}" != "xterm"* ]] && [[ "${TERM:-}" != "screen"* ]] ) || [[ ! -t 2 ]]; then
|
|
||||||
if [[ "${NO_COLOR:-}" != "false" ]]; then
|
# Update boot entries
|
||||||
# Don't use colors on pipes or non-recognized terminals
|
print_standard(' ')
|
||||||
color=""; color_reset=""
|
print_info('Boot Setup')
|
||||||
fi
|
try_and_print(
|
||||||
fi
|
indent=2,
|
||||||
|
message='Updating boot entries...',
|
||||||
# all remaining arguments are to be printed
|
function=update_boot_entries,
|
||||||
local log_line=""
|
boot_entries=BOOT_ENTRIES,
|
||||||
|
boot_files=BOOT_FILES,
|
||||||
while IFS=$'\n' read -r log_line; do
|
iso_label=ISO_LABEL,
|
||||||
echo -e "$(date -u +"%Y-%m-%d %H:%M:%S UTC") ${color}$(printf "[%9s]" "${log_level}")${color_reset} ${log_line}" 1>&2
|
ufd_label=UFD_LABEL,
|
||||||
done <<< "${@:-}"
|
)
|
||||||
}
|
|
||||||
|
# Install syslinux (to partition)
|
||||||
function emergency () { __b3bp_log emergency "${@}"; exit 1; }
|
try_and_print(
|
||||||
function alert () { [[ "${LOG_LEVEL:-0}" -ge 1 ]] && __b3bp_log alert "${@}"; true; }
|
indent=2,
|
||||||
function critical () { [[ "${LOG_LEVEL:-0}" -ge 2 ]] && __b3bp_log critical "${@}"; true; }
|
message='Syslinux (partition)...',
|
||||||
function error () { [[ "${LOG_LEVEL:-0}" -ge 3 ]] && __b3bp_log error "${@}"; true; }
|
function=install_syslinux_to_partition,
|
||||||
function warning () { [[ "${LOG_LEVEL:-0}" -ge 4 ]] && __b3bp_log warning "${@}"; true; }
|
partition=find_first_partition(ufd_dev),
|
||||||
function notice () { [[ "${LOG_LEVEL:-0}" -ge 5 ]] && __b3bp_log notice "${@}"; true; }
|
)
|
||||||
function info () { [[ "${LOG_LEVEL:-0}" -ge 6 ]] && __b3bp_log info "${@}"; true; }
|
|
||||||
function debug () { [[ "${LOG_LEVEL:-0}" -ge 7 ]] && __b3bp_log debug "${@}"; true; }
|
# Unmount UFD
|
||||||
|
try_and_print(
|
||||||
function help () {
|
indent=2,
|
||||||
echo "" 1>&2
|
message='Unmounting UFD...',
|
||||||
echo " ${*}" 1>&2
|
function=unmount,
|
||||||
echo "" 1>&2
|
mount_point='/mnt/UFD',
|
||||||
echo " ${__usage:-No usage available}" 1>&2
|
)
|
||||||
echo "" 1>&2
|
|
||||||
|
# Install syslinux (to device)
|
||||||
if [[ "${__helptext:-}" ]]; then
|
try_and_print(
|
||||||
echo " ${__helptext}" 1>&2
|
indent=2,
|
||||||
echo "" 1>&2
|
message='Syslinux (device)...',
|
||||||
fi
|
function=install_syslinux_to_dev,
|
||||||
|
ufd_dev=ufd_dev,
|
||||||
exit 1
|
use_mbr=args['--use-mbr'],
|
||||||
}
|
)
|
||||||
|
|
||||||
|
# Hide items
|
||||||
### Parse commandline options
|
print_standard(' ')
|
||||||
##############################################################################
|
print_info('Final Touches')
|
||||||
|
try_and_print(
|
||||||
# Commandline options. This defines the usage page, and is used to parse cli
|
indent=2,
|
||||||
# opts & defaults from. The parsing is unforgiving so be precise in your syntax
|
message='Hiding items...',
|
||||||
# - A short option must be preset for every long option; but every short option
|
function=hide_items,
|
||||||
# need not have a long option
|
ufd_dev=ufd_dev,
|
||||||
# - `--` is respected as the separator between options and arguments
|
items=ITEMS_HIDDEN,
|
||||||
# - We do not bash-expand defaults, so setting '~/app' as a default will not resolve to ${HOME}.
|
)
|
||||||
# you can use bash variables to work around this (so use ${HOME} instead)
|
|
||||||
|
# Done
|
||||||
# shellcheck disable=SC2015
|
if not args['--force']:
|
||||||
[[ "${__usage+x}" ]] || read -r -d '' __usage <<-'EOF' || true # exits non-zero when EOF encountered
|
print_standard('\nDone.')
|
||||||
OPTIONS:
|
pause('Press Enter to exit...')
|
||||||
-u --ufd-device [arg] Device to which the kit will be applied
|
exit_script()
|
||||||
-m --main-kit [arg] Path to the Main Kit
|
except SystemExit as sys_exit:
|
||||||
-l --linux-iso [arg] Path to the Linux ISO
|
exit_script(sys_exit.code)
|
||||||
-w --winpe-iso [arg] Path to the WinPE ISO
|
except: # pylint: disable=bare-except
|
||||||
|
major_exception()
|
||||||
-e --extra-dir [arg] Path to the Extra folder (optional)
|
|
||||||
-h --help This page
|
|
||||||
|
|
||||||
ADVANCED:
|
|
||||||
-d --debug Enable debug mode
|
|
||||||
-v --verbose Enable verbose mode
|
|
||||||
-M --use-mbr Use real MBR instead of GPT w/ Protective MBR
|
|
||||||
-F --force Bypass all confirmation messages. USE WITH EXTREME CAUTION!
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# shellcheck disable=SC2015
|
|
||||||
[[ "${__helptext+x}" ]] || read -r -d '' __helptext <<-'EOF' || true # exits non-zero when EOF encountered
|
|
||||||
Paths can be relative to the current working directory or absolute
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Translate usage string -> getopts arguments, and set $arg_<flag> defaults
|
|
||||||
while read -r __b3bp_tmp_line; do
|
|
||||||
if [[ "${__b3bp_tmp_line}" =~ ^- ]]; then
|
|
||||||
# fetch single character version of option string
|
|
||||||
__b3bp_tmp_opt="${__b3bp_tmp_line%% *}"
|
|
||||||
__b3bp_tmp_opt="${__b3bp_tmp_opt:1}"
|
|
||||||
|
|
||||||
# fetch long version if present
|
|
||||||
__b3bp_tmp_long_opt=""
|
|
||||||
|
|
||||||
if [[ "${__b3bp_tmp_line}" = *"--"* ]]; then
|
|
||||||
__b3bp_tmp_long_opt="${__b3bp_tmp_line#*--}"
|
|
||||||
__b3bp_tmp_long_opt="${__b3bp_tmp_long_opt%% *}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# map opt long name to+from opt short name
|
|
||||||
printf -v "__b3bp_tmp_opt_long2short_${__b3bp_tmp_long_opt//-/_}" '%s' "${__b3bp_tmp_opt}"
|
|
||||||
printf -v "__b3bp_tmp_opt_short2long_${__b3bp_tmp_opt}" '%s' "${__b3bp_tmp_long_opt//-/_}"
|
|
||||||
|
|
||||||
# check if option takes an argument
|
|
||||||
if [[ "${__b3bp_tmp_line}" =~ \[.*\] ]]; then
|
|
||||||
__b3bp_tmp_opt="${__b3bp_tmp_opt}:" # add : if opt has arg
|
|
||||||
__b3bp_tmp_init="" # it has an arg. init with ""
|
|
||||||
printf -v "__b3bp_tmp_has_arg_${__b3bp_tmp_opt:0:1}" '%s' "1"
|
|
||||||
elif [[ "${__b3bp_tmp_line}" =~ \{.*\} ]]; then
|
|
||||||
__b3bp_tmp_opt="${__b3bp_tmp_opt}:" # add : if opt has arg
|
|
||||||
__b3bp_tmp_init="" # it has an arg. init with ""
|
|
||||||
# remember that this option requires an argument
|
|
||||||
printf -v "__b3bp_tmp_has_arg_${__b3bp_tmp_opt:0:1}" '%s' "2"
|
|
||||||
else
|
|
||||||
__b3bp_tmp_init="0" # it's a flag. init with 0
|
|
||||||
printf -v "__b3bp_tmp_has_arg_${__b3bp_tmp_opt:0:1}" '%s' "0"
|
|
||||||
fi
|
|
||||||
__b3bp_tmp_opts="${__b3bp_tmp_opts:-}${__b3bp_tmp_opt}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
[[ "${__b3bp_tmp_opt:-}" ]] || continue
|
|
||||||
|
|
||||||
if [[ "${__b3bp_tmp_line}" =~ (^|\.\ *)Default= ]]; then
|
|
||||||
# ignore default value if option does not have an argument
|
|
||||||
__b3bp_tmp_varname="__b3bp_tmp_has_arg_${__b3bp_tmp_opt:0:1}"
|
|
||||||
|
|
||||||
if [[ "${!__b3bp_tmp_varname}" != "0" ]]; then
|
|
||||||
__b3bp_tmp_init="${__b3bp_tmp_line##*Default=}"
|
|
||||||
__b3bp_tmp_re='^"(.*)"$'
|
|
||||||
if [[ "${__b3bp_tmp_init}" =~ ${__b3bp_tmp_re} ]]; then
|
|
||||||
__b3bp_tmp_init="${BASH_REMATCH[1]}"
|
|
||||||
else
|
|
||||||
__b3bp_tmp_re="^'(.*)'$"
|
|
||||||
if [[ "${__b3bp_tmp_init}" =~ ${__b3bp_tmp_re} ]]; then
|
|
||||||
__b3bp_tmp_init="${BASH_REMATCH[1]}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${__b3bp_tmp_line}" =~ (^|\.\ *)Required\. ]]; then
|
|
||||||
# remember that this option requires an argument
|
|
||||||
printf -v "__b3bp_tmp_has_arg_${__b3bp_tmp_opt:0:1}" '%s' "2"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf -v "arg_${__b3bp_tmp_opt:0:1}" '%s' "${__b3bp_tmp_init}"
|
|
||||||
done <<< "${__usage:-}"
|
|
||||||
|
|
||||||
# run getopts only if options were specified in __usage
|
|
||||||
if [[ "${__b3bp_tmp_opts:-}" ]]; then
|
|
||||||
# Allow long options like --this
|
|
||||||
__b3bp_tmp_opts="${__b3bp_tmp_opts}-:"
|
|
||||||
|
|
||||||
# Reset in case getopts has been used previously in the shell.
|
|
||||||
OPTIND=1
|
|
||||||
|
|
||||||
# start parsing command line
|
|
||||||
set +o nounset # unexpected arguments will cause unbound variables
|
|
||||||
# to be dereferenced
|
|
||||||
# Overwrite $arg_<flag> defaults with the actual CLI options
|
|
||||||
while getopts "${__b3bp_tmp_opts}" __b3bp_tmp_opt; do
|
|
||||||
[[ "${__b3bp_tmp_opt}" = "?" ]] && help "Invalid use of script: ${*} "
|
|
||||||
|
|
||||||
if [[ "${__b3bp_tmp_opt}" = "-" ]]; then
|
|
||||||
# OPTARG is long-option-name or long-option=value
|
|
||||||
if [[ "${OPTARG}" =~ .*=.* ]]; then
|
|
||||||
# --key=value format
|
|
||||||
__b3bp_tmp_long_opt=${OPTARG/=*/}
|
|
||||||
# Set opt to the short option corresponding to the long option
|
|
||||||
__b3bp_tmp_varname="__b3bp_tmp_opt_long2short_${__b3bp_tmp_long_opt//-/_}"
|
|
||||||
printf -v "__b3bp_tmp_opt" '%s' "${!__b3bp_tmp_varname}"
|
|
||||||
OPTARG=${OPTARG#*=}
|
|
||||||
else
|
|
||||||
# --key value format
|
|
||||||
# Map long name to short version of option
|
|
||||||
__b3bp_tmp_varname="__b3bp_tmp_opt_long2short_${OPTARG//-/_}"
|
|
||||||
printf -v "__b3bp_tmp_opt" '%s' "${!__b3bp_tmp_varname}"
|
|
||||||
# Only assign OPTARG if option takes an argument
|
|
||||||
__b3bp_tmp_varname="__b3bp_tmp_has_arg_${__b3bp_tmp_opt}"
|
|
||||||
printf -v "OPTARG" '%s' "${@:OPTIND:${!__b3bp_tmp_varname}}"
|
|
||||||
# shift over the argument if argument is expected
|
|
||||||
((OPTIND+=__b3bp_tmp_has_arg_${__b3bp_tmp_opt}))
|
|
||||||
fi
|
|
||||||
# we have set opt/OPTARG to the short value and the argument as OPTARG if it exists
|
|
||||||
fi
|
|
||||||
__b3bp_tmp_varname="arg_${__b3bp_tmp_opt:0:1}"
|
|
||||||
__b3bp_tmp_default="${!__b3bp_tmp_varname}"
|
|
||||||
|
|
||||||
__b3bp_tmp_value="${OPTARG}"
|
|
||||||
if [[ -z "${OPTARG}" ]] && [[ "${__b3bp_tmp_default}" = "0" ]]; then
|
|
||||||
__b3bp_tmp_value="1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf -v "${__b3bp_tmp_varname}" '%s' "${__b3bp_tmp_value}"
|
|
||||||
debug "cli arg ${__b3bp_tmp_varname} = (${__b3bp_tmp_default}) -> ${!__b3bp_tmp_varname}"
|
|
||||||
done
|
|
||||||
set -o nounset # no more unbound variable references expected
|
|
||||||
|
|
||||||
shift $((OPTIND-1))
|
|
||||||
|
|
||||||
if [[ "${1:-}" = "--" ]] ; then
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
### Automatic validation of required option arguments
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
for __b3bp_tmp_varname in ${!__b3bp_tmp_has_arg_*}; do
|
|
||||||
# validate only options which required an argument
|
|
||||||
[[ "${!__b3bp_tmp_varname}" = "2" ]] || continue
|
|
||||||
|
|
||||||
__b3bp_tmp_opt_short="${__b3bp_tmp_varname##*_}"
|
|
||||||
__b3bp_tmp_varname="arg_${__b3bp_tmp_opt_short}"
|
|
||||||
[[ "${!__b3bp_tmp_varname}" ]] && continue
|
|
||||||
|
|
||||||
__b3bp_tmp_varname="__b3bp_tmp_opt_short2long_${__b3bp_tmp_opt_short}"
|
|
||||||
printf -v "__b3bp_tmp_opt_long" '%s' "${!__b3bp_tmp_varname}"
|
|
||||||
[[ "${__b3bp_tmp_opt_long:-}" ]] && __b3bp_tmp_opt_long=" (--${__b3bp_tmp_opt_long//_/-})"
|
|
||||||
|
|
||||||
help "Option -${__b3bp_tmp_opt_short}${__b3bp_tmp_opt_long:-} requires an argument"
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
### Cleanup Environment variables
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
for __tmp_varname in ${!__b3bp_tmp_*}; do
|
|
||||||
unset -v "${__tmp_varname}"
|
|
||||||
done
|
|
||||||
|
|
||||||
unset -v __tmp_varname
|
|
||||||
|
|
||||||
|
|
||||||
### Externally supplied __usage. Nothing else to do here
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
if [[ "${__b3bp_external_usage:-}" = "true" ]]; then
|
|
||||||
unset -v __b3bp_external_usage
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
### Signal trapping and backtracing
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
function __b3bp_cleanup_before_exit () {
|
|
||||||
if [[ "$EUID" -eq 0 ]]; then
|
|
||||||
for d in Dest Linux WinPE; do
|
|
||||||
if [[ -d "/mnt/${d}" ]]; then
|
|
||||||
umount "/mnt/${d}" || true
|
|
||||||
rmdir "/mnt/${d}" || true
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
if [[ "${?}" != "0" ]]; then
|
|
||||||
info "Sources unmounted"
|
|
||||||
fi
|
|
||||||
if [[ ${arg_F:-} == 0 && "${SILENT:-False}" == "False" ]]; then
|
|
||||||
read -r -p "Press Enter to exit... " ignored_var 2>&1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
trap __b3bp_cleanup_before_exit EXIT
|
|
||||||
|
|
||||||
# requires `set -o errtrace`
|
|
||||||
__b3bp_err_report() {
|
|
||||||
local error_code
|
|
||||||
error_code=${?}
|
|
||||||
error "Error in ${__file} in function ${1} on line ${2}"
|
|
||||||
exit ${error_code}
|
|
||||||
}
|
|
||||||
# Uncomment the following line for always providing an error backtrace
|
|
||||||
trap '__b3bp_err_report "${FUNCNAME:-.}" ${LINENO}' ERR
|
|
||||||
|
|
||||||
|
|
||||||
### Command-line argument switches (like -d for debugmode, -h for showing helppage)
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
# debug mode
|
|
||||||
if [[ "${arg_d:?}" = "1" ]]; then
|
|
||||||
set -o xtrace
|
|
||||||
LOG_LEVEL="7"
|
|
||||||
# Enable error backtracing
|
|
||||||
trap '__b3bp_err_report "${FUNCNAME:-.}" ${LINENO}' ERR
|
|
||||||
fi
|
|
||||||
|
|
||||||
# verbose mode
|
|
||||||
if [[ "${arg_v:?}" = "1" ]]; then
|
|
||||||
set -o verbose
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
### Validation. Error out if the things required for your script are not present
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
if [[ "${arg_F:?}" == 1 ]]; then
|
|
||||||
SILENT="True"
|
|
||||||
else
|
|
||||||
SILENT="False"
|
|
||||||
fi
|
|
||||||
if [[ "${arg_M:?}" == 1 ]]; then
|
|
||||||
USE_MBR="True"
|
|
||||||
else
|
|
||||||
USE_MBR="False"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${arg_h:?}" == 1 ]]; then
|
|
||||||
help "${__usage_example}"
|
|
||||||
else
|
|
||||||
# Print warning line
|
|
||||||
[[ "${arg_u:-}" ]] || echo " -u or --ufd-device is required"
|
|
||||||
[[ "${arg_m:-}" ]] || echo " -m or --main-kit is required"
|
|
||||||
[[ "${arg_l:-}" ]] || echo " -l or --linux-iso is required"
|
|
||||||
[[ "${arg_w:-}" ]] || echo " -w or --winpe-iso is required"
|
|
||||||
|
|
||||||
# Bail if necessary
|
|
||||||
[[ "${arg_u:-}" ]] || help "${__usage_example}"
|
|
||||||
[[ "${arg_l:-}" ]] || help "${__usage_example}"
|
|
||||||
[[ "${arg_m:-}" ]] || help "${__usage_example}"
|
|
||||||
[[ "${arg_w:-}" ]] || help "${__usage_example}"
|
|
||||||
fi
|
|
||||||
[[ "${LOG_LEVEL:-}" ]] || emergency "Cannot continue without LOG_LEVEL. "
|
|
||||||
|
|
||||||
|
|
||||||
### More functions
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
function abort () {
|
|
||||||
local abort_message="Aborted"
|
|
||||||
[[ "${1:-}" ]] && abort_message="${1}" || true
|
|
||||||
error "${abort_message}"
|
|
||||||
#echo -e "${YELLOW}${abort_message}${CLEAR}"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function ask() {
|
|
||||||
if [[ "${SILENT}" == "True" ]]; then
|
|
||||||
echo -e "${1:-} Yes ${BLUE}(Silent)${CLEAR}"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
while :; do
|
|
||||||
read -p "${1:-} [Y/N] " -r answer
|
|
||||||
if echo "$answer" | egrep -iq '^(y|yes|sure)$'; then
|
|
||||||
return 0
|
|
||||||
elif echo "$answer" | egrep -iq '^(n|no|nope)$'; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
### Runtime
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
# VARIABLES
|
|
||||||
DEST_DEV="${arg_u}"
|
|
||||||
DEST_PAR="${DEST_DEV}1"
|
|
||||||
LOG_FILE="$(getent passwd "$SUDO_USER" | cut -d: -f6)/Logs/build-ufd_${DEST_DEV##*/}_$(date +%Y-%m-%d_%H%M_%z).log"
|
|
||||||
MAIN_PY="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/settings/main.py"
|
|
||||||
RSYNC_ARGS="-hrtuvS --modify-window=1 --progress"
|
|
||||||
MAIN_KIT="$(realpath "${arg_m:-}" 2>/dev/null || true)"
|
|
||||||
LINUX_ISO="$(realpath "${arg_l:-}" 2>/dev/null || true)"
|
|
||||||
WINPE_ISO="$(realpath "${arg_w:-}" 2>/dev/null || true)"
|
|
||||||
EXTRA_DIR="$(realpath "${arg_e:-}" 2>/dev/null || true)"
|
|
||||||
mkdir -p "$(dirname "$LOG_FILE")"
|
|
||||||
chown "$SUDO_USER:$SUDO_USER" -R "$(dirname "$LOG_FILE")"
|
|
||||||
|
|
||||||
# COLORS
|
|
||||||
CLEAR="\e[0m"
|
|
||||||
RED="\e[31m"
|
|
||||||
GREEN="\e[32m"
|
|
||||||
YELLOW="\e[33m"
|
|
||||||
BLUE="\e[34m"
|
|
||||||
|
|
||||||
# Load main.py settings
|
|
||||||
if [ ! -f "${MAIN_PY}" ]; then
|
|
||||||
echo -e "${RED}ERROR${CLEAR}: ${MAIN_PY} not found."
|
|
||||||
abort
|
|
||||||
fi
|
|
||||||
while read line; do
|
|
||||||
if echo "${line}" | egrep -q "^\w+='"; then
|
|
||||||
line="$(echo "${line}" | sed -r 's/[\r\n]+//')"
|
|
||||||
eval "${line}"
|
|
||||||
fi
|
|
||||||
done < "${MAIN_PY}"
|
|
||||||
if [ -z ${KIT_NAME_FULL+x} ]; then
|
|
||||||
# KIT_NAME_FULL is not set, assume main.py missing or malformatted
|
|
||||||
echo -e "${RED}ERROR${CLEAR}: failed to load settings from ${MAIN_PY}"
|
|
||||||
abort
|
|
||||||
fi
|
|
||||||
ISO_LABEL="${KIT_NAME_SHORT}_LINUX"
|
|
||||||
UFD_LABEL="${KIT_NAME_SHORT}_UFD"
|
|
||||||
|
|
||||||
# Check if root
|
|
||||||
if [[ "$EUID" -ne 0 ]]; then
|
|
||||||
echo -e "${RED}ERROR${CLEAR}: This script must be run as root."
|
|
||||||
abort
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if in tmux
|
|
||||||
if ! tmux list-session 2>/dev/null | grep -q "build-ufd"; then
|
|
||||||
# Reload in tmux
|
|
||||||
eval tmux new-session -s "build-ufd" "${0:-}" ${__all_args}
|
|
||||||
SILENT="True" # avoid two "Press Enter to exit..." prompts
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Header
|
|
||||||
echo -e "${GREEN}${KIT_NAME_FULL}${CLEAR}: UFD Build Tool"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Verify sources
|
|
||||||
[[ -b "${DEST_DEV}" ]] || abort "${DEST_DEV} is not a valid device."
|
|
||||||
[[ -d "${MAIN_KIT}/.bin" ]] || abort "Invalid Main Kit, ${MAIN_KIT}/.bin not found."
|
|
||||||
[[ -e "${LINUX_ISO}" ]] || abort "Linux ISO not found."
|
|
||||||
[[ -e "${WINPE_ISO}" ]] || abort "WinPE ISO not found."
|
|
||||||
if [[ ! -z "${arg_e:-}" ]]; then
|
|
||||||
[[ -d "${EXTRA_DIR}" ]] || abort "Extra Dir not found."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Print Info
|
|
||||||
echo -e "${BLUE}Sources${CLEAR}"
|
|
||||||
echo "Main Kit: ${MAIN_KIT}"
|
|
||||||
echo "Linux ISO: ${LINUX_ISO}"
|
|
||||||
echo "WinPE ISO: ${WINPE_ISO}"
|
|
||||||
echo "Extra Dir: ${EXTRA_DIR:-(Not Specified)}"
|
|
||||||
echo ""
|
|
||||||
echo -e "${BLUE}Destination${CLEAR}"
|
|
||||||
lsblk -n -o NAME,LABEL,SIZE,MODEL,SERIAL "${DEST_DEV}"
|
|
||||||
if [[ "${USE_MBR}" == "True" ]]; then
|
|
||||||
echo -e "${YELLOW}Formatting using legacy MBR${CLEAR}"
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Ask before starting job
|
|
||||||
echo ""
|
|
||||||
if ask "Is the above information correct?"; then
|
|
||||||
echo ""
|
|
||||||
echo -e "${YELLOW}SAFETY CHECK${CLEAR}"
|
|
||||||
echo "All data will be DELETED from the disk and partition(s) listed above."
|
|
||||||
echo -e "This is irreversible and will lead to ${RED}DATA LOSS.${CLEAR}"
|
|
||||||
if ! ask "Asking again to confirm, is this correct?"; then
|
|
||||||
abort
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
abort
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Start Build
|
|
||||||
echo ""
|
|
||||||
echo -e "${GREEN}Building Kit${CLEAR}"
|
|
||||||
touch "${LOG_FILE}"
|
|
||||||
tmux split-window -dl 10 tail -f "${LOG_FILE}"
|
|
||||||
|
|
||||||
# Format
|
|
||||||
echo "Formatting drive..."
|
|
||||||
if [[ "${USE_MBR}" == "True" ]]; then
|
|
||||||
parted "${DEST_DEV}" --script -- mklabel msdos mkpart primary fat32 4MiB -1s >> "${LOG_FILE}" 2>&1
|
|
||||||
parted "${DEST_DEV}" set 1 boot on >> "${LOG_FILE}" 2>&1
|
|
||||||
else
|
|
||||||
parted "${DEST_DEV}" --script -- mklabel gpt mkpart primary fat32 4MiB -4MiB >> "${LOG_FILE}" 2>&1
|
|
||||||
parted "${DEST_DEV}" set 1 legacy_boot on >> "${LOG_FILE}" 2>&1
|
|
||||||
#parted "${DEST_DEV}" disk_set pmbr_boot on >> "${LOG_FILE}" 2>&1
|
|
||||||
# pmbr_boot breaks detection on some UEFI MOBOs
|
|
||||||
fi
|
|
||||||
mkfs.vfat -F 32 -n "${UFD_LABEL}" "${DEST_PAR}" >> "${LOG_FILE}" 2>&1
|
|
||||||
|
|
||||||
# Mount sources and dest
|
|
||||||
echo "Mounting sources and destination..."
|
|
||||||
mkdir /mnt/{Dest,Linux,WinPE} -p >> "${LOG_FILE}" 2>&1
|
|
||||||
mount ${DEST_PAR} /mnt/Dest >> "${LOG_FILE}" 2>&1
|
|
||||||
mount "${LINUX_ISO}" /mnt/Linux -r >> "${LOG_FILE}" 2>&1
|
|
||||||
mount "${WINPE_ISO}" /mnt/WinPE -r >> "${LOG_FILE}" 2>&1
|
|
||||||
|
|
||||||
# Copy files
|
|
||||||
echo "Copying Linux files..."
|
|
||||||
rsync ${RSYNC_ARGS} /mnt/Linux/* /mnt/Dest/ >> "${LOG_FILE}" 2>&1
|
|
||||||
sed -i "s/${ISO_LABEL}/${UFD_LABEL}/" /mnt/Dest/EFI/boot/refind.conf
|
|
||||||
sed -i "s/#UFD#//" /mnt/Dest/EFI/boot/refind.conf
|
|
||||||
sed -i "s/${ISO_LABEL}/${UFD_LABEL}/" /mnt/Dest/arch/boot/syslinux/*cfg
|
|
||||||
sed -i "s/#UFD#//" /mnt/Dest/arch/boot/syslinux/*cfg
|
|
||||||
|
|
||||||
echo "Copying WinPE files..."
|
|
||||||
rsync ${RSYNC_ARGS} /mnt/WinPE/{Boot,bootmgr{,.efi},en-us,sources} /mnt/Dest/ >> "${LOG_FILE}" 2>&1
|
|
||||||
rsync ${RSYNC_ARGS} /mnt/WinPE/EFI/Microsoft /mnt/Dest/EFI/ >> "${LOG_FILE}" 2>&1
|
|
||||||
rsync ${RSYNC_ARGS} /mnt/WinPE/EFI/Boot/* /mnt/Dest/EFI/Microsoft/ >> "${LOG_FILE}" 2>&1
|
|
||||||
rsync ${RSYNC_ARGS} /mnt/WinPE/{Boot/{BCD,boot.sdi},bootmgr} /mnt/Dest/sources/ >> "${LOG_FILE}" 2>&1
|
|
||||||
|
|
||||||
echo "Copying Main Kit..."
|
|
||||||
rsync ${RSYNC_ARGS} "${MAIN_KIT}/" "/mnt/Dest/${KIT_NAME_FULL}/" >> "${LOG_FILE}" 2>&1
|
|
||||||
|
|
||||||
if [[ ! -z "${EXTRA_DIR:-}" ]]; then
|
|
||||||
echo "Copying Extra files..."
|
|
||||||
rsync ${RSYNC_ARGS} "${EXTRA_DIR}"/ /mnt/Dest/ >> "${LOG_FILE}" 2>&1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Install syslinux
|
|
||||||
echo "Copying Syslinux files..."
|
|
||||||
rsync ${RSYNC_ARGS} /usr/lib/syslinux/bios/*.c32 /mnt/Dest/arch/boot/syslinux/ >> "${LOG_FILE}" 2>&1
|
|
||||||
syslinux --install -d /arch/boot/syslinux/ ${DEST_PAR} >> "${LOG_FILE}" 2>&1
|
|
||||||
|
|
||||||
echo "Unmounting destination..."
|
|
||||||
umount /mnt/Dest >> "${LOG_FILE}" 2>&1
|
|
||||||
rmdir /mnt/Dest >> "${LOG_FILE}" 2>&1
|
|
||||||
sync
|
|
||||||
|
|
||||||
echo "Installing Syslinux MBR..."
|
|
||||||
if [[ "${USE_MBR}" == "True" ]]; then
|
|
||||||
dd bs=440 count=1 if=/usr/lib/syslinux/bios/mbr.bin of=${DEST_DEV} >> "${LOG_FILE}" 2>&1
|
|
||||||
else
|
|
||||||
dd bs=440 count=1 if=/usr/lib/syslinux/bios/gptmbr.bin of=${DEST_DEV} >> "${LOG_FILE}" 2>&1
|
|
||||||
fi
|
|
||||||
sync
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
echo "Hiding boot files..."
|
|
||||||
echo "drive s: file=\"${DEST_PAR}\"" > /root/.mtoolsrc
|
|
||||||
echo 'mtools_skip_check=1' >> /root/.mtoolsrc
|
|
||||||
for item in arch Boot bootmgr{,.efi} EFI en-us images isolinux sources "${KIT_NAME_FULL}"/{.bin,.cbin}; do
|
|
||||||
yes | mattrib +h "S:/${item}" >> "${LOG_FILE}" 2>&1 || true
|
|
||||||
done
|
|
||||||
sync
|
|
||||||
|
|
||||||
# Unmount Sources
|
|
||||||
echo "Unmounting sources..."
|
|
||||||
for d in Linux WinPE; do
|
|
||||||
umount "/mnt/${d}" >> "${LOG_FILE}" 2>&1 || true
|
|
||||||
rmdir "/mnt/${d}" >> "${LOG_FILE}" 2>&1 || true
|
|
||||||
done
|
|
||||||
|
|
||||||
# Close progress pane
|
|
||||||
pkill -f "tail.*${LOG_FILE}"
|
|
||||||
|
|
||||||
# Done
|
|
||||||
echo ""
|
|
||||||
echo "Done."
|
|
||||||
echo ""
|
|
||||||
exit 0
|
|
||||||
|
|
|
||||||
|
|
@ -79,21 +79,21 @@ if ($MyInvocation.InvocationName -ne ".") {
|
||||||
$Path = $Temp
|
$Path = $Temp
|
||||||
|
|
||||||
# 7-Zip
|
# 7-Zip
|
||||||
DownloadFile -Path $Path -Name "7z-installer.msi" -Url "https://www.7-zip.org/a/7z1805.msi"
|
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/7z1805-extra.7z"
|
DownloadFile -Path $Path -Name "7z-extra.7z" -Url "https://www.7-zip.org/a/7z1900-extra.7z"
|
||||||
|
|
||||||
# ConEmu
|
# ConEmu
|
||||||
$Url = "https://github.com/Maximus5/ConEmu/releases/download/v18.06.26/ConEmuPack.180626.7z"
|
$Url = "https://github.com/Maximus5/ConEmu/releases/download/v19.03.10/ConEmuPack.190310.7z"
|
||||||
DownloadFile -Path $Path -Name "ConEmuPack.7z" -Url $Url
|
DownloadFile -Path $Path -Name "ConEmuPack.7z" -Url $Url
|
||||||
|
|
||||||
# Notepad++
|
# Notepad++
|
||||||
$Url = "https://notepad-plus-plus.org/repository/7.x/7.5.8/npp.7.5.8.bin.minimalist.7z"
|
$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 $Path -Name "npp.7z" -Url $Url
|
||||||
|
|
||||||
# Python
|
# Python
|
||||||
$Url = "https://www.python.org/ftp/python/3.7.0/python-3.7.0-embed-win32.zip"
|
$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
|
DownloadFile -Path $Path -Name "python32.zip" -Url $Url
|
||||||
$Url = "https://www.python.org/ftp/python/3.7.0/python-3.7.0-embed-amd64.zip"
|
$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 $Path -Name "python64.zip" -Url $Url
|
||||||
|
|
||||||
# Python: psutil
|
# Python: psutil
|
||||||
|
|
|
||||||
|
|
@ -131,25 +131,25 @@ if ($MyInvocation.InvocationName -ne ".") {
|
||||||
## Download Tools ##
|
## Download Tools ##
|
||||||
$ToolSources = @(
|
$ToolSources = @(
|
||||||
# 7-Zip
|
# 7-Zip
|
||||||
@("7z-installer.msi", "https://www.7-zip.org/a/7z1805.msi"),
|
@("7z-installer.msi", "https://www.7-zip.org/a/7z1900.msi"),
|
||||||
@("7z-extra.7z", "https://www.7-zip.org/a/7z1805-extra.7z"),
|
@("7z-extra.7z", "https://www.7-zip.org/a/7z1900-extra.7z"),
|
||||||
# Blue Screen View
|
# Blue Screen View
|
||||||
@("bluescreenview32.zip", "http://www.nirsoft.net/utils/bluescreenview.zip"),
|
@("bluescreenview32.zip", "http://www.nirsoft.net/utils/bluescreenview.zip"),
|
||||||
@("bluescreenview64.zip", "http://www.nirsoft.net/utils/bluescreenview-x64.zip"),
|
@("bluescreenview64.zip", "http://www.nirsoft.net/utils/bluescreenview-x64.zip"),
|
||||||
# ConEmu
|
# ConEmu
|
||||||
@("ConEmuPack.7z", "https://github.com/Maximus5/ConEmu/releases/download/v18.06.26/ConEmuPack.180626.7z"),
|
@("ConEmuPack.7z", "https://github.com/Maximus5/ConEmu/releases/download/v19.03.10/ConEmuPack.190310.7z"),
|
||||||
# Fast Copy
|
# Fast Copy
|
||||||
@("fastcopy.zip", "http://ftp.vector.co.jp/70/64/2323/FastCopy354_installer.zip"),
|
@("fastcopy.zip", "http://ftp.vector.co.jp/71/31/2323/FastCopy363_installer.exe"),
|
||||||
# HWiNFO
|
# HWiNFO
|
||||||
@("hwinfo.zip", "http://app.oldfoss.com:81/download/HWiNFO/hwi_588.zip"),
|
@("hwinfo.zip", "http://files2.majorgeeks.com/377527622c5325acc1cb937fb149d0de922320c0/systeminfo/hwi_602.zip"),
|
||||||
# Killer Network Drivers
|
# Killer Network Drivers
|
||||||
@(
|
@(
|
||||||
"killerinf.zip",
|
"killerinf.zip",
|
||||||
("http://www.killernetworking.com"+(FindDynamicUrl "http://www.killernetworking.com/driver-downloads/item/killer-drivers-inf" "Download Killer-Ethernet").replace('&', '&'))
|
("https://www.killernetworking.com"+(FindDynamicUrl "https://www.killernetworking.com/killersupport/category/other-downloads" "Download Killer-Ethernet").replace('&', '&'))
|
||||||
),
|
),
|
||||||
# Notepad++
|
# Notepad++
|
||||||
@("npp_x86.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.8/npp.7.5.8.bin.minimalist.7z"),
|
@("npp_x86.7z", "https://notepad-plus-plus.org/repository/7.x/7.6.4/npp.7.6.4.bin.minimalist.7z"),
|
||||||
@("npp_amd64.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.8/npp.7.5.8.bin.minimalist.x64.7z"),
|
@("npp_amd64.7z", "https://notepad-plus-plus.org/repository/7.x/7.6.4/npp.7.6.4.bin.minimalist.x64.7z"),
|
||||||
# NT Password Editor
|
# NT Password Editor
|
||||||
@("ntpwed.zip", "http://cdslow.org.ru/files/ntpwedit/ntpwed07.zip"),
|
@("ntpwed.zip", "http://cdslow.org.ru/files/ntpwedit/ntpwed07.zip"),
|
||||||
# Prime95
|
# Prime95
|
||||||
|
|
@ -159,8 +159,8 @@ if ($MyInvocation.InvocationName -ne ".") {
|
||||||
@("produkey32.zip", "http://www.nirsoft.net/utils/produkey.zip"),
|
@("produkey32.zip", "http://www.nirsoft.net/utils/produkey.zip"),
|
||||||
@("produkey64.zip", "http://www.nirsoft.net/utils/produkey-x64.zip"),
|
@("produkey64.zip", "http://www.nirsoft.net/utils/produkey-x64.zip"),
|
||||||
# Python
|
# Python
|
||||||
@("python32.zip", "https://www.python.org/ftp/python/3.7.0/python-3.7.0-embed-win32.zip"),
|
@("python32.zip", "https://www.python.org/ftp/python/3.7.2/python-3.7.2.post1-embed-win32.zip"),
|
||||||
@("python64.zip", "https://www.python.org/ftp/python/3.7.0/python-3.7.0-embed-amd64.zip"),
|
@("python64.zip", "https://www.python.org/ftp/python/3.7.2/python-3.7.2.post1-embed-amd64.zip"),
|
||||||
# Python: psutil
|
# Python: psutil
|
||||||
@(
|
@(
|
||||||
"psutil64.whl",
|
"psutil64.whl",
|
||||||
|
|
@ -182,8 +182,8 @@ if ($MyInvocation.InvocationName -ne ".") {
|
||||||
@("vcredist_x86.exe", "https://aka.ms/vs/15/release/vc_redist.x86.exe"),
|
@("vcredist_x86.exe", "https://aka.ms/vs/15/release/vc_redist.x86.exe"),
|
||||||
@("vcredist_x64.exe", "https://aka.ms/vs/15/release/vc_redist.x64.exe"),
|
@("vcredist_x64.exe", "https://aka.ms/vs/15/release/vc_redist.x64.exe"),
|
||||||
# wimlib-imagex
|
# wimlib-imagex
|
||||||
@("wimlib32.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip"),
|
@("wimlib32.zip", "https://wimlib.net/downloads/wimlib-1.13.0-windows-i686-bin.zip"),
|
||||||
@("wimlib64.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-x86_64-bin.zip")
|
@("wimlib64.zip", "https://wimlib.net/downloads/wimlib-1.13.0-windows-x86_64-bin.zip")
|
||||||
)
|
)
|
||||||
foreach ($Tool in $ToolSources) {
|
foreach ($Tool in $ToolSources) {
|
||||||
DownloadFile -Path $Temp -Name $Tool[0] -Url $Tool[1]
|
DownloadFile -Path $Temp -Name $Tool[0] -Url $Tool[1]
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,12 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.cleanup import *
|
from functions.cleanup import *
|
||||||
from functions.data import *
|
from functions.data import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: CBS Cleanup'.format(KIT_NAME_FULL))
|
os.system('title {}: CBS Cleanup'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\CBS Cleanup.log'.format(**global_vars)
|
set_log_file('CBS Cleanup.log')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
|
|
@ -36,7 +35,9 @@ if __name__ == '__main__':
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,11 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.repairs import *
|
from functions.repairs import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: Check Disk Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: Check Disk Tool'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\Check Disk.log'.format(**global_vars)
|
set_log_file('Check Disk.log')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
|
|
@ -39,7 +38,7 @@ if __name__ == '__main__':
|
||||||
if repair:
|
if repair:
|
||||||
cs = 'Scheduled'
|
cs = 'Scheduled'
|
||||||
else:
|
else:
|
||||||
cs = 'CS'
|
cs = 'No issues'
|
||||||
message = 'CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env'])
|
message = 'CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env'])
|
||||||
try_and_print(message=message, function=run_chkdsk,
|
try_and_print(message=message, function=run_chkdsk,
|
||||||
cs=cs, other_results=other_results, repair=repair)
|
cs=cs, other_results=other_results, repair=repair)
|
||||||
|
|
@ -50,7 +49,9 @@ if __name__ == '__main__':
|
||||||
print_success('Done.')
|
print_success('Done.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
#!/bin/python3
|
|
||||||
#
|
|
||||||
## Wizard Kit: Network connection tool
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Init
|
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.network import *
|
|
||||||
init_global_vars()
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
try:
|
|
||||||
# Prep
|
|
||||||
clear_screen()
|
|
||||||
|
|
||||||
# Connect
|
|
||||||
connect_to_network()
|
|
||||||
|
|
||||||
# Done
|
|
||||||
print_standard('\nDone.')
|
|
||||||
#pause("Press Enter to exit...")
|
|
||||||
exit_script()
|
|
||||||
except SystemExit:
|
|
||||||
pass
|
|
||||||
except:
|
|
||||||
major_exception()
|
|
||||||
|
|
||||||
|
|
@ -2,42 +2,10 @@
|
||||||
#
|
#
|
||||||
## Wizard Kit: ddrescue TUI Launcher
|
## Wizard Kit: ddrescue TUI Launcher
|
||||||
|
|
||||||
|
source launch-in-tmux
|
||||||
|
|
||||||
SESSION_NAME="ddrescue-tui"
|
SESSION_NAME="ddrescue-tui"
|
||||||
WINDOW_NAME="GNU ddrescue TUI"
|
WINDOW_NAME="ddrescue TUI"
|
||||||
MENU="ddrescue-tui-menu"
|
TMUX_CMD="ddrescue-tui-menu"
|
||||||
|
|
||||||
function ask() {
|
|
||||||
while :; do
|
|
||||||
read -p "$1 " -r answer
|
|
||||||
if echo "$answer" | egrep -iq '^(y|yes|sure)$'; then
|
|
||||||
return 0
|
|
||||||
elif echo "$answer" | egrep -iq '^(n|no|nope)$'; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
die () {
|
|
||||||
echo "$0:" "$@" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check for running session
|
|
||||||
if tmux list-session | grep -q "$SESSION_NAME"; then
|
|
||||||
echo "WARNING: tmux session $SESSION_NAME already exists."
|
|
||||||
echo ""
|
|
||||||
if ask "Kill current session?"; then
|
|
||||||
tmux kill-session -t "$SESSION_NAME" || \
|
|
||||||
die "Failed to kill session: $SESSION_NAME"
|
|
||||||
else
|
|
||||||
echo "Aborted."
|
|
||||||
echo ""
|
|
||||||
echo -n "Press Enter to exit... "
|
|
||||||
read -r
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Start session
|
|
||||||
tmux new-session -s "$SESSION_NAME" -n "$WINDOW_NAME" "$MENU" $*
|
|
||||||
|
|
||||||
|
launch_in_tmux "$@"
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
|
||||||
from functions.ddrescue import *
|
from functions.ddrescue import *
|
||||||
from functions.hw_diags import *
|
from functions.hw_diags import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
|
|
@ -46,6 +45,7 @@ if __name__ == '__main__':
|
||||||
# Done
|
# Done
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
|
tmux_switch_client()
|
||||||
exit_script()
|
exit_script()
|
||||||
except GenericAbort:
|
except GenericAbort:
|
||||||
abort()
|
abort()
|
||||||
|
|
@ -55,9 +55,10 @@ if __name__ == '__main__':
|
||||||
msg = str(ge)
|
msg = str(ge)
|
||||||
print_error(msg)
|
print_error(msg)
|
||||||
abort()
|
abort()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
tmux_switch_client()
|
||||||
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
# vim: sts=4 sw=4 ts=4
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
#!/bin/python3
|
|
||||||
#
|
|
||||||
## Wizard Kit: SMART attributes display for ddrescue TUI
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
|
|
||||||
# Init
|
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.hw_diags import *
|
|
||||||
#init_global_vars()
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
try:
|
|
||||||
# Prep
|
|
||||||
clear_screen()
|
|
||||||
dev_path = sys.argv[1]
|
|
||||||
devs = scan_disks(True, dev_path)
|
|
||||||
|
|
||||||
# Warn if SMART unavailable
|
|
||||||
if dev_path not in devs:
|
|
||||||
print_error('SMART data not available')
|
|
||||||
exit_script()
|
|
||||||
|
|
||||||
# Initial screen
|
|
||||||
dev = devs[dev_path]
|
|
||||||
clear_screen()
|
|
||||||
show_disk_details(dev, only_attributes=True)
|
|
||||||
|
|
||||||
# Done
|
|
||||||
exit_script()
|
|
||||||
except SystemExit:
|
|
||||||
pass
|
|
||||||
except:
|
|
||||||
major_exception()
|
|
||||||
|
|
||||||
# vim: sts=4 sw=4 ts=4
|
|
||||||
186
.bin/Scripts/debug/hw_diags.py
Normal file
186
.bin/Scripts/debug/hw_diags.py
Normal file
|
|
@ -0,0 +1,186 @@
|
||||||
|
# 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
|
||||||
|
|
@ -4,12 +4,11 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.repairs import *
|
from functions.repairs import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: DISM helper Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: DISM helper Tool'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\DISM helper tool.log'.format(**global_vars)
|
set_log_file('DISM Helper.log')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
|
|
@ -51,7 +50,9 @@ if __name__ == '__main__':
|
||||||
print_success('Done.')
|
print_success('Done.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,11 @@ from borrowed import acpi
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
from os import environ
|
from os import environ
|
||||||
|
|
||||||
# Variables
|
|
||||||
|
# STATIC VARIABLES
|
||||||
SLMGR = r'{}\System32\slmgr.vbs'.format(environ.get('SYSTEMROOT'))
|
SLMGR = r'{}\System32\slmgr.vbs'.format(environ.get('SYSTEMROOT'))
|
||||||
|
|
||||||
|
|
||||||
def activate_with_bios():
|
def activate_with_bios():
|
||||||
"""Attempt to activate Windows with a key stored in the BIOS."""
|
"""Attempt to activate Windows with a key stored in the BIOS."""
|
||||||
# Code borrowed from https://github.com/aeruder/get_win8key
|
# Code borrowed from https://github.com/aeruder/get_win8key
|
||||||
|
|
@ -43,6 +45,7 @@ def activate_with_bios():
|
||||||
if not windows_is_activated():
|
if not windows_is_activated():
|
||||||
raise Exception('Activation Failed')
|
raise Exception('Activation Failed')
|
||||||
|
|
||||||
|
|
||||||
def get_activation_string():
|
def get_activation_string():
|
||||||
"""Get activation status, returns str."""
|
"""Get activation status, returns str."""
|
||||||
act_str = subprocess.run(
|
act_str = subprocess.run(
|
||||||
|
|
@ -53,6 +56,7 @@ def get_activation_string():
|
||||||
act_str = act_str[1].strip()
|
act_str = act_str[1].strip()
|
||||||
return act_str
|
return act_str
|
||||||
|
|
||||||
|
|
||||||
def windows_is_activated():
|
def windows_is_activated():
|
||||||
"""Check if Windows is activated via slmgr.vbs and return bool."""
|
"""Check if Windows is activated via slmgr.vbs and return bool."""
|
||||||
activation_string = subprocess.run(
|
activation_string = subprocess.run(
|
||||||
|
|
@ -62,5 +66,8 @@ def windows_is_activated():
|
||||||
|
|
||||||
return bool(activation_string and 'permanent' in activation_string)
|
return bool(activation_string and 'permanent' in activation_string)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import ctypes
|
||||||
|
|
||||||
from functions.disk import *
|
from functions.disk import *
|
||||||
|
|
||||||
|
|
||||||
# Regex
|
# Regex
|
||||||
REGEX_BAD_PATH_NAMES = re.compile(
|
REGEX_BAD_PATH_NAMES = re.compile(
|
||||||
r'([<>:"/\|\?\*]'
|
r'([<>:"/\|\?\*]'
|
||||||
|
|
@ -12,9 +13,11 @@ REGEX_BAD_PATH_NAMES = re.compile(
|
||||||
r'|[\s\.]+$',
|
r'|[\s\.]+$',
|
||||||
re.IGNORECASE)
|
re.IGNORECASE)
|
||||||
|
|
||||||
|
|
||||||
def backup_partition(disk, par):
|
def backup_partition(disk, par):
|
||||||
"""Create a backup image of a partition."""
|
"""Create a backup image of a partition."""
|
||||||
if par.get('Image Exists', False) or par['Number'] in disk['Bad Partitions']:
|
if (par.get('Image Exists', False)
|
||||||
|
or par['Number'] in disk['Bad Partitions']):
|
||||||
raise GenericAbort
|
raise GenericAbort
|
||||||
|
|
||||||
cmd = [
|
cmd = [
|
||||||
|
|
@ -30,6 +33,7 @@ def backup_partition(disk, par):
|
||||||
os.makedirs(dest_dir, exist_ok=True)
|
os.makedirs(dest_dir, exist_ok=True)
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def fix_path(path):
|
def fix_path(path):
|
||||||
"""Replace invalid filename characters with underscores."""
|
"""Replace invalid filename characters with underscores."""
|
||||||
local_drive = path[1:2] == ':'
|
local_drive = path[1:2] == ':'
|
||||||
|
|
@ -38,6 +42,7 @@ def fix_path(path):
|
||||||
new_path = '{}:{}'.format(new_path[0:1], new_path[2:])
|
new_path = '{}:{}'.format(new_path[0:1], new_path[2:])
|
||||||
return new_path
|
return new_path
|
||||||
|
|
||||||
|
|
||||||
def get_volume_display_name(mountpoint):
|
def get_volume_display_name(mountpoint):
|
||||||
"""Get display name from volume mountpoint and label, returns str."""
|
"""Get display name from volume mountpoint and label, returns str."""
|
||||||
name = mountpoint
|
name = mountpoint
|
||||||
|
|
@ -66,6 +71,7 @@ def get_volume_display_name(mountpoint):
|
||||||
|
|
||||||
return name
|
return name
|
||||||
|
|
||||||
|
|
||||||
def prep_disk_for_backup(destination, disk, backup_prefix):
|
def prep_disk_for_backup(destination, disk, backup_prefix):
|
||||||
"""Gather details about the disk and its partitions.
|
"""Gather details about the disk and its partitions.
|
||||||
|
|
||||||
|
|
@ -142,6 +148,7 @@ def prep_disk_for_backup(destination, disk, backup_prefix):
|
||||||
COLORS['YELLOW'], COLORS['CLEAR'])
|
COLORS['YELLOW'], COLORS['CLEAR'])
|
||||||
disk['Backup Warnings'] = warnings
|
disk['Backup Warnings'] = warnings
|
||||||
|
|
||||||
|
|
||||||
def select_backup_destination(auto_select=True):
|
def select_backup_destination(auto_select=True):
|
||||||
"""Select a backup destination from a menu, returns server dict."""
|
"""Select a backup destination from a menu, returns server dict."""
|
||||||
destinations = [s for s in BACKUP_SERVERS if s['Mounted']]
|
destinations = [s for s in BACKUP_SERVERS if s['Mounted']]
|
||||||
|
|
@ -151,7 +158,10 @@ def select_backup_destination(auto_select=True):
|
||||||
|
|
||||||
# Add local disks
|
# Add local disks
|
||||||
for d in psutil.disk_partitions():
|
for d in psutil.disk_partitions():
|
||||||
if re.search(r'^{}'.format(global_vars['Env']['SYSTEMDRIVE']), d.mountpoint, re.IGNORECASE):
|
if re.search(
|
||||||
|
r'^{}'.format(global_vars['Env']['SYSTEMDRIVE']),
|
||||||
|
d.mountpoint,
|
||||||
|
re.IGNORECASE):
|
||||||
# Skip current OS drive
|
# Skip current OS drive
|
||||||
pass
|
pass
|
||||||
elif 'fixed' in d.opts:
|
elif 'fixed' in d.opts:
|
||||||
|
|
@ -189,6 +199,7 @@ def select_backup_destination(auto_select=True):
|
||||||
else:
|
else:
|
||||||
return destinations[int(selection)-1]
|
return destinations[int(selection)-1]
|
||||||
|
|
||||||
|
|
||||||
def verify_wim_backup(partition):
|
def verify_wim_backup(partition):
|
||||||
"""Verify WIM integrity."""
|
"""Verify WIM integrity."""
|
||||||
if not os.path.exists(partition['Image Path']):
|
if not os.path.exists(partition['Image Path']):
|
||||||
|
|
@ -201,5 +212,8 @@ def verify_wim_backup(partition):
|
||||||
]
|
]
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
# Wizard Kit: Functions - Browsers
|
# Wizard Kit: Functions - Browsers
|
||||||
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
|
from operator import itemgetter
|
||||||
|
from settings.browsers import *
|
||||||
|
|
||||||
|
|
||||||
# Define other_results for later try_and_print
|
# Define other_results for later try_and_print
|
||||||
browser_data = {}
|
browser_data = {}
|
||||||
|
|
@ -14,114 +17,84 @@ other_results = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
# STATIC VARIABLES
|
def archive_all_users():
|
||||||
DEFAULT_HOMEPAGE = 'https://www.google.com/'
|
"""Create backups for all browsers for all users."""
|
||||||
IE_GALLERY = 'https://www.microsoft.com/en-us/iegallery'
|
users_root = r'{}\Users'.format(global_vars['Env']['SYSTEMDRIVE'])
|
||||||
MOZILLA_PREFS = {
|
user_envs = []
|
||||||
'browser.search.defaultenginename': '"Google"',
|
|
||||||
'browser.search.defaultenginename.US': '"Google"',
|
# Build list of valid users
|
||||||
'browser.search.geoSpecificDefaults': 'false',
|
for user_name in os.listdir(users_root):
|
||||||
'browser.startup.homepage': '"{}"'.format(DEFAULT_HOMEPAGE),
|
valid_user = True
|
||||||
'extensions.ui.lastCategory': '"addons://list/extension"',
|
if user_name in ('Default', 'Default User'):
|
||||||
}
|
# Skip default users
|
||||||
UBO_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en'
|
continue
|
||||||
UBO_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm'
|
user_path = os.path.join(users_root, user_name)
|
||||||
UBO_EXTRA_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin-extra/pgdnlhfefecpicbbihgmbmffkjpaplco?hl=en'
|
appdata_local = os.path.join(user_path, r'AppData\Local')
|
||||||
UBO_EXTRA_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco'
|
appdata_roaming = os.path.join(user_path, r'AppData\Roaming')
|
||||||
UBO_MOZILLA = 'https://addons.mozilla.org/en-us/firefox/addon/ublock-origin/'
|
valid_user = valid_user and os.path.exists(appdata_local)
|
||||||
UBO_MOZZILA_PATH = r'{}\Mozilla Firefox\distribution\extensions\ublock_origin.xpi'.format(os.environ.get('PROGRAMFILES'))
|
valid_user = valid_user and os.path.exists(appdata_roaming)
|
||||||
UBO_MOZILLA_REG = r'Software\Mozilla\Firefox\Extensions'
|
if valid_user:
|
||||||
UBO_MOZILLA_REG_NAME = 'uBlock0@raymondhill.net'
|
user_envs.append({
|
||||||
UBO_OPERA = 'https://addons.opera.com/en/extensions/details/ublock/?display=en'
|
'USERNAME': user_name,
|
||||||
SUPPORTED_BROWSERS = {
|
'USERPROFILE': user_path,
|
||||||
'Internet Explorer': {
|
'APPDATA': appdata_roaming,
|
||||||
'base': 'ie',
|
'LOCALAPPDATA': appdata_local})
|
||||||
'exe_name': 'iexplore.exe',
|
|
||||||
'rel_install_path': 'Internet Explorer',
|
# Backup browsers for all valid users
|
||||||
'user_data_path': r'{USERPROFILE}\Favorites',
|
print_info('Backing up browsers')
|
||||||
},
|
for fake_env in sorted(user_envs, key=itemgetter('USERPROFILE')):
|
||||||
'Google Chrome': {
|
print_standard(' {}'.format(fake_env['USERNAME']))
|
||||||
'base': 'chromium',
|
for b_k, b_v in sorted(SUPPORTED_BROWSERS.items()):
|
||||||
'exe_name': 'chrome.exe',
|
if b_k == 'Mozilla Firefox Dev':
|
||||||
'rel_install_path': r'Google\Chrome\Application',
|
continue
|
||||||
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome\User Data',
|
source_path = b_v['user_data_path'].format(**fake_env)
|
||||||
},
|
if not os.path.exists(source_path):
|
||||||
'Google Chrome Canary': {
|
continue
|
||||||
'base': 'chromium',
|
source_items = source_path + '*'
|
||||||
'exe_name': 'chrome.exe',
|
archive_path = r'{BackupDir}\Browsers ({USERNAME})\{Date}'.format(
|
||||||
'rel_install_path': r'Google\Chrome SxS\Application',
|
**global_vars, **fake_env)
|
||||||
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome SxS\User Data',
|
os.makedirs(archive_path, exist_ok=True)
|
||||||
},
|
archive_path += r'\{}.7z'.format(b_k)
|
||||||
'Mozilla Firefox': {
|
cmd = [
|
||||||
'base': 'mozilla',
|
global_vars['Tools']['SevenZip'],
|
||||||
'exe_name': 'firefox.exe',
|
'a', '-aoa', '-bso0', '-bse0', '-mx=1',
|
||||||
'rel_install_path': 'Mozilla Firefox',
|
archive_path, source_items]
|
||||||
'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles',
|
try_and_print(message='{}...'.format(b_k),
|
||||||
},
|
function=run_program, cmd=cmd)
|
||||||
'Mozilla Firefox Dev': {
|
print_standard(' ')
|
||||||
'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',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
def archive_browser(name):
|
def archive_browser(name):
|
||||||
"""Create backup of Browser saved in the BackupDir."""
|
"""Create backup of Browser saved in the BackupDir."""
|
||||||
source = '{}*'.format(browser_data[name]['user_data_path'])
|
source = '{}*'.format(browser_data[name]['user_data_path'])
|
||||||
dest = r'{BackupDir}\Browsers ({USERNAME})'.format(
|
dest = r'{BackupDir}\Browsers ({USERNAME})\{Date}'.format(
|
||||||
**global_vars, **global_vars['Env'])
|
**global_vars, **global_vars['Env'])
|
||||||
archive = r'{}\{}.7z'.format(dest, name)
|
archive = r'{}\{}.7z'.format(dest, name)
|
||||||
os.makedirs(dest, exist_ok=True)
|
os.makedirs(dest, exist_ok=True)
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['SevenZip'],
|
global_vars['Tools']['SevenZip'],
|
||||||
'a', '-aoa', '-bso0', '-bse0', '-mx=1',
|
'a', '-aoa', '-bso0', '-bse0', '-mx=1',
|
||||||
|
'-mhe=on', '-p{}'.format(ARCHIVE_PASSWORD),
|
||||||
archive, source]
|
archive, source]
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def backup_browsers():
|
def backup_browsers():
|
||||||
"""Create backup of all detected browser profiles."""
|
"""Create backup of all detected browser profiles."""
|
||||||
for name in [k for k, v in sorted(browser_data.items()) if v['profiles']]:
|
for name in [k for k, v in sorted(browser_data.items()) if v['profiles']]:
|
||||||
try_and_print(message='{}...'.format(name),
|
try_and_print(message='{}...'.format(name),
|
||||||
function=archive_browser, name=name)
|
function=archive_browser, name=name)
|
||||||
|
|
||||||
|
|
||||||
def clean_chromium_profile(profile):
|
def clean_chromium_profile(profile):
|
||||||
"""Renames profile, creates a new folder, and copies the user data to it."""
|
"""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:
|
if profile is None:
|
||||||
raise Exception
|
raise Exception
|
||||||
backup_path = '{path}_{Date}.bak'.format(
|
backup_path = '{path}_{Date}.bak'.format(
|
||||||
|
|
@ -136,6 +109,7 @@ def clean_chromium_profile(profile):
|
||||||
shutil.copy(entry.path, r'{}\{}'.format(
|
shutil.copy(entry.path, r'{}\{}'.format(
|
||||||
profile['path'], entry.name))
|
profile['path'], entry.name))
|
||||||
|
|
||||||
|
|
||||||
def clean_internet_explorer(**kwargs):
|
def clean_internet_explorer(**kwargs):
|
||||||
"""Uses the built-in function to reset IE and sets the homepage.
|
"""Uses the built-in function to reset IE and sets the homepage.
|
||||||
|
|
||||||
|
|
@ -153,8 +127,15 @@ def clean_internet_explorer(**kwargs):
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def clean_mozilla_profile(profile):
|
def clean_mozilla_profile(profile):
|
||||||
"""Renames profile, creates a new folder, and copies the user data to it."""
|
"""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:
|
if profile is None:
|
||||||
raise Exception
|
raise Exception
|
||||||
backup_path = '{path}_{Date}.bak'.format(
|
backup_path = '{path}_{Date}.bak'.format(
|
||||||
|
|
@ -179,8 +160,9 @@ def clean_mozilla_profile(profile):
|
||||||
for k, v in MOZILLA_PREFS.items():
|
for k, v in MOZILLA_PREFS.items():
|
||||||
f.write('user_pref("{}", {});\n'.format(k, v))
|
f.write('user_pref("{}", {});\n'.format(k, v))
|
||||||
|
|
||||||
|
|
||||||
def get_browser_details(name):
|
def get_browser_details(name):
|
||||||
"""Get installation status and profile details for all supported browsers."""
|
"""Get installation and profile details for all supported browsers."""
|
||||||
browser = SUPPORTED_BROWSERS[name].copy()
|
browser = SUPPORTED_BROWSERS[name].copy()
|
||||||
|
|
||||||
# Update user_data_path
|
# Update user_data_path
|
||||||
|
|
@ -253,6 +235,7 @@ def get_browser_details(name):
|
||||||
elif num_installs > 1 and browser['base'] != 'ie':
|
elif num_installs > 1 and browser['base'] != 'ie':
|
||||||
raise MultipleInstallationsError
|
raise MultipleInstallationsError
|
||||||
|
|
||||||
|
|
||||||
def get_chromium_profiles(search_path):
|
def get_chromium_profiles(search_path):
|
||||||
"""Find any chromium-style profiles and return as a list of dicts."""
|
"""Find any chromium-style profiles and return as a list of dicts."""
|
||||||
profiles = []
|
profiles = []
|
||||||
|
|
@ -269,6 +252,7 @@ def get_chromium_profiles(search_path):
|
||||||
|
|
||||||
return profiles
|
return profiles
|
||||||
|
|
||||||
|
|
||||||
def get_ie_homepages():
|
def get_ie_homepages():
|
||||||
"""Read homepages from the registry and return as a list."""
|
"""Read homepages from the registry and return as a list."""
|
||||||
homepages = []
|
homepages = []
|
||||||
|
|
@ -293,6 +277,7 @@ def get_ie_homepages():
|
||||||
homepages = [h.replace('{', '').replace('}', '') for h in homepages]
|
homepages = [h.replace('{', '').replace('}', '') for h in homepages]
|
||||||
return homepages
|
return homepages
|
||||||
|
|
||||||
|
|
||||||
def get_mozilla_homepages(prefs_path):
|
def get_mozilla_homepages(prefs_path):
|
||||||
"""Read homepages from prefs.js and return as a list."""
|
"""Read homepages from prefs.js and return as a list."""
|
||||||
homepages = []
|
homepages = []
|
||||||
|
|
@ -308,6 +293,7 @@ def get_mozilla_homepages(prefs_path):
|
||||||
|
|
||||||
return homepages
|
return homepages
|
||||||
|
|
||||||
|
|
||||||
def get_mozilla_profiles(search_path, dev=False):
|
def get_mozilla_profiles(search_path, dev=False):
|
||||||
"""Find any mozilla-style profiles and return as a list of dicts."""
|
"""Find any mozilla-style profiles and return as a list of dicts."""
|
||||||
profiles = []
|
profiles = []
|
||||||
|
|
@ -332,11 +318,13 @@ def get_mozilla_profiles(search_path, dev=False):
|
||||||
|
|
||||||
return profiles
|
return profiles
|
||||||
|
|
||||||
def install_adblock(indent=8, width=32):
|
|
||||||
|
def install_adblock(indent=8, width=32, just_firefox=False):
|
||||||
"""Install adblock for all supported browsers."""
|
"""Install adblock for all supported browsers."""
|
||||||
for browser in sorted(browser_data):
|
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)
|
exe_path = browser_data[browser].get('exe_path', None)
|
||||||
function=run_program
|
|
||||||
if not exe_path:
|
if not exe_path:
|
||||||
if browser_data[browser]['profiles']:
|
if browser_data[browser]['profiles']:
|
||||||
print_standard(
|
print_standard(
|
||||||
|
|
@ -386,7 +374,6 @@ def install_adblock(indent=8, width=32):
|
||||||
|
|
||||||
elif browser_data[browser]['base'] == 'ie':
|
elif browser_data[browser]['base'] == 'ie':
|
||||||
urls.append(IE_GALLERY)
|
urls.append(IE_GALLERY)
|
||||||
function=popen_program
|
|
||||||
|
|
||||||
# By using check=False we're skipping any return codes so
|
# By using check=False we're skipping any return codes so
|
||||||
# it should only fail if the program can't be run
|
# it should only fail if the program can't be run
|
||||||
|
|
@ -395,13 +382,20 @@ def install_adblock(indent=8, width=32):
|
||||||
# installation status.
|
# installation status.
|
||||||
try_and_print(message='{}...'.format(browser),
|
try_and_print(message='{}...'.format(browser),
|
||||||
indent=indent, width=width,
|
indent=indent, width=width,
|
||||||
cs='Done', function=function,
|
cs='Started', function=popen_program,
|
||||||
cmd=[exe_path, *urls], check=False)
|
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):
|
def list_homepages(indent=8, width=32):
|
||||||
"""List current homepages for reference."""
|
"""List current homepages for reference."""
|
||||||
|
browser_list = [k for k, v in sorted(browser_data.items()) if v['exe_path']]
|
||||||
for browser in [k for k, v in sorted(browser_data.items()) if v['exe_path']]:
|
for browser in browser_list:
|
||||||
# Skip Chromium-based browsers
|
# Skip Chromium-based browsers
|
||||||
if browser_data[browser]['base'] == 'chromium':
|
if browser_data[browser]['base'] == 'chromium':
|
||||||
print_info(
|
print_info(
|
||||||
|
|
@ -428,9 +422,17 @@ def list_homepages(indent=8, width=32):
|
||||||
print_standard('{indent}{name:<{width}}{page}'.format(
|
print_standard('{indent}{name:<{width}}{page}'.format(
|
||||||
indent=' '*indent, width=width, name=name, page=page))
|
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):
|
def reset_browsers(indent=8, width=32):
|
||||||
"""Reset all detected browsers to safe defaults."""
|
"""Reset all detected browsers to safe defaults."""
|
||||||
for browser in [k for k, v in sorted(browser_data.items()) if v['profiles']]:
|
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))
|
print_info('{indent}{name}'.format(indent=' '*indent, name=browser))
|
||||||
for profile in browser_data[browser]['profiles']:
|
for profile in browser_data[browser]['profiles']:
|
||||||
if browser_data[browser]['base'] == 'chromium':
|
if browser_data[browser]['base'] == 'chromium':
|
||||||
|
|
@ -444,12 +446,25 @@ def reset_browsers(indent=8, width=32):
|
||||||
indent=indent, width=width, function=function,
|
indent=indent, width=width, function=function,
|
||||||
other_results=other_results, profile=profile)
|
other_results=other_results, profile=profile)
|
||||||
|
|
||||||
def scan_for_browsers():
|
|
||||||
|
def scan_for_browsers(just_firefox=False, silent=False):
|
||||||
"""Scan system for any supported browsers."""
|
"""Scan system for any supported browsers."""
|
||||||
for name in sorted(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),
|
try_and_print(message='{}...'.format(name),
|
||||||
function=get_browser_details, cs='Detected',
|
function=get_browser_details, cs='Detected',
|
||||||
other_results=other_results, name=name)
|
other_results=other_results, name=name)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
# Wizard Kit: Functions - Cleanup
|
'''Wizard Kit: Functions - Cleanup'''
|
||||||
|
# pylint: disable=no-name-in-module,wildcard-import
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
||||||
from functions.common import *
|
from functions.setup import *
|
||||||
|
from settings.cleanup import *
|
||||||
|
|
||||||
def cleanup_adwcleaner():
|
def cleanup_adwcleaner():
|
||||||
"""Move AdwCleaner folders into the ClientDir."""
|
"""Move AdwCleaner folders into the ClientDir."""
|
||||||
|
|
@ -16,19 +19,17 @@ def cleanup_adwcleaner():
|
||||||
shutil.move(source_quarantine, dest_name)
|
shutil.move(source_quarantine, dest_name)
|
||||||
|
|
||||||
# Delete source folder if empty
|
# Delete source folder if empty
|
||||||
try:
|
delete_empty_folders(source_path)
|
||||||
os.rmdir(source_path)
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Main folder
|
# Main folder
|
||||||
if os.path.exists(source_path):
|
if os.path.exists(source_path):
|
||||||
os.makedirs(global_vars['ProgBackupDir'], exist_ok=True)
|
os.makedirs(global_vars['LogDir'], exist_ok=True)
|
||||||
dest_name = r'{ProgBackupDir}\AdwCleaner_{Date-Time}'.format(
|
dest_name = r'{LogDir}\Tools\AdwCleaner'.format(
|
||||||
**global_vars)
|
**global_vars)
|
||||||
dest_name = non_clobber_rename(dest_name)
|
dest_name = non_clobber_rename(dest_name)
|
||||||
shutil.move(source_path, dest_name)
|
shutil.move(source_path, dest_name)
|
||||||
|
|
||||||
|
|
||||||
def cleanup_cbs(dest_folder):
|
def cleanup_cbs(dest_folder):
|
||||||
"""Safely cleanup a known CBS archive bug under Windows 7.
|
"""Safely cleanup a known CBS archive bug under Windows 7.
|
||||||
|
|
||||||
|
|
@ -68,24 +69,76 @@ def cleanup_cbs(dest_folder):
|
||||||
r'{}\CbsPersist*'.format(temp_folder)]
|
r'{}\CbsPersist*'.format(temp_folder)]
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def cleanup_desktop():
|
def cleanup_desktop():
|
||||||
"""Move known backup files and reports into the ClientDir."""
|
"""Move known backup files and reports into the ClientDir."""
|
||||||
dest_folder = r'{ProgBackupDir}\Desktop_{Date-Time}'.format(**global_vars)
|
dest_folder = r'{LogDir}\Tools'.format(**global_vars)
|
||||||
os.makedirs(dest_folder, exist_ok=True)
|
os.makedirs(dest_folder, exist_ok=True)
|
||||||
|
|
||||||
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
|
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
|
||||||
for entry in os.scandir(desktop_path):
|
for entry in os.scandir(desktop_path):
|
||||||
# JRT, RKill, Shortcut cleaner
|
if DESKTOP_ITEMS.search(entry.name):
|
||||||
if re.search(r'^(JRT|RKill|sc-cleaner)', entry.name, re.IGNORECASE):
|
|
||||||
dest_name = r'{}\{}'.format(dest_folder, entry.name)
|
dest_name = r'{}\{}'.format(dest_folder, entry.name)
|
||||||
dest_name = non_clobber_rename(dest_name)
|
dest_name = non_clobber_rename(dest_name)
|
||||||
shutil.move(entry.path, dest_name)
|
shutil.move(entry.path, dest_name)
|
||||||
|
|
||||||
# Remove dir if empty
|
# 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:
|
try:
|
||||||
os.rmdir(dest_folder)
|
os.rmdir(folder_path)
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
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__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
|
||||||
|
|
@ -14,31 +14,37 @@ except ModuleNotFoundError:
|
||||||
if psutil.WINDOWS:
|
if psutil.WINDOWS:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
from subprocess import CalledProcessError
|
|
||||||
|
|
||||||
from settings.main import *
|
from settings.main import *
|
||||||
from settings.tools import *
|
from settings.tools import *
|
||||||
from settings.windows_builds import *
|
from settings.windows_builds import *
|
||||||
|
from subprocess import CalledProcessError
|
||||||
|
|
||||||
|
|
||||||
# Global variables
|
# Global variables
|
||||||
global_vars = {}
|
global_vars = {}
|
||||||
|
|
||||||
|
|
||||||
# STATIC VARIABLES
|
# STATIC VARIABLES
|
||||||
COLORS = {
|
COLORS = {
|
||||||
'CLEAR': '\033[0m',
|
'CLEAR': '\033[0m',
|
||||||
'RED': '\033[31m',
|
'RED': '\033[31m',
|
||||||
|
'ORANGE': '\033[31;1m',
|
||||||
'GREEN': '\033[32m',
|
'GREEN': '\033[32m',
|
||||||
'YELLOW': '\033[33m',
|
'YELLOW': '\033[33m',
|
||||||
'BLUE': '\033[34m'
|
'BLUE': '\033[34m',
|
||||||
}
|
'PURPLE': '\033[35m',
|
||||||
|
'CYAN': '\033[36m',
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
HKU = winreg.HKEY_USERS
|
HKU = winreg.HKEY_USERS
|
||||||
|
HKCR = winreg.HKEY_CLASSES_ROOT
|
||||||
HKCU = winreg.HKEY_CURRENT_USER
|
HKCU = winreg.HKEY_CURRENT_USER
|
||||||
HKLM = winreg.HKEY_LOCAL_MACHINE
|
HKLM = winreg.HKEY_LOCAL_MACHINE
|
||||||
except NameError:
|
except NameError:
|
||||||
if psutil.WINDOWS:
|
if psutil.WINDOWS:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
# Error Classes
|
# Error Classes
|
||||||
class BIOSKeyNotFoundError(Exception):
|
class BIOSKeyNotFoundError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
@ -58,10 +64,16 @@ class GenericRepair(Exception):
|
||||||
class MultipleInstallationsError(Exception):
|
class MultipleInstallationsError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class NoProfilesError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Not4KAlignedError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
class NotInstalledError(Exception):
|
class NotInstalledError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class NoProfilesError(Exception):
|
class OSInstalledLegacyError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class PathNotFoundError(Exception):
|
class PathNotFoundError(Exception):
|
||||||
|
|
@ -70,16 +82,34 @@ class PathNotFoundError(Exception):
|
||||||
class UnsupportedOSError(Exception):
|
class UnsupportedOSError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class SecureBootDisabledError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class SecureBootNotAvailError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class SecureBootUnknownError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WindowsOutdatedError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WindowsUnsupportedError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# General functions
|
# General functions
|
||||||
def abort():
|
def abort(show_prompt=True):
|
||||||
"""Abort script."""
|
"""Abort script."""
|
||||||
print_warning('Aborted.')
|
print_warning('Aborted.')
|
||||||
|
if show_prompt:
|
||||||
sleep(1)
|
sleep(1)
|
||||||
pause(prompt='Press Enter to exit... ')
|
pause(prompt='Press Enter to exit... ')
|
||||||
exit_script()
|
exit_script(1)
|
||||||
|
|
||||||
|
|
||||||
def ask(prompt='Kotaero!'):
|
def ask(prompt='Kotaero!'):
|
||||||
"""Prompt the user with a Y/N question, log answer, and return a bool."""
|
"""Prompt the user with a Y/N question, returns bool."""
|
||||||
answer = None
|
answer = None
|
||||||
prompt = '{} [Y/N]: '.format(prompt)
|
prompt = '{} [Y/N]: '.format(prompt)
|
||||||
while answer is None:
|
while answer is None:
|
||||||
|
|
@ -94,8 +124,17 @@ def ask(prompt='Kotaero!'):
|
||||||
print_log(message=message)
|
print_log(message=message)
|
||||||
return answer
|
return answer
|
||||||
|
|
||||||
|
|
||||||
|
def beep(repeat=1):
|
||||||
|
"""Play system bell with optional repeat."""
|
||||||
|
for i in range(repeat):
|
||||||
|
# Print bell char
|
||||||
|
print('\a')
|
||||||
|
sleep(0.5)
|
||||||
|
|
||||||
|
|
||||||
def choice(choices, prompt='Kotaero!'):
|
def choice(choices, prompt='Kotaero!'):
|
||||||
"""Prompt the user with a choice question, log answer, and returns str."""
|
"""Prompt the user with a choice question, returns str."""
|
||||||
answer = None
|
answer = None
|
||||||
choices = [str(c) for c in choices]
|
choices = [str(c) for c in choices]
|
||||||
choices_short = {c[:1].upper(): c for c in choices}
|
choices_short = {c[:1].upper(): c for c in choices}
|
||||||
|
|
@ -122,6 +161,7 @@ def choice(choices, prompt='Kotaero!'):
|
||||||
# Done
|
# Done
|
||||||
return answer
|
return answer
|
||||||
|
|
||||||
|
|
||||||
def clear_screen():
|
def clear_screen():
|
||||||
"""Simple wrapper for cls/clear."""
|
"""Simple wrapper for cls/clear."""
|
||||||
if psutil.WINDOWS:
|
if psutil.WINDOWS:
|
||||||
|
|
@ -129,40 +169,45 @@ def clear_screen():
|
||||||
else:
|
else:
|
||||||
os.system('clear')
|
os.system('clear')
|
||||||
|
|
||||||
|
|
||||||
def convert_to_bytes(size):
|
def convert_to_bytes(size):
|
||||||
"""Convert human-readable size str to bytes and return an int."""
|
"""Convert human-readable size str to bytes and return an int."""
|
||||||
size = str(size)
|
size = str(size)
|
||||||
tmp = re.search(r'(\d+\.?\d*)\s+([KMGT]B)', size.upper())
|
tmp = re.search(r'(\d+\.?\d*)\s+([PTGMKB])B?', size.upper())
|
||||||
if tmp:
|
if tmp:
|
||||||
size = float(tmp.group(1))
|
size = float(tmp.group(1))
|
||||||
units = tmp.group(2)
|
units = tmp.group(2)
|
||||||
if units == 'TB':
|
if units == 'P':
|
||||||
size *= 1099511627776
|
size *= 1024 ** 5
|
||||||
elif units == 'GB':
|
if units == 'T':
|
||||||
size *= 1073741824
|
size *= 1024 ** 4
|
||||||
elif units == 'MB':
|
elif units == 'G':
|
||||||
size *= 1048576
|
size *= 1024 ** 3
|
||||||
elif units == 'KB':
|
elif units == 'M':
|
||||||
size *= 1024
|
size *= 1024 ** 2
|
||||||
|
elif units == 'K':
|
||||||
|
size *= 1024 ** 1
|
||||||
|
elif units == 'B':
|
||||||
|
size *= 1024 ** 0
|
||||||
size = int(size)
|
size = int(size)
|
||||||
else:
|
else:
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
return size
|
return size
|
||||||
|
|
||||||
|
|
||||||
def exit_script(return_value=0):
|
def exit_script(return_value=0):
|
||||||
"""Exits the script after some cleanup and opens the log (if set)."""
|
"""Exits the script after some cleanup and opens the log (if set)."""
|
||||||
# Remove dirs (if empty)
|
# Remove dirs (if empty)
|
||||||
for dir in ['BackupDir', 'LogDir', 'TmpDir']:
|
for dir in ['BackupDir', 'LogDir', 'TmpDir']:
|
||||||
try:
|
try:
|
||||||
dir = global_vars[dir]
|
os.rmdir(global_vars[dir])
|
||||||
os.rmdir(dir)
|
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Open Log (if it exists)
|
# Open Log (if it exists)
|
||||||
log = global_vars.get('LogFile', '')
|
log = global_vars.get('LogFile', '')
|
||||||
if log and os.path.exists(log) and psutil.WINDOWS:
|
if log and os.path.exists(log) and psutil.WINDOWS and ENABLED_OPEN_LOGS:
|
||||||
try:
|
try:
|
||||||
extract_item('NotepadPlusPlus', silent=True)
|
extract_item('NotepadPlusPlus', silent=True)
|
||||||
popen_program(
|
popen_program(
|
||||||
|
|
@ -178,6 +223,7 @@ def exit_script(return_value=0):
|
||||||
# Exit
|
# Exit
|
||||||
sys.exit(return_value)
|
sys.exit(return_value)
|
||||||
|
|
||||||
|
|
||||||
def extract_item(item, filter='', silent=False):
|
def extract_item(item, filter='', silent=False):
|
||||||
"""Extract item from .cbin into .bin."""
|
"""Extract item from .cbin into .bin."""
|
||||||
cmd = [
|
cmd = [
|
||||||
|
|
@ -197,6 +243,7 @@ def extract_item(item, filter='', silent=False):
|
||||||
if not silent:
|
if not silent:
|
||||||
print_warning('WARNING: Errors encountered while exctracting data')
|
print_warning('WARNING: Errors encountered while exctracting data')
|
||||||
|
|
||||||
|
|
||||||
def get_process(name=None):
|
def get_process(name=None):
|
||||||
"""Get process by name, returns psutil.Process obj."""
|
"""Get process by name, returns psutil.Process obj."""
|
||||||
proc = None
|
proc = None
|
||||||
|
|
@ -212,8 +259,9 @@ def get_process(name=None):
|
||||||
pass
|
pass
|
||||||
return proc
|
return proc
|
||||||
|
|
||||||
|
|
||||||
def get_simple_string(prompt='Enter string'):
|
def get_simple_string(prompt='Enter string'):
|
||||||
"""Get string from user (minimal allowed character set) and return as str."""
|
"""Get string from user (restricted character set), returns str."""
|
||||||
simple_string = None
|
simple_string = None
|
||||||
while simple_string is None:
|
while simple_string is None:
|
||||||
_input = input('{}: '.format(prompt))
|
_input = input('{}: '.format(prompt))
|
||||||
|
|
@ -221,6 +269,7 @@ def get_simple_string(prompt='Enter string'):
|
||||||
simple_string = _input.strip()
|
simple_string = _input.strip()
|
||||||
return simple_string
|
return simple_string
|
||||||
|
|
||||||
|
|
||||||
def get_ticket_number():
|
def get_ticket_number():
|
||||||
"""Get TicketNumber from user, save in LogDir, and return as str."""
|
"""Get TicketNumber from user, save in LogDir, and return as str."""
|
||||||
if not ENABLED_TICKET_NUMBERS:
|
if not ENABLED_TICKET_NUMBERS:
|
||||||
|
|
@ -237,8 +286,9 @@ def get_ticket_number():
|
||||||
f.write(ticket_number)
|
f.write(ticket_number)
|
||||||
return ticket_number
|
return ticket_number
|
||||||
|
|
||||||
|
|
||||||
def human_readable_size(size, decimals=0):
|
def human_readable_size(size, decimals=0):
|
||||||
"""Convert size in bytes to a human-readable format and return a str."""
|
"""Convert size from bytes to a human-readable format, returns str."""
|
||||||
# Prep string formatting
|
# Prep string formatting
|
||||||
width = 3+decimals
|
width = 3+decimals
|
||||||
if decimals > 0:
|
if decimals > 0:
|
||||||
|
|
@ -257,31 +307,37 @@ def human_readable_size(size, decimals=0):
|
||||||
return '{size:>{width}} b'.format(size='???', width=width)
|
return '{size:>{width}} b'.format(size='???', width=width)
|
||||||
|
|
||||||
# Convert to sensible units
|
# Convert to sensible units
|
||||||
if size >= 1099511627776:
|
if size >= 1024 ** 5:
|
||||||
size /= 1099511627776
|
size /= 1024 ** 5
|
||||||
units = 'Tb'
|
units = 'PB'
|
||||||
elif size >= 1073741824:
|
elif size >= 1024 ** 4:
|
||||||
size /= 1073741824
|
size /= 1024 ** 4
|
||||||
units = 'Gb'
|
units = 'TB'
|
||||||
elif size >= 1048576:
|
elif size >= 1024 ** 3:
|
||||||
size /= 1048576
|
size /= 1024 ** 3
|
||||||
units = 'Mb'
|
units = 'GB'
|
||||||
elif size >= 1024:
|
elif size >= 1024 ** 2:
|
||||||
size /= 1024
|
size /= 1024 ** 2
|
||||||
units = 'Kb'
|
units = 'MB'
|
||||||
|
elif size >= 1024 ** 1:
|
||||||
|
size /= 1024 ** 1
|
||||||
|
units = 'KB'
|
||||||
else:
|
else:
|
||||||
units = ' b'
|
size /= 1024 ** 0
|
||||||
|
units = ' B'
|
||||||
|
|
||||||
# Return
|
# Return
|
||||||
return '{size:>{width}.{decimals}f} {units}'.format(
|
return '{size:>{width}.{decimals}f} {units}'.format(
|
||||||
size=size, width=width, decimals=decimals, units=units)
|
size=size, width=width, decimals=decimals, units=units)
|
||||||
|
|
||||||
|
|
||||||
def kill_process(name):
|
def kill_process(name):
|
||||||
"""Kill any running caffeine.exe processes."""
|
"""Kill any running caffeine.exe processes."""
|
||||||
for proc in psutil.process_iter():
|
for proc in psutil.process_iter():
|
||||||
if proc.name() == name:
|
if proc.name() == name:
|
||||||
proc.kill()
|
proc.kill()
|
||||||
|
|
||||||
|
|
||||||
def major_exception():
|
def major_exception():
|
||||||
"""Display traceback and exit"""
|
"""Display traceback and exit"""
|
||||||
print_error('Major exception')
|
print_error('Major exception')
|
||||||
|
|
@ -293,20 +349,22 @@ def major_exception():
|
||||||
except GenericAbort:
|
except GenericAbort:
|
||||||
# User declined upload
|
# User declined upload
|
||||||
print_warning('Upload: Aborted')
|
print_warning('Upload: Aborted')
|
||||||
sleep(30)
|
sleep(10)
|
||||||
except GenericError:
|
except GenericError:
|
||||||
# No log file or uploading disabled
|
# No log file or uploading disabled
|
||||||
sleep(30)
|
sleep(10)
|
||||||
except:
|
except:
|
||||||
print_error('Upload: NS')
|
print_error('Upload: NS')
|
||||||
sleep(30)
|
sleep(10)
|
||||||
else:
|
else:
|
||||||
print_success('Upload: CS')
|
print_success('Upload: CS')
|
||||||
pause('Press Enter to exit...')
|
pause('Press Enter to exit...')
|
||||||
exit_script(1)
|
exit_script(1)
|
||||||
|
|
||||||
def menu_select(title='~ Untitled Menu ~',
|
|
||||||
prompt='Please make a selection', secret_exit=False,
|
def menu_select(
|
||||||
|
title='[Untitled Menu]',
|
||||||
|
prompt='Please make a selection', secret_actions=[], secret_exit=False,
|
||||||
main_entries=[], action_entries=[], disabled_label='DISABLED',
|
main_entries=[], action_entries=[], disabled_label='DISABLED',
|
||||||
spacer=''):
|
spacer=''):
|
||||||
"""Display options in a menu and return selected option as a str."""
|
"""Display options in a menu and return selected option as a str."""
|
||||||
|
|
@ -322,8 +380,10 @@ def menu_select(title='~ Untitled Menu ~',
|
||||||
menu_splash = '{}\n{}\n'.format(title, spacer)
|
menu_splash = '{}\n{}\n'.format(title, spacer)
|
||||||
width = len(str(len(main_entries)))
|
width = len(str(len(main_entries)))
|
||||||
valid_answers = []
|
valid_answers = []
|
||||||
if (secret_exit):
|
if secret_exit:
|
||||||
valid_answers.append('Q')
|
valid_answers.append('Q')
|
||||||
|
if secret_actions:
|
||||||
|
valid_answers.extend(secret_actions)
|
||||||
|
|
||||||
# Add main entries
|
# Add main entries
|
||||||
for i in range(len(main_entries)):
|
for i in range(len(main_entries)):
|
||||||
|
|
@ -355,7 +415,6 @@ def menu_select(title='~ Untitled Menu ~',
|
||||||
letter = entry['Letter'].upper(),
|
letter = entry['Letter'].upper(),
|
||||||
width = len(str(len(action_entries))),
|
width = len(str(len(action_entries))),
|
||||||
name = entry['Name'])
|
name = entry['Name'])
|
||||||
menu_splash += '\n'
|
|
||||||
|
|
||||||
answer = ''
|
answer = ''
|
||||||
|
|
||||||
|
|
@ -366,6 +425,7 @@ def menu_select(title='~ Untitled Menu ~',
|
||||||
|
|
||||||
return answer.upper()
|
return answer.upper()
|
||||||
|
|
||||||
|
|
||||||
def non_clobber_rename(full_path):
|
def non_clobber_rename(full_path):
|
||||||
"""Append suffix to path, if necessary, to avoid clobbering path"""
|
"""Append suffix to path, if necessary, to avoid clobbering path"""
|
||||||
new_path = full_path
|
new_path = full_path
|
||||||
|
|
@ -376,10 +436,14 @@ def non_clobber_rename(full_path):
|
||||||
|
|
||||||
return new_path
|
return new_path
|
||||||
|
|
||||||
|
|
||||||
def pause(prompt='Press Enter to continue... '):
|
def pause(prompt='Press Enter to continue... '):
|
||||||
"""Simple pause implementation."""
|
"""Simple pause implementation."""
|
||||||
|
if prompt[-1] != ' ':
|
||||||
|
prompt += ' '
|
||||||
input(prompt)
|
input(prompt)
|
||||||
|
|
||||||
|
|
||||||
def ping(addr='google.com'):
|
def ping(addr='google.com'):
|
||||||
"""Attempt to ping addr."""
|
"""Attempt to ping addr."""
|
||||||
cmd = [
|
cmd = [
|
||||||
|
|
@ -389,30 +453,42 @@ def ping(addr='google.com'):
|
||||||
addr]
|
addr]
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def popen_program(cmd, pipe=False, minimized=False, shell=False, **kwargs):
|
def popen_program(cmd, pipe=False, minimized=False, shell=False, **kwargs):
|
||||||
"""Run program and return a subprocess.Popen object."""
|
"""Run program and return a subprocess.Popen object."""
|
||||||
startupinfo=None
|
cmd_kwargs = {'args': cmd, 'shell': shell}
|
||||||
|
for kw in ('encoding', 'errors'):
|
||||||
|
if kw in kwargs:
|
||||||
|
cmd_kwargs[kw] = kwargs[kw]
|
||||||
|
|
||||||
if minimized:
|
if minimized:
|
||||||
startupinfo = subprocess.STARTUPINFO()
|
startupinfo = subprocess.STARTUPINFO()
|
||||||
startupinfo.dwFlags = subprocess.STARTF_USESHOWWINDOW
|
startupinfo.dwFlags = subprocess.STARTF_USESHOWWINDOW
|
||||||
startupinfo.wShowWindow = 6
|
startupinfo.wShowWindow = 6
|
||||||
|
cmd_kwargs['startupinfo'] = startupinfo
|
||||||
|
|
||||||
if pipe:
|
if pipe:
|
||||||
popen_obj = subprocess.Popen(cmd, shell=shell, startupinfo=startupinfo,
|
cmd_kwargs.update({
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
'stdout': subprocess.PIPE,
|
||||||
else:
|
'stderr': subprocess.PIPE,
|
||||||
popen_obj = subprocess.Popen(cmd, shell=shell, startupinfo=startupinfo)
|
})
|
||||||
|
|
||||||
|
if 'cwd' in kwargs:
|
||||||
|
cmd_kwargs['cwd'] = kwargs['cwd']
|
||||||
|
|
||||||
|
return subprocess.Popen(**cmd_kwargs)
|
||||||
|
|
||||||
return popen_obj
|
|
||||||
|
|
||||||
def print_error(*args, **kwargs):
|
def print_error(*args, **kwargs):
|
||||||
"""Prints message to screen in RED."""
|
"""Prints message to screen in RED."""
|
||||||
print_standard(*args, color=COLORS['RED'], **kwargs)
|
print_standard(*args, color=COLORS['RED'], **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def print_info(*args, **kwargs):
|
def print_info(*args, **kwargs):
|
||||||
"""Prints message to screen in BLUE."""
|
"""Prints message to screen in BLUE."""
|
||||||
print_standard(*args, color=COLORS['BLUE'], **kwargs)
|
print_standard(*args, color=COLORS['BLUE'], **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def print_standard(message='Generic info',
|
def print_standard(message='Generic info',
|
||||||
color=None, end='\n', timestamp=True, **kwargs):
|
color=None, end='\n', timestamp=True, **kwargs):
|
||||||
"""Prints message to screen and log (if set)."""
|
"""Prints message to screen and log (if set)."""
|
||||||
|
|
@ -423,14 +499,17 @@ def print_standard(message='Generic info',
|
||||||
print(display_message.format(**COLORS), end=end, **kwargs)
|
print(display_message.format(**COLORS), end=end, **kwargs)
|
||||||
print_log(message, end, timestamp)
|
print_log(message, end, timestamp)
|
||||||
|
|
||||||
|
|
||||||
def print_success(*args, **kwargs):
|
def print_success(*args, **kwargs):
|
||||||
"""Prints message to screen in GREEN."""
|
"""Prints message to screen in GREEN."""
|
||||||
print_standard(*args, color=COLORS['GREEN'], **kwargs)
|
print_standard(*args, color=COLORS['GREEN'], **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def print_warning(*args, **kwargs):
|
def print_warning(*args, **kwargs):
|
||||||
"""Prints message to screen in YELLOW."""
|
"""Prints message to screen in YELLOW."""
|
||||||
print_standard(*args, color=COLORS['YELLOW'], **kwargs)
|
print_standard(*args, color=COLORS['YELLOW'], **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def print_log(message='', end='\n', timestamp=True):
|
def print_log(message='', end='\n', timestamp=True):
|
||||||
"""Writes message to a log if LogFile is set."""
|
"""Writes message to a log if LogFile is set."""
|
||||||
time_str = time.strftime("%Y-%m-%d %H%M%z: ") if timestamp else ''
|
time_str = time.strftime("%Y-%m-%d %H%M%z: ") if timestamp else ''
|
||||||
|
|
@ -442,32 +521,41 @@ def print_log(message='', end='\n', timestamp=True):
|
||||||
line = line,
|
line = line,
|
||||||
end = end))
|
end = end))
|
||||||
|
|
||||||
def run_program(cmd, args=[], check=True, pipe=True, shell=False):
|
|
||||||
|
def run_program(cmd, check=True, pipe=True, shell=False, **kwargs):
|
||||||
"""Run program and return a subprocess.CompletedProcess object."""
|
"""Run program and return a subprocess.CompletedProcess object."""
|
||||||
if args:
|
|
||||||
# Deprecated so let's raise an exception to find & fix all occurances
|
|
||||||
print_error('ERROR: Using args is no longer supported.')
|
|
||||||
raise Exception
|
|
||||||
cmd = [c for c in cmd if c]
|
cmd = [c for c in cmd if c]
|
||||||
if shell:
|
if shell:
|
||||||
cmd = ' '.join(cmd)
|
cmd = ' '.join(cmd)
|
||||||
|
|
||||||
|
cmd_kwargs = {'args': cmd, 'check': check, 'shell': shell}
|
||||||
|
for kw in ('encoding', 'errors'):
|
||||||
|
if kw in kwargs:
|
||||||
|
cmd_kwargs[kw] = kwargs[kw]
|
||||||
|
|
||||||
if pipe:
|
if pipe:
|
||||||
process_return = subprocess.run(cmd, check=check, shell=shell,
|
cmd_kwargs.update({
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
'stdout': subprocess.PIPE,
|
||||||
else:
|
'stderr': subprocess.PIPE,
|
||||||
process_return = subprocess.run(cmd, check=check, shell=shell)
|
})
|
||||||
|
|
||||||
return process_return
|
if 'cwd' in kwargs:
|
||||||
|
cmd_kwargs['cwd'] = kwargs['cwd']
|
||||||
|
|
||||||
def set_title(title='~Some Title~'):
|
return subprocess.run(**cmd_kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
def set_title(title='[Some Title]'):
|
||||||
"""Set title.
|
"""Set title.
|
||||||
|
|
||||||
Used for window title and menu titles."""
|
Used for window title and menu titles."""
|
||||||
global_vars['Title'] = title
|
global_vars['Title'] = title
|
||||||
os.system('title {}'.format(title))
|
os.system('title {}'.format(title))
|
||||||
|
|
||||||
def show_data(message='~Some message~', data='~Some data~', indent=8, width=32,
|
|
||||||
|
def show_data(
|
||||||
|
message='[Some message]', data='[Some data]',
|
||||||
|
indent=8, width=32,
|
||||||
info=False, warning=False, error=False):
|
info=False, warning=False, error=False):
|
||||||
"""Display info with formatting."""
|
"""Display info with formatting."""
|
||||||
message = '{indent}{message:<{width}}{data}'.format(
|
message = '{indent}{message:<{width}}{data}'.format(
|
||||||
|
|
@ -481,12 +569,16 @@ def show_data(message='~Some message~', data='~Some data~', indent=8, width=32,
|
||||||
else:
|
else:
|
||||||
print_standard(message)
|
print_standard(message)
|
||||||
|
|
||||||
|
|
||||||
def sleep(seconds=2):
|
def sleep(seconds=2):
|
||||||
"""Wait for a while."""
|
"""Wait for a while."""
|
||||||
time.sleep(seconds)
|
time.sleep(seconds)
|
||||||
|
|
||||||
|
|
||||||
def stay_awake():
|
def stay_awake():
|
||||||
"""Prevent the system from sleeping or hibernating."""
|
"""Prevent the system from sleeping or hibernating."""
|
||||||
|
# DISABLED due to VCR2008 dependency
|
||||||
|
return
|
||||||
# Bail if caffeine is already running
|
# Bail if caffeine is already running
|
||||||
for proc in psutil.process_iter():
|
for proc in psutil.process_iter():
|
||||||
if proc.name() == 'caffeine.exe':
|
if proc.name() == 'caffeine.exe':
|
||||||
|
|
@ -494,11 +586,19 @@ def stay_awake():
|
||||||
# Extract and run
|
# Extract and run
|
||||||
extract_item('Caffeine', silent=True)
|
extract_item('Caffeine', silent=True)
|
||||||
try:
|
try:
|
||||||
popen_program(global_vars['Tools']['Caffeine'])
|
popen_program([global_vars['Tools']['Caffeine']])
|
||||||
except Exception:
|
except Exception:
|
||||||
print_error('ERROR: No caffeine available.')
|
print_error('ERROR: No caffeine available.')
|
||||||
print_warning('Please set the power setting to High Performance.')
|
print_warning('Please set the power setting to High Performance.')
|
||||||
|
|
||||||
|
|
||||||
|
def strip_colors(s):
|
||||||
|
"""Remove all ASCII color escapes from string, returns str."""
|
||||||
|
for c in COLORS.values():
|
||||||
|
s = s.replace(c, '')
|
||||||
|
return s
|
||||||
|
|
||||||
|
|
||||||
def get_exception(s):
|
def get_exception(s):
|
||||||
"""Get exception by name, returns Exception object."""
|
"""Get exception by name, returns Exception object."""
|
||||||
try:
|
try:
|
||||||
|
|
@ -508,6 +608,7 @@ def get_exception(s):
|
||||||
obj = getattr(sys.modules['builtins'], s)
|
obj = getattr(sys.modules['builtins'], s)
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|
||||||
def try_and_print(message='Trying...',
|
def try_and_print(message='Trying...',
|
||||||
function=None, cs='CS', ns='NS', other_results={},
|
function=None, cs='CS', ns='NS', other_results={},
|
||||||
catch_all=True, print_return=False, silent_function=True,
|
catch_all=True, print_return=False, silent_function=True,
|
||||||
|
|
@ -521,7 +622,7 @@ def try_and_print(message='Trying...',
|
||||||
}
|
}
|
||||||
The the ExceptionClassNames will be excepted conditions
|
The the ExceptionClassNames will be excepted conditions
|
||||||
and the result string will be printed in the correct color.
|
and the result string will be printed in the correct color.
|
||||||
catch_all=False will result in unspecified exceptions being re-raised."""
|
catch_all=False will re-raise unspecified exceptions."""
|
||||||
err = None
|
err = None
|
||||||
out = None
|
out = None
|
||||||
w_exceptions = other_results.get('Warning', {}).keys()
|
w_exceptions = other_results.get('Warning', {}).keys()
|
||||||
|
|
@ -564,6 +665,7 @@ def try_and_print(message='Trying...',
|
||||||
else:
|
else:
|
||||||
return {'CS': not bool(err), 'Error': err, 'Out': out}
|
return {'CS': not bool(err), 'Error': err, 'Out': out}
|
||||||
|
|
||||||
|
|
||||||
def upload_crash_details():
|
def upload_crash_details():
|
||||||
"""Upload log and runtime data to the CRASH_SERVER.
|
"""Upload log and runtime data to the CRASH_SERVER.
|
||||||
|
|
||||||
|
|
@ -575,13 +677,14 @@ def upload_crash_details():
|
||||||
if 'LogFile' in global_vars and global_vars['LogFile']:
|
if 'LogFile' in global_vars and global_vars['LogFile']:
|
||||||
if ask('Upload crash details to {}?'.format(CRASH_SERVER['Name'])):
|
if ask('Upload crash details to {}?'.format(CRASH_SERVER['Name'])):
|
||||||
with open(global_vars['LogFile']) as f:
|
with open(global_vars['LogFile']) as f:
|
||||||
data = '''{}
|
data = '{}\n'.format(f.read())
|
||||||
#############################
|
data += '#############################\n'
|
||||||
Runtime Details:
|
data += 'Runtime Details:\n\n'
|
||||||
|
data += 'sys.argv: {}\n\n'.format(sys.argv)
|
||||||
sys.argv: {}
|
try:
|
||||||
|
data += generate_global_vars_report()
|
||||||
global_vars: {}'''.format(f.read(), sys.argv, global_vars)
|
except Exception:
|
||||||
|
data += 'global_vars: {}\n'.format(global_vars)
|
||||||
filename = global_vars.get('LogFile', 'Unknown')
|
filename = global_vars.get('LogFile', 'Unknown')
|
||||||
filename = re.sub(r'.*(\\|/)', '', filename)
|
filename = re.sub(r'.*(\\|/)', '', filename)
|
||||||
filename += '.txt'
|
filename += '.txt'
|
||||||
|
|
@ -589,9 +692,10 @@ global_vars: {}'''.format(f.read(), sys.argv, global_vars)
|
||||||
CRASH_SERVER['Url'],
|
CRASH_SERVER['Url'],
|
||||||
global_vars.get('Date-Time', 'Unknown Date-Time'),
|
global_vars.get('Date-Time', 'Unknown Date-Time'),
|
||||||
filename)
|
filename)
|
||||||
r = requests.put(url, data=data,
|
r = requests.put(
|
||||||
headers = {'X-Requested-With': 'XMLHttpRequest'},
|
url, data=data,
|
||||||
auth = (CRASH_SERVER['User'], CRASH_SERVER['Pass']))
|
headers={'X-Requested-With': 'XMLHttpRequest'},
|
||||||
|
auth=(CRASH_SERVER['User'], CRASH_SERVER['Pass']))
|
||||||
# Raise exception if upload NS
|
# Raise exception if upload NS
|
||||||
if not r.ok:
|
if not r.ok:
|
||||||
raise Exception
|
raise Exception
|
||||||
|
|
@ -602,6 +706,7 @@ global_vars: {}'''.format(f.read(), sys.argv, global_vars)
|
||||||
# No LogFile defined (or invalid LogFile)
|
# No LogFile defined (or invalid LogFile)
|
||||||
raise GenericError
|
raise GenericError
|
||||||
|
|
||||||
|
|
||||||
def wait_for_process(name, poll_rate=3):
|
def wait_for_process(name, poll_rate=3):
|
||||||
"""Wait for process by name."""
|
"""Wait for process by name."""
|
||||||
running = True
|
running = True
|
||||||
|
|
@ -617,9 +722,11 @@ def wait_for_process(name, poll_rate=3):
|
||||||
pass
|
pass
|
||||||
sleep(1)
|
sleep(1)
|
||||||
|
|
||||||
|
|
||||||
# global_vars functions
|
# global_vars functions
|
||||||
def init_global_vars():
|
def init_global_vars(silent=False):
|
||||||
"""Sets global variables based on system info."""
|
"""Sets global variables based on system info."""
|
||||||
|
if not silent:
|
||||||
print_info('Initializing')
|
print_info('Initializing')
|
||||||
if psutil.WINDOWS:
|
if psutil.WINDOWS:
|
||||||
os.system('title Wizard Kit')
|
os.system('title Wizard Kit')
|
||||||
|
|
@ -638,6 +745,10 @@ def init_global_vars():
|
||||||
['Clearing collisions...', clean_env_vars],
|
['Clearing collisions...', clean_env_vars],
|
||||||
]
|
]
|
||||||
try:
|
try:
|
||||||
|
if silent:
|
||||||
|
for f in init_functions:
|
||||||
|
f[1]()
|
||||||
|
else:
|
||||||
for f in init_functions:
|
for f in init_functions:
|
||||||
try_and_print(
|
try_and_print(
|
||||||
message=f[0], function=f[1],
|
message=f[0], function=f[1],
|
||||||
|
|
@ -645,6 +756,7 @@ def init_global_vars():
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
|
||||||
def check_os():
|
def check_os():
|
||||||
"""Set OS specific variables."""
|
"""Set OS specific variables."""
|
||||||
tmp = {}
|
tmp = {}
|
||||||
|
|
@ -673,9 +785,16 @@ def check_os():
|
||||||
tmp['Arch'] = 64
|
tmp['Arch'] = 64
|
||||||
|
|
||||||
# Get Windows build info
|
# Get Windows build info
|
||||||
build_info = WINDOWS_BUILDS.get(
|
build_info = WINDOWS_BUILDS.get(tmp['CurrentBuild'], None)
|
||||||
tmp['CurrentBuild'],
|
if build_info is None:
|
||||||
('Unknown', 'Build {}'.format(tmp['CurrentBuild']), None, None, 'unrecognized'))
|
# Not in windows_builds.py
|
||||||
|
build_info = [
|
||||||
|
'Unknown',
|
||||||
|
'Build {}'.format(tmp['CurrentBuild']),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
'unrecognized']
|
||||||
|
else:
|
||||||
build_info = list(build_info)
|
build_info = list(build_info)
|
||||||
tmp['Version'] = build_info.pop(0)
|
tmp['Version'] = build_info.pop(0)
|
||||||
tmp['Release'] = build_info.pop(0)
|
tmp['Release'] = build_info.pop(0)
|
||||||
|
|
@ -700,6 +819,7 @@ def check_os():
|
||||||
|
|
||||||
global_vars['OS'] = tmp
|
global_vars['OS'] = tmp
|
||||||
|
|
||||||
|
|
||||||
def check_tools():
|
def check_tools():
|
||||||
"""Set tool variables based on OS bit-depth and tool availability."""
|
"""Set tool variables based on OS bit-depth and tool availability."""
|
||||||
if global_vars['OS'].get('Arch', 32) == 64:
|
if global_vars['OS'].get('Arch', 32) == 64:
|
||||||
|
|
@ -712,6 +832,7 @@ def check_tools():
|
||||||
global_vars['Tools'] = {k: os.path.join(global_vars['BinDir'], v)
|
global_vars['Tools'] = {k: os.path.join(global_vars['BinDir'], v)
|
||||||
for (k, v) in global_vars['Tools'].items()}
|
for (k, v) in global_vars['Tools'].items()}
|
||||||
|
|
||||||
|
|
||||||
def clean_env_vars():
|
def clean_env_vars():
|
||||||
"""Remove conflicting global_vars and env variables.
|
"""Remove conflicting global_vars and env variables.
|
||||||
|
|
||||||
|
|
@ -720,6 +841,7 @@ def clean_env_vars():
|
||||||
for key in global_vars.keys():
|
for key in global_vars.keys():
|
||||||
global_vars['Env'].pop(key, None)
|
global_vars['Env'].pop(key, None)
|
||||||
|
|
||||||
|
|
||||||
def find_bin():
|
def find_bin():
|
||||||
"""Find .bin folder in the cwd or it's parents."""
|
"""Find .bin folder in the cwd or it's parents."""
|
||||||
wd = os.getcwd()
|
wd = os.getcwd()
|
||||||
|
|
@ -736,12 +858,45 @@ def find_bin():
|
||||||
raise BinNotFoundError
|
raise BinNotFoundError
|
||||||
global_vars['BaseDir'] = base
|
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():
|
def make_tmp_dirs():
|
||||||
"""Make temp directories."""
|
"""Make temp directories."""
|
||||||
os.makedirs(global_vars['BackupDir'], exist_ok=True)
|
os.makedirs(global_vars['BackupDir'], exist_ok=True)
|
||||||
os.makedirs(global_vars['LogDir'], 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)
|
os.makedirs(global_vars['TmpDir'], exist_ok=True)
|
||||||
|
|
||||||
|
|
||||||
def set_common_vars():
|
def set_common_vars():
|
||||||
"""Set common variables."""
|
"""Set common variables."""
|
||||||
global_vars['Date'] = time.strftime("%Y-%m-%d")
|
global_vars['Date'] = time.strftime("%Y-%m-%d")
|
||||||
|
|
@ -749,22 +904,15 @@ def set_common_vars():
|
||||||
global_vars['Env'] = os.environ.copy()
|
global_vars['Env'] = os.environ.copy()
|
||||||
|
|
||||||
global_vars['ArchivePassword'] = ARCHIVE_PASSWORD
|
global_vars['ArchivePassword'] = ARCHIVE_PASSWORD
|
||||||
global_vars['BinDir'] = r'{BaseDir}\.bin'.format(
|
global_vars['BinDir'] = r'{BaseDir}\.bin'.format(**global_vars)
|
||||||
**global_vars)
|
global_vars['CBinDir'] = r'{BaseDir}\.cbin'.format(**global_vars)
|
||||||
global_vars['CBinDir'] = r'{BaseDir}\.cbin'.format(
|
|
||||||
**global_vars)
|
|
||||||
global_vars['ClientDir'] = r'{SYSTEMDRIVE}\{prefix}'.format(
|
global_vars['ClientDir'] = r'{SYSTEMDRIVE}\{prefix}'.format(
|
||||||
prefix=KIT_NAME_SHORT, **global_vars['Env'])
|
prefix=KIT_NAME_SHORT, **global_vars['Env'])
|
||||||
global_vars['BackupDir'] = r'{ClientDir}\Backups\{Date}'.format(
|
global_vars['BackupDir'] = r'{ClientDir}\Backups'.format(**global_vars)
|
||||||
**global_vars)
|
global_vars['LogDir'] = r'{ClientDir}\Logs\{Date}'.format(**global_vars)
|
||||||
global_vars['LogDir'] = r'{ClientDir}\Info\{Date}'.format(
|
global_vars['QuarantineDir'] = r'{ClientDir}\Quarantine'.format(**global_vars)
|
||||||
**global_vars)
|
global_vars['TmpDir'] = r'{BinDir}\tmp'.format(**global_vars)
|
||||||
global_vars['ProgBackupDir'] = r'{ClientDir}\Backups'.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():
|
def set_linux_vars():
|
||||||
"""Set common variables in a Linux environment.
|
"""Set common variables in a Linux environment.
|
||||||
|
|
@ -776,11 +924,31 @@ def set_linux_vars():
|
||||||
global_vars['Date-Time'] = time.strftime("%Y-%m-%d_%H%M_%z")
|
global_vars['Date-Time'] = time.strftime("%Y-%m-%d_%H%M_%z")
|
||||||
global_vars['Env'] = os.environ.copy()
|
global_vars['Env'] = os.environ.copy()
|
||||||
global_vars['BinDir'] = '/usr/local/bin'
|
global_vars['BinDir'] = '/usr/local/bin'
|
||||||
global_vars['LogDir'] = global_vars['TmpDir']
|
global_vars['LogDir'] = '{}/Logs'.format(global_vars['Env']['HOME'])
|
||||||
global_vars['Tools'] = {
|
global_vars['Tools'] = {
|
||||||
'wimlib-imagex': 'wimlib-imagex',
|
'wimlib-imagex': 'wimlib-imagex',
|
||||||
'SevenZip': '7z',
|
'SevenZip': '7z',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def set_log_file(log_name):
|
||||||
|
"""Sets global var LogFile and creates path as needed."""
|
||||||
|
if psutil.LINUX:
|
||||||
|
folder_path = global_vars['LogDir']
|
||||||
|
else:
|
||||||
|
folder_path = '{}{}{}'.format(
|
||||||
|
global_vars['LogDir'],
|
||||||
|
os.sep,
|
||||||
|
KIT_NAME_FULL)
|
||||||
|
log_file = '{}{}{}'.format(
|
||||||
|
folder_path,
|
||||||
|
os.sep,
|
||||||
|
log_name)
|
||||||
|
os.makedirs(folder_path, exist_ok=True)
|
||||||
|
global_vars['LogFile'] = log_file
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
# Wizard Kit: Functions - Data
|
# Wizard Kit: Functions - Data
|
||||||
|
|
||||||
import ctypes
|
import ctypes
|
||||||
import json
|
|
||||||
|
|
||||||
|
from functions.json import *
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
|
from settings.data import *
|
||||||
|
|
||||||
from functions.common import *
|
|
||||||
|
|
||||||
# Classes
|
# Classes
|
||||||
class LocalDisk():
|
class LocalDisk():
|
||||||
|
|
@ -20,104 +20,16 @@ class LocalDisk():
|
||||||
# Should always be false
|
# Should always be false
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
class SourceItem():
|
class SourceItem():
|
||||||
def __init__(self, name, path):
|
def __init__(self, name, path):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.path = path
|
self.path = path
|
||||||
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
# STATIC VARIABLES
|
|
||||||
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)),
|
|
||||||
]
|
|
||||||
# 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
|
|
||||||
|
|
||||||
|
# Functions
|
||||||
def cleanup_transfer(dest_path):
|
def cleanup_transfer(dest_path):
|
||||||
"""Fix attributes and move extraneous items outside the Transfer folder."""
|
"""Fix attributes and move excluded items to separate folder."""
|
||||||
try:
|
try:
|
||||||
# Remove dest_path if empty
|
# Remove dest_path if empty
|
||||||
os.rmdir(dest_path)
|
os.rmdir(dest_path)
|
||||||
|
|
@ -153,7 +65,8 @@ def cleanup_transfer(dest_path):
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def find_core_storage_volumes():
|
|
||||||
|
def find_core_storage_volumes(device_path=None):
|
||||||
"""Try to create block devices for any Apple CoreStorage volumes."""
|
"""Try to create block devices for any Apple CoreStorage volumes."""
|
||||||
corestorage_uuid = '53746f72-6167-11aa-aa11-00306543ecac'
|
corestorage_uuid = '53746f72-6167-11aa-aa11-00306543ecac'
|
||||||
dmsetup_cmd_file = '{TmpDir}/dmsetup_command'.format(**global_vars)
|
dmsetup_cmd_file = '{TmpDir}/dmsetup_command'.format(**global_vars)
|
||||||
|
|
@ -162,8 +75,9 @@ def find_core_storage_volumes():
|
||||||
cmd = [
|
cmd = [
|
||||||
'lsblk', '--json', '--list', '--paths',
|
'lsblk', '--json', '--list', '--paths',
|
||||||
'--output', 'NAME,PARTTYPE']
|
'--output', 'NAME,PARTTYPE']
|
||||||
result = run_program(cmd)
|
if device_path:
|
||||||
json_data = json.loads(result.stdout.decode())
|
cmd.append(device_path)
|
||||||
|
json_data = get_json_from_command(cmd)
|
||||||
devs = json_data.get('blockdevices', [])
|
devs = json_data.get('blockdevices', [])
|
||||||
devs = [d for d in devs if d.get('parttype', '') == corestorage_uuid]
|
devs = [d for d in devs if d.get('parttype', '') == corestorage_uuid]
|
||||||
if devs:
|
if devs:
|
||||||
|
|
@ -197,7 +111,7 @@ def find_core_storage_volumes():
|
||||||
|
|
||||||
# Check log for found volumes
|
# Check log for found volumes
|
||||||
cs_vols = {}
|
cs_vols = {}
|
||||||
with open(log_path, 'r') as f:
|
with open(log_path, 'r', encoding='utf-8', errors='ignore') as f:
|
||||||
for line in f.readlines():
|
for line in f.readlines():
|
||||||
r = re.match(
|
r = re.match(
|
||||||
r'^.*echo "([^"]+)" . dmsetup create test(\d)$',
|
r'^.*echo "([^"]+)" . dmsetup create test(\d)$',
|
||||||
|
|
@ -214,12 +128,14 @@ def find_core_storage_volumes():
|
||||||
cmd = ['sudo', 'dmsetup', 'create', name, dmsetup_cmd_file]
|
cmd = ['sudo', 'dmsetup', 'create', name, dmsetup_cmd_file]
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
|
|
||||||
def fix_path_sep(path_str):
|
def fix_path_sep(path_str):
|
||||||
"""Replace non-native and duplicate dir separators, returns str."""
|
"""Replace non-native and duplicate dir separators, returns str."""
|
||||||
return re.sub(r'(\\|/)+', lambda s: os.sep, path_str)
|
return re.sub(r'(\\|/)+', lambda s: os.sep, path_str)
|
||||||
|
|
||||||
|
|
||||||
def is_valid_wim_file(item):
|
def is_valid_wim_file(item):
|
||||||
"""Checks if the provided os.DirEntry is a valid WIM file, returns bool."""
|
"""Checks if the item is a valid WIM file, returns bool."""
|
||||||
valid = bool(item.is_file() and REGEX_WIM_FILE.search(item.name))
|
valid = bool(item.is_file() and REGEX_WIM_FILE.search(item.name))
|
||||||
if valid:
|
if valid:
|
||||||
extract_item('wimlib', silent=True)
|
extract_item('wimlib', silent=True)
|
||||||
|
|
@ -231,24 +147,31 @@ def is_valid_wim_file(item):
|
||||||
print_log('WARNING: Image "{}" damaged.'.format(item.name))
|
print_log('WARNING: Image "{}" damaged.'.format(item.name))
|
||||||
return valid
|
return valid
|
||||||
|
|
||||||
|
|
||||||
def get_mounted_volumes():
|
def get_mounted_volumes():
|
||||||
"""Get mounted volumes, returns dict."""
|
"""Get mounted volumes, returns dict."""
|
||||||
cmd = [
|
cmd = [
|
||||||
'findmnt', '-J', '-b', '-i',
|
'findmnt',
|
||||||
'-t', (
|
'--list',
|
||||||
'autofs,binfmt_misc,bpf,cgroup,cgroup2,configfs,debugfs,devpts,devtmpfs,'
|
'--json',
|
||||||
'hugetlbfs,mqueue,proc,pstore,securityfs,sysfs,tmpfs'
|
'--bytes',
|
||||||
|
'--invert',
|
||||||
|
'--types', (
|
||||||
|
'autofs,binfmt_misc,bpf,cgroup,cgroup2,configfs,debugfs,devpts,'
|
||||||
|
'devtmpfs,hugetlbfs,mqueue,proc,pstore,securityfs,sysfs,tmpfs'
|
||||||
),
|
),
|
||||||
'-o', 'SOURCE,TARGET,FSTYPE,LABEL,SIZE,AVAIL,USED']
|
'--output', 'SOURCE,TARGET,FSTYPE,LABEL,SIZE,AVAIL,USED']
|
||||||
result = run_program(cmd)
|
json_data = get_json_from_command(cmd)
|
||||||
json_data = json.loads(result.stdout.decode())
|
|
||||||
mounted_volumes = []
|
mounted_volumes = []
|
||||||
for item in json_data.get('filesystems', []):
|
for item in json_data.get('filesystems', []):
|
||||||
mounted_volumes.append(item)
|
mounted_volumes.append(item)
|
||||||
mounted_volumes.extend(item.get('children', []))
|
mounted_volumes.extend(item.get('children', []))
|
||||||
return {item['source']: item for item in mounted_volumes}
|
return {item['source']: item for item in mounted_volumes}
|
||||||
|
|
||||||
def mount_volumes(all_devices=True, device_path=None, read_write=False):
|
|
||||||
|
def mount_volumes(
|
||||||
|
all_devices=True, device_path=None,
|
||||||
|
read_write=False, core_storage=True):
|
||||||
"""Mount all detected filesystems."""
|
"""Mount all detected filesystems."""
|
||||||
report = {}
|
report = {}
|
||||||
cmd = [
|
cmd = [
|
||||||
|
|
@ -257,22 +180,27 @@ def mount_volumes(all_devices=True, device_path=None, read_write=False):
|
||||||
if not all_devices and device_path:
|
if not all_devices and device_path:
|
||||||
# Only mount volumes for specific device
|
# Only mount volumes for specific device
|
||||||
cmd.append(device_path)
|
cmd.append(device_path)
|
||||||
else:
|
|
||||||
# Check for Apple CoreStorage volumes first
|
# Check for Apple CoreStorage volumes first
|
||||||
find_core_storage_volumes()
|
if core_storage:
|
||||||
|
find_core_storage_volumes(device_path)
|
||||||
|
|
||||||
# Get list of block devices
|
# Get list of block devices
|
||||||
result = run_program(cmd)
|
json_data = get_json_from_command(cmd)
|
||||||
json_data = json.loads(result.stdout.decode())
|
|
||||||
devs = json_data.get('blockdevices', [])
|
devs = json_data.get('blockdevices', [])
|
||||||
|
|
||||||
# Get list of volumes
|
# Get list of volumes
|
||||||
volumes = {}
|
volumes = {}
|
||||||
for dev in devs:
|
for dev in devs:
|
||||||
|
if not dev.get('children', []):
|
||||||
|
volumes.update({dev['name']: dev})
|
||||||
for child in dev.get('children', []):
|
for child in dev.get('children', []):
|
||||||
|
if not child.get('children', []):
|
||||||
volumes.update({child['name']: child})
|
volumes.update({child['name']: child})
|
||||||
for grandchild in child.get('children', []):
|
for grandchild in child.get('children', []):
|
||||||
volumes.update({grandchild['name']: grandchild})
|
volumes.update({grandchild['name']: grandchild})
|
||||||
|
for great_grandchild in grandchild.get('children', []):
|
||||||
|
volumes.update({great_grandchild['name']: great_grandchild})
|
||||||
|
|
||||||
# Get list of mounted volumes
|
# Get list of mounted volumes
|
||||||
mounted_volumes = get_mounted_volumes()
|
mounted_volumes = get_mounted_volumes()
|
||||||
|
|
@ -290,7 +218,7 @@ def mount_volumes(all_devices=True, device_path=None, read_write=False):
|
||||||
report[vol_path] = vol_data
|
report[vol_path] = vol_data
|
||||||
elif 'children' in vol_data:
|
elif 'children' in vol_data:
|
||||||
# Skip LVM/RAID partitions (the real volume is mounted separately)
|
# Skip LVM/RAID partitions (the real volume is mounted separately)
|
||||||
vol_data['show_data']['data'] = vol_data.get('fstype', 'UNKNOWN')
|
vol_data['show_data']['data'] = vol_data.get('fstype', 'Unknown')
|
||||||
if vol_data.get('label', None):
|
if vol_data.get('label', None):
|
||||||
vol_data['show_data']['data'] += ' "{}"'.format(vol_data['label'])
|
vol_data['show_data']['data'] += ' "{}"'.format(vol_data['label'])
|
||||||
vol_data['show_data']['info'] = True
|
vol_data['show_data']['info'] = True
|
||||||
|
|
@ -315,17 +243,23 @@ def mount_volumes(all_devices=True, device_path=None, read_write=False):
|
||||||
if vol_data['show_data']['data'] == 'Failed to mount':
|
if vol_data['show_data']['data'] == 'Failed to mount':
|
||||||
vol_data['mount_point'] = None
|
vol_data['mount_point'] = None
|
||||||
else:
|
else:
|
||||||
|
fstype = vol_data.get('fstype', 'Unknown FS')
|
||||||
size_used = human_readable_size(
|
size_used = human_readable_size(
|
||||||
mounted_volumes[vol_path]['used'])
|
mounted_volumes[vol_path]['used'],
|
||||||
|
decimals=1,
|
||||||
|
)
|
||||||
size_avail = human_readable_size(
|
size_avail = human_readable_size(
|
||||||
mounted_volumes[vol_path]['avail'])
|
mounted_volumes[vol_path]['avail'],
|
||||||
|
decimals=1,
|
||||||
|
)
|
||||||
vol_data['size_avail'] = size_avail
|
vol_data['size_avail'] = size_avail
|
||||||
vol_data['size_used'] = size_used
|
vol_data['size_used'] = size_used
|
||||||
vol_data['mount_point'] = mounted_volumes[vol_path]['target']
|
vol_data['mount_point'] = mounted_volumes[vol_path]['target']
|
||||||
vol_data['show_data']['data'] = 'Mounted on {}'.format(
|
vol_data['show_data']['data'] = 'Mounted on {}'.format(
|
||||||
mounted_volumes[vol_path]['target'])
|
mounted_volumes[vol_path]['target'])
|
||||||
vol_data['show_data']['data'] = '{:40} ({} used, {} free)'.format(
|
vol_data['show_data']['data'] = '{:40} ({}, {} used, {} free)'.format(
|
||||||
vol_data['show_data']['data'],
|
vol_data['show_data']['data'],
|
||||||
|
fstype,
|
||||||
size_used,
|
size_used,
|
||||||
size_avail)
|
size_avail)
|
||||||
|
|
||||||
|
|
@ -334,6 +268,7 @@ def mount_volumes(all_devices=True, device_path=None, read_write=False):
|
||||||
|
|
||||||
return report
|
return report
|
||||||
|
|
||||||
|
|
||||||
def mount_backup_shares(read_write=False):
|
def mount_backup_shares(read_write=False):
|
||||||
"""Mount the backup shares unless labeled as already mounted."""
|
"""Mount the backup shares unless labeled as already mounted."""
|
||||||
if psutil.LINUX:
|
if psutil.LINUX:
|
||||||
|
|
@ -355,8 +290,17 @@ def mount_backup_shares(read_write=False):
|
||||||
|
|
||||||
mount_network_share(server, read_write)
|
mount_network_share(server, read_write)
|
||||||
|
|
||||||
|
|
||||||
def mount_network_share(server, read_write=False):
|
def mount_network_share(server, read_write=False):
|
||||||
"""Mount a network share defined by server."""
|
"""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:
|
if read_write:
|
||||||
username = server['RW-User']
|
username = server['RW-User']
|
||||||
password = server['RW-Pass']
|
password = server['RW-Pass']
|
||||||
|
|
@ -364,29 +308,43 @@ def mount_network_share(server, read_write=False):
|
||||||
username = server['User']
|
username = server['User']
|
||||||
password = server['Pass']
|
password = server['Pass']
|
||||||
if psutil.WINDOWS:
|
if psutil.WINDOWS:
|
||||||
cmd = r'net use \\{ip}\{share} /user:{username} {password}'.format(
|
cmd = [
|
||||||
ip = server['IP'],
|
'net', 'use', r'\\{IP}\{Share}'.format(**server),
|
||||||
share = server['Share'],
|
'/user:{}'.format(username), password]
|
||||||
username = username,
|
|
||||||
password = password)
|
|
||||||
cmd = cmd.split(' ')
|
|
||||||
warning = r'Failed to mount \\{Name}\{Share}, {IP} unreachable.'.format(
|
warning = r'Failed to mount \\{Name}\{Share}, {IP} unreachable.'.format(
|
||||||
**server)
|
**server)
|
||||||
error = r'Failed to mount \\{Name}\{Share} ({IP})'.format(**server)
|
error = r'Failed to mount \\{Name}\{Share} ({IP})'.format(**server)
|
||||||
success = 'Mounted {Name}'.format(**server)
|
success = 'Mounted {Name}'.format(**server)
|
||||||
elif psutil.LINUX:
|
elif psutil.LINUX:
|
||||||
|
# Make mountpoint
|
||||||
cmd = [
|
cmd = [
|
||||||
'sudo', 'mkdir', '-p',
|
'sudo', 'mkdir', '-p',
|
||||||
'/Backups/{Name}'.format(**server)]
|
'/Backups/{Name}'.format(**server)]
|
||||||
run_program(cmd)
|
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 = [
|
cmd = [
|
||||||
'sudo', 'mount',
|
'sudo', 'mount',
|
||||||
'//{IP}/{Share}'.format(**server),
|
'//{IP}/{Share}'.format(**server).replace('\\', '/'),
|
||||||
'/Backups/{Name}'.format(**server),
|
'/Backups/{Name}'.format(**server),
|
||||||
'-o', '{}username={},password={}'.format(
|
'-o', ','.join(cmd_options),
|
||||||
'' if read_write else 'ro,',
|
]
|
||||||
username,
|
|
||||||
password)]
|
# Set result messages
|
||||||
warning = 'Failed to mount /Backups/{Name}, {IP} unreachable.'.format(
|
warning = 'Failed to mount /Backups/{Name}, {IP} unreachable.'.format(
|
||||||
**server)
|
**server)
|
||||||
error = 'Failed to mount /Backups/{Name}'.format(**server)
|
error = 'Failed to mount /Backups/{Name}'.format(**server)
|
||||||
|
|
@ -410,18 +368,20 @@ def mount_network_share(server, read_write=False):
|
||||||
print_info(success)
|
print_info(success)
|
||||||
server['Mounted'] = True
|
server['Mounted'] = True
|
||||||
|
|
||||||
|
|
||||||
def run_fast_copy(items, dest):
|
def run_fast_copy(items, dest):
|
||||||
"""Copy items to dest using FastCopy."""
|
"""Copy items to dest using FastCopy."""
|
||||||
if not items:
|
if not items:
|
||||||
raise Exception
|
raise Exception
|
||||||
|
|
||||||
cmd = [global_vars['Tools']['FastCopy'], *FAST_COPY_ARGS]
|
cmd = [global_vars['Tools']['FastCopy'], *FAST_COPY_ARGS]
|
||||||
cmd.append(r'/logfile={}\FastCopy.log'.format(global_vars['LogDir']))
|
cmd.append(r'/logfile={LogDir}\Tools\FastCopy.log'.format(**global_vars))
|
||||||
cmd.extend(items)
|
cmd.extend(items)
|
||||||
cmd.append('/to={}\\'.format(dest))
|
cmd.append('/to={}\\'.format(dest))
|
||||||
|
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def run_wimextract(source, items, dest):
|
def run_wimextract(source, items, dest):
|
||||||
"""Extract items from source WIM to dest folder."""
|
"""Extract items from source WIM to dest folder."""
|
||||||
if not items:
|
if not items:
|
||||||
|
|
@ -447,8 +407,9 @@ def run_wimextract(source, items, dest):
|
||||||
'--nullglob']
|
'--nullglob']
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def list_source_items(source_obj, rel_path=None):
|
def list_source_items(source_obj, rel_path=None):
|
||||||
"""List items in a dir or WIM, returns a list of SourceItem objects."""
|
"""List items in a dir or WIM, returns list of SourceItem objects."""
|
||||||
items = []
|
items = []
|
||||||
rel_path = '{}{}'.format(os.sep, rel_path) if rel_path else ''
|
rel_path = '{}{}'.format(os.sep, rel_path) if rel_path else ''
|
||||||
if source_obj.is_dir():
|
if source_obj.is_dir():
|
||||||
|
|
@ -484,6 +445,7 @@ def list_source_items(source_obj, rel_path=None):
|
||||||
# Done
|
# Done
|
||||||
return items
|
return items
|
||||||
|
|
||||||
|
|
||||||
def scan_source(source_obj, dest_path, rel_path='', interactive=True):
|
def scan_source(source_obj, dest_path, rel_path='', interactive=True):
|
||||||
"""Scan source for files/folders to transfer, returns list.
|
"""Scan source for files/folders to transfer, returns list.
|
||||||
|
|
||||||
|
|
@ -567,8 +529,9 @@ def scan_source(source_obj, dest_path, rel_path='', interactive=True):
|
||||||
# Done
|
# Done
|
||||||
return selected_items
|
return selected_items
|
||||||
|
|
||||||
|
|
||||||
def get_source_item_obj(source_obj, rel_path, item_path):
|
def get_source_item_obj(source_obj, rel_path, item_path):
|
||||||
"""Check if the item exists and return a SourceItem object if it does."""
|
"""Check if the item exists, returns SourceItem object or None."""
|
||||||
item_obj = None
|
item_obj = None
|
||||||
item_path = fix_path_sep(item_path)
|
item_path = fix_path_sep(item_path)
|
||||||
if source_obj.is_dir():
|
if source_obj.is_dir():
|
||||||
|
|
@ -606,6 +569,7 @@ def get_source_item_obj(source_obj, rel_path, item_path):
|
||||||
item_path))
|
item_path))
|
||||||
return item_obj
|
return item_obj
|
||||||
|
|
||||||
|
|
||||||
def select_destination(folder_path, prompt='Select destination'):
|
def select_destination(folder_path, prompt='Select destination'):
|
||||||
"""Select destination drive, returns path as string."""
|
"""Select destination drive, returns path as string."""
|
||||||
disk = select_volume(prompt)
|
disk = select_volume(prompt)
|
||||||
|
|
@ -622,8 +586,9 @@ def select_destination(folder_path, prompt='Select destination'):
|
||||||
|
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
||||||
def select_source(backup_prefix):
|
def select_source(backup_prefix):
|
||||||
"""Select backup from those found on the BACKUP_SERVERS matching the prefix."""
|
"""Select matching backup from BACKUP_SERVERS, returns obj."""
|
||||||
selected_source = None
|
selected_source = None
|
||||||
local_sources = []
|
local_sources = []
|
||||||
remote_sources = []
|
remote_sources = []
|
||||||
|
|
@ -787,6 +752,7 @@ def select_source(backup_prefix):
|
||||||
# Done
|
# Done
|
||||||
return selected_source
|
return selected_source
|
||||||
|
|
||||||
|
|
||||||
def select_volume(title='Select disk', auto_select=True):
|
def select_volume(title='Select disk', auto_select=True):
|
||||||
"""Select disk from attached disks. returns dict."""
|
"""Select disk from attached disks. returns dict."""
|
||||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||||
|
|
@ -824,10 +790,11 @@ def select_volume(title='Select disk', auto_select=True):
|
||||||
else:
|
else:
|
||||||
return disks[int(selection)-1]
|
return disks[int(selection)-1]
|
||||||
|
|
||||||
|
|
||||||
def set_thread_error_mode(silent=True):
|
def set_thread_error_mode(silent=True):
|
||||||
"""Disable or Enable Windows error message dialogs.
|
"""Disable or Enable Windows error message dialogs.
|
||||||
|
|
||||||
Disable when scanning for disks to avoid popups for empty cardreaders, etc
|
Disable when scanning disks to avoid popups for empty cardreaders, etc
|
||||||
"""
|
"""
|
||||||
# Code borrowed from: https://stackoverflow.com/a/29075319
|
# Code borrowed from: https://stackoverflow.com/a/29075319
|
||||||
kernel32 = ctypes.WinDLL('kernel32')
|
kernel32 = ctypes.WinDLL('kernel32')
|
||||||
|
|
@ -837,6 +804,7 @@ def set_thread_error_mode(silent=True):
|
||||||
else:
|
else:
|
||||||
kernel32.SetThreadErrorMode(SEM_NORMAL, ctypes.byref(SEM_NORMAL))
|
kernel32.SetThreadErrorMode(SEM_NORMAL, ctypes.byref(SEM_NORMAL))
|
||||||
|
|
||||||
|
|
||||||
def transfer_source(source_obj, dest_path, selected_items):
|
def transfer_source(source_obj, dest_path, selected_items):
|
||||||
"""Transfer, or extract, files/folders from source to destination."""
|
"""Transfer, or extract, files/folders from source to destination."""
|
||||||
if source_obj.is_dir():
|
if source_obj.is_dir():
|
||||||
|
|
@ -859,11 +827,13 @@ def transfer_source(source_obj, dest_path, selected_items):
|
||||||
print_error('ERROR: Unsupported image: {}'.format(source_obj.path))
|
print_error('ERROR: Unsupported image: {}'.format(source_obj.path))
|
||||||
raise GenericError
|
raise GenericError
|
||||||
|
|
||||||
|
|
||||||
def umount_backup_shares():
|
def umount_backup_shares():
|
||||||
"""Unmount the backup shares regardless of current status."""
|
"""Unmount the backup shares regardless of current status."""
|
||||||
for server in BACKUP_SERVERS:
|
for server in BACKUP_SERVERS:
|
||||||
umount_network_share(server)
|
umount_network_share(server)
|
||||||
|
|
||||||
|
|
||||||
def umount_network_share(server):
|
def umount_network_share(server):
|
||||||
"""Unmount a network share defined by server."""
|
"""Unmount a network share defined by server."""
|
||||||
cmd = r'net use \\{IP}\{Share} /delete'.format(**server)
|
cmd = r'net use \\{IP}\{Share} /delete'.format(**server)
|
||||||
|
|
@ -877,5 +847,8 @@ def umount_network_share(server):
|
||||||
print_info('Umounted {Name}'.format(**server))
|
print_info('Umounted {Name}'.format(**server))
|
||||||
server['Mounted'] = False
|
server['Mounted'] = False
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,114 +0,0 @@
|
||||||
# Wizard Kit: Functions - Diagnostics
|
|
||||||
|
|
||||||
from functions.common import *
|
|
||||||
|
|
||||||
# STATIC VARIABLES
|
|
||||||
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,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
else:
|
|
||||||
if not ask('ERROR: System appears offline, try again?'):
|
|
||||||
if ask('Continue anyway?'):
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
abort()
|
|
||||||
|
|
||||||
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_xmplay():
|
|
||||||
"""Run XMPlay to test audio."""
|
|
||||||
extract_item('XMPlay', silent=True)
|
|
||||||
cmd = [global_vars['Tools']['XMPlay'],
|
|
||||||
r'{BinDir}\XMPlay\music.7z'.format(**global_vars)]
|
|
||||||
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}\hitman.xml'.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'],
|
|
||||||
'-l', r'{LogDir}\RKill.log'.format(**global_vars),
|
|
||||||
'-new_console:n', '-new_console:s33V']
|
|
||||||
run_program(cmd, check=False)
|
|
||||||
wait_for_process('RKill')
|
|
||||||
kill_process('notepad.exe')
|
|
||||||
|
|
||||||
# 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 = re.sub(r'^(.*)\.', '\1_{Date-Time}.'.format(
|
|
||||||
**global_vars), item.name)
|
|
||||||
dest = r'{ClientDir}\Info\{name}'.format(
|
|
||||||
name=dest, **global_vars)
|
|
||||||
dest = non_clobber_rename(dest)
|
|
||||||
shutil.move(item.path, dest)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
print("This file is not meant to be called directly.")
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
# Wizard Kit: Functions - Disk
|
# Wizard Kit: Functions - Disk
|
||||||
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
from functions import partition_uids
|
from settings.partition_uids import *
|
||||||
|
|
||||||
|
|
||||||
# Regex
|
# Regex
|
||||||
REGEX_BAD_PARTITION = re.compile(r'(RAW|Unknown)', re.IGNORECASE)
|
REGEX_BAD_PARTITION = re.compile(r'(RAW|Unknown)', re.IGNORECASE)
|
||||||
|
|
@ -11,6 +12,7 @@ REGEX_DISK_GPT = re.compile(
|
||||||
REGEX_DISK_MBR = re.compile(r'Disk ID: [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)
|
REGEX_DISK_RAW = re.compile(r'Disk ID: 00000000', re.IGNORECASE)
|
||||||
|
|
||||||
|
|
||||||
def assign_volume_letters():
|
def assign_volume_letters():
|
||||||
"""Assign a volume letter to all available volumes."""
|
"""Assign a volume letter to all available volumes."""
|
||||||
remove_volume_letters()
|
remove_volume_letters()
|
||||||
|
|
@ -24,6 +26,7 @@ def assign_volume_letters():
|
||||||
# Run
|
# Run
|
||||||
run_diskpart(script)
|
run_diskpart(script)
|
||||||
|
|
||||||
|
|
||||||
def get_boot_mode():
|
def get_boot_mode():
|
||||||
"""Check if the boot mode was UEFI or legacy."""
|
"""Check if the boot mode was UEFI or legacy."""
|
||||||
boot_mode = 'Legacy'
|
boot_mode = 'Legacy'
|
||||||
|
|
@ -38,6 +41,7 @@ def get_boot_mode():
|
||||||
|
|
||||||
return boot_mode
|
return boot_mode
|
||||||
|
|
||||||
|
|
||||||
def get_disk_details(disk):
|
def get_disk_details(disk):
|
||||||
"""Get disk details using DiskPart."""
|
"""Get disk details using DiskPart."""
|
||||||
details = {}
|
details = {}
|
||||||
|
|
@ -63,6 +67,7 @@ def get_disk_details(disk):
|
||||||
|
|
||||||
return details
|
return details
|
||||||
|
|
||||||
|
|
||||||
def get_disks():
|
def get_disks():
|
||||||
"""Get list of attached disks using DiskPart."""
|
"""Get list of attached disks using DiskPart."""
|
||||||
disks = []
|
disks = []
|
||||||
|
|
@ -82,6 +87,7 @@ def get_disks():
|
||||||
|
|
||||||
return disks
|
return disks
|
||||||
|
|
||||||
|
|
||||||
def get_partition_details(disk, partition):
|
def get_partition_details(disk, partition):
|
||||||
"""Get partition details using DiskPart and fsutil."""
|
"""Get partition details using DiskPart and fsutil."""
|
||||||
details = {}
|
details = {}
|
||||||
|
|
@ -113,7 +119,7 @@ def get_partition_details(disk, partition):
|
||||||
details.update({key.strip(): value.strip() for (key, value) in tmp})
|
details.update({key.strip(): value.strip() for (key, value) in tmp})
|
||||||
|
|
||||||
# Get MBR type / GPT GUID for extra details on "Unknown" partitions
|
# Get MBR type / GPT GUID for extra details on "Unknown" partitions
|
||||||
guid = partition_uids.lookup_guid(details.get('Type'))
|
guid = PARTITION_UIDS.get(details.get('Type').upper(), {})
|
||||||
if guid:
|
if guid:
|
||||||
details.update({
|
details.update({
|
||||||
'Description': guid.get('Description', '')[:29],
|
'Description': guid.get('Description', '')[:29],
|
||||||
|
|
@ -161,6 +167,7 @@ def get_partition_details(disk, partition):
|
||||||
|
|
||||||
return details
|
return details
|
||||||
|
|
||||||
|
|
||||||
def get_partitions(disk):
|
def get_partitions(disk):
|
||||||
"""Get list of partition using DiskPart."""
|
"""Get list of partition using DiskPart."""
|
||||||
partitions = []
|
partitions = []
|
||||||
|
|
@ -184,6 +191,7 @@ def get_partitions(disk):
|
||||||
|
|
||||||
return partitions
|
return partitions
|
||||||
|
|
||||||
|
|
||||||
def get_table_type(disk):
|
def get_table_type(disk):
|
||||||
"""Get disk partition table type using DiskPart."""
|
"""Get disk partition table type using DiskPart."""
|
||||||
part_type = 'Unknown'
|
part_type = 'Unknown'
|
||||||
|
|
@ -206,6 +214,7 @@ def get_table_type(disk):
|
||||||
|
|
||||||
return part_type
|
return part_type
|
||||||
|
|
||||||
|
|
||||||
def get_volumes():
|
def get_volumes():
|
||||||
"""Get list of volumes using DiskPart."""
|
"""Get list of volumes using DiskPart."""
|
||||||
vols = []
|
vols = []
|
||||||
|
|
@ -221,10 +230,12 @@ def get_volumes():
|
||||||
|
|
||||||
return vols
|
return vols
|
||||||
|
|
||||||
|
|
||||||
def is_bad_partition(par):
|
def is_bad_partition(par):
|
||||||
"""Check if the partition is accessible."""
|
"""Check if the partition is accessible."""
|
||||||
return 'Letter' not in par or REGEX_BAD_PARTITION.search(par['FileSystem'])
|
return 'Letter' not in par or REGEX_BAD_PARTITION.search(par['FileSystem'])
|
||||||
|
|
||||||
|
|
||||||
def prep_disk_for_formatting(disk=None):
|
def prep_disk_for_formatting(disk=None):
|
||||||
"""Gather details about the disk and its partitions."""
|
"""Gather details about the disk and its partitions."""
|
||||||
disk['Format Warnings'] = '\n'
|
disk['Format Warnings'] = '\n'
|
||||||
|
|
@ -270,6 +281,7 @@ def prep_disk_for_formatting(disk=None):
|
||||||
# For all partitions
|
# For all partitions
|
||||||
partition['Display String'] = display
|
partition['Display String'] = display
|
||||||
|
|
||||||
|
|
||||||
def reassign_volume_letter(letter, new_letter='I'):
|
def reassign_volume_letter(letter, new_letter='I'):
|
||||||
"""Assign a new letter to a volume using DiskPart."""
|
"""Assign a new letter to a volume using DiskPart."""
|
||||||
if not letter:
|
if not letter:
|
||||||
|
|
@ -286,6 +298,7 @@ def reassign_volume_letter(letter, new_letter='I'):
|
||||||
else:
|
else:
|
||||||
return new_letter
|
return new_letter
|
||||||
|
|
||||||
|
|
||||||
def remove_volume_letters(keep=None):
|
def remove_volume_letters(keep=None):
|
||||||
"""Remove all assigned volume letters using DiskPart."""
|
"""Remove all assigned volume letters using DiskPart."""
|
||||||
if not keep:
|
if not keep:
|
||||||
|
|
@ -303,6 +316,7 @@ def remove_volume_letters(keep=None):
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def run_diskpart(script):
|
def run_diskpart(script):
|
||||||
"""Run DiskPart script."""
|
"""Run DiskPart script."""
|
||||||
tempfile = r'{}\diskpart.script'.format(global_vars['Env']['TMP'])
|
tempfile = r'{}\diskpart.script'.format(global_vars['Env']['TMP'])
|
||||||
|
|
@ -321,6 +335,7 @@ def run_diskpart(script):
|
||||||
sleep(2)
|
sleep(2)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def scan_disks():
|
def scan_disks():
|
||||||
"""Get details about the attached disks"""
|
"""Get details about the attached disks"""
|
||||||
disks = get_disks()
|
disks = get_disks()
|
||||||
|
|
@ -343,6 +358,7 @@ def scan_disks():
|
||||||
# Done
|
# Done
|
||||||
return disks
|
return disks
|
||||||
|
|
||||||
|
|
||||||
def select_disk(title='Which disk?', disks=[]):
|
def select_disk(title='Which disk?', disks=[]):
|
||||||
"""Select a disk from the attached disks"""
|
"""Select a disk from the attached disks"""
|
||||||
# Build menu
|
# Build menu
|
||||||
|
|
@ -391,5 +407,8 @@ def select_disk(title='Which disk?', disks=[]):
|
||||||
elif (selection == 'M'):
|
elif (selection == 'M'):
|
||||||
raise GenericAbort
|
raise GenericAbort
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,59 +1,10 @@
|
||||||
# Wizard Kit: Functions - Information
|
# Wizard Kit: Functions - Information
|
||||||
|
|
||||||
from borrowed import knownpaths
|
from borrowed import knownpaths
|
||||||
from operator import itemgetter
|
|
||||||
|
|
||||||
from functions.common import *
|
|
||||||
from functions.activation import *
|
from functions.activation import *
|
||||||
|
from operator import itemgetter
|
||||||
|
from settings.info import *
|
||||||
|
|
||||||
# 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)
|
|
||||||
|
|
||||||
# STATIC VARIABLES
|
|
||||||
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}',
|
|
||||||
),
|
|
||||||
}
|
|
||||||
|
|
||||||
def backup_file_list():
|
def backup_file_list():
|
||||||
"""Export current file listing for the system."""
|
"""Export current file listing for the system."""
|
||||||
|
|
@ -66,9 +17,11 @@ def backup_file_list():
|
||||||
global_vars['Env']['SYSTEMDRIVE']]
|
global_vars['Env']['SYSTEMDRIVE']]
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def backup_power_plans():
|
def backup_power_plans():
|
||||||
"""Export current power plans."""
|
"""Export current power plans."""
|
||||||
os.makedirs(r'{BackupDir}\Power Plans'.format(**global_vars), exist_ok=True)
|
os.makedirs(r'{BackupDir}\Power Plans\{Date}'.format(
|
||||||
|
**global_vars), exist_ok=True)
|
||||||
plans = run_program(['powercfg', '/L'])
|
plans = run_program(['powercfg', '/L'])
|
||||||
plans = plans.stdout.decode().splitlines()
|
plans = plans.stdout.decode().splitlines()
|
||||||
plans = [p for p in plans if re.search(r'^Power Scheme', p)]
|
plans = [p for p in plans if re.search(r'^Power Scheme', p)]
|
||||||
|
|
@ -76,24 +29,28 @@ def backup_power_plans():
|
||||||
guid = re.sub(r'Power Scheme GUID:\s+([0-9a-f\-]+).*', r'\1', p)
|
guid = re.sub(r'Power Scheme GUID:\s+([0-9a-f\-]+).*', r'\1', p)
|
||||||
name = re.sub(
|
name = re.sub(
|
||||||
r'Power Scheme GUID:\s+[0-9a-f\-]+\s+\(([^\)]+)\).*', r'\1', p)
|
r'Power Scheme GUID:\s+[0-9a-f\-]+\s+\(([^\)]+)\).*', r'\1', p)
|
||||||
out = r'{BackupDir}\Power Plans\{name}.pow'.format(
|
out = r'{BackupDir}\Power Plans\{Date}\{name}.pow'.format(
|
||||||
name=name, **global_vars)
|
name=name, **global_vars)
|
||||||
if not os.path.exists(out):
|
if not os.path.exists(out):
|
||||||
cmd = ['powercfg', '-export', out, guid]
|
cmd = ['powercfg', '-export', out, guid]
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
def backup_registry():
|
|
||||||
|
def backup_registry(overwrite=False):
|
||||||
"""Backup registry including user hives."""
|
"""Backup registry including user hives."""
|
||||||
extract_item('erunt', silent=True)
|
extract_item('erunt', silent=True)
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['ERUNT'],
|
global_vars['Tools']['ERUNT'],
|
||||||
r'{BackupDir}\Registry'.format(**global_vars),
|
r'{BackupDir}\Registry\{Date}'.format(**global_vars),
|
||||||
'sysreg',
|
'sysreg',
|
||||||
'curuser',
|
'curuser',
|
||||||
'otherusers',
|
'otherusers',
|
||||||
'/noprogresswindow']
|
'/noprogresswindow']
|
||||||
|
if overwrite:
|
||||||
|
cmd.append('/noconfirmdelete')
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def get_folder_size(path):
|
def get_folder_size(path):
|
||||||
"""Get (human-readable) size of folder passed, returns str."""
|
"""Get (human-readable) size of folder passed, returns str."""
|
||||||
size = 'Unknown'
|
size = 'Unknown'
|
||||||
|
|
@ -116,6 +73,7 @@ def get_folder_size(path):
|
||||||
size = human_readable_size(size)
|
size = human_readable_size(size)
|
||||||
return size
|
return size
|
||||||
|
|
||||||
|
|
||||||
def get_installed_antivirus():
|
def get_installed_antivirus():
|
||||||
"""Get list of installed Antivirus programs."""
|
"""Get list of installed Antivirus programs."""
|
||||||
programs = []
|
programs = []
|
||||||
|
|
@ -137,7 +95,7 @@ def get_installed_antivirus():
|
||||||
out = out.stdout.decode().strip()
|
out = out.stdout.decode().strip()
|
||||||
state = out.split('=')[1]
|
state = out.split('=')[1]
|
||||||
state = hex(int(state))
|
state = hex(int(state))
|
||||||
if str(state)[3:5] != '10':
|
if str(state)[3:5] not in ['10', '11']:
|
||||||
programs.append('[Disabled] {}'.format(prod))
|
programs.append('[Disabled] {}'.format(prod))
|
||||||
else:
|
else:
|
||||||
programs.append(prod)
|
programs.append(prod)
|
||||||
|
|
@ -146,6 +104,7 @@ def get_installed_antivirus():
|
||||||
programs = ['No programs found']
|
programs = ['No programs found']
|
||||||
return programs
|
return programs
|
||||||
|
|
||||||
|
|
||||||
def get_installed_office():
|
def get_installed_office():
|
||||||
"""Get list of installed Office programs."""
|
"""Get list of installed Office programs."""
|
||||||
programs = []
|
programs = []
|
||||||
|
|
@ -160,8 +119,9 @@ def get_installed_office():
|
||||||
programs = ['No programs found']
|
programs = ['No programs found']
|
||||||
return programs
|
return programs
|
||||||
|
|
||||||
|
|
||||||
def get_shell_path(folder, user='current'):
|
def get_shell_path(folder, user='current'):
|
||||||
"""Get shell path using SHGetKnownFolderPath via knownpaths, returns str.
|
"""Get shell path using knownpaths, returns str.
|
||||||
|
|
||||||
NOTE: Only works for the current user.
|
NOTE: Only works for the current user.
|
||||||
Code based on https://gist.github.com/mkropat/7550097
|
Code based on https://gist.github.com/mkropat/7550097
|
||||||
|
|
@ -178,13 +138,15 @@ def get_shell_path(folder, user='current'):
|
||||||
|
|
||||||
if folderid:
|
if folderid:
|
||||||
try:
|
try:
|
||||||
path = knownpaths.get_path(folderid, getattr(knownpaths.UserHandle, user))
|
path = knownpaths.get_path(
|
||||||
|
folderid, getattr(knownpaths.UserHandle, user))
|
||||||
except PathNotFoundError:
|
except PathNotFoundError:
|
||||||
# Folder not found, ignore and return None
|
# Folder not found, ignore and return None
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
||||||
def get_user_data_paths(user):
|
def get_user_data_paths(user):
|
||||||
"""Get user data paths for provided user, returns dict."""
|
"""Get user data paths for provided user, returns dict."""
|
||||||
hive_path = user['SID']
|
hive_path = user['SID']
|
||||||
|
|
@ -269,6 +231,7 @@ def get_user_data_paths(user):
|
||||||
# Done
|
# Done
|
||||||
return paths
|
return paths
|
||||||
|
|
||||||
|
|
||||||
def get_user_folder_sizes(users):
|
def get_user_folder_sizes(users):
|
||||||
"""Update list(users) to include folder paths and sizes."""
|
"""Update list(users) to include folder paths and sizes."""
|
||||||
extract_item('du', filter='du*', silent=True)
|
extract_item('du', filter='du*', silent=True)
|
||||||
|
|
@ -289,6 +252,7 @@ def get_user_folder_sizes(users):
|
||||||
u['Extra Folders'][folder]['Size'] = get_folder_size(
|
u['Extra Folders'][folder]['Size'] = get_folder_size(
|
||||||
u['Extra Folders'][folder]['Path'])
|
u['Extra Folders'][folder]['Path'])
|
||||||
|
|
||||||
|
|
||||||
def get_user_list():
|
def get_user_list():
|
||||||
"""Get user list via WMIC, returns list of dicts."""
|
"""Get user list via WMIC, returns list of dicts."""
|
||||||
users = []
|
users = []
|
||||||
|
|
@ -321,6 +285,7 @@ def get_user_list():
|
||||||
# Done
|
# Done
|
||||||
return users
|
return users
|
||||||
|
|
||||||
|
|
||||||
def reg_path_exists(hive, path):
|
def reg_path_exists(hive, path):
|
||||||
"""Test if specified path exists, returns bool."""
|
"""Test if specified path exists, returns bool."""
|
||||||
try:
|
try:
|
||||||
|
|
@ -330,6 +295,7 @@ def reg_path_exists(hive, path):
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def run_aida64():
|
def run_aida64():
|
||||||
"""Run AIDA64 to save system reports."""
|
"""Run AIDA64 to save system reports."""
|
||||||
extract_item('AIDA64', silent=True)
|
extract_item('AIDA64', silent=True)
|
||||||
|
|
@ -368,26 +334,40 @@ def run_aida64():
|
||||||
'/TEXT', '/SILENT', '/SAFEST']
|
'/TEXT', '/SILENT', '/SAFEST']
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
def run_bleachbit():
|
|
||||||
|
def run_bleachbit(cleaners=None, preview=True):
|
||||||
"""Run BleachBit preview and save log.
|
"""Run BleachBit preview and save log.
|
||||||
|
|
||||||
This is a preview so no files should be deleted."""
|
If preview is True then no files should be deleted."""
|
||||||
if not os.path.exists(global_vars['LogDir']+r'\BleachBit.log'):
|
error_path = r'{}\Tools\BleachBit.err'.format(global_vars['LogDir'])
|
||||||
|
log_path = error_path.replace('err', 'log')
|
||||||
extract_item('BleachBit', silent=True)
|
extract_item('BleachBit', silent=True)
|
||||||
cmd = [global_vars['Tools']['BleachBit'], '--preview', '--preset']
|
|
||||||
|
# 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)
|
out = run_program(cmd, check=False)
|
||||||
|
|
||||||
# Save stderr
|
# Save stderr
|
||||||
if out.stderr.decode().splitlines():
|
if out.stderr.decode().splitlines():
|
||||||
with open(global_vars['LogDir']+r'\BleachBit.err', 'a',
|
with open(error_path, 'a', encoding='utf-8') as f:
|
||||||
encoding='utf-8') as f:
|
|
||||||
for line in out.stderr.decode().splitlines():
|
for line in out.stderr.decode().splitlines():
|
||||||
f.write(line.strip() + '\n')
|
f.write(line.strip() + '\n')
|
||||||
|
|
||||||
# Save stdout
|
# Save stdout
|
||||||
with open(global_vars['LogDir']+r'\BleachBit.log', 'a',
|
with open(log_path, 'a', encoding='utf-8') as f:
|
||||||
encoding='utf-8') as f:
|
|
||||||
for line in out.stdout.decode().splitlines():
|
for line in out.stdout.decode().splitlines():
|
||||||
f.write(line.strip() + '\n')
|
f.write(line.strip() + '\n')
|
||||||
|
|
||||||
|
|
||||||
def show_disk_usage(disk):
|
def show_disk_usage(disk):
|
||||||
"""Show free and used space for a specified disk."""
|
"""Show free and used space for a specified disk."""
|
||||||
print_standard('{:5}'.format(disk.device.replace('/', ' ')),
|
print_standard('{:5}'.format(disk.device.replace('/', ' ')),
|
||||||
|
|
@ -407,6 +387,7 @@ def show_disk_usage(disk):
|
||||||
except Exception:
|
except Exception:
|
||||||
print_warning('Unknown', timestamp=False)
|
print_warning('Unknown', timestamp=False)
|
||||||
|
|
||||||
|
|
||||||
def show_free_space(indent=8, width=32):
|
def show_free_space(indent=8, width=32):
|
||||||
"""Show free space info for all fixed disks."""
|
"""Show free space info for all fixed disks."""
|
||||||
message = 'Free Space:'
|
message = 'Free Space:'
|
||||||
|
|
@ -420,6 +401,7 @@ def show_free_space(indent=8, width=32):
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def show_installed_ram():
|
def show_installed_ram():
|
||||||
"""Show installed RAM."""
|
"""Show installed RAM."""
|
||||||
mem = psutil.virtual_memory()
|
mem = psutil.virtual_memory()
|
||||||
|
|
@ -432,6 +414,7 @@ def show_installed_ram():
|
||||||
else:
|
else:
|
||||||
print_error(human_readable_size(mem.total).strip(), timestamp=False)
|
print_error(human_readable_size(mem.total).strip(), timestamp=False)
|
||||||
|
|
||||||
|
|
||||||
def show_os_activation():
|
def show_os_activation():
|
||||||
"""Show OS activation info."""
|
"""Show OS activation info."""
|
||||||
act_str = get_activation_string()
|
act_str = get_activation_string()
|
||||||
|
|
@ -442,6 +425,7 @@ def show_os_activation():
|
||||||
else:
|
else:
|
||||||
print_error(act_str, timestamp=False)
|
print_error(act_str, timestamp=False)
|
||||||
|
|
||||||
|
|
||||||
def show_os_name():
|
def show_os_name():
|
||||||
"""Show extended OS name (including warnings)."""
|
"""Show extended OS name (including warnings)."""
|
||||||
os_name = global_vars['OS']['DisplayName']
|
os_name = global_vars['OS']['DisplayName']
|
||||||
|
|
@ -449,25 +433,33 @@ def show_os_name():
|
||||||
# Show all 32-bit installs as an error message
|
# Show all 32-bit installs as an error message
|
||||||
print_error(os_name, timestamp=False)
|
print_error(os_name, timestamp=False)
|
||||||
else:
|
else:
|
||||||
if re.search(r'(preview build|unrecognized|unsupported)', os_name, re.IGNORECASE):
|
if re.search(
|
||||||
|
r'(preview build|unrecognized|unsupported)',
|
||||||
|
os_name,
|
||||||
|
re.IGNORECASE):
|
||||||
print_error(os_name, timestamp=False)
|
print_error(os_name, timestamp=False)
|
||||||
elif re.search(r'outdated', os_name, re.IGNORECASE):
|
elif re.search(r'outdated', os_name, re.IGNORECASE):
|
||||||
print_warning(os_name, timestamp=False)
|
print_warning(os_name, timestamp=False)
|
||||||
else:
|
else:
|
||||||
print_standard(os_name, timestamp=False)
|
print_standard(os_name, timestamp=False)
|
||||||
|
|
||||||
|
|
||||||
def show_temp_files_size():
|
def show_temp_files_size():
|
||||||
"""Show total size of temp files identified by BleachBit."""
|
"""Show total size of temp files identified by BleachBit."""
|
||||||
size = None
|
size_str = None
|
||||||
with open(r'{LogDir}\BleachBit.log'.format(**global_vars), 'r') as f:
|
total = 0
|
||||||
|
with open(r'{LogDir}\Tools\BleachBit.log'.format(**global_vars), 'r') as f:
|
||||||
for line in f.readlines():
|
for line in f.readlines():
|
||||||
if re.search(r'^disk space to be recovered:', line, re.IGNORECASE):
|
if re.search(r'^Disk space (to be |)recovered:', line, re.IGNORECASE):
|
||||||
size = re.sub(r'.*: ', '', line.strip())
|
size = re.sub(r'.*: ', '', line.strip())
|
||||||
size = re.sub(r'(\w)iB$', r' \1b', size)
|
size = re.sub(r'(\w)iB$', r' \1b', size)
|
||||||
if size is None:
|
total += convert_to_bytes(size)
|
||||||
print_warning(size, timestamp=False)
|
size_str = human_readable_size(total, decimals=1)
|
||||||
|
if size_str is None:
|
||||||
|
print_warning('UNKNOWN', timestamp=False)
|
||||||
else:
|
else:
|
||||||
print_standard(size, timestamp=False)
|
print_standard(size_str, timestamp=False)
|
||||||
|
|
||||||
|
|
||||||
def show_user_data_summary(indent=8, width=32):
|
def show_user_data_summary(indent=8, width=32):
|
||||||
"""Print user data folder sizes for all users."""
|
"""Print user data folder sizes for all users."""
|
||||||
|
|
@ -501,5 +493,8 @@ def show_user_data_summary(indent=8, width=32):
|
||||||
size = folders[folder].get('Size', 'Unknown'),
|
size = folders[folder].get('Size', 'Unknown'),
|
||||||
path = folders[folder].get('Path', 'Unknown')))
|
path = folders[folder].get('Path', 'Unknown')))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
32
.bin/Scripts/functions/json.py
Normal file
32
.bin/Scripts/functions/json.py
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
# 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
|
||||||
|
|
@ -1,16 +1,12 @@
|
||||||
#!/bin/python3
|
# Wizard Kit: Functions - Network
|
||||||
#
|
|
||||||
## Wizard Kit: Functions - Network
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
|
|
||||||
|
|
||||||
# REGEX
|
# REGEX
|
||||||
REGEX_VALID_IP = re.compile(
|
REGEX_VALID_IP = re.compile(
|
||||||
r'(10.\d+.\d+.\d+'
|
r'(10.\d+.\d+.\d+'
|
||||||
|
|
@ -18,25 +14,6 @@ REGEX_VALID_IP = re.compile(
|
||||||
r'|192.168.\d+.\d+)',
|
r'|192.168.\d+.\d+)',
|
||||||
re.IGNORECASE)
|
re.IGNORECASE)
|
||||||
|
|
||||||
def connect_to_network():
|
|
||||||
"""Connect to network if not already connected."""
|
|
||||||
net_ifs = psutil.net_if_addrs()
|
|
||||||
net_ifs = [i[:2] for i in net_ifs.keys()]
|
|
||||||
|
|
||||||
# Bail if currently connected
|
|
||||||
if is_connected():
|
|
||||||
return
|
|
||||||
|
|
||||||
# WiFi
|
|
||||||
if 'wl' in net_ifs:
|
|
||||||
cmd = [
|
|
||||||
'nmcli', 'dev', 'wifi',
|
|
||||||
'connect', WIFI_SSID,
|
|
||||||
'password', WIFI_PASSWORD]
|
|
||||||
try_and_print(
|
|
||||||
message = 'Connecting to {}...'.format(WIFI_SSID),
|
|
||||||
function = run_program,
|
|
||||||
cmd = cmd)
|
|
||||||
|
|
||||||
def is_connected():
|
def is_connected():
|
||||||
"""Check for a valid private IP."""
|
"""Check for a valid private IP."""
|
||||||
|
|
@ -49,6 +26,7 @@ def is_connected():
|
||||||
# Else
|
# Else
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def show_valid_addresses():
|
def show_valid_addresses():
|
||||||
"""Show all valid private IP addresses assigned to the system."""
|
"""Show all valid private IP addresses assigned to the system."""
|
||||||
devs = psutil.net_if_addrs()
|
devs = psutil.net_if_addrs()
|
||||||
|
|
@ -58,6 +36,7 @@ def show_valid_addresses():
|
||||||
# Valid IP found
|
# Valid IP found
|
||||||
show_data(message=dev, data=family.address)
|
show_data(message=dev, data=family.address)
|
||||||
|
|
||||||
|
|
||||||
def speedtest():
|
def speedtest():
|
||||||
"""Run a network speedtest using speedtest-cli."""
|
"""Run a network speedtest using speedtest-cli."""
|
||||||
result = run_program(['speedtest-cli', '--simple'])
|
result = run_program(['speedtest-cli', '--simple'])
|
||||||
|
|
@ -67,6 +46,8 @@ def speedtest():
|
||||||
output = [(a, float(b), c) for a, b, c in output]
|
output = [(a, float(b), c) for a, b, c in output]
|
||||||
return ['{:10}{:6.2f} {}'.format(*line) for line in output]
|
return ['{:10}{:6.2f} {}'.format(*line) for line in output]
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -1,326 +0,0 @@
|
||||||
# Wizard Kit: Functions - 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)'},
|
|
||||||
}
|
|
||||||
|
|
||||||
def lookup_guid(guid):
|
|
||||||
return PARTITION_UIDS.get(guid.upper(), {})
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
print("This file is not meant to be called directly.")
|
|
||||||
|
|
@ -2,12 +2,14 @@
|
||||||
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
|
|
||||||
|
|
||||||
# Regex
|
# Regex
|
||||||
REGEX_REGISTRY_DIRS = re.compile(
|
REGEX_REGISTRY_DIRS = re.compile(
|
||||||
r'^(config$|RegBack$|System32$|Transfer|Win)',
|
r'^(config$|RegBack$|System32$|Transfer|Win)',
|
||||||
re.IGNORECASE)
|
re.IGNORECASE)
|
||||||
REGEX_SOFTWARE_HIVE = re.compile(r'^Software$', re.IGNORECASE)
|
REGEX_SOFTWARE_HIVE = re.compile(r'^Software$', re.IGNORECASE)
|
||||||
|
|
||||||
|
|
||||||
def extract_keys():
|
def extract_keys():
|
||||||
"""Extract keys from provided hives and return a dict."""
|
"""Extract keys from provided hives and return a dict."""
|
||||||
keys = {}
|
keys = {}
|
||||||
|
|
@ -43,6 +45,7 @@ def extract_keys():
|
||||||
# Done
|
# Done
|
||||||
return keys
|
return keys
|
||||||
|
|
||||||
|
|
||||||
def list_clientdir_keys():
|
def list_clientdir_keys():
|
||||||
"""List product keys found in hives inside the ClientDir."""
|
"""List product keys found in hives inside the ClientDir."""
|
||||||
keys = extract_keys()
|
keys = extract_keys()
|
||||||
|
|
@ -57,6 +60,7 @@ def list_clientdir_keys():
|
||||||
|
|
||||||
return key_list
|
return key_list
|
||||||
|
|
||||||
|
|
||||||
def find_software_hives():
|
def find_software_hives():
|
||||||
"""Search for transferred SW hives and return a list."""
|
"""Search for transferred SW hives and return a list."""
|
||||||
hives = []
|
hives = []
|
||||||
|
|
@ -71,6 +75,7 @@ def find_software_hives():
|
||||||
|
|
||||||
return hives
|
return hives
|
||||||
|
|
||||||
|
|
||||||
def get_product_keys():
|
def get_product_keys():
|
||||||
"""List product keys from saved report."""
|
"""List product keys from saved report."""
|
||||||
keys = []
|
keys = []
|
||||||
|
|
@ -86,6 +91,7 @@ def get_product_keys():
|
||||||
else:
|
else:
|
||||||
return ['No product keys found']
|
return ['No product keys found']
|
||||||
|
|
||||||
|
|
||||||
def run_produkey():
|
def run_produkey():
|
||||||
"""Run ProduKey and save report in the ClientDir."""
|
"""Run ProduKey and save report in the ClientDir."""
|
||||||
extract_item('ProduKey', silent=True)
|
extract_item('ProduKey', silent=True)
|
||||||
|
|
@ -107,5 +113,8 @@ def run_produkey():
|
||||||
log_file]
|
log_file]
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
|
|
||||||
|
|
||||||
def run_chkdsk(repair=False):
|
def run_chkdsk(repair=False):
|
||||||
"""Run CHKDSK scan or schedule offline repairs."""
|
"""Run CHKDSK scan or schedule offline repairs."""
|
||||||
if repair:
|
if repair:
|
||||||
|
|
@ -9,6 +10,7 @@ def run_chkdsk(repair=False):
|
||||||
else:
|
else:
|
||||||
run_chkdsk_scan()
|
run_chkdsk_scan()
|
||||||
|
|
||||||
|
|
||||||
def run_chkdsk_scan():
|
def run_chkdsk_scan():
|
||||||
"""Run CHKDSK in a "split window" and report errors."""
|
"""Run CHKDSK in a "split window" and report errors."""
|
||||||
if global_vars['OS']['Version'] in ('8', '8.1', '10'):
|
if global_vars['OS']['Version'] in ('8', '8.1', '10'):
|
||||||
|
|
@ -24,14 +26,15 @@ def run_chkdsk_scan():
|
||||||
raise GenericError
|
raise GenericError
|
||||||
|
|
||||||
# Save stderr
|
# Save stderr
|
||||||
with open(r'{LogDir}\CHKDSK.err'.format(**global_vars), 'a') as f:
|
with open(r'{LogDir}\Tools\CHKDSK.err'.format(**global_vars), 'a') as f:
|
||||||
for line in out.stderr.decode().splitlines():
|
for line in out.stderr.decode().splitlines():
|
||||||
f.write(line.strip() + '\n')
|
f.write(line.strip() + '\n')
|
||||||
# Save stdout
|
# Save stdout
|
||||||
with open(r'{LogDir}\CHKDSK.log'.format(**global_vars), 'a') as f:
|
with open(r'{LogDir}\Tools\CHKDSK.log'.format(**global_vars), 'a') as f:
|
||||||
for line in out.stdout.decode().splitlines():
|
for line in out.stdout.decode().splitlines():
|
||||||
f.write(line.strip() + '\n')
|
f.write(line.strip() + '\n')
|
||||||
|
|
||||||
|
|
||||||
def run_chkdsk_offline():
|
def run_chkdsk_offline():
|
||||||
"""Set filesystem 'dirty bit' to force a chkdsk during next boot."""
|
"""Set filesystem 'dirty bit' to force a chkdsk during next boot."""
|
||||||
cmd = [
|
cmd = [
|
||||||
|
|
@ -42,15 +45,16 @@ def run_chkdsk_offline():
|
||||||
if int(out.returncode) > 0:
|
if int(out.returncode) > 0:
|
||||||
raise GenericError
|
raise GenericError
|
||||||
|
|
||||||
|
|
||||||
def run_dism(repair=False):
|
def run_dism(repair=False):
|
||||||
"""Run DISM /RestoreHealth, then /CheckHealth, and then report errors."""
|
"""Run DISM to either scan or repair component store health."""
|
||||||
if global_vars['OS']['Version'] in ('8', '8.1', '10'):
|
if global_vars['OS']['Version'] in ('8', '8.1', '10'):
|
||||||
if repair:
|
if repair:
|
||||||
# Restore Health
|
# Restore Health
|
||||||
cmd = [
|
cmd = [
|
||||||
'DISM', '/Online',
|
'DISM', '/Online',
|
||||||
'/Cleanup-Image', '/RestoreHealth',
|
'/Cleanup-Image', '/RestoreHealth',
|
||||||
r'/LogPath:"{LogDir}\DISM_RestoreHealth.log"'.format(
|
r'/LogPath:"{LogDir}\Tools\DISM_RestoreHealth.log"'.format(
|
||||||
**global_vars),
|
**global_vars),
|
||||||
'-new_console:n', '-new_console:s33V']
|
'-new_console:n', '-new_console:s33V']
|
||||||
else:
|
else:
|
||||||
|
|
@ -58,7 +62,7 @@ def run_dism(repair=False):
|
||||||
cmd = [
|
cmd = [
|
||||||
'DISM', '/Online',
|
'DISM', '/Online',
|
||||||
'/Cleanup-Image', '/ScanHealth',
|
'/Cleanup-Image', '/ScanHealth',
|
||||||
r'/LogPath:"{LogDir}\DISM_ScanHealth.log"'.format(
|
r'/LogPath:"{LogDir}\Tools\DISM_ScanHealth.log"'.format(
|
||||||
**global_vars),
|
**global_vars),
|
||||||
'-new_console:n', '-new_console:s33V']
|
'-new_console:n', '-new_console:s33V']
|
||||||
run_program(cmd, pipe=False, check=False, shell=True)
|
run_program(cmd, pipe=False, check=False, shell=True)
|
||||||
|
|
@ -67,7 +71,7 @@ def run_dism(repair=False):
|
||||||
cmd = [
|
cmd = [
|
||||||
'DISM', '/Online',
|
'DISM', '/Online',
|
||||||
'/Cleanup-Image', '/CheckHealth',
|
'/Cleanup-Image', '/CheckHealth',
|
||||||
r'/LogPath:"{LogDir}\DISM_CheckHealth.log"'.format(**global_vars)]
|
r'/LogPath:"{LogDir}\Tools\DISM_CheckHealth.log"'.format(**global_vars)]
|
||||||
result = run_program(cmd, shell=True).stdout.decode()
|
result = run_program(cmd, shell=True).stdout.decode()
|
||||||
# Check result
|
# Check result
|
||||||
if 'no component store corruption detected' not in result.lower():
|
if 'no component store corruption detected' not in result.lower():
|
||||||
|
|
@ -75,6 +79,7 @@ def run_dism(repair=False):
|
||||||
else:
|
else:
|
||||||
raise UnsupportedOSError
|
raise UnsupportedOSError
|
||||||
|
|
||||||
|
|
||||||
def run_kvrt():
|
def run_kvrt():
|
||||||
"""Run KVRT."""
|
"""Run KVRT."""
|
||||||
extract_item('KVRT', silent=True)
|
extract_item('KVRT', silent=True)
|
||||||
|
|
@ -86,6 +91,7 @@ def run_kvrt():
|
||||||
'-processlevel', '3']
|
'-processlevel', '3']
|
||||||
popen_program(cmd, pipe=False)
|
popen_program(cmd, pipe=False)
|
||||||
|
|
||||||
|
|
||||||
def run_sfc_scan():
|
def run_sfc_scan():
|
||||||
"""Run SFC in a "split window" and report errors."""
|
"""Run SFC in a "split window" and report errors."""
|
||||||
cmd = [
|
cmd = [
|
||||||
|
|
@ -93,11 +99,11 @@ def run_sfc_scan():
|
||||||
'/scannow']
|
'/scannow']
|
||||||
out = run_program(cmd, check=False)
|
out = run_program(cmd, check=False)
|
||||||
# Save stderr
|
# Save stderr
|
||||||
with open(r'{LogDir}\SFC.err'.format(**global_vars), 'a') as f:
|
with open(r'{LogDir}\Tools\SFC.err'.format(**global_vars), 'a') as f:
|
||||||
for line in out.stderr.decode('utf-8', 'ignore').splitlines():
|
for line in out.stderr.decode('utf-8', 'ignore').splitlines():
|
||||||
f.write(line.strip() + '\n')
|
f.write(line.strip() + '\n')
|
||||||
# Save stdout
|
# Save stdout
|
||||||
with open(r'{LogDir}\SFC.log'.format(**global_vars), 'a') as f:
|
with open(r'{LogDir}\Tools\SFC.log'.format(**global_vars), 'a') as f:
|
||||||
for line in out.stdout.decode('utf-8', 'ignore').splitlines():
|
for line in out.stdout.decode('utf-8', 'ignore').splitlines():
|
||||||
f.write(line.strip() + '\n')
|
f.write(line.strip() + '\n')
|
||||||
# Check result
|
# Check result
|
||||||
|
|
@ -109,6 +115,7 @@ def run_sfc_scan():
|
||||||
else:
|
else:
|
||||||
raise GenericError
|
raise GenericError
|
||||||
|
|
||||||
|
|
||||||
def run_tdsskiller():
|
def run_tdsskiller():
|
||||||
"""Run TDSSKiller."""
|
"""Run TDSSKiller."""
|
||||||
extract_item('TDSSKiller', silent=True)
|
extract_item('TDSSKiller', silent=True)
|
||||||
|
|
@ -116,11 +123,14 @@ def run_tdsskiller():
|
||||||
**global_vars), exist_ok=True)
|
**global_vars), exist_ok=True)
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['TDSSKiller'],
|
global_vars['Tools']['TDSSKiller'],
|
||||||
'-l', r'{LogDir}\TDSSKiller.log'.format(**global_vars),
|
'-l', r'{LogDir}\Tools\TDSSKiller.log'.format(**global_vars),
|
||||||
'-qpath', r'{QuarantineDir}\TDSSKiller'.format(**global_vars),
|
'-qpath', r'{QuarantineDir}\TDSSKiller'.format(**global_vars),
|
||||||
'-accepteula', '-accepteulaksn',
|
'-accepteula', '-accepteulaksn',
|
||||||
'-dcexact', '-tdlfs']
|
'-dcexact', '-tdlfs']
|
||||||
run_program(cmd, pipe=False)
|
run_program(cmd, pipe=False)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -2,19 +2,23 @@
|
||||||
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
|
|
||||||
|
|
||||||
# STATIC VARIABLES
|
# STATIC VARIABLES
|
||||||
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
||||||
|
|
||||||
|
|
||||||
def disable_safemode_msi():
|
def disable_safemode_msi():
|
||||||
"""Disable MSI access under safemode."""
|
"""Disable MSI access under safemode."""
|
||||||
cmd = ['reg', 'delete', REG_MSISERVER, '/f']
|
cmd = ['reg', 'delete', REG_MSISERVER, '/f']
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def disable_safemode():
|
def disable_safemode():
|
||||||
"""Edit BCD to remove safeboot value."""
|
"""Edit BCD to remove safeboot value."""
|
||||||
cmd = ['bcdedit', '/deletevalue', '{default}', 'safeboot']
|
cmd = ['bcdedit', '/deletevalue', '{default}', 'safeboot']
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def enable_safemode_msi():
|
def enable_safemode_msi():
|
||||||
"""Enable MSI access under safemode."""
|
"""Enable MSI access under safemode."""
|
||||||
cmd = ['reg', 'add', REG_MSISERVER, '/f']
|
cmd = ['reg', 'add', REG_MSISERVER, '/f']
|
||||||
|
|
@ -23,14 +27,19 @@ def enable_safemode_msi():
|
||||||
'/t', 'REG_SZ', '/d', 'Service', '/f']
|
'/t', 'REG_SZ', '/d', 'Service', '/f']
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def enable_safemode():
|
def enable_safemode():
|
||||||
"""Edit BCD to set safeboot as default."""
|
"""Edit BCD to set safeboot as default."""
|
||||||
cmd = ['bcdedit', '/set', '{default}', 'safeboot', 'network']
|
cmd = ['bcdedit', '/set', '{default}', 'safeboot', 'network']
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def reboot(delay=3):
|
def reboot(delay=3):
|
||||||
cmd = ['shutdown', '-r', '-t', '{}'.format(delay)]
|
cmd = ['shutdown', '-r', '-t', '{}'.format(delay)]
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
243
.bin/Scripts/functions/sensors.py
Normal file
243
.bin/Scripts/functions/sensors.py
Normal file
|
|
@ -0,0 +1,243 @@
|
||||||
|
'''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.")
|
||||||
|
|
@ -1,135 +1,13 @@
|
||||||
# Wizard Kit: Functions - Setup
|
# Wizard Kit: Functions - Setup
|
||||||
|
|
||||||
from functions.common import *
|
from functions.browsers import *
|
||||||
|
from functions.json import *
|
||||||
|
from functions.update import *
|
||||||
|
from settings.setup import *
|
||||||
|
from settings.sources import *
|
||||||
|
|
||||||
# STATIC VARIABLES
|
|
||||||
HKCU = winreg.HKEY_CURRENT_USER
|
|
||||||
HKLM = winreg.HKEY_LOCAL_MACHINE
|
|
||||||
MOZILLA_FIREFOX_UBO_PATH = r'{}\{}\ublock_origin.xpi'.format(
|
|
||||||
os.environ.get('PROGRAMFILES'),
|
|
||||||
r'Mozilla Firefox\distribution\extensions')
|
|
||||||
OTHER_RESULTS = {
|
|
||||||
'Error': {
|
|
||||||
'CalledProcessError': 'Unknown Error',
|
|
||||||
'FileNotFoundError': 'File not found',
|
|
||||||
},
|
|
||||||
'Warning': {}}
|
|
||||||
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',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
SETTINGS_EXPLORER_SYSTEM = {
|
|
||||||
# Disable Telemetry
|
|
||||||
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': {
|
|
||||||
'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},
|
|
||||||
},
|
|
||||||
# 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},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
SETTINGS_EXPLORER_USER = {
|
|
||||||
# Disable Cortana
|
|
||||||
r'Software\Microsoft\Personalization\Settings': {
|
|
||||||
'DWORD Items': {'AcceptedPrivacyPolicy': 0},
|
|
||||||
},
|
|
||||||
r'Software\Microsoft\InputPersonalization': {
|
|
||||||
'DWORD Items': {
|
|
||||||
'RestrictImplicitTextCollection': 1,
|
|
||||||
'RestrictImplicitInkCollection': 1
|
|
||||||
},
|
|
||||||
},
|
|
||||||
r'Software\Microsoft\InputPersonalization\TrainedDataStore': {
|
|
||||||
'DWORD Items': {'HarvestContacts': 1},
|
|
||||||
},
|
|
||||||
# Hide Search button / box
|
|
||||||
r'Software\Microsoft\Windows\CurrentVersion\Search': {
|
|
||||||
'DWORD Items': {'SearchboxTaskbarMode': 0},
|
|
||||||
},
|
|
||||||
# Change default Explorer view to "Computer"
|
|
||||||
r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced': {
|
|
||||||
'DWORD Items': {'LaunchTo': 1},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
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},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
VCR_REDISTS = [
|
|
||||||
{'Name': 'Visual C++ 2008 SP1 x32...',
|
|
||||||
'Cmd': [r'2008sp1\x32\vcredist.exe', '/qb! /norestart']},
|
|
||||||
{'Name': 'Visual C++ 2008 SP1 x64...',
|
|
||||||
'Cmd': [r'2008sp1\x64\vcredist.exe', '/qb! /norestart']},
|
|
||||||
{'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']},
|
|
||||||
]
|
|
||||||
|
|
||||||
|
# Configuration
|
||||||
def config_classicstart():
|
def config_classicstart():
|
||||||
"""Configure ClassicStart."""
|
"""Configure ClassicStart."""
|
||||||
# User level, not system level
|
# User level, not system level
|
||||||
|
|
@ -182,6 +60,39 @@ def config_classicstart():
|
||||||
sleep(1)
|
sleep(1)
|
||||||
popen_program(cs_exe)
|
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):
|
def write_registry_settings(settings, all_users=False):
|
||||||
"""Write registry values from custom dict of dicts."""
|
"""Write registry values from custom dict of dicts."""
|
||||||
hive = HKCU
|
hive = HKCU
|
||||||
|
|
@ -201,27 +112,41 @@ def write_registry_settings(settings, all_users=False):
|
||||||
for name, value in v.get('SZ Items', {}).items():
|
for name, value in v.get('SZ Items', {}).items():
|
||||||
winreg.SetValueEx(key, name, 0, winreg.REG_SZ, value)
|
winreg.SetValueEx(key, name, 0, winreg.REG_SZ, value)
|
||||||
|
|
||||||
def config_explorer_system():
|
|
||||||
"""Configure Windows Explorer for all users via Registry settings."""
|
|
||||||
write_registry_settings(SETTINGS_EXPLORER_SYSTEM, all_users=True)
|
|
||||||
|
|
||||||
def config_explorer_user():
|
|
||||||
"""Configure Windows Explorer for current user via Registry settings."""
|
|
||||||
write_registry_settings(SETTINGS_EXPLORER_USER, all_users=False)
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
# Installations
|
# 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():
|
def install_adobe_reader():
|
||||||
"""Install Adobe Reader."""
|
"""Install Adobe Reader."""
|
||||||
cmd = [
|
cmd = [
|
||||||
|
|
@ -233,10 +158,12 @@ def install_adobe_reader():
|
||||||
'EULA_ACCEPT=YES']
|
'EULA_ACCEPT=YES']
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def install_chrome_extensions():
|
def install_chrome_extensions():
|
||||||
"""Update registry to install Google Chrome extensions for all users."""
|
"""Install Google Chrome extensions for all users."""
|
||||||
write_registry_settings(SETTINGS_GOOGLE_CHROME, all_users=True)
|
write_registry_settings(SETTINGS_GOOGLE_CHROME, all_users=True)
|
||||||
|
|
||||||
|
|
||||||
def install_classicstart_skin():
|
def install_classicstart_skin():
|
||||||
"""Extract ClassicStart skin to installation folder."""
|
"""Extract ClassicStart skin to installation folder."""
|
||||||
if global_vars['OS']['Version'] not in ('8', '8.1', '10'):
|
if global_vars['OS']['Version'] not in ('8', '8.1', '10'):
|
||||||
|
|
@ -250,8 +177,9 @@ def install_classicstart_skin():
|
||||||
os.makedirs(dest_path, exist_ok=True)
|
os.makedirs(dest_path, exist_ok=True)
|
||||||
shutil.copy(source, dest)
|
shutil.copy(source, dest)
|
||||||
|
|
||||||
|
|
||||||
def install_firefox_extensions():
|
def install_firefox_extensions():
|
||||||
"""Update registry to install Firefox extensions for all users."""
|
"""Install Firefox extensions for all users."""
|
||||||
dist_path = r'{PROGRAMFILES}\Mozilla Firefox\distribution\extensions'.format(
|
dist_path = r'{PROGRAMFILES}\Mozilla Firefox\distribution\extensions'.format(
|
||||||
**global_vars['Env'])
|
**global_vars['Env'])
|
||||||
source_path = r'{CBinDir}\FirefoxExtensions.7z'.format(**global_vars)
|
source_path = r'{CBinDir}\FirefoxExtensions.7z'.format(**global_vars)
|
||||||
|
|
@ -270,20 +198,120 @@ def install_firefox_extensions():
|
||||||
source_path]
|
source_path]
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
def install_ninite_bundle(mse=False):
|
|
||||||
"""Run Ninite file(s) based on OS version."""
|
def install_libreoffice(
|
||||||
if global_vars['OS']['Version'] in ('8', '8.1', '10'):
|
quickstart=True, register_mso_types=True,
|
||||||
# Modern selection
|
use_mso_formats=False, vcredist=False):
|
||||||
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Modern.exe'.format(
|
"""Install LibreOffice using specified settings."""
|
||||||
**global_vars))
|
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:
|
else:
|
||||||
# Legacy selection
|
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:
|
if mse:
|
||||||
cmd = r'{BaseDir}\Installers\Extras\Security'.format(**global_vars)
|
cmd = r'{}\Installers\Extras\Security\{}'.format(
|
||||||
cmd += r'\Microsoft Security Essentials.exe'
|
global_vars['BaseDir'],
|
||||||
popen_program(cmd)
|
'Microsoft Security Essentials.exe',
|
||||||
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Legacy.exe'.format(
|
)
|
||||||
**global_vars))
|
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():
|
def install_vcredists():
|
||||||
"""Install all supported Visual C++ runtimes."""
|
"""Install all supported Visual C++ runtimes."""
|
||||||
|
|
@ -300,15 +328,32 @@ def install_vcredists():
|
||||||
|
|
||||||
os.chdir(prev_dir)
|
os.chdir(prev_dir)
|
||||||
|
|
||||||
|
|
||||||
# Misc
|
# Misc
|
||||||
def open_device_manager():
|
def open_device_manager():
|
||||||
popen_program(['mmc', 'devmgmt.msc'])
|
popen_program(['mmc', 'devmgmt.msc'])
|
||||||
|
|
||||||
|
|
||||||
|
def open_speedtest():
|
||||||
|
popen_program(['start', '', 'https://fast.com'], shell=True)
|
||||||
|
|
||||||
|
|
||||||
def open_windows_activation():
|
def open_windows_activation():
|
||||||
popen_program(['slui'])
|
popen_program(['slui'])
|
||||||
|
|
||||||
|
|
||||||
def open_windows_updates():
|
def open_windows_updates():
|
||||||
popen_program(['control', '/name', 'Microsoft.WindowsUpdate'])
|
popen_program(['control', '/name', 'Microsoft.WindowsUpdate'])
|
||||||
|
|
||||||
|
|
||||||
|
def restart_explorer():
|
||||||
|
"""Restart Explorer."""
|
||||||
|
kill_process('explorer.exe')
|
||||||
|
sleep(2)
|
||||||
|
kill_process('explorer.exe')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
244
.bin/Scripts/functions/sw_diags.py
Normal file
244
.bin/Scripts/functions/sw_diags.py
Normal file
|
|
@ -0,0 +1,244 @@
|
||||||
|
# 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
|
||||||
47
.bin/Scripts/functions/threading.py
Normal file
47
.bin/Scripts/functions/threading.py
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
# 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
|
||||||
187
.bin/Scripts/functions/tmux.py
Normal file
187
.bin/Scripts/functions/tmux.py
Normal file
|
|
@ -0,0 +1,187 @@
|
||||||
|
# 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
|
||||||
471
.bin/Scripts/functions/ufd.py
Normal file
471
.bin/Scripts/functions/ufd.py
Normal file
|
|
@ -0,0 +1,471 @@
|
||||||
|
"""Wizard Kit: Functions - UFD"""
|
||||||
|
# pylint: disable=broad-except,wildcard-import
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
import pathlib
|
||||||
|
from collections import OrderedDict
|
||||||
|
from functions.common import *
|
||||||
|
|
||||||
|
|
||||||
|
def case_insensitive_search(path, item):
|
||||||
|
"""Search path for item case insensitively, returns str."""
|
||||||
|
regex_match = '^{}$'.format(item)
|
||||||
|
real_path = ''
|
||||||
|
|
||||||
|
# Quick check first
|
||||||
|
if os.path.exists('{}/{}'.format(path, item)):
|
||||||
|
real_path = '{}{}{}'.format(
|
||||||
|
path,
|
||||||
|
'' if path == '/' else '/',
|
||||||
|
item,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check all items in dir
|
||||||
|
for entry in os.scandir(path):
|
||||||
|
if re.match(regex_match, entry.name, re.IGNORECASE):
|
||||||
|
real_path = '{}{}{}'.format(
|
||||||
|
path,
|
||||||
|
'' if path == '/' else '/',
|
||||||
|
entry.name,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Done
|
||||||
|
if not real_path:
|
||||||
|
raise FileNotFoundError('{}/{}'.format(path, item))
|
||||||
|
|
||||||
|
return real_path
|
||||||
|
|
||||||
|
|
||||||
|
def confirm_selections(args):
|
||||||
|
"""Ask tech to confirm selections, twice if necessary."""
|
||||||
|
if not ask('Is the above information correct?'):
|
||||||
|
abort(False)
|
||||||
|
## Safety check
|
||||||
|
if not args['--update']:
|
||||||
|
print_standard(' ')
|
||||||
|
print_warning('SAFETY CHECK')
|
||||||
|
print_standard(
|
||||||
|
'All data will be DELETED from the disk and partition(s) listed above.')
|
||||||
|
print_standard(
|
||||||
|
'This is irreversible and will lead to {RED}DATA LOSS.{CLEAR}'.format(
|
||||||
|
**COLORS))
|
||||||
|
if not ask('Asking again to confirm, is this correct?'):
|
||||||
|
abort(False)
|
||||||
|
|
||||||
|
print_standard(' ')
|
||||||
|
|
||||||
|
|
||||||
|
def copy_source(source, items, overwrite=False):
|
||||||
|
"""Copy source items to /mnt/UFD."""
|
||||||
|
is_image = source.is_file()
|
||||||
|
|
||||||
|
# Mount source if necessary
|
||||||
|
if is_image:
|
||||||
|
mount(source, '/mnt/Source')
|
||||||
|
|
||||||
|
# Copy items
|
||||||
|
for i_source, i_dest in items:
|
||||||
|
i_source = '{}{}'.format(
|
||||||
|
'/mnt/Source' if is_image else source,
|
||||||
|
i_source,
|
||||||
|
)
|
||||||
|
i_dest = '/mnt/UFD{}'.format(i_dest)
|
||||||
|
try:
|
||||||
|
recursive_copy(i_source, i_dest, overwrite=overwrite)
|
||||||
|
except FileNotFoundError:
|
||||||
|
# Going to assume (hope) that this is fine
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Unmount source if necessary
|
||||||
|
if is_image:
|
||||||
|
unmount('/mnt/Source')
|
||||||
|
|
||||||
|
|
||||||
|
def find_first_partition(dev_path):
|
||||||
|
"""Find path to first partition of dev, returns str."""
|
||||||
|
cmd = [
|
||||||
|
'lsblk',
|
||||||
|
'--list',
|
||||||
|
'--noheadings',
|
||||||
|
'--output', 'name',
|
||||||
|
'--paths',
|
||||||
|
dev_path,
|
||||||
|
]
|
||||||
|
result = run_program(cmd, encoding='utf-8', errors='ignore')
|
||||||
|
part_path = result.stdout.splitlines()[-1].strip()
|
||||||
|
|
||||||
|
return part_path
|
||||||
|
|
||||||
|
|
||||||
|
def find_path(path):
|
||||||
|
"""Find path case-insensitively, returns pathlib.Path obj."""
|
||||||
|
path_obj = pathlib.Path(path).resolve()
|
||||||
|
|
||||||
|
# Quick check first
|
||||||
|
if path_obj.exists():
|
||||||
|
return path_obj
|
||||||
|
|
||||||
|
# Fix case
|
||||||
|
parts = path_obj.relative_to('/').parts
|
||||||
|
real_path = '/'
|
||||||
|
for part in parts:
|
||||||
|
try:
|
||||||
|
real_path = case_insensitive_search(real_path, part)
|
||||||
|
except NotADirectoryError:
|
||||||
|
# Reclassify error
|
||||||
|
raise FileNotFoundError(path)
|
||||||
|
|
||||||
|
# Raise error if path doesn't exist
|
||||||
|
path_obj = pathlib.Path(real_path)
|
||||||
|
if not path_obj.exists():
|
||||||
|
raise FileNotFoundError(path_obj)
|
||||||
|
|
||||||
|
# Done
|
||||||
|
return path_obj
|
||||||
|
|
||||||
|
|
||||||
|
def get_user_home(user):
|
||||||
|
"""Get path to user's home dir, returns str."""
|
||||||
|
home_dir = None
|
||||||
|
cmd = ['getent', 'passwd', user]
|
||||||
|
result = run_program(cmd, encoding='utf-8', errors='ignore', check=False)
|
||||||
|
try:
|
||||||
|
home_dir = result.stdout.split(':')[5]
|
||||||
|
except Exception:
|
||||||
|
# Just use HOME from ENV (or '/root' if that fails)
|
||||||
|
home_dir = os.environ.get('HOME', '/root')
|
||||||
|
|
||||||
|
return home_dir
|
||||||
|
|
||||||
|
|
||||||
|
def get_user_name():
|
||||||
|
"""Get real user name, returns str."""
|
||||||
|
user = None
|
||||||
|
if 'SUDO_USER' in os.environ:
|
||||||
|
user = os.environ.get('SUDO_USER', 'Unknown')
|
||||||
|
else:
|
||||||
|
user = os.environ.get('USER', 'Unknown')
|
||||||
|
|
||||||
|
return user
|
||||||
|
|
||||||
|
|
||||||
|
def hide_items(ufd_dev, items):
|
||||||
|
"""Set FAT32 hidden flag for items."""
|
||||||
|
# pylint: disable=invalid-name
|
||||||
|
with open('/root/.mtoolsrc', 'w') as f:
|
||||||
|
f.write('drive U: file="{}"\n'.format(
|
||||||
|
find_first_partition(ufd_dev)))
|
||||||
|
f.write('mtools_skip_check=1\n')
|
||||||
|
|
||||||
|
# Hide items
|
||||||
|
for item in items:
|
||||||
|
cmd = ['yes | mattrib +h "U:/{}"'.format(item)]
|
||||||
|
run_program(cmd, check=False, shell=True)
|
||||||
|
|
||||||
|
|
||||||
|
def install_syslinux_to_dev(ufd_dev, use_mbr):
|
||||||
|
"""Install Syslinux to UFD (dev)."""
|
||||||
|
cmd = [
|
||||||
|
'dd',
|
||||||
|
'bs=440',
|
||||||
|
'count=1',
|
||||||
|
'if=/usr/lib/syslinux/bios/{}.bin'.format(
|
||||||
|
'mbr' if use_mbr else 'gptmbr',
|
||||||
|
),
|
||||||
|
'of={}'.format(ufd_dev),
|
||||||
|
]
|
||||||
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
|
def install_syslinux_to_partition(partition):
|
||||||
|
"""Install Syslinux to UFD (partition)."""
|
||||||
|
cmd = [
|
||||||
|
'syslinux',
|
||||||
|
'--install',
|
||||||
|
'--directory',
|
||||||
|
'/arch/boot/syslinux/',
|
||||||
|
partition,
|
||||||
|
]
|
||||||
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
|
def is_valid_path(path_obj, path_type):
|
||||||
|
"""Verify path_obj is valid by type, returns bool."""
|
||||||
|
valid_path = False
|
||||||
|
if path_type == 'DIR':
|
||||||
|
valid_path = path_obj.is_dir()
|
||||||
|
elif path_type == 'KIT':
|
||||||
|
valid_path = path_obj.is_dir() and path_obj.joinpath('.bin').exists()
|
||||||
|
elif path_type == 'IMG':
|
||||||
|
valid_path = path_obj.is_file() and path_obj.suffix.lower() == '.img'
|
||||||
|
elif path_type == 'ISO':
|
||||||
|
valid_path = path_obj.is_file() and path_obj.suffix.lower() == '.iso'
|
||||||
|
elif path_type == 'UFD':
|
||||||
|
valid_path = path_obj.is_block_device()
|
||||||
|
|
||||||
|
return valid_path
|
||||||
|
|
||||||
|
|
||||||
|
def mount(mount_source, mount_point, read_write=False):
|
||||||
|
"""Mount mount_source on mount_point."""
|
||||||
|
os.makedirs(mount_point, exist_ok=True)
|
||||||
|
cmd = [
|
||||||
|
'mount',
|
||||||
|
mount_source,
|
||||||
|
mount_point,
|
||||||
|
'-o',
|
||||||
|
'rw' if read_write else 'ro',
|
||||||
|
]
|
||||||
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
|
def prep_device(dev_path, label, use_mbr=False, indent=2):
|
||||||
|
"""Format device in preparation for applying the WizardKit components
|
||||||
|
|
||||||
|
This is done is four steps:
|
||||||
|
1. Zero-out first 64MB (this deletes the partition table and/or bootloader)
|
||||||
|
2. Create a new partition table (GPT by default, optionally MBR)
|
||||||
|
3. Set boot flag
|
||||||
|
4. Format partition (FAT32, 4K aligned)
|
||||||
|
"""
|
||||||
|
# Zero-out first 64MB
|
||||||
|
cmd = 'dd bs=4M count=16 if=/dev/zero of={}'.format(dev_path).split()
|
||||||
|
try_and_print(
|
||||||
|
indent=indent,
|
||||||
|
message='Zeroing first 64MB...',
|
||||||
|
function=run_program,
|
||||||
|
cmd=cmd,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create partition table
|
||||||
|
cmd = 'parted {} --script -- mklabel {} mkpart primary fat32 4MiB {}'.format(
|
||||||
|
dev_path,
|
||||||
|
'msdos' if use_mbr else 'gpt',
|
||||||
|
'-1s' if use_mbr else '-4MiB',
|
||||||
|
).split()
|
||||||
|
try_and_print(
|
||||||
|
indent=indent,
|
||||||
|
message='Creating partition table...',
|
||||||
|
function=run_program,
|
||||||
|
cmd=cmd,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Set boot flag
|
||||||
|
cmd = 'parted {} set 1 {} on'.format(
|
||||||
|
dev_path,
|
||||||
|
'boot' if use_mbr else 'legacy_boot',
|
||||||
|
).split()
|
||||||
|
try_and_print(
|
||||||
|
indent=indent,
|
||||||
|
message='Setting boot flag...',
|
||||||
|
function=run_program,
|
||||||
|
cmd=cmd,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Format partition
|
||||||
|
cmd = [
|
||||||
|
'mkfs.vfat', '-F', '32',
|
||||||
|
'-n', label,
|
||||||
|
find_first_partition(dev_path),
|
||||||
|
]
|
||||||
|
try_and_print(
|
||||||
|
indent=indent,
|
||||||
|
message='Formatting partition...',
|
||||||
|
function=run_program,
|
||||||
|
cmd=cmd,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def recursive_copy(source, dest, overwrite=False):
|
||||||
|
"""Copy source to dest recursively.
|
||||||
|
|
||||||
|
NOTE: This uses rsync style source/dest syntax.
|
||||||
|
If the source has a trailing slash then it's contents are copied,
|
||||||
|
otherwise the source itself is copied.
|
||||||
|
|
||||||
|
Examples assuming "ExDir/ExFile.txt" exists:
|
||||||
|
recursive_copy("ExDir", "Dest/") results in "Dest/ExDir/ExFile.txt"
|
||||||
|
recursive_copy("ExDir/", "Dest/") results in "Dest/ExFile.txt"
|
||||||
|
|
||||||
|
NOTE 2: dest does not use find_path because it might not exist.
|
||||||
|
"""
|
||||||
|
copy_contents = source.endswith('/')
|
||||||
|
source = find_path(source)
|
||||||
|
dest = pathlib.Path(dest).resolve().joinpath(source.name)
|
||||||
|
os.makedirs(dest.parent, exist_ok=True)
|
||||||
|
|
||||||
|
if source.is_dir():
|
||||||
|
if copy_contents:
|
||||||
|
# Trailing slash syntax
|
||||||
|
for item in os.scandir(source):
|
||||||
|
recursive_copy(item.path, dest.parent, overwrite=overwrite)
|
||||||
|
elif not dest.exists():
|
||||||
|
# No conflict, copying whole tree (no merging needed)
|
||||||
|
shutil.copytree(source, dest)
|
||||||
|
elif not dest.is_dir():
|
||||||
|
# Refusing to replace file with dir
|
||||||
|
raise FileExistsError('Refusing to replace file: {}'.format(dest))
|
||||||
|
else:
|
||||||
|
# Dest exists and is a dir, merge dirs
|
||||||
|
for item in os.scandir(source):
|
||||||
|
recursive_copy(item.path, dest, overwrite=overwrite)
|
||||||
|
elif source.is_file():
|
||||||
|
if not dest.exists():
|
||||||
|
# No conflict, copying file
|
||||||
|
shutil.copy2(source, dest)
|
||||||
|
elif not dest.is_file():
|
||||||
|
# Refusing to replace dir with file
|
||||||
|
raise FileExistsError('Refusing to replace dir: {}'.format(dest))
|
||||||
|
elif overwrite:
|
||||||
|
# Dest file exists, deleting and replacing file
|
||||||
|
os.remove(dest)
|
||||||
|
shutil.copy2(source, dest)
|
||||||
|
else:
|
||||||
|
# Refusing to delete file when overwrite=False
|
||||||
|
raise FileExistsError('Refusing to delete file: {}'.format(dest))
|
||||||
|
|
||||||
|
|
||||||
|
def remove_arch():
|
||||||
|
"""Remove arch dir from UFD.
|
||||||
|
|
||||||
|
This ensures a clean installation to the UFD and resets the boot files
|
||||||
|
"""
|
||||||
|
shutil.rmtree(find_path('/mnt/UFD/arch'))
|
||||||
|
|
||||||
|
|
||||||
|
def running_as_root():
|
||||||
|
"""Check if running with effective UID of 0, returns bool."""
|
||||||
|
return os.geteuid() == 0
|
||||||
|
|
||||||
|
|
||||||
|
def show_selections(args, sources, ufd_dev, ufd_sources):
|
||||||
|
"""Show selections including non-specified options."""
|
||||||
|
|
||||||
|
# Sources
|
||||||
|
print_info('Sources')
|
||||||
|
for label in ufd_sources.keys():
|
||||||
|
if label in sources:
|
||||||
|
print_standard(' {label:<18} {path}'.format(
|
||||||
|
label=label+':',
|
||||||
|
path=sources[label],
|
||||||
|
))
|
||||||
|
else:
|
||||||
|
print_standard(' {label:<18} {YELLOW}Not Specified{CLEAR}'.format(
|
||||||
|
label=label+':',
|
||||||
|
**COLORS,
|
||||||
|
))
|
||||||
|
print_standard(' ')
|
||||||
|
|
||||||
|
# Destination
|
||||||
|
print_info('Destination')
|
||||||
|
cmd = [
|
||||||
|
'lsblk', '--nodeps', '--noheadings', '--paths',
|
||||||
|
'--output', 'NAME,FSTYPE,TRAN,SIZE,VENDOR,MODEL,SERIAL',
|
||||||
|
ufd_dev,
|
||||||
|
]
|
||||||
|
result = run_program(cmd, check=False, encoding='utf-8', errors='ignore')
|
||||||
|
print_standard(result.stdout.strip())
|
||||||
|
cmd = [
|
||||||
|
'lsblk', '--noheadings', '--paths',
|
||||||
|
'--output', 'NAME,SIZE,FSTYPE,LABEL,MOUNTPOINT',
|
||||||
|
ufd_dev,
|
||||||
|
]
|
||||||
|
result = run_program(cmd, check=False, encoding='utf-8', errors='ignore')
|
||||||
|
for line in result.stdout.splitlines()[1:]:
|
||||||
|
print_standard(line)
|
||||||
|
|
||||||
|
# Notes
|
||||||
|
if args['--update']:
|
||||||
|
print_warning('Updating kit in-place')
|
||||||
|
elif args['--use-mbr']:
|
||||||
|
print_warning('Formatting using legacy MBR')
|
||||||
|
print_standard(' ')
|
||||||
|
|
||||||
|
|
||||||
|
def unmount(mount_point):
|
||||||
|
"""Unmount mount_point."""
|
||||||
|
cmd = ['umount', mount_point]
|
||||||
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
|
def update_boot_entries(boot_entries, boot_files, iso_label, ufd_label):
|
||||||
|
"""Update boot files for UFD usage"""
|
||||||
|
configs = []
|
||||||
|
|
||||||
|
# Find config files
|
||||||
|
for c_path, c_ext in boot_files.items():
|
||||||
|
c_path = find_path('/mnt/UFD{}'.format(c_path))
|
||||||
|
for item in os.scandir(c_path):
|
||||||
|
if item.name.lower().endswith(c_ext.lower()):
|
||||||
|
configs.append(item.path)
|
||||||
|
|
||||||
|
# Update Linux labels
|
||||||
|
cmd = [
|
||||||
|
'sed',
|
||||||
|
'--in-place',
|
||||||
|
'--regexp-extended',
|
||||||
|
's/{}/{}/'.format(iso_label, ufd_label),
|
||||||
|
*configs,
|
||||||
|
]
|
||||||
|
run_program(cmd)
|
||||||
|
|
||||||
|
# Uncomment extra entries if present
|
||||||
|
for b_path, b_comment in boot_entries.items():
|
||||||
|
try:
|
||||||
|
find_path('/mnt/UFD{}'.format(b_path))
|
||||||
|
except (FileNotFoundError, NotADirectoryError):
|
||||||
|
# Entry not found, continue to next entry
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Entry found, update config files
|
||||||
|
cmd = [
|
||||||
|
'sed',
|
||||||
|
'--in-place',
|
||||||
|
's/#{}#//'.format(b_comment),
|
||||||
|
*configs,
|
||||||
|
]
|
||||||
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
|
|
||||||
|
def verify_sources(args, ufd_sources):
|
||||||
|
"""Check all sources and abort if necessary, returns dict."""
|
||||||
|
sources = OrderedDict()
|
||||||
|
|
||||||
|
for label, data in ufd_sources.items():
|
||||||
|
s_path = args[data['Arg']]
|
||||||
|
if s_path:
|
||||||
|
try:
|
||||||
|
s_path_obj = find_path(s_path)
|
||||||
|
except FileNotFoundError:
|
||||||
|
print_error('ERROR: {} not found: {}'.format(label, s_path))
|
||||||
|
abort(False)
|
||||||
|
if not is_valid_path(s_path_obj, data['Type']):
|
||||||
|
print_error('ERROR: Invalid {} source: {}'.format(label, s_path))
|
||||||
|
abort(False)
|
||||||
|
sources[label] = s_path_obj
|
||||||
|
|
||||||
|
return sources
|
||||||
|
|
||||||
|
|
||||||
|
def verify_ufd(dev_path):
|
||||||
|
"""Check that dev_path is a valid UFD, returns pathlib.Path obj."""
|
||||||
|
ufd_dev = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
ufd_dev = find_path(dev_path)
|
||||||
|
except FileNotFoundError:
|
||||||
|
print_error('ERROR: UFD device not found: {}'.format(dev_path))
|
||||||
|
abort(False)
|
||||||
|
|
||||||
|
if not is_valid_path(ufd_dev, 'UFD'):
|
||||||
|
print_error('ERROR: Invalid UFD device: {}'.format(ufd_dev))
|
||||||
|
abort(False)
|
||||||
|
|
||||||
|
return ufd_dev
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print("This file is not meant to be called directly.")
|
||||||
242
.bin/Scripts/functions/update.py
Normal file → Executable file
242
.bin/Scripts/functions/update.py
Normal file → Executable file
|
|
@ -2,12 +2,12 @@
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from functions.common import *
|
|
||||||
from functions.data import *
|
from functions.data import *
|
||||||
from settings.launchers import *
|
from settings.launchers import *
|
||||||
from settings.music import *
|
from settings.music import *
|
||||||
from settings.sources import *
|
from settings.sources import *
|
||||||
|
|
||||||
|
|
||||||
def compress_and_remove_item(item):
|
def compress_and_remove_item(item):
|
||||||
"""Compress and delete an item unless an error is encountered."""
|
"""Compress and delete an item unless an error is encountered."""
|
||||||
try:
|
try:
|
||||||
|
|
@ -17,6 +17,7 @@ def compress_and_remove_item(item):
|
||||||
else:
|
else:
|
||||||
remove_item(item.path)
|
remove_item(item.path)
|
||||||
|
|
||||||
|
|
||||||
def compress_item(item):
|
def compress_item(item):
|
||||||
"""Compress an item in a 7-Zip archive using the ARCHIVE_PASSWORD."""
|
"""Compress an item in a 7-Zip archive using the ARCHIVE_PASSWORD."""
|
||||||
# Prep
|
# Prep
|
||||||
|
|
@ -42,6 +43,7 @@ def compress_item(item):
|
||||||
# Done
|
# Done
|
||||||
os.chdir(prev_dir)
|
os.chdir(prev_dir)
|
||||||
|
|
||||||
|
|
||||||
def download_generic(out_dir, out_name, source_url):
|
def download_generic(out_dir, out_name, source_url):
|
||||||
"""Downloads a file using requests."""
|
"""Downloads a file using requests."""
|
||||||
## Code based on this Q&A: https://stackoverflow.com/q/16694907
|
## Code based on this Q&A: https://stackoverflow.com/q/16694907
|
||||||
|
|
@ -59,10 +61,28 @@ def download_generic(out_dir, out_name, source_url):
|
||||||
except:
|
except:
|
||||||
raise GenericError('Failed to download file.')
|
raise GenericError('Failed to download file.')
|
||||||
|
|
||||||
|
|
||||||
def download_to_temp(out_name, source_url):
|
def download_to_temp(out_name, source_url):
|
||||||
"""Download a file to the TmpDir."""
|
"""Download a file to the TmpDir."""
|
||||||
download_generic(global_vars['TmpDir'], out_name, source_url)
|
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=[]):
|
def extract_generic(source, dest, mode='x', sz_args=[]):
|
||||||
"""Extract a file to a destination."""
|
"""Extract a file to a destination."""
|
||||||
cmd = [
|
cmd = [
|
||||||
|
|
@ -73,12 +93,14 @@ def extract_generic(source, dest, mode='x', sz_args=[]):
|
||||||
cmd.extend(sz_args)
|
cmd.extend(sz_args)
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def extract_temp_to_bin(source, item, mode='x', sz_args=[]):
|
def extract_temp_to_bin(source, item, mode='x', sz_args=[]):
|
||||||
"""Extract a file to the .bin folder."""
|
"""Extract a file to the .bin folder."""
|
||||||
source = r'{}\{}'.format(global_vars['TmpDir'], source)
|
source = r'{}\{}'.format(global_vars['TmpDir'], source)
|
||||||
dest = r'{}\{}'.format(global_vars['BinDir'], item)
|
dest = r'{}\{}'.format(global_vars['BinDir'], item)
|
||||||
extract_generic(source, dest, mode, sz_args)
|
extract_generic(source, dest, mode, sz_args)
|
||||||
|
|
||||||
|
|
||||||
def extract_temp_to_cbin(source, item, mode='x', sz_args=[]):
|
def extract_temp_to_cbin(source, item, mode='x', sz_args=[]):
|
||||||
"""Extract a file to the .cbin folder."""
|
"""Extract a file to the .cbin folder."""
|
||||||
source = r'{}\{}'.format(global_vars['TmpDir'], source)
|
source = r'{}\{}'.format(global_vars['TmpDir'], source)
|
||||||
|
|
@ -88,6 +110,7 @@ def extract_temp_to_cbin(source, item, mode='x', sz_args=[]):
|
||||||
shutil.copytree(include_path, dest)
|
shutil.copytree(include_path, dest)
|
||||||
extract_generic(source, dest, mode, sz_args)
|
extract_generic(source, dest, mode, sz_args)
|
||||||
|
|
||||||
|
|
||||||
def generate_launcher(section, name, options):
|
def generate_launcher(section, name, options):
|
||||||
"""Generate a launcher script."""
|
"""Generate a launcher script."""
|
||||||
# Prep
|
# Prep
|
||||||
|
|
@ -125,6 +148,7 @@ def generate_launcher(section, name, options):
|
||||||
# f.writelines(out_text)
|
# f.writelines(out_text)
|
||||||
f.write('\n'.join(out_text))
|
f.write('\n'.join(out_text))
|
||||||
|
|
||||||
|
|
||||||
def remove_item(item_path):
|
def remove_item(item_path):
|
||||||
"""Delete a file or folder."""
|
"""Delete a file or folder."""
|
||||||
if os.path.exists(item_path):
|
if os.path.exists(item_path):
|
||||||
|
|
@ -133,20 +157,25 @@ def remove_item(item_path):
|
||||||
else:
|
else:
|
||||||
os.remove(item_path)
|
os.remove(item_path)
|
||||||
|
|
||||||
|
|
||||||
def remove_from_kit(item):
|
def remove_from_kit(item):
|
||||||
"""Delete a file or folder from the .bin/.cbin folders."""
|
"""Delete a file or folder from the .bin/.cbin folders."""
|
||||||
item_locations = []
|
item_locations = []
|
||||||
for p in [global_vars['BinDir'], global_vars['CBinDir']]:
|
for p in [global_vars['BinDir'], global_vars['CBinDir']]:
|
||||||
item_locations.append(r'{}\{}'.format(p, item))
|
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\{}'.format(p, item))
|
||||||
|
item_locations.append(r'{}\_Drivers\{}.7z'.format(p, item))
|
||||||
for item_path in item_locations:
|
for item_path in item_locations:
|
||||||
remove_item(item_path)
|
remove_item(item_path)
|
||||||
|
|
||||||
|
|
||||||
def remove_from_temp(item):
|
def remove_from_temp(item):
|
||||||
"""Delete a file or folder from the TmpDir folder."""
|
"""Delete a file or folder from the TmpDir folder."""
|
||||||
item_path = r'{}\{}'.format(global_vars['TmpDir'], item)
|
item_path = r'{}\{}'.format(global_vars['TmpDir'], item)
|
||||||
remove_item(item_path)
|
remove_item(item_path)
|
||||||
|
|
||||||
|
|
||||||
def resolve_dynamic_url(source_url, regex):
|
def resolve_dynamic_url(source_url, regex):
|
||||||
"""Scan source_url for a url using the regex provided; returns str."""
|
"""Scan source_url for a url using the regex provided; returns str."""
|
||||||
# Load the download page
|
# Load the download page
|
||||||
|
|
@ -168,37 +197,8 @@ def resolve_dynamic_url(source_url, regex):
|
||||||
# Return
|
# Return
|
||||||
return url
|
return url
|
||||||
|
|
||||||
def scan_for_net_installers(server, family_name, min_year):
|
|
||||||
"""Scan network shares for installers."""
|
|
||||||
if not server['Mounted']:
|
|
||||||
mount_network_share(server)
|
|
||||||
|
|
||||||
if server['Mounted']:
|
# Data Recovery
|
||||||
for year in os.scandir(r'\\{IP}\{Share}'.format(**server)):
|
|
||||||
try:
|
|
||||||
year_ok = int(year.name) < min_year
|
|
||||||
except ValueError:
|
|
||||||
year_ok = False # Skip non-year items
|
|
||||||
if year_ok:
|
|
||||||
# Don't support outdated installers
|
|
||||||
continue
|
|
||||||
for version in os.scandir(year.path):
|
|
||||||
section = r'Installers\Extras\{}\{}'.format(
|
|
||||||
family_name, year.name)
|
|
||||||
if section not in LAUNCHERS:
|
|
||||||
LAUNCHERS[section] = {}
|
|
||||||
name = version.name
|
|
||||||
if re.search(r'(exe|msi)$', name, re.IGNORECASE):
|
|
||||||
name = name[:-4]
|
|
||||||
if name not in LAUNCHERS[section]:
|
|
||||||
LAUNCHERS[section][name] = {
|
|
||||||
'L_TYPE': family_name,
|
|
||||||
'L_PATH': year.name,
|
|
||||||
'L_ITEM': version.name,
|
|
||||||
}
|
|
||||||
umount_network_share(server)
|
|
||||||
|
|
||||||
## Data Recovery ##
|
|
||||||
def update_testdisk():
|
def update_testdisk():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
for exe in ['fidentify_win.exe', 'photorec_win.exe',
|
for exe in ['fidentify_win.exe', 'photorec_win.exe',
|
||||||
|
|
@ -224,7 +224,8 @@ def update_testdisk():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('testdisk_wip.zip')
|
remove_from_temp('testdisk_wip.zip')
|
||||||
|
|
||||||
## Data Transfers ##
|
|
||||||
|
# Data Transfers
|
||||||
def update_fastcopy():
|
def update_fastcopy():
|
||||||
## NOTE: Lives in .bin uncompressed
|
## NOTE: Lives in .bin uncompressed
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
|
|
@ -234,35 +235,34 @@ def update_fastcopy():
|
||||||
# Remove existing folders
|
# Remove existing folders
|
||||||
remove_from_kit('FastCopy')
|
remove_from_kit('FastCopy')
|
||||||
|
|
||||||
# Download
|
# Download installer
|
||||||
download_to_temp('FastCopy.zip', SOURCE_URLS['FastCopy'])
|
download_to_temp('FastCopy.exe', SOURCE_URLS['FastCopy'])
|
||||||
|
_installer = r'{}\FastCopy.exe'.format(global_vars['TmpDir'])
|
||||||
# Extract installer
|
|
||||||
extract_temp_to_bin('FastCopy.zip', 'FastCopy')
|
|
||||||
_path = r'{}\FastCopy'.format(global_vars['BinDir'])
|
|
||||||
_installer = 'FastCopy354_installer.exe'
|
|
||||||
|
|
||||||
# Extract 64-bit
|
|
||||||
cmd = [
|
|
||||||
r'{}\{}'.format(_path, _installer),
|
|
||||||
'/NOSUBDIR', '/DIR={}'.format(_path),
|
|
||||||
'/EXTRACT64']
|
|
||||||
run_program(cmd)
|
|
||||||
shutil.move(
|
|
||||||
r'{}\FastCopy\FastCopy.exe'.format(global_vars['BinDir']),
|
|
||||||
r'{}\FastCopy\FastCopy64.exe'.format(global_vars['BinDir']))
|
|
||||||
|
|
||||||
# Extract 32-bit
|
# Extract 32-bit
|
||||||
|
_path32 = r'{}\FastCopy'.format(global_vars['BinDir'])
|
||||||
cmd = [
|
cmd = [
|
||||||
r'{}\{}'.format(_path, _installer),
|
_installer,
|
||||||
'/NOSUBDIR', '/DIR={}'.format(_path),
|
'/NOSUBDIR', '/DIR={}'.format(_path32),
|
||||||
'/EXTRACT32']
|
'/EXTRACT32']
|
||||||
run_program(cmd)
|
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
|
# Cleanup
|
||||||
os.remove(r'{}\{}'.format(_path, _installer))
|
remove_item(r'{}\setup.exe'.format(_path32))
|
||||||
os.remove(r'{}\setup.exe'.format(_path, _installer))
|
remove_item(_path64)
|
||||||
remove_from_temp('FastCopy.zip')
|
remove_from_temp('FastCopy.exe')
|
||||||
|
|
||||||
|
|
||||||
def update_wimlib():
|
def update_wimlib():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
|
|
@ -287,6 +287,7 @@ def update_wimlib():
|
||||||
remove_from_temp('wimlib32.zip')
|
remove_from_temp('wimlib32.zip')
|
||||||
remove_from_temp('wimlib64.zip')
|
remove_from_temp('wimlib64.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_xyplorer():
|
def update_xyplorer():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('XYplorerFree.exe')
|
kill_process('XYplorerFree.exe')
|
||||||
|
|
@ -303,7 +304,8 @@ def update_xyplorer():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('xyplorer_free.zip')
|
remove_from_temp('xyplorer_free.zip')
|
||||||
|
|
||||||
## Diagnostics ##
|
|
||||||
|
# Diagnostics
|
||||||
def update_aida64():
|
def update_aida64():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('notepadplusplus.exe')
|
kill_process('notepadplusplus.exe')
|
||||||
|
|
@ -320,6 +322,7 @@ def update_aida64():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('aida64.zip')
|
remove_from_temp('aida64.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_autoruns():
|
def update_autoruns():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('Autoruns.exe')
|
kill_process('Autoruns.exe')
|
||||||
|
|
@ -337,6 +340,7 @@ def update_autoruns():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('Autoruns.zip')
|
remove_from_temp('Autoruns.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_bleachbit():
|
def update_bleachbit():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('bleachbit.exe')
|
kill_process('bleachbit.exe')
|
||||||
|
|
@ -368,6 +372,7 @@ def update_bleachbit():
|
||||||
remove_from_temp('bleachbit.zip')
|
remove_from_temp('bleachbit.zip')
|
||||||
remove_from_temp('Winapp2.zip')
|
remove_from_temp('Winapp2.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_bluescreenview():
|
def update_bluescreenview():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
for exe in ['BlueScreenView.exe', 'BlueScreenView64.exe']:
|
for exe in ['BlueScreenView.exe', 'BlueScreenView64.exe']:
|
||||||
|
|
@ -381,7 +386,8 @@ def update_bluescreenview():
|
||||||
download_to_temp('bluescreenview64.zip', SOURCE_URLS['BlueScreenView64'])
|
download_to_temp('bluescreenview64.zip', SOURCE_URLS['BlueScreenView64'])
|
||||||
|
|
||||||
# Extract files
|
# Extract files
|
||||||
extract_temp_to_cbin('bluescreenview64.zip', 'BlueScreenView', sz_args=['BlueScreenView.exe'])
|
extract_temp_to_cbin(
|
||||||
|
'bluescreenview64.zip', 'BlueScreenView', sz_args=['BlueScreenView.exe'])
|
||||||
shutil.move(
|
shutil.move(
|
||||||
r'{}\BlueScreenView\BlueScreenView.exe'.format(global_vars['CBinDir']),
|
r'{}\BlueScreenView\BlueScreenView.exe'.format(global_vars['CBinDir']),
|
||||||
r'{}\BlueScreenView\BlueScreenView64.exe'.format(global_vars['CBinDir']))
|
r'{}\BlueScreenView\BlueScreenView64.exe'.format(global_vars['CBinDir']))
|
||||||
|
|
@ -391,6 +397,7 @@ def update_bluescreenview():
|
||||||
remove_from_temp('bluescreenview32.zip')
|
remove_from_temp('bluescreenview32.zip')
|
||||||
remove_from_temp('bluescreenview64.zip')
|
remove_from_temp('bluescreenview64.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_erunt():
|
def update_erunt():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('ERUNT.EXE')
|
kill_process('ERUNT.EXE')
|
||||||
|
|
@ -407,6 +414,7 @@ def update_erunt():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('erunt.zip')
|
remove_from_temp('erunt.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_hitmanpro():
|
def update_hitmanpro():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
for exe in ['HitmanPro.exe', 'HitmanPro64.exe']:
|
for exe in ['HitmanPro.exe', 'HitmanPro64.exe']:
|
||||||
|
|
@ -420,6 +428,7 @@ def update_hitmanpro():
|
||||||
download_generic(dest, 'HitmanPro.exe', SOURCE_URLS['HitmanPro32'])
|
download_generic(dest, 'HitmanPro.exe', SOURCE_URLS['HitmanPro32'])
|
||||||
download_generic(dest, 'HitmanPro64.exe', SOURCE_URLS['HitmanPro64'])
|
download_generic(dest, 'HitmanPro64.exe', SOURCE_URLS['HitmanPro64'])
|
||||||
|
|
||||||
|
|
||||||
def update_hwinfo():
|
def update_hwinfo():
|
||||||
## NOTE: Lives in .bin uncompressed
|
## NOTE: Lives in .bin uncompressed
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
|
|
@ -435,6 +444,31 @@ def update_hwinfo():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('HWiNFO.zip')
|
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():
|
def update_produkey():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
for exe in ['ProduKey.exe', 'ProduKey64.exe']:
|
for exe in ['ProduKey.exe', 'ProduKey64.exe']:
|
||||||
|
|
@ -458,7 +492,8 @@ def update_produkey():
|
||||||
remove_from_temp('produkey32.zip')
|
remove_from_temp('produkey32.zip')
|
||||||
remove_from_temp('produkey64.zip')
|
remove_from_temp('produkey64.zip')
|
||||||
|
|
||||||
## Drivers ##
|
|
||||||
|
# Drivers
|
||||||
def update_intel_rst():
|
def update_intel_rst():
|
||||||
# Remove existing folders
|
# Remove existing folders
|
||||||
remove_from_kit('Intel RST')
|
remove_from_kit('Intel RST')
|
||||||
|
|
@ -474,6 +509,7 @@ def update_intel_rst():
|
||||||
for name, url in RST_SOURCES.items():
|
for name, url in RST_SOURCES.items():
|
||||||
download_generic(dest, name, url)
|
download_generic(dest, name, url)
|
||||||
|
|
||||||
|
|
||||||
def update_intel_ssd_toolbox():
|
def update_intel_ssd_toolbox():
|
||||||
# Remove existing folders
|
# Remove existing folders
|
||||||
remove_from_kit('Intel SSD Toolbox.exe')
|
remove_from_kit('Intel SSD Toolbox.exe')
|
||||||
|
|
@ -484,6 +520,7 @@ def update_intel_ssd_toolbox():
|
||||||
'Intel SSD Toolbox.exe',
|
'Intel SSD Toolbox.exe',
|
||||||
SOURCE_URLS['Intel SSD Toolbox'])
|
SOURCE_URLS['Intel SSD Toolbox'])
|
||||||
|
|
||||||
|
|
||||||
def update_samsung_magician():
|
def update_samsung_magician():
|
||||||
# Remove existing folders
|
# Remove existing folders
|
||||||
remove_from_kit('Samsung Magician.exe')
|
remove_from_kit('Samsung Magician.exe')
|
||||||
|
|
@ -502,6 +539,7 @@ def update_samsung_magician():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('Samsung Magician.zip')
|
remove_from_temp('Samsung Magician.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_sdi_origin():
|
def update_sdi_origin():
|
||||||
# Download aria2
|
# Download aria2
|
||||||
download_to_temp('aria2.zip', SOURCE_URLS['aria2'])
|
download_to_temp('aria2.zip', SOURCE_URLS['aria2'])
|
||||||
|
|
@ -517,7 +555,8 @@ def update_sdi_origin():
|
||||||
indexes = []
|
indexes = []
|
||||||
for line in out.stdout.decode().splitlines():
|
for line in out.stdout.decode().splitlines():
|
||||||
r = re.search(r'^\s*(\d+)\|(.*)', line)
|
r = re.search(r'^\s*(\d+)\|(.*)', line)
|
||||||
if r and not re.search(r'(\.(bat|inf)|Video|Server|Printer|XP)', line, re.IGNORECASE):
|
if (r and not re.search(
|
||||||
|
r'(\.(bat|inf)|Video|Server|Printer|XP)', line, re.IGNORECASE)):
|
||||||
indexes.append(int(r.group(1)))
|
indexes.append(int(r.group(1)))
|
||||||
indexes = [str(i) for i in sorted(indexes)]
|
indexes = [str(i) for i in sorted(indexes)]
|
||||||
|
|
||||||
|
|
@ -558,7 +597,8 @@ def update_sdi_origin():
|
||||||
remove_from_temp('sdio.torrent')
|
remove_from_temp('sdio.torrent')
|
||||||
remove_from_temp('sdio_themes.zip')
|
remove_from_temp('sdio_themes.zip')
|
||||||
|
|
||||||
## Installers ##
|
|
||||||
|
# Installers
|
||||||
def update_adobe_reader_dc():
|
def update_adobe_reader_dc():
|
||||||
# Prep
|
# Prep
|
||||||
dest = r'{}\Installers\Extras\Office'.format(
|
dest = r'{}\Installers\Extras\Office'.format(
|
||||||
|
|
@ -574,6 +614,39 @@ def update_adobe_reader_dc():
|
||||||
download_generic(
|
download_generic(
|
||||||
dest, 'Adobe Reader DC.exe', SOURCE_URLS['Adobe Reader DC'])
|
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():
|
def update_office():
|
||||||
# Remove existing folders
|
# Remove existing folders
|
||||||
remove_from_kit('_Office')
|
remove_from_kit('_Office')
|
||||||
|
|
@ -584,23 +657,23 @@ def update_office():
|
||||||
if os.path.exists(include_path):
|
if os.path.exists(include_path):
|
||||||
shutil.copytree(include_path, dest)
|
shutil.copytree(include_path, dest)
|
||||||
|
|
||||||
for year in ['2016']:
|
|
||||||
# Download and extract
|
# Download and extract
|
||||||
name = 'odt{}.exe'.format(year)
|
_out_path = r'{}\odt'.format(global_vars['TmpDir'])
|
||||||
url = 'Office Deployment Tool {}'.format(year)
|
download_to_temp('odt.exe', SOURCE_URLS['Office Deployment Tool'])
|
||||||
download_to_temp(name, SOURCE_URLS[url])
|
|
||||||
cmd = [
|
cmd = [
|
||||||
r'{}\odt{}.exe'.format(global_vars['TmpDir'], year),
|
r'{}\odt.exe'.format(global_vars['TmpDir']),
|
||||||
r'/extract:{}\{}'.format(global_vars['TmpDir'], year),
|
r'/extract:{}'.format(_out_path),
|
||||||
'/quiet',
|
'/quiet',
|
||||||
]
|
]
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
shutil.move(
|
shutil.move(
|
||||||
r'{}\{}'.format(global_vars['TmpDir'], year),
|
r'{}\setup.exe'.format(_out_path),
|
||||||
r'{}\_Office\{}'.format(global_vars['CBinDir'], year))
|
r'{}\_Office'.format(global_vars['CBinDir']))
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('odt{}.exe'.format(year))
|
remove_from_temp('odt')
|
||||||
|
remove_from_temp('odt.exe')
|
||||||
|
|
||||||
|
|
||||||
def update_classic_start_skin():
|
def update_classic_start_skin():
|
||||||
# Remove existing folders
|
# Remove existing folders
|
||||||
|
|
@ -612,6 +685,7 @@ def update_classic_start_skin():
|
||||||
'Metro-Win10-Black.skin7',
|
'Metro-Win10-Black.skin7',
|
||||||
SOURCE_URLS['ClassicStartSkin'])
|
SOURCE_URLS['ClassicStartSkin'])
|
||||||
|
|
||||||
|
|
||||||
def update_vcredists():
|
def update_vcredists():
|
||||||
# Remove existing folders
|
# Remove existing folders
|
||||||
remove_from_kit('_vcredists')
|
remove_from_kit('_vcredists')
|
||||||
|
|
@ -632,6 +706,7 @@ def update_vcredists():
|
||||||
'vcredist.exe',
|
'vcredist.exe',
|
||||||
VCREDIST_SOURCES[year][bit])
|
VCREDIST_SOURCES[year][bit])
|
||||||
|
|
||||||
|
|
||||||
def update_one_ninite(section, dest, name, url, indent=8, width=40):
|
def update_one_ninite(section, dest, name, url, indent=8, width=40):
|
||||||
# Prep
|
# Prep
|
||||||
url = 'https://ninite.com/{}/ninite.exe'.format(url)
|
url = 'https://ninite.com/{}/ninite.exe'.format(url)
|
||||||
|
|
@ -648,6 +723,7 @@ def update_one_ninite(section, dest, name, url, indent=8, width=40):
|
||||||
remove_item(installer_dest)
|
remove_item(installer_dest)
|
||||||
shutil.copy(r'{}\{}'.format(dest, name), installer_dest)
|
shutil.copy(r'{}\{}'.format(dest, name), installer_dest)
|
||||||
|
|
||||||
|
|
||||||
def update_all_ninite(indent=8, width=40, other_results={}):
|
def update_all_ninite(indent=8, width=40, other_results={}):
|
||||||
print_info('{}Ninite'.format(' '*int(indent/2)))
|
print_info('{}Ninite'.format(' '*int(indent/2)))
|
||||||
for section in sorted(NINITE_SOURCES.keys()):
|
for section in sorted(NINITE_SOURCES.keys()):
|
||||||
|
|
@ -658,7 +734,8 @@ def update_all_ninite(indent=8, width=40, other_results={}):
|
||||||
other_results=other_results, indent=indent, width=width,
|
other_results=other_results, indent=indent, width=width,
|
||||||
section=section, dest=dest, name=name, url=url)
|
section=section, dest=dest, name=name, url=url)
|
||||||
|
|
||||||
## Misc ##
|
|
||||||
|
# Misc
|
||||||
def update_caffeine():
|
def update_caffeine():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('caffeine.exe')
|
kill_process('caffeine.exe')
|
||||||
|
|
@ -675,6 +752,7 @@ def update_caffeine():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('caffeine.zip')
|
remove_from_temp('caffeine.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_du():
|
def update_du():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('du.exe')
|
kill_process('du.exe')
|
||||||
|
|
@ -692,6 +770,7 @@ def update_du():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('du.zip')
|
remove_from_temp('du.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_everything():
|
def update_everything():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
for exe in ['Everything.exe', 'Everything64.exe']:
|
for exe in ['Everything.exe', 'Everything64.exe']:
|
||||||
|
|
@ -705,7 +784,8 @@ def update_everything():
|
||||||
download_to_temp('everything64.zip', SOURCE_URLS['Everything64'])
|
download_to_temp('everything64.zip', SOURCE_URLS['Everything64'])
|
||||||
|
|
||||||
# Extract files
|
# Extract files
|
||||||
extract_temp_to_cbin('everything64.zip', 'Everything', sz_args=['Everything.exe'])
|
extract_temp_to_cbin(
|
||||||
|
'everything64.zip', 'Everything', sz_args=['Everything.exe'])
|
||||||
shutil.move(
|
shutil.move(
|
||||||
r'{}\Everything\Everything.exe'.format(global_vars['CBinDir']),
|
r'{}\Everything\Everything.exe'.format(global_vars['CBinDir']),
|
||||||
r'{}\Everything\Everything64.exe'.format(global_vars['CBinDir']))
|
r'{}\Everything\Everything64.exe'.format(global_vars['CBinDir']))
|
||||||
|
|
@ -715,6 +795,7 @@ def update_everything():
|
||||||
remove_from_temp('everything32.zip')
|
remove_from_temp('everything32.zip')
|
||||||
remove_from_temp('everything64.zip')
|
remove_from_temp('everything64.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_firefox_ublock_origin():
|
def update_firefox_ublock_origin():
|
||||||
# Remove existing folders
|
# Remove existing folders
|
||||||
remove_from_kit('FirefoxExtensions')
|
remove_from_kit('FirefoxExtensions')
|
||||||
|
|
@ -725,6 +806,7 @@ def update_firefox_ublock_origin():
|
||||||
'ublock_origin.xpi',
|
'ublock_origin.xpi',
|
||||||
SOURCE_URLS['Firefox uBO'])
|
SOURCE_URLS['Firefox uBO'])
|
||||||
|
|
||||||
|
|
||||||
def update_notepadplusplus():
|
def update_notepadplusplus():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('notepadplusplus.exe')
|
kill_process('notepadplusplus.exe')
|
||||||
|
|
@ -745,6 +827,7 @@ def update_notepadplusplus():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('npp.7z')
|
remove_from_temp('npp.7z')
|
||||||
|
|
||||||
|
|
||||||
def update_putty():
|
def update_putty():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('PUTTY.EXE')
|
kill_process('PUTTY.EXE')
|
||||||
|
|
@ -761,6 +844,7 @@ def update_putty():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_temp('putty.zip')
|
remove_from_temp('putty.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_wiztree():
|
def update_wiztree():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
for process in ['WizTree.exe', 'WizTree64.exe']:
|
for process in ['WizTree.exe', 'WizTree64.exe']:
|
||||||
|
|
@ -775,10 +859,16 @@ def update_wiztree():
|
||||||
|
|
||||||
# Extract files
|
# Extract files
|
||||||
extract_temp_to_cbin('wiztree.zip', 'WizTree')
|
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
|
# Cleanup
|
||||||
|
remove_item(r'{}\WizTree\wiztree'.format(global_vars['CBinDir']))
|
||||||
remove_from_temp('wiztree.zip')
|
remove_from_temp('wiztree.zip')
|
||||||
|
|
||||||
|
|
||||||
def update_xmplay():
|
def update_xmplay():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('xmplay.exe')
|
kill_process('xmplay.exe')
|
||||||
|
|
@ -834,7 +924,8 @@ def update_xmplay():
|
||||||
remove_from_temp('xmp-rar.zip')
|
remove_from_temp('xmp-rar.zip')
|
||||||
remove_from_temp('WAModern.zip')
|
remove_from_temp('WAModern.zip')
|
||||||
|
|
||||||
## Repairs ##
|
|
||||||
|
# Repairs
|
||||||
def update_adwcleaner():
|
def update_adwcleaner():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('AdwCleaner.exe')
|
kill_process('AdwCleaner.exe')
|
||||||
|
|
@ -848,6 +939,7 @@ def update_adwcleaner():
|
||||||
'AdwCleaner.exe',
|
'AdwCleaner.exe',
|
||||||
SOURCE_URLS['AdwCleaner'])
|
SOURCE_URLS['AdwCleaner'])
|
||||||
|
|
||||||
|
|
||||||
def update_kvrt():
|
def update_kvrt():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('KVRT.exe')
|
kill_process('KVRT.exe')
|
||||||
|
|
@ -861,6 +953,7 @@ def update_kvrt():
|
||||||
'KVRT.exe',
|
'KVRT.exe',
|
||||||
SOURCE_URLS['KVRT'])
|
SOURCE_URLS['KVRT'])
|
||||||
|
|
||||||
|
|
||||||
def update_rkill():
|
def update_rkill():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('RKill.exe')
|
kill_process('RKill.exe')
|
||||||
|
|
@ -875,6 +968,7 @@ def update_rkill():
|
||||||
download_generic(
|
download_generic(
|
||||||
r'{}\RKill'.format(global_vars['CBinDir']), 'RKill.exe', url)
|
r'{}\RKill'.format(global_vars['CBinDir']), 'RKill.exe', url)
|
||||||
|
|
||||||
|
|
||||||
def update_tdsskiller():
|
def update_tdsskiller():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('TDSSKiller.exe')
|
kill_process('TDSSKiller.exe')
|
||||||
|
|
@ -888,7 +982,8 @@ def update_tdsskiller():
|
||||||
'TDSSKiller.exe',
|
'TDSSKiller.exe',
|
||||||
SOURCE_URLS['TDSSKiller'])
|
SOURCE_URLS['TDSSKiller'])
|
||||||
|
|
||||||
## Uninstallers ##
|
|
||||||
|
# Uninstallers
|
||||||
def update_iobit_uninstaller():
|
def update_iobit_uninstaller():
|
||||||
# Stop running processes
|
# Stop running processes
|
||||||
kill_process('IObitUninstallerPortable.exe')
|
kill_process('IObitUninstallerPortable.exe')
|
||||||
|
|
@ -911,5 +1006,8 @@ def update_iobit_uninstaller():
|
||||||
# Cleanup
|
# Cleanup
|
||||||
remove_from_kit('IObitUninstallerPortable.exe')
|
remove_from_kit('IObitUninstallerPortable.exe')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -2,38 +2,8 @@
|
||||||
|
|
||||||
from functions.data import *
|
from functions.data import *
|
||||||
from functions.disk import *
|
from functions.disk import *
|
||||||
|
from settings.windows_setup import *
|
||||||
|
|
||||||
# STATIC VARIABLES
|
|
||||||
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'},
|
|
||||||
]
|
|
||||||
|
|
||||||
def find_windows_image(windows_version):
|
def find_windows_image(windows_version):
|
||||||
"""Search for a Windows source image file, returns dict.
|
"""Search for a Windows source image file, returns dict.
|
||||||
|
|
@ -85,6 +55,7 @@ def find_windows_image(windows_version):
|
||||||
windows_version['Name']))
|
windows_version['Name']))
|
||||||
raise GenericAbort
|
raise GenericAbort
|
||||||
|
|
||||||
|
|
||||||
def format_disk(disk, use_gpt):
|
def format_disk(disk, use_gpt):
|
||||||
"""Format disk for use as a Windows OS disk."""
|
"""Format disk for use as a Windows OS disk."""
|
||||||
if use_gpt:
|
if use_gpt:
|
||||||
|
|
@ -92,6 +63,7 @@ def format_disk(disk, use_gpt):
|
||||||
else:
|
else:
|
||||||
format_mbr(disk)
|
format_mbr(disk)
|
||||||
|
|
||||||
|
|
||||||
def format_gpt(disk):
|
def format_gpt(disk):
|
||||||
"""Format disk for use as a Windows OS disk using the GPT layout."""
|
"""Format disk for use as a Windows OS disk using the GPT layout."""
|
||||||
script = [
|
script = [
|
||||||
|
|
@ -126,6 +98,7 @@ def format_gpt(disk):
|
||||||
# Run
|
# Run
|
||||||
run_diskpart(script)
|
run_diskpart(script)
|
||||||
|
|
||||||
|
|
||||||
def format_mbr(disk):
|
def format_mbr(disk):
|
||||||
"""Format disk for use as a Windows OS disk using the MBR layout."""
|
"""Format disk for use as a Windows OS disk using the MBR layout."""
|
||||||
script = [
|
script = [
|
||||||
|
|
@ -155,14 +128,16 @@ def format_mbr(disk):
|
||||||
# Run
|
# Run
|
||||||
run_diskpart(script)
|
run_diskpart(script)
|
||||||
|
|
||||||
|
|
||||||
def mount_windows_share():
|
def mount_windows_share():
|
||||||
"""Mount the Windows images share unless labeled as already mounted."""
|
"""Mount the Windows images share unless already mounted."""
|
||||||
if not WINDOWS_SERVER['Mounted']:
|
if not WINDOWS_SERVER['Mounted']:
|
||||||
# Mounting read-write in case a backup was done in the same session
|
# 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
|
# and the server was left mounted read-write. This avoids throwing an
|
||||||
# error by trying to mount the same server with multiple credentials.
|
# error by trying to mount the same server with multiple credentials.
|
||||||
mount_network_share(WINDOWS_SERVER, read_write=True)
|
mount_network_share(WINDOWS_SERVER, read_write=True)
|
||||||
|
|
||||||
|
|
||||||
def select_windows_version():
|
def select_windows_version():
|
||||||
"""Select Windows version from a menu, returns dict."""
|
"""Select Windows version from a menu, returns dict."""
|
||||||
actions = [
|
actions = [
|
||||||
|
|
@ -180,6 +155,7 @@ def select_windows_version():
|
||||||
elif selection == 'M':
|
elif selection == 'M':
|
||||||
raise GenericAbort
|
raise GenericAbort
|
||||||
|
|
||||||
|
|
||||||
def setup_windows(windows_image, windows_version):
|
def setup_windows(windows_image, windows_version):
|
||||||
"""Apply a Windows image to W:"""
|
"""Apply a Windows image to W:"""
|
||||||
cmd = [
|
cmd = [
|
||||||
|
|
@ -192,6 +168,7 @@ def setup_windows(windows_image, windows_version):
|
||||||
cmd.extend(windows_image['Glob'])
|
cmd.extend(windows_image['Glob'])
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def setup_windows_re(windows_version, windows_letter='W', tools_letter='T'):
|
def setup_windows_re(windows_version, windows_letter='W', tools_letter='T'):
|
||||||
"""Setup the WinRE partition."""
|
"""Setup the WinRE partition."""
|
||||||
win = r'{}:\Windows'.format(windows_letter)
|
win = r'{}:\Windows'.format(windows_letter)
|
||||||
|
|
@ -210,6 +187,7 @@ def setup_windows_re(windows_version, windows_letter='W', tools_letter='T'):
|
||||||
'/target', win]
|
'/target', win]
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def update_boot_partition(system_letter='S', windows_letter='W', mode='ALL'):
|
def update_boot_partition(system_letter='S', windows_letter='W', mode='ALL'):
|
||||||
"""Setup the Windows boot partition."""
|
"""Setup the Windows boot partition."""
|
||||||
cmd = [
|
cmd = [
|
||||||
|
|
@ -220,6 +198,7 @@ def update_boot_partition(system_letter='S', windows_letter='W', mode='ALL'):
|
||||||
'/f', mode]
|
'/f', mode]
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
|
|
||||||
def wim_contains_image(filename, imagename):
|
def wim_contains_image(filename, imagename):
|
||||||
"""Check if an ESD/WIM contains the specified image, returns bool."""
|
"""Check if an ESD/WIM contains the specified image, returns bool."""
|
||||||
cmd = [
|
cmd = [
|
||||||
|
|
@ -234,5 +213,8 @@ def wim_contains_image(filename, imagename):
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
143
.bin/Scripts/functions/windows_updates.py
Normal file
143
.bin/Scripts/functions/windows_updates.py
Normal file
|
|
@ -0,0 +1,143 @@
|
||||||
|
# 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
|
||||||
|
|
@ -3,52 +3,8 @@
|
||||||
from functions.backup import *
|
from functions.backup import *
|
||||||
from functions.disk import *
|
from functions.disk import *
|
||||||
from functions.windows_setup import *
|
from functions.windows_setup import *
|
||||||
|
from settings.winpe import *
|
||||||
|
|
||||||
# STATIC VARIABLES
|
|
||||||
FAST_COPY_PE_ARGS = [
|
|
||||||
'/cmd=noexist_only',
|
|
||||||
'/utf8',
|
|
||||||
'/skip_empty_dir',
|
|
||||||
'/linkdest',
|
|
||||||
'/no_ui',
|
|
||||||
'/auto_close',
|
|
||||||
'/exclude={}'.format(';'.join(FAST_COPY_EXCLUDES)),
|
|
||||||
]
|
|
||||||
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'],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
def check_pe_tools():
|
def check_pe_tools():
|
||||||
"""Fix tool paths for WinPE layout."""
|
"""Fix tool paths for WinPE layout."""
|
||||||
|
|
@ -61,6 +17,7 @@ def check_pe_tools():
|
||||||
global_vars['Tools']['wimlib-imagex'],
|
global_vars['Tools']['wimlib-imagex'],
|
||||||
re.IGNORECASE)
|
re.IGNORECASE)
|
||||||
|
|
||||||
|
|
||||||
def menu_backup():
|
def menu_backup():
|
||||||
"""Take backup images of partition(s) in the WIM format."""
|
"""Take backup images of partition(s) in the WIM format."""
|
||||||
errors = False
|
errors = False
|
||||||
|
|
@ -211,6 +168,7 @@ def menu_backup():
|
||||||
sleep(30)
|
sleep(30)
|
||||||
pause('\nPress Enter to return to main menu... ')
|
pause('\nPress Enter to return to main menu... ')
|
||||||
|
|
||||||
|
|
||||||
def menu_root():
|
def menu_root():
|
||||||
"""Main WinPE menu."""
|
"""Main WinPE menu."""
|
||||||
check_pe_tools()
|
check_pe_tools()
|
||||||
|
|
@ -249,8 +207,9 @@ def menu_root():
|
||||||
else:
|
else:
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
|
|
||||||
def menu_setup():
|
def menu_setup():
|
||||||
"""Format a disk (MBR/GPT), apply a Windows image, and setup boot files."""
|
"""Format a disk, apply a Windows image, and create boot files."""
|
||||||
errors = False
|
errors = False
|
||||||
other_results = {
|
other_results = {
|
||||||
'Error': {
|
'Error': {
|
||||||
|
|
@ -392,8 +351,8 @@ def menu_setup():
|
||||||
windows_version = windows_version)
|
windows_version = windows_version)
|
||||||
|
|
||||||
# Copy WinPE log(s)
|
# Copy WinPE log(s)
|
||||||
source = r'{}\Info'.format(global_vars['ClientDir'])
|
source = r'{}\Logs'.format(global_vars['ClientDir'])
|
||||||
dest = r'W:\{}\Info'.format(KIT_NAME_SHORT)
|
dest = r'W:\{}\Logs\WinPE'.format(KIT_NAME_SHORT)
|
||||||
shutil.copytree(source, dest)
|
shutil.copytree(source, dest)
|
||||||
|
|
||||||
# Print summary
|
# Print summary
|
||||||
|
|
@ -409,6 +368,7 @@ def menu_setup():
|
||||||
sleep(30)
|
sleep(30)
|
||||||
pause('\nPress Enter to return to main menu... ')
|
pause('\nPress Enter to return to main menu... ')
|
||||||
|
|
||||||
|
|
||||||
def menu_tools():
|
def menu_tools():
|
||||||
"""Tool launcher menu."""
|
"""Tool launcher menu."""
|
||||||
tools = [{'Name': k} for k in sorted(PE_TOOLS.keys())]
|
tools = [{'Name': k} for k in sorted(PE_TOOLS.keys())]
|
||||||
|
|
@ -438,6 +398,7 @@ def menu_tools():
|
||||||
elif (selection == 'M'):
|
elif (selection == 'M'):
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
def select_minidump_path():
|
def select_minidump_path():
|
||||||
"""Select BSOD minidump path from a menu."""
|
"""Select BSOD minidump path from a menu."""
|
||||||
dumps = []
|
dumps = []
|
||||||
|
|
@ -467,5 +428,8 @@ def select_minidump_path():
|
||||||
main_entries = dumps)
|
main_entries = dumps)
|
||||||
return dumps[int(selection) - 1]['Name']
|
return dumps[int(selection) - 1]['Name']
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -1,46 +1,11 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
## Wizard Kit: HW Diagnostics - Menu Launcher
|
## Wizard Kit: HW Diagnostics Launcher
|
||||||
|
|
||||||
|
source launch-in-tmux
|
||||||
|
|
||||||
SESSION_NAME="hw-diags"
|
SESSION_NAME="hw-diags"
|
||||||
WINDOW_NAME="Hardware Diagnostics"
|
WINDOW_NAME="Hardware Diagnostics"
|
||||||
MENU="hw-diags-menu"
|
TMUX_CMD="hw-diags-menu"
|
||||||
|
|
||||||
function ask() {
|
|
||||||
while :; do
|
|
||||||
read -p "$1 [Y/N] " -r answer
|
|
||||||
if echo "$answer" | egrep -iq '^(y|yes|sure)$'; then
|
|
||||||
return 0
|
|
||||||
elif echo "$answer" | egrep -iq '^(n|no|nope)$'; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
die () {
|
|
||||||
echo "$0:" "$@" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check for running session
|
|
||||||
if tmux list-session | grep -q "$SESSION_NAME"; then
|
|
||||||
echo "WARNING: tmux session $SESSION_NAME already exists."
|
|
||||||
echo ""
|
|
||||||
if ask "Connect to current session?"; then
|
|
||||||
# Do nothing, the command below will attach/connect
|
|
||||||
echo ""
|
|
||||||
elif ask "Kill current session and start new session?"; then
|
|
||||||
tmux kill-session -t "$SESSION_NAME" || \
|
|
||||||
die "Failed to kill session: $SESSION_NAME"
|
|
||||||
else
|
|
||||||
echo "Aborted."
|
|
||||||
echo ""
|
|
||||||
echo -n "Press Enter to exit... "
|
|
||||||
read -r
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Start session
|
|
||||||
tmux new-session -A -s "$SESSION_NAME" -n "$WINDOW_NAME" "$MENU" $*
|
|
||||||
|
|
||||||
|
launch_in_tmux "$@"
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
|
|
||||||
|
|
@ -35,8 +34,9 @@ if __name__ == '__main__':
|
||||||
#print_standard('\nDone.')
|
#print_standard('\nDone.')
|
||||||
#pause("Press Enter to exit...")
|
#pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
## Wizard Kit: HW Diagnostics - badblocks
|
|
||||||
|
|
||||||
function usage {
|
|
||||||
echo "Usage: $0 device log-file"
|
|
||||||
echo " e.g. $0 /dev/sda /tmp/tmp.XXXXXXX/badblocks.log"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Bail early
|
|
||||||
if [ ! -b "$1" ]; then
|
|
||||||
usage
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run Badblocks
|
|
||||||
sudo badblocks -sv -e 1 "$1" 2>&1 | tee -a "$2"
|
|
||||||
|
|
||||||
|
|
@ -6,25 +6,61 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.hw_diags import *
|
from functions.hw_diags import *
|
||||||
|
from functions.tmux import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
|
||||||
# Prep
|
|
||||||
clear_screen()
|
|
||||||
|
|
||||||
# Show menu
|
# Show menu
|
||||||
menu_diags(*sys.argv)
|
try:
|
||||||
|
state = State()
|
||||||
|
menu_diags(state, sys.argv)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print_standard(' ')
|
||||||
|
print_warning('Aborted')
|
||||||
|
print_standard(' ')
|
||||||
|
sleep(1)
|
||||||
|
pause('Press Enter to exit...')
|
||||||
|
except SystemExit as sys_exit:
|
||||||
|
tmux_switch_client()
|
||||||
|
exit_script(sys_exit.code)
|
||||||
|
except:
|
||||||
|
# Cleanup
|
||||||
|
tmux_kill_all_panes()
|
||||||
|
|
||||||
|
if DEBUG_MODE:
|
||||||
|
# Custom major exception
|
||||||
|
print_standard(' ')
|
||||||
|
print_error('Major exception')
|
||||||
|
print_warning(SUPPORT_MESSAGE)
|
||||||
|
print(traceback.format_exc())
|
||||||
|
print_log(traceback.format_exc())
|
||||||
|
|
||||||
|
# Save debug reports and upload data
|
||||||
|
try_and_print(
|
||||||
|
message='Saving debug reports...',
|
||||||
|
function=save_debug_reports,
|
||||||
|
state=state, global_vars=global_vars)
|
||||||
|
question = 'Upload crash details to {}?'.format(CRASH_SERVER['Name'])
|
||||||
|
if ENABLED_UPLOAD_DATA and ask(question):
|
||||||
|
try_and_print(
|
||||||
|
message='Uploading Data...',
|
||||||
|
function=upload_logdir,
|
||||||
|
global_vars=global_vars)
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
#print_standard('\nDone.')
|
sleep(1)
|
||||||
#pause("Press Enter to exit...")
|
pause('Press Enter to exit...')
|
||||||
exit_script()
|
exit_script(1)
|
||||||
except SystemExit:
|
|
||||||
pass
|
else:
|
||||||
except:
|
# "Normal" major exception
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# Done
|
||||||
|
tmux_kill_all_panes()
|
||||||
|
tmux_switch_client()
|
||||||
|
exit_script()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -6,15 +6,16 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.network import *
|
from functions.network import *
|
||||||
|
|
||||||
|
|
||||||
def check_connection():
|
def check_connection():
|
||||||
if not is_connected():
|
if not is_connected():
|
||||||
# Raise to cause NS in try_and_print()
|
# Raise to cause NS in try_and_print()
|
||||||
raise Exception
|
raise Exception
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
# Prep
|
# Prep
|
||||||
|
|
@ -39,8 +40,9 @@ if __name__ == '__main__':
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
#pause("Press Enter to exit...")
|
#pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -14,5 +14,6 @@ if [ ! -d "$1" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Run Prime95
|
# Run Prime95
|
||||||
mprime -t | grep -iv --line-buffered 'stress.txt' | tee -a "$1/prime.log"
|
cd "$1"
|
||||||
|
mprime -t | grep -iv --line-buffered 'stress.txt' | tee -a "prime.log"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@
|
||||||
|
|
||||||
BLUE='\033[34m'
|
BLUE='\033[34m'
|
||||||
CLEAR='\033[0m'
|
CLEAR='\033[0m'
|
||||||
|
IFS=$'\n'
|
||||||
|
|
||||||
# List devices
|
# List devices
|
||||||
IFS=$'\n'
|
|
||||||
for line in $(lsblk -do NAME,TRAN,SIZE,VENDOR,MODEL,SERIAL); do
|
for line in $(lsblk -do NAME,TRAN,SIZE,VENDOR,MODEL,SERIAL); do
|
||||||
if [[ "${line:0:4}" == "NAME" ]]; then
|
if [[ "${line:0:4}" == "NAME" ]]; then
|
||||||
echo -e "${BLUE}${line}${CLEAR}"
|
echo -e "${BLUE}${line}${CLEAR}"
|
||||||
|
|
@ -15,6 +15,18 @@ for line in $(lsblk -do NAME,TRAN,SIZE,VENDOR,MODEL,SERIAL); do
|
||||||
done
|
done
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
# List loopback devices
|
||||||
|
if [[ "$(losetup -l | wc -l)" > 0 ]]; then
|
||||||
|
for line in $(losetup -lO NAME,PARTSCAN,RO,BACK-FILE); do
|
||||||
|
if [[ "${line:0:4}" == "NAME" ]]; then
|
||||||
|
echo -e "${BLUE}${line}${CLEAR}"
|
||||||
|
else
|
||||||
|
echo "${line}" | sed -r 's#/dev/(loop[0-9]+)#\1 #'
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
# List partitions
|
# List partitions
|
||||||
for line in $(lsblk -o NAME,SIZE,FSTYPE,LABEL,MOUNTPOINT); do
|
for line in $(lsblk -o NAME,SIZE,FSTYPE,LABEL,MOUNTPOINT); do
|
||||||
if [[ "${line:0:4}" == "NAME" ]]; then
|
if [[ "${line:0:4}" == "NAME" ]]; then
|
||||||
|
|
|
||||||
|
|
@ -105,8 +105,3 @@ echo -e "${BLUE}Drives${CLEAR}"
|
||||||
hw-drive-info | sed 's/^/ /'
|
hw-drive-info | sed 's/^/ /'
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# Sensors
|
|
||||||
echo -e "${BLUE}Sensors${CLEAR}"
|
|
||||||
hw-sensors | sed 's/^/ /'
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,164 +1,10 @@
|
||||||
#!/bin/python3
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
## Wizard Kit: Sensor monitoring tool
|
## Wizard Kit: Sensor monitoring tool
|
||||||
|
|
||||||
import itertools
|
WINDOW_NAME="Hardware Sensors"
|
||||||
import os
|
MONITOR="hw-sensors-monitor"
|
||||||
import shutil
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Init
|
# Start session
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
tmux new-session -n "$WINDOW_NAME" "$MONITOR"
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.common import *
|
|
||||||
from borrowed import sensors
|
|
||||||
|
|
||||||
# STATIC VARIABLES
|
|
||||||
COLORS = {
|
|
||||||
'CLEAR': '\033[0m',
|
|
||||||
'RED': '\033[31m',
|
|
||||||
'GREEN': '\033[32m',
|
|
||||||
'YELLOW': '\033[33m',
|
|
||||||
'ORANGE': '\033[31;1m',
|
|
||||||
'BLUE': '\033[34m'
|
|
||||||
}
|
|
||||||
TEMP_LIMITS = {
|
|
||||||
'GREEN': 60,
|
|
||||||
'YELLOW': 70,
|
|
||||||
'ORANGE': 80,
|
|
||||||
'RED': 90,
|
|
||||||
}
|
|
||||||
|
|
||||||
# REGEX
|
|
||||||
REGEX_COLORS = re.compile(r'\033\[\d+;?1?m')
|
|
||||||
|
|
||||||
def color_temp(temp):
|
|
||||||
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_feature_string(chip, feature):
|
|
||||||
sfs = list(sensors.SubFeatureIterator(chip, feature)) # get a list of all subfeatures
|
|
||||||
label = sensors.get_label(chip, feature)
|
|
||||||
skipname = len(feature.name)+1 # skip common prefix
|
|
||||||
data = {}
|
|
||||||
|
|
||||||
if feature.type != sensors.feature.TEMP:
|
|
||||||
# Skip non-temperature sensors
|
|
||||||
return None
|
|
||||||
|
|
||||||
for sf in sfs:
|
|
||||||
name = sf.name[skipname:].decode("utf-8").strip()
|
|
||||||
val = sensors.get_value(chip, sf.number)
|
|
||||||
if 'alarm' in name:
|
|
||||||
# Skip
|
|
||||||
continue
|
|
||||||
if '--nocolor' in sys.argv:
|
|
||||||
try:
|
|
||||||
temp = float(val)
|
|
||||||
except ValueError:
|
|
||||||
data[name] = ' {}°C'.format(val)
|
|
||||||
else:
|
|
||||||
data[name] = '{}{:2.0f}°C'.format(
|
|
||||||
'-' if temp < 0 else '',
|
|
||||||
temp)
|
|
||||||
else:
|
|
||||||
data[name] = color_temp(val)
|
|
||||||
|
|
||||||
main_temp = data.pop('input', None)
|
|
||||||
if main_temp:
|
|
||||||
list_data = []
|
|
||||||
for item in ['max', 'crit']:
|
|
||||||
if item in data:
|
|
||||||
list_data.append('{}: {}'.format(item, data.pop(item)))
|
|
||||||
list_data.extend(
|
|
||||||
['{}: {}'.format(k, v) for k, v in sorted(data.items())])
|
|
||||||
data_str = '{:18} {} {}'.format(
|
|
||||||
label, main_temp, ', '.join(list_data))
|
|
||||||
else:
|
|
||||||
list_data.extend(sorted(data.items()))
|
|
||||||
list_data = ['{}: {}'.format(item[0], item[1]) for item in list_data]
|
|
||||||
data_str = '{:18} {}'.format(label, ', '.join(list_data))
|
|
||||||
return data_str
|
|
||||||
|
|
||||||
def join_columns(column1, column2, width=55):
|
|
||||||
return '{:<{}}{}'.format(
|
|
||||||
column1,
|
|
||||||
55+len(column1)-len(REGEX_COLORS.sub('', column1)),
|
|
||||||
column2)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
try:
|
|
||||||
# Prep
|
|
||||||
sensors.init()
|
|
||||||
|
|
||||||
# Get sensor data
|
|
||||||
chip_temps = {}
|
|
||||||
for chip in sensors.ChipIterator():
|
|
||||||
chip_name = '{} ({})'.format(
|
|
||||||
sensors.chip_snprintf_name(chip),
|
|
||||||
sensors.get_adapter_name(chip.bus))
|
|
||||||
chip_feats = [get_feature_string(chip, feature)
|
|
||||||
for feature in sensors.FeatureIterator(chip)]
|
|
||||||
# Strip empty/None items
|
|
||||||
chip_feats = [f for f in chip_feats if f]
|
|
||||||
|
|
||||||
if chip_feats:
|
|
||||||
chip_temps[chip_name] = [chip_name, *chip_feats, '']
|
|
||||||
|
|
||||||
# Sort chips
|
|
||||||
sensor_temps = []
|
|
||||||
for chip in [k for k in sorted(chip_temps.keys()) if 'coretemp' in k]:
|
|
||||||
sensor_temps.extend(chip_temps[chip])
|
|
||||||
for chip in sorted(chip_temps.keys()):
|
|
||||||
if 'coretemp' not in chip:
|
|
||||||
sensor_temps.extend(chip_temps[chip])
|
|
||||||
|
|
||||||
# Wrap columns as needed
|
|
||||||
screen_size = shutil.get_terminal_size()
|
|
||||||
rows = screen_size.lines - 1
|
|
||||||
if len(sensor_temps) > rows and screen_size.columns > 55*2:
|
|
||||||
sensor_temps = list(itertools.zip_longest(
|
|
||||||
sensor_temps[:rows], sensor_temps[rows:], fillvalue=''))
|
|
||||||
sensor_temps = [join_columns(a, b) for a, b in sensor_temps]
|
|
||||||
|
|
||||||
# Print data
|
|
||||||
if sensor_temps:
|
|
||||||
for line in sensor_temps:
|
|
||||||
print_standard(line)
|
|
||||||
else:
|
|
||||||
if '--nocolor' in sys.argv:
|
|
||||||
print_standard('WARNING: No sensors found')
|
|
||||||
print_standard('\nPlease monitor temps manually')
|
|
||||||
else:
|
|
||||||
print_warning('WARNING: No sensors found')
|
|
||||||
print_standard('\nPlease monitor temps manually')
|
|
||||||
|
|
||||||
# Done
|
|
||||||
sensors.cleanup()
|
|
||||||
exit_script()
|
|
||||||
except SystemExit:
|
|
||||||
sensors.cleanup()
|
|
||||||
pass
|
|
||||||
except:
|
|
||||||
sensors.cleanup()
|
|
||||||
major_exception()
|
|
||||||
|
|
||||||
|
|
|
||||||
36
.bin/Scripts/hw-sensors-monitor
Executable file
36
.bin/Scripts/hw-sensors-monitor
Executable file
|
|
@ -0,0 +1,36 @@
|
||||||
|
#!/bin/python3
|
||||||
|
#
|
||||||
|
## Wizard Kit: Sensor monitoring tool
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Init
|
||||||
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
from functions.sensors import *
|
||||||
|
from functions.tmux import *
|
||||||
|
init_global_vars(silent=True)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
background = False
|
||||||
|
try:
|
||||||
|
if len(sys.argv) > 1 and os.path.exists(sys.argv[1]):
|
||||||
|
background = True
|
||||||
|
monitor_file = sys.argv[1]
|
||||||
|
monitor_pane = None
|
||||||
|
else:
|
||||||
|
result = run_program(['mktemp'])
|
||||||
|
monitor_file = result.stdout.decode().strip()
|
||||||
|
if not background:
|
||||||
|
monitor_pane = tmux_split_window(
|
||||||
|
percent=1, vertical=True, watch=monitor_file)
|
||||||
|
cmd = ['tmux', 'resize-pane', '-Z', '-t', monitor_pane]
|
||||||
|
run_program(cmd, check=False)
|
||||||
|
monitor_sensors(monitor_pane, monitor_file)
|
||||||
|
exit_script()
|
||||||
|
except SystemExit as sys_exit:
|
||||||
|
exit_script(sys_exit.code)
|
||||||
|
except:
|
||||||
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
@ -33,7 +33,7 @@ for /f "tokens=* usebackq" %%f in (`findstr KIT_NAME_SHORT "%SETTINGS%"`) do (
|
||||||
set "KIT_NAME_SHORT=!_v:~0,-1!"
|
set "KIT_NAME_SHORT=!_v:~0,-1!"
|
||||||
)
|
)
|
||||||
set "client_dir=%systemdrive%\%KIT_NAME_SHORT%"
|
set "client_dir=%systemdrive%\%KIT_NAME_SHORT%"
|
||||||
set "log_dir=%client_dir%\Info\%iso_date%"
|
set "log_dir=%client_dir%\Logs\%iso_date%"
|
||||||
|
|
||||||
:Flags
|
:Flags
|
||||||
set _backups=
|
set _backups=
|
||||||
|
|
@ -45,7 +45,7 @@ set _transfer=
|
||||||
for %%f in (%*) do (
|
for %%f in (%*) do (
|
||||||
if /i "%%f" == "/DEBUG" (@echo on)
|
if /i "%%f" == "/DEBUG" (@echo on)
|
||||||
if /i "%%f" == "/Backups" set _backups=True
|
if /i "%%f" == "/Backups" set _backups=True
|
||||||
if /i "%%f" == "/Info" set _info=True
|
if /i "%%f" == "/Logs" set _logs=True
|
||||||
if /i "%%f" == "/Office" set _office=True
|
if /i "%%f" == "/Office" set _office=True
|
||||||
if /i "%%f" == "/Quarantine" set _quarantine=True
|
if /i "%%f" == "/Quarantine" set _quarantine=True
|
||||||
if /i "%%f" == "/QuickBooks" set _quickbooks=True
|
if /i "%%f" == "/QuickBooks" set _quickbooks=True
|
||||||
|
|
@ -54,7 +54,9 @@ for %%f in (%*) do (
|
||||||
|
|
||||||
:CreateDirs
|
:CreateDirs
|
||||||
if defined _backups mkdir "%client_dir%\Backups">nul 2>&1
|
if defined _backups mkdir "%client_dir%\Backups">nul 2>&1
|
||||||
if defined _info mkdir "%client_dir%\Info">nul 2>&1
|
if defined _logs (
|
||||||
|
mkdir "%log_dir%\%KIT_NAME_FULL%">nul 2>&1
|
||||||
|
mkdir "%log_dir%\Tools">nul 2>&1)
|
||||||
if defined _office mkdir "%client_dir%\Office">nul 2>&1
|
if defined _office mkdir "%client_dir%\Office">nul 2>&1
|
||||||
if defined _quarantine mkdir "%client_dir%\Quarantine">nul 2>&1
|
if defined _quarantine mkdir "%client_dir%\Quarantine">nul 2>&1
|
||||||
if defined _quickbooks mkdir "%client_dir%\QuickBooks">nul 2>&1
|
if defined _quickbooks mkdir "%client_dir%\QuickBooks">nul 2>&1
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,11 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.setup import *
|
from functions.setup import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: SW Bundle Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: SW Bundle Tool'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\Install SW Bundle.log'.format(**global_vars)
|
set_log_file('Install SW Bundle.log')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
|
|
@ -26,7 +25,6 @@ if __name__ == '__main__':
|
||||||
'UnsupportedOSError': 'Unsupported OS',
|
'UnsupportedOSError': 'Unsupported OS',
|
||||||
}}
|
}}
|
||||||
answer_extensions = ask('Install Extensions?')
|
answer_extensions = ask('Install Extensions?')
|
||||||
answer_adobe_reader = ask('Install Adobe Reader?')
|
|
||||||
answer_vcr = ask('Install Visual C++ Runtimes?')
|
answer_vcr = ask('Install Visual C++ Runtimes?')
|
||||||
answer_ninite = ask('Install Ninite Bundle?')
|
answer_ninite = ask('Install Ninite Bundle?')
|
||||||
if answer_ninite and global_vars['OS']['Version'] in ['7']:
|
if answer_ninite and global_vars['OS']['Version'] in ['7']:
|
||||||
|
|
@ -36,17 +34,16 @@ if __name__ == '__main__':
|
||||||
answer_mse = False
|
answer_mse = False
|
||||||
|
|
||||||
print_info('Installing Programs')
|
print_info('Installing Programs')
|
||||||
if answer_adobe_reader:
|
|
||||||
try_and_print(message='Adobe Reader DC...',
|
|
||||||
function=install_adobe_reader, other_results=other_results)
|
|
||||||
if answer_vcr:
|
if answer_vcr:
|
||||||
install_vcredists()
|
install_vcredists()
|
||||||
if answer_ninite:
|
if answer_ninite:
|
||||||
try_and_print(message='Ninite bundle...',
|
result = try_and_print(message='Ninite bundle...',
|
||||||
function=install_ninite_bundle, cs='Started',
|
function=install_ninite_bundle, cs='Started',
|
||||||
mse=answer_mse, other_results=other_results)
|
mse=answer_mse, other_results=other_results)
|
||||||
|
for proc in result['Out']:
|
||||||
|
# Wait for all processes to finish
|
||||||
|
proc.wait()
|
||||||
if answer_extensions:
|
if answer_extensions:
|
||||||
wait_for_process('ninite.exe')
|
|
||||||
print_info('Installing Extensions')
|
print_info('Installing Extensions')
|
||||||
try_and_print(message='Classic Shell skin...',
|
try_and_print(message='Classic Shell skin...',
|
||||||
function=install_classicstart_skin,
|
function=install_classicstart_skin,
|
||||||
|
|
@ -58,7 +55,9 @@ if __name__ == '__main__':
|
||||||
other_results=other_results)
|
other_results=other_results)
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,11 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.setup import *
|
from functions.setup import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: Install Visual C++ Runtimes'.format(KIT_NAME_FULL))
|
os.system('title {}: Install Visual C++ Runtimes'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\Install Visual C++ Runtimes.log'.format(**global_vars)
|
set_log_file('Install Visual C++ Runtimes.log')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
|
|
@ -28,7 +27,9 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
64
.bin/Scripts/launch-in-tmux
Executable file
64
.bin/Scripts/launch-in-tmux
Executable file
|
|
@ -0,0 +1,64 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
## Wizard Kit: TMUX Launcher
|
||||||
|
|
||||||
|
function ask() {
|
||||||
|
while :; do
|
||||||
|
read -p "$1 [Y/N] " -r answer
|
||||||
|
if echo "$answer" | grep -Eiq '^(y|yes|sure)$'; then
|
||||||
|
return 0
|
||||||
|
elif echo "$answer" | grep -Eiq '^(n|no|nope)$'; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
die () {
|
||||||
|
echo "$0:" "$@" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function launch_in_tmux() {
|
||||||
|
# Check for required vars
|
||||||
|
[[ -n "${SESSION_NAME:-}" ]] || die "Required variable missing (SESSION_NAME)"
|
||||||
|
[[ -n "${WINDOW_NAME:-}" ]] || die "Required variable missing (WINDOW_NAME)"
|
||||||
|
[[ -n "${TMUX_CMD:-}" ]] || die "Required variable missing (TMUX_CMD)"
|
||||||
|
|
||||||
|
# Check for running session
|
||||||
|
if tmux list-session | grep -q "$SESSION_NAME"; then
|
||||||
|
echo "WARNING: tmux session $SESSION_NAME already exists."
|
||||||
|
echo ""
|
||||||
|
if ask "Connect to current session?"; then
|
||||||
|
if [[ -n "${TMUX:-}" ]]; then
|
||||||
|
# Running inside TMUX, switch to session
|
||||||
|
tmux switch-client -t "$SESSION_NAME"
|
||||||
|
else
|
||||||
|
# Running outside TMUX, attach to session
|
||||||
|
tmux attach-session -t "$SESSION_NAME"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
elif ask "Kill current session and start new session?"; then
|
||||||
|
tmux kill-session -t "$SESSION_NAME" || \
|
||||||
|
die "Failed to kill session: $SESSION_NAME"
|
||||||
|
else
|
||||||
|
echo "Aborted."
|
||||||
|
echo ""
|
||||||
|
echo -n "Press Enter to exit... "
|
||||||
|
read -r
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start/Rename session
|
||||||
|
if [[ -n "${TMUX:-}" ]]; then
|
||||||
|
# Running inside TMUX, rename session/window and open the menu
|
||||||
|
tmux rename-session "$SESSION_NAME"
|
||||||
|
tmux rename-window "$WINDOW_NAME"
|
||||||
|
"$TMUX_CMD" "$@"
|
||||||
|
tmux rename-session "${SESSION_NAME}_DONE"
|
||||||
|
tmux rename-window "${WINDOW_NAME}_DONE"
|
||||||
|
else
|
||||||
|
# Running outside TMUX, start/attach to session
|
||||||
|
tmux new-session -s "$SESSION_NAME" -n "$WINDOW_NAME" "$TMUX_CMD" "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
@ -6,8 +6,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.data import *
|
from functions.data import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
|
|
||||||
|
|
@ -31,8 +30,9 @@ if __name__ == '__main__':
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
popen_program(['nohup', 'thunar', '/media'], pipe=True)
|
popen_program(['nohup', 'thunar', '/media'], pipe=True)
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.data import *
|
from functions.data import *
|
||||||
from functions.network import *
|
from functions.network import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
|
|
@ -17,12 +16,9 @@ if __name__ == '__main__':
|
||||||
# Prep
|
# Prep
|
||||||
clear_screen()
|
clear_screen()
|
||||||
|
|
||||||
# Connect
|
|
||||||
connect_to_network()
|
|
||||||
|
|
||||||
# Mount
|
# Mount
|
||||||
if is_connected():
|
if is_connected():
|
||||||
mount_backup_shares()
|
mount_backup_shares(read_write=True)
|
||||||
else:
|
else:
|
||||||
# Couldn't connect
|
# Couldn't connect
|
||||||
print_error('ERROR: No network connectivity.')
|
print_error('ERROR: No network connectivity.')
|
||||||
|
|
@ -31,8 +27,9 @@ if __name__ == '__main__':
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
#pause("Press Enter to exit...")
|
#pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -15,20 +15,21 @@ USAGE = '''Usage: {script} <search-terms>...
|
||||||
the search-terms provided (case-insensitive).'''.format(script=__file__)
|
the search-terms provided (case-insensitive).'''.format(script=__file__)
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.network import *
|
from functions.network import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
|
|
||||||
REGEX_DOC_FILES = re.compile(r'\.docx?$', re.IGNORECASE)
|
REGEX_DOC_FILES = re.compile(r'\.docx?$', re.IGNORECASE)
|
||||||
|
|
||||||
|
|
||||||
def scan_for_docs(path):
|
def scan_for_docs(path):
|
||||||
for entry in os.scandir(path):
|
for entry in os.scandir(path):
|
||||||
if entry.is_dir(follow_symlinks=False):
|
if entry.is_dir(follow_symlinks=False):
|
||||||
yield from scantree(entry.path)
|
yield from scan_for_docs(entry.path)
|
||||||
elif entry.is_file and REGEX_DOC_FILES.search(entry.name):
|
elif entry.is_file and REGEX_DOC_FILES.search(entry.name):
|
||||||
yield entry
|
yield entry
|
||||||
|
|
||||||
|
|
||||||
def scan_file(file_path, search):
|
def scan_file(file_path, search):
|
||||||
match = False
|
match = False
|
||||||
try:
|
try:
|
||||||
|
|
@ -45,6 +46,7 @@ def scan_file(file_path, search):
|
||||||
|
|
||||||
return entry.path if match else None
|
return entry.path if match else None
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
# Prep
|
# Prep
|
||||||
|
|
@ -74,8 +76,9 @@ if __name__ == '__main__':
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
#pause("Press Enter to exit...")
|
#pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
15
.bin/Scripts/pacinit
Executable file
15
.bin/Scripts/pacinit
Executable file
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
## Wizard Kit: 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
|
||||||
|
sudo sed -i -r "s/^(SigLevel = Optional TrustAll)/#\1/" /etc/pacman.conf
|
||||||
|
sudo sed -i -r "s/^(Server = )/#\1/" /etc/pacman.conf
|
||||||
|
|
||||||
|
# Disable signature checks
|
||||||
|
sudo sed -i -r "s/^SigLevel.*/SigLevel = Never/" /etc/pacman.conf
|
||||||
|
|
||||||
|
# Refresh package databases
|
||||||
|
sudo pacman -Sy
|
||||||
|
|
||||||
150
.bin/Scripts/photorec-sort
Executable file
150
.bin/Scripts/photorec-sort
Executable file
|
|
@ -0,0 +1,150 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
## sort photorec results into something usefull
|
||||||
|
|
||||||
|
## Set paths
|
||||||
|
recup_dir="${1%/}"
|
||||||
|
[ -n "$recup_dir" ] || recup_dir="."
|
||||||
|
recup_dir="$(realpath "$recup_dir")"
|
||||||
|
out_dir="$recup_dir/Recovered"
|
||||||
|
bad_dir="$recup_dir/Corrupt"
|
||||||
|
|
||||||
|
## Test path before starting (using current dir if not specified)
|
||||||
|
for d in $recup_dir/recup*; do
|
||||||
|
### Source: http://stackoverflow.com/a/6364244
|
||||||
|
## Check if the glob gets expanded to existing files.
|
||||||
|
## If not, f here will be exactly the pattern above
|
||||||
|
## and the exists test will evaluate to false.
|
||||||
|
[ -e "$d" ] && echo "Found recup folder(s)" || {
|
||||||
|
echo "ERROR: No recup folders found"
|
||||||
|
echo "Usage: $0 recup_dir"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
## This is all we needed to know, so we can break after the first iteration
|
||||||
|
break
|
||||||
|
done
|
||||||
|
|
||||||
|
# Hard link files into folders by type
|
||||||
|
for d in $recup_dir/recup*; do
|
||||||
|
if [ -d "$d" ]; then
|
||||||
|
echo "Linking $d"
|
||||||
|
pushd $d >/dev/null
|
||||||
|
find -type f | while read k; do
|
||||||
|
file="$(basename "$k")"
|
||||||
|
src="$(realpath "$k")"
|
||||||
|
ext="$(echo "${file##*.}" | tr '[:upper:]' '[:lower:]')"
|
||||||
|
ext_dir="$out_dir/$ext"
|
||||||
|
if [ "${file##*.}" = "$file" ]; then
|
||||||
|
ext_dir="$out_dir/_MISC_"
|
||||||
|
elif [ "$ext" = "jpg" ] && [ "${file:0:1}" = "t" ]; then
|
||||||
|
ext_dir="$out_dir/jpg-thumbnail"
|
||||||
|
fi
|
||||||
|
#echo " $file -> $ext_dir"
|
||||||
|
[ -d "$ext_dir" ] || mkdir -p "$ext_dir"
|
||||||
|
ln "$src" "$ext_dir"
|
||||||
|
done
|
||||||
|
popd >/dev/null
|
||||||
|
else
|
||||||
|
echo "ERROR: '$d' not a directory"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
## Check the files output by photorec for corruption
|
||||||
|
pushd "$out_dir" >/dev/null
|
||||||
|
|
||||||
|
# Check archives with 7-Zip
|
||||||
|
#for d in 7z bz2 gz lzh lzo rar tar xz zip; do
|
||||||
|
# if [ -d "$d" ]; then
|
||||||
|
# echo "Checking $d files"
|
||||||
|
# pushd "$d" >/dev/null
|
||||||
|
# for f in *; do
|
||||||
|
# if ! 7z t "$f" >/dev/null 2>&1; then
|
||||||
|
# #echo " BAD: $f"
|
||||||
|
# [ -d "$bad_dir/$d" ] || mkdir -p "$bad_dir/$d"
|
||||||
|
# mv -n "$f" "$bad_dir/$d/$f"
|
||||||
|
# fi
|
||||||
|
# done
|
||||||
|
# popd >/dev/null
|
||||||
|
# fi
|
||||||
|
#done
|
||||||
|
|
||||||
|
# Check Audio/Video files with ffprobe
|
||||||
|
for d in avi flac flv m4a m4p m4v mkv mid mov mp2 mp3 mp4 mpg mpg2 ogg ts vob wav; do
|
||||||
|
if [ -d "$d" ]; then
|
||||||
|
echo "Checking $d files"
|
||||||
|
pushd "$d" >/dev/null
|
||||||
|
for f in *; do
|
||||||
|
if ! ffprobe "$f" >/dev/null 2>&1; then
|
||||||
|
#echo " BAD: $f"
|
||||||
|
[ -d "$bad_dir/$d" ] || mkdir -p "$bad_dir/$d"
|
||||||
|
mv -n "$f" "$bad_dir/$d/$f"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
popd >/dev/null
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check .doc files with antiword
|
||||||
|
if [ -d "doc" ]; then
|
||||||
|
echo "Checking doc files"
|
||||||
|
pushd "doc" >/dev/null
|
||||||
|
for f in *doc; do
|
||||||
|
if ! antiword "$f" >/dev/null 2>&1; then
|
||||||
|
#echo " BAD: $f"
|
||||||
|
[ -d "$bad_dir/doc" ] || mkdir -p "$bad_dir/doc"
|
||||||
|
mv -n "$f" "$bad_dir/doc/$f"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
popd >/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check .docx files with 7z and grep
|
||||||
|
if [ -d "docx" ]; then
|
||||||
|
echo "Checking docx files"
|
||||||
|
pushd "docx" >/dev/null
|
||||||
|
for f in *docx; do
|
||||||
|
if ! 7z l "$f" | grep -q -s "word/document.xml"; then
|
||||||
|
#echo " BAD: $f"
|
||||||
|
[ -d "$bad_dir/docx" ] || mkdir -p "$bad_dir/docx"
|
||||||
|
mv -n "$f" "$bad_dir/docx/$f"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
popd >/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Sort pictures by date (only for common camera formats)
|
||||||
|
for d in jpg mrw orf raf raw rw2 tif x3f; do
|
||||||
|
if [ -d "$d" ]; then
|
||||||
|
echo "Sorting $d files by date"
|
||||||
|
pushd "$d" >/dev/null
|
||||||
|
for f in *; do
|
||||||
|
date_dir="$(date -d "$(stat -c %y "$f")" +"%F")"
|
||||||
|
[ -d "$date_dir" ] || mkdir "$date_dir"
|
||||||
|
mv -n "$f" "$date_dir/"
|
||||||
|
done
|
||||||
|
popd >/dev/null
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Sort mov files by encoded date
|
||||||
|
if [ -d "mov" ]; then
|
||||||
|
echo "Sorting mov files by date"
|
||||||
|
pushd "mov" >/dev/null
|
||||||
|
for f in *mov; do
|
||||||
|
enc_date="$(mediainfo "$f" | grep -i "Encoded date" | head -1 | sed -r 's/.*: //')"
|
||||||
|
date_dir="$(date -d "$enc_date" +"%F")"
|
||||||
|
echo "$date_dir" | grep -E -q -s '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' || date_dir="Unknown Date"
|
||||||
|
[ -d "$date_dir" ] || mkdir "$date_dir"
|
||||||
|
mv -n "$f" "$date_dir/"
|
||||||
|
done
|
||||||
|
popd >/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
## sort audio files by tags
|
||||||
|
|
||||||
|
## sort matroska files by metadata
|
||||||
|
|
||||||
|
## return to original dir
|
||||||
|
popd >/dev/null
|
||||||
|
|
||||||
|
|
@ -18,6 +18,4 @@ if udevil mount $DEVICE; then
|
||||||
else
|
else
|
||||||
echo "Failed"
|
echo "Failed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sleep 2s
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.safemode import *
|
from functions.safemode import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
|
||||||
|
|
@ -32,7 +31,9 @@ if __name__ == '__main__':
|
||||||
pause('Press Enter to reboot...')
|
pause('Press Enter to reboot...')
|
||||||
reboot()
|
reboot()
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.safemode import *
|
from functions.safemode import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
|
||||||
|
|
@ -32,7 +31,9 @@ if __name__ == '__main__':
|
||||||
pause('Press Enter to reboot...')
|
pause('Press Enter to reboot...')
|
||||||
reboot()
|
reboot()
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
99
.bin/Scripts/settings/browsers.py
Normal file
99
.bin/Scripts/settings/browsers.py
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
# 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
|
||||||
37
.bin/Scripts/settings/cleanup.py
Normal file
37
.bin/Scripts/settings/cleanup.py
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
'''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.")
|
||||||
105
.bin/Scripts/settings/data.py
Normal file
105
.bin/Scripts/settings/data.py
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
# 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
|
||||||
61
.bin/Scripts/settings/ddrescue.py
Normal file
61
.bin/Scripts/settings/ddrescue.py
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
# 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<key>\S+):\s+'
|
||||||
|
r'(?P<size>\d+)\s+'
|
||||||
|
r'(?P<unit>[PTGMKB])i?B?',
|
||||||
|
re.IGNORECASE,
|
||||||
|
)
|
||||||
|
REGEX_REMAINING_TIME = re.compile(
|
||||||
|
r'remaining time:'
|
||||||
|
r'\s*((?P<days>\d+)d)?'
|
||||||
|
r'\s*((?P<hours>\d+)h)?'
|
||||||
|
r'\s*((?P<minutes>\d+)m)?'
|
||||||
|
r'\s*((?P<seconds>\d+)s)?'
|
||||||
|
r'\s*(?P<na>n/a)?',
|
||||||
|
re.IGNORECASE
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
112
.bin/Scripts/settings/hw_diags.py
Normal file
112
.bin/Scripts/settings/hw_diags.py
Normal file
|
|
@ -0,0 +1,112 @@
|
||||||
|
# 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 = (
|
||||||
|
('Error', 'RED'),
|
||||||
|
('Maximum', 'PURPLE'),
|
||||||
|
('Warning', 'YELLOW'),
|
||||||
|
)
|
||||||
|
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
|
||||||
58
.bin/Scripts/settings/info.py
Normal file
58
.bin/Scripts/settings/info.py
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
# 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
|
||||||
|
|
@ -1,29 +1,20 @@
|
||||||
# Wizard Kit: Settings - Launchers
|
'''Wizard Kit: Settings - Launchers'''
|
||||||
|
# pylint: disable=line-too-long
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
||||||
LAUNCHERS = {
|
LAUNCHERS = {
|
||||||
r'(Root)': {
|
r'(Root)': {
|
||||||
'Activate Windows': {
|
|
||||||
'L_TYPE': 'PyScript',
|
|
||||||
'L_PATH': 'Scripts',
|
|
||||||
'L_ITEM': 'activate.py',
|
|
||||||
'L_ELEV': 'True',
|
|
||||||
},
|
|
||||||
'System Checklist': {
|
|
||||||
'L_TYPE': 'PyScript',
|
|
||||||
'L_PATH': 'Scripts',
|
|
||||||
'L_ITEM': 'system_checklist.py',
|
|
||||||
'L_ELEV': 'True',
|
|
||||||
},
|
|
||||||
'System Diagnostics': {
|
'System Diagnostics': {
|
||||||
'L_TYPE': 'PyScript',
|
'L_TYPE': 'PyScript',
|
||||||
'L_PATH': 'Scripts',
|
'L_PATH': 'Scripts',
|
||||||
'L_ITEM': 'system_diagnostics.py',
|
'L_ITEM': 'system_diagnostics.py',
|
||||||
'L_ELEV': 'True',
|
'L_ELEV': 'True',
|
||||||
},
|
},
|
||||||
'User Checklist': {
|
'System Setup': {
|
||||||
'L_TYPE': 'PyScript',
|
'L_TYPE': 'PyScript',
|
||||||
'L_PATH': 'Scripts',
|
'L_PATH': 'Scripts',
|
||||||
'L_ITEM': 'user_checklist.py',
|
'L_ITEM': 'system_setup.py',
|
||||||
|
'L_ELEV': 'True',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
r'Data Recovery': {
|
r'Data Recovery': {
|
||||||
|
|
@ -49,12 +40,13 @@ LAUNCHERS = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
r'Data Transfers': {
|
r'Data Transfers': {
|
||||||
|
# pylint: disable=bad-continuation
|
||||||
'FastCopy (as ADMIN)': {
|
'FastCopy (as ADMIN)': {
|
||||||
'L_TYPE': 'Executable',
|
'L_TYPE': 'Executable',
|
||||||
'L_PATH': 'FastCopy',
|
'L_PATH': 'FastCopy',
|
||||||
'L_ITEM': 'FastCopy.exe',
|
'L_ITEM': 'FastCopy.exe',
|
||||||
'L_ARGS': (
|
'L_ARGS': (
|
||||||
r' /logfile=%log_dir%\FastCopy.log'
|
r' /logfile=%log_dir%\Tools\FastCopy.log'
|
||||||
r' /cmd=noexist_only'
|
r' /cmd=noexist_only'
|
||||||
r' /utf8'
|
r' /utf8'
|
||||||
r' /skip_empty_dir'
|
r' /skip_empty_dir'
|
||||||
|
|
@ -94,7 +86,7 @@ LAUNCHERS = {
|
||||||
),
|
),
|
||||||
'L_ELEV': 'True',
|
'L_ELEV': 'True',
|
||||||
'Extra Code': [
|
'Extra Code': [
|
||||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info /Transfer',
|
r'call "%bin%\Scripts\init_client_dir.cmd" /Logs /Transfer',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'FastCopy': {
|
'FastCopy': {
|
||||||
|
|
@ -102,7 +94,7 @@ LAUNCHERS = {
|
||||||
'L_PATH': 'FastCopy',
|
'L_PATH': 'FastCopy',
|
||||||
'L_ITEM': 'FastCopy.exe',
|
'L_ITEM': 'FastCopy.exe',
|
||||||
'L_ARGS': (
|
'L_ARGS': (
|
||||||
r' /logfile=%log_dir%\FastCopy.log'
|
r' /logfile=%log_dir%\Tools\FastCopy.log'
|
||||||
r' /cmd=noexist_only'
|
r' /cmd=noexist_only'
|
||||||
r' /utf8'
|
r' /utf8'
|
||||||
r' /skip_empty_dir'
|
r' /skip_empty_dir'
|
||||||
|
|
@ -141,7 +133,7 @@ LAUNCHERS = {
|
||||||
r' /to=%client_dir%\Transfer_%iso_date%\ '
|
r' /to=%client_dir%\Transfer_%iso_date%\ '
|
||||||
),
|
),
|
||||||
'Extra Code': [
|
'Extra Code': [
|
||||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info /Transfer',
|
r'call "%bin%\Scripts\init_client_dir.cmd" /Logs /Transfer',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'KVRT': {
|
'KVRT': {
|
||||||
|
|
@ -251,10 +243,10 @@ LAUNCHERS = {
|
||||||
'L_TYPE': 'Executable',
|
'L_TYPE': 'Executable',
|
||||||
'L_PATH': 'erunt',
|
'L_PATH': 'erunt',
|
||||||
'L_ITEM': 'ERUNT.EXE',
|
'L_ITEM': 'ERUNT.EXE',
|
||||||
'L_ARGS': '%client_dir%\Backups\%iso_date%\Registry sysreg curuser otherusers',
|
'L_ARGS': r'%client_dir%\Backups\Registry\%iso_date% sysreg curuser otherusers',
|
||||||
'L_ELEV': 'True',
|
'L_ELEV': 'True',
|
||||||
'Extra Code': [
|
'Extra Code': [
|
||||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
|
r'call "%bin%\Scripts\init_client_dir.cmd" /Logs',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'HitmanPro': {
|
'HitmanPro': {
|
||||||
|
|
@ -262,7 +254,7 @@ LAUNCHERS = {
|
||||||
'L_PATH': 'HitmanPro',
|
'L_PATH': 'HitmanPro',
|
||||||
'L_ITEM': 'HitmanPro.exe',
|
'L_ITEM': 'HitmanPro.exe',
|
||||||
'Extra Code': [
|
'Extra Code': [
|
||||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
|
r'call "%bin%\Scripts\init_client_dir.cmd" /Logs',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'HWiNFO (Sensors)': {
|
'HWiNFO (Sensors)': {
|
||||||
|
|
@ -281,13 +273,13 @@ LAUNCHERS = {
|
||||||
r'Drivers': {
|
r'Drivers': {
|
||||||
'Intel RST (Current Release)': {
|
'Intel RST (Current Release)': {
|
||||||
'L_TYPE': 'Executable',
|
'L_TYPE': 'Executable',
|
||||||
'L_PATH': '_Drivers\Intel RST',
|
'L_PATH': r'_Drivers\Intel RST',
|
||||||
'L_ITEM': 'SetupRST_16.5.exe',
|
'L_ITEM': 'SetupRST_17.2.exe',
|
||||||
'L_7ZIP': 'SetupRST_16.5.exe',
|
'L_7ZIP': 'SetupRST_17.2.exe',
|
||||||
},
|
},
|
||||||
'Intel RST (Previous Releases)': {
|
'Intel RST (Previous Releases)': {
|
||||||
'L_TYPE': 'Folder',
|
'L_TYPE': 'Folder',
|
||||||
'L_PATH': '_Drivers\Intel RST',
|
'L_PATH': r'_Drivers\Intel RST',
|
||||||
'L_ITEM': '.',
|
'L_ITEM': '.',
|
||||||
'L_NCMD': 'True',
|
'L_NCMD': 'True',
|
||||||
},
|
},
|
||||||
|
|
@ -303,7 +295,7 @@ LAUNCHERS = {
|
||||||
},
|
},
|
||||||
'Snappy Driver Installer Origin': {
|
'Snappy Driver Installer Origin': {
|
||||||
'L_TYPE': 'Executable',
|
'L_TYPE': 'Executable',
|
||||||
'L_PATH': '_Drivers\SDIO',
|
'L_PATH': r'_Drivers\SDIO',
|
||||||
'L_ITEM': 'SDIO.exe',
|
'L_ITEM': 'SDIO.exe',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -357,39 +349,65 @@ LAUNCHERS = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
r'Installers\Extras\Office\2016': {
|
r'Installers\Extras\Office\2016': {
|
||||||
'Home and Business 2016 (x32)': {
|
'Home and Business (x32)': {
|
||||||
'L_TYPE': 'Office',
|
'L_TYPE': 'Office',
|
||||||
'L_PATH': '2016',
|
'L_PATH': '2016',
|
||||||
'L_ITEM': 'hb_32.xml',
|
'L_ITEM': '2016_hb_32.xml',
|
||||||
'L_NCMD': 'True',
|
'L_NCMD': 'True',
|
||||||
},
|
},
|
||||||
'Home and Business 2016 (x64)': {
|
'Home and Business (x64)': {
|
||||||
'L_TYPE': 'Office',
|
'L_TYPE': 'Office',
|
||||||
'L_PATH': '2016',
|
'L_PATH': '2016',
|
||||||
'L_ITEM': 'hb_64.xml',
|
'L_ITEM': '2016_hb_64.xml',
|
||||||
'L_NCMD': 'True',
|
'L_NCMD': 'True',
|
||||||
},
|
},
|
||||||
'Home and Student 2016 (x32)': {
|
'Home and Student (x32)': {
|
||||||
'L_TYPE': 'Office',
|
'L_TYPE': 'Office',
|
||||||
'L_PATH': '2016',
|
'L_PATH': '2016',
|
||||||
'L_ITEM': 'hs_32.xml',
|
'L_ITEM': '2016_hs_32.xml',
|
||||||
'L_NCMD': 'True',
|
'L_NCMD': 'True',
|
||||||
},
|
},
|
||||||
'Home and Student 2016 (x64)': {
|
'Home and Student (x64)': {
|
||||||
'L_TYPE': 'Office',
|
'L_TYPE': 'Office',
|
||||||
'L_PATH': '2016',
|
'L_PATH': '2016',
|
||||||
'L_ITEM': 'hs_64.xml',
|
'L_ITEM': '2016_hs_64.xml',
|
||||||
'L_NCMD': 'True',
|
'L_NCMD': 'True',
|
||||||
},
|
},
|
||||||
'Office 365 2016 (x32)': {
|
},
|
||||||
|
r'Installers\Extras\Office\2019': {
|
||||||
|
'Home and Business (x32)': {
|
||||||
'L_TYPE': 'Office',
|
'L_TYPE': 'Office',
|
||||||
'L_PATH': '2016',
|
'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_ITEM': '365_32.xml',
|
||||||
'L_NCMD': 'True',
|
'L_NCMD': 'True',
|
||||||
},
|
},
|
||||||
'Office 365 2016 (x64)': {
|
'Office 365 (x64)': {
|
||||||
'L_TYPE': 'Office',
|
'L_TYPE': 'Office',
|
||||||
'L_PATH': '2016',
|
'L_PATH': '2019',
|
||||||
'L_ITEM': '365_64.xml',
|
'L_ITEM': '365_64.xml',
|
||||||
'L_NCMD': 'True',
|
'L_NCMD': 'True',
|
||||||
},
|
},
|
||||||
|
|
@ -403,6 +421,12 @@ LAUNCHERS = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
r'Misc': {
|
r'Misc': {
|
||||||
|
'Activate Windows': {
|
||||||
|
'L_TYPE': 'PyScript',
|
||||||
|
'L_PATH': 'Scripts',
|
||||||
|
'L_ITEM': 'activate.py',
|
||||||
|
'L_ELEV': 'True',
|
||||||
|
},
|
||||||
'Cleanup CBS Temp Files': {
|
'Cleanup CBS Temp Files': {
|
||||||
'L_TYPE': 'PyScript',
|
'L_TYPE': 'PyScript',
|
||||||
'L_PATH': 'Scripts',
|
'L_PATH': 'Scripts',
|
||||||
|
|
@ -420,6 +444,20 @@ LAUNCHERS = {
|
||||||
'L_PATH': 'ConEmu',
|
'L_PATH': 'ConEmu',
|
||||||
'L_ITEM': 'ConEmu.exe',
|
'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': {
|
'Enter SafeMode': {
|
||||||
'L_TYPE': 'PyScript',
|
'L_TYPE': 'PyScript',
|
||||||
'L_PATH': 'Scripts',
|
'L_PATH': 'Scripts',
|
||||||
|
|
@ -455,16 +493,11 @@ LAUNCHERS = {
|
||||||
'L_ITEM': 'WizTree.exe',
|
'L_ITEM': 'WizTree.exe',
|
||||||
'L_ELEV': 'True',
|
'L_ELEV': 'True',
|
||||||
},
|
},
|
||||||
'Update Kit': {
|
|
||||||
'L_TYPE': 'PyScript',
|
|
||||||
'L_PATH': 'Scripts',
|
|
||||||
'L_ITEM': 'update_kit.py',
|
|
||||||
},
|
|
||||||
'XMPlay': {
|
'XMPlay': {
|
||||||
'L_TYPE': 'Executable',
|
'L_TYPE': 'Executable',
|
||||||
'L_PATH': 'XMPlay',
|
'L_PATH': 'XMPlay',
|
||||||
'L_ITEM': 'xmplay.exe',
|
'L_ITEM': 'xmplay.exe',
|
||||||
'L_ARGS': '"%bin%\XMPlay\music.7z"',
|
'L_ARGS': r'"%bin%\XMPlay\music.7z"',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
r'Repairs': {
|
r'Repairs': {
|
||||||
|
|
@ -524,8 +557,10 @@ LAUNCHERS = {
|
||||||
'L_TYPE': 'Executable',
|
'L_TYPE': 'Executable',
|
||||||
'L_PATH': 'RKill',
|
'L_PATH': 'RKill',
|
||||||
'L_ITEM': 'RKill.exe',
|
'L_ITEM': 'RKill.exe',
|
||||||
|
'L_ARGS': r'-s -l %log_dir%\Tools\RKill.log',
|
||||||
|
'L_ELEV': 'True',
|
||||||
'Extra Code': [
|
'Extra Code': [
|
||||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
|
r'call "%bin%\Scripts\init_client_dir.cmd" /Logs',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'SFC Scan': {
|
'SFC Scan': {
|
||||||
|
|
@ -539,7 +574,7 @@ LAUNCHERS = {
|
||||||
'L_PATH': 'TDSSKiller',
|
'L_PATH': 'TDSSKiller',
|
||||||
'L_ITEM': 'TDSSKiller.exe',
|
'L_ITEM': 'TDSSKiller.exe',
|
||||||
'L_ARGS': (
|
'L_ARGS': (
|
||||||
r' -l %log_dir%\TDSSKiller.log'
|
r' -l %log_dir%\Tools\TDSSKiller.log'
|
||||||
r' -qpath %q_dir%'
|
r' -qpath %q_dir%'
|
||||||
r' -accepteula'
|
r' -accepteula'
|
||||||
r' -accepteulaksn'
|
r' -accepteulaksn'
|
||||||
|
|
@ -562,5 +597,6 @@ LAUNCHERS = {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,26 @@
|
||||||
# Wizard Kit: Settings - Main / Branding
|
# Wizard Kit: Settings - Main / Branding
|
||||||
|
|
||||||
# Features
|
# Features
|
||||||
ENABLED_UPLOAD_DATA = False
|
ENABLED_OPEN_LOGS = False
|
||||||
ENABLED_TICKET_NUMBERS = False
|
ENABLED_TICKET_NUMBERS = False
|
||||||
|
ENABLED_UPLOAD_DATA = False
|
||||||
|
|
||||||
# STATIC VARIABLES (also used by BASH and BATCH files)
|
# STATIC VARIABLES (also used by BASH and BATCH files)
|
||||||
## NOTE: There are no spaces around the = for easier parsing in BASH and BATCH
|
## NOTE: There are no spaces around the = for easier parsing in BASH and BATCH
|
||||||
# Main Kit
|
# Main Kit
|
||||||
ARCHIVE_PASSWORD='Abracadabra'
|
ARCHIVE_PASSWORD='Abracadabra'
|
||||||
KIT_NAME_FULL='Wizard Kit'
|
KIT_NAME_FULL='WizardKit'
|
||||||
KIT_NAME_SHORT='WK'
|
KIT_NAME_SHORT='WK'
|
||||||
SUPPORT_MESSAGE='Please let 2Shirt know by opening an issue on GitHub'
|
SUPPORT_MESSAGE='Please let 2Shirt know by opening an issue on GitHub'
|
||||||
# Live Linux
|
# Live Linux
|
||||||
MPRIME_LIMIT='7' # of minutes to run Prime95 during hw-diags
|
|
||||||
ROOT_PASSWORD='Abracadabra'
|
ROOT_PASSWORD='Abracadabra'
|
||||||
TECH_PASSWORD='Abracadabra'
|
TECH_PASSWORD='Abracadabra'
|
||||||
# Server IP addresses
|
# Server IP addresses
|
||||||
OFFICE_SERVER_IP='10.0.0.10'
|
OFFICE_SERVER_IP='10.0.0.10'
|
||||||
QUICKBOOKS_SERVER_IP='10.0.0.10'
|
QUICKBOOKS_SERVER_IP='10.0.0.10'
|
||||||
# Time Zones
|
# Time Zones
|
||||||
LINUX_TIME_ZONE='America/Los_Angeles' # See 'timedatectl list-timezones' for valid values
|
LINUX_TIME_ZONE='America/Denver' # See 'timedatectl list-timezones' for valid values
|
||||||
WINDOWS_TIME_ZONE='Pacific Standard Time' # See 'tzutil /l' for valid values
|
WINDOWS_TIME_ZONE='Mountain Standard Time' # See 'tzutil /l' for valid values
|
||||||
# WiFi
|
|
||||||
WIFI_SSID='SomeWifi'
|
|
||||||
WIFI_PASSWORD='Abracadabra'
|
|
||||||
|
|
||||||
# SERVER VARIABLES
|
# SERVER VARIABLES
|
||||||
## NOTE: Windows can only use one user per server. This means that if
|
## NOTE: Windows can only use one user per server. This means that if
|
||||||
|
|
@ -48,13 +45,13 @@ BACKUP_SERVERS = [
|
||||||
'RW-User': 'backup',
|
'RW-User': 'backup',
|
||||||
'RW-Pass': 'Abracadabra',
|
'RW-Pass': 'Abracadabra',
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
CRASH_SERVER = {
|
CRASH_SERVER = {
|
||||||
'Name': 'CrashServer',
|
'Name': 'CrashServer',
|
||||||
'Url': '',
|
'Url': '',
|
||||||
'User': '',
|
'User': '',
|
||||||
'Pass': '',
|
'Pass': '',
|
||||||
}
|
}
|
||||||
OFFICE_SERVER = {
|
OFFICE_SERVER = {
|
||||||
'IP': OFFICE_SERVER_IP,
|
'IP': OFFICE_SERVER_IP,
|
||||||
'Name': 'ServerOne',
|
'Name': 'ServerOne',
|
||||||
|
|
@ -64,7 +61,7 @@ OFFICE_SERVER = {
|
||||||
'Pass': 'Abracadabra',
|
'Pass': 'Abracadabra',
|
||||||
'RW-User': 'backup',
|
'RW-User': 'backup',
|
||||||
'RW-Pass': 'Abracadabra',
|
'RW-Pass': 'Abracadabra',
|
||||||
}
|
}
|
||||||
QUICKBOOKS_SERVER = {
|
QUICKBOOKS_SERVER = {
|
||||||
'IP': QUICKBOOKS_SERVER_IP,
|
'IP': QUICKBOOKS_SERVER_IP,
|
||||||
'Name': 'ServerOne',
|
'Name': 'ServerOne',
|
||||||
|
|
@ -74,7 +71,7 @@ QUICKBOOKS_SERVER = {
|
||||||
'Pass': 'Abracadabra',
|
'Pass': 'Abracadabra',
|
||||||
'RW-User': 'backup',
|
'RW-User': 'backup',
|
||||||
'RW-Pass': 'Abracadabra',
|
'RW-Pass': 'Abracadabra',
|
||||||
}
|
}
|
||||||
WINDOWS_SERVER = {
|
WINDOWS_SERVER = {
|
||||||
'IP': '10.0.0.10',
|
'IP': '10.0.0.10',
|
||||||
'Name': 'ServerOne',
|
'Name': 'ServerOne',
|
||||||
|
|
@ -84,7 +81,10 @@ WINDOWS_SERVER = {
|
||||||
'Pass': 'Abracadabra',
|
'Pass': 'Abracadabra',
|
||||||
'RW-User': 'backup',
|
'RW-User': 'backup',
|
||||||
'RW-Pass': 'Abracadabra',
|
'RW-Pass': 'Abracadabra',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -66,5 +66,8 @@ MUSIC_SNES = [
|
||||||
'zamn'
|
'zamn'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
326
.bin/Scripts/settings/partition_uids.py
Normal file
326
.bin/Scripts/settings/partition_uids.py
Normal file
|
|
@ -0,0 +1,326 @@
|
||||||
|
# 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
|
||||||
21
.bin/Scripts/settings/sensors.py
Normal file
21
.bin/Scripts/settings/sensors.py
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# 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
|
||||||
194
.bin/Scripts/settings/setup.py
Normal file
194
.bin/Scripts/settings/setup.py
Normal file
|
|
@ -0,0 +1,194 @@
|
||||||
|
'''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 = '''<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<oor:items xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<item oor:path="/org.openoffice.Setup/Office/Factories/org.openoffice.Setup:Factory['com.sun.star.presentation.PresentationDocument']"><prop oor:name="ooSetupFactoryDefaultFilter" oor:op="fuse"><value>Impress MS PowerPoint 2007 XML</value></prop></item>
|
||||||
|
<item oor:path="/org.openoffice.Setup/Office/Factories/org.openoffice.Setup:Factory['com.sun.star.sheet.SpreadsheetDocument']"><prop oor:name="ooSetupFactoryDefaultFilter" oor:op="fuse"><value>Calc MS Excel 2007 XML</value></prop></item>
|
||||||
|
<item oor:path="/org.openoffice.Setup/Office/Factories/org.openoffice.Setup:Factory['com.sun.star.text.TextDocument']"><prop oor:name="ooSetupFactoryDefaultFilter" oor:op="fuse"><value>MS Word 2007 XML</value></prop></item>
|
||||||
|
<item oor:path="/org.openoffice.Office.Common/Save/Document"><prop oor:name="WarnAlienFormat" oor:op="fuse"><value>false</value></prop></item>
|
||||||
|
</oor:items>
|
||||||
|
'''
|
||||||
|
|
||||||
|
# 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.")
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
# Wizard Kit: Settings - Sources
|
'''Wizard Kit: Settings - Sources'''
|
||||||
|
# pylint: disable=line-too-long
|
||||||
|
# vim: sts=2 sw=2 ts=2 tw=0
|
||||||
|
|
||||||
SOURCE_URLS = {
|
SOURCE_URLS = {
|
||||||
'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1801120058/AcroRdrDC1801120058_en_US.exe',
|
'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1901020098/AcroRdrDC1901020098_en_US.exe',
|
||||||
'AdwCleaner': 'https://downloads.malwarebytes.com/file/adwcleaner',
|
'AdwCleaner': 'https://downloads.malwarebytes.com/file/adwcleaner',
|
||||||
'AIDA64': 'http://download.aida64.com/aida64engineer597.zip',
|
'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',
|
'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',
|
'Autoruns': 'https://download.sysinternals.com/files/Autoruns.zip',
|
||||||
'BleachBit': 'https://download.bleachbit.org/BleachBit-2.0-portable.zip',
|
'BleachBit': 'https://download.bleachbit.org/BleachBit-2.0-portable.zip',
|
||||||
|
|
@ -13,31 +15,35 @@ SOURCE_URLS = {
|
||||||
'ClassicStartSkin': 'http://www.classicshell.net/forum/download/file.php?id=3001&sid=9a195960d98fd754867dcb63d9315335',
|
'ClassicStartSkin': 'http://www.classicshell.net/forum/download/file.php?id=3001&sid=9a195960d98fd754867dcb63d9315335',
|
||||||
'Du': 'https://download.sysinternals.com/files/DU.zip',
|
'Du': 'https://download.sysinternals.com/files/DU.zip',
|
||||||
'ERUNT': 'http://www.aumha.org/downloads/erunt.zip',
|
'ERUNT': 'http://www.aumha.org/downloads/erunt.zip',
|
||||||
'Everything32': 'https://www.voidtools.com/Everything-1.4.1.895.x86.zip',
|
'Everything32': 'https://www.voidtools.com/Everything-1.4.1.935.x86.en-US.zip',
|
||||||
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.895.x64.zip',
|
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.935.x64.en-US.zip',
|
||||||
'FastCopy': 'http://ftp.vector.co.jp/70/64/2323/FastCopy354_installer.zip',
|
'FastCopy': 'https://fastcopy.jp/archive/FastCopy380_installer.exe',
|
||||||
'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/1056733/ublock_origin-1.16.20-an+fx.xpi',
|
'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',
|
'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe',
|
||||||
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
|
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
|
||||||
'HWiNFO': 'http://app.oldfoss.com:81/download/HWiNFO/hwi_588.zip',
|
'HWiNFO': 'http://files2.majorgeeks.com/377527622c5325acc1cb937fb149d0de922320c0/systeminfo/hwi_602.zip',
|
||||||
'Intel SSD Toolbox': r'https://downloadmirror.intel.com/27656/eng/Intel%20SSD%20Toolbox%20-%20v3.5.2.exe',
|
'Intel SSD Toolbox': r'https://downloadmirror.intel.com/28593/eng/Intel%20SSD%20Toolbox%20-%20v3.5.9.exe',
|
||||||
'IOBit_Uninstaller': 'https://portableapps.duckduckgo.com/IObitUninstallerPortable_7.5.0.7.paf.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',
|
'KVRT': 'http://devbuilds.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe',
|
||||||
'NotepadPlusPlus': 'https://notepad-plus-plus.org/repository/7.x/7.5.8/npp.7.5.8.bin.minimalist.7z',
|
'LibreOffice': 'https://download.documentfoundation.org/libreoffice/stable/6.2.4/win/x86_64/LibreOffice_6.2.4_Win_x64.msi',
|
||||||
'Office Deployment Tool 2016': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_10810.33603.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://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',
|
'ProduKey32': 'http://www.nirsoft.net/utils/produkey.zip',
|
||||||
'ProduKey64': 'http://www.nirsoft.net/utils/produkey-x64.zip',
|
'ProduKey64': 'http://www.nirsoft.net/utils/produkey-x64.zip',
|
||||||
'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip',
|
'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip',
|
||||||
'RKill': 'https://www.bleepingcomputer.com/download/rkill/dl/10/',
|
'RKill': 'https://www.bleepingcomputer.com/download/rkill/dl/10/',
|
||||||
'Samsung Magician': 'https://s3.ap-northeast-2.amazonaws.com/global.semi.static/SAMSUNG_SSD_v5_2_1_180523/CD0CFAC4675B9E502899B41BE00525C3909ECE3AD57CC1A2FB6B74A766B2A1EA/Samsung_Magician_Installer.zip',
|
'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 Themes': 'http://snappy-driver-installer.org/downloads/SDIO_Themes.zip',
|
||||||
'SDIO Torrent': 'http://snappy-driver-installer.org/downloads/SDIO_Update.torrent',
|
'SDIO Torrent': 'http://snappy-driver-installer.org/downloads/SDIO_Update.torrent',
|
||||||
'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe',
|
'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe',
|
||||||
'TestDisk': 'https://www.cgsecurity.org/testdisk-7.1-WIP.win.zip',
|
'TestDisk': 'https://www.cgsecurity.org/testdisk-7.1-WIP.win.zip',
|
||||||
'wimlib32': 'https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip',
|
'wimlib32': 'https://wimlib.net/downloads/wimlib-1.13.1-windows-i686-bin.zip',
|
||||||
'wimlib64': 'https://wimlib.net/downloads/wimlib-1.12.0-windows-x86_64-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',
|
'Winapp2': 'https://github.com/MoscaDotTo/Winapp2/archive/master.zip',
|
||||||
'WizTree': 'https://antibody-software.com/files/wiztree_3_26_portable.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 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 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 RAR': 'https://support.xmplay.com/files/16/xmp-rar.zip?v=409646',
|
||||||
|
|
@ -63,10 +69,18 @@ VCREDIST_SOURCES = {
|
||||||
'64': 'https://aka.ms/vs/15/release/vc_redist.x64.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 = {
|
NINITE_SOURCES = {
|
||||||
'Bundles': {
|
'Bundles': {
|
||||||
'Legacy.exe': '.net4.7.2-7zip-chrome-firefox-vlc',
|
'base.exe': '.net4.7.2-7zip-vlc',
|
||||||
'Modern.exe': '.net4.7.2-7zip-chrome-classicstart-firefox-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': {
|
'Audio-Video': {
|
||||||
'AIMP.exe': 'aimp',
|
'AIMP.exe': 'aimp',
|
||||||
|
|
@ -91,7 +105,7 @@ NINITE_SOURCES = {
|
||||||
'SugarSync.exe': 'sugarsync',
|
'SugarSync.exe': 'sugarsync',
|
||||||
},
|
},
|
||||||
'Communication': {
|
'Communication': {
|
||||||
'Discord': 'discord',
|
'Discord.exe': 'discord',
|
||||||
'Pidgin.exe': 'pidgin',
|
'Pidgin.exe': 'pidgin',
|
||||||
'Skype.exe': 'skype',
|
'Skype.exe': 'skype',
|
||||||
'Trillian.exe': 'trillian',
|
'Trillian.exe': 'trillian',
|
||||||
|
|
@ -103,8 +117,6 @@ NINITE_SOURCES = {
|
||||||
},
|
},
|
||||||
'Developer': {
|
'Developer': {
|
||||||
'Eclipse.exe': 'eclipse',
|
'Eclipse.exe': 'eclipse',
|
||||||
'JDK 8.exe': 'jdk8',
|
|
||||||
'JDK 8 (x64).exe': 'jdkx8',
|
|
||||||
'Notepad++.exe': 'notepadplusplus',
|
'Notepad++.exe': 'notepadplusplus',
|
||||||
'PuTTY.exe': 'putty',
|
'PuTTY.exe': 'putty',
|
||||||
'Python 2.exe': 'python',
|
'Python 2.exe': 'python',
|
||||||
|
|
@ -147,7 +159,6 @@ NINITE_SOURCES = {
|
||||||
'Runtimes': {
|
'Runtimes': {
|
||||||
'Adobe Air.exe': 'air',
|
'Adobe Air.exe': 'air',
|
||||||
'dotNET.exe': '.net4.7.2',
|
'dotNET.exe': '.net4.7.2',
|
||||||
'Java 8.exe': 'java8',
|
|
||||||
'Shockwave.exe': 'shockwave',
|
'Shockwave.exe': 'shockwave',
|
||||||
'Silverlight.exe': 'silverlight',
|
'Silverlight.exe': 'silverlight',
|
||||||
},
|
},
|
||||||
|
|
@ -169,7 +180,7 @@ NINITE_SOURCES = {
|
||||||
'Launchy.exe': 'launchy',
|
'Launchy.exe': 'launchy',
|
||||||
'RealVNC.exe': 'realvnc',
|
'RealVNC.exe': 'realvnc',
|
||||||
'Revo Uninstaller.exe': 'revo',
|
'Revo Uninstaller.exe': 'revo',
|
||||||
'TeamViewer 13.exe': 'teamviewer13',
|
'TeamViewer 14.exe': 'teamviewer14',
|
||||||
'TeraCopy.exe': 'teracopy',
|
'TeraCopy.exe': 'teracopy',
|
||||||
'WinDirStat.exe': 'windirstat',
|
'WinDirStat.exe': 'windirstat',
|
||||||
},
|
},
|
||||||
|
|
@ -188,9 +199,29 @@ RST_SOURCES = {
|
||||||
'SetupRST_14.0.exe': 'https://downloadmirror.intel.com/25091/eng/SetupRST.exe',
|
'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_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.8.exe': 'https://downloadmirror.intel.com/27442/eng/SetupRST.exe',
|
||||||
'SetupRST_15.9.exe': 'https://downloadmirror.intel.com/27400/eng/SetupRST.exe',
|
'SetupRST_15.9.exe': 'https://downloadmirror.intel.com/28656/eng/SetupRST.exe',
|
||||||
'SetupRST_16.0.exe': 'https://downloadmirror.intel.com/27681/eng/SetupRST.exe',
|
#SetupRST_16.0.exe : Deprecated by Intel
|
||||||
'SetupRST_16.5.exe': 'https://downloadmirror.intel.com/27984/eng/SetupRST.exe',
|
#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',
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
29
.bin/Scripts/settings/sw_diags.py
Normal file
29
.bin/Scripts/settings/sw_diags.py
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
# 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
|
||||||
|
|
@ -30,6 +30,9 @@ TOOLS = {
|
||||||
'64': r'HWiNFO\HWiNFO64.exe'},
|
'64': r'HWiNFO\HWiNFO64.exe'},
|
||||||
'KVRT': {
|
'KVRT': {
|
||||||
'32': r'KVRT\KVRT.exe'},
|
'32': r'KVRT\KVRT.exe'},
|
||||||
|
'NirCmd': {
|
||||||
|
'32': r'NirCmd\nircmdc.exe',
|
||||||
|
'64': r'NirCmd\nircmdc64.exe'},
|
||||||
'NotepadPlusPlus': {
|
'NotepadPlusPlus': {
|
||||||
'32': r'NotepadPlusPlus\notepadplusplus.exe'},
|
'32': r'NotepadPlusPlus\notepadplusplus.exe'},
|
||||||
'ProduKey': {
|
'ProduKey': {
|
||||||
|
|
@ -49,5 +52,8 @@ TOOLS = {
|
||||||
'32': r'XMPlay\xmplay.exe'},
|
'32': r'XMPlay\xmplay.exe'},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
118
.bin/Scripts/settings/ufd.py
Normal file
118
.bin/Scripts/settings/ufd.py
Normal file
|
|
@ -0,0 +1,118 @@
|
||||||
|
'''Wizard Kit: Settings - UFD'''
|
||||||
|
# pylint: disable=C0326,E0611
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
||||||
|
from collections import OrderedDict
|
||||||
|
from settings.main import KIT_NAME_FULL,KIT_NAME_SHORT
|
||||||
|
|
||||||
|
# General
|
||||||
|
DOCSTRING = '''WizardKit: Build UFD
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
build-ufd [options] --ufd-device PATH --linux PATH
|
||||||
|
[--linux-minimal PATH]
|
||||||
|
[--main-kit PATH]
|
||||||
|
[--winpe PATH]
|
||||||
|
[--extra-dir PATH]
|
||||||
|
build-ufd (-h | --help)
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-d PATH, --linux-dgpu PATH
|
||||||
|
-e PATH, --extra-dir PATH
|
||||||
|
-k PATH, --main-kit PATH
|
||||||
|
-l PATH, --linux PATH
|
||||||
|
-m PATH, --linux-minimal PATH
|
||||||
|
-u PATH, --ufd-device PATH
|
||||||
|
-w PATH, --winpe PATH
|
||||||
|
|
||||||
|
-h --help Show this page
|
||||||
|
-M --use-mbr Use real MBR instead of GPT w/ Protective MBR
|
||||||
|
-F --force Bypass all confirmation messages. USE WITH EXTREME CAUTION!
|
||||||
|
-U --update Don't format device, just update
|
||||||
|
'''
|
||||||
|
ISO_LABEL = '{}_LINUX'.format(KIT_NAME_SHORT)
|
||||||
|
UFD_LABEL = '{}_UFD'.format(KIT_NAME_SHORT)
|
||||||
|
UFD_SOURCES = OrderedDict({
|
||||||
|
'Linux': {'Arg': '--linux', 'Type': 'ISO'},
|
||||||
|
'Linux (dGPU)': {'Arg': '--linux-dgpu', 'Type': 'ISO'},
|
||||||
|
'Linux (Minimal)': {'Arg': '--linux-minimal', 'Type': 'ISO'},
|
||||||
|
'WinPE': {'Arg': '--winpe', 'Type': 'ISO'},
|
||||||
|
'Main Kit': {'Arg': '--main-kit', 'Type': 'KIT'},
|
||||||
|
'Extra Dir': {'Arg': '--extra-dir', 'Type': 'DIR'},
|
||||||
|
})
|
||||||
|
|
||||||
|
# Definitions: Boot entries
|
||||||
|
BOOT_ENTRIES = {
|
||||||
|
# Path to check: Comment to remove
|
||||||
|
'/arch_minimal': 'UFD-MINIMAL',
|
||||||
|
'/dgpu': 'UFD-DGPU',
|
||||||
|
'/sources/boot.wim': 'UFD-WINPE',
|
||||||
|
}
|
||||||
|
BOOT_FILES = {
|
||||||
|
# Directory: extension
|
||||||
|
'/arch/boot/syslinux': 'cfg',
|
||||||
|
'/EFI/boot': 'conf',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Definitions: Sources and Destinations
|
||||||
|
## NOTES: Paths are relative to the root of the ISO/UFD
|
||||||
|
## Sources use rsync's trailing slash syntax
|
||||||
|
ITEMS = {
|
||||||
|
'Extra Dir': (
|
||||||
|
('/', '/'),
|
||||||
|
),
|
||||||
|
'Linux': (
|
||||||
|
('/arch', '/'),
|
||||||
|
('/isolinux', '/'),
|
||||||
|
('/EFI/boot', '/EFI/'),
|
||||||
|
('/EFI/memtest86', '/EFI/'),
|
||||||
|
),
|
||||||
|
'Linux (dGPU)': (
|
||||||
|
('/arch/boot/x86_64/archiso.img', '/dgpu/'),
|
||||||
|
('/arch/boot/x86_64/vmlinuz', '/dgpu/'),
|
||||||
|
('/arch/pkglist.x86_64.txt', '/dgpu/'),
|
||||||
|
('/arch/x86_64', '/dgpu/'),
|
||||||
|
),
|
||||||
|
'Linux (Minimal)': (
|
||||||
|
('/arch/boot/x86_64/archiso.img', '/arch_minimal/'),
|
||||||
|
('/arch/boot/x86_64/vmlinuz', '/arch_minimal/'),
|
||||||
|
('/arch/pkglist.x86_64.txt', '/arch_minimal/'),
|
||||||
|
('/arch/x86_64', '/arch_minimal/'),
|
||||||
|
),
|
||||||
|
'Main Kit': (
|
||||||
|
('/', '/{}/'.format(KIT_NAME_FULL)),
|
||||||
|
),
|
||||||
|
'WinPE': (
|
||||||
|
('/bootmgr', '/'),
|
||||||
|
('/bootmgr.efi', '/'),
|
||||||
|
('/en_us', '/'),
|
||||||
|
('/Boot/', '/boot/'),
|
||||||
|
('/EFI/Boot/', '/EFI/Microsoft/'),
|
||||||
|
('/EFI/Microsoft/', '/EFI/Microsoft/'),
|
||||||
|
('/Boot/BCD', '/sources/'),
|
||||||
|
('/Boot/boot.sdi', '/sources/'),
|
||||||
|
('/bootmgr', '/sources/'),
|
||||||
|
('/sources/boot.wim', '/sources/'),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
ITEMS_HIDDEN = (
|
||||||
|
# Linux (all versions)
|
||||||
|
'arch',
|
||||||
|
'arch_minimal',
|
||||||
|
'dgpu',
|
||||||
|
'EFI',
|
||||||
|
'isolinux',
|
||||||
|
# Main Kit
|
||||||
|
'{}/.bin'.format(KIT_NAME_FULL),
|
||||||
|
'{}/.cbin'.format(KIT_NAME_FULL),
|
||||||
|
# WinPE
|
||||||
|
'boot',
|
||||||
|
'bootmgr',
|
||||||
|
'bootmgr.efi',
|
||||||
|
'en-us',
|
||||||
|
'images',
|
||||||
|
'sources',
|
||||||
|
)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print("This file is not meant to be called directly.")
|
||||||
|
|
@ -1,155 +1,225 @@
|
||||||
# Wizard Kit: Settings - Windows Builds
|
'''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 = {
|
WINDOWS_BUILDS = {
|
||||||
# Build Version Release Codename Marketing Name Notes
|
# Build, Version, Release, Codename, Marketing Name, Notes
|
||||||
'6000': ( 'Vista', 'RTM', 'Longhorn', None, 'unsupported'),
|
'6000': ('Vista', 'RTM', 'Longhorn', None, 'unsupported'),
|
||||||
'6000': ( 'Vista', 'RTM', 'Longhorn', None, 'unsupported'),
|
'6001': ('Vista', 'SP1', 'Longhorn', None, 'unsupported'),
|
||||||
'6001': ( 'Vista', 'SP1', 'Longhorn', None, 'unsupported'),
|
'6002': ('Vista', 'SP2', 'Longhorn', None, 'unsupported'),
|
||||||
'6002': ( 'Vista', 'SP2', 'Longhorn', None, 'unsupported'),
|
|
||||||
|
|
||||||
'7600': ( '7', 'RTM', 'Vienna', None, 'unsupported'),
|
'7600': ('7', 'RTM', 'Vienna', None, 'unsupported'),
|
||||||
'7601': ( '7', 'SP1', 'Vienna', None, 'outdated'),
|
'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 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'),
|
'9199': ('8', 'RTM', None, None, 'unsupported'),
|
||||||
|
|
||||||
'9200': ( '8.1', None, 'Blue', None, 'outdated'),
|
'9200': ('8.1', None, 'Blue', None, 'outdated'),
|
||||||
'9600': ( '8.1', None, 'Update', None, None),
|
'9600': ('8.1', None, 'Update', None, None),
|
||||||
|
|
||||||
'9841': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'9841': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'9860': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'9860': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'9879': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'9879': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'9926': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'9926': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'10041': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'10041': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'10049': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'10049': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'10061': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'10061': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'10074': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'10074': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'10122': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'10122': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'10130': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'10130': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'10158': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'10158': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'10159': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'10159': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'10162': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'10162': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'10166': ( '10', None, 'Threshold 1', None, 'preview build'),
|
'10166': ('10', None, 'Threshold 1', None, 'preview build'),
|
||||||
'10240': ( '10', 'v1507', 'Threshold 1', None, 'unsupported'),
|
'10240': ('10', 'v1507', 'Threshold 1', None, 'unsupported'),
|
||||||
'10525': ( '10', None, 'Threshold 2', None, 'preview build'),
|
'10525': ('10', None, 'Threshold 2', None, 'preview build'),
|
||||||
'10532': ( '10', None, 'Threshold 2', None, 'preview build'),
|
'10532': ('10', None, 'Threshold 2', None, 'preview build'),
|
||||||
'10547': ( '10', None, 'Threshold 2', None, 'preview build'),
|
'10547': ('10', None, 'Threshold 2', None, 'preview build'),
|
||||||
'10565': ( '10', None, 'Threshold 2', None, 'preview build'),
|
'10565': ('10', None, 'Threshold 2', None, 'preview build'),
|
||||||
'10576': ( '10', None, 'Threshold 2', None, 'preview build'),
|
'10576': ('10', None, 'Threshold 2', None, 'preview build'),
|
||||||
'10586': ( '10', 'v1511', 'Threshold 2', 'November Update', 'unsupported'),
|
'10586': ('10', 'v1511', 'Threshold 2', 'November Update', 'unsupported'),
|
||||||
'11082': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'11082': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'11099': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'11099': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'11102': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'11102': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14251': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14251': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14257': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14257': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14271': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14271': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14279': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14279': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14291': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14291': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14295': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14295': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14316': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14316': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14328': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14328': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14332': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14332': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14342': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14342': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14352': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14352': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14361': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14361': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14366': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14366': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14367': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14367': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14371': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14371': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14372': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14372': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14376': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14376': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14379': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14379': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14383': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14383': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14385': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14385': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14388': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14388': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14390': ( '10', None, 'Redstone 1', None, 'preview build'),
|
'14390': ('10', None, 'Redstone 1', None, 'preview build'),
|
||||||
'14393': ( '10', 'v1607', 'Redstone 1', 'Anniversary Update', 'unsupported'),
|
'14393': ('10', 'v1607', 'Redstone 1', 'Anniversary Update', 'unsupported'),
|
||||||
'14901': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14901': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14905': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14905': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14915': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14915': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14926': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14926': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14931': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14931': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14936': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14936': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14942': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14942': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14946': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14946': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14951': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14951': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14955': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14955': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14959': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14959': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14965': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14965': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14971': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14971': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'14986': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'14986': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15002': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15002': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15007': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15007': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15014': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15014': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15019': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15019': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15025': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15025': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15031': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15031': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15042': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15042': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15046': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15046': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15048': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15048': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15055': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15055': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15058': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15058': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15060': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15060': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15061': ( '10', None, 'Redstone 2', None, 'preview build'),
|
'15061': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||||
'15063': ( '10', 'v1703', 'Redstone 2', 'Creators Update', 'outdated'),
|
'15063': ('10', 'v1703', 'Redstone 2', 'Creators Update', 'unsupported'),
|
||||||
'16170': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16170': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16176': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16176': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16179': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16179': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16184': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16184': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16188': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16188': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16193': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16193': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16199': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16199': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16212': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16212': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16215': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16215': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16226': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16226': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16232': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16232': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16237': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16237': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16241': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16241': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16251': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16251': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16257': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16257': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16273': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16273': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16275': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16275': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16278': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16278': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16281': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16281': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16288': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16288': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16291': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16291': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16294': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16294': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16296': ( '10', None, 'Redstone 3', None, 'preview build'),
|
'16296': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||||
'16299': ( '10', 'v1709', 'Redstone 3', 'Fall Creators Update', 'outdated'),
|
'16299': ('10', 'v1709', 'Redstone 3', 'Fall Creators Update', 'outdated'),
|
||||||
'16353': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'16353': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'16362': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'16362': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17004': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17004': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17017': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17017': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17025': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17025': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17035': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17035': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17040': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17040': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17046': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17046': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17063': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17063': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17074': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17074': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17083': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17083': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17093': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17093': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17101': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17101': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17107': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17107': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17110': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17110': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17112': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17112': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17115': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17115': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17120': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17120': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17123': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17123': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17127': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17127': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17128': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17128': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17133': ( '10', None, 'Redstone 4', None, 'preview build'),
|
'17133': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||||
'17134': ( '10', 'v1803', 'Redstone 4', 'April 2018 Update', None),
|
'17134': ('10', 'v1803', 'Redstone 4', 'April 2018 Update', 'outdated'),
|
||||||
'17604': ( '10', None, 'Redstone 5', None, 'preview build'),
|
'17604': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||||
'17618': ( '10', None, 'Redstone 5', None, 'preview build'),
|
'17618': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||||
'17623': ( '10', None, 'Redstone 5', None, 'preview build'),
|
'17623': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||||
'17627': ( '10', None, 'Redstone 5', None, 'preview build'),
|
'17627': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||||
'17634': ( '10', None, 'Redstone 5', None, 'preview build'),
|
'17634': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||||
'17639': ( '10', None, 'Redstone 5', None, 'preview build'),
|
'17639': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||||
'17643': ( '10', None, 'Redstone 5', None, 'preview build'),
|
'17643': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||||
'17650': ( '10', None, 'Redstone 5', None, 'preview build'),
|
'17650': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||||
'17655': ( '10', None, 'Redstone 5', None, 'preview build'),
|
'17655': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||||
'17661': ( '10', None, 'Redstone 5', None, 'preview build'),
|
'17661': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||||
'17666': ( '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),
|
||||||
|
'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'),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
print("This file is not meant to be called directly.")
|
print("This file is not meant to be called directly.")
|
||||||
|
|
|
||||||
39
.bin/Scripts/settings/windows_setup.py
Normal file
39
.bin/Scripts/settings/windows_setup.py
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
# 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
|
||||||
57
.bin/Scripts/settings/winpe.py
Normal file
57
.bin/Scripts/settings/winpe.py
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
# 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
|
||||||
|
|
@ -4,12 +4,11 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.repairs import *
|
from functions.repairs import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: SFC Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: SFC Tool'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\SFC Tool.log'.format(**global_vars)
|
set_log_file('SFC Tool.log')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
|
|
@ -33,7 +32,9 @@ if __name__ == '__main__':
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause('Press Enter to exit...')
|
pause('Press Enter to exit...')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -1,110 +0,0 @@
|
||||||
# Wizard Kit: System Checklist
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Init
|
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.activation import *
|
|
||||||
from functions.cleanup import *
|
|
||||||
from functions.diags import *
|
|
||||||
from functions.info import *
|
|
||||||
from functions.product_keys import *
|
|
||||||
from functions.setup import *
|
|
||||||
init_global_vars()
|
|
||||||
os.system('title {}: System Checklist Tool'.format(KIT_NAME_FULL))
|
|
||||||
global_vars['LogFile'] = r'{LogDir}\System Checklist.log'.format(**global_vars)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
try:
|
|
||||||
stay_awake()
|
|
||||||
clear_screen()
|
|
||||||
print_info('{}: System Checklist Tool\n'.format(KIT_NAME_FULL))
|
|
||||||
ticket_number = get_ticket_number()
|
|
||||||
other_results = {
|
|
||||||
'Error': {
|
|
||||||
'CalledProcessError': 'Unknown Error',
|
|
||||||
'BIOSKeyNotFoundError': 'BIOS key not found',
|
|
||||||
'FileNotFoundError': 'File not found',
|
|
||||||
},
|
|
||||||
'Warning': {}}
|
|
||||||
if ENABLED_TICKET_NUMBERS:
|
|
||||||
print_info('Starting System Checklist for Ticket #{}\n'.format(
|
|
||||||
ticket_number))
|
|
||||||
|
|
||||||
# Configure
|
|
||||||
print_info('Configure')
|
|
||||||
if global_vars['OS']['Version'] == '10':
|
|
||||||
try_and_print(message='Explorer...',
|
|
||||||
function=config_explorer_system, cs='Done')
|
|
||||||
try_and_print(message='Updating Clock...',
|
|
||||||
function=update_clock, cs='Done')
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
print_info('Cleanup')
|
|
||||||
try_and_print(message='Desktop...',
|
|
||||||
function=cleanup_desktop, cs='Done')
|
|
||||||
try_and_print(message='AdwCleaner...',
|
|
||||||
function=cleanup_adwcleaner, cs='Done', other_results=other_results)
|
|
||||||
|
|
||||||
# Export system info
|
|
||||||
print_info('Backup System Information')
|
|
||||||
try_and_print(message='AIDA64 reports...',
|
|
||||||
function=run_aida64, cs='Done', other_results=other_results)
|
|
||||||
try_and_print(message='File listing...',
|
|
||||||
function=backup_file_list, cs='Done', other_results=other_results)
|
|
||||||
try_and_print(message='Power plans...',
|
|
||||||
function=backup_power_plans, cs='Done')
|
|
||||||
try_and_print(message='Product Keys...', other_results=other_results,
|
|
||||||
function=run_produkey, cs='Done')
|
|
||||||
try_and_print(message='Registry...',
|
|
||||||
function=backup_registry, cs='Done', other_results=other_results)
|
|
||||||
|
|
||||||
# User data
|
|
||||||
print_info('User Data')
|
|
||||||
show_user_data_summary()
|
|
||||||
|
|
||||||
# Summary
|
|
||||||
print_info('Summary')
|
|
||||||
try_and_print(message='Operating System:',
|
|
||||||
function=show_os_name, ns='Unknown', silent_function=False)
|
|
||||||
try_and_print(message='Activation:',
|
|
||||||
function=show_os_activation, ns='Unknown', silent_function=False)
|
|
||||||
if (not windows_is_activated()
|
|
||||||
and global_vars['OS']['Version'] in ('8', '8.1', '10')):
|
|
||||||
try_and_print(message='BIOS Activation:',
|
|
||||||
function=activate_with_bios,
|
|
||||||
other_results=other_results)
|
|
||||||
try_and_print(message='Installed RAM:',
|
|
||||||
function=show_installed_ram, ns='Unknown', silent_function=False)
|
|
||||||
show_free_space()
|
|
||||||
try_and_print(message='Installed Antivirus:',
|
|
||||||
function=get_installed_antivirus, ns='Unknown',
|
|
||||||
other_results=other_results, print_return=True)
|
|
||||||
try_and_print(message='Installed Office:',
|
|
||||||
function=get_installed_office, ns='Unknown',
|
|
||||||
other_results=other_results, print_return=True)
|
|
||||||
|
|
||||||
# Play audio, show devices, open Windows updates, and open Activation
|
|
||||||
try_and_print(message='Opening Device Manager...',
|
|
||||||
function=open_device_manager, cs='Started')
|
|
||||||
try_and_print(message='Opening HWiNFO (Sensors)...',
|
|
||||||
function=run_hwinfo_sensors, cs='Started', other_results=other_results)
|
|
||||||
try_and_print(message='Opening Windows Updates...',
|
|
||||||
function=open_windows_updates, cs='Started')
|
|
||||||
if not windows_is_activated():
|
|
||||||
try_and_print(message='Opening Windows Activation...',
|
|
||||||
function=open_windows_activation, cs='Started')
|
|
||||||
sleep(3)
|
|
||||||
try_and_print(message='Running XMPlay...',
|
|
||||||
function=run_xmplay, cs='Started', other_results=other_results)
|
|
||||||
|
|
||||||
# Done
|
|
||||||
print_standard('\nDone.')
|
|
||||||
pause('Press Enter exit...')
|
|
||||||
exit_script()
|
|
||||||
except SystemExit:
|
|
||||||
pass
|
|
||||||
except:
|
|
||||||
major_exception()
|
|
||||||
|
|
@ -4,17 +4,62 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.browsers import *
|
from functions.browsers import *
|
||||||
from functions.diags import *
|
|
||||||
from functions.info import *
|
from functions.info import *
|
||||||
from functions.product_keys import *
|
from functions.product_keys import *
|
||||||
from functions.repairs import *
|
from functions.repairs import *
|
||||||
|
from functions.sw_diags import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: System Diagnostics Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: System Diagnostics Tool'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\System Diagnostics.log'.format(
|
set_log_file('System Diagnostics.log')
|
||||||
**global_vars)
|
|
||||||
|
# Static Variables
|
||||||
|
BLEACH_BIT_CLEANERS = {
|
||||||
|
'Applications': (
|
||||||
|
'adobe_reader.cache',
|
||||||
|
'adobe_reader.tmp',
|
||||||
|
'amule.tmp',
|
||||||
|
'flash.cache',
|
||||||
|
'gimp.tmp',
|
||||||
|
'hippo_opensim_viewer.cache',
|
||||||
|
'java.cache',
|
||||||
|
'libreoffice.cache',
|
||||||
|
'liferea.cache',
|
||||||
|
'miro.cache',
|
||||||
|
'openofficeorg.cache',
|
||||||
|
'pidgin.cache',
|
||||||
|
'secondlife_viewer.Cache',
|
||||||
|
'thunderbird.cache',
|
||||||
|
'vuze.backup_files',
|
||||||
|
'vuze.cache',
|
||||||
|
'vuze.tmp',
|
||||||
|
'yahoo_messenger.cache',
|
||||||
|
),
|
||||||
|
'Browsers': (
|
||||||
|
'chromium.cache',
|
||||||
|
'chromium.current_session',
|
||||||
|
'firefox.cache',
|
||||||
|
'firefox.session_restore',
|
||||||
|
'google_chrome.cache',
|
||||||
|
'google_chrome.session',
|
||||||
|
'google_earth.temporary_files',
|
||||||
|
'internet_explorer.temporary_files',
|
||||||
|
'opera.cache',
|
||||||
|
'opera.current_session',
|
||||||
|
'safari.cache',
|
||||||
|
'seamonkey.cache',
|
||||||
|
),
|
||||||
|
'System': (
|
||||||
|
'system.clipboard',
|
||||||
|
'system.tmp',
|
||||||
|
'winapp2_windows.jump_lists',
|
||||||
|
'winapp2_windows.ms_search',
|
||||||
|
'windows_explorer.run',
|
||||||
|
'windows_explorer.search_history',
|
||||||
|
'windows_explorer.thumbnails',
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
|
|
@ -37,8 +82,6 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
# Sanitize Environment
|
# Sanitize Environment
|
||||||
print_info('Sanitizing Environment')
|
print_info('Sanitizing Environment')
|
||||||
# try_and_print(message='Killing processes...',
|
|
||||||
# function=run_process_killer, cs='Done')
|
|
||||||
try_and_print(message='Running RKill...',
|
try_and_print(message='Running RKill...',
|
||||||
function=run_rkill, cs='Done', other_results=other_results)
|
function=run_rkill, cs='Done', other_results=other_results)
|
||||||
try_and_print(message='Running TDSSKiller...',
|
try_and_print(message='Running TDSSKiller...',
|
||||||
|
|
@ -69,12 +112,18 @@ if __name__ == '__main__':
|
||||||
print_info('Scanning for browsers')
|
print_info('Scanning for browsers')
|
||||||
scan_for_browsers()
|
scan_for_browsers()
|
||||||
|
|
||||||
|
# Run BleachBit cleaners
|
||||||
|
print_info('BleachBit Cleanup')
|
||||||
|
for k, v in sorted(BLEACH_BIT_CLEANERS.items()):
|
||||||
|
try_and_print(message=' {}...'.format(k),
|
||||||
|
function=run_bleachbit,
|
||||||
|
cs='Done', other_results=other_results,
|
||||||
|
cleaners=v, preview=True)
|
||||||
|
|
||||||
# Export system info
|
# Export system info
|
||||||
print_info('Backup System Information')
|
print_info('Backup System Information')
|
||||||
try_and_print(message='AIDA64 reports...',
|
try_and_print(message='AIDA64 reports...',
|
||||||
function=run_aida64, cs='Done', other_results=other_results)
|
function=run_aida64, cs='Done', other_results=other_results)
|
||||||
try_and_print(message='BleachBit report...',
|
|
||||||
function=run_bleachbit, cs='Done', other_results=other_results)
|
|
||||||
backup_browsers()
|
backup_browsers()
|
||||||
try_and_print(message='File listing...',
|
try_and_print(message='File listing...',
|
||||||
function=backup_file_list, cs='Done', other_results=other_results)
|
function=backup_file_list, cs='Done', other_results=other_results)
|
||||||
|
|
@ -116,7 +165,9 @@ if __name__ == '__main__':
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause('Press Enter to exit...')
|
pause('Press Enter to exit...')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
355
.bin/Scripts/system_setup.py
Normal file
355
.bin/Scripts/system_setup.py
Normal file
|
|
@ -0,0 +1,355 @@
|
||||||
|
'''Wizard Kit: System Setup'''
|
||||||
|
# pylint: disable=wildcard-import,wrong-import-position
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Init
|
||||||
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
from collections import OrderedDict
|
||||||
|
from functions.activation import *
|
||||||
|
from functions.browsers import *
|
||||||
|
from functions.cleanup import *
|
||||||
|
from functions.info import *
|
||||||
|
from functions.product_keys import *
|
||||||
|
from functions.setup import *
|
||||||
|
from functions.sw_diags import *
|
||||||
|
from functions.windows_updates import *
|
||||||
|
init_global_vars()
|
||||||
|
os.system('title {}: System Setup'.format(KIT_NAME_FULL))
|
||||||
|
set_log_file('System Setup.log')
|
||||||
|
|
||||||
|
|
||||||
|
# STATIC VARIABLES
|
||||||
|
# pylint: disable=bad-whitespace,line-too-long
|
||||||
|
OTHER_RESULTS = {
|
||||||
|
'Error': {
|
||||||
|
'BIOSKeyNotFoundError': 'BIOS KEY NOT FOUND',
|
||||||
|
'CalledProcessError': 'UNKNOWN ERROR',
|
||||||
|
'FileNotFoundError': 'FILE NOT FOUND',
|
||||||
|
'GenericError': 'UNKNOWN ERROR',
|
||||||
|
'Not4KAlignedError': 'FALSE',
|
||||||
|
'SecureBootDisabledError': 'DISABLED',
|
||||||
|
'WindowsUnsupportedError': 'UNSUPPORTED',
|
||||||
|
},
|
||||||
|
'Warning': {
|
||||||
|
'GenericRepair': 'REPAIRED',
|
||||||
|
'NoProfilesError': 'NO PROFILES FOUND',
|
||||||
|
'NotInstalledError': 'NOT INSTALLED',
|
||||||
|
'OSInstalledLegacyError': 'OS INSTALLED LEGACY',
|
||||||
|
'SecureBootNotAvailError': 'NOT AVAILABLE',
|
||||||
|
'SecureBootUnknownError': 'UNKNOWN',
|
||||||
|
'UnsupportedOSError': 'UNSUPPORTED OS',
|
||||||
|
'WindowsOutdatedError': 'OUTDATED',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
SETUP_ACTIONS = OrderedDict({
|
||||||
|
# Install software
|
||||||
|
'Installing Programs': {'Info': True},
|
||||||
|
'VCR': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': install_vcredists, 'Just run': True,},
|
||||||
|
'LibreOffice': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': install_libreoffice,
|
||||||
|
'If answer': 'LibreOffice', 'KWArgs': {'quickstart': False, 'register_mso_types': True, 'use_mso_formats': False, 'vcredist': False},
|
||||||
|
},
|
||||||
|
'Ninite bundle': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': install_ninite_bundle, 'KWArgs': {'cs': 'STARTED'},},
|
||||||
|
|
||||||
|
# Browsers
|
||||||
|
'Scanning for browsers': {'Info': True},
|
||||||
|
'Scan': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': scan_for_browsers, 'Just run': True, 'KWArgs': {'skip_ie': True},},
|
||||||
|
'Backing up browsers': {'Info': True},
|
||||||
|
'Backup browsers': {'New': False, 'Dat': True, 'Cur': True, 'HW': False, 'Function': backup_browsers, 'Just run': True,},
|
||||||
|
|
||||||
|
# Install extensions
|
||||||
|
'Installing Extensions': {'Info': True},
|
||||||
|
'Classic Shell skin': {'New': True, 'Dat': True, 'Cur': False, 'HW': False, 'Function': install_classicstart_skin, 'Win10 only': True,},
|
||||||
|
'Chrome extensions': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': install_chrome_extensions,},
|
||||||
|
'Firefox extensions': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': install_firefox_extensions,},
|
||||||
|
|
||||||
|
# Configure software'
|
||||||
|
'Configuring Programs': {'Info': True},
|
||||||
|
'Browser add-ons': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': install_adblock, 'Just run': True,
|
||||||
|
'Pause': 'Please enable uBlock Origin for all browsers',
|
||||||
|
},
|
||||||
|
'Classic Start': {'New': True, 'Dat': True, 'Cur': False, 'HW': False, 'Function': config_classicstart, 'Win10 only': True,},
|
||||||
|
'Config Windows Updates': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': config_windows_updates, 'Win10 only': True,},
|
||||||
|
'Enable Windows Updates': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': enable_windows_updates, 'KWArgs': {'silent': True},},
|
||||||
|
'Explorer (system)': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': config_explorer_system, 'Win10 only': True,},
|
||||||
|
'Explorer (user)': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': config_explorer_user, 'Win10 only': True,},
|
||||||
|
'Restart Explorer': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': restart_explorer,},
|
||||||
|
'Restore default UAC': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': restore_default_uac,},
|
||||||
|
'Update Clock': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': update_clock,},
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
'Cleaning up': {'Info': True},
|
||||||
|
'AdwCleaner': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': cleanup_adwcleaner,},
|
||||||
|
'Desktop': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': cleanup_desktop,},
|
||||||
|
'KIT_NAME_FULL': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': delete_empty_folders,},
|
||||||
|
|
||||||
|
# System Info
|
||||||
|
'Exporting system info': {'Info': True},
|
||||||
|
'AIDA64 Report': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': run_aida64,},
|
||||||
|
'File listing': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': backup_file_list,},
|
||||||
|
'Power plans': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': backup_power_plans,},
|
||||||
|
'Product Keys': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': run_produkey,},
|
||||||
|
'Registry': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': backup_registry,},
|
||||||
|
|
||||||
|
# Show Summary
|
||||||
|
'Summary': {'Info': True},
|
||||||
|
'Operating System': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': show_os_name, 'KWArgs': {'ns': 'UNKNOWN', 'silent_function': False},},
|
||||||
|
'Activation': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': show_os_activation, 'KWArgs': {'ns': 'UNKNOWN', 'silent_function': False},},
|
||||||
|
'BIOS Activation': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': activate_with_bios, 'If not activated': True,},
|
||||||
|
'Secure Boot': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': check_secure_boot_status, 'KWArgs': {'show_alert': False},},
|
||||||
|
'Installed RAM': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': show_installed_ram, 'KWArgs': {'ns': 'UNKNOWN', 'silent_function': False},},
|
||||||
|
'Temp size': {'New': False, 'Dat': False, 'Cur': True, 'HW': False, 'Function': show_temp_files_size, 'KWArgs': {'ns': 'UNKNOWN', 'silent_function': False},},
|
||||||
|
'Show free space': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': show_free_space, 'Just run': True,},
|
||||||
|
'Installed AV': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': get_installed_antivirus, 'KWArgs': {'ns': 'UNKNOWN', 'print_return': True},},
|
||||||
|
'Installed Office': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': get_installed_office, 'KWArgs': {'ns': 'UNKNOWN', 'print_return': True},},
|
||||||
|
'Partitions 4K aligned': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': check_4k_alignment, 'KWArgs': {'cs': 'TRUE', 'ns': 'FALSE'},},
|
||||||
|
|
||||||
|
# Open things
|
||||||
|
'Opening Programs': {'Info': True},
|
||||||
|
'Device Manager': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': open_device_manager, 'KWArgs': {'cs': 'STARTED'},},
|
||||||
|
'HWiNFO sensors': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': run_hwinfo_sensors, 'KWArgs': {'cs': 'STARTED'},},
|
||||||
|
'Speed test': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': open_speedtest, 'KWArgs': {'cs': 'STARTED'},},
|
||||||
|
'Windows Updates': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': open_windows_updates, 'KWArgs': {'cs': 'STARTED'},},
|
||||||
|
'Windows Activation': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Function': open_windows_activation, 'If not activated': True, 'KWArgs': {'cs': 'STARTED'},},
|
||||||
|
'Sleep': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': sleep, 'Just run': True, 'KWArgs': {'seconds': 3},},
|
||||||
|
'XMPlay': {'New': True, 'Dat': True, 'Cur': True, 'HW': True, 'Function': run_xmplay, 'KWArgs': {'cs': 'STARTED'},},
|
||||||
|
})
|
||||||
|
SETUP_ACTION_KEYS = (
|
||||||
|
'Function',
|
||||||
|
'If not activated',
|
||||||
|
'Info',
|
||||||
|
'Just run',
|
||||||
|
'KWArgs',
|
||||||
|
'Pause',
|
||||||
|
)
|
||||||
|
SETUP_QUESTIONS = {
|
||||||
|
# AV
|
||||||
|
'MSE': {'New': None, 'Dat': None, 'Cur': None, 'HW': False, 'Ninite': True},
|
||||||
|
|
||||||
|
# LibreOffice
|
||||||
|
'LibreOffice': {'New': None, 'Dat': None, 'Cur': None, 'HW': False, 'Ninite': True},
|
||||||
|
|
||||||
|
# Ninite
|
||||||
|
'Base': {'New': True, 'Dat': True, 'Cur': True, 'HW': False, 'Ninite': True},
|
||||||
|
'Missing': {'New': False, 'Dat': True, 'Cur': False, 'HW': False, 'Ninite': True},
|
||||||
|
'Standard': {'New': True, 'Dat': True, 'Cur': False, 'HW': False, 'Ninite': True},
|
||||||
|
}
|
||||||
|
# pylint: enable=bad-whitespace,line-too-long
|
||||||
|
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
def check_os_and_abort():
|
||||||
|
"""Check OS and prompt to abort if not supported."""
|
||||||
|
result = try_and_print(
|
||||||
|
message='OS support status...',
|
||||||
|
function=check_os_support_status,
|
||||||
|
cs='GOOD',
|
||||||
|
)
|
||||||
|
if not result['CS'] and 'Unsupported' in result['Error']:
|
||||||
|
print_warning('OS version not supported by this script')
|
||||||
|
if not ask('Continue anyway? (NOT RECOMMENDED)'):
|
||||||
|
abort()
|
||||||
|
|
||||||
|
|
||||||
|
def get_actions(setup_mode, answers):
|
||||||
|
"""Get actions to perform based on setup_mode, returns OrderedDict."""
|
||||||
|
actions = OrderedDict({})
|
||||||
|
for _key, _val in SETUP_ACTIONS.items():
|
||||||
|
_action = {}
|
||||||
|
_if_answer = _val.get('If answer', False)
|
||||||
|
_win10_only = _val.get('Win10 only', False)
|
||||||
|
|
||||||
|
# Set enabled status
|
||||||
|
_enabled = _val.get(setup_mode, False)
|
||||||
|
if _if_answer:
|
||||||
|
_enabled = _enabled and answers[_if_answer]
|
||||||
|
if _win10_only:
|
||||||
|
_enabled = _enabled and global_vars['OS']['Version'] == '10'
|
||||||
|
_action['Enabled'] = _enabled
|
||||||
|
|
||||||
|
# Set other keys
|
||||||
|
for _sub_key in SETUP_ACTION_KEYS:
|
||||||
|
_action[_sub_key] = _val.get(_sub_key, None)
|
||||||
|
|
||||||
|
# Fix KWArgs
|
||||||
|
if _action.get('KWArgs', {}) is None:
|
||||||
|
_action['KWArgs'] = {}
|
||||||
|
|
||||||
|
# Handle "special" actions
|
||||||
|
if _key == 'KIT_NAME_FULL':
|
||||||
|
# Cleanup WK folders
|
||||||
|
_key = KIT_NAME_FULL
|
||||||
|
_action['KWArgs'] = {'folder_path': global_vars['ClientDir']}
|
||||||
|
elif _key == 'Ninite bundle':
|
||||||
|
# Add install_ninite_bundle() kwargs
|
||||||
|
_action['KWArgs'].update({
|
||||||
|
kw.lower(): kv for kw, kv in answers.items()
|
||||||
|
if SETUP_QUESTIONS.get(kw, {}).get('Ninite', False)
|
||||||
|
})
|
||||||
|
elif _key == 'Explorer (user)':
|
||||||
|
# Explorer settings (user)
|
||||||
|
_action['KWArgs'] = {'setup_mode': setup_mode}
|
||||||
|
|
||||||
|
# Add to dict
|
||||||
|
actions[_key] = _action
|
||||||
|
|
||||||
|
return actions
|
||||||
|
|
||||||
|
|
||||||
|
def get_answers(setup_mode):
|
||||||
|
"""Get setup answers based on setup_mode and user input, returns dict."""
|
||||||
|
answers = {k: v.get(setup_mode, False) for k, v in SETUP_QUESTIONS.items()}
|
||||||
|
|
||||||
|
# Answer setup questions as needed
|
||||||
|
if answers['MSE'] is None and global_vars['OS']['Version'] == '7':
|
||||||
|
answers.update(get_av_selection())
|
||||||
|
|
||||||
|
if answers['LibreOffice'] is None:
|
||||||
|
answers['LibreOffice'] = ask('Install LibreOffice?')
|
||||||
|
|
||||||
|
return answers
|
||||||
|
|
||||||
|
|
||||||
|
def get_av_selection():
|
||||||
|
"""Get AV selection."""
|
||||||
|
av_answers = {
|
||||||
|
'MSE': False,
|
||||||
|
}
|
||||||
|
av_options = [
|
||||||
|
{
|
||||||
|
'Name': 'Microsoft Security Essentials',
|
||||||
|
'Disabled': global_vars['OS']['Version'] not in ['7'],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
actions = [
|
||||||
|
{'Name': 'None', 'Letter': 'N'},
|
||||||
|
{'Name': 'Quit', 'Letter': 'Q'},
|
||||||
|
]
|
||||||
|
|
||||||
|
# Show menu
|
||||||
|
selection = menu_select(
|
||||||
|
'Please select an option to install',
|
||||||
|
main_entries=av_options,
|
||||||
|
action_entries=actions)
|
||||||
|
if selection.isnumeric():
|
||||||
|
index = int(selection) - 1
|
||||||
|
if 'Microsoft' in av_options[index]['Name']:
|
||||||
|
av_answers['MSE'] = True
|
||||||
|
elif selection == 'Q':
|
||||||
|
abort()
|
||||||
|
|
||||||
|
return av_answers
|
||||||
|
|
||||||
|
|
||||||
|
def get_mode():
|
||||||
|
"""Get mode via menu_select, returns str."""
|
||||||
|
setup_mode = None
|
||||||
|
mode_options = [
|
||||||
|
{'Name': 'New', 'Display Name': 'New / Clean install (no data)'},
|
||||||
|
{'Name': 'Dat', 'Display Name': 'Clean install with data migration'},
|
||||||
|
{'Name': 'Cur', 'Display Name': 'Original OS (post-repair or overinstall)'},
|
||||||
|
{'Name': 'HW', 'Display Name': 'Hardware service (i.e. no software work)'},
|
||||||
|
]
|
||||||
|
actions = [
|
||||||
|
{'Name': 'Quit', 'Letter': 'Q'},
|
||||||
|
]
|
||||||
|
|
||||||
|
# Get selection
|
||||||
|
selection = menu_select(
|
||||||
|
'Please select a setup mode',
|
||||||
|
main_entries=mode_options,
|
||||||
|
action_entries=actions)
|
||||||
|
if selection.isnumeric():
|
||||||
|
index = int(selection) - 1
|
||||||
|
setup_mode = mode_options[index]['Name']
|
||||||
|
elif selection == 'Q':
|
||||||
|
abort()
|
||||||
|
|
||||||
|
return setup_mode
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Main function."""
|
||||||
|
stay_awake()
|
||||||
|
clear_screen()
|
||||||
|
|
||||||
|
# Check installed OS
|
||||||
|
check_os_and_abort()
|
||||||
|
|
||||||
|
# Get setup mode
|
||||||
|
setup_mode = get_mode()
|
||||||
|
|
||||||
|
# Get answers to setup questions
|
||||||
|
answers = get_answers(setup_mode)
|
||||||
|
|
||||||
|
# Get actions to perform
|
||||||
|
actions = get_actions(setup_mode, answers)
|
||||||
|
|
||||||
|
# Perform actions
|
||||||
|
for action, values in actions.items():
|
||||||
|
kwargs = values.get('KWArgs', {})
|
||||||
|
|
||||||
|
# Print info lines
|
||||||
|
if values.get('Info', False):
|
||||||
|
print_info(action)
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Print disabled actions
|
||||||
|
if not values.get('Enabled', False):
|
||||||
|
show_data(
|
||||||
|
message='{}...'.format(action),
|
||||||
|
data='DISABLED',
|
||||||
|
warning=True,
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Check Windows activation if requested
|
||||||
|
if values.get('If not activated', False) and windows_is_activated():
|
||||||
|
# Skip
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Run function
|
||||||
|
if values.get('Just run', False):
|
||||||
|
values['Function'](**kwargs)
|
||||||
|
else:
|
||||||
|
result = try_and_print(
|
||||||
|
message='{}...'.format(action),
|
||||||
|
function=values['Function'],
|
||||||
|
other_results=OTHER_RESULTS,
|
||||||
|
**kwargs)
|
||||||
|
|
||||||
|
# Wait for Ninite proc(s)
|
||||||
|
if action == 'Ninite bundle':
|
||||||
|
print_standard('Waiting for installations to finish...')
|
||||||
|
try:
|
||||||
|
for proc in result['Out']:
|
||||||
|
proc.wait()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Pause
|
||||||
|
if values.get('Pause', False):
|
||||||
|
print_standard(values['Pause'])
|
||||||
|
pause()
|
||||||
|
|
||||||
|
# Show alert box for SecureBoot issues
|
||||||
|
try:
|
||||||
|
check_secure_boot_status(show_alert=True)
|
||||||
|
except Exception: # pylint: disable=broad-except
|
||||||
|
# Ignoring exceptions since we just want to show the popup
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Done
|
||||||
|
pause('Press Enter to exit... ')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
main()
|
||||||
|
exit_script()
|
||||||
|
except SystemExit as sys_exit:
|
||||||
|
exit_script(sys_exit.code)
|
||||||
|
except: # pylint: disable=bare-except
|
||||||
|
major_exception()
|
||||||
|
|
@ -4,12 +4,11 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.product_keys import *
|
from functions.product_keys import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: Transferred Key Finder'.format(KIT_NAME_FULL))
|
os.system('title {}: Transferred Key Finder'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\Transferred Keys.log'.format(**global_vars)
|
set_log_file('Transferred Keys.log')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
|
|
@ -22,7 +21,9 @@ if __name__ == '__main__':
|
||||||
# Done
|
# Done
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.update import *
|
from functions.update import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: Kit Update Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: Kit Update Tool'.format(KIT_NAME_FULL))
|
||||||
|
|
@ -40,10 +39,11 @@ if __name__ == '__main__':
|
||||||
try_and_print(message='AIDA64...', function=update_aida64, other_results=other_results, width=40)
|
try_and_print(message='AIDA64...', function=update_aida64, other_results=other_results, width=40)
|
||||||
try_and_print(message='Autoruns...', function=update_autoruns, other_results=other_results, width=40)
|
try_and_print(message='Autoruns...', function=update_autoruns, other_results=other_results, width=40)
|
||||||
try_and_print(message='BleachBit...', function=update_bleachbit, other_results=other_results, width=40)
|
try_and_print(message='BleachBit...', function=update_bleachbit, other_results=other_results, width=40)
|
||||||
try_and_print(message='BlueScreenView...', function=update_bluescreenview, other_results=other_results, width=40)
|
try_and_print(message='Blue Screen View...', function=update_bluescreenview, other_results=other_results, width=40)
|
||||||
try_and_print(message='ERUNT...', function=update_erunt, other_results=other_results, width=40)
|
try_and_print(message='ERUNT...', function=update_erunt, other_results=other_results, width=40)
|
||||||
try_and_print(message='HitmanPro...', function=update_hitmanpro, other_results=other_results, width=40)
|
try_and_print(message='Hitman Pro...', function=update_hitmanpro, other_results=other_results, width=40)
|
||||||
try_and_print(message='HWiNFO...', function=update_hwinfo, other_results=other_results, width=40)
|
try_and_print(message='HWiNFO...', function=update_hwinfo, other_results=other_results, width=40)
|
||||||
|
try_and_print(message='NirCmd...', function=update_nircmd, other_results=other_results, width=40)
|
||||||
try_and_print(message='ProduKey...', function=update_produkey, other_results=other_results, width=40)
|
try_and_print(message='ProduKey...', function=update_produkey, other_results=other_results, width=40)
|
||||||
|
|
||||||
# Drivers
|
# Drivers
|
||||||
|
|
@ -57,8 +57,11 @@ if __name__ == '__main__':
|
||||||
# Installers
|
# Installers
|
||||||
print_info(' Installers')
|
print_info(' Installers')
|
||||||
try_and_print(message='Adobe Reader DC...', function=update_adobe_reader_dc, other_results=other_results, width=40)
|
try_and_print(message='Adobe Reader DC...', function=update_adobe_reader_dc, other_results=other_results, width=40)
|
||||||
|
try_and_print(message='LibreOffice...', function=update_libreoffice, other_results=other_results, width=40)
|
||||||
|
try_and_print(message='Macs Fan Control...', function=update_macs_fan_control, other_results=other_results, width=40)
|
||||||
try_and_print(message='MS Office...', function=update_office, other_results=other_results, width=40)
|
try_and_print(message='MS Office...', function=update_office, other_results=other_results, width=40)
|
||||||
try_and_print(message='Visual C++ Runtimes...', function=update_vcredists, other_results=other_results, width=40)
|
try_and_print(message='Visual C++ Runtimes...', function=update_vcredists, other_results=other_results, width=40)
|
||||||
|
try_and_print(message='Windows Updates...', function=download_windows_updates, other_results=other_results, width=40)
|
||||||
update_all_ninite(other_results=other_results, width=40)
|
update_all_ninite(other_results=other_results, width=40)
|
||||||
|
|
||||||
# Misc
|
# Misc
|
||||||
|
|
@ -67,7 +70,7 @@ if __name__ == '__main__':
|
||||||
try_and_print(message='Classic Start Skin...', function=update_classic_start_skin, other_results=other_results, width=40)
|
try_and_print(message='Classic Start Skin...', function=update_classic_start_skin, other_results=other_results, width=40)
|
||||||
try_and_print(message='Du...', function=update_du, other_results=other_results, width=40)
|
try_and_print(message='Du...', function=update_du, other_results=other_results, width=40)
|
||||||
try_and_print(message='Everything...', function=update_everything, other_results=other_results, width=40)
|
try_and_print(message='Everything...', function=update_everything, other_results=other_results, width=40)
|
||||||
try_and_print(message='FirefoxExtensions...', function=update_firefox_ublock_origin, other_results=other_results, width=40)
|
try_and_print(message='Firefox Extensions...', function=update_firefox_ublock_origin, other_results=other_results, width=40)
|
||||||
try_and_print(message='PuTTY...', function=update_putty, other_results=other_results, width=40)
|
try_and_print(message='PuTTY...', function=update_putty, other_results=other_results, width=40)
|
||||||
try_and_print(message='Notepad++...', function=update_notepadplusplus, other_results=other_results, width=40)
|
try_and_print(message='Notepad++...', function=update_notepadplusplus, other_results=other_results, width=40)
|
||||||
try_and_print(message='WizTree...', function=update_wiztree, other_results=other_results, width=40)
|
try_and_print(message='WizTree...', function=update_wiztree, other_results=other_results, width=40)
|
||||||
|
|
@ -78,7 +81,7 @@ if __name__ == '__main__':
|
||||||
try_and_print(message='AdwCleaner...', function=update_adwcleaner, other_results=other_results, width=40)
|
try_and_print(message='AdwCleaner...', function=update_adwcleaner, other_results=other_results, width=40)
|
||||||
try_and_print(message='KVRT...', function=update_kvrt, other_results=other_results, width=40)
|
try_and_print(message='KVRT...', function=update_kvrt, other_results=other_results, width=40)
|
||||||
try_and_print(message='RKill...', function=update_rkill, other_results=other_results, width=40)
|
try_and_print(message='RKill...', function=update_rkill, other_results=other_results, width=40)
|
||||||
try_and_print(message='TDSSKiller...', function=update_tdsskiller, other_results=other_results, width=40)
|
try_and_print(message='TDSS Killer...', function=update_tdsskiller, other_results=other_results, width=40)
|
||||||
|
|
||||||
# Uninstallers
|
# Uninstallers
|
||||||
print_info(' Uninstallers')
|
print_info(' Uninstallers')
|
||||||
|
|
@ -109,11 +112,6 @@ if __name__ == '__main__':
|
||||||
width=40,
|
width=40,
|
||||||
item = item)
|
item = item)
|
||||||
|
|
||||||
## Search for network Office/QuickBooks installers & add to LAUNCHERS
|
|
||||||
print_success('Scanning for network installers')
|
|
||||||
scan_for_net_installers(OFFICE_SERVER, 'Office', min_year=2010)
|
|
||||||
scan_for_net_installers(QUICKBOOKS_SERVER, 'QuickBooks', min_year=2015)
|
|
||||||
|
|
||||||
## Generate Launchers
|
## Generate Launchers
|
||||||
print_success('Generating launchers')
|
print_success('Generating launchers')
|
||||||
for section in sorted(LAUNCHERS.keys()):
|
for section in sorted(LAUNCHERS.keys()):
|
||||||
|
|
@ -137,7 +135,9 @@ if __name__ == '__main__':
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
||||||
# Wizard Kit: User Checklist
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Init
|
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.browsers import *
|
|
||||||
from functions.cleanup import *
|
|
||||||
from functions.setup import *
|
|
||||||
init_global_vars()
|
|
||||||
os.system('title {}: User Checklist Tool'.format(KIT_NAME_FULL))
|
|
||||||
global_vars['LogFile'] = r'{LogDir}\User Checklist ({USERNAME}).log'.format(
|
|
||||||
**global_vars, **global_vars['Env'])
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
try:
|
|
||||||
stay_awake()
|
|
||||||
clear_screen()
|
|
||||||
print_info('{}: User Checklist\n'.format(KIT_NAME_FULL))
|
|
||||||
other_results = {
|
|
||||||
'Warning': {
|
|
||||||
'NotInstalledError': 'Not installed',
|
|
||||||
'NoProfilesError': 'No profiles found',
|
|
||||||
}}
|
|
||||||
answer_config_browsers = ask('Install adblock?')
|
|
||||||
if answer_config_browsers:
|
|
||||||
answer_reset_browsers = ask(
|
|
||||||
'Reset browsers to safe defaults first?')
|
|
||||||
if global_vars['OS']['Version'] == '10':
|
|
||||||
answer_config_classicshell = ask('Configure ClassicShell?')
|
|
||||||
answer_config_explorer_user = ask('Configure Explorer?')
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
print_info('Cleanup')
|
|
||||||
try_and_print(message='Desktop...',
|
|
||||||
function=cleanup_desktop, cs='Done')
|
|
||||||
|
|
||||||
# Scan for supported browsers
|
|
||||||
print_info('Scanning for browsers')
|
|
||||||
scan_for_browsers()
|
|
||||||
|
|
||||||
# Homepages
|
|
||||||
print_info('Current homepages')
|
|
||||||
list_homepages()
|
|
||||||
|
|
||||||
# Backup
|
|
||||||
print_info('Backing up browsers')
|
|
||||||
backup_browsers()
|
|
||||||
|
|
||||||
# Reset
|
|
||||||
if answer_config_browsers and answer_reset_browsers:
|
|
||||||
print_info('Resetting browsers')
|
|
||||||
reset_browsers()
|
|
||||||
|
|
||||||
# Configure
|
|
||||||
print_info('Configuring programs')
|
|
||||||
if answer_config_browsers:
|
|
||||||
install_adblock()
|
|
||||||
if global_vars['OS']['Version'] == '10':
|
|
||||||
if answer_config_classicshell:
|
|
||||||
try_and_print(message='ClassicStart...',
|
|
||||||
function=config_classicstart, cs='Done')
|
|
||||||
if answer_config_explorer_user:
|
|
||||||
try_and_print(message='Explorer...',
|
|
||||||
function=config_explorer_user, cs='Done')
|
|
||||||
if (not answer_config_browsers
|
|
||||||
and not answer_config_classicshell
|
|
||||||
and not answer_config_explorer_user):
|
|
||||||
print_warning(' Skipped')
|
|
||||||
else:
|
|
||||||
if not answer_config_browsers:
|
|
||||||
print_warning(' Skipped')
|
|
||||||
|
|
||||||
# Run speedtest
|
|
||||||
popen_program(['start', '', 'https://fast.com'], shell=True)
|
|
||||||
|
|
||||||
# Done
|
|
||||||
print_standard('\nDone.')
|
|
||||||
pause('Press Enter to exit...')
|
|
||||||
exit_script()
|
|
||||||
except SystemExit:
|
|
||||||
pass
|
|
||||||
except:
|
|
||||||
major_exception()
|
|
||||||
|
|
@ -4,13 +4,12 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.data import *
|
from functions.data import *
|
||||||
from functions.repairs import *
|
from functions.repairs import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: User Data Transfer Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: User Data Transfer Tool'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\User Data Transfer.log'.format(**global_vars)
|
set_log_file('User Data Transfer.log')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
|
|
@ -60,7 +59,9 @@ if __name__ == '__main__':
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
46
.bin/Scripts/windows_updates.py
Normal file
46
.bin/Scripts/windows_updates.py
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
# Wizard Kit: Windows updates
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Init
|
||||||
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
from functions.windows_updates import *
|
||||||
|
init_global_vars()
|
||||||
|
os.system('title {}: Windows Updates Tool'.format(KIT_NAME_FULL))
|
||||||
|
set_log_file('Windows Updates Tool.log')
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
clear_screen()
|
||||||
|
print_info('{}: Windows Updates Tool\n'.format(KIT_NAME_FULL))
|
||||||
|
|
||||||
|
# Check args
|
||||||
|
if '--disable' in sys.argv:
|
||||||
|
disable_windows_updates()
|
||||||
|
elif '--enable' in sys.argv:
|
||||||
|
enable_windows_updates()
|
||||||
|
else:
|
||||||
|
print_error('Bad mode.')
|
||||||
|
abort()
|
||||||
|
|
||||||
|
# Done
|
||||||
|
exit_script()
|
||||||
|
except GenericError as err:
|
||||||
|
# Failed to complete request, show error(s) and prompt tech
|
||||||
|
print_standard(' ')
|
||||||
|
for line in str(err).splitlines():
|
||||||
|
print_warning(line)
|
||||||
|
print_standard(' ')
|
||||||
|
print_error('Error(s) encountered, see above.')
|
||||||
|
print_standard(' ')
|
||||||
|
if '--disable' in sys.argv:
|
||||||
|
print_standard('Please reboot and try again.')
|
||||||
|
pause('Press Enter to exit... ')
|
||||||
|
exit_script(1)
|
||||||
|
except SystemExit as sys_exit:
|
||||||
|
exit_script(sys_exit.code)
|
||||||
|
except:
|
||||||
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
@ -4,19 +4,20 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.winpe_menus import *
|
from functions.winpe_menus import *
|
||||||
# Fix 7-Zip name
|
# Fix 7-Zip name
|
||||||
TOOLS['SevenZip'].pop('64')
|
TOOLS['SevenZip'].pop('64')
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
set_title('{}: Root Menu'.format(KIT_NAME_FULL))
|
set_title('{}: Root Menu'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\WinPE.log'.format(**global_vars)
|
set_log_file('WinPE.log')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
menu_root()
|
menu_root()
|
||||||
except SystemExit:
|
except SystemExit as sys_exit:
|
||||||
pass
|
exit_script(sys_exit.code)
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@
|
||||||
<History nbMaxFile="10" inSubMenu="no" customLength="-1" />
|
<History nbMaxFile="10" inSubMenu="no" customLength="-1" />
|
||||||
<GUIConfigs>
|
<GUIConfigs>
|
||||||
<GUIConfig name="ToolBar" visible="no">standard</GUIConfig>
|
<GUIConfig name="ToolBar" visible="no">standard</GUIConfig>
|
||||||
<GUIConfig name="StatusBar">hide</GUIConfig>
|
<GUIConfig name="StatusBar">show</GUIConfig>
|
||||||
<GUIConfig name="TabBar" dragAndDrop="yes" drawTopBar="yes" drawInactiveTab="yes" reduce="yes" closeButton="yes" doubleClick2Close="no" vertical="no" multiLine="no" hide="yes" quitOnEmpty="no" />
|
<GUIConfig name="TabBar" dragAndDrop="yes" drawTopBar="yes" drawInactiveTab="yes" reduce="yes" closeButton="yes" doubleClick2Close="no" vertical="no" multiLine="no" hide="no" quitOnEmpty="yes" />
|
||||||
<GUIConfig name="ScintillaViewsSplitter">vertical</GUIConfig>
|
<GUIConfig name="ScintillaViewsSplitter">vertical</GUIConfig>
|
||||||
<GUIConfig name="UserDefineDlg" position="undocked">hide</GUIConfig>
|
<GUIConfig name="UserDefineDlg" position="undocked">hide</GUIConfig>
|
||||||
<GUIConfig name="TabSetting" replaceBySpace="yes" size="4" />
|
<GUIConfig name="TabSetting" replaceBySpace="yes" size="4" />
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
<GUIConfig name="RememberLastSession">no</GUIConfig>
|
<GUIConfig name="RememberLastSession">no</GUIConfig>
|
||||||
<GUIConfig name="DetectEncoding">yes</GUIConfig>
|
<GUIConfig name="DetectEncoding">yes</GUIConfig>
|
||||||
<GUIConfig name="NewDocDefaultSettings" format="0" encoding="4" lang="0" codepage="-1" openAnsiAsUTF8="yes" />
|
<GUIConfig name="NewDocDefaultSettings" format="0" encoding="4" lang="0" codepage="-1" openAnsiAsUTF8="yes" />
|
||||||
<GUIConfig name="langsExcluded" gr0="0" gr1="0" gr2="0" gr3="0" gr4="0" gr5="0" gr6="0" gr7="0" langMenuCompact="yes" />
|
<GUIConfig name="langsExcluded" gr0="0" gr1="0" gr2="0" gr3="0" gr4="0" gr5="0" gr6="0" gr7="0" gr8="0" gr9="0" gr10="0" gr11="0" gr12="0" langMenuCompact="yes" />
|
||||||
<GUIConfig name="Print" lineNumber="yes" printOption="3" headerLeft="" headerMiddle="" headerRight="" footerLeft="" footerMiddle="" footerRight="" headerFontName="" headerFontStyle="0" headerFontSize="0" footerFontName="" footerFontStyle="0" footerFontSize="0" margeLeft="0" margeRight="0" margeTop="0" margeBottom="0" />
|
<GUIConfig name="Print" lineNumber="yes" printOption="3" headerLeft="" headerMiddle="" headerRight="" footerLeft="" footerMiddle="" footerRight="" headerFontName="" headerFontStyle="0" headerFontSize="0" footerFontName="" footerFontStyle="0" footerFontSize="0" margeLeft="0" margeRight="0" margeTop="0" margeBottom="0" />
|
||||||
<GUIConfig name="Backup" action="0" useCustumDir="no" dir="" isSnapshotMode="no" snapshotBackupTiming="7000" />
|
<GUIConfig name="Backup" action="0" useCustumDir="no" dir="" isSnapshotMode="no" snapshotBackupTiming="7000" />
|
||||||
<GUIConfig name="TaskList">yes</GUIConfig>
|
<GUIConfig name="TaskList">yes</GUIConfig>
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
<GUIConfig name="auto-insert" parentheses="no" brackets="no" curlyBrackets="no" quotes="no" doubleQuotes="no" htmlXmlTag="no" />
|
<GUIConfig name="auto-insert" parentheses="no" brackets="no" curlyBrackets="no" quotes="no" doubleQuotes="no" htmlXmlTag="no" />
|
||||||
<GUIConfig name="sessionExt"></GUIConfig>
|
<GUIConfig name="sessionExt"></GUIConfig>
|
||||||
<GUIConfig name="workspaceExt"></GUIConfig>
|
<GUIConfig name="workspaceExt"></GUIConfig>
|
||||||
<GUIConfig name="MenuBar">hide</GUIConfig>
|
<GUIConfig name="MenuBar">show</GUIConfig>
|
||||||
<GUIConfig name="Caret" width="1" blinkRate="600" />
|
<GUIConfig name="Caret" width="1" blinkRate="600" />
|
||||||
<GUIConfig name="ScintillaGlobalSettings" enableMultiSelection="no" />
|
<GUIConfig name="ScintillaGlobalSettings" enableMultiSelection="no" />
|
||||||
<GUIConfig name="openSaveDir" value="0" defaultDirPath="" />
|
<GUIConfig name="openSaveDir" value="0" defaultDirPath="" />
|
||||||
|
|
@ -37,10 +37,10 @@
|
||||||
<GUIConfig name="wordCharList" useDefault="yes" charsAdded="" />
|
<GUIConfig name="wordCharList" useDefault="yes" charsAdded="" />
|
||||||
<GUIConfig name="delimiterSelection" leftmostDelimiter="40" rightmostDelimiter="41" delimiterSelectionOnEntireDocument="no" />
|
<GUIConfig name="delimiterSelection" leftmostDelimiter="40" rightmostDelimiter="41" delimiterSelectionOnEntireDocument="no" />
|
||||||
<GUIConfig name="multiInst" setting="0" />
|
<GUIConfig name="multiInst" setting="0" />
|
||||||
<GUIConfig name="MISC" fileSwitcherWithoutExtColumn="no" backSlashIsEscapeCharacterForSql="yes" newStyleSaveDlg="no" isFolderDroppedOpenFiles="no" />
|
<GUIConfig name="MISC" fileSwitcherWithoutExtColumn="yes" backSlashIsEscapeCharacterForSql="yes" newStyleSaveDlg="no" isFolderDroppedOpenFiles="no" docPeekOnTab="no" docPeekOnMap="no" />
|
||||||
<GUIConfig name="searchEngine" searchEngineChoice="1" searchEngineCustom="" />
|
<GUIConfig name="searchEngine" searchEngineChoice="1" searchEngineCustom="" />
|
||||||
<GUIConfig name="SmartHighLight" matchCase="no" wholeWordOnly="no" useFindSettings="no" onAnotherView="no">yes</GUIConfig>
|
<GUIConfig name="SmartHighLight" matchCase="no" wholeWordOnly="no" useFindSettings="no" onAnotherView="no">yes</GUIConfig>
|
||||||
<GUIConfig name="ScintillaPrimaryView" lineNumberMargin="show" bookMarkMargin="show" indentGuideLine="show" folderMarkStyle="box" lineWrapMethod="aligned" currentLineHilitingShow="show" scrollBeyondLastLine="no" disableAdvancedScrolling="no" wrapSymbolShow="hide" Wrap="no" borderEdge="yes" edge="no" edgeNbColumn="80" zoom="0" zoom2="0" whiteSpaceShow="hide" eolShow="hide" borderWidth="2" smoothFont="no" />
|
<GUIConfig name="ScintillaPrimaryView" lineNumberMargin="show" bookMarkMargin="show" indentGuideLine="show" folderMarkStyle="box" lineWrapMethod="aligned" currentLineHilitingShow="show" scrollBeyondLastLine="yes" disableAdvancedScrolling="no" wrapSymbolShow="hide" Wrap="no" borderEdge="yes" edge="no" edgeNbColumn="80" zoom="0" zoom2="0" whiteSpaceShow="hide" eolShow="hide" borderWidth="2" smoothFont="no" />
|
||||||
<GUIConfig name="DockingManager" leftWidth="200" rightWidth="200" topHeight="200" bottomHeight="200">
|
<GUIConfig name="DockingManager" leftWidth="200" rightWidth="200" topHeight="200" bottomHeight="200">
|
||||||
<ActiveTabs cont="0" activeTab="-1" />
|
<ActiveTabs cont="0" activeTab="-1" />
|
||||||
<ActiveTabs cont="1" activeTab="-1" />
|
<ActiveTabs cont="1" activeTab="-1" />
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue